PyPi packaging #1051
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
on: | |
release: | |
types: [published] | |
schedule: | |
- cron: '0 1 * * *' | |
workflow_dispatch: | |
inputs: | |
release_tag: | |
description: "Tag of the release to build (leave empty for current branch)" | |
python_versions: | |
description: "Python versions to build (leave empty for all supported versions)" | |
deploy_target: | |
type: choice | |
description: "Choose the deployment target" | |
options: | |
- None | |
- PyPI | |
- Test PyPI | |
name: PyPi packaging | |
jobs: | |
build_wheels: | |
name: ${{ matrix.name }}${{ matrix.gpl && ' (GPL)' || '' }} | |
runs-on: ${{ matrix.os }} | |
if: (github.repository == 'cvc5/cvc5') || (github.event_name != 'schedule') | |
strategy: | |
matrix: | |
name: | |
- manylinux-x86_64 | |
- manylinux-aarch64 | |
- macos-x86_64 | |
- macos-arm64 | |
- windows-x86_64 | |
gpl: [false, true] | |
include: | |
- name: manylinux-x86_64 | |
os: ubuntu-latest | |
arch: x86_64 | |
shell: bash | |
- name: manylinux-aarch64 | |
os: ubuntu-24.04-arm | |
arch: aarch64 | |
shell: bash | |
- name: macos-x86_64 | |
os: macos-13 | |
macos-target: 10.13 | |
shell: bash | |
- name: macos-arm64 | |
os: macos-14 | |
macos-target: 11 | |
shell: bash | |
- name: windows-x86_64 | |
os: windows-latest | |
shell: 'msys2 {0}' | |
exclude: | |
- name: windows-x86_64 | |
gpl: true | |
defaults: | |
run: | |
shell: ${{ matrix.shell }} | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
ref: ${{ github.event.inputs.release_tag }} | |
# Required by PEP-668 | |
- name: Set up Python virtual environment | |
if: runner.os == 'macOS' | |
run: | | |
python3 -m venv ~/.venv | |
echo "$HOME/.venv/bin" >> $GITHUB_PATH | |
- uses: msys2/setup-msys2@v2 | |
if: runner.os == 'Windows' | |
with: | |
msystem: mingw64 | |
path-type: inherit | |
install: | | |
make | |
mingw-w64-x86_64-cmake | |
mingw-w64-x86_64-gcc | |
mingw-w64-x86_64-gmp | |
# cibuildwheel requires pyproject.toml to be present from the beginning | |
- name: Create pyproject.toml | |
run: | | |
echo "::group::Create pyproject.toml" | |
mkdir -p build/src/api/python | |
if [ "${{ matrix.gpl }}" == "true" ]; then | |
sed -e 's/^name="cvc5"$/name="cvc5-gpl"/' \ | |
-e 's/^\(description=".*\)"/\1 (GPL version)"/' \ | |
-e 's/^\(readme = {text = ".*\)\(", content-type = "text\/plain"\)/\1 (GPL version)\2/' \ | |
-e 's/^license = {text = "/license = {text = "GPL-2.0-or-later AND GPL-3.0-or-later AND /' \ | |
./src/api/python/pyproject.toml > ./build/src/api/python/pyproject.toml | |
else | |
sed -e 's/^\(description=".*\)"/\1 (BSD version)"/' \ | |
-e 's/^\(readme = {text = ".*\)\(", content-type = "text\/plain"\)/\1 (BSD version)\2/' \ | |
./src/api/python/pyproject.toml > ./build/src/api/python/pyproject.toml | |
fi | |
echo "::endgroup::" | |
- name: Store MinGW64 path | |
if: runner.os == 'Windows' | |
id: mingw64-path | |
shell: msys2 {0} | |
run: echo "bin=$(cygpath -m $(dirname $(which gcc)))" >> $GITHUB_OUTPUT | |
- name: Build wheels | |
uses: pypa/cibuildwheel@v2.22.0 | |
with: | |
package-dir: ./build/src/api/python/ | |
env: | |
CIBW_ALLOW_EMPTY: True | |
CIBW_BUILD: "${{ github.event.inputs.python_versions || '*' }}" | |
CIBW_SKIP: "cp36-* pp*-win* *-win32 *-manylinux_i686 *-musllinux_*" | |
CIBW_ARCHS_LINUX: "${{ matrix.arch }}" | |
CIBW_BEFORE_ALL_LINUX: bash ./contrib/cibw/before_all_linux.sh ${{ matrix.gpl }} | |
CIBW_BEFORE_ALL_MACOS: bash ./contrib/cibw/before_all_macos.sh ${{ matrix.gpl }} | |
CIBW_BEFORE_ALL_WINDOWS: msys2 -c "./contrib/cibw/before_all_windows.sh ${{ matrix.gpl }}" | |
# Use delvewheel on windows | |
CIBW_BEFORE_BUILD_WINDOWS: "pip install delvewheel" | |
CIBW_REPAIR_WHEEL_COMMAND_WINDOWS: > | |
delvewheel repair -w {dest_dir} {wheel} --add-path "${{ github.workspace }}\install\bin;${{ steps.mingw64-path.outputs.bin }}" | |
CIBW_ENVIRONMENT_LINUX: > | |
LD_LIBRARY_PATH="$(pwd)/install/lib64:$LD_LIBRARY_PATH" | |
CIBW_ENVIRONMENT_MACOS: > | |
DYLD_LIBRARY_PATH="$(pwd)/install/lib:$DYLD_LIBRARY_PATH" | |
MACOSX_DEPLOYMENT_TARGET=${{ matrix.macos-target }} | |
CIBW_TEST_COMMAND: python {project}/examples/api/python/quickstart.py | |
# - uses: actions/upload-artifact@v4 | |
# with: | |
# name: wheels-${{ matrix.name }} | |
# path: ./wheelhouse/*.whl | |
- name: Install software for publishing the wheels | |
run: | | |
python3 -m pip install -U packaging # See https://github.com/pypa/twine/issues/1216 | |
python3 -m pip install twine | |
- name: Check wheels with twine | |
run: | | |
echo "::group::Check wheels with twine" | |
for wheel in `ls ./wheelhouse/*.whl` | |
do | |
twine check $wheel | |
done | |
echo "::endgroup::" | |
- name: Upload wheels to pypi.org | |
if: > | |
github.event_name == 'release' || | |
(github.event_name == 'workflow_dispatch' && | |
github.event.inputs.deploy_target == 'PyPI' && | |
startsWith(github.event.inputs.release_tag, 'cvc5-')) | |
env: | |
TWINE_USERNAME: __token__ | |
TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }} | |
run: | | |
echo "::group::Upload to pypi.org" | |
for wheel in `ls ./wheelhouse/*.whl` | |
do | |
# --skip-existing is only valid when uploading to PyPI | |
twine upload --skip-existing $wheel | |
done | |
echo "::endgroup::" | |
- name: Upload wheels to test.pypi.org | |
if: > | |
github.event_name == 'workflow_dispatch' && | |
github.event.inputs.deploy_target == 'Test PyPI' | |
env: | |
TWINE_USERNAME: __token__ | |
TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }} | |
run: | | |
echo "::group::Upload to test.pypi.org" | |
for wheel in `ls ./wheelhouse/*.whl` | |
do | |
twine upload --repository testpypi $wheel | |
done | |
echo "::endgroup::" |