--- a +++ b/.github/workflows/wheels.yml @@ -0,0 +1,241 @@ +name: build_wheels + +on: + schedule: # Run weekly on Friday + - cron: '0 5 * * 5' + release: + types: [created] + workflow_dispatch: + +jobs: + build_wheels: + name: Build wheel for cp${{ matrix.cibw_python }}-${{ matrix.platform_id }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + # Have to specify python version twice so that the same python is used to build and test + # Need to quote decimal versions as string to avoid the "Norway problem" + + # Windows 64-bit + - os: windows-latest + python: '3.9' + cibw_python: 39 + platform_id: win_amd64 + - os: windows-latest + python: '3.10' + cibw_python: 310 + platform_id: win_amd64 + - os: windows-latest + python: '3.11' + cibw_python: 311 + platform_id: win_amd64 + - os: windows-latest + python: '3.12' + cibw_python: 312 + platform_id: win_amd64 + - os: windows-latest + python: '3.13' + cibw_python: 313 + platform_id: win_amd64 + + # Linux 64-bit + - os: ubuntu-latest + python: '3.8' + cibw_python: 38 + platform_id: manylinux_x86_64 + - os: ubuntu-latest + python: '3.9' + cibw_python: 39 + platform_id: manylinux_x86_64 + - os: ubuntu-latest + python: '3.10' + cibw_python: 310 + platform_id: manylinux_x86_64 + - os: ubuntu-latest + python: '3.11' + cibw_python: 311 + platform_id: manylinux_x86_64 + - os: ubuntu-latest + python: '3.12' + cibw_python: 312 + platform_id: manylinux_x86_64 + - os: ubuntu-latest + python: '3.13' + cibw_python: 313 + platform_id: manylinux_x86_64 + + # macOS on Intel 64-bit + - os: macos-13 + python: '3.9' + cibw_python: 39 + arch: x86_64 + platform_id: macosx_x86_64 + - os: macos-13 + python: '3.10' + cibw_python: 310 + arch: x86_64 + platform_id: macosx_x86_64 + - os: macos-13 + python: '3.11' + cibw_python: 311 + arch: x86_64 + platform_id: macosx_x86_64 + - os: macos-13 + python: '3.12' + cibw_python: 312 + arch: x86_64 + platform_id: macosx_x86_64 + - os: macos-13 + python: '3.13' + cibw_python: 313 + arch: x86_64 + platform_id: macosx_x86_64 + + + # macOS on Apple M1 64-bit, supported for Python 3.10 and later + - os: macos-14 + python: '3.10' + cibw_python: 310 + arch: arm64 + platform_id: macosx_arm64 + - os: macos-14 + python: '3.11' + cibw_python: 311 + arch: arm64 + platform_id: macosx_arm64 + - os: macos-14 + python: '3.12' + cibw_python: 312 + arch: arm64 + platform_id: macosx_arm64 + - os: macos-14 + python: '3.13' + cibw_python: 313 + arch: arm64 + platform_id: macosx_arm64 + + steps: + - uses: actions/checkout@v4 + with: + submodules: true + + - uses: actions/setup-python@v5 + name: Install Python host for cibuildwheel + with: + python-version: ${{ matrix.python }} + + # Visual Studio + - name: Set up MSVC x64 + if: matrix.platform_id == 'win_amd64' + uses: ilammy/msvc-dev-cmd@v1 + + - name: Install cibuildwheel + run: python -m pip install cibuildwheel==2.19.2 setuptools toml + + - name: Get package name and version (Linux / Mac) + if: ${{ ! startsWith(matrix.os, 'windows-') }} + run: | + echo "PACKAGE_NAME=$( python -c "import toml; print(toml.load('pyproject.toml')['project']['name'])" )" >> $GITHUB_ENV + echo "PACKAGE_VERSION=$( python -c "import toml; print(toml.load('pyproject.toml')['project']['version'])" )" >> $GITHUB_ENV + + # Some shells require "-Encoding utf8" to append to GITHUB_ENV + # https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions?tool=powershell#environment-files + - name: Get package name and version (Windows) + if: startsWith(matrix.os, 'windows-') + run: | + echo "PACKAGE_NAME=$( python -c "import toml; print(toml.load('pyproject.toml')['project']['name'])" )" | Out-File -FilePath $env:GITHUB_ENV ` -Append + echo "PACKAGE_VERSION=$( python -c "import toml; print(toml.load('pyproject.toml')['project']['version'])" )" | Out-File -FilePath $env:GITHUB_ENV ` -Append + + - name: Determine macOS version + if: startsWith(matrix.os, 'macos-') + run: | + macos_version=$(sw_vers -productVersion | awk -F '.' '{print $1".0"}') + echo "MACOSX_DEPLOYMENT_TARGET=${macos_version}" >> $GITHUB_ENV + + - name: Build wheels + env: + CIBW_MANYLINUX_X86_64_IMAGE: manylinux2014 + CIBW_MANYLINUX_I686_IMAGE: manylinux2014 + CIBW_BUILD: cp${{ matrix.cibw_python }}-${{ matrix.platform_id }} + CIBW_TEST_SKIP: "cp*" # We will test during install and test step + + # Include latest Python beta + CIBW_PRERELEASE_PYTHONS: True + + CIBW_BEFORE_ALL_LINUX: | + echo "Installing system dependencies with yum" + yum install -y gcc-c++ libpng-devel libpng + echo "pip installing cmake and ninja" + python -m pip install cmake ninja setuptools + + CIBW_BEFORE_ALL_WINDOWS: | + python -m pip install cmake ninja setuptools + + CIBW_ARCHS_MACOS: ${{ matrix.arch }} + + CIBW_ENVIRONMENT_MACOS: | + CMAKE_OSX_ARCHITECTURES=${{ matrix.arch }} CMAKE_PREFIX_PATH=/usr/local + + CIBW_BEFORE_ALL_MACOS: | + python -m pip install cmake ninja setuptools + brew update + if ! brew list libpng &>/dev/null; then + HOMEBREW_NO_AUTO_UPDATE=1 brew install libpng + fi + + run: python -m cibuildwheel --output-dir wheelhouse/cp${{ matrix.cibw_python }}-${{matrix.platform_id }} + + - name: Install and test (Linux / Mac) + if: ${{ ! startsWith(matrix.os, 'windows-') }} + run: | + python -m pip install wheelhouse/cp${{ matrix.cibw_python }}-${{matrix.platform_id }}/*.whl + tests/run_tests.sh + + - name: Install and test (Windows) + if: startsWith(matrix.os, 'windows-') + shell: cmd # Use cmd on Windows to avoid bash environment taking priority over MSVC variables + run: | + python -m pip install --find-links=./wheelhouse/cp${{ matrix.cibw_python }}-${{ matrix.platform_id }} antspyx + bash tests/run_tests.sh + + - uses: actions/upload-artifact@v4 + with: + name: ${{ env.PACKAGE_NAME }}-${{ env.PACKAGE_VERSION }}-cp${{ matrix.cibw_python }}-${{ matrix.platform_id }} + path: ./wheelhouse/cp${{ matrix.cibw_python }}-${{ matrix.platform_id }}/*.whl + + - name: Upload release asset + # Previously was using actions/upload-release-asset@v1 , but this had some + # errors with large files + uses: ncipollo/release-action@v1.11.1 + if: ${{ github.event_name == 'release' }} + with: + allowUpdates: true + omitBodyDuringUpdate: true + omitNameDuringUpdate: true + artifacts: ./wheelhouse/cp${{ matrix.cibw_python }}-${{ matrix.platform_id }}/*.whl + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Publish prep + if: ${{ (github.event_name == 'release') }} + run: | + mywhl=`find ~/ -name "antspyx*.whl"` + extrawheeldir=`dirname $mywhl` + wheeldirx=`dirname $extrawheeldir` + wheeldir=`dirname $wheeldirx` + wheeldir=${wheeldir}/dist + mkdir -p $wheeldir + echo $wheeldir + mv $mywhl $wheeldir + rm -r -f $extrawheeldir $wheeldirx + + - name: Publish package + uses: pypa/gh-action-pypi-publish@27b31702a0e7fc50959f5ad993c78deac1bdfc29 + if: ${{ (github.event_name == 'release') && (runner.os == 'Linux') }} + with: + user: __token__ + password: ${{ secrets.PYPI_API_TOKEN }} + verify_metadata: false + skip_existing: true + verbose: true