name: Build on: push: branches: - 'master' - 'releases/**' - 'tests/**' pull_request: workflow_dispatch: env: BUILD_TYPE: RelWithDebInfo jobs: # Windows build win: runs-on: windows-2022 name: ๐ŸชŸ Windows MINGW64 defaults: run: shell: msys2 {0} env: CCACHE_DIR: "${{ github.workspace }}/.ccache" steps: - name: ๐Ÿงฐ Checkout uses: actions/checkout@v4 with: submodules: recursive - name: ๐Ÿ“œ Setup ccache uses: hendrikmuhs/ccache-action@v1 id: cache-ccache with: key: ${{ runner.os }}-ccache-${{ github.run_id }} restore-keys: ${{ runner.os }}-ccache max-size: 1G - name: ๐ŸŸฆ Install msys2 uses: msys2/setup-msys2@v2 with: msystem: mingw64 - name: โฌ‡๏ธ Install dependencies run: | set -x dist/get_deps_msys2.sh - name: โฌ‡๏ธ Install .NET uses: actions/setup-dotnet@v4 with: dotnet-version: '8.0.100' - name: ๐Ÿ“œ Set version variable run: | echo "IMHEX_VERSION=`cat VERSION`" >> $GITHUB_ENV # Windows cmake build - name: ๐Ÿ› ๏ธ Configure CMake run: | set -x mkdir -p build cd build cmake -G "Ninja" \ -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \ -DCMAKE_INSTALL_PREFIX="$PWD/install" \ -DIMHEX_GENERATE_PACKAGE=ON \ -DIMHEX_USE_DEFAULT_BUILD_SETTINGS=ON \ -DIMHEX_PATTERNS_PULL_MASTER=ON \ -DIMHEX_COMMIT_HASH_LONG="${GITHUB_SHA}" \ -DIMHEX_COMMIT_BRANCH="${GITHUB_REF##*/}" \ -DUSE_SYSTEM_CAPSTONE=ON \ -DIMHEX_GENERATE_PDBS=ON \ -DIMHEX_REPLACE_DWARF_WITH_PDB=ON \ -DDOTNET_EXECUTABLE="C:/Program Files/dotnet/dotnet.exe" \ .. - name: ๐Ÿ› ๏ธ Build run: | cd build ninja install cpack mv ImHex-*.msi ../imhex-${{ env.IMHEX_VERSION }}-Windows-x86_64.msi echo "ImHex checks for the existence of this file to determine if it is running in portable mode. You should not delete this file" > $PWD/install/PORTABLE - name: โฌ†๏ธ Upload Windows Installer uses: actions/upload-artifact@v4 with: if-no-files-found: error name: Windows Installer x86_64 path: | imhex-*.msi - name: โฌ†๏ธ Upload Portable ZIP uses: actions/upload-artifact@v4 with: if-no-files-found: error name: Windows Portable x86_64 path: | build/install/* - name: โฌ‡๏ธ Download Mesa3D for NoGPU version shell: bash run: | set -x echo "NoGPU version Powered by Mesa 3D : https://fdossena.com/?p=mesa%2Findex.frag" > build/install/MESA.md curl https://downloads.fdossena.com/geth.php?r=mesa64-latest -L -o mesa.7z 7z e mesa.7z mv opengl32.dll build/install - name: โฌ†๏ธ Upload NoGPU Portable ZIP uses: actions/upload-artifact@v4 with: if-no-files-found: error name: Windows Portable NoGPU x86_64 path: | build/install/* win-plugin-template-test: runs-on: windows-2022 name: ๐Ÿงช Plugin Template Test defaults: run: shell: msys2 {0} needs: win env: IMHEX_SDK_PATH: "${{ github.workspace }}/out/sdk" steps: - name: ๐Ÿงฐ Checkout ImHex uses: actions/checkout@v4 with: path: imhex - name: ๐ŸŸฆ Install msys2 uses: msys2/setup-msys2@v2 with: msystem: mingw64 - name: โฌ‡๏ธ Install dependencies run: | set -x imhex/dist/get_deps_msys2.sh - name: ๐Ÿงฐ Checkout ImHex-Plugin-Template uses: actions/checkout@v4 with: repository: WerWolv/ImHex-Plugin-Template submodules: recursive path: template - name: โฌ‡๏ธ Download artifact uses: actions/download-artifact@v4 with: name: Windows Portable x86_64 path: out - name: ๐Ÿ› ๏ธ Build run: | set -x cd template mkdir -p build cd build cmake -G "Ninja" \ -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \ -DIMHEX_USE_DEFAULT_BUILD_SETTINGS=ON \ -DUSE_SYSTEM_CAPSTONE=ON \ .. ninja # MacOS build macos: runs-on: macos-12 strategy: fail-fast: false matrix: include: - suffix: "-NoGPU" custom_glfw: true - suffix: "" custom_glfw: false name: ๐ŸŽ macOS 12.0${{ matrix.suffix }} steps: - name: ๐Ÿงฐ Checkout uses: actions/checkout@v4 with: submodules: recursive - name: ๐Ÿ“œ Set version variable run: | echo "IMHEX_VERSION=`cat VERSION`" >> $GITHUB_ENV - name: ๐Ÿ“œ Setup ccache uses: hendrikmuhs/ccache-action@v1 with: key: ${{ runner.os }}${{ matrix.suffix }}-ccache-${{ github.run_id }} restore-keys: ${{ runner.os }}${{ matrix.suffix }}-ccache max-size: 1G - name: โฌ‡๏ธ Install dependencies run: | brew reinstall python 2>&1 >/dev/null || true brew link --overwrite python 2>&1 >/dev/null || true brew bundle --no-lock --file dist/Brewfile 2>&1 >/dev/null || true rm -rf /usr/local/Cellar/capstone - name: โฌ‡๏ธ Install classic glfw if: ${{! matrix.custom_glfw }} run: | brew install glfw 2>&1 >/dev/null || true - name: โฌ‡๏ธ Install .NET uses: actions/setup-dotnet@v4 with: dotnet-version: '8.0.100' - name: ๐Ÿงฐ Checkout glfw if: ${{ matrix.custom_glfw }} uses: actions/checkout@v4 with: repository: glfw/glfw path: glfw # GLFW custom build (to allow software rendering) - name: โฌ‡๏ธ Patch and install custom glfw if: ${{ matrix.custom_glfw }} run: | set -x cd glfw git apply ../dist/macOS/0001-glfw-SW.patch mkdir build cd build cmake -G "Ninja" \ -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \ -DBUILD_SHARED_LIBS=ON \ -DCMAKE_C_COMPILER_LAUNCHER=ccache \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ -DCMAKE_OBJC_COMPILER_LAUNCHER=ccache \ -DCMAKE_OBJCXX_COMPILER_LAUNCHER=ccache \ .. ninja install # MacOS cmake build - name: ๐Ÿ› ๏ธ Configure CMake run: | set -x mkdir -p build cd build CC=$(brew --prefix gcc@12)/bin/gcc-12 \ CXX=$(brew --prefix gcc@12)/bin/g++-12 \ OBJC=$(brew --prefix llvm)/bin/clang \ OBJCXX=$(brew --prefix llvm)/bin/clang++ \ PKG_CONFIG_PATH="$(brew --prefix openssl)/lib/pkgconfig":"$(brew --prefix)/lib/pkgconfig" \ cmake -G "Ninja" \ -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \ -DIMHEX_GENERATE_PACKAGE=ON \ -DCMAKE_C_COMPILER_LAUNCHER=ccache \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ -DCMAKE_OBJC_COMPILER_LAUNCHER=ccache \ -DCMAKE_OBJCXX_COMPILER_LAUNCHER=ccache \ -DCMAKE_INSTALL_PREFIX="./install" \ -DIMHEX_PATTERNS_PULL_MASTER=ON \ -DIMHEX_COMMIT_HASH_LONG="${GITHUB_SHA}" \ -DIMHEX_COMMIT_BRANCH="${GITHUB_REF##*/}" \ .. - name: ๐Ÿ› ๏ธ Build run: cd build && ninja install - name: โœ’๏ธ Fix Signature run: | set -x cd build/install mv imhex.app ImHex.app codesign --remove-signature ImHex.app codesign --force --deep --sign - ImHex.app - name: ๐Ÿ“ Fix permissions run: | set -x cd build/install chmod -R 755 ImHex.app/ - name: ๐Ÿ”ซ Kill XProtect run: | # See https://github.com/actions/runner-images/issues/7522 echo Killing XProtect...; sudo pkill -9 XProtect >/dev/null || true; echo Waiting for XProtect process...; while pgrep XProtect; do sleep 3; done; - name: ๐Ÿ“ฆ Create DMG run: | set -x mkdir bundle mv build/install/ImHex.app bundle cd bundle ln -s /Applications Applications cd .. hdiutil create -volname "ImHex" -srcfolder bundle -ov -format UDZO imhex-${{ env.IMHEX_VERSION }}-macOS${{ matrix.suffix }}-x86_64.dmg - name: โฌ†๏ธ Upload DMG uses: actions/upload-artifact@v4 with: if-no-files-found: error name: macOS DMG${{ matrix.suffix }} x86_64 path: ./*.dmg macos-arm64-build: runs-on: ubuntu-22.04 name: ๐ŸŽ macOS 12.1 arm64 outputs: IMHEX_VERSION: ${{ steps.build.outputs.IMHEX_VERSION }} steps: - name: ๐Ÿงฐ Checkout uses: actions/checkout@v4 with: submodules: recursive - name: ๐Ÿ“ Restore docker /cache uses: actions/cache@v4 with: path: cache key: build-macos-arm64-cache - name: ๐Ÿณ Inject /cache into docker uses: reproducible-containers/buildkit-cache-dance@v2 with: cache-source: cache cache-target: /cache - name: ๐Ÿ› ๏ธ Build using docker id: build run: | echo "IMHEX_VERSION=`cat VERSION`" >> $GITHUB_OUTPUT docker buildx build . -f dist/macOS/arm64.Dockerfile --progress=plain --build-arg 'JOBS=4' --build-arg "BUILD_TYPE=$(BUILD_TYPE)" --build-context imhex=$(pwd) --output out - name: โฌ†๏ธ Upload artifacts uses: actions/upload-artifact@v4 with: name: macos_arm64_intermediate path: out/ # See https://github.com/actions/cache/issues/342#issuecomment-1711054115 - name: ๐Ÿ—‘๏ธ Delete old cache continue-on-error: true env: GH_TOKEN: ${{ github.token }} run: | gh extension install actions/gh-actions-cache gh actions-cache delete "build-macos-arm64-cache" --confirm || true macos-arm64-package: runs-on: macos-12 name: ๐ŸŽ macOS 12.1 arm64 Packaging needs: macos-arm64-build env: IMHEX_VERSION: ${{ needs.macos-arm64-build.outputs.IMHEX_VERSION }} steps: - name: โฌ‡๏ธ Download artifact uses: actions/download-artifact@v4 with: name: macos_arm64_intermediate path: out - name: ๐Ÿ—‘๏ธ Delete artifact uses: geekyeggo/delete-artifact@v5 with: name: macos_arm64_intermediate - name: โœ’๏ธ Fix Signature run: | set -x cd out mv imhex.app ImHex.app codesign --remove-signature ImHex.app codesign --force --deep --sign - ImHex.app - name: ๐Ÿ“ Fix permissions run: | set -x cd out chmod -R 755 ImHex.app/ - name: ๐Ÿ”ซ Kill XProtect run: | # See https://github.com/actions/runner-images/issues/7522 echo Killing XProtect...; sudo pkill -9 XProtect >/dev/null || true; echo Waiting for XProtect process...; while pgrep XProtect; do sleep 3; done; - name: ๐Ÿ“ฆ Create DMG run: | set -x mkdir bundle mv out/ImHex.app bundle cd bundle ln -s /Applications Applications cd .. hdiutil create -volname "ImHex" -srcfolder bundle -ov -format UDZO imhex-${{ env.IMHEX_VERSION }}-macOS-arm64.dmg - name: โฌ†๏ธ Upload DMG uses: actions/upload-artifact@v4 with: if-no-files-found: error name: macOS DMG arm64 path: ./*.dmg # Ubuntu build ubuntu: strategy: fail-fast: false matrix: include: - release_num: 22.04 - release_num: 24.04 name: ๐Ÿง Ubuntu ${{ matrix.release_num }} runs-on: ubuntu-latest container: image: "ubuntu:${{ matrix.release_num }}" options: --privileged steps: - name: โฌ‡๏ธ Install setup dependencies run: apt update && apt install -y git curl - name: ๐Ÿงฐ Checkout uses: actions/checkout@v4 with: submodules: recursive - name: ๐Ÿ“œ Setup ccache uses: hendrikmuhs/ccache-action@v1 with: key: Ubuntu-${{ matrix.release_num }}-ccache-${{ github.run_id }} restore-keys: Ubuntu-${{ matrix.release_num }}-ccache max-size: 1G - name: โฌ‡๏ธ Install dependencies run: | apt update bash dist/get_deps_debian.sh - name: โฌ‡๏ธ Install .NET uses: actions/setup-dotnet@v4 with: dotnet-version: '8.0.100' # Ubuntu cmake build - name: ๐Ÿ› ๏ธ Configure CMake shell: bash run: | set -x git config --global --add safe.directory '*' mkdir -p build cd build CC=gcc-12 CXX=g++-12 cmake -G "Ninja" \ -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \ -DCMAKE_INSTALL_PREFIX="/usr" \ -DCMAKE_C_COMPILER_LAUNCHER=ccache \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ -DIMHEX_PATTERNS_PULL_MASTER=ON \ -DIMHEX_COMMIT_HASH_LONG="${GITHUB_SHA}" \ -DIMHEX_COMMIT_BRANCH="${GITHUB_REF##*/}" \ -DIMHEX_ENABLE_LTO=ON \ -DIMHEX_USE_GTK_FILE_PICKER=ON \ -DDOTNET_EXECUTABLE="dotnet" \ .. - name: ๐Ÿ› ๏ธ Build run: cd build && DESTDIR=DebDir ninja install - name: ๐Ÿ“œ Set version variable run: | echo "IMHEX_VERSION=`cat VERSION`" >> $GITHUB_ENV - name: ๐Ÿ“ฆ Bundle DEB run: | cp -r build/DEBIAN build/DebDir dpkg-deb -Zgzip --build build/DebDir mv build/DebDir.deb imhex-${{ env.IMHEX_VERSION }}-Ubuntu-${{ matrix.release_num }}-x86_64.deb - name: โฌ†๏ธ Upload DEB uses: actions/upload-artifact@v4 with: if-no-files-found: error name: Ubuntu ${{ matrix.release_num }} DEB x86_64 path: '*.deb' # AppImage build appimage: runs-on: ubuntu-22.04 name: โฌ‡๏ธ AppImage steps: - name: ๐Ÿงฐ Checkout uses: actions/checkout@v4 with: submodules: recursive - name: ๐Ÿ“ Restore docker /cache uses: actions/cache@v4 with: path: cache key: appimage-ccache-${{ github.run_id }} restore-keys: appimage-cache - name: ๐Ÿณ Inject /cache into docker uses: reproducible-containers/buildkit-cache-dance@v2 with: cache-source: cache cache-target: /cache - name: ๐Ÿ› ๏ธ Build using docker run: | docker buildx build . -f dist/appimage/Dockerfile --progress=plain --build-arg "BUILD_TYPE=$BUILD_TYPE" \ --build-arg "GIT_COMMIT_HASH=$GITHUB_SHA" --build-arg "GIT_BRANCH=${GITHUB_REF##*/}" --output out - name: โฌ†๏ธ Upload AppImage uses: actions/upload-artifact@v4 with: if-no-files-found: error name: Linux AppImage x86_64 path: 'out/*.AppImage' - name: โฌ†๏ธ Upload AppImage zsync uses: actions/upload-artifact@v4 with: if-no-files-found: error name: Linux AppImage zsync x86_64 path: 'out/*.AppImage.zsync' # ArchLinux build archlinux-build: name: ๐Ÿง ArchLinux runs-on: ubuntu-latest container: image: archlinux:base-devel steps: - name: โฌ‡๏ธ Update all packages run: | pacman -Syyu --noconfirm - name: โฌ‡๏ธ Install setup dependencies run: | pacman -Syu git ccache --noconfirm - name: ๐Ÿงฐ Checkout uses: actions/checkout@v4 with: submodules: recursive - name: โฌ‡๏ธ Install ImHex dependencies run: | dist/get_deps_archlinux.sh --noconfirm - name: โฌ‡๏ธ Install .NET uses: actions/setup-dotnet@v4 with: dotnet-version: '8.0.100' - name: ๐Ÿ“œ Setup ccache uses: hendrikmuhs/ccache-action@v1 with: key: archlinux-ccache-${{ github.run_id }} restore-keys: archlinux-ccache max-size: 1G # ArchLinux cmake build - name: ๐Ÿ› ๏ธ Configure CMake run: | set -x mkdir -p build cd build CC=gcc CXX=g++ cmake -G "Ninja" \ -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \ -DCMAKE_INSTALL_PREFIX="/usr" \ -DCMAKE_C_COMPILER_LAUNCHER=ccache \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ -DUSE_SYSTEM_FMT=ON \ -DUSE_SYSTEM_YARA=ON \ -DUSE_SYSTEM_NLOHMANN_JSON=ON \ -DUSE_SYSTEM_CAPSTONE=OFF \ -DIMHEX_PATTERNS_PULL_MASTER=ON \ -DIMHEX_COMMIT_HASH_LONG="${GITHUB_SHA}" \ -DIMHEX_COMMIT_BRANCH="${GITHUB_REF##*/}" \ -DIMHEX_ENABLE_LTO=ON \ -DIMHEX_USE_GTK_FILE_PICKER=ON \ .. - name: ๐Ÿ› ๏ธ Build run: cd build && DESTDIR=installDir ninja install - name: ๐Ÿ“œ Set version variable run: | echo "IMHEX_VERSION=`cat VERSION`" >> $GITHUB_ENV - name: โœ’๏ธ Prepare PKGBUILD run: | cp dist/Arch/PKGBUILD build sed -i 's/%version%/${{ env.IMHEX_VERSION }}/g' build/PKGBUILD # makepkg doesn't want to run as root, so I had to chmod 777 all over - name: ๐Ÿ“ฆ Package ArchLinux .pkg.tar.zst run: | set -x cd build # the name is a small trick to make makepkg recognize it as the source # else, it would try to download the file from the release tar -cvf imhex-${{ env.IMHEX_VERSION }}-ArchLinux-x86_64.pkg.tar.zst -C installDir . chmod -R 777 . sudo -u nobody makepkg # Replace the old file rm imhex-${{ env.IMHEX_VERSION }}-ArchLinux-x86_64.pkg.tar.zst rm *imhex-bin-debug* # rm debug package which is created for some reason mv *.pkg.tar.zst imhex-${{ env.IMHEX_VERSION }}-ArchLinux-x86_64.pkg.tar.zst - name: โฌ†๏ธ Upload imhex-archlinux.pkg.tar.zst uses: actions/upload-artifact@v4 with: if-no-files-found: error name: ArchLinux .pkg.tar.zst x86_64 path: | build/imhex-${{ env.IMHEX_VERSION }}-ArchLinux-x86_64.pkg.tar.zst # RPM distro builds rpm-build: strategy: fail-fast: false matrix: include: - name: Fedora mock_release: rawhide release_num: rawhide mock_config: fedora-rawhide - name: Fedora mock_release: f40 release_num: 40 mock_config: fedora-40 - name: Fedora mock_release: f39 release_num: 39 mock_config: fedora-39 - name: RHEL-AlmaLinux mock_release: epel9 release_num: 9 mock_config: "alma+epel-9" name: ๐Ÿง ${{ matrix.name }} ${{ matrix.release_num }} runs-on: ubuntu-latest container: image: "fedora:latest" options: --privileged steps: - name: โฌ‡๏ธ Install git-core run: dnf install --disablerepo="*" --enablerepo="fedora" git-core -y - name: ๐Ÿงฐ Checkout uses: actions/checkout@v4 with: path: ImHex submodules: recursive - name: ๐Ÿ“œ Setup DNF Cache uses: actions/cache@v4 with: path: /var/cache/dnf key: ${{ matrix.mock_release }}-dnf-${{ github.run_id }} restore-keys: | ${{ matrix.mock_release }}-dnf- - name: โฌ‡๏ธ Update all packages and install dependencies run: | set -x dnf upgrade --disablerepo="*" --enablerepo="fedora,updates" -y dnf install --disablerepo="*" --enablerepo="fedora,updates" -y \ fedpkg \ ccache - name: โฌ‡๏ธ Install .NET uses: actions/setup-dotnet@v4 with: dotnet-version: '8.0.100' - name: ๐Ÿ“œ Setup ccache uses: hendrikmuhs/ccache-action@v1 with: key: ${{ matrix.mock_release }}-rpm-${{ github.run_id }} restore-keys: ${{ matrix.mock_release }}-rpm max-size: 1G - name: ๐Ÿ“œ Set version variable run: | echo "IMHEX_VERSION=`cat ImHex/VERSION`" >> $GITHUB_ENV - name: ๐Ÿ—œ๏ธ Create tarball from sources with dependencies run: tar --exclude-vcs -czf $GITHUB_WORKSPACE/imhex-$IMHEX_VERSION.tar.gz ImHex - name: โœ’๏ธ Modify spec file run: | sed -i \ -e 's/Version: VERSION$/Version: ${{ env.IMHEX_VERSION }}/g' \ -e 's/IMHEX_OFFLINE_BUILD=ON/IMHEX_OFFLINE_BUILD=OFF/g' \ -e '/IMHEX_OFFLINE_BUILD=OFF/a -D IMHEX_PATTERNS_PULL_MASTER=ON \\' \ -e '/BuildRequires: cmake/a BuildRequires: git-core' \ -e '/%files/a %{_datadir}/%{name}/' \ $GITHUB_WORKSPACE/ImHex/dist/rpm/imhex.spec - name: ๐Ÿ“œ Fix ccache on EL9 if: matrix.mock_release == 'epel9' run: sed -i '/\. \/opt\/rh\/gcc-toolset-12\/enable/a PATH=/usr/lib64/ccache:$PATH' $GITHUB_WORKSPACE/ImHex/dist/rpm/imhex.spec - name: ๐ŸŸฉ Copy spec file to build root run: mv $GITHUB_WORKSPACE/ImHex/dist/rpm/imhex.spec $GITHUB_WORKSPACE/imhex.spec - name: ๐Ÿ“œ Enable ccache for mock run: | cat < $GITHUB_WORKSPACE/mock.cfg include('${{ matrix.mock_config }}-x86_64.cfg') config_opts['plugin_conf']['ccache_enable'] = True config_opts['plugin_conf']['ccache_opts']['max_cache_size'] = '1G' config_opts['plugin_conf']['ccache_opts']['compress'] = True config_opts['plugin_conf']['ccache_opts']['dir'] = "$GITHUB_WORKSPACE/.ccache" EOT # Fedora cmake build (in imhex.spec) - name: ๐Ÿ“ฆ Build RPM run: | fedpkg --path $GITHUB_WORKSPACE --release ${{ matrix.mock_release }} mockbuild --enable-network -N --root $GITHUB_WORKSPACE/mock.cfg extra_args -- -v - name: ๐ŸŸฉ Move and rename finished RPM run: | mv $GITHUB_WORKSPACE/results_imhex/${{ env.IMHEX_VERSION }}/*/imhex-${{ env.IMHEX_VERSION }}-0.*.x86_64.rpm \ $GITHUB_WORKSPACE/imhex-${{ env.IMHEX_VERSION }}-${{ matrix.name }}-${{ matrix.release_num }}-x86_64.rpm - name: โฌ†๏ธ Upload RPM uses: actions/upload-artifact@v4 with: if-no-files-found: error name: ${{ matrix.name }} ${{ matrix.release_num }} RPM x86_64 path: | imhex-${{ env.IMHEX_VERSION }}-${{ matrix.name }}-${{ matrix.release_num }}-x86_64.rpm