Migrate the build system to Meson/meson-python #900
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: CI | |
| on: | |
| workflow_dispatch: | |
| pull_request: | |
| push: | |
| branches: | |
| - main | |
| schedule: | |
| - cron: "0 0 * * sun" | |
| - cron: "0 12 * * wed" | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.ref }} | |
| cancel-in-progress: true | |
| env: | |
| FORCE_COLOR: 3 | |
| CIBW_SKIP: "pp* *musllinux*" | |
| CIBW_BUILD_FRONTEND: "build" | |
| permissions: {} | |
| jobs: | |
| style: | |
| name: lint | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| steps: | |
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 | |
| with: | |
| persist-credentials: false | |
| - name: Run style checks | |
| uses: j178/prek-action@53276d8b0d10f8b6672aa85b4588c6921d0370cc # v2.0.1 | |
| editable_install: | |
| needs: [style] | |
| name: editable-install-smoke | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| steps: | |
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 | |
| with: | |
| persist-credentials: false | |
| submodules: recursive | |
| - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 | |
| with: | |
| python-version: "3.14" | |
| - name: Set up Go toolchain | |
| id: setup-go | |
| uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0 | |
| with: | |
| go-version: "1.26.1" | |
| cache: false | |
| check-latest: true | |
| - name: Restore Hugo builder cache | |
| uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 | |
| with: | |
| path: ~/.cache/hugo-go | |
| key: editable-install-hugo-${{ runner.os }}-${{ steps.setup-go.outputs.go-version }} | |
| - name: Install Python dependencies | |
| run: python -m pip install nox[uv] | |
| - name: Smoke test editable install entry points | |
| run: nox -s editable | |
| build_wheels: | |
| needs: [style] | |
| name: ${{ matrix.runs-on }}-python-${{ matrix.python-version }} | |
| runs-on: ${{ matrix.runs-on }} | |
| permissions: | |
| contents: read | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| python-version: ["3.10", "3.13", "3.14"] | |
| runs-on: | |
| [ | |
| ubuntu-latest, | |
| ubuntu-22.04-arm, | |
| macos-15-intel, | |
| macos-latest, | |
| windows-latest, | |
| ] | |
| steps: | |
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 | |
| with: | |
| persist-credentials: false | |
| submodules: recursive | |
| - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| allow-prereleases: true | |
| - name: Set up Go toolchain | |
| id: setup-go | |
| uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0 | |
| with: | |
| go-version: "1.26.1" | |
| cache: false | |
| check-latest: true | |
| - name: Install MinGW on Windows | |
| if: matrix.runs-on == 'windows-latest' | |
| run: choco install mingw | |
| - name: Restore Hugo builder cache | |
| uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 | |
| with: | |
| path: ~/.cache/hugo-go | |
| key: ${{ matrix.runs-on }}-hugo-${{ steps.setup-go.outputs.go-version }} | |
| - name: Install Python dependencies | |
| run: python -m pip install build virtualenv nox[uv] | |
| - name: Build binary distribution (wheel) | |
| run: | | |
| python -m build --wheel . --outdir wheelhouse/ | |
| - name: Test entry points for package | |
| run: nox -s venv | |
| # TODO: add aarch64 to x86_64 cross-compilation for Linux | |
| experimental: | |
| needs: [style] | |
| name: zig-${{ matrix.runs-on }}-${{ matrix.architecture }}-python-${{ matrix.python-version }} | |
| runs-on: ${{ matrix.runs-on }} | |
| permissions: | |
| contents: read | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| runs-on: [ubuntu-latest, windows-latest] | |
| architecture: [arm64, i686] | |
| python-version: ["3.10", "3.13", "3.14"] | |
| # Exclude i686 on Linux for all Python versions | |
| # Test just one Python version on Windows for now | |
| exclude: | |
| - runs-on: ubuntu-latest | |
| architecture: i686 | |
| - python-version: "3.10" | |
| runs-on: windows-latest | |
| - python-version: "3.14" | |
| runs-on: windows-latest | |
| steps: | |
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 | |
| with: | |
| persist-credentials: false | |
| submodules: recursive | |
| - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| allow-prereleases: true | |
| - name: Set up Go toolchain | |
| id: setup-go | |
| uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0 | |
| with: | |
| go-version: "1.26.1" | |
| cache: false | |
| check-latest: true | |
| - name: Restore Hugo builder cache | |
| uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 | |
| with: | |
| path: ~/.cache/hugo-go | |
| key: zig-${{ matrix.runs-on }}-${{ matrix.architecture}}-hugo-experimental-${{ steps.setup-go.outputs.go-version }} | |
| - name: Install Python dependencies | |
| run: python -m pip install build virtualenv nox auditwheel | |
| - name: Build binary distribution (wheel) on Linux | |
| if: matrix.runs-on == 'ubuntu-latest' | |
| run: python -m build --wheel . --outdir wheelhouse -Csetup-args=--cross-file="$GITHUB_WORKSPACE/meson_cross_files/linux-arm64.ini" | |
| # can't repair arm64 wheels on Linux x86_64 right now | |
| # auditwheel repair --plat manylinux_2_28_aarch64 -w wheelhouse/ dist/*.whl | |
| - name: Resolve Windows Meson cross file | |
| if: matrix.runs-on == 'windows-latest' | |
| id: meson-cross-file | |
| shell: pwsh | |
| env: | |
| MATRIX_ARCH: ${{ matrix.architecture }} | |
| run: | | |
| $crossFileName = if ($env:MATRIX_ARCH -eq 'arm64') { 'windows-arm64.ini' } else { 'windows-386.ini' } | |
| $crossFile = (Resolve-Path (Join-Path $env:GITHUB_WORKSPACE "meson_cross_files/$crossFileName")).Path -replace '\\', '/' | |
| "path=$crossFile" >> $env:GITHUB_OUTPUT | |
| - name: Build binary distribution (wheel) on Windows (arm64) | |
| if: matrix.runs-on == 'windows-latest' && matrix.architecture == 'arm64' | |
| # TODO: FIXME: use windows-11-arm runners as they're available now, and drop this | |
| uses: pypa/cibuildwheel@8d2b08b68458a16aeb24b64e68a09ab1c8e82084 # v3.4.1 | |
| with: | |
| package-dir: . | |
| output-dir: wheelhouse | |
| env: | |
| CIBW_BUILD: "cp312-*" | |
| CIBW_ARCHS_WINDOWS: ARM64 | |
| CIBW_BEFORE_BUILD_WINDOWS: "pip install delvewheel" | |
| CIBW_CONFIG_SETTINGS_WINDOWS: "setup-args=--cross-file=${{ steps.meson-cross-file.outputs.path }}" | |
| CIBW_REPAIR_WHEEL_COMMAND_WINDOWS: delvewheel repair -w {dest_dir} {wheel} | |
| CIBW_TEST_SKIP: "*-win_arm64" | |
| # Note: cibuildwheel will manage installing 32-bit Python on Windows. We | |
| # do not need to do that manually unless we use setup-python instead. | |
| - name: Build binary distribution (wheel) on Windows (i686) | |
| if: matrix.runs-on == 'windows-latest' && matrix.architecture == 'i686' | |
| uses: pypa/cibuildwheel@8d2b08b68458a16aeb24b64e68a09ab1c8e82084 # v3.4.1 | |
| with: | |
| package-dir: . | |
| output-dir: wheelhouse | |
| env: | |
| CIBW_BUILD: "cp312-*" | |
| CIBW_ARCHS_WINDOWS: x86 | |
| CIBW_BEFORE_BUILD_WINDOWS: "pip install delvewheel" | |
| CIBW_CONFIG_SETTINGS_WINDOWS: "setup-args=--cross-file=${{ steps.meson-cross-file.outputs.path }}" | |
| CIBW_REPAIR_WHEEL_COMMAND_WINDOWS: delvewheel repair -w {dest_dir} {wheel} | |
| CIBW_TEST_COMMAND: | | |
| hugo version | |
| hugo env --logLevel debug | |
| - name: Upload artifacts for debugging | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: wheels_${{ matrix.runs-on }}_${{ matrix.architecture }}_py${{ matrix.python-version }} | |
| path: ./wheelhouse/*.whl | |
| inspect_distributions: | |
| needs: [style] | |
| name: inspect-sdist-wheel-contents | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 | |
| with: | |
| persist-credentials: false | |
| submodules: recursive | |
| - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 | |
| with: | |
| python-version: 3.14 | |
| - name: Build source distribution (SDist) and binary distribution (wheel) | |
| run: | | |
| pipx run build --sdist --wheel . --outdir dist/ | |
| pipx run twine check dist/* --strict | |
| - name: Check sdist size, fail if it exceeds 10 MiB | |
| run: | | |
| MAX_SIZE_MB=10 | |
| SDIST=$(ls dist/*.tar.gz) | |
| SIZE=$(stat --format=%s "$SDIST") | |
| SIZE_MB=$(awk "BEGIN {printf \"%.2f\", $SIZE / 1048576}") | |
| echo "sdist size: ${SIZE_MB} MB" | |
| if [ "$SIZE" -gt $((MAX_SIZE_MB * 1048576)) ]; then | |
| echo "::error::sdist is ${SIZE_MB} MB, exceeding the ${MAX_SIZE_MB} MB limit" | |
| exit 1 | |
| fi | |
| - name: Build, inspect, and display contents of distributions | |
| shell: bash | |
| run: | | |
| mkdir -p output/sdist | |
| tar -xf dist/*.tar.gz -C output/sdist | |
| echo -e '## View source distribution (SDist) contents\n' >> $GITHUB_STEP_SUMMARY | |
| echo -e '```\n' >> $GITHUB_STEP_SUMMARY | |
| (cd output/sdist && tree -a * | sed 's/^/ /' | tee -a $GITHUB_STEP_SUMMARY) | |
| echo -e '\n```\n' >> $GITHUB_STEP_SUMMARY | |
| mkdir -p output/wheel | |
| pipx run wheel unpack dist/*.whl -d output/wheel | |
| echo -e '## View binary distribution (wheel) contents\n' >> $GITHUB_STEP_SUMMARY | |
| echo -e '```\n' >> $GITHUB_STEP_SUMMARY | |
| (cd output/wheel && tree -a * | sed 's/^/ /' | tee -a $GITHUB_STEP_SUMMARY) | |
| echo -e '\n```\n' >> $GITHUB_STEP_SUMMARY |