|
| 1 | +# syntax=docker/dockerfile:1 |
| 2 | +ARG PYTHON_NAME="python3.12" |
| 3 | +ARG PYTHON_VERSION="3.12.2-1" |
| 4 | +ARG DIST_NAME="trixie" |
| 5 | + |
| 6 | +# -------------------- Preparation -------------------- |
| 7 | +FROM debian:bookworm-slim AS pre-build |
| 8 | +ARG DIST_NAME |
| 9 | +RUN echo "\ |
| 10 | +Types: deb-src\n\ |
| 11 | +URIs: http://deb.debian.org/debian\n\ |
| 12 | +Suites: ${DIST_NAME}\n\ |
| 13 | +Components: main\n\ |
| 14 | +Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg" \ |
| 15 | +> /etc/apt/sources.list.d/${DIST_NAME}-src.sources |
| 16 | +RUN apt-get update && \ |
| 17 | + apt-get upgrade -y && \ |
| 18 | + apt-get install -y --no-install-recommends devscripts equivs |
| 19 | + |
| 20 | +# -------------------- Source preperation -------------------- |
| 21 | +FROM pre-build AS source |
| 22 | +ARG PYTHON_NAME |
| 23 | +ARG PYTHON_VERSION |
| 24 | +WORKDIR /usr/local/src |
| 25 | +RUN apt-get source --download-only ${PYTHON_NAME}=${PYTHON_VERSION} && \ |
| 26 | + dpkg-source -x --skip-patches ${PYTHON_NAME}*.dsc && \ |
| 27 | + mv ${PYTHON_NAME}*/ python-source |
| 28 | +WORKDIR python-source |
| 29 | +ADD ensurepip-enabled.diff debian/patches |
| 30 | +RUN sed -i '/^ensurepip-disabled.diff$/s/^/#/' debian/patches/series && \ |
| 31 | + echo 'ensurepip-enabled.diff' >> debian/patches/series |
| 32 | + |
| 33 | +ADD changelog_previous . |
| 34 | +RUN if [ -s changelog_previous ]; then echo "$(cat changelog_previous)\n\ |
| 35 | +\n\ |
| 36 | +$(cat debian/changelog)" > debian/changelog; fi |
| 37 | +ARG NAME |
| 38 | +ARG EMAIL |
| 39 | +ARG CHANGE |
| 40 | +RUN dch --bpo "$CHANGE" |
| 41 | + |
| 42 | +# -------------------- Build preperation -------------------- |
| 43 | +FROM pre-build AS build-system |
| 44 | +# These packages would be installed by mk-build-deps for all architectures |
| 45 | +# so make sure they are only downloaded once |
| 46 | +# This command is allowed to fail however if something changes in the future |
| 47 | +RUN apt-get install -y --no-install-recommends \ |
| 48 | + diffstat docutils-common ed fontconfig-config fonts-dejavu-core libbrotli1 \ |
| 49 | + libbsd0 libc-l10n libdrm-amdgpu1 libdrm-common libdrm-intel1 libdrm-nouveau2 \ |
| 50 | + libdrm-radeon1 libdrm2 libedit2 libfontconfig1 libfontenc1 libfreetype6 libgl1 \ |
| 51 | + libgl1-mesa-dri libglapi-mesa libglvnd0 libglx-mesa0 libglx0 libice6 \ |
| 52 | + libjs-jquery libjs-sphinxdoc libjs-underscore libjson-perl libllvm15 \ |
| 53 | + libpciaccess0 libpixman-1-0 libpkgconf3 libpng16-16 libsensors-config \ |
| 54 | + libsensors5 libsm6 libtcl8.6 libtext-unidecode-perl libtk8.6 libunwind8 \ |
| 55 | + libx11-6 libx11-data libx11-xcb1 libxau6 libxaw7 libxcb-dri2-0 libxcb-dri3-0 \ |
| 56 | + libxcb-glx0 libxcb-present0 libxcb-randr0 libxcb-shm0 libxcb-sync1 \ |
| 57 | + libxcb-xfixes0 libxcb1 libxdmcp6 libxext6 libxfixes3 libxfont2 libxft2 \ |
| 58 | + libxkbfile1 libxml-libxml-perl libxml-namespacesupport-perl \ |
| 59 | + libxml-sax-base-perl libxml-sax-perl libxmu6 libxmuu1 libxpm4 libxrandr2 \ |
| 60 | + libxrender1 libxshmfence1 libxss1 libxt6 libxxf86vm1 libz3-4 locales-all \ |
| 61 | + lsb-release net-tools pkgconf-bin python-babel-localedata python3-alabaster \ |
| 62 | + python3-babel python3-certifi python3-chardet python3-charset-normalizer \ |
| 63 | + python3-distutils python3-docs-theme python3-docutils python3-idna \ |
| 64 | + python3-imagesize python3-jinja2 python3-lib2to3 python3-markupsafe \ |
| 65 | + python3-packaging python3-pkg-resources python3-pygments python3-requests \ |
| 66 | + python3-roman python3-six python3-snowballstemmer python3-sphinx python3-tz \ |
| 67 | + python3-urllib3 quilt sgml-base sharutils sphinx-common tcl tcl8.6 tex-common \ |
| 68 | + texinfo time tk tk8.6 ucf x11-common x11-xkb-utils x11proto-core-dev \ |
| 69 | + x11proto-dev xauth xkb-data xml-core xorg-sgml-doctools xserver-common \ |
| 70 | + xtrans-dev xvfb || \ |
| 71 | + echo "::warning::Loading packages failed!" | tee -a /github_output |
| 72 | +COPY --from=source /usr/local/src/python-source /usr/local/src/python-source |
| 73 | +WORKDIR /usr/local/src/python-source |
| 74 | + |
| 75 | +# -------------------- Build native architecture -------------------- |
| 76 | +FROM build-system AS native |
| 77 | +RUN mk-build-deps --install --tool 'apt-get -y --no-install-recommends' |
| 78 | + |
| 79 | +RUN debuild -b -uc -us |
| 80 | +RUN mkdir debs && mv ../*.deb debs |
| 81 | + |
| 82 | +# -------------------- Export native build artifacts -------------------- |
| 83 | +FROM scratch AS native-binaries |
| 84 | +ARG PYTHON_NAME |
| 85 | +COPY --from=native /usr/local/src/python-source/debs/. /usr/local/src/${PYTHON_NAME}*.build /usr/local/src/${PYTHON_NAME}*.buildinfo / |
| 86 | + |
| 87 | +# -------------------- Crossbuild foreign architectures -------------------- |
| 88 | +FROM build-system AS crossbuild |
| 89 | +ARG ARCH |
| 90 | +RUN [ ! -z "${ARCH}" ] |
| 91 | +RUN dpkg --add-architecture ${ARCH} |
| 92 | +RUN apt-get update |
| 93 | + |
| 94 | +ADD crossbuild-dep.diff . |
| 95 | +RUN patch -p1 < crossbuild-dep.diff |
| 96 | + |
| 97 | +COPY --from=native /usr/local/src/python-source/debs native-debs |
| 98 | +ARG PYTHON_NAME |
| 99 | +RUN cd native-debs && apt-get install -y ./lib${PYTHON_NAME}-minimal*.deb \ |
| 100 | + ./lib${PYTHON_NAME}-stdlib*.deb \ |
| 101 | + ./lib${PYTHON_NAME}_*.deb \ |
| 102 | + ./${PYTHON_NAME}-minimal*.deb \ |
| 103 | + ./${PYTHON_NAME}_*.deb |
| 104 | + |
| 105 | +RUN mk-build-deps --arch ${ARCH} --host-arch ${ARCH} |
| 106 | +# We don't need build-essential for cross-compiling, but mk-build-deps insists of adding it |
| 107 | +# Hacky way to remove that: |
| 108 | +RUN mkdir rebuild-cross-deps && \ |
| 109 | + dpkg-deb -R ${PYTHON_NAME}-cross-build-deps*.deb rebuild-cross-deps && \ |
| 110 | + sed -i 's/build-essential:[^ ]* //' rebuild-cross-deps/DEBIAN/control && \ |
| 111 | + dpkg-deb -b rebuild-cross-deps |
| 112 | +RUN apt-get install -y --no-install-recommends ./rebuild-cross-deps.deb |
| 113 | + |
| 114 | +RUN DEB_BUILD_OPTIONS='nocheck nobench' debuild -b -uc -us -a${ARCH} --ignore-builtin-builddeps |
| 115 | +RUN mkdir debs && mv ../*.deb debs |
| 116 | + |
| 117 | +# -------------------- Export crossbuild artifacts -------------------- |
| 118 | +FROM scratch AS crossbuild-binaries |
| 119 | +ARG PYTHON_NAME |
| 120 | +COPY --from=crossbuild /usr/local/src/python-source/debs/. /usr/local/src/${PYTHON_NAME}*.build /usr/local/src/${PYTHON_NAME}*.buildinfo / |
0 commit comments