From 5a0a5ad445c9a02281c946a716288c3817cea205 Mon Sep 17 00:00:00 2001 From: Nik Date: Sat, 30 Dec 2023 19:11:33 +0100 Subject: [PATCH] build: Fix macOS M1 build entirely (#1480) --- .github/workflows/build.yml | 57 +++++++++++++++++++++++++++- cmake/build_helpers.cmake | 58 ++++++++++++++++------------- dist/macOS/arm64.Dockerfile | 5 ++- lib/libimhex/include/hex/plugin.hpp | 6 ++- main/updater/CMakeLists.txt | 13 +++++-- 5 files changed, 105 insertions(+), 34 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b8d182ea0..9b4c8c1a0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -244,9 +244,11 @@ jobs: name: macOS DMG${{matrix.suffix}} x86_64 path: build/*.dmg - macos-arm64: + 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@v3 @@ -266,13 +268,15 @@ jobs: 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 ZIP arm64 + name: macos_arm64_intermediate path: out/ # See https://github.com/actions/cache/issues/342#issuecomment-1711054115 @@ -283,6 +287,55 @@ jobs: 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@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + name: macos_arm64_intermediate + + - name: ✒️ Fix Signature + run: | + set -x + cd out + 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: 📦 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: diff --git a/cmake/build_helpers.cmake b/cmake/build_helpers.cmake index 6dabc5c88..e0d773c01 100644 --- a/cmake/build_helpers.cmake +++ b/cmake/build_helpers.cmake @@ -111,8 +111,9 @@ macro(configurePackingResources) ) set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/resources/dist/windows/LICENSE.rtf") endif() - elseif (APPLE) - set (IMHEX_ICON "${IMHEX_BASE_FOLDER}/resources/dist/macos/AppIcon.icns") + elseif (APPLE OR ${CMAKE_HOST_SYSTEM_NAME} MATCHES "Darwin") + set(IMHEX_ICON "${IMHEX_BASE_FOLDER}/resources/dist/macos/AppIcon.icns") + set(BUNDLE_NAME "imhex.app") if (IMHEX_GENERATE_PACKAGE) set(APPLICATION_TYPE MACOSX_BUNDLE) @@ -129,9 +130,9 @@ macro(configurePackingResources) string(TIMESTAMP CURR_YEAR "%Y") set(MACOSX_BUNDLE_COPYRIGHT "Copyright © 2020 - ${CURR_YEAR} WerWolv. All rights reserved." ) if ("${CMAKE_GENERATOR}" STREQUAL "Xcode") - set (IMHEX_BUNDLE_PATH "${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/imhex.app") + set (IMHEX_BUNDLE_PATH "${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/${BUNDLE_NAME}") else () - set (IMHEX_BUNDLE_PATH "${CMAKE_BINARY_DIR}/imhex.app") + set (IMHEX_BUNDLE_PATH "${CMAKE_BINARY_DIR}/${BUNDLE_NAME}") endif() set(PLUGINS_INSTALL_LOCATION "${IMHEX_BUNDLE_PATH}/Contents/MacOS/plugins") @@ -235,36 +236,41 @@ macro(createPackage) endif() - if (IMHEX_GENERATE_PACKAGE AND APPLE) - include(PostprocessBundle) + if (APPLE) + if (IMHEX_GENERATE_PACKAGE) + include(PostprocessBundle) - set_target_properties(libimhex PROPERTIES SOVERSION ${IMHEX_VERSION}) + set_target_properties(libimhex PROPERTIES SOVERSION ${IMHEX_VERSION}) - set_property(TARGET main PROPERTY MACOSX_BUNDLE_INFO_PLIST ${MACOSX_BUNDLE_INFO_PLIST}) + set_property(TARGET main PROPERTY MACOSX_BUNDLE_INFO_PLIST ${MACOSX_BUNDLE_INFO_PLIST}) - # Fix rpath - add_custom_command(TARGET imhex_all POST_BUILD COMMAND ${CMAKE_INSTALL_NAME_TOOL} -add_rpath "@executable_path/../Frameworks/" $) + # Fix rpath + add_custom_command(TARGET imhex_all POST_BUILD COMMAND ${CMAKE_INSTALL_NAME_TOOL} -add_rpath "@executable_path/../Frameworks/" $) - # FIXME: Remove this once we move/integrate the plugins directory. - add_custom_target(build-time-make-plugins-directory ALL COMMAND ${CMAKE_COMMAND} -E make_directory "${IMHEX_BUNDLE_PATH}/Contents/MacOS/plugins") - add_custom_target(build-time-make-resources-directory ALL COMMAND ${CMAKE_COMMAND} -E make_directory "${IMHEX_BUNDLE_PATH}/Contents/Resources") + # FIXME: Remove this once we move/integrate the plugins directory. + add_custom_target(build-time-make-plugins-directory ALL COMMAND ${CMAKE_COMMAND} -E make_directory "${IMHEX_BUNDLE_PATH}/Contents/MacOS/plugins") + add_custom_target(build-time-make-resources-directory ALL COMMAND ${CMAKE_COMMAND} -E make_directory "${IMHEX_BUNDLE_PATH}/Contents/Resources") - downloadImHexPatternsFiles("${IMHEX_BUNDLE_PATH}/Contents/MacOS") + downloadImHexPatternsFiles("${IMHEX_BUNDLE_PATH}/Contents/MacOS") - install(FILES ${IMHEX_ICON} DESTINATION "${IMHEX_BUNDLE_PATH}/Contents/Resources") - install(TARGETS main BUNDLE DESTINATION ".") - install(TARGETS updater BUNDLE DESTINATION ".") - install(FILES $ DESTINATION "${IMHEX_BUNDLE_PATH}") - install(FILES $ DESTINATION "${IMHEX_BUNDLE_PATH}") + install(FILES ${IMHEX_ICON} DESTINATION "${IMHEX_BUNDLE_PATH}/Contents/Resources") + install(TARGETS main BUNDLE DESTINATION ".") - # Update library references to make the bundle portable - postprocess_bundle(imhex_all main) + # Update library references to make the bundle portable + postprocess_bundle(imhex_all main) - # Enforce DragNDrop packaging. - set(CPACK_GENERATOR "DragNDrop") + # Enforce DragNDrop packaging. + set(CPACK_GENERATOR "DragNDrop") - set(CPACK_BUNDLE_ICON "${CMAKE_SOURCE_DIR}/resources/dist/macos/AppIcon.icns" ) - set(CPACK_BUNDLE_PLIST "${CMAKE_BINARY_DIR}/imhex.app/Contents/Info.plist") + set(CPACK_BUNDLE_ICON "${CMAKE_SOURCE_DIR}/resources/dist/macos/AppIcon.icns") + set(CPACK_BUNDLE_PLIST "${CMAKE_BINARY_DIR}/${BUNDLE_NAME}/Contents/Info.plist") + endif() + + # Sign the bundle + find_program(CODESIGN_PATH codesign) + if (CODESIGN_PATH) + add_custom_command(TARGET imhex_all POST_BUILD COMMAND ${CODESIGN_PATH} --force --deep --sign - ${CMAKE_BINARY_DIR}/${BUNDLE_NAME}) + endif() else() install(TARGETS main RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) if (TARGET updater) @@ -703,7 +709,7 @@ function(generateSDKDirectory) if (WIN32) set(SDK_PATH "./sdk") elseif (APPLE) - set(SDK_PATH "imhex.app/Contents/Resources/sdk") + set(SDK_PATH "${BUNDLE_NAME}/Contents/Resources/sdk") else() set(SDK_PATH "share/imhex/sdk") endif() diff --git a/dist/macOS/arm64.Dockerfile b/dist/macOS/arm64.Dockerfile index a3ee8900b..d9203e133 100644 --- a/dist/macOS/arm64.Dockerfile +++ b/dist/macOS/arm64.Dockerfile @@ -149,6 +149,7 @@ RUN --mount=type=cache,target=/cache --mount=type=cache,target=/mnt/ImHex/build/ -DIMHEX_GENERATE_PACKAGE=ON -DCMAKE_BUILD_TYPE=$BUILD_TYPE \ `# other flags` \ -DIMHEX_STRICT_WARNINGS=OFF \ + -DCMAKE_INSTALL_PREFIX=/mnt/ImHex/build/install \ -B build ## Build ImHex RUN --mount=type=cache,target=/cache --mount=type=cache,target=/mnt/ImHex/build/_deps <