| name: CI | |
| # Controls when the action will run. | |
| on: | |
| # Triggers the workflow on push or pull request events | |
| push: | |
| pull_request: | |
| # Allows you to run this workflow manually from the Actions tab | |
| workflow_dispatch: | |
| # A workflow run is made up of one or more jobs that can run sequentially or in parallel | |
| # See the following, which includes links to supported macOS versions, including supported Xcode versions | |
| # https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources | |
| jobs: | |
| build: | |
| strategy: | |
| matrix: | |
| # Primary build on latest macOS and its default Xcode version | |
| os: [ "macos-latest" ] | |
| platform: [ "all", "macos", "ios" ] | |
| upload_artifacts: [ true ] | |
| select_xcode: [ false ] | |
| private_api: [ false ] | |
| include: | |
| # macOS build with private APIs enabled. | |
| - os: "macos-latest" | |
| platform: "macos" | |
| upload_artifacts: true | |
| select_xcode: false | |
| private_api: true | |
| # Legacy build. Up to 3 versions behind latest (or beta). | |
| - os: "macos-14" | |
| xcode: "15.0.1" | |
| platform: "macos" | |
| upload_artifacts: false | |
| select_xcode: true | |
| private_api: false | |
| fail-fast: false | |
| name: MoltenVK (Xcode ${{ matrix.xcode }} - ${{ matrix.platform }}${{ matrix.private_api && '-privateapi' || '' }}) | |
| runs-on: ${{ matrix.os }} | |
| env: | |
| XCODE_DEV_PATH: "/Applications/Xcode_${{ matrix.xcode }}.app/Contents/Developer" | |
| ARTIFACT_TYPE: ${{ matrix.platform }}${{ matrix.private_api && '-privateapi' || '' }} | |
| BUILD_ARGUMENTS: ${{ matrix.platform }} ${{ matrix.private_api && 'MVK_USE_METAL_PRIVATE_API=1' || '' }} | |
| steps: | |
| # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it | |
| - uses: actions/checkout@v4 | |
| # Python 3.12 removed distutils, which is used by glslang::update_glslang_sources.py called from fetchDependencies | |
| - uses: actions/setup-python@v5 | |
| with: | |
| python-version: '3.11' | |
| - name: List available Xcode versions | |
| run: ls /Applications | grep Xcode | |
| - name: Select Xcode version | |
| if: matrix.select_xcode == true | |
| run: sudo xcode-select -switch "${XCODE_DEV_PATH}" | |
| - name: Prep | |
| id: prep | |
| run: | | |
| echo "Get Xcode version info" | |
| XCODE_VERSION="$(xcodebuild -version)" | |
| echo "${XCODE_VERSION}" | |
| XCODE_VERSION="$(echo "${XCODE_VERSION}" | tr '\t\r\n ' '_')" | |
| echo "${XCODE_VERSION}" | |
| echo "XCODE_VERSION=${XCODE_VERSION}" >> $GITHUB_OUTPUT | |
| - name: Cache Dependencies | |
| id: cache-dependencies | |
| if: success() && !(github.event_name == 'push' && contains(github.ref, 'refs/tags/')) # never cache dependencies for pushed tags | |
| uses: actions/cache@v3 | |
| with: | |
| path: | | |
| External/build | |
| !External/build/Intermediates | |
| key: ${{ runner.os }}-${{ steps.prep.outputs.XCODE_VERSION }}-${{ matrix.platform }}-${{ hashFiles('fetchDependencies','ExternalRevisions/**','ExternalDependencies.xcodeproj/**','Scripts/**') }} | |
| - name: Fetch Dependencies (Use Built Cache) | |
| if: steps.cache-dependencies.outputs.cache-hit == 'true' | |
| run: | | |
| ./fetchDependencies -v --none | |
| - name: Fetch Dependencies | |
| if: steps.cache-dependencies.outputs.cache-hit != 'true' | |
| run: | | |
| ./fetchDependencies -v --${{ matrix.platform }} | |
| - name: Output Dependency Build Logs on Failure | |
| if: failure() | |
| run: cat "dependenciesbuild.log" | |
| - name: Build MoltenVK | |
| run: | | |
| make ${BUILD_ARGUMENTS} | |
| - name: Output MoltenVK Build Logs on Failure | |
| if: failure() | |
| run: | | |
| if [ -f "xcodebuild.log" ]; then | |
| cat "xcodebuild.log" | |
| fi | |
| - name: Tar Artifacts | |
| if: success() && matrix.upload_artifacts == true | |
| # See: https://github.com/actions/upload-artifact#maintaining-file-permissions-and-case-sensitive-files | |
| # To reduce artifact size, don't include any stand-alone shader converter binaries. | |
| run: | | |
| rm -rf Package/Release/MoltenVKShaderConverter | |
| tar -C Package -s/Release/MoltenVK/ -cvf "MoltenVK-${ARTIFACT_TYPE}.tar" Release/ | |
| - name: Upload Artifacts | |
| if: success() && matrix.upload_artifacts == true | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: "MoltenVK-${{ env.ARTIFACT_TYPE }}" | |
| path: "MoltenVK-${{ env.ARTIFACT_TYPE }}.tar" | |
| build_cmake: | |
| strategy: | |
| matrix: | |
| # Primary build on latest macOS and its default Xcode version | |
| os: [ "macos-latest" ] | |
| # platform: [ "all", "macos", "ios" ] | |
| config: [Debug, Release] | |
| fail-fast: false | |
| name: 'MoltenVK (Cmake - ${{ matrix.config }})' | |
| runs-on: ${{ matrix.os }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Dependencies | |
| if: runner.os == 'macOS' | |
| run: | | |
| brew install ccache | |
| echo 'CACHE_PATH=~/Library/Caches/ccache' >> "$GITHUB_ENV" | |
| - name: Get number of CPU cores | |
| uses: SimenB/github-actions-cpu-cores@v2.0.0 | |
| id: cpu-cores | |
| - name: Cache Build | |
| id: cache-build | |
| uses: actions/cache@v4 | |
| with: | |
| path: ${{ env.CACHE_PATH }} | |
| key: ${{ runner.os }}-${{ matrix.config }}-cache | |
| - name: Prepare ccache | |
| run: | | |
| ccache --max-size=1.0G | |
| ccache -V && ccache --show-config | |
| ccache --show-stats && ccache --zero-stats | |
| - name: Configure | |
| run: | | |
| mkdir -p build | |
| cd build | |
| cmake .. -DCMAKE_BUILD_TYPE=${{ matrix.config }} | |
| - name: Build | |
| run: | | |
| cmake --build build -j ${{ steps.cpu-cores.outputs.count }} | |
| ccache --show-stats | |
| release: | |
| name: 'Release' | |
| needs: [build] | |
| runs-on: ubuntu-latest | |
| if: ${{ startsWith(github.ref, 'refs/tags/') }} | |
| permissions: | |
| contents: write | |
| steps: | |
| - name: Download Artifacts | |
| uses: actions/download-artifact@v4 | |
| - name: Create Release | |
| uses: ncipollo/release-action@v1 | |
| with: | |
| # Allow updating existing releases if the workflow is triggered by release creation or re-run. | |
| allowUpdates: true | |
| # When the release is updated, delete the existing artifacts for replacement. | |
| removeArtifacts: true | |
| # If a release is being replaced, omit updating the name and body. | |
| # Allows for creating a release and filling these in before the workflow runs. | |
| # Then, the workflow will populate the release with the artifacts. | |
| omitNameDuringUpdate: true | |
| omitBodyDuringUpdate: true | |
| # Upload all MoltenVK CI artifacts as release assets. | |
| artifacts: "MoltenVK*/*" | |
| artifactErrorsFailBuild: true |