Skip to content

Commit 48669de

Browse files
committed
feat: Add manylinux_2_34 image
1 parent 121c3e3 commit 48669de

13 files changed

+249
-127
lines changed

.github/workflows/build.yml

Lines changed: 6 additions & 5 deletions
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

Lines changed: 8 additions & 0 deletions
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

Lines changed: 20 additions & 0 deletions
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

Lines changed: 14 additions & 10 deletions
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,22 @@ 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"
5448
DEVTOOLSET_ROOTPATH="/opt/rh/gcc-toolset-12/root"
5549
PREPEND_PATH="${DEVTOOLSET_ROOTPATH}/usr/bin:"
5650
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_31" ]; then
52+
BASEIMAGE="ubuntu:20.04"
53+
DEVTOOLSET_ROOTPATH=
54+
PREPEND_PATH=
55+
LD_LIBRARY_PATH_ARG=
56+
elif [ "${POLICY}" == "manylinux_2_34" ]; then
57+
BASEIMAGE="almalinux:9"
58+
DEVTOOLSET_ROOTPATH="/opt/rh/gcc-toolset-13/root"
59+
PREPEND_PATH="${DEVTOOLSET_ROOTPATH}/usr/bin:"
60+
LD_LIBRARY_PATH_ARG="${DEVTOOLSET_ROOTPATH}/usr/lib64:${DEVTOOLSET_ROOTPATH}/usr/lib:${DEVTOOLSET_ROOTPATH}/usr/lib64/dyninst:${DEVTOOLSET_ROOTPATH}/usr/lib/dyninst"
5761
elif [ "${POLICY}" == "musllinux_1_2" ]; then
58-
BASEIMAGE="${MULTIARCH_PREFIX}alpine:3.20"
62+
BASEIMAGE="alpine:3.20"
5963
DEVTOOLSET_ROOTPATH=
6064
PREPEND_PATH=
6165
LD_LIBRARY_PATH_ARG=

docker/Dockerfile

Lines changed: 3 additions & 3 deletions
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

Lines changed: 8 additions & 0 deletions
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}"

docker/build_scripts/build-openssl.sh

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,12 @@ 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}" = "debian" ];then
35+
manylinux_pkg_remove libssl-dev
36+
elif [ "${OS_ID_LIKE}" = "alpine" ]; then
37+
manylinux_pkg_remove openssl-dev
3638
fi
3739
3840
PREFIX=/opt/_internal/openssl-${OPENSSL_VERSION%.*}

docker/build_scripts/build-sqlite3.sh

Lines changed: 23 additions & 10 deletions
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

Lines changed: 93 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -10,50 +10,70 @@ 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+
elif command -v apt-get >/dev/null 2>&1; then
23+
PACKAGE_MANAGER=apt
24+
else
25+
echo "unsupported image"
26+
exit 1
27+
fi
1628
fi
1729

30+
OS_ID_LIKE=$(. /etc/os-release; echo "${ID} ${ID_LIKE:-}")
31+
case "${OS_ID_LIKE}" in
32+
*rhel*) OS_ID_LIKE=rhel;;
33+
*debian) OS_ID_LIKE=debian;;
34+
*alpine*) OS_ID_LIKE=alpine;;
35+
*) echo "unsupported image"; exit 1;;
36+
esac
37+
1838
function check_var {
19-
if [ -z "$1" ]; then
20-
echo "required variable not defined"
21-
exit 1
22-
fi
39+
if [ -z "$1" ]; then
40+
echo "required variable not defined"
41+
exit 1
42+
fi
2343
}
2444

2545

2646
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
47+
# This is called both inside and outside the build context (e.g. in Travis) to prefetch
48+
# source tarballs, where curl exists (and works)
49+
local file=$1
50+
check_var ${file}
51+
local url=$2
52+
check_var ${url}
53+
if [ -f ${file} ]; then
54+
echo "${file} exists, skipping fetch"
55+
else
56+
curl -fsSL -o ${file} ${url}/${file}
57+
fi
3858
}
3959

4060

4161
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
62+
local fname=$1
63+
check_var ${fname}
64+
local sha256=$2
65+
check_var ${sha256}
66+
67+
echo "${sha256} ${fname}" > ${fname}.sha256
68+
sha256sum -c ${fname}.sha256
69+
rm -f ${fname}.sha256
5070
}
5171

5272

5373
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
74+
./configure "$@" CPPFLAGS="${MANYLINUX_CPPFLAGS}" CFLAGS="${MANYLINUX_CFLAGS}" "CXXFLAGS=${MANYLINUX_CXXFLAGS}" LDFLAGS="${MANYLINUX_LDFLAGS}" > /dev/null
75+
make > /dev/null
76+
make install > /dev/null
5777
}
5878

5979
function strip_ {
@@ -65,3 +85,49 @@ function strip_ {
6585
function clean_pyc {
6686
find $1 -type f -a \( -name '*.pyc' -o -name '*.pyo' \) -delete
6787
}
88+
89+
function manylinux_pkg_install {
90+
if [ "${PACKAGE_MANAGER}" = "yum" ]; then
91+
yum -y install "$@"
92+
elif [ "${PACKAGE_MANAGER}" = "dnf" ]; then
93+
dnf -y install --allowerasing "$@"
94+
elif [ "${PACKAGE_MANAGER}" = "apt" ]; then
95+
DEBIAN_FRONTEND=noninteractive apt-get update -qq
96+
DEBIAN_FRONTEND=noninteractive apt-get install -qq -y --no-install-recommends "$@"
97+
elif [ "${PACKAGE_MANAGER}" = "apk" ]; then
98+
apk add --no-cache "$@"
99+
else
100+
return 1
101+
fi
102+
}
103+
104+
function manylinux_pkg_remove {
105+
if [ "${PACKAGE_MANAGER}" = "dnf" ];then
106+
dnf erase -y "$@"
107+
elif [ "${PACKAGE_MANAGER}" = "yum" ]; then
108+
yum erase -y "$@"
109+
elif [ "${PACKAGE_MANAGER}" = "apt" ];then
110+
DEBIAN_FRONTEND=noninteractive apt-get remove -y "$@"
111+
elif [ "${PACKAGE_MANAGER}" = "apk" ]; then
112+
apk del "$@"
113+
else
114+
return 1
115+
fi
116+
}
117+
118+
function manylinux_pkg_clean {
119+
if [ "${PACKAGE_MANAGER}" = "yum" ]; then
120+
yum clean all
121+
rm -rf /var/cache/yum
122+
elif [ "${PACKAGE_MANAGER}" = "dnf" ]; then
123+
dnf clean all
124+
rm -rf /var/cache/dnf
125+
elif [ "${PACKAGE_MANAGER}" = "apt" ]; then
126+
DEBIAN_FRONTEND=noninteractive apt-get clean -qq
127+
rm -rf /var/lib/apt/lists/*
128+
elif [ "${PACKAGE_MANAGER}" = "apk" ]; then
129+
:
130+
else
131+
return 1
132+
fi
133+
}

0 commit comments

Comments
 (0)