Use cibuildwheel for wheel build. #22
This file contains 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: Wheel build | ||
on: | ||
release: | ||
types: [created] | ||
schedule: | ||
# ┌───────────── minute (0 - 59) | ||
# │ ┌───────────── hour (0 - 23) | ||
# │ │ ┌───────────── day of the month (1 - 31) | ||
# │ │ │ ┌───────────── month (1 - 12 or JAN-DEC) | ||
# │ │ │ │ ┌───────────── day of the week (0 - 6 or SUN-SAT) | ||
# │ │ │ │ │ | ||
- cron: "42 3 * * 4" | ||
push: | ||
paths: | ||
- .github/workflows/wheels.yml | ||
- requirements.txt | ||
- pyproject.toml | ||
- MANIFEST.in | ||
- Makefile | ||
- setup* | ||
- build* | ||
pull_request: | ||
types: [opened, synchronize, reopened] | ||
paths: | ||
- .github/workflows/wheels.yml | ||
- requirements.txt | ||
- pyproject.toml | ||
- MANIFEST.in | ||
- Makefile | ||
- setup* | ||
- build* | ||
workflow_dispatch: | ||
concurrency: | ||
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} | ||
cancel-in-progress: true | ||
permissions: {} | ||
jobs: | ||
sdist: | ||
runs-on: ubuntu-20.04 | ||
permissions: | ||
contents: write # to create GitHub release (softprops/action-gh-release) | ||
steps: | ||
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | ||
- name: Check out recursively | ||
run: git submodule update --init --recursive | ||
- name: Set up Python | ||
uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5.0.0 | ||
with: | ||
python-version: "3.x" | ||
- name: Install Python dependencies | ||
run: python -m pip install -r requirements.txt | ||
- name: Build sdist | ||
run: make sdist | ||
- name: Release | ||
uses: softprops/action-gh-release@v1 | ||
if: startsWith(github.ref, 'refs/tags/') | ||
with: | ||
files: dist/*.tar.gz | ||
- name: Upload sdist | ||
uses: actions/upload-artifact@v4 | ||
with: | ||
name: sdist | ||
path: dist/*.tar.gz | ||
generate-wheels-matrix: | ||
# Create a matrix of all architectures & versions to build. | ||
# This enables the next step to run cibuildwheel in parallel. | ||
# From https://iscinumpy.dev/post/cibuildwheel-2-10-0/#only-210 | ||
name: Generate wheels matrix | ||
runs-on: ubuntu-latest | ||
outputs: | ||
include: ${{ steps.set-matrix.outputs.include }} | ||
steps: | ||
- uses: actions/checkout@v4 | ||
- name: Install cibuildwheel | ||
# Nb. keep cibuildwheel version pin consistent with job below | ||
run: pipx install cibuildwheel==2.15.0 | ||
- id: set-matrix | ||
run: | | ||
MATRIX=$( | ||
{ | ||
cibuildwheel --print-build-identifiers --platform linux \ | ||
| jq -nRc '{"only": inputs, "os": "ubuntu-latest"}' \ | ||
&& cibuildwheel --print-build-identifiers --platform macos \ | ||
| jq -nRc '{"only": inputs, "os": "macos-latest"}' \ | ||
&& cibuildwheel --print-build-identifiers --platform windows \ | ||
| jq -nRc '{"only": inputs, "os": "windows-2019"}' | ||
} | jq -sc | ||
) | ||
echo "include=$MATRIX" | ||
echo "include=$MATRIX" >> $GITHUB_OUTPUT | ||
build_wheels: | ||
name: Build for ${{ matrix.only }} | ||
needs: generate-wheels-matrix | ||
runs-on: ${{ matrix.os }} | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
include: ${{ fromJson(needs.generate-wheels-matrix.outputs.include) }} | ||
env: | ||
MACOSX_DEPLOYMENT_TARGET: '11.0' | ||
LUPA_WITH_LUA_DLOPEN: ${{ startsWith(matrix.os, 'windows') && 'false' || 'true' }} | ||
steps: | ||
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | ||
- name: Check out recursively | ||
run: git submodule update --init --recursive | ||
- name: Set up QEMU | ||
if: runner.os == 'Linux' | ||
uses: docker/setup-qemu-action@v3 | ||
with: | ||
platforms: all | ||
- name: Install MacOS dependencies | ||
if: runner.os == 'macOS' | ||
run: | | ||
brew install automake libtool | ||
ln -s /usr/local/bin/glibtoolize /usr/local/bin/libtoolize | ||
- name: Build wheels | ||
uses: pypa/cibuildwheel@v2.16.2 | ||
with: | ||
only: ${{ matrix.only }} | ||
- uses: actions/upload-artifact@694cdabd8bdb0f10b2cea11669e1bf5453eed0a6 # v4.2.0 | ||
with: | ||
path: ./wheelhouse/*.whl | ||
name: wheel-${{ matrix.only }} | ||
- name: Install wheel | ||
run: | | ||
python -m pip install ./wheelhouse/lupa-*.whl | ||
python -c 'import lupa' | ||
python -c 'import lupa.lua54' | ||
upload_release_assets: | ||
name: Upload Release Assets | ||
needs: [ build_wheels ] | ||
runs-on: ubuntu-latest | ||
if: startsWith(github.ref, 'refs/tags') | ||
steps: | ||
- name: Download bdist files | ||
uses: actions/download-artifact@6b208ae046db98c579e8a3aa621ab581ff575935 # v4.1.1 | ||
with: | ||
path: ~/downloads | ||
merge-multiple: true | ||
- name: List downloaded artifacts | ||
run: ls -la ~/downloads | ||
- name: Release | ||
uses: softprops/action-gh-release@v1 | ||
with: | ||
files: ~/downloads/*.whl | ||
Linux: | ||
runs-on: ubuntu-latest | ||
strategy: | ||
# Allows for matrix sub-jobs to fail without canceling the rest | ||
fail-fast: false | ||
matrix: | ||
image: | ||
- manylinux2014_x86_64 | ||
- manylinux2014_i686 | ||
pyversion: ["*"] | ||
include: | ||
- image: manylinux2014_aarch64 | ||
pyversion: "cp36*" | ||
steps: | ||
- uses: actions/checkout@v4 | ||
- name: Check out recursively | ||
run: git submodule update --init --recursive | ||
- name: Set up Python | ||
uses: actions/setup-python@v4 | ||
with: | ||
python-version: "3.9" | ||
- name: Install dependencies | ||
run: python -m pip install -r requirements.txt | ||
- name: Build Linux wheels | ||
run: make USE_BUNDLE=true sdist wheel_${{ matrix.image }} | ||
env: { PYTHON_BUILD_VERSION: "${{ matrix.pyversion }}" } | ||
- name: Release | ||
uses: softprops/action-gh-release@v1 | ||
if: startsWith(github.ref, 'refs/tags/') | ||
with: | ||
files: wheelhouse_*/*-m*linux*.whl # manylinux / musllinux | ||
- name: Upload wheels | ||
uses: actions/upload-artifact@v4 | ||
with: | ||
name: wheels-${{ matrix.image }} | ||
path: wheelhouse_*/*-m*linux*.whl # manylinux / musllinux | ||
if-no-files-found: ignore | ||
non-Linux: | ||
strategy: | ||
# Allows for matrix sub-jobs to fail without canceling the rest | ||
fail-fast: false | ||
matrix: | ||
os: | ||
- macos-latest | ||
- windows-latest | ||
#os: [macos-11, windows-latest, macOS-M1] | ||
#os: [macos-11, macOS-M1] | ||
#os: [macos-11] | ||
pyversion: | ||
- "2.7" | ||
- "3.6" | ||
#- "pypy-3.7-v7.3.7" | ||
#- "pypy-3.8-v7.3.7" | ||
#- "pypy-3.9-v7.3.11" | ||
#- "pypy-3.10-v7.3.13" | ||
exclude: | ||
# outdated compilers and probably not worth supporting anymore | ||
- os: windows-latest | ||
pyversion: 2.7 | ||
runs-on: ${{ matrix.os }} | ||
env: | ||
MACOSX_DEPLOYMENT_TARGET: "11.0" | ||
LUPA_WITH_LUA_DLOPEN: ${{ startsWith(matrix.os, 'windows') && 'false' || 'true' }} | ||
steps: | ||
- uses: actions/checkout@v4 | ||
- name: Check out recursively | ||
run: git submodule update --init --recursive | ||
- name: Set up Python | ||
uses: actions/setup-python@v4 | ||
with: | ||
python-version: ${{ matrix.pyversion }} | ||
- name: Install MacOS dependencies | ||
if: startsWith(matrix.os, 'mac') | ||
run: | | ||
brew install automake libtool | ||
ln -s /usr/local/bin/glibtoolize /usr/local/bin/libtoolize | ||
- name: Install dependencies | ||
run: python -m pip install setuptools wheel -r requirements.txt | ||
- name: Build wheels | ||
run: | | ||
set USE_BUNDLE=true | ||
python setup.py --with-cython sdist ${{ contains(matrix.pyversion, '3.') && 'build_ext -j6' || '' }} bdist_wheel | ||
- name: Release | ||
uses: softprops/action-gh-release@v1 | ||
if: startsWith(github.ref, 'refs/tags/') | ||
with: | ||
files: dist/*.whl | ||
- name: Upload wheels | ||
uses: actions/upload-artifact@v3 | ||
with: | ||
name: wheels-${{ matrix.os }} | ||
path: dist/*.whl | ||
if-no-files-found: ignore |