From 9b7a303e0a726606b41039a66c4da1886379c42d Mon Sep 17 00:00:00 2001 From: mevrin Date: Mon, 16 Sep 2024 23:06:24 -0400 Subject: [PATCH] ci: Add python wheel workflow Signed-off-by: mevrin --- .github/workflows/python-wheels.yml | 74 +++++++++++++++++++++++++ pyproject.toml | 84 +++++++++++++++++++++++++++++ 2 files changed, 158 insertions(+) create mode 100644 .github/workflows/python-wheels.yml create mode 100644 pyproject.toml diff --git a/.github/workflows/python-wheels.yml b/.github/workflows/python-wheels.yml new file mode 100644 index 00000000..9f9e4cfe --- /dev/null +++ b/.github/workflows/python-wheels.yml @@ -0,0 +1,74 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) Contributors to the OpenEXR Project. + +name: Python Wheels + +on: + + # Run on all changes (PR and push) to the python binding + # source/configuration files, except on the release branches, which + # have their own workflow, which also publish to pypi/test.pypi. + # Note that changes to the core libraries will *not* + # trigger building the wheels. However, the main ci workflow does + # build and test the bindings (for a single python version on a + # single arch) + + push: + branches-ignore: + - RB-* + paths: + - 'src/**' + - '.github/workflows/python-wheels.yml' + pull_request: + branches-ignore: + - RB-* + paths: + - 'src/**' + - 'pyproject.toml' + - '.github/workflows/python-wheels.yml' + +permissions: + contents: read + +jobs: + build_wheels: + name: Python Wheels - ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + + steps: + + - name: Checkout + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: Install Python + uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 # v5.2.0 + with: + python-version: '3.x' + + - name: Create sdist + # Only create it once. + if: ${{ matrix.os == 'ubuntu-latest' }} + run: pipx run build --sdist . --outdir wheelhouse + + - name: Build wheel + uses: pypa/cibuildwheel@79b0dd328794e1180a7268444d46cdf12e1abd01 # v2.21.0 + env: + CIBW_ARCHS_MACOS: x86_64 arm64 universal2 + # Build Python 3.7 through 3.11. + # Skip python 3.6 since scikit-build-core requires 3.7+ + # Skip 32-bit wheels builds on Windows + # Also skip the PyPy builds, since they fail the unit tests + CIBW_BUILD: "cp37-* cp38-* cp39-* cp310-* cp311-*" + CIBW_SKIP: "*-win32 *_i686" + CIBW_TEST_SKIP: "*-macosx*arm64" + + - name: Upload artifact + uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0 + with: + name: wheels-${{ matrix.os }} + path: | + ./wheelhouse/*.whl + ./wheelhouse/*.tar.gz diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..48ad45d3 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,84 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) Contributors to the OpenEXR Project. + +[build-system] +requires = ["scikit-build-core==0.8.1", "pybind11"] +build-backend = "scikit_build_core.build" + +[project] +name = "Imath" +dynamic = ["version"] + +description="Python bindings for the Imath a basic, light-weight, and efficient C++ representation of 2D and 3D vectors and matrices and other simple but useful mathematical objects, functions, and data types common in computer graphics applications, including the “half” 16-bit floating-point type." +readme = "README.md" +authors = [ + { name="Contributors to the OpenEXR project", email="info@openexr.com" }, +] +requires-python = ">=3.7" + +[project.urls] +"Homepage" = "https://imath.readthedocs.io/" +"Source" = "https://github.com/AcademySoftwareFoundation/Imath" +"Bug Tracker" = "https://github.com/AcademySoftwareFoundation/Imath/issues" + +[project.optional-dependencies] +test = ["pytest"] + +[tool.pytest.ini_options] +minversion = "6.0" +addopts = ["-ra", "--showlocals", "--strict-markers", "--strict-config"] +xfail_strict = true +log_cli_level = "INFO" +filterwarnings = [ + "error", +] +testpaths = ["tests"] + +[tool.scikit-build] +wheel.expand-macos-universal-tags = true +sdist.exclude = [".github", "src/**Test", "website", "share"] + +# Only build the PyOpenEXR (cmake --build --target PyOpenEXR). +cmake.targets = ["Imath"] +# Only install the "python" component (cmake --install --component python). +# This makes sure that only files marked as "python" component are installed. +install.components = ["python"] +# strip debug symbols +install.strip = true + +# Enable experimental features if any are available +# In this case we need custom local plugin to get +# the project version from cmake. +experimental = true +metadata.version.provider = "IMATH_skbuild_plugin" +metadata.version.provider-path = "./src/python" + + +[tool.scikit-build.cmake.define] +IMATH_INSTALL = 'OFF' +IMATH_BUILD_PYTHON = 'ON' +IMATH_BUILD_EXAMPLES = 'OFF' +IMATH_BUILD_TOOLS = 'OFF' +IMATH_INSTALL_TOOLS = 'OFF' +IMATH_INSTALL_PKG_CONFIG = 'OFF' +IMATH_FORCE_INTERNAL_DEFLATE = 'ON' +IMATH_FORCE_INTERNAL_IMATH = 'ON' +IMATH_TEST_LIBRARIES = 'OFF' +BUILD_SHARED_LIBS = 'OFF' +CMAKE_OSX_DEPLOYMENT_TARGET = '10.15' +CMAKE_POSITION_INDEPENDENT_CODE = 'ON' + +[tool.cibuildwheel] +test-command = "pytest -s {project}/src/python/tests" +test-requires = ["numpy"] +test-extras = ["test"] +test-skip = ["*universal2:arm64"] +build-verbosity = 1 + +manylinux-x86_64-image = "manylinux2014" +manylinux-i686-image = "manylinux2014" +manylinux-aarch64-image = "manylinux2014" + +# Needed for full C++17 support +[tool.cibuildwheel.macos.environment] +MACOSX_DEPLOYMENT_TARGET = "10.15"