From 2c47e1a135cb6d55c595462319496a120a624d01 Mon Sep 17 00:00:00 2001 From: Nik Date: Tue, 15 Jul 2025 20:28:54 +0200 Subject: [PATCH] git: Added Windows ARM64 build (#2336) Closes #1118 --- .github/workflows/build.yml | 140 +++++++++++++----- .github/workflows/release.yml | 2 +- cmake/build_helpers.cmake | 18 ++- .../imgui/imgui/include/imconfig.h | 5 + lib/trace/source/stacktrace.cpp | 16 +- 5 files changed, 139 insertions(+), 42 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0b653ec36..bf3178fd2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,8 +17,19 @@ jobs: # Windows MINGW build win_mingw: - runs-on: windows-2022 - name: πŸͺŸ Windows MINGW64 + strategy: + fail-fast: false + matrix: + include: + - architecture_name: "x86_64" + msystem: "mingw64" + runner_os: "windows-2025" + - architecture_name: "arm64" + msystem: "clangarm64" + runner_os: "windows-11-arm" + + runs-on: ${{ matrix.runner_os }} + name: πŸͺŸ Windows MSYS2 ${{ matrix.architecture_name }} defaults: run: @@ -38,7 +49,7 @@ jobs: submodules: recursive - name: πŸ“œ Setup ccache - uses: hendrikmuhs/ccache-action@v1 + uses: hendrikmuhs/ccache-action@main id: cache-ccache with: key: ${{ runner.os }}-mingw-ccache-${{ github.run_id }} @@ -48,7 +59,7 @@ jobs: - name: 🟦 Install msys2 uses: msys2/setup-msys2@v2 with: - msystem: mingw64 + msystem: ${{ matrix.msystem }} - name: ⬇️ Install dependencies run: | @@ -71,18 +82,20 @@ jobs: 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" \ + 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" \ + -DCPACK_WIX_VERSION="4" \ + -DCPACK_WIX_ROOT="$(echo "$USERPROFILE" | tr '\\' '/')/.dotnet/tools" \ .. - name: πŸ› οΈ Build @@ -90,6 +103,11 @@ jobs: cd build ninja install + - name: πŸ•―οΈ Install WiX Toolkit + run: | + "C:/Program Files/dotnet/dotnet.exe" tool install --global wix + "$(echo "$USERPROFILE" | tr '\\' '/')/.dotnet/tools/wix" extension add -g WixToolset.UI.wixext + - name: πŸͺ² Create PDBs for MSI run: | cd build @@ -114,7 +132,7 @@ jobs: run: | cd build cpack - mv ImHex-*.msi ../imhex-${{ env.IMHEX_VERSION }}-Windows-x86_64.msi + mv ImHex-*.msi ../imhex-${{ env.IMHEX_VERSION }}-Windows-${{ matrix.architecture_name }}.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 @@ -149,7 +167,7 @@ jobs: uses: actions/upload-artifact@v4 with: if-no-files-found: error - name: Windows Installer x86_64 + name: Windows Installer ${{ matrix.architecture_name }} path: | imhex-*.msi @@ -157,11 +175,12 @@ jobs: uses: actions/upload-artifact@v4 with: if-no-files-found: error - name: Windows Portable x86_64 + name: Windows Portable ${{ matrix.architecture_name }} path: | build/install/* - name: ⬇️ Download Mesa3D for NoGPU version + if: ${{ matrix.architecture_name == 'x86_64' }} shell: bash run: | set -x @@ -171,16 +190,28 @@ jobs: mv opengl32.dll build/install - name: ⬆️ Upload NoGPU Portable ZIP + if: ${{ matrix.architecture_name == 'x86_64' }} uses: actions/upload-artifact@v4 with: if-no-files-found: error - name: Windows Portable NoGPU x86_64 + name: Windows Portable NoGPU ${{ matrix.architecture_name }} path: | build/install/* win_msvc: - runs-on: windows-2022 - name: πŸͺŸ Windows MSVC + strategy: + fail-fast: false + matrix: + include: + - architecture_name: "x86_64" + vs_arch: "amd64" + runner_os: "windows-2025" + - architecture_name: "arm64" + vs_arch: "amd64_arm64" + runner_os: "windows-11-arm" + + runs-on: ${{ matrix.runner_os }} + name: πŸͺŸ Windows MSVC ${{ matrix.architecture_name }} env: CCACHE_DIR: "${{ github.workspace }}/.ccache" @@ -198,19 +229,19 @@ jobs: - name: 🫧 Setup Visual Studio Dev Environment uses: ilammy/msvc-dev-cmd@v1 with: - arch: amd64 + arch: ${{ matrix.vs_arch }} - name: πŸ“œ Setup ccache - uses: hendrikmuhs/ccache-action@v1 + uses: hendrikmuhs/ccache-action@main id: cache-ccache with: - key: ${{ runner.os }}-msvc-ccache-${{ github.run_id }} - restore-keys: ${{ runner.os }}-msvc-ccache + key: ${{ runner.os }}-msvc-${{ matrix.vs_arch }}-ccache-${{ github.run_id }} + restore-keys: ${{ runner.os }}-msvc-${{ matrix.vs_arch }}-ccache max-size: 1G - name: πŸ“¦ Install vcpkg uses: friendlyanon/setup-vcpkg@v1 - with: { committish: 7e21420f775f72ae938bdeb5e6068f722088f06a } + with: { committish: ef7dbf94b9198bc58f45951adcf1f041fcbc5ea0 } - name: ⬇️ Install dependencies run: | @@ -236,21 +267,52 @@ jobs: cmake -G "Ninja" -B build ` --preset vs2022 ` -DCMAKE_TOOLCHAIN_FILE="$env:VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake" ` - -DCMAKE_C_COMPILER="$($(Get-Command cl.exe).Path)" ` - -DCMAKE_CXX_COMPILER="$($(Get-Command cl.exe).Path)" ` + -DCMAKE_C_COMPILER="$($(Get-Command cl.exe).Path)" ` + -DCMAKE_CXX_COMPILER="$($(Get-Command cl.exe).Path)" ` -DCMAKE_C_COMPILER_LAUNCHER=ccache ` -DCMAKE_CXX_COMPILER_LAUNCHER=ccache ` + -DCMAKE_INSTALL_PREFIX="$(Join-Path $PWD 'install')" ` + -DIMHEX_GENERATE_PACKAGE=ON ` -DCMAKE_BUILD_TYPE="$env:BUILD_TYPE" ` -DIMHEX_PATTERNS_PULL_MASTER=ON ` -DIMHEX_COMMIT_HASH_LONG="$env:GITHUB_SHA" ` -DIMHEX_COMMIT_BRANCH="$($env:GITHUB_REF -replace '.*/', '')" ` -DDOTNET_EXECUTABLE="C:/Program Files/dotnet/dotnet.exe" ` + -DCPACK_WIX_VERSION="4" ` + -DCPACK_WIX_ROOT="$($env:USERPROFILE -replace '\\','/')/.dotnet/tools" ` . - name: πŸ› οΈ Build run: | cd build - ninja + ninja install + + - name: πŸ•―οΈ Install WiX Toolkit + run: | + & "C:/Program Files/dotnet/dotnet.exe" tool install --global wix + & "$($env:USERPROFILE -replace '\\','/')/.dotnet/tools/wix" extension add -g WixToolset.UI.wixext + + - name: πŸ“¦ Bundle MSI + run: | + cd build + cpack + mv ImHex-*.msi ../imhex-${{ env.IMHEX_VERSION }}-Windows-MSVC-${{ matrix.architecture_name }}.msi + + - name: πŸ—οΈ Generate build provenance attestations + uses: actions/attest-build-provenance@v2 + if: ${{ github.event.repository.fork == false && github.event_name != 'pull_request' }} + with: + subject-path: | + imhex-*.msi + + - name: ⬆️ Upload Windows Installer + uses: actions/upload-artifact@v4 + if: false # The MSVC builds should not really be used, they're still packaged for testing’s sake though + with: + if-no-files-found: error + name: Windows Installer MSVC ${{ matrix.architecture_name }} + path: | + imhex-*.msi win-plugin-template-test: runs-on: windows-2022 @@ -321,12 +383,14 @@ jobs: fail-fast: false matrix: include: - - suffix: "-NoGPU" + - file_suffix: "-NoGPU" + name_suffix: "NoGPU" custom_glfw: true - - suffix: "" + - file_suffix: "" + name_suffix: "" custom_glfw: false - name: 🍎 macOS 13${{ matrix.suffix }} + name: 🍎 macOS 13 x86_64 ${{ matrix.name_suffix }} steps: - name: 🧰 Checkout @@ -341,8 +405,8 @@ jobs: - 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 + key: ${{ runner.os }}${{ matrix.file_suffix }}-ccache-${{ github.run_id }} + restore-keys: ${{ runner.os }}${{ matrix.file_suffix }}-ccache max-size: 1G - name: Set Xcode version @@ -457,7 +521,7 @@ jobs: break; fi done - mv *.dmg ../../imhex-${{ env.IMHEX_VERSION }}-macOS${{ matrix.suffix }}-x86_64.dmg + mv *.dmg ../../imhex-${{ env.IMHEX_VERSION }}-macOS${{ matrix.file_suffix }}-x86_64.dmg - name: πŸ—οΈ Generate build provenance attestations uses: actions/attest-build-provenance@v2 @@ -470,7 +534,7 @@ jobs: uses: actions/upload-artifact@v4 with: if-no-files-found: error - name: macOS DMG${{ matrix.suffix }} x86_64 + name: macOS DMG ${{ matrix.name_suffix }} x86_64 path: ./*.dmg macos-arm64: @@ -577,7 +641,7 @@ jobs: break; fi done - mv *.dmg ../imhex-${{ env.IMHEX_VERSION }}-macOS${{ matrix.suffix }}-arm64.dmg + mv *.dmg ../imhex-${{ env.IMHEX_VERSION }}-macOS${{ matrix.file_suffix }}-arm64.dmg - name: πŸ—οΈ Generate build provenance attestations uses: actions/attest-build-provenance@v2 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index de31e3713..ff2cd9866 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -92,7 +92,7 @@ jobs: - name: ⬇️ Download artifacts from latest workflow uses: dawidd6/action-download-artifact@v6 with: - github_token: ${{secrets.GITHUB_TOKEN}} + github_token: ${{ secrets.GITHUB_TOKEN }} workflow: build.yml branch: ${{ github.event.release.target_commitish }} workflow_conclusion: success diff --git a/cmake/build_helpers.cmake b/cmake/build_helpers.cmake index 55f1f9799..4b3745c3d 100644 --- a/cmake/build_helpers.cmake +++ b/cmake/build_helpers.cmake @@ -287,6 +287,17 @@ macro(createPackage) list(APPEND PLUGIN_TARGET_FILES "$") endforeach () + if (DEFINED VCPKG_TARGET_TRIPLET) + set(VCPKG_DEPS_FOLDER "") + if (CMAKE_BUILD_TYPE STREQUAL "Debug") + set(VCPKG_DEPS_FOLDER "${CMAKE_BINARY_DIR}/vcpkg_installed/${VCPKG_TARGET_TRIPLET}/debug/bin") + else() + set(VCPKG_DEPS_FOLDER "${CMAKE_BINARY_DIR}/vcpkg_installed/${VCPKG_TARGET_TRIPLET}/bin") + endif() + + install(CODE "set(VCPKG_DEPS_FOLDER \"${VCPKG_DEPS_FOLDER}\")") + endif() + # Grab all dynamically linked dependencies. install(CODE "set(CMAKE_INSTALL_BINDIR \"${CMAKE_INSTALL_BINDIR}\")") install(CODE "set(PLUGIN_TARGET_FILES \"${PLUGIN_TARGET_FILES}\")") @@ -300,10 +311,15 @@ macro(createPackage) POST_EXCLUDE_REGEXES ".*system32/.*\\.dll" ) - if(_c_deps_FILENAMES) + if(_c_deps_FILENAMES AND NOT _c_deps STREQUAL "") message(WARNING "Conflicting dependencies for library: \"${_c_deps}\"!") endif() + if (DEFINED VCPKG_DEPS_FOLDER) + file(GLOB VCPKG_DEPS "${VCPKG_DEPS_FOLDER}/*.dll") + list(APPEND _r_deps ${VCPKG_DEPS}) + endif() + foreach(_file ${_r_deps}) file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}" diff --git a/lib/third_party/imgui/imgui/include/imconfig.h b/lib/third_party/imgui/imgui/include/imconfig.h index 29e99d7c5..446d46f95 100644 --- a/lib/third_party/imgui/imgui/include/imconfig.h +++ b/lib/third_party/imgui/imgui/include/imconfig.h @@ -16,6 +16,11 @@ #include +// For alloc() on ARM64 Windows +#if __has_include() + #include +#endif + //---- Define assertion handler. Defaults to calling assert(). // If your macro uses multiple statements, make sure is enclosed in a 'do { .. } while (0)' block so it can be used as a single statement. //#define IM_ASSERT(_EXPR) MyAssert(_EXPR) diff --git a/lib/trace/source/stacktrace.cpp b/lib/trace/source/stacktrace.cpp index e82acff2f..d402f9286 100644 --- a/lib/trace/source/stacktrace.cpp +++ b/lib/trace/source/stacktrace.cpp @@ -74,21 +74,33 @@ namespace { STACKFRAME64 stackFrame; ZeroMemory(&stackFrame, sizeof(STACKFRAME64)); - image = IMAGE_FILE_MACHINE_AMD64; #if defined(_X86_) + image = IMAGE_FILE_MACHINE_I386; stackFrame.AddrPC.Offset = context.Eip; stackFrame.AddrPC.Mode = AddrModeFlat; stackFrame.AddrFrame.Offset = context.Esp; stackFrame.AddrFrame.Mode = AddrModeFlat; stackFrame.AddrStack.Offset = context.Esp; stackFrame.AddrStack.Mode = AddrModeFlat; - #else + #elif defined(_ARM64_) + image = IMAGE_FILE_MACHINE_ARM64; + stackFrame.AddrPC.Offset = context.Pc; + stackFrame.AddrPC.Mode = AddrModeFlat; + stackFrame.AddrFrame.Offset = context.Sp; + stackFrame.AddrFrame.Mode = AddrModeFlat; + stackFrame.AddrStack.Offset = context.Sp; + stackFrame.AddrStack.Mode = AddrModeFlat; + #elif defined(_AMD64_) + image = IMAGE_FILE_MACHINE_AMD64; stackFrame.AddrPC.Offset = context.Rip; stackFrame.AddrPC.Mode = AddrModeFlat; stackFrame.AddrFrame.Offset = context.Rsp; stackFrame.AddrFrame.Mode = AddrModeFlat; stackFrame.AddrStack.Offset = context.Rsp; stackFrame.AddrStack.Mode = AddrModeFlat; + #else + #warning "Unsupported architecture! Add support for your architecture here." + return {}; #endif while (true) {