From e3fbb8b88750b54cd1656ed718f053418f1cec3a Mon Sep 17 00:00:00 2001 From: mayeut Date: Wed, 3 Dec 2025 22:54:16 +0100 Subject: [PATCH 1/4] feat: use gcc-15 when possible All supported images - except manylinux2014 & ubuntu based ones - now use gcc-15. musllinux_1_2 moves to Alpine Linux 3.23 in order to achieve this. --- README.rst | 10 +++++----- build.sh | 16 ++++++---------- docker/build_scripts/finalize.sh | 5 ----- docker/build_scripts/install-runtime-packages.sh | 8 +------- 4 files changed, 12 insertions(+), 27 deletions(-) diff --git a/README.rst b/README.rst index 1a4595c4..92e7a655 100644 --- a/README.rst +++ b/README.rst @@ -102,7 +102,7 @@ for repeatable builds. manylinux_2_39 (AlmaLinux/RockyLinux 10 based) - ALPHA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Toolchain: GCC 14 +Toolchain: GCC 15 - aarch64 image: ``quay.io/pypa/manylinux_2_39_aarch64`` - riscv64 image: ``quay.io/pypa/manylinux_2_39_riscv64`` @@ -157,7 +157,7 @@ grafted into a wheel, will fail to run on older hardware. There's no PEP to hand yet when it comes to packaging or installing wheels. Auditwheel doesn't detect this either. See https://github.com/pypa/manylinux/issues/1725 -Toolchain: GCC 14 +Toolchain: GCC 15 - x86_64 image: ``quay.io/pypa/manylinux_2_34_x86_64`` - i686 image: ``quay.io/pypa/manylinux_2_34_i686`` @@ -207,7 +207,7 @@ distros using glibc 2.31 or later, including: manylinux_2_28 (AlmaLinux 8 based) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Toolchain: GCC 14 +Toolchain: GCC 15 - x86_64 image: ``quay.io/pypa/manylinux_2_28_x86_64`` - i686 image: ``quay.io/pypa/manylinux_2_28_i686`` @@ -284,10 +284,10 @@ Toolchain: GCC 4.8 - i686 image: ``quay.io/pypa/manylinux1_i686`` -musllinux_1_2 (Alpine Linux 3.22 based, 3.13+ compatible) +musllinux_1_2 (Alpine Linux 3.23 based, 3.13+ compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Toolchain: GCC 14 +Toolchain: GCC 15 - x86_64 image: ``quay.io/pypa/musllinux_1_2_x86_64`` - i686 image: ``quay.io/pypa/musllinux_1_2_i686`` diff --git a/build.sh b/build.sh index 58a90f58..629090ef 100755 --- a/build.sh +++ b/build.sh @@ -35,7 +35,7 @@ if [ "${POLICY}" == "manylinux2014" ]; then fi elif [ "${POLICY}" == "manylinux_2_28" ]; then BASEIMAGE="quay.io/almalinuxorg/almalinux:8" - DEVTOOLSET_ROOTPATH="/opt/rh/gcc-toolset-14/root" + DEVTOOLSET_ROOTPATH="/opt/rh/gcc-toolset-15/root" PREPEND_PATH="${DEVTOOLSET_ROOTPATH}/usr/bin:" LD_LIBRARY_PATH_ARG="${DEVTOOLSET_ROOTPATH}/usr/lib64:${DEVTOOLSET_ROOTPATH}/usr/lib:${DEVTOOLSET_ROOTPATH}/usr/lib64/dyninst:${DEVTOOLSET_ROOTPATH}/usr/lib/dyninst" elif [ "${POLICY}" == "manylinux_2_31" ]; then @@ -45,7 +45,7 @@ elif [ "${POLICY}" == "manylinux_2_31" ]; then LD_LIBRARY_PATH_ARG= elif [ "${POLICY}" == "manylinux_2_34" ]; then BASEIMAGE="quay.io/almalinuxorg/almalinux:9" - DEVTOOLSET_ROOTPATH="/opt/rh/gcc-toolset-14/root" + DEVTOOLSET_ROOTPATH="/opt/rh/gcc-toolset-15/root" PREPEND_PATH="/usr/local/bin:${DEVTOOLSET_ROOTPATH}/usr/bin:" LD_LIBRARY_PATH_ARG="${DEVTOOLSET_ROOTPATH}/usr/lib64:${DEVTOOLSET_ROOTPATH}/usr/lib:${DEVTOOLSET_ROOTPATH}/usr/lib64/dyninst:${DEVTOOLSET_ROOTPATH}/usr/lib/dyninst" elif [ "${POLICY}" == "manylinux_2_35" ]; then @@ -59,15 +59,11 @@ elif [ "${POLICY}" == "manylinux_2_39" ]; then x86_64) GOARCH="amd64/v2";; riscv64) BASEIMAGE="rockylinux/rockylinux:10";; esac - # TODO enable gcc-toolset-15 once available (probably in 10.1) - # DEVTOOLSET_ROOTPATH="/opt/rh/gcc-toolset-15/root" - # PREPEND_PATH="/usr/local/bin:${DEVTOOLSET_ROOTPATH}/usr/bin:" - # LD_LIBRARY_PATH_ARG="${DEVTOOLSET_ROOTPATH}/usr/lib64:${DEVTOOLSET_ROOTPATH}/usr/lib:${DEVTOOLSET_ROOTPATH}/usr/lib64/dyninst:${DEVTOOLSET_ROOTPATH}/usr/lib/dyninst" - DEVTOOLSET_ROOTPATH= - PREPEND_PATH= - LD_LIBRARY_PATH_ARG= + DEVTOOLSET_ROOTPATH="/opt/rh/gcc-toolset-15/root" + PREPEND_PATH="/usr/local/bin:${DEVTOOLSET_ROOTPATH}/usr/bin:" + LD_LIBRARY_PATH_ARG="${DEVTOOLSET_ROOTPATH}/usr/lib64:${DEVTOOLSET_ROOTPATH}/usr/lib:${DEVTOOLSET_ROOTPATH}/usr/lib64/dyninst:${DEVTOOLSET_ROOTPATH}/usr/lib/dyninst" elif [ "${POLICY}" == "musllinux_1_2" ]; then - BASEIMAGE="alpine:3.22" + BASEIMAGE="alpine:3.23" DEVTOOLSET_ROOTPATH= PREPEND_PATH= LD_LIBRARY_PATH_ARG= diff --git a/docker/build_scripts/finalize.sh b/docker/build_scripts/finalize.sh index ce713649..53171d07 100755 --- a/docker/build_scripts/finalize.sh +++ b/docker/build_scripts/finalize.sh @@ -106,8 +106,3 @@ LC_ALL=C "${MY_DIR}/update-system-packages.sh" # wrap compilers (see https://github.com/pypa/manylinux/issues/1725) "${MY_DIR}/install-gcc-wrapper.sh" - -# patch libstdc++.so (see https://github.com/pypa/manylinux/issues/1760) -if [ "${AUDITWHEEL_POLICY}" == "manylinux_2_28" ] || [ "${AUDITWHEEL_POLICY}" == "manylinux_2_34" ]; then - find "${DEVTOOLSET_ROOTPATH}" -name 'libstdc++.so' -exec sed -i 's/INPUT\s*(\s*\([^ ]\+\)\s*\([^ ]\+\)\s*)/INPUT ( \1 \2 \1 )/g' {} \; -fi diff --git a/docker/build_scripts/install-runtime-packages.sh b/docker/build_scripts/install-runtime-packages.sh index f56cf8f1..f9c4e1c1 100755 --- a/docker/build_scripts/install-runtime-packages.sh +++ b/docker/build_scripts/install-runtime-packages.sh @@ -128,13 +128,7 @@ elif [ "${OS_ID_LIKE}" == "rhel" ]; then else dnf config-manager --set-enabled crb fi - if [ "${AUDITWHEEL_POLICY}" == "manylinux_2_28" ] || [ "${AUDITWHEEL_POLICY}" == "manylinux_2_34" ]; then - TOOLCHAIN_DEPS=(gcc-toolset-14-binutils gcc-toolset-14-gcc gcc-toolset-14-gcc-c++ gcc-toolset-14-gcc-gfortran gcc-toolset-14-libatomic-devel) - else - # TODO enable gcc-toolset-15 once available (probably in 10.1) - # TOOLCHAIN_DEPS=(gcc-toolset-15-binutils gcc-toolset-15-gcc gcc-toolset-15-gcc-c++ gcc-toolset-15-gcc-gfortran gcc-toolset-15-libatomic-devel) - TOOLCHAIN_DEPS=(binutils gcc gcc-c++ gcc-gfortran libatomic) - fi + TOOLCHAIN_DEPS=(gcc-toolset-15-binutils gcc-toolset-15-gcc gcc-toolset-15-gcc-c++ gcc-toolset-15-gcc-gfortran gcc-toolset-15-libatomic-devel) elif [ "${OS_ID_LIKE}" == "debian" ]; then TOOLCHAIN_DEPS+=(binutils gcc g++ gfortran libatomic1) BASE_TOOLS+=(gpg gpg-agent hardlink hostname locales xz-utils) From b476e32a08c5b507c90416acdfae61f49385096b Mon Sep 17 00:00:00 2001 From: mayeut Date: Sat, 6 Dec 2025 14:05:57 +0100 Subject: [PATCH 2/4] break: drop Python 3.13t --- README.rst | 2 +- docker/Dockerfile | 6 ------ docker/tests/run_tests.sh | 16 ++++++++-------- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/README.rst b/README.rst index 92e7a655..68715347 100644 --- a/README.rst +++ b/README.rst @@ -323,7 +323,7 @@ Image content All supported images currently contain: -- CPython 3.8, 3.9, 3.10, 3.11, 3.12, 3.13, 3.13t, 3.14, 3.14t and PyPy 3.11 installed in +- CPython 3.8, 3.9, 3.10, 3.11, 3.12, 3.13, 3.14, 3.14t and PyPy 3.11 installed in ``/opt/python/-``. The directories are named after the PEP 425 tags for each environment -- e.g. ``/opt/python/cp313-cp313`` contains a CPython 3.13 build, and diff --git a/docker/Dockerfile b/docker/Dockerfile index 40f7aa54..af4a0028 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -194,11 +194,6 @@ ARG MANYLINUX_DISABLE_CLANG_FOR_CPYTHON RUN --mount=type=bind,from=static_clang,target=/tmp/cross-compiler,ro \ /tmp/cross-compiler/entrypoint /opt/_internal/build_scripts/build-cpython.sh thomas@python.org https://accounts.google.com 3.13.11 -FROM build_cpython AS build_cpython313_nogil -ARG MANYLINUX_DISABLE_CLANG_FOR_CPYTHON -RUN --mount=type=bind,from=static_clang,target=/tmp/cross-compiler,ro \ - /tmp/cross-compiler/entrypoint /opt/_internal/build_scripts/build-cpython.sh thomas@python.org https://accounts.google.com 3.13.11 nogil - FROM build_cpython AS build_cpython314 ARG MANYLINUX_DISABLE_CLANG_FOR_CPYTHON RUN --mount=type=bind,from=static_clang,target=/tmp/cross-compiler,ro \ @@ -223,7 +218,6 @@ RUN --mount=type=bind,target=/build_cpython38,from=build_cpython38 \ --mount=type=bind,target=/build_cpython311,from=build_cpython311 \ --mount=type=bind,target=/build_cpython312,from=build_cpython312 \ --mount=type=bind,target=/build_cpython313,from=build_cpython313 \ - --mount=type=bind,target=/build_cpython313_nogil,from=build_cpython313_nogil \ --mount=type=bind,target=/build_cpython314,from=build_cpython314 \ --mount=type=bind,target=/build_cpython314_nogil,from=build_cpython314_nogil \ mkdir -p /opt/_internal && \ diff --git a/docker/tests/run_tests.sh b/docker/tests/run_tests.sh index 80f7db78..c4786c42 100755 --- a/docker/tests/run_tests.sh +++ b/docker/tests/run_tests.sh @@ -7,18 +7,18 @@ set -exuo pipefail MY_DIR=$(dirname "${BASH_SOURCE[0]}") if [ "${AUDITWHEEL_POLICY:0:10}" == "musllinux_" ]; then - EXPECTED_PYTHON_COUNT=9 - EXPECTED_PYTHON_COUNT_ALL=9 + EXPECTED_PYTHON_COUNT=8 + EXPECTED_PYTHON_COUNT_ALL=8 else if [ "${AUDITWHEEL_ARCH}" == "x86_64" ] || [ "${AUDITWHEEL_ARCH}" == "aarch64" ]; then - EXPECTED_PYTHON_COUNT=10 - EXPECTED_PYTHON_COUNT_ALL=15 + EXPECTED_PYTHON_COUNT=9 + EXPECTED_PYTHON_COUNT_ALL=14 elif [ "${AUDITWHEEL_ARCH}" == "i686" ]; then - EXPECTED_PYTHON_COUNT=10 - EXPECTED_PYTHON_COUNT_ALL=13 - else EXPECTED_PYTHON_COUNT=9 - EXPECTED_PYTHON_COUNT_ALL=9 + EXPECTED_PYTHON_COUNT_ALL=12 + else + EXPECTED_PYTHON_COUNT=8 + EXPECTED_PYTHON_COUNT_ALL=8 fi fi From cd16df235ec259474a7e3ca42ede81c4bf3f9500 Mon Sep 17 00:00:00 2001 From: mayeut Date: Sat, 6 Dec 2025 14:03:20 +0100 Subject: [PATCH 3/4] break: drop Python 3.8 --- README.rst | 2 +- docker/Dockerfile | 8 +-- docker/build_scripts/build-cpython.sh | 4 +- docker/build_scripts/finalize-one.sh | 2 +- docker/build_scripts/python_versions.json | 17 ------ docker/build_scripts/requirements3.8.txt | 72 ----------------------- docker/tests/forty-two/setup.py | 2 +- docker/tests/run_tests.sh | 16 ++--- noxfile.py | 2 +- 9 files changed, 15 insertions(+), 110 deletions(-) delete mode 100644 docker/build_scripts/requirements3.8.txt diff --git a/README.rst b/README.rst index 68715347..c4daafe9 100644 --- a/README.rst +++ b/README.rst @@ -323,7 +323,7 @@ Image content All supported images currently contain: -- CPython 3.8, 3.9, 3.10, 3.11, 3.12, 3.13, 3.14, 3.14t and PyPy 3.11 installed in +- CPython 3.9, 3.10, 3.11, 3.12, 3.13, 3.14, 3.14t and PyPy 3.11 installed in ``/opt/python/-``. The directories are named after the PEP 425 tags for each environment -- e.g. ``/opt/python/cp313-cp313`` contains a CPython 3.13 build, and diff --git a/docker/Dockerfile b/docker/Dockerfile index af4a0028..aae8b9e9 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -164,11 +164,6 @@ COPY --from=cosign-bin /ko-app/cosign /usr/local/bin/cosign COPY build_scripts/build-cpython.sh /opt/_internal/build_scripts/ -FROM build_cpython AS build_cpython38 -ARG MANYLINUX_DISABLE_CLANG_FOR_CPYTHON -RUN --mount=type=bind,from=static_clang,target=/tmp/cross-compiler,ro \ - /tmp/cross-compiler/entrypoint /opt/_internal/build_scripts/build-cpython.sh lukasz@langa.pl https://github.com/login/oauth 3.8.20 - FROM build_cpython AS build_cpython39 ARG MANYLINUX_DISABLE_CLANG_FOR_CPYTHON RUN --mount=type=bind,from=static_clang,target=/tmp/cross-compiler,ro \ @@ -212,8 +207,7 @@ COPY --from=build_zstd /manylinux-rootfs / COPY --from=build_sqlite3 /manylinux-rootfs / COPY --from=build_git /manylinux-rootfs / COPY build_scripts /opt/_internal/build_scripts/ -RUN --mount=type=bind,target=/build_cpython38,from=build_cpython38 \ - --mount=type=bind,target=/build_cpython39,from=build_cpython39 \ +RUN --mount=type=bind,target=/build_cpython39,from=build_cpython39 \ --mount=type=bind,target=/build_cpython310,from=build_cpython310 \ --mount=type=bind,target=/build_cpython311,from=build_cpython311 \ --mount=type=bind,target=/build_cpython312,from=build_cpython312 \ diff --git a/docker/build_scripts/build-cpython.sh b/docker/build_scripts/build-cpython.sh index 4d2851d3..4596a5e5 100755 --- a/docker/build_scripts/build-cpython.sh +++ b/docker/build_scripts/build-cpython.sh @@ -55,7 +55,7 @@ elif [ "${BASE_POLICY}_${AUDITWHEEL_ARCH}" == "musllinux_armv7l" ]; then fi case "${CPYTHON_VERSION}" in - 3.8.*|3.9.*|3.10.*) sed -i "s|/usr/local/include/sqlite3|/opt/_internal/sqlite3/include|g ; s|sqlite_extra_link_args = ()|sqlite_extra_link_args = ('-Wl,-rpath=/opt/_internal/sqlite3/lib',)|g" setup.py;; + 3.9.*|3.10.*) sed -i "s|/usr/local/include/sqlite3|/opt/_internal/sqlite3/include|g ; s|sqlite_extra_link_args = ()|sqlite_extra_link_args = ('-Wl,-rpath=/opt/_internal/sqlite3/lib',)|g" setup.py;; *) ;; esac @@ -63,7 +63,7 @@ OPENSSL_PREFIX=$(find /opt/_internal -maxdepth 1 -name 'openssl*') if [ "${OPENSSL_PREFIX}" != "" ]; then CONFIGURE_ARGS+=("--with-openssl=${OPENSSL_PREFIX}") case "${CPYTHON_VERSION}" in - 3.8.*|3.9.*) export LDFLAGS_EXTRA="-Wl,-rpath,${OPENSSL_PREFIX}/lib";; + 3.9.*) export LDFLAGS_EXTRA="-Wl,-rpath,${OPENSSL_PREFIX}/lib";; *) CONFIGURE_ARGS+=(--with-openssl-rpath=auto);; esac fi diff --git a/docker/build_scripts/finalize-one.sh b/docker/build_scripts/finalize-one.sh index 14096578..ec8de387 100755 --- a/docker/build_scripts/finalize-one.sh +++ b/docker/build_scripts/finalize-one.sh @@ -36,7 +36,7 @@ elif [ -f "/usr/local/bin/cpython${PY_VER}" ]; then else "${PREFIX}/bin/python" -m ensurepip case ${PY_VER} in - 3.8|3.9|3.10|3.11) "${PREFIX}/bin/python" -m pip uninstall -y setuptools;; + 3.9|3.10|3.11) "${PREFIX}/bin/python" -m pip uninstall -y setuptools;; esac "${PREFIX}/bin/python" -m pip install -U --require-hashes -r "${MY_DIR}/requirements${PY_VER}.txt" fi diff --git a/docker/build_scripts/python_versions.json b/docker/build_scripts/python_versions.json index e5464490..7db79b99 100644 --- a/docker/build_scripts/python_versions.json +++ b/docker/build_scripts/python_versions.json @@ -23,23 +23,6 @@ "sha256": "f3315d1a3f13e7fcd785d0ca9b954d251da5f5d0dedae094c28a0566a239e4fd" } }, - "pp38-pypy38_pp73": { - "x86_64": { - "version": "7.3.11", - "download_url": "https://downloads.python.org/pypy/pypy3.8-v7.3.11-linux64.tar.bz2", - "sha256": "470330e58ac105c094041aa07bb05676b06292bc61409e26f5c5593ebb2292d9" - }, - "aarch64": { - "version": "7.3.11", - "download_url": "https://downloads.python.org/pypy/pypy3.8-v7.3.11-aarch64.tar.bz2", - "sha256": "9a2fa0b8d92b7830aa31774a9a76129b0ff81afbd22cd5c41fbdd9119e859f55" - }, - "i686": { - "version": "7.3.11", - "download_url": "https://downloads.python.org/pypy/pypy3.8-v7.3.11-linux32.tar.bz2", - "sha256": "a79b31fce8f5bc1f9940b6777134189a1d3d18bda4b1c830384cda90077c9176" - } - }, "pp39-pypy39_pp73": { "x86_64": { "version": "7.3.16", diff --git a/docker/build_scripts/requirements3.8.txt b/docker/build_scripts/requirements3.8.txt deleted file mode 100644 index 57a599e2..00000000 --- a/docker/build_scripts/requirements3.8.txt +++ /dev/null @@ -1,72 +0,0 @@ -# This file was autogenerated by uv via the following command: -# nox -s update_python_dependencies -build==1.2.2.post1 \ - --hash=sha256:1d61c0887fa860c01971625baae8bdd338e517b836a2f70dd1f7aa3a6b2fc5b5 \ - --hash=sha256:b36993e92ca9375a219c99e606a122ff365a760a2d4bba0caa09bd5278b608b7 - # via -r requirements.in -importlib-metadata==8.5.0 ; python_full_version < '3.10.2' \ - --hash=sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b \ - --hash=sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7 - # via build -packaging==25.0 \ - --hash=sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 \ - --hash=sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f - # via - # -r requirements.in - # build -pip==25.0.1 ; implementation_name != 'graalpy' \ - --hash=sha256:88f96547ea48b940a3a385494e181e29fb8637898f88d88737c5049780f196ea \ - --hash=sha256:c46efd13b6aa8279f33f2864459c8ce587ea6a1a59ee20de055868d8f7688f7f - # via -r requirements.in -pyproject-hooks==1.2.0 \ - --hash=sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8 \ - --hash=sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913 - # via build -tomli==2.3.0 ; python_full_version < '3.11' \ - --hash=sha256:00b5f5d95bbfc7d12f91ad8c593a1659b6387b43f054104cda404be6bda62456 \ - --hash=sha256:0a154a9ae14bfcf5d8917a59b51ffd5a3ac1fd149b71b47a3a104ca4edcfa845 \ - --hash=sha256:0c95ca56fbe89e065c6ead5b593ee64b84a26fca063b5d71a1122bf26e533999 \ - --hash=sha256:0eea8cc5c5e9f89c9b90c4896a8deefc74f518db5927d0e0e8d4a80953d774d0 \ - --hash=sha256:1cb4ed918939151a03f33d4242ccd0aa5f11b3547d0cf30f7c74a408a5b99878 \ - --hash=sha256:4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf \ - --hash=sha256:4c2ef0244c75aba9355561272009d934953817c49f47d768070c3c94355c2aa3 \ - --hash=sha256:4dc4ce8483a5d429ab602f111a93a6ab1ed425eae3122032db7e9acf449451be \ - --hash=sha256:4f195fe57ecceac95a66a75ac24d9d5fbc98ef0962e09b2eddec5d39375aae52 \ - --hash=sha256:5192f562738228945d7b13d4930baffda67b69425a7f0da96d360b0a3888136b \ - --hash=sha256:5e01decd096b1530d97d5d85cb4dff4af2d8347bd35686654a004f8dea20fc67 \ - --hash=sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549 \ - --hash=sha256:70a251f8d4ba2d9ac2542eecf008b3c8a9fc5c3f9f02c56a9d7952612be2fdba \ - --hash=sha256:73ee0b47d4dad1c5e996e3cd33b8a76a50167ae5f96a2607cbe8cc773506ab22 \ - --hash=sha256:74bf8464ff93e413514fefd2be591c3b0b23231a77f901db1eb30d6f712fc42c \ - --hash=sha256:792262b94d5d0a466afb5bc63c7daa9d75520110971ee269152083270998316f \ - --hash=sha256:7b0882799624980785240ab732537fcfc372601015c00f7fc367c55308c186f6 \ - --hash=sha256:883b1c0d6398a6a9d29b508c331fa56adbcdff647f6ace4dfca0f50e90dfd0ba \ - --hash=sha256:88bd15eb972f3664f5ed4b57c1634a97153b4bac4479dcb6a495f41921eb7f45 \ - --hash=sha256:8a35dd0e643bb2610f156cca8db95d213a90015c11fee76c946aa62b7ae7e02f \ - --hash=sha256:940d56ee0410fa17ee1f12b817b37a4d4e4dc4d27340863cc67236c74f582e77 \ - --hash=sha256:97d5eec30149fd3294270e889b4234023f2c69747e555a27bd708828353ab606 \ - --hash=sha256:a0e285d2649b78c0d9027570d4da3425bdb49830a6156121360b3f8511ea3441 \ - --hash=sha256:a1f7f282fe248311650081faafa5f4732bdbfef5d45fe3f2e702fbc6f2d496e0 \ - --hash=sha256:a4ea38c40145a357d513bffad0ed869f13c1773716cf71ccaa83b0fa0cc4e42f \ - --hash=sha256:a56212bdcce682e56b0aaf79e869ba5d15a6163f88d5451cbde388d48b13f530 \ - --hash=sha256:ad805ea85eda330dbad64c7ea7a4556259665bdf9d2672f5dccc740eb9d3ca05 \ - --hash=sha256:b273fcbd7fc64dc3600c098e39136522650c49bca95df2d11cf3b626422392c8 \ - --hash=sha256:b5870b50c9db823c595983571d1296a6ff3e1b88f734a4c8f6fc6188397de005 \ - --hash=sha256:b74a0e59ec5d15127acdabd75ea17726ac4c5178ae51b85bfe39c4f8a278e879 \ - --hash=sha256:be71c93a63d738597996be9528f4abe628d1adf5e6eb11607bc8fe1a510b5dae \ - --hash=sha256:c22a8bf253bacc0cf11f35ad9808b6cb75ada2631c2d97c971122583b129afbc \ - --hash=sha256:c4665508bcbac83a31ff8ab08f424b665200c0e1e645d2bd9ab3d3e557b6185b \ - --hash=sha256:c5f3ffd1e098dfc032d4d3af5c0ac64f6d286d98bc148698356847b80fa4de1b \ - --hash=sha256:cebc6fe843e0733ee827a282aca4999b596241195f43b4cc371d64fc6639da9e \ - --hash=sha256:d1381caf13ab9f300e30dd8feadb3de072aeb86f1d34a8569453ff32a7dea4bf \ - --hash=sha256:d7d86942e56ded512a594786a5ba0a5e521d02529b3826e7761a05138341a2ac \ - --hash=sha256:e31d432427dcbf4d86958c184b9bfd1e96b5b71f8eb17e6d02531f434fd335b8 \ - --hash=sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b \ - --hash=sha256:f85209946d1fe94416debbb88d00eb92ce9cd5266775424ff81bc959e001acaf \ - --hash=sha256:feb0dacc61170ed7ab602d3d972a58f14ee3ee60494292d384649a3dc38ef463 \ - --hash=sha256:ff72b71b5d10d22ecb084d345fc26f42b5143c5533db5e2eaba7d2d335358876 - # via build -zipp==3.20.2 ; python_full_version < '3.10.2' \ - --hash=sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350 \ - --hash=sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29 - # via importlib-metadata diff --git a/docker/tests/forty-two/setup.py b/docker/tests/forty-two/setup.py index 34911f27..6c382efb 100644 --- a/docker/tests/forty-two/setup.py +++ b/docker/tests/forty-two/setup.py @@ -3,6 +3,6 @@ setup( name="forty_two", version="0.1.0", - python_requires=">=3.8", + python_requires=">=3.9", ext_modules=[Extension("forty_two", sources=["forty-two.c"])], ) diff --git a/docker/tests/run_tests.sh b/docker/tests/run_tests.sh index c4786c42..cdb421f3 100755 --- a/docker/tests/run_tests.sh +++ b/docker/tests/run_tests.sh @@ -7,18 +7,18 @@ set -exuo pipefail MY_DIR=$(dirname "${BASH_SOURCE[0]}") if [ "${AUDITWHEEL_POLICY:0:10}" == "musllinux_" ]; then - EXPECTED_PYTHON_COUNT=8 - EXPECTED_PYTHON_COUNT_ALL=8 + EXPECTED_PYTHON_COUNT=7 + EXPECTED_PYTHON_COUNT_ALL=7 else if [ "${AUDITWHEEL_ARCH}" == "x86_64" ] || [ "${AUDITWHEEL_ARCH}" == "aarch64" ]; then - EXPECTED_PYTHON_COUNT=9 - EXPECTED_PYTHON_COUNT_ALL=14 - elif [ "${AUDITWHEEL_ARCH}" == "i686" ]; then - EXPECTED_PYTHON_COUNT=9 + EXPECTED_PYTHON_COUNT=8 EXPECTED_PYTHON_COUNT_ALL=12 - else + elif [ "${AUDITWHEEL_ARCH}" == "i686" ]; then EXPECTED_PYTHON_COUNT=8 - EXPECTED_PYTHON_COUNT_ALL=8 + EXPECTED_PYTHON_COUNT_ALL=10 + else + EXPECTED_PYTHON_COUNT=7 + EXPECTED_PYTHON_COUNT_ALL=7 fi fi diff --git a/noxfile.py b/noxfile.py index df9b3922..173e76ac 100644 --- a/noxfile.py +++ b/noxfile.py @@ -19,7 +19,7 @@ def update_python_dependencies(session): # regenerate the constraints files env["UV_CUSTOM_COMPILE_COMMAND"] = f"nox -s {session.name}" - for python_minor in range(8, 15): + for python_minor in range(9, 15): python_version = f"3.{python_minor}" session.run( "uv", From 3d76e92a3bb2e4ca8d03e65a7ef2d8e081d3a2f0 Mon Sep 17 00:00:00 2001 From: mayeut Date: Sat, 6 Dec 2025 14:10:52 +0100 Subject: [PATCH 4/4] feat: add CPython 3.15 --- README.rst | 6 +++--- docker/Dockerfile | 14 +++++++++++++- docker/build_scripts/requirements3.15.txt | 20 ++++++++++++++++++++ docker/tests/run_tests.sh | 16 ++++++++-------- noxfile.py | 2 +- 5 files changed, 45 insertions(+), 13 deletions(-) create mode 100644 docker/build_scripts/requirements3.15.txt diff --git a/README.rst b/README.rst index c4daafe9..e6ec7b9a 100644 --- a/README.rst +++ b/README.rst @@ -323,12 +323,12 @@ Image content All supported images currently contain: -- CPython 3.9, 3.10, 3.11, 3.12, 3.13, 3.14, 3.14t and PyPy 3.11 installed in +- CPython 3.9, 3.10, 3.11, 3.12, 3.13, 3.14, 3.14t, 3.15, 3.15t and PyPy 3.11 installed in ``/opt/python/-``. The directories are named after the PEP 425 tags for each environment -- - e.g. ``/opt/python/cp313-cp313`` contains a CPython 3.13 build, and + e.g. ``/opt/python/cp314-cp314`` contains a CPython 3.14 build, and can be used to produce wheels named like - ``--cp313-cp313-.whl``. + ``--cp314-cp314-.whl``. - Development packages for all the libraries that PEP 571/599 list. One should not assume the presence of any other development package. diff --git a/docker/Dockerfile b/docker/Dockerfile index aae8b9e9..785c744a 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -199,6 +199,16 @@ ARG MANYLINUX_DISABLE_CLANG_FOR_CPYTHON RUN --mount=type=bind,from=static_clang,target=/tmp/cross-compiler,ro \ /tmp/cross-compiler/entrypoint /opt/_internal/build_scripts/build-cpython.sh hugo@python.org https://github.com/login/oauth 3.14.2 nogil +FROM build_cpython AS build_cpython315 +ARG MANYLINUX_DISABLE_CLANG_FOR_CPYTHON +RUN --mount=type=bind,from=static_clang,target=/tmp/cross-compiler,ro \ + /tmp/cross-compiler/entrypoint /opt/_internal/build_scripts/build-cpython.sh hugo@python.org https://github.com/login/oauth 3.15.0a2 + +FROM build_cpython AS build_cpython315_nogil +ARG MANYLINUX_DISABLE_CLANG_FOR_CPYTHON +RUN --mount=type=bind,from=static_clang,target=/tmp/cross-compiler,ro \ + /tmp/cross-compiler/entrypoint /opt/_internal/build_scripts/build-cpython.sh hugo@python.org https://github.com/login/oauth 3.15.0a2 nogil + FROM runtime_base COPY --from=build_tcl_tk /manylinux-rootfs / @@ -214,9 +224,11 @@ RUN --mount=type=bind,target=/build_cpython39,from=build_cpython39 \ --mount=type=bind,target=/build_cpython313,from=build_cpython313 \ --mount=type=bind,target=/build_cpython314,from=build_cpython314 \ --mount=type=bind,target=/build_cpython314_nogil,from=build_cpython314_nogil \ + --mount=type=bind,target=/build_cpython315,from=build_cpython315 \ + --mount=type=bind,target=/build_cpython315_nogil,from=build_cpython315_nogil \ mkdir -p /opt/_internal && \ cp -rf /build_cpython*/opt/_internal/cpython* /opt/_internal/ && \ - if test -n "$(find /build_cpython314/opt/_internal -maxdepth 1 -name 'openssl*' -print -quit)"; then cp -rf /build_cpython314/opt/_internal/openssl* /opt/_internal/; fi && \ + if test -n "$(find /build_cpython315/opt/_internal -maxdepth 1 -name 'openssl*' -print -quit)"; then cp -rf /build_cpython315/opt/_internal/openssl* /opt/_internal/; fi && \ manylinux-entrypoint /opt/_internal/build_scripts/finalize.sh \ pp311-pypy311_pp73 diff --git a/docker/build_scripts/requirements3.15.txt b/docker/build_scripts/requirements3.15.txt new file mode 100644 index 00000000..2e1a1fc5 --- /dev/null +++ b/docker/build_scripts/requirements3.15.txt @@ -0,0 +1,20 @@ +# This file was autogenerated by uv via the following command: +# nox -s update_python_dependencies +build==1.3.0 \ + --hash=sha256:698edd0ea270bde950f53aed21f3a0135672206f3911e0176261a31e0e07b397 \ + --hash=sha256:7145f0b5061ba90a1500d60bd1b13ca0a8a4cebdd0cc16ed8adf1c0e739f43b4 + # via -r requirements.in +packaging==25.0 \ + --hash=sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 \ + --hash=sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f + # via + # -r requirements.in + # build +pip==25.3 ; implementation_name != 'graalpy' \ + --hash=sha256:8d0538dbbd7babbd207f261ed969c65de439f6bc9e5dbd3b3b9a77f25d95f343 \ + --hash=sha256:9655943313a94722b7774661c21049070f6bbb0a1516bf02f7c8d5d9201514cd + # via -r requirements.in +pyproject-hooks==1.2.0 \ + --hash=sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8 \ + --hash=sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913 + # via build diff --git a/docker/tests/run_tests.sh b/docker/tests/run_tests.sh index cdb421f3..1281dba4 100755 --- a/docker/tests/run_tests.sh +++ b/docker/tests/run_tests.sh @@ -7,18 +7,18 @@ set -exuo pipefail MY_DIR=$(dirname "${BASH_SOURCE[0]}") if [ "${AUDITWHEEL_POLICY:0:10}" == "musllinux_" ]; then - EXPECTED_PYTHON_COUNT=7 - EXPECTED_PYTHON_COUNT_ALL=7 + EXPECTED_PYTHON_COUNT=9 + EXPECTED_PYTHON_COUNT_ALL=9 else if [ "${AUDITWHEEL_ARCH}" == "x86_64" ] || [ "${AUDITWHEEL_ARCH}" == "aarch64" ]; then - EXPECTED_PYTHON_COUNT=8 - EXPECTED_PYTHON_COUNT_ALL=12 + EXPECTED_PYTHON_COUNT=10 + EXPECTED_PYTHON_COUNT_ALL=14 elif [ "${AUDITWHEEL_ARCH}" == "i686" ]; then - EXPECTED_PYTHON_COUNT=8 - EXPECTED_PYTHON_COUNT_ALL=10 + EXPECTED_PYTHON_COUNT=10 + EXPECTED_PYTHON_COUNT_ALL=12 else - EXPECTED_PYTHON_COUNT=7 - EXPECTED_PYTHON_COUNT_ALL=7 + EXPECTED_PYTHON_COUNT=9 + EXPECTED_PYTHON_COUNT_ALL=9 fi fi diff --git a/noxfile.py b/noxfile.py index 173e76ac..7d670439 100644 --- a/noxfile.py +++ b/noxfile.py @@ -19,7 +19,7 @@ def update_python_dependencies(session): # regenerate the constraints files env["UV_CUSTOM_COMPILE_COMMAND"] = f"nox -s {session.name}" - for python_minor in range(9, 15): + for python_minor in range(9, 16): python_version = f"3.{python_minor}" session.run( "uv",