Skip to content

Commit 8bc6a94

Browse files
committed
feat: Add manylinux_2_34 image
1 parent 303f8c2 commit 8bc6a94

14 files changed

+205
-121
lines changed

.github/workflows/build.yml

+6-5
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,13 @@ jobs:
3636
strategy:
3737
fail-fast: false
3838
matrix:
39-
policy: ["manylinux2014", "musllinux_1_2"]
40-
platform: ["i686", "x86_64"]
39+
policy: ["manylinux2014", "manylinux_2_28", "manylinux_2_34", "musllinux_1_2"]
40+
platform: ["x86_64"]
4141
include:
42-
- policy: "manylinux_2_28"
43-
platform: "x86_64"
44-
42+
- policy: "manylinux2014"
43+
platform: "i686"
44+
- policy: "musllinux_1_2"
45+
platform: "i686"
4546
env:
4647
POLICY: ${{ matrix.policy }}
4748
PLATFORM: ${{ matrix.platform }}

.travis.yml

+8
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,14 @@ jobs:
4545
env: POLICY="manylinux_2_28" PLATFORM="s390x"
4646
- arch: ppc64le
4747
env: POLICY="manylinux_2_28" PLATFORM="ppc64le"
48+
- arch: arm64-graviton2
49+
virt: vm
50+
group: edge
51+
env: POLICY="manylinux_2_34" PLATFORM="aarch64"
52+
- arch: s390x
53+
env: POLICY="manylinux_2_34" PLATFORM="s390x"
54+
- arch: ppc64le
55+
env: POLICY="manylinux_2_34" PLATFORM="ppc64le"
4856
- arch: arm64-graviton2
4957
virt: vm
5058
group: edge

README.rst

+20
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ The manylinux project supports:
3737

3838
- ``manylinux_2_28`` images for ``x86_64``, ``aarch64``, ``ppc64le`` and ``s390x``.
3939

40+
- ``manylinux_2_34`` images for ``x86_64``, ``aarch64``, ``ppc64le`` and ``s390x``.
41+
4042
- ``musllinux_1_2`` images for ``x86_64``, ``i686``, ``aarch64``, ``ppc64le``, ``s390x`` and ``armv7l``.
4143

4244

@@ -92,6 +94,24 @@ etc., we provide `Docker <https://docker.com/>`_ images where we've
9294
done the work for you. The images are uploaded to `quay.io`_ and are tagged
9395
for repeatable builds.
9496

97+
manylinux_2_34 (AlmaLinux 9 based)
98+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
99+
100+
Toolchain: GCC 13
101+
102+
- x86_64 image: ``quay.io/pypa/manylinux_2_34_x86_64``
103+
- aarch64 image: ``quay.io/pypa/manylinux_2_34_aarch64``
104+
- ppc64le image: ``quay.io/pypa/manylinux_2_34_ppc64le``
105+
- s390x image: ``quay.io/pypa/manylinux_2_34_s390x``
106+
107+
Built wheels are also expected to be compatible with other
108+
distros using glibc 2.34 or later, including:
109+
110+
- Debian 12+
111+
- Ubuntu 21.10+
112+
- Fedora 35+
113+
- CentOS/RHEL 9+
114+
95115

96116
manylinux_2_28 (AlmaLinux 8 based)
97117
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

build.sh

+9-10
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,16 @@ export PLATFORM
1414
# get docker default multiarch image prefix for PLATFORM
1515
if [ "${PLATFORM}" == "x86_64" ]; then
1616
GOARCH="amd64"
17-
MULTIARCH_PREFIX="amd64/"
1817
elif [ "${PLATFORM}" == "i686" ]; then
1918
GOARCH="386"
20-
MULTIARCH_PREFIX="i386/"
2119
elif [ "${PLATFORM}" == "aarch64" ]; then
2220
GOARCH="arm64"
23-
MULTIARCH_PREFIX="arm64v8/"
2421
elif [ "${PLATFORM}" == "ppc64le" ]; then
2522
GOARCH="ppc64le"
26-
MULTIARCH_PREFIX="ppc64le/"
2723
elif [ "${PLATFORM}" == "s390x" ]; then
2824
GOARCH="s390x"
29-
MULTIARCH_PREFIX="s390x/"
3025
elif [ "${PLATFORM}" == "armv7l" ]; then
3126
GOARCH="arm/v7"
32-
MULTIARCH_PREFIX="arm32v7/"
3327
else
3428
echo "Unsupported platform: '${PLATFORM}'"
3529
exit 1
@@ -38,9 +32,9 @@ fi
3832
# setup BASEIMAGE and its specific properties
3933
if [ "${POLICY}" == "manylinux2014" ]; then
4034
if [ "${PLATFORM}" == "s390x" ]; then
41-
BASEIMAGE="s390x/clefos:7"
35+
BASEIMAGE="clefos:7"
4236
else
43-
BASEIMAGE="${MULTIARCH_PREFIX}centos:7"
37+
BASEIMAGE="centos:7"
4438
fi
4539
DEVTOOLSET_ROOTPATH="/opt/rh/devtoolset-10/root"
4640
PREPEND_PATH="${DEVTOOLSET_ROOTPATH}/usr/bin:"
@@ -50,12 +44,17 @@ if [ "${POLICY}" == "manylinux2014" ]; then
5044
LD_LIBRARY_PATH_ARG="${DEVTOOLSET_ROOTPATH}/usr/lib64:${DEVTOOLSET_ROOTPATH}/usr/lib:${DEVTOOLSET_ROOTPATH}/usr/lib64/dyninst:${DEVTOOLSET_ROOTPATH}/usr/lib/dyninst:/usr/local/lib64"
5145
fi
5246
elif [ "${POLICY}" == "manylinux_2_28" ]; then
53-
BASEIMAGE="${MULTIARCH_PREFIX}almalinux:8"
47+
BASEIMAGE="almalinux:8"
48+
DEVTOOLSET_ROOTPATH="/opt/rh/gcc-toolset-13/root"
49+
PREPEND_PATH="${DEVTOOLSET_ROOTPATH}/usr/bin:"
50+
LD_LIBRARY_PATH_ARG="${DEVTOOLSET_ROOTPATH}/usr/lib64:${DEVTOOLSET_ROOTPATH}/usr/lib:${DEVTOOLSET_ROOTPATH}/usr/lib64/dyninst:${DEVTOOLSET_ROOTPATH}/usr/lib/dyninst"
51+
elif [ "${POLICY}" == "manylinux_2_34" ]; then
52+
BASEIMAGE="almalinux:9"
5453
DEVTOOLSET_ROOTPATH="/opt/rh/gcc-toolset-13/root"
5554
PREPEND_PATH="${DEVTOOLSET_ROOTPATH}/usr/bin:"
5655
LD_LIBRARY_PATH_ARG="${DEVTOOLSET_ROOTPATH}/usr/lib64:${DEVTOOLSET_ROOTPATH}/usr/lib:${DEVTOOLSET_ROOTPATH}/usr/lib64/dyninst:${DEVTOOLSET_ROOTPATH}/usr/lib/dyninst"
5756
elif [ "${POLICY}" == "musllinux_1_2" ]; then
58-
BASEIMAGE="${MULTIARCH_PREFIX}alpine:3.20"
57+
BASEIMAGE="alpine:3.20"
5958
DEVTOOLSET_ROOTPATH=
6059
PREPEND_PATH=
6160
LD_LIBRARY_PATH_ARG=

docker/Dockerfile

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# default to latest supported policy, x86_64
2-
ARG BASEIMAGE=amd64/almalinux:8
3-
ARG POLICY=manylinux_2_28
2+
ARG BASEIMAGE=amd64/almalinux:9
3+
ARG POLICY=manylinux_2_34
44
ARG PLATFORM=x86_64
5-
ARG DEVTOOLSET_ROOTPATH=/opt/rh/gcc-toolset-12/root
5+
ARG DEVTOOLSET_ROOTPATH=/opt/rh/gcc-toolset-13/root
66
ARG LD_LIBRARY_PATH_ARG=${DEVTOOLSET_ROOTPATH}/usr/lib64:${DEVTOOLSET_ROOTPATH}/usr/lib:${DEVTOOLSET_ROOTPATH}/usr/lib64/dyninst:${DEVTOOLSET_ROOTPATH}/usr/lib/dyninst
77
ARG PREPEND_PATH=${DEVTOOLSET_ROOTPATH}/usr/bin:
88

docker/build_scripts/build-cpython.sh

+10
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,14 @@ if [ "${BASE_POLICY}_${AUDITWHEEL_ARCH}" == "musllinux_armv7l" ]; then
5454
CONFIGURE_ARGS="${CONFIGURE_ARGS} --build=arm-linux-musleabihf"
5555
fi
5656

57+
SQLITE_PREFIX=$(find /opt/_internal -maxdepth 1 -name 'sqlite*')
58+
if [ "${SQLITE_PREFIX}" != "" ]; then
59+
case "${CPYTHON_VERSION}" in
60+
3.6.*|3.7.*|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,--enable-new-dtags,-rpath=/opt/_internal/sqlite3/lib',)|g" setup.py;;
61+
*) ;;
62+
esac
63+
fi
64+
5765
OPENSSL_PREFIX=$(find /opt/_internal -maxdepth 1 -name 'openssl*')
5866
if [ "${OPENSSL_PREFIX}" != "" ]; then
5967
CONFIGURE_ARGS="${CONFIGURE_ARGS} --with-openssl=${OPENSSL_PREFIX}"
@@ -63,6 +71,8 @@ if [ "${OPENSSL_PREFIX}" != "" ]; then
6371
esac
6472
fi
6573

74+
unset _PYTHON_HOST_PLATFORM
75+
6676
# configure with hardening options only for the interpreter & stdlib C extensions
6777
# do not change the default for user built extension (yet?)
6878
./configure \

docker/build_scripts/build-openssl.sh

+4-4
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,10 @@ if [ "${SMALLEST}" = "${OPENSSL_MIN_VERSION}" ]; then
2929
exit 0
3030
fi
3131
32-
if which yum; then
33-
yum erase -y openssl-devel
34-
else
35-
apk del openssl-dev
32+
if [ "${OS_ID_LIKE}" = "rhel" ];then
33+
manylinux_pkg_remove openssl-devel
34+
elif [ "${OS_ID_LIKE}" = "alpine" ]; then
35+
manylinux_pkg_remove openssl-dev
3636
fi
3737
3838
PREFIX=/opt/_internal/openssl-${OPENSSL_VERSION%.*}

docker/build_scripts/build-sqlite3.sh

+23-10
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ MY_DIR=$(dirname "${BASH_SOURCE[0]}")
1010
# Get build utilities
1111
source $MY_DIR/build_utils.sh
1212

13+
if [ "${AUDITWHEEL_POLICY}" == "manylinux2014" ] || [ "${AUDITWHEEL_POLICY}" == "manylinux_2_28" ] || [ "${AUDITWHEEL_POLICY}" == "musllinux_1_2" ]; then
14+
PREFIX=/usr/local
15+
else
16+
PREFIX=/opt/_internal/sqlite3
17+
fi
18+
1319
# Install a more recent SQLite3
1420
check_var ${SQLITE_AUTOCONF_ROOT}
1521
check_var ${SQLITE_AUTOCONF_HASH}
@@ -18,23 +24,30 @@ fetch_source ${SQLITE_AUTOCONF_ROOT}.tar.gz ${SQLITE_AUTOCONF_DOWNLOAD_URL}
1824
check_sha256sum ${SQLITE_AUTOCONF_ROOT}.tar.gz ${SQLITE_AUTOCONF_HASH}
1925
tar xfz ${SQLITE_AUTOCONF_ROOT}.tar.gz
2026
pushd ${SQLITE_AUTOCONF_ROOT}
21-
DESTDIR=/manylinux-rootfs do_standard_install
27+
# add rpath
28+
sed -i "s|^Libs:|Libs: -Wl,--enable-new-dtags,-rpath=\${libdir} |g" sqlite3.pc.in
29+
DESTDIR=/manylinux-rootfs do_standard_install --prefix=${PREFIX}
2230
popd
2331
rm -rf ${SQLITE_AUTOCONF_ROOT} ${SQLITE_AUTOCONF_ROOT}.tar.gz
2432

25-
# static library is unused, remove it
26-
rm /manylinux-rootfs/usr/local/lib/libsqlite3.a
33+
# Remove unused files
34+
rm /manylinux-rootfs${PREFIX}/lib/libsqlite3.a
35+
rm -rf /manylinux-rootfs${PREFIX}/share
2736

2837
# Strip what we can
2938
strip_ /manylinux-rootfs
3039

3140
# Install
3241
cp -rlf /manylinux-rootfs/* /
33-
if [ "${BASE_POLICY}" == "musllinux" ]; then
34-
ldconfig /
35-
elif [ "${BASE_POLICY}" == "manylinux" ]; then
36-
ldconfig
37-
fi
3842

39-
# Clean-up for runtime
40-
rm -rf /manylinux-rootfs/usr/local/share
43+
if [ "${PREFIX}" == "/usr/local" ]; then
44+
if [ "${BASE_POLICY}" == "musllinux" ]; then
45+
ldconfig /
46+
elif [ "${BASE_POLICY}" == "manylinux" ]; then
47+
ldconfig
48+
fi
49+
else
50+
# python >= 3.11
51+
mkdir -p /usr/local/lib/pkgconfig/
52+
ln -s ${PREFIX}/lib/pkgconfig/sqlite3.pc /usr/local/lib/pkgconfig/sqlite3.pc
53+
fi

docker/build_scripts/build_utils.sh

+82-27
Original file line numberDiff line numberDiff line change
@@ -10,50 +10,67 @@ MANYLINUX_CFLAGS="-g -O2 -Wall -fdebug-prefix-map=/=. -fstack-protector-strong -
1010
MANYLINUX_CXXFLAGS="-g -O2 -Wall -fdebug-prefix-map=/=. -fstack-protector-strong -Wformat -Werror=format-security"
1111
MANYLINUX_LDFLAGS="-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now"
1212

13-
export BASE_POLICY=manylinux
1413
if [ "${AUDITWHEEL_POLICY:0:10}" == "musllinux_" ]; then
1514
export BASE_POLICY=musllinux
15+
PACKAGE_MANAGER=apk
16+
else
17+
export BASE_POLICY=manylinux
18+
if command -v dnf >/dev/null 2>&1; then
19+
PACKAGE_MANAGER=dnf
20+
elif command -v yum >/dev/null 2>&1; then
21+
PACKAGE_MANAGER=yum
22+
else
23+
echo "unsupported image"
24+
exit 1
25+
fi
1626
fi
1727

28+
OS_ID_LIKE=$(. /etc/os-release; echo "${ID} ${ID_LIKE:-}")
29+
case "${OS_ID_LIKE}" in
30+
*rhel*) OS_ID_LIKE=rhel;;
31+
*alpine*) OS_ID_LIKE=alpine;;
32+
*) echo "unsupported image"; exit 1;;
33+
esac
34+
1835
function check_var {
19-
if [ -z "$1" ]; then
20-
echo "required variable not defined"
21-
exit 1
22-
fi
36+
if [ -z "$1" ]; then
37+
echo "required variable not defined"
38+
exit 1
39+
fi
2340
}
2441

2542

2643
function fetch_source {
27-
# This is called both inside and outside the build context (e.g. in Travis) to prefetch
28-
# source tarballs, where curl exists (and works)
29-
local file=$1
30-
check_var ${file}
31-
local url=$2
32-
check_var ${url}
33-
if [ -f ${file} ]; then
34-
echo "${file} exists, skipping fetch"
35-
else
36-
curl -fsSL -o ${file} ${url}/${file}
37-
fi
44+
# This is called both inside and outside the build context (e.g. in Travis) to prefetch
45+
# source tarballs, where curl exists (and works)
46+
local file=$1
47+
check_var ${file}
48+
local url=$2
49+
check_var ${url}
50+
if [ -f ${file} ]; then
51+
echo "${file} exists, skipping fetch"
52+
else
53+
curl -fsSL -o ${file} ${url}/${file}
54+
fi
3855
}
3956

4057

4158
function check_sha256sum {
42-
local fname=$1
43-
check_var ${fname}
44-
local sha256=$2
45-
check_var ${sha256}
46-
47-
echo "${sha256} ${fname}" > ${fname}.sha256
48-
sha256sum -c ${fname}.sha256
49-
rm -f ${fname}.sha256
59+
local fname=$1
60+
check_var ${fname}
61+
local sha256=$2
62+
check_var ${sha256}
63+
64+
echo "${sha256} ${fname}" > ${fname}.sha256
65+
sha256sum -c ${fname}.sha256
66+
rm -f ${fname}.sha256
5067
}
5168

5269

5370
function do_standard_install {
54-
./configure "$@" CPPFLAGS="${MANYLINUX_CPPFLAGS}" CFLAGS="${MANYLINUX_CFLAGS}" "CXXFLAGS=${MANYLINUX_CXXFLAGS}" LDFLAGS="${MANYLINUX_LDFLAGS}" > /dev/null
55-
make > /dev/null
56-
make install > /dev/null
71+
./configure "$@" CPPFLAGS="${MANYLINUX_CPPFLAGS}" CFLAGS="${MANYLINUX_CFLAGS}" "CXXFLAGS=${MANYLINUX_CXXFLAGS}" LDFLAGS="${MANYLINUX_LDFLAGS}" > /dev/null
72+
make > /dev/null
73+
make install > /dev/null
5774
}
5875

5976
function strip_ {
@@ -65,3 +82,41 @@ function strip_ {
6582
function clean_pyc {
6683
find $1 -type f -a \( -name '*.pyc' -o -name '*.pyo' \) -delete
6784
}
85+
86+
function manylinux_pkg_install {
87+
if [ "${PACKAGE_MANAGER}" = "yum" ]; then
88+
yum -y install "$@"
89+
elif [ "${PACKAGE_MANAGER}" = "dnf" ]; then
90+
dnf -y install --allowerasing "$@"
91+
elif [ "${PACKAGE_MANAGER}" = "apk" ]; then
92+
apk add --no-cache "$@"
93+
else
94+
return 1
95+
fi
96+
}
97+
98+
function manylinux_pkg_remove {
99+
if [ "${PACKAGE_MANAGER}" = "yum" ]; then
100+
yum erase -y "$@"
101+
elif [ "${PACKAGE_MANAGER}" = "dnf" ];then
102+
dnf erase -y "$@"
103+
elif [ "${PACKAGE_MANAGER}" = "apk" ]; then
104+
apk del "$@"
105+
else
106+
return 1
107+
fi
108+
}
109+
110+
function manylinux_pkg_clean {
111+
if [ "${PACKAGE_MANAGER}" = "yum" ]; then
112+
yum clean all
113+
rm -rf /var/cache/yum
114+
elif [ "${PACKAGE_MANAGER}" = "dnf" ]; then
115+
dnf clean all
116+
rm -rf /var/cache/dnf
117+
elif [ "${PACKAGE_MANAGER}" = "apk" ]; then
118+
:
119+
else
120+
return 1
121+
fi
122+
}

0 commit comments

Comments
 (0)