From ee39999941e35c1e2c77c1dc047753a30917c147 Mon Sep 17 00:00:00 2001 From: Alan Liddell Date: Fri, 12 Jul 2024 08:51:35 -0400 Subject: [PATCH] Vcpkg MacOS universal build (#272) Fixes #263. - Splits up the `build` stage on both build and release jobs into "mac" and "windows-and-linux." - Cosmetic changes to the windows-and-linux build - Mac builds build on both x86_64 and ARM separately, then use [`lipo`](https://developer.apple.com/documentation/apple-silicon/building-a-universal-macos-binary#Update-the-Architecture-List-of-Custom-Makefiles) to merge them. - Cosmetic changes elsewhere. --- .github/workflows/build.yml | 73 +++++++++++++++++++++++++++++++---- .github/workflows/release.yml | 72 ++++++++++++++++++++++++++++++---- .github/workflows/test_pr.yml | 9 +++-- 3 files changed, 136 insertions(+), 18 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fd59fb19..ae560e16 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,21 +2,24 @@ name: Build on: push: - branches: [ "main" ] + branches: + - "main" jobs: - build: + windows-and-linux-build: strategy: matrix: - build_type: [ Debug, Release ] - platform: [ "windows-latest", "ubuntu-latest", "macos-latest" ] + build_type: + - "Debug" + - "Release" + platform: + - "windows-latest" + - "ubuntu-latest" include: - platform: "windows-latest" vcpkg_triplet: "x64-windows-static" - platform: "ubuntu-latest" vcpkg_triplet: "x64-linux" - - platform: "macos-latest" - vcpkg_triplet: "arm64-osx" runs-on: ${{ matrix.platform }} @@ -45,7 +48,7 @@ jobs: - name: CMake run: | cmake --preset=default -DVCPKG_TARGET_TRIPLET=${{matrix.vcpkg_triplet}} - cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" + cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{matrix.build_type}} - name: Build run: | @@ -56,3 +59,59 @@ jobs: with: name: ${{matrix.platform}} ${{matrix.build_type}} binaries path: ${{github.workspace}}/*.zip + + mac-build: + strategy: + matrix: + build_type: + - "Debug" + - "Release" + + runs-on: "macos-latest" + + permissions: + actions: write + + steps: + - name: Cancel Previous Runs + uses: styfle/cancel-workflow-action@0.10.0 + with: + access_token: ${{ github.token }} + + - uses: actions/checkout@v3 + with: + submodules: true + + - name: Install vcpkg + run: | + git clone https://github.com/microsoft/vcpkg.git + cd vcpkg && ./bootstrap-vcpkg.sh + echo "VCPKG_ROOT=${{github.workspace}}/vcpkg" >> $GITHUB_ENV + echo "${{github.workspace}}/vcpkg" >> $GITHUB_PATH + ./vcpkg integrate install + shell: bash + + - name: Build for x64 + run: | + cmake --preset=default -DVCPKG_TARGET_TRIPLET=x64-osx -DVCPKG_INSTALLED_DIR=${{github.workspace}}/vcpkg-x64 -B ${{github.workspace}}/build-x64 -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DCMAKE_OSX_ARCHITECTURES="x86_64" -DNOTEST=1 + cmake --build ${{github.workspace}}/build-x64 --config ${{matrix.build_type}} + + - name: Build for arm64 + run: | + cmake --preset=default -DVCPKG_TARGET_TRIPLET=arm64-osx -DVCPKG_INSTALLED_DIR=${{github.workspace}}/vcpkg-arm64 -B ${{github.workspace}}/build-arm64 -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DCMAKE_OSX_ARCHITECTURES="arm64" -DNOTEST=1 + cmake --build ${{github.workspace}}/build-arm64 --config ${{matrix.build_type}} + + - name: Create a universal binary + run: | + cp -r ${{github.workspace}}/build-x64 ${{github.workspace}}/build && cd ${{github.workspace}}/build + for filename in $(find . -type f -exec grep -H "build-x64" {} \; | awk '{print $1}' | sed -e 's/:.*//' | sort -u); do sed -i.bak -e "s/build-x64/build/g" $filename && rm ${filename}.bak; done + for lib in `find . -type f \( -name "*.so" -o -name "*.a" \)`; do rm $lib && lipo -create ../build-x64/${lib} ../build-arm64/${lib} -output $lib; done + + - name: Package + run: | + cpack --config ${{github.workspace}}/build/CPackConfig.cmake -C ${{matrix.build_type}} -G ZIP + + - uses: actions/upload-artifact@v3 + with: + name: macos-latest ${{matrix.build_type}} binaries + path: ${{github.workspace}}/*.zip \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8dd22df4..d4bc5976 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,17 +10,18 @@ env: BUILD_TYPE: Release jobs: - build: + windows-and-linux-build: strategy: matrix: - platform: [ "windows-latest", "ubuntu-latest", "macos-latest" ] + platform: + - "windows-latest" + - "ubuntu-latest" include: - platform: "windows-latest" vcpkg_triplet: "x64-windows-static" - platform: "ubuntu-latest" vcpkg_triplet: "x64-linux" - - platform: "macos-latest" - vcpkg_triplet: "arm64-osx" + runs-on: ${{ matrix.platform }} permissions: @@ -47,8 +48,7 @@ jobs: - name: Build run: | - cmake --preset=default -DVCPKG_TARGET_TRIPLET=${{matrix.vcpkg_triplet}} - cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=Release + cmake --preset=default -DVCPKG_TARGET_TRIPLET=${{matrix.vcpkg_triplet}} -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=Release cmake --build ${{github.workspace}}/build --config Release - name: Test # don't release if tests are failing @@ -57,7 +57,7 @@ jobs: - name: Package run: | - cmake -B ${{github.workspace}}/pack -DCMAKE_BUILD_TYPE=Release -DNOTEST=1 -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" + cmake --preset=default -DVCPKG_TARGET_TRIPLET=${{matrix.vcpkg_triplet}} -B ${{github.workspace}}/pack -DCMAKE_BUILD_TYPE=Release -DNOTEST=1 cmake --build ${{github.workspace}}/pack --config Release cpack --config ${{github.workspace}}/pack/CPackConfig.cmake -C Release -G ZIP @@ -66,8 +66,64 @@ jobs: name: ${{matrix.platform}} binaries path: ${{github.workspace}}/*.zip + mac-build: + runs-on: "macos-latest" + + permissions: + actions: write + + steps: + - name: Cancel Previous Runs + uses: styfle/cancel-workflow-action@0.10.0 + with: + access_token: ${{ github.token }} + + - uses: actions/checkout@v3 + with: + submodules: true + + - name: Install vcpkg + run: | + git clone https://github.com/microsoft/vcpkg.git + cd vcpkg && ./bootstrap-vcpkg.sh + echo "VCPKG_ROOT=${{github.workspace}}/vcpkg" >> $GITHUB_ENV + echo "${{github.workspace}}/vcpkg" >> $GITHUB_PATH + ./vcpkg integrate install + shell: bash + + - name: Build for x64 + run: | + cmake --preset=default -DVCPKG_TARGET_TRIPLET=x64-osx -DVCPKG_INSTALLED_DIR=${{github.workspace}}/vcpkg-x64 -B ${{github.workspace}}/build-x64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_ARCHITECTURES="x86_64" -DNOTEST=1 + cmake --build ${{github.workspace}}/build-x64 --config Release + + - name: Build for arm64 + run: | + cmake --preset=default -DVCPKG_TARGET_TRIPLET=arm64-osx -DVCPKG_INSTALLED_DIR=${{github.workspace}}/vcpkg-arm64 -B ${{github.workspace}}/build-arm64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_ARCHITECTURES="arm64" + cmake --build ${{github.workspace}}/build-arm64 --config Release + + - name: Test # don't release if tests are failing + working-directory: ${{github.workspace}}/build-arm64 + run: ctest -C Release -L anyplatform --output-on-failure + + - name: Create a universal binary + run: | + cp -r ${{github.workspace}}/build-x64 ${{github.workspace}}/build && cd ${{github.workspace}}/build + for filename in $(find . -type f -exec grep -H "build-x64" {} \; | awk '{print $1}' | sed -e 's/:.*//' | sort -u); do sed -i.bak -e "s/build-x64/build/g" $filename && rm ${filename}.bak; done + for lib in `find . -type f \( -name "*.so" -o -name "*.a" \)`; do rm $lib && lipo -create ../build-x64/${lib} ../build-arm64/${lib} -output $lib; done + + - name: Package + run: | + cpack --config ${{github.workspace}}/build/CPackConfig.cmake -C Release -G ZIP + + - uses: actions/upload-artifact@v3 + with: + name: macos-latest binaries + path: ${{github.workspace}}/*.zip + release: - needs: build + needs: + - windows-and-linux-build + - mac-build name: "Release" runs-on: "ubuntu-latest" diff --git a/.github/workflows/test_pr.yml b/.github/workflows/test_pr.yml index 0ba883bb..ebd53461 100644 --- a/.github/workflows/test_pr.yml +++ b/.github/workflows/test_pr.yml @@ -19,12 +19,15 @@ jobs: strategy: fail-fast: false matrix: - platform: [ "windows-latest", "ubuntu-latest", "macos-latest" ] + platform: + - "ubuntu-latest" + - "windows-latest" + - "macos-latest" include: - - platform: "windows-latest" - vcpkg_triplet: "x64-windows-static" - platform: "ubuntu-latest" vcpkg_triplet: "x64-linux" + - platform: "windows-latest" + vcpkg_triplet: "x64-windows-static" - platform: "macos-latest" vcpkg_triplet: "arm64-osx" permissions: