Build wheels #197
Workflow file for this run
This file contains hidden or 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: Build wheels | |
| # By default this action does not push to test or production PyPI. The wheels | |
| # are available as an artifact that can be downloaded and tested locally. | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| dolfinx_ref: | |
| description: "dolfinx git ref to checkout" | |
| default: "main" | |
| type: string | |
| build_fenicsx_stack: | |
| description: "Build wheels for whole FEniCSx stack" | |
| default: false | |
| type: boolean | |
| basix_ref: | |
| description: "basix git ref to checkout" | |
| default: "main" | |
| type: string | |
| ufl_ref: | |
| description: "ufl git ref to checkout" | |
| default: "main" | |
| type: string | |
| ffcx_ref: | |
| description: "ffcx git ref to checkout" | |
| default: "main" | |
| type: string | |
| workflow_call: | |
| inputs: | |
| dolfinx_ref: | |
| description: "dolfinx git ref to checkout" | |
| default: "main" | |
| type: string | |
| build_fenicsx_stack: | |
| description: "Build wheels for entire FEniCSx stack" | |
| default: false | |
| type: boolean | |
| basix_ref: | |
| description: "basix git ref to checkout" | |
| default: "main" | |
| type: string | |
| ufl_ref: | |
| description: "ufl git ref to checkout" | |
| default: "main" | |
| type: string | |
| ffcx_ref: | |
| description: "ffcx git ref to checkout" | |
| default: "main" | |
| type: string | |
| jobs: | |
| build_wheels: | |
| name: Build wheels | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| matrix: | |
| include: | |
| - os: ubuntu-latest | |
| cibw_build: cp312-manylinux_x86_64 | |
| - os: ubuntu-24.04-arm | |
| cibw_build: cp312-manylinux_aarch64 | |
| - os: macos-26 | |
| cibw_build: cp312-macosx_arm64 | |
| env: | |
| CIBW_BUILD: ${{ matrix.cibw_build }} | |
| CIBW_BUILD_VERBOSITY: 1 | |
| CIBW_ARCHS_LINUX: native | |
| CIBW_ARCHS_MACOS: arm64 | |
| CIBW_MANYLINUX_X86_64_IMAGE: quay.io/pypa/manylinux_2_34_x86_64:latest | |
| CIBW_MANYLINUX_AARCH64_IMAGE: quay.io/pypa/manylinux_2_34_aarch64:latest | |
| steps: | |
| - uses: actions/setup-python@v6 | |
| with: | |
| python-version: 3.14 | |
| - name: Install Python dependencies | |
| run: python -m pip install cibuildwheel simple503 build | |
| - name: Checkout UFL | |
| if: ${{ github.event.inputs.build_fenicsx_stack == 'true' }} | |
| uses: actions/checkout@v6 | |
| with: | |
| repository: FEniCS/ufl | |
| path: ufl | |
| ref: ${{ github.event.inputs.ufl_ref }} | |
| - name: Build UFL wheel | |
| if: ${{ github.event.inputs.build_fenicsx_stack == 'true' }} | |
| run: | | |
| python -m build -o wheelhouse/ ufl/ | |
| - name: Checkout FFCx | |
| if: ${{ github.event.inputs.build_fenicsx_stack == 'true' }} | |
| uses: actions/checkout@v6 | |
| with: | |
| repository: FEniCS/ffcx | |
| path: ffcx | |
| ref: ${{ github.event.inputs.ffcx_ref }} | |
| - name: Build FFCx wheel | |
| if: ${{ github.event.inputs.build_fenicsx_stack == 'true' }} | |
| run: | | |
| python -m build -o wheelhouse/ ffcx/ | |
| - name: Checkout Basix | |
| if: ${{ github.event.inputs.build_fenicsx_stack == 'true' }} | |
| uses: actions/checkout@v6 | |
| with: | |
| repository: FEniCS/basix | |
| path: basix | |
| ref: ${{ github.event.inputs.basix_ref }} | |
| - name: Build Basix wheel | |
| if: ${{ github.event.inputs.build_fenicsx_stack == 'true' }} | |
| working-directory: basix/ | |
| run: | | |
| python -m cibuildwheel --output-dir ../wheelhouse/ . | |
| - name: Make temporary simple503 repo directories | |
| run: mkdir -p wheelhouse/ simple/ | |
| - name: Add wheels to simple503 repository (if built) | |
| if: ${{ github.event.inputs.build_fenicsx_stack == 'true' }} | |
| run: cp wheelhouse/* simple/ | |
| - name: Index simple503 repository (Linux) | |
| if: runner.os == 'Linux' | |
| run: python -m simple503 --base-url file:///project/simple simple/ | |
| - name: Index simple503 repository (macOS) | |
| if: runner.os == 'macOS' | |
| run: python -m simple503 --base-url "file://${GITHUB_WORKSPACE}/simple" simple/ | |
| - name: Checkout DOLFINx | |
| uses: actions/checkout@v6 | |
| with: | |
| path: dolfinx | |
| ref: ${{ github.event.inputs.dolfinx_ref }} | |
| # fenics-ffcx and fenics-basix are required by DOLFINx C++ build | |
| # mpi4py and petsc4py are build_requirements of DOLFINx Python | |
| - name: Build DOLFINx wheel | |
| run: | | |
| python -m cibuildwheel --output-dir wheelhouse/ dolfinx/python | |
| env: | |
| CIBW_ENVIRONMENT_LINUX: PIP_EXTRA_INDEX_URL=file:///project/simple | |
| CIBW_ENVIRONMENT_MACOS: > | |
| PIP_EXTRA_INDEX_URL=file://$GITHUB_WORKSPACE/simple | |
| MACOSX_DEPLOYMENT_TARGET=26.0 | |
| MPI_HOME=$(brew --prefix open-mpi) | |
| HDF5_ROOT=$(brew --prefix hdf5-mpi) | |
| CMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/dolfinx-install:$(brew --prefix) | |
| CIBW_BEFORE_BUILD_LINUX: > | |
| dnf -y update && | |
| dnf install -y dnf-plugins-core && | |
| dnf install -y epel-release && | |
| /usr/bin/crb enable && | |
| dnf -y update && | |
| dnf -y install boost-devel boost-program-options git hdf5-mpich-devel make \ | |
| mpich-devel ninja-build openblas-devel pugixml-devel spdlog-devel && | |
| ln -s /usr/include/mpich-$(arch) /usr/lib64/mpich/include && | |
| git clone --branch v7.0.9 --single-branch https://gitlab.inria.fr/scotch/scotch.git && | |
| cmake -G Ninja -S scotch/ -B scotch-build-dir/ -DCMAKE_INSTALL_PREFIX=/usr/local \ | |
| -DBUILD_SHARED_LIBS=ON -DMPI_HOME=/usr/lib64/mpich && | |
| cmake --build scotch-build-dir/ && | |
| cmake --install scotch-build-dir/ && | |
| pip -v install fenics-basix fenics-ffcx && | |
| pip -v install mpi4py scikit-build-core[pyproject] nanobind && | |
| cmake -G Ninja -S dolfinx/cpp -B dolfinx-build-dir/ -DPython3_EXECUTABLE=$(which python) \ | |
| -DHDF5_ROOT=/usr/lib64/mpich -DMPI_HOME=/usr/lib64/mpich -DCMAKE_BUILD_TYPE=RelWithDebug && | |
| cmake --build dolfinx-build-dir/ && | |
| cmake --install dolfinx-build-dir/ | |
| CIBW_BEFORE_BUILD_MACOS: > | |
| brew install boost hdf5-mpi ninja open-mpi pkgconf pugixml spdlog scotch && | |
| pip -v install fenics-basix fenics-ffcx && | |
| pip -v install mpi4py scikit-build-core[pyproject] nanobind && | |
| cmake -G Ninja -S $GITHUB_WORKSPACE/dolfinx/cpp -B $GITHUB_WORKSPACE/dolfinx-build-dir/ \ | |
| -DPython3_EXECUTABLE=$(which python) \ | |
| -DCMAKE_PREFIX_PATH=$CMAKE_PREFIX_PATH \ | |
| -DDOLFINX_ENABLE_SCOTCH=ON \ | |
| -DCMAKE_BUILD_TYPE=RelWithDebug && | |
| cmake --build $GITHUB_WORKSPACE/dolfinx-build-dir/ && | |
| cmake --install $GITHUB_WORKSPACE/dolfinx-build-dir/ --prefix $GITHUB_WORKSPACE/dolfinx-install | |
| CIBW_CONFIG_SETTINGS_LINUX: > | |
| cmake.args="-DMPI_HOME=/usr/lib64/mpich;-DHDF5_ROOT=/usr/lib64/mpich" | |
| wheel.py-api=cp312 | |
| cmake.build-type="RelWithDebug" | |
| CIBW_CONFIG_SETTINGS_MACOS: > | |
| cmake.args="-DCMAKE_PREFIX_PATH=$CMAKE_PREFIX_PATH" | |
| wheel.py-api=cp312 | |
| cmake.build-type="RelWithDebug" | |
| CIBW_BUILD_FRONTEND: "build; args: -nx" | |
| CIBW_REPAIR_WHEEL_COMMAND_LINUX: > | |
| export LD_LIBRARY_PATH=$(python -c "import site; print(site.getsitepackages()[0] + '/fenics_basix.libs')"):${LD_LIBRARY_PATH} && | |
| auditwheel repair --exclude libmpi.so* -w {dest_dir} {wheel} && | |
| pipx run abi3audit --verbose --strict --report {wheel} | |
| CIBW_REPAIR_WHEEL_COMMAND_MACOS: > | |
| delocate-wheel --require-archs {delocate_archs} -w {dest_dir} {wheel} --exclude libmpi && | |
| pipx run abi3audit --verbose --strict --report {wheel} | |
| CIBW_TEST_REQUIRES: pytest-xdist | |
| CIBW_TEST_EXTRAS: test | |
| CIBW_TEST_COMMAND_LINUX: > | |
| . /etc/profile && | |
| module load mpi/mpich-$(arch) && | |
| python -m pytest -n auto \ | |
| -m "not adios2 and not petsc4py" {project}/dolfinx/python/test/unit && | |
| mpiexec -n 2 python -m pytest \ | |
| -m "not adios2 and not petsc4py" {project}/dolfinx/python/test/unit | |
| CIBW_TEST_COMMAND_MACOS: > | |
| python -m pytest -n auto | |
| -m "not adios2 and not petsc4py" {project}/test/unit && | |
| mpiexec -n 2 python -m pytest | |
| -m "not adios2 and not petsc4py" {project}/test/unit | |
| - name: Update temporary simple503 repository (Linux) | |
| if: runner.os == 'Linux' | |
| run: | | |
| cp wheelhouse/* simple | |
| python -m simple503 --base-url file:///shared simple | |
| - name: Update temporary simple503 repository (macOS) | |
| if: runner.os == 'macOS' | |
| run: | | |
| cp wheelhouse/* simple | |
| python -m simple503 --base-url "file://${GITHUB_WORKSPACE}/simple" simple | |
| - name: Upload simple503-test artifact | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| name: simple503-test-${{ matrix.os }} | |
| path: simple/* | |
| - name: Test in clean python image with pypi MPICH | |
| if: runner.os == 'Linux' | |
| run: > | |
| cd dolfinx && | |
| sudo git clean -fdx && cd ../ && | |
| docker run -v $(pwd)/dolfinx:/dolfinx -v $(pwd)/simple:/shared \ | |
| --env PIP_EXTRA_INDEX_URL=file:///shared python:3.13 \ | |
| /bin/bash -l -c "pip install mpich fenics-dolfinx[test] && mpiexec -n 2 python -m pytest -m 'not adios2 and not petsc4py' /dolfinx/python/test/unit" | |
| - name: Test in clean python image with pypi Intel MPI (x86_64 only) | |
| if: runner.os == 'Linux' && runner.arch == 'X64' | |
| run: > | |
| cd dolfinx && | |
| sudo git clean -fdx && cd ../ && | |
| docker run -v $(pwd)/dolfinx:/dolfinx -v $(pwd)/simple:/shared \ | |
| --env PIP_EXTRA_INDEX_URL=file:///shared python:3.14 \ | |
| /bin/bash -l -c "pip install impi-rt fenics-dolfinx[test] && mpiexec -n 2 python -m pytest -m 'not adios2 and not petsc4py' /dolfinx/python/test/unit" | |
| - name: Test in clean virtual environment with pypi OpenMPI (macOS) | |
| if: runner.os == 'macOS' | |
| run: | | |
| python -m venv venv-test | |
| source venv-test/bin/activate | |
| PIP_EXTRA_INDEX_URL="file://${GITHUB_WORKSPACE}/simple" pip install openmpi fenics-dolfinx[test] | |
| export PATH=$(python -c "import os; print(':'.join(p for p in os.environ['PATH'].split(':') if '/opt/homebrew' not in p))") | |
| python -m pytest -n auto -m "not adios2 and not petsc4py" dolfinx/python/test/unit | |
| mpiexec -n 2 python -m pytest -m "not adios2 and not petsc4py" dolfinx/python/test/unit | |
| - name: Upload wheelhouse artifact | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| name: wheelhouse-${{ matrix.os }} | |
| path: wheelhouse/* | |
| - name: Update FEniCS Project simple503 repository | |
| run: | | |
| python -m simple503 --base-url http://packages.fenicsproject.org/simple simple | |
| - name: Upload simple503 artifact | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| name: simple503-${{ matrix.os }} | |
| path: simple/* |