Skip to content

Build PyPI package #1111

Build PyPI package

Build PyPI package #1111

Workflow file for this run

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'