cd-wheel #183
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: cd-wheel | |
permissions: | |
contents: read | |
on: # yamllint disable-line rule:truthy | |
workflow_call: | |
inputs: | |
repository: | |
description: 'mpi4py repository' | |
default: mpi4py/mpi4py | |
required: false | |
type: string | |
ref: | |
description: 'mpi4py ref' | |
default: '' | |
required: false | |
type: string | |
os-arch: | |
description: 'Target OS-Architecture' | |
default: '' | |
required: false | |
type: string | |
python-tag: | |
description: "CPython/PyPy tag ({cp,pp}3{7..13})" | |
default: '' | |
required: false | |
type: string | |
skip-tag: | |
description: "Skip build tags" | |
default: '' | |
required: false | |
type: string | |
workflow_dispatch: | |
inputs: | |
repository: | |
description: 'mpi4py repository' | |
default: mpi4py/mpi4py | |
required: true | |
type: string | |
ref: | |
description: 'mpi4py ref' | |
default: '' | |
required: false | |
type: string | |
os-arch: | |
description: "Target OS-Architecture" | |
default: Linux-x86_64 | |
required: true | |
type: choice | |
options: | |
- Linux | |
- Linux-x86_64 | |
- Linux-aarch64 | |
- Linux-ppc64le | |
- macOS | |
- macOS-x86_64 | |
- macOS-arm64 | |
- Windows | |
- Windows-AMD64 | |
python-tag: | |
description: "CPython/PyPy tag ({cp,pp}3{7..13})" | |
default: '' | |
required: false | |
type: string | |
skip-tag: | |
description: "Skip build tags" | |
default: '' | |
required: false | |
type: string | |
jobs: | |
setup: | |
runs-on: 'ubuntu-latest' | |
outputs: | |
matrix-build: ${{ steps.setup.outputs.matrix-build }} | |
matrix-merge: ${{ steps.setup.outputs.matrix-merge }} | |
os-arch-list: ${{ steps.setup.outputs.os-arch-list }} | |
steps: | |
- uses: actions/checkout@v4 | |
- id: setup | |
run: | | |
# build matrix | |
python -u .cibw/setup-build.py \ | |
--os ${{ inputs.os-arch }} \ | |
--py ${{ inputs.python-tag }} \ | |
>> "$GITHUB_OUTPUT" | |
build: | |
if: ${{ needs.setup.outputs.matrix-build != '[]' }} | |
needs: setup | |
runs-on: ${{ matrix.runner }} | |
strategy: | |
fail-fast: false | |
matrix: | |
include: ${{ fromJSON(needs.setup.outputs.matrix-build) }} | |
steps: | |
- id: checkout | |
uses: actions/checkout@v4 | |
- id: checkout-project | |
uses: actions/checkout@v4 | |
with: | |
repository: ${{ inputs.repository || 'mpi4py/mpi4py' }} | |
ref: ${{ inputs.ref }} | |
path: mpi4py.git | |
- id: setup-python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: 3 | |
- id: setup-cython | |
run: python -m pip install -r ./conf/requirements-build-cython.txt | |
working-directory: mpi4py.git | |
- id: setup-project | |
run: python ./conf/cythonize.py | |
working-directory: mpi4py.git | |
- id: source-date-epoch | |
run: | | |
SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct) | |
echo SOURCE_DATE_EPOCH=$SOURCE_DATE_EPOCH >> $GITHUB_ENV | |
echo $(git log -1 --pretty=%ci) [timestamp=$SOURCE_DATE_EPOCH] | |
shell: bash | |
working-directory: mpi4py.git | |
- id: setup-qemu | |
if: ${{ runner.os == 'Linux' }} | |
uses: docker/setup-qemu-action@v3 | |
with: | |
platforms: all | |
- id: setup-uv | |
if: ${{ runner.os != 'Linux' }} | |
run: ${{ runner.os == 'macOS' && 'brew' || 'choco' }} install uv | |
- id: build | |
uses: pypa/[email protected] | |
timeout-minutes: 45 | |
with: | |
package-dir: mpi4py.git | |
output-dir: wheelhouse | |
env: | |
MPI4PY_LOCAL_VERSION: "${{ matrix.mpi-abi }}" | |
CIBW_PROJECT_REQUIRES_PYTHON: ">=3.6" | |
CIBW_BUILD_FRONTEND: "build[uv]" | |
CIBW_BUILD: "${{ matrix.py || '*' }}-*" | |
CIBW_SKIP: "${{ inputs.skip-tag }} *musllinux*" | |
CIBW_ARCHS: "${{ matrix.arch }}" | |
CIBW_BEFORE_ALL: >- | |
bash {project}/.cibw/install-mpi.sh | |
"${{ matrix.mpi-abi }}" "${{ matrix.arch }}" | |
CIBW_BEFORE_BUILD: >- | |
bash {project}/.cibw/patch-tools.sh | |
CIBW_TEST_COMMAND: >- | |
bash {project}/.cibw/run-tests.sh | |
CIBW_TEST_SKIP: "*-macosx_arm64" | |
CIBW_ENVIRONMENT_PASS_LINUX: >- | |
MPI4PY_LOCAL_VERSION | |
MPI4PY_DIST_SUFFIX | |
SOURCE_DATE_EPOCH | |
CIBW_ENVIRONMENT_LINUX: >- | |
CFLAGS="-g0 -O" | |
CIBW_ENVIRONMENT_MACOS: >- | |
CFLAGS="-g0 -O" | |
LDFLAGS="-Wl,-headerpad_max_install_names" | |
LDFLAGS="$LDFLAGS -Wl,-rpath,/usr/local/lib" | |
LDFLAGS="$LDFLAGS -Wl,-rpath,/opt/homebrew/lib" | |
LDFLAGS="$LDFLAGS -Wl,-rpath,/opt/local/lib" | |
CIBW_ENVIRONMENT_WINDOWS: >- | |
I_MPI_ROOT="$USERPROFILE\\mpi\\Library" | |
MSMPI_ROOT="$USERPROFILE\\mpi\\Library" | |
MSMPI_BIN="$MSMPI_ROOT\\bin" | |
MSMPI_INC="$MSMPI_ROOT\\include" | |
MSMPI_LIB64="$MSMPI_ROOT\\lib" | |
CIBW_BEFORE_BUILD_WINDOWS: | |
- id: upload | |
uses: actions/upload-artifact@v4 | |
with: | |
name: build-${{matrix.os}}-${{matrix.arch}}-${{strategy.job-index}} | |
path: wheelhouse/*.whl | |
retention-days: 1 | |
- id: check | |
run: .cibw/check-wheels.sh wheelhouse | |
shell: bash | |
merge: | |
if: ${{ needs.setup.outputs.matrix-merge != '[]' }} | |
needs: [setup, build] | |
runs-on: ${{ matrix.runner }} | |
strategy: | |
fail-fast: false | |
matrix: | |
include: ${{ fromJSON(needs.setup.outputs.matrix-merge) }} | |
steps: | |
- id: checkout | |
uses: actions/checkout@v4 | |
- id: checkout-project | |
uses: actions/checkout@v4 | |
with: | |
repository: ${{ inputs.repository || 'mpi4py/mpi4py' }} | |
ref: ${{ inputs.ref }} | |
path: mpi4py.git | |
- id: source-date-epoch | |
run: | | |
SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct) | |
echo SOURCE_DATE_EPOCH=$SOURCE_DATE_EPOCH >> $GITHUB_ENV | |
echo $(git log -1 --pretty=%ci) [timestamp=$SOURCE_DATE_EPOCH] | |
shell: bash | |
working-directory: mpi4py.git | |
- id: setup-python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: 3 | |
- id: install | |
run: python -m pip install -U wheel | |
- id: download | |
uses: actions/download-artifact@v4 | |
with: | |
path: wheelhouse | |
pattern: build-${{ runner.os }}-${{ matrix.arch }}-* | |
merge-multiple: true | |
- id: merge | |
run: python .cibw/merge-wheels.py wheelhouse dist | |
- id: upload | |
uses: actions/upload-artifact@v4 | |
with: | |
name: wheel-${{ matrix.os }}-${{ matrix.arch }} | |
path: dist/*.whl | |
- id: report | |
run: | | |
# report | |
test "$(uname)" = Darwin && sha256sum() { shasum -a 256 $@; } || true | |
artifact='Artifact: <${{ steps.upload.outputs.artifact-url }}>' | |
echo $artifact >> $GITHUB_STEP_SUMMARY | |
echo '```' >> $GITHUB_STEP_SUMMARY | |
sha256sum -b *.whl >> $GITHUB_STEP_SUMMARY | |
echo '```' >> $GITHUB_STEP_SUMMARY | |
shell: bash | |
working-directory: dist | |
test-setup: | |
needs: [setup, merge] | |
runs-on: 'ubuntu-latest' | |
outputs: | |
matrix-test-cf: ${{ steps.setup.outputs.matrix-test-cf }} | |
matrix-test-gh: ${{ steps.setup.outputs.matrix-test-gh }} | |
steps: | |
- uses: actions/checkout@v4 | |
- if: ${{ contains(needs.setup.outputs.os-arch-list, '"Linux-x86_64"') }} | |
uses: actions/download-artifact@v4 | |
with: | |
path: wheelhouse | |
pattern: build-Linux-x86_64-* | |
merge-multiple: true | |
- if: ${{ contains(needs.setup.outputs.os-arch-list, '"macOS-arm64"') }} | |
uses: actions/download-artifact@v4 | |
with: | |
path: wheelhouse | |
pattern: build-macOS-arm64-* | |
merge-multiple: true | |
- if: ${{ contains(needs.setup.outputs.os-arch-list, '"macOS-x86_64"') }} | |
uses: actions/download-artifact@v4 | |
with: | |
path: wheelhouse | |
pattern: build-macOS-x86_64-* | |
merge-multiple: true | |
- if: ${{ contains(needs.setup.outputs.os-arch-list, '"Windows-AMD64"') }} | |
uses: actions/download-artifact@v4 | |
with: | |
path: wheelhouse | |
pattern: build-Windows-AMD64-* | |
merge-multiple: true | |
- id: setup | |
run: python -u .cibw/setup-test.py wheelhouse >> "$GITHUB_OUTPUT" | |
test-cf: | |
if: ${{ needs.test-setup.outputs.matrix-test-cf != '[]' }} | |
needs: test-setup | |
runs-on: ${{ matrix.runner }} | |
strategy: | |
fail-fast: false | |
matrix: | |
include: ${{ fromJSON(needs.test-setup.outputs.matrix-test-cf) }} | |
defaults: | |
run: | |
shell: bash -el {0} | |
steps: | |
- name: Configure hostname | |
run: echo 127.0.0.1 `hostname` | sudo tee -a /etc/hosts > /dev/null | |
if: runner.os == 'Linux' || runner.os == 'macOS' | |
- uses: actions/checkout@v4 | |
- uses: actions/download-artifact@v4 | |
with: | |
path: dist | |
pattern: wheel-${{ runner.os }}-* | |
merge-multiple: true | |
- uses: mamba-org/setup-micromamba@v2 | |
with: | |
init-shell: bash | |
post-cleanup: none | |
environment-name: test | |
create-args: >- | |
${{ matrix.mpi }}=${{ matrix.mpi-version }} | |
python=${{ matrix.py }} | |
pip | |
condarc: | | |
show_channel_urls: true | |
channel_priority: strict | |
channels: | |
- conda-forge | |
- nodefaults | |
- run: python -m pip install mpi4py --no-index --find-links=dist | |
- uses: ./.github/actions/mpi4py-test-basic | |
timeout-minutes: 2 | |
with: | |
shell: bash -el {0} | |
- if: ${{ matrix.mpi == 'mpich' || matrix.mpi == 'openmpi' }} | |
uses: ./.github/actions/mpi4py-test-basic | |
timeout-minutes: 2 | |
env: | |
MPI4PY_MPIABI: mpi31-${{ matrix.mpi }} | |
with: | |
shell: bash -el {0} | |
test-gh: | |
if: ${{ needs.test-setup.outputs.matrix-test-gh != '[]' }} | |
needs: test-setup | |
runs-on: ${{ matrix.runner }} | |
strategy: | |
fail-fast: false | |
matrix: | |
include: ${{ fromJSON(needs.test-setup.outputs.matrix-test-gh) }} | |
steps: | |
- name: Configure hostname | |
run: echo 127.0.0.1 `hostname` | sudo tee -a /etc/hosts > /dev/null | |
if: runner.os == 'Linux' || runner.os == 'macOS' | |
- uses: actions/checkout@v4 | |
- uses: actions/download-artifact@v4 | |
with: | |
path: dist | |
pattern: wheel-${{ runner.os }}-* | |
merge-multiple: true | |
- uses: actions/setup-python@v5 | |
with: | |
python-version: ${{ matrix.py }} | |
- if: ${{ matrix.mpi == 'impi' }} | |
id: user | |
shell: bash | |
run: | | |
userdir=$(python -m site --user-base) | |
if [[ $(uname) =~ NT ]]; then | |
userdir=$(cygpath -u "$userdir") | |
mpiexec="$userdir/Library/bin/mpiexec.exe" | |
else | |
mpiexec="$userdir/bin/mpiexec" | |
fi | |
echo "mpiexec=$mpiexec" >> "$GITHUB_OUTPUT" | |
set -x | |
python -m pip install --user --upgrade pip | |
python -m pip install --user impi-rt | |
python -m pip install --user mpi4py --no-index --find-links=dist | |
env: | |
PYTHONUSERBASE: ${{ runner.temp }}/user | |
- if: ${{ matrix.mpi == 'impi' }} | |
uses: ./.github/actions/mpi4py-test-basic | |
timeout-minutes: 2 | |
with: | |
mpiexec: ${{ steps.user.outputs.mpiexec }} | |
env: | |
PYTHONUSERBASE: ${{ runner.temp }}/user | |
- if: ${{ matrix.mpi == 'impi' }} | |
id: venv | |
shell: bash | |
run: | | |
venvdir="${{ runner.temp }}/venv" | |
python -m venv "$venvdir" | |
if [[ $(uname) =~ NT ]]; then | |
venvdir=$(cygpath -u "$venvdir") | |
python="$venvdir/Scripts/python.exe" | |
mpiexec="$venvdir/Library/bin/mpiexec.exe" | |
else | |
python="$venvdir/bin/python" | |
mpiexec="$venvdir/bin/mpiexec" | |
fi | |
echo "python=$python" >> "$GITHUB_OUTPUT" | |
echo "mpiexec=$mpiexec" >> "$GITHUB_OUTPUT" | |
set -x | |
$python -m pip install --upgrade pip | |
$python -m pip install impi-rt | |
$python -m pip install mpi4py --no-index --find-links=dist | |
- if: ${{ matrix.mpi == 'impi' }} | |
uses: ./.github/actions/mpi4py-test-basic | |
timeout-minutes: 2 | |
with: | |
python: ${{ steps.venv.outputs.python }} | |
mpiexec: ${{ steps.venv.outputs.mpiexec }} | |
- run: python -m pip install --upgrade pip | |
- run: python -m pip install mpi4py --no-index --find-links=dist | |
- if: ${{ matrix.mpi == 'impi' && runner.os == 'Windows' }} | |
id: impi_old | |
shell: bash | |
run: | | |
package=intelmpi.redist.win-x64 version=2021.7.1.15761 | |
nuget install $package -Version $version | |
mpiroot="$PWD/$package.$version/runtimes/win-x64/native" | |
mpiexec="$mpiroot/bin/mpiexec.exe" | |
echo "mpiroot=$(cygpath -u "$mpiroot")" >> "$GITHUB_OUTPUT" | |
echo "mpiexec=$(cygpath -u "$mpiexec")" >> "$GITHUB_OUTPUT" | |
- if: ${{ matrix.mpi == 'impi' && runner.os == 'Windows' }} | |
uses: ./.github/actions/mpi4py-test-basic | |
timeout-minutes: 2 | |
with: | |
mpiexec: ${{ steps.impi_old.outputs.mpiexec }} | |
env: | |
I_MPI_ROOT: ${{ steps.impi_old.outputs.mpiroot }} | |
- if: ${{ matrix.mpi == 'impi' && runner.os == 'Windows' }} | |
id: impi | |
shell: bash | |
run: | | |
package=intelmpi.redist.win-x64 version=2021.13.1.766 | |
nuget install $package -Version $version | |
mpiroot="$PWD/$package.$version/runtimes/win-x64/native" | |
mpiexec="$mpiroot/bin/mpiexec.exe" | |
echo "mpiroot=$(cygpath -u "$mpiroot")" >> "$GITHUB_OUTPUT" | |
echo "mpiexec=$(cygpath -u "$mpiexec")" >> "$GITHUB_OUTPUT" | |
- if: ${{ matrix.mpi == 'impi' && runner.os == 'Windows' }} | |
uses: ./.github/actions/mpi4py-test-basic | |
timeout-minutes: 2 | |
with: | |
mpiexec: ${{ steps.impi.outputs.mpiexec }} | |
env: | |
I_MPI_ROOT: ${{ steps.impi.outputs.mpiroot }} | |
- uses: mpi4py/setup-mpi@v1 | |
with: | |
mpi: ${{ matrix.mpi }} | |
- if: ${{ matrix.mpi == 'mpich' && runner.os == 'Linux' }} | |
run: sudo ln -sr /usr/lib/$(arch)-linux-gnu/libmpi{ch,}.so.12 | |
- uses: ./.github/actions/mpi4py-test-basic | |
timeout-minutes: 2 | |
- if: ${{ matrix.mpi == 'mpich' || matrix.mpi == 'openmpi' }} | |
uses: ./.github/actions/mpi4py-test-basic | |
timeout-minutes: 2 | |
env: | |
MPI4PY_MPIABI: mpi31-${{ matrix.mpi }} |