Parallel builds support #2427
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: Linux Python build | |
| on: | |
| push: | |
| branches: [ main ] | |
| pull_request: | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.ref_name }}-${{ github.event.pull_request.number || github.sha }} | |
| cancel-in-progress: ${{ github.event_name == 'pull_request' }} | |
| env: | |
| FORCE_COLOR: 1 | |
| jobs: | |
| pythonbuild: | |
| runs-on: ubuntu-22.04 | |
| steps: | |
| - name: Install System Dependencies | |
| run: | | |
| sudo apt update | |
| sudo apt install -y --no-install-recommends libssl-dev pkg-config | |
| - uses: actions/checkout@v4 | |
| - name: Emit rustc version | |
| run: | | |
| rustc --version > .rustc-version | |
| - uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/.cargo/registry | |
| ~/.cargo/git | |
| target | |
| key: ${{ runner.os }}-pythonbuild-${{ hashFiles('Cargo.lock', '.rustc-version') }} | |
| - name: Build | |
| run: | | |
| cargo build --release | |
| - name: Upload pythonbuild Executable | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: pythonbuild | |
| path: target/release/pythonbuild | |
| image: | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| image: | |
| - build | |
| - build.cross | |
| - gcc | |
| - xcb | |
| - xcb.cross | |
| runs-on: ubuntu-22.04 | |
| permissions: | |
| packages: write | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Install Python | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: '3.11' | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v3 | |
| - name: Login to GitHub Container Registry | |
| uses: docker/login-action@v3 | |
| with: | |
| registry: ghcr.io | |
| username: ${{ github.actor }} | |
| password: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Generate Dockerfiles | |
| run: | | |
| ./build-linux.py --make-target empty | |
| repo_name=$(echo "${GITHUB_REPOSITORY,,}" | sed 's|\.|_|g') | |
| git_ref_name=$(echo "${GITHUB_REF_NAME,,}" | sed 's|[^a-z0-9_-]|_|g') | |
| echo "REPO_NAME=${repo_name}" >> "${GITHUB_ENV}" | |
| echo "GIT_REF_NAME=${git_ref_name}" >> "${GITHUB_ENV}" | |
| - name: Build Image | |
| id: build-image | |
| uses: docker/build-push-action@v5 | |
| with: | |
| context: . | |
| file: build/${{ matrix.image }}.Dockerfile | |
| labels: org.opencontainers.image.source=https://github.com/${{ env.REPO_NAME }} | |
| # Cache from/to the current branch of the current repo as the primary cache key. | |
| # Cache from the default branch of the current repo so branches can have cache hits. | |
| # Cache from the default branch of the canonical repo so forks can have cache hits. | |
| # Ignore errors on cache writes so CI of forks works without a valid GHCR config. | |
| cache-from: | | |
| type=registry,ref=ghcr.io/${{ env.REPO_NAME }}:${{ matrix.image }}-${{ env.GIT_REF_NAME }} | |
| type=registry,ref=ghcr.io/${{ env.REPO_NAME }}:${{ matrix.image }}-main | |
| type=registry,ref=ghcr.io/indygreg/python-build-standalone:${{ matrix.image }}-main | |
| cache-to: | | |
| type=registry,ref=ghcr.io/${{ env.REPO_NAME }}:${{ matrix.image }}-${{ env.GIT_REF_NAME }},ignore-error=true | |
| outputs: | | |
| type=docker,dest=build/image-${{ matrix.image }}.tar | |
| - name: Compress Image | |
| run: | | |
| echo ${{ steps.build-image.outputs.imageid }} > build/image-${{ matrix.image }} | |
| zstd -v -T0 -6 --rm build/image-*.tar | |
| - name: Upload Docker Image | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: image-${{ matrix.image }} | |
| path: build/image-* | |
| build: | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| build: | |
| # For non-PGO builds we use the `all` magic Python version to allow | |
| # building multiple Python versions on the same job. This amortizes | |
| # overheads of building shared dependencies. | |
| # | |
| # For PGO builds, keep separate CI jobs so there isn't interference | |
| # from other jobs when profiling the builds. We could work around this | |
| # in the build system by requiring serial execution of the Python | |
| # build targets. But PGO also takes a while to run and a monolithic | |
| # job may take too long to run if we build all Python versions serially. | |
| # | |
| # It doesn't make sense to combine different targets or options in the | |
| # same job because dependencies will be different. Since they will be | |
| # different, splitting into multiple jobs allows us to leverage more | |
| # machines / parallelism to get builds completed faster. | |
| # Cross-compiles can't do PGO. | |
| - target_triple: 'aarch64-unknown-linux-gnu' | |
| py: 'all' | |
| options: 'debug' | |
| - target_triple: 'aarch64-unknown-linux-gnu' | |
| py: 'all' | |
| options: 'noopt' | |
| - target_triple: 'aarch64-unknown-linux-gnu' | |
| py: 'all' | |
| options: 'lto' | |
| # Cross-compiles can't do PGO and require Python 3.9. | |
| - target_triple: 'armv7-unknown-linux-gnueabi' | |
| py: 'all' | |
| options: 'debug' | |
| - target_triple: 'armv7-unknown-linux-gnueabi' | |
| py: 'all' | |
| options: 'noopt' | |
| - target_triple: 'armv7-unknown-linux-gnueabi' | |
| py: 'all' | |
| options: 'lto' | |
| # Cross-compiles can't do PGO and require Python 3.9. | |
| - target_triple: 'armv7-unknown-linux-gnueabihf' | |
| py: 'all' | |
| options: 'debug' | |
| - target_triple: 'armv7-unknown-linux-gnueabihf' | |
| py: 'all' | |
| options: 'noopt' | |
| - target_triple: 'armv7-unknown-linux-gnueabihf' | |
| py: 'all' | |
| options: 'lto' | |
| # Cross-compiles can't do PGO and require Python 3.9. | |
| - target_triple: 'mips-unknown-linux-gnu' | |
| py: 'all' | |
| options: 'debug' | |
| - target_triple: 'mips-unknown-linux-gnu' | |
| py: 'all' | |
| options: 'noopt' | |
| - target_triple: 'mips-unknown-linux-gnu' | |
| py: 'all' | |
| options: 'lto' | |
| # Cross-compiles can't do PGO and require Python 3.9. | |
| - target_triple: 'mipsel-unknown-linux-gnu' | |
| py: 'all' | |
| options: 'debug' | |
| - target_triple: 'mipsel-unknown-linux-gnu' | |
| py: 'all' | |
| options: 'noopt' | |
| - target_triple: 'mipsel-unknown-linux-gnu' | |
| py: 'all' | |
| options: 'lto' | |
| # Cross-compiles can't do PGO and require Python 3.9. | |
| - target_triple: 's390x-unknown-linux-gnu' | |
| py: 'all' | |
| options: 'debug' | |
| - target_triple: 's390x-unknown-linux-gnu' | |
| py: 'all' | |
| options: 'noopt' | |
| - target_triple: 's390x-unknown-linux-gnu' | |
| py: 'all' | |
| options: 'lto' | |
| # Cross-compiles can't do PGO and require Python 3.9. | |
| - target_triple: 'ppc64le-unknown-linux-gnu' | |
| py: 'all' | |
| options: 'debug' | |
| - target_triple: 'ppc64le-unknown-linux-gnu' | |
| py: 'all' | |
| options: 'noopt' | |
| - target_triple: 'ppc64le-unknown-linux-gnu' | |
| py: 'all' | |
| options: 'lto' | |
| - target_triple: 'x86_64-unknown-linux-gnu' | |
| py: 'all' | |
| options: 'debug' | |
| run: true | |
| - target_triple: 'x86_64-unknown-linux-gnu' | |
| py: 'cpython-3.9' | |
| options: 'pgo' | |
| run: true | |
| - target_triple: 'x86_64-unknown-linux-gnu' | |
| py: 'cpython-3.9' | |
| options: 'pgo+lto' | |
| run: true | |
| - target_triple: 'x86_64-unknown-linux-gnu' | |
| py: 'cpython-3.10' | |
| options: 'pgo' | |
| run: true | |
| - target_triple: 'x86_64-unknown-linux-gnu' | |
| py: 'cpython-3.10' | |
| options: 'pgo+lto' | |
| run: true | |
| - target_triple: 'x86_64-unknown-linux-gnu' | |
| py: 'cpython-3.11' | |
| options: 'pgo' | |
| run: true | |
| - target_triple: 'x86_64-unknown-linux-gnu' | |
| py: 'cpython-3.11' | |
| options: 'pgo+lto' | |
| run: true | |
| - target_triple: 'x86_64-unknown-linux-gnu' | |
| py: 'cpython-3.12' | |
| options: 'pgo' | |
| run: true | |
| - target_triple: 'x86_64-unknown-linux-gnu' | |
| py: 'cpython-3.12' | |
| options: 'pgo+lto' | |
| run: true | |
| - target_triple: 'x86_64_v2-unknown-linux-gnu' | |
| py: 'all' | |
| options: 'debug' | |
| run: true | |
| - target_triple: 'x86_64_v2-unknown-linux-gnu' | |
| py: 'cpython-3.9' | |
| options: 'pgo' | |
| run: true | |
| - target_triple: 'x86_64_v2-unknown-linux-gnu' | |
| py: 'cpython-3.9' | |
| options: 'pgo+lto' | |
| run: true | |
| - target_triple: 'x86_64_v2-unknown-linux-gnu' | |
| py: 'cpython-3.10' | |
| options: 'pgo' | |
| run: true | |
| - target_triple: 'x86_64_v2-unknown-linux-gnu' | |
| py: 'cpython-3.10' | |
| options: 'pgo+lto' | |
| run: true | |
| - target_triple: 'x86_64_v2-unknown-linux-gnu' | |
| py: 'cpython-3.11' | |
| options: 'pgo' | |
| run: true | |
| - target_triple: 'x86_64_v2-unknown-linux-gnu' | |
| py: 'cpython-3.11' | |
| options: 'pgo+lto' | |
| run: true | |
| - target_triple: 'x86_64_v2-unknown-linux-gnu' | |
| py: 'cpython-3.12' | |
| options: 'pgo' | |
| run: true | |
| - target_triple: 'x86_64_v2-unknown-linux-gnu' | |
| py: 'cpython-3.12' | |
| options: 'pgo+lto' | |
| run: true | |
| - target_triple: 'x86_64_v3-unknown-linux-gnu' | |
| py: 'all' | |
| options: 'debug' | |
| run: true | |
| - target_triple: 'x86_64_v3-unknown-linux-gnu' | |
| py: 'cpython-3.9' | |
| options: 'pgo' | |
| run: true | |
| - target_triple: 'x86_64_v3-unknown-linux-gnu' | |
| py: 'cpython-3.9' | |
| options: 'pgo+lto' | |
| run: true | |
| - target_triple: 'x86_64_v3-unknown-linux-gnu' | |
| py: 'cpython-3.10' | |
| options: 'pgo' | |
| run: true | |
| - target_triple: 'x86_64_v3-unknown-linux-gnu' | |
| py: 'cpython-3.10' | |
| options: 'pgo+lto' | |
| run: true | |
| - target_triple: 'x86_64_v3-unknown-linux-gnu' | |
| py: 'cpython-3.11' | |
| options: 'pgo' | |
| run: true | |
| - target_triple: 'x86_64_v3-unknown-linux-gnu' | |
| py: 'cpython-3.11' | |
| options: 'pgo+lto' | |
| run: true | |
| - target_triple: 'x86_64_v3-unknown-linux-gnu' | |
| py: 'cpython-3.12' | |
| options: 'pgo' | |
| run: true | |
| - target_triple: 'x86_64_v3-unknown-linux-gnu' | |
| py: 'cpython-3.12' | |
| options: 'pgo+lto' | |
| run: true | |
| # GitHub Actions runners don't support x86-64-v4 so we can't PGO. | |
| - target_triple: 'x86_64_v4-unknown-linux-gnu' | |
| py: 'all' | |
| options: 'debug' | |
| - target_triple: 'x86_64_v4-unknown-linux-gnu' | |
| py: 'all' | |
| options: 'noopt' | |
| - target_triple: 'x86_64_v4-unknown-linux-gnu' | |
| py: 'all' | |
| options: 'lto' | |
| # musl doesn't support PGO. | |
| - target_triple: 'x86_64-unknown-linux-musl' | |
| py: 'all' | |
| options: 'debug' | |
| run: true | |
| - target_triple: 'x86_64-unknown-linux-musl' | |
| py: 'all' | |
| options: 'noopt' | |
| run: true | |
| - target_triple: 'x86_64-unknown-linux-musl' | |
| py: 'all' | |
| options: 'lto' | |
| run: true | |
| - target_triple: 'x86_64_v2-unknown-linux-musl' | |
| py: 'all' | |
| options: 'debug' | |
| run: true | |
| - target_triple: 'x86_64_v2-unknown-linux-musl' | |
| py: 'all' | |
| options: 'noopt' | |
| run: true | |
| - target_triple: 'x86_64_v2-unknown-linux-musl' | |
| py: 'all' | |
| options: 'lto' | |
| run: true | |
| - target_triple: 'x86_64_v3-unknown-linux-musl' | |
| py: 'all' | |
| options: 'debug' | |
| run: true | |
| - target_triple: 'x86_64_v3-unknown-linux-musl' | |
| py: 'all' | |
| options: 'noopt' | |
| run: true | |
| - target_triple: 'x86_64_v3-unknown-linux-musl' | |
| py: 'all' | |
| options: 'lto' | |
| run: true | |
| - target_triple: 'x86_64_v4-unknown-linux-musl' | |
| py: 'all' | |
| options: 'debug' | |
| - target_triple: 'x86_64_v4-unknown-linux-musl' | |
| py: 'all' | |
| options: 'noopt' | |
| - target_triple: 'x86_64_v4-unknown-linux-musl' | |
| py: 'all' | |
| options: 'lto' | |
| needs: | |
| - pythonbuild | |
| - image | |
| runs-on: ubuntu-22.04 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: Install Python | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: '3.11' | |
| - name: Download pythonbuild | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: pythonbuild | |
| path: build | |
| - name: Download images | |
| uses: actions/download-artifact@v4 | |
| with: | |
| pattern: image-* | |
| path: build | |
| merge-multiple: true | |
| - name: Load Docker Images | |
| run: | | |
| for f in build/image-*.tar.zst; do | |
| echo "decompressing $f" | |
| zstd -d --rm ${f} | |
| done | |
| for f in build/image-*.tar; do | |
| echo "loading $f" | |
| docker load --input $f | |
| done | |
| - name: Build | |
| run: | | |
| # Do empty target so all generated files are touched. | |
| ./build-linux.py --make-target empty | |
| # Touch mtimes of all images so they are newer than autogenerated files above. | |
| touch build/image-* | |
| ./build-linux.py --target-triple ${{ matrix.build.target_triple }} --python ${{ matrix.build.py }} --options ${{ matrix.build.options }} | |
| - name: Validate Distribution | |
| run: | | |
| chmod +x build/pythonbuild | |
| if [ -n "${{matrix.build.run}}" ]; then | |
| EXTRA_ARGS="--run" | |
| fi | |
| build/pythonbuild validate-distribution ${EXTRA_ARGS} dist/*.tar.zst | |
| - name: Upload Distribution | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: ${{ matrix.build.py }}-${{ matrix.build.target_triple }}-${{ matrix.build.options }} | |
| path: dist/* | |
| # GitHub enforces a limit of 256 entries per matrix, which we exceeded above | |
| # so the CPython 3.13 jobs are split out | |
| build-313: | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| build: | |
| - target_triple: 'aarch64-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+debug' | |
| - target_triple: 'aarch64-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+noopt' | |
| - target_triple: 'aarch64-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+lto' | |
| - target_triple: 'armv7-unknown-linux-gnueabi' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+debug' | |
| - target_triple: 'armv7-unknown-linux-gnueabi' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+noopt' | |
| - target_triple: 'armv7-unknown-linux-gnueabi' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+lto' | |
| - target_triple: 'armv7-unknown-linux-gnueabihf' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+debug' | |
| - target_triple: 'armv7-unknown-linux-gnueabihf' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+noopt' | |
| - target_triple: 'armv7-unknown-linux-gnueabihf' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+lto' | |
| - target_triple: 'mips-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+debug' | |
| - target_triple: 'mips-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+noopt' | |
| - target_triple: 'mips-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+lto' | |
| - target_triple: 'mipsel-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+debug' | |
| - target_triple: 'mipsel-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+noopt' | |
| - target_triple: 'mipsel-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+lto' | |
| - target_triple: 's390x-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+debug' | |
| - target_triple: 's390x-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+noopt' | |
| - target_triple: 's390x-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+lto' | |
| - target_triple: 'ppc64le-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+debug' | |
| - target_triple: 'ppc64le-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+noopt' | |
| - target_triple: 'ppc64le-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+lto' | |
| - target_triple: 'x86_64-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'debug' | |
| run: true | |
| - target_triple: 'x86_64-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'pgo' | |
| run: true | |
| - target_triple: 'x86_64-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'pgo+lto' | |
| run: true | |
| - target_triple: 'x86_64-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+debug' | |
| run: true | |
| - target_triple: 'x86_64-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+pgo' | |
| run: true | |
| - target_triple: 'x86_64-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+pgo+lto' | |
| run: true | |
| - target_triple: 'x86_64_v2-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'debug' | |
| run: true | |
| - target_triple: 'x86_64_v2-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'pgo' | |
| run: true | |
| - target_triple: 'x86_64_v2-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'pgo+lto' | |
| run: true | |
| - target_triple: 'x86_64_v2-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+debug' | |
| run: true | |
| - target_triple: 'x86_64_v2-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+pgo' | |
| run: true | |
| - target_triple: 'x86_64_v2-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+pgo+lto' | |
| run: true | |
| - target_triple: 'x86_64_v3-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'debug' | |
| run: true | |
| - target_triple: 'x86_64_v3-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'pgo' | |
| run: true | |
| - target_triple: 'x86_64_v3-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'pgo+lto' | |
| run: true | |
| - target_triple: 'x86_64_v3-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+debug' | |
| run: true | |
| - target_triple: 'x86_64_v3-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+pgo' | |
| run: true | |
| - target_triple: 'x86_64_v3-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+pgo+lto' | |
| run: true | |
| - target_triple: 'x86_64-unknown-linux-musl' | |
| py: 'cpython-3.13' | |
| options: 'debug' | |
| run: true | |
| - target_triple: 'x86_64-unknown-linux-musl' | |
| py: 'cpython-3.13' | |
| options: 'noopt' | |
| run: true | |
| - target_triple: 'x86_64-unknown-linux-musl' | |
| py: 'cpython-3.13' | |
| options: 'lto' | |
| run: true | |
| # TODO: Free-threaded musl builds are blocked by upgrading LLVM 14 -> 18. | |
| # - target_triple: 'x86_64-unknown-linux-musl' | |
| # py: 'cpython-3.13' | |
| # options: 'freethreaded+debug' | |
| # run: true | |
| # - target_triple: 'x86_64-unknown-linux-musl' | |
| # py: 'cpython-3.13' | |
| # options: 'freethreaded+noopt' | |
| # run: true | |
| # - target_triple: 'x86_64-unknown-linux-musl' | |
| # py: 'cpython-3.13' | |
| # options: 'freethreaded+lto' | |
| # run: true | |
| - target_triple: 'x86_64_v2-unknown-linux-musl' | |
| py: 'cpython-3.13' | |
| options: 'debug' | |
| run: true | |
| - target_triple: 'x86_64_v2-unknown-linux-musl' | |
| py: 'cpython-3.13' | |
| options: 'noopt' | |
| run: true | |
| - target_triple: 'x86_64_v2-unknown-linux-musl' | |
| py: 'cpython-3.13' | |
| options: 'lto' | |
| run: true | |
| # TODO: Free-threaded musl builds are blocked by upgrading LLVM 14 -> 18. | |
| # - target_triple: 'x86_64_v2-unknown-linux-musl' | |
| # py: 'cpython-3.13' | |
| # options: 'freethreaded+debug' | |
| # run: true | |
| # - target_triple: 'x86_64_v2-unknown-linux-musl' | |
| # py: 'cpython-3.13' | |
| # options: 'freethreaded+noopt' | |
| # run: true | |
| # - target_triple: 'x86_64_v2-unknown-linux-musl' | |
| # py: 'cpython-3.13' | |
| # options: 'freethreaded+lto' | |
| # run: true | |
| - target_triple: 'x86_64_v4-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'debug' | |
| - target_triple: 'x86_64_v4-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'noopt' | |
| - target_triple: 'x86_64_v4-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'lto' | |
| - target_triple: 'x86_64_v4-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+debug' | |
| - target_triple: 'x86_64_v4-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+noopt' | |
| - target_triple: 'x86_64_v4-unknown-linux-gnu' | |
| py: 'cpython-3.13' | |
| options: 'freethreaded+lto' | |
| - target_triple: 'x86_64_v3-unknown-linux-musl' | |
| py: 'cpython-3.13' | |
| options: 'debug' | |
| run: true | |
| - target_triple: 'x86_64_v3-unknown-linux-musl' | |
| py: 'cpython-3.13' | |
| options: 'noopt' | |
| run: true | |
| - target_triple: 'x86_64_v3-unknown-linux-musl' | |
| py: 'cpython-3.13' | |
| options: 'lto' | |
| run: true | |
| # TODO: Free-threaded musl builds are blocked by upgrading LLVM 14 -> 18. | |
| # - target_triple: 'x86_64_v3-unknown-linux-musl' | |
| # py: 'cpython-3.13' | |
| # options: 'freethreaded+debug' | |
| # run: true | |
| # - target_triple: 'x86_64_v3-unknown-linux-musl' | |
| # py: 'cpython-3.13' | |
| # options: 'freethreaded+noopt' | |
| # run: true | |
| # - target_triple: 'x86_64_v3-unknown-linux-musl' | |
| # py: 'cpython-3.13' | |
| # options: 'freethreaded+lto' | |
| # run: true | |
| - target_triple: 'x86_64_v4-unknown-linux-musl' | |
| py: 'cpython-3.13' | |
| options: 'debug' | |
| - target_triple: 'x86_64_v4-unknown-linux-musl' | |
| py: 'cpython-3.13' | |
| options: 'noopt' | |
| - target_triple: 'x86_64_v4-unknown-linux-musl' | |
| py: 'cpython-3.13' | |
| options: 'lto' | |
| # TODO: Free-threaded musl builds are blocked by upgrading LLVM 14 -> 18. | |
| # - target_triple: 'x86_64_v4-unknown-linux-musl' | |
| # py: 'cpython-3.13' | |
| # options: 'freethreaded+debug' | |
| # - target_triple: 'x86_64_v4-unknown-linux-musl' | |
| # py: 'cpython-3.13' | |
| # options: 'freethreaded+noopt' | |
| # - target_triple: 'x86_64_v4-unknown-linux-musl' | |
| # py: 'cpython-3.13' | |
| # options: 'freethreaded+lto' | |
| needs: | |
| - pythonbuild | |
| - image | |
| runs-on: ubuntu-22.04 | |
| # The above should remain an exact duplicate of the `build` job | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: Install Python | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: '3.11' | |
| - name: Download pythonbuild | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: pythonbuild | |
| path: build | |
| - name: Download images | |
| uses: actions/download-artifact@v4 | |
| with: | |
| pattern: image-* | |
| path: build | |
| merge-multiple: true | |
| - name: Load Docker Images | |
| run: | | |
| for f in build/image-*.tar.zst; do | |
| echo "decompressing $f" | |
| zstd -d --rm ${f} | |
| done | |
| for f in build/image-*.tar; do | |
| echo "loading $f" | |
| docker load --input $f | |
| done | |
| - name: Build | |
| run: | | |
| # Do empty target so all generated files are touched. | |
| ./build-linux.py --make-target empty | |
| # Touch mtimes of all images so they are newer than autogenerated files above. | |
| touch build/image-* | |
| ./build-linux.py --target-triple ${{ matrix.build.target_triple }} --python ${{ matrix.build.py }} --options ${{ matrix.build.options }} | |
| - name: Validate Distribution | |
| run: | | |
| chmod +x build/pythonbuild | |
| if [ -n "${{matrix.build.run}}" ]; then | |
| EXTRA_ARGS="--run" | |
| fi | |
| build/pythonbuild validate-distribution ${EXTRA_ARGS} dist/*.tar.zst | |
| - name: Upload Distribution | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: ${{ matrix.build.py }}-${{ matrix.build.target_triple }}-${{ matrix.build.options }} | |
| path: dist/* |