Build PyPI package #1111
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Build PyPI package | |
| on: | |
| push: | |
| branches: [ main ] | |
| release: | |
| types: [ published ] | |
| workflow_dispatch: | |
| env: | |
| # TODO: detect this from repo somehow: https://github.com/halide/Halide/issues/8406 | |
| LLVM_VERSION: 21.1.8 | |
| FLATBUFFERS_VERSION: 23.5.26 | |
| WABT_VERSION: 1.0.36 | |
| concurrency: | |
| group: '${{ github.workflow }}-${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' | |
| cancel-in-progress: true | |
| permissions: | |
| contents: read # to fetch code (actions/checkout) | |
| jobs: | |
| build-wheels: | |
| name: Build Halide wheels for ${{ matrix.platform_tag }} | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - os: ubuntu-latest | |
| platform_tag: manylinux_x86_64 | |
| - os: windows-latest | |
| platform_tag: win_amd64 | |
| - os: macos-15-intel | |
| platform_tag: macosx_x86_64 | |
| - os: macos-15 | |
| platform_tag: macosx_arm64 | |
| env: | |
| MACOSX_DEPLOYMENT_TARGET: 11 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| fetch-tags: true | |
| - uses: ilammy/msvc-dev-cmd@v1 | |
| - uses: lukka/get-cmake@v3.28.4 | |
| ######################################################################## | |
| # flatbuffers | |
| ######################################################################## | |
| - name: Cache flatbuffers build folder | |
| id: cache-flatbuffers | |
| uses: actions/cache@v4 | |
| with: | |
| path: opt/flatbuffers | |
| key: flatbuffers-${{ env.FLATBUFFERS_VERSION }}-${{ matrix.platform_tag }} | |
| - uses: actions/checkout@v4 | |
| if: steps.cache-flatbuffers.outputs.cache-hit != 'true' | |
| with: | |
| path: flatbuffers-src | |
| repository: google/flatbuffers | |
| ref: v${{ env.FLATBUFFERS_VERSION }} | |
| - name: Configure flatbuffers | |
| if: steps.cache-flatbuffers.outputs.cache-hit != 'true' | |
| run: > | |
| cmake -G Ninja -S flatbuffers-src -B flatbuffers-build | |
| "-DCMAKE_BUILD_TYPE=Release" | |
| "-DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/opt/flatbuffers" | |
| "-DFLATBUFFERS_BUILD_TESTS=NO" | |
| - name: Install flatbuffers | |
| if: steps.cache-flatbuffers.outputs.cache-hit != 'true' | |
| run: | | |
| cmake --build flatbuffers-build --target install | |
| cmake -E rm -rf flatbuffers-src flatbuffers-build | |
| ######################################################################## | |
| # wabt | |
| ######################################################################## | |
| - name: Cache wabt build folder | |
| if: matrix.os != 'windows-latest' | |
| id: cache-wabt | |
| uses: actions/cache@v4 | |
| with: | |
| path: opt/wabt | |
| key: wabt-${{ env.WABT_VERSION }}-${{ matrix.platform_tag }} | |
| - uses: actions/checkout@v4 | |
| if: > | |
| matrix.os != 'windows-latest' | |
| && steps.cache-wabt.outputs.cache-hit != 'true' | |
| with: | |
| submodules: 'true' | |
| path: wabt-src | |
| repository: WebAssembly/wabt | |
| ref: ${{ env.WABT_VERSION }} | |
| - name: Configure wabt | |
| if: > | |
| matrix.os != 'windows-latest' | |
| && steps.cache-wabt.outputs.cache-hit != 'true' | |
| run: > | |
| cmake -G Ninja -S wabt-src -B wabt-build | |
| "-DCMAKE_BUILD_TYPE=Release" | |
| "-DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/opt/wabt" | |
| "-DWITH_EXCEPTIONS=ON" | |
| "-DBUILD_TESTS=OFF" | |
| "-DBUILD_TOOLS=OFF" | |
| "-DBUILD_LIBWASM=OFF" | |
| "-DUSE_INTERNAL_SHA256=ON" | |
| - name: Install wabt | |
| if: > | |
| matrix.os != 'windows-latest' | |
| && steps.cache-wabt.outputs.cache-hit != 'true' | |
| run: | | |
| cmake --build wabt-build --target install | |
| cmake -E rm -rf wabt-src wabt-build | |
| ######################################################################## | |
| # LLVM | |
| ######################################################################## | |
| - name: Install LLVM | |
| shell: bash | |
| run: | | |
| pip install "halide-llvm==${{ env.LLVM_VERSION }}" \ | |
| --extra-index-url https://pypi.halide-lang.org/simple/ | |
| echo "Halide_LLVM_ROOT=$(halide-llvm --prefix)" >> "$GITHUB_ENV" | |
| # On Linux, copy LLVM into workspace so it's visible inside the | |
| # cibuildwheel container (mounted at /project). | |
| if [ "${{ matrix.os }}" = "ubuntu-latest" ]; then | |
| cp -a "$(halide-llvm --prefix)" opt/llvm | |
| fi | |
| ######################################################################## | |
| # Wheels | |
| ######################################################################## | |
| #- uses: mxschmitt/action-tmate@v3 | |
| - name: Build wheels | |
| uses: pypa/cibuildwheel@v2.20.0 | |
| env: | |
| CIBW_BUILD: "cp3*-${{ matrix.platform_tag }}" | |
| CIBW_SKIP: "cp3{5,6,7,8,9}*" | |
| CIBW_ENVIRONMENT_LINUX: > | |
| Halide_LLVM_ROOT=/project/opt/llvm | |
| CMAKE_PREFIX_PATH=/project/opt | |
| SETUPTOOLS_SCM_OVERRIDES_FOR_HALIDE='{local_scheme="no-local-version"}' | |
| CIBW_ENVIRONMENT_MACOS: > | |
| CMAKE_PREFIX_PATH='${{ github.workspace }}/opt' | |
| Python_ROOT_DIR='' | |
| SETUPTOOLS_SCM_OVERRIDES_FOR_HALIDE='{local_scheme="no-local-version"}' | |
| CIBW_ENVIRONMENT_WINDOWS: > | |
| CMAKE_GENERATOR=Ninja | |
| CMAKE_PREFIX_PATH='${{ github.workspace }}\opt' | |
| SETUPTOOLS_SCM_OVERRIDES_FOR_HALIDE='{local_scheme="no-local-version"}' | |
| CIBW_TEST_COMMAND: > | |
| cmake -G Ninja -S {project}/python_bindings/apps -B build -DCMAKE_BUILD_TYPE=Release && | |
| cmake --build build && | |
| ctest --test-dir build --output-on-failure | |
| # Windows puts the Python interpreter in /Scripts, rather than /bin, which CMake doesn't understand. | |
| CIBW_TEST_COMMAND_WINDOWS: > | |
| cmake -G Ninja -S {project}/python_bindings/apps -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=%VIRTUAL_ENV% && | |
| cmake --build build && | |
| ctest --test-dir build --output-on-failure | |
| - uses: actions/upload-artifact@v4 | |
| with: | |
| name: wheels-${{ matrix.platform_tag }} | |
| path: ./wheelhouse/*.whl | |
| publish: | |
| name: Publish on PyPI | |
| needs: build-wheels | |
| runs-on: ubuntu-latest | |
| permissions: | |
| id-token: write | |
| steps: | |
| - uses: actions/download-artifact@v4 | |
| with: | |
| pattern: wheels-* | |
| merge-multiple: true | |
| path: dist | |
| - uses: pypa/gh-action-pypi-publish@release/v1 | |
| if: github.event_name == 'push' && github.ref_name == 'main' || github.event_name == 'workflow_dispatch' | |
| with: | |
| user: upload | |
| password: ${{ secrets.HALIDE_PYPI_PASSWORD }} | |
| repository-url: https://pypi.halide-lang.org/ | |
| - uses: pypa/gh-action-pypi-publish@release/v1 | |
| if: github.event_name == 'release' && github.event.action == 'published' |