-# This Dockerfile compiles the jbig2enc library
-# Inputs:
-# - QPDF_VERSION - the version of qpdf to build a .deb.
-# Must be present as a deb-src in bookworm
+#
+# Stage: pre-build
+# Purpose:
+# - Installs common packages
+# - Sets common environment variables related to dpkg
+# - Aquires the qpdf source from bookwork
+# Useful Links:
+# - https://qpdf.readthedocs.io/en/stable/installation.html#system-requirements
+# - https://wiki.debian.org/Multiarch/HOWTO
+# - https://wiki.debian.org/CrossCompiling
+#
-FROM debian:bullseye-slim as main
+FROM debian:bullseye-slim as pre-build
-LABEL org.opencontainers.image.description="A intermediate image with qpdf built"
-
-ARG DEBIAN_FRONTEND=noninteractive
-# This must match to pikepdf's minimum at least
ARG QPDF_VERSION
-ARG BUILD_PACKAGES="\
- build-essential \
- debhelper \
+ARG COMMON_BUILD_PACKAGES="\
+ cmake \
+ debhelper\
debian-keyring \
devscripts \
- equivs \
- libtool \
- # https://qpdf.readthedocs.io/en/stable/installation.html#system-requirements
- libjpeg62-turbo-dev \
- libgnutls28-dev \
+ dpkg-dev \
+ equivs \
packaging-dev \
- cmake \
- zlib1g-dev"
+ libtool"
+
+ENV DEB_BUILD_OPTIONS="terse nocheck nodoc parallel=2"
WORKDIR /usr/src
RUN set -eux \
- && echo "Installing build tools" \
+ && echo "Installing common packages" \
&& apt-get update --quiet \
- && apt-get install --yes --quiet --no-install-recommends $BUILD_PACKAGES \
- && echo "Getting qpdf src" \
+ && apt-get install --yes --quiet --no-install-recommends ${COMMON_BUILD_PACKAGES} \
+ && echo "Getting qpdf source" \
&& echo "deb-src http://deb.debian.org/debian/ bookworm main" > /etc/apt/sources.list.d/bookworm-src.list \
- && apt-get update \
- && mkdir qpdf \
- && cd qpdf \
- && apt-get source --yes --quiet qpdf=${QPDF_VERSION}-1/bookworm \
- && echo "Building qpdf" \
- && cd qpdf-$QPDF_VERSION \
- && export DEB_BUILD_OPTIONS="terse nocheck nodoc parallel=2" \
- && dpkg-buildpackage --build=binary --unsigned-source --unsigned-changes --post-clean \
- && ls -ahl ../*.deb \
- && echo "Cleaning up image" \
- && apt-get -y purge ${BUILD_PACKAGES} \
- && apt-get -y autoremove --purge \
- && rm -rf /var/lib/apt/lists/*
+ && apt-get update --quiet \
+ && apt-get source --yes --quiet qpdf=${QPDF_VERSION}-1/bookworm
+
+#
+# Stage: amd64-builder
+# Purpose: Builds qpdf for x86_64 (native build)
+#
+FROM pre-build as amd64-builder
+
+ARG AMD64_BUILD_PACKAGES="\
+ build-essential \
+ libjpeg62-turbo-dev:amd64 \
+ libgnutls28-dev:amd64 \
+ zlib1g-dev:amd64"
+
+WORKDIR /usr/src/qpdf-${QPDF_VERSION}
+
+RUN set -eux \
+ && echo "Beginning amd64" \
+ && echo "Install amd64 packages" \
+ && apt-get update --quiet \
+ && apt-get install --yes --quiet --no-install-recommends ${AMD64_BUILD_PACKAGES} \
+ && echo "Building amd64" \
+ && dpkg-buildpackage --build=binary --unsigned-source --unsigned-changes --post-clean \
+ && echo "Removing debug files" \
+ && rm -f ../libqpdf29-dbgsym* \
+ && rm -f ../qpdf-dbgsym* \
+ && echo "Gathering package data" \
+ && dpkg-query -f '${Package;-40}${Version}\n' -W > ../pkg-list.txt
+#
+# Stage: armhf-builder
+# Purpose:
+# - Sets armhf specific environment
+# - Builds qpdf for armhf (cross compile)
+#
+FROM pre-build as armhf-builder
+
+ARG ARMHF_PACKAGES="\
+ crossbuild-essential-armhf \
+ libjpeg62-turbo-dev:armhf \
+ libgnutls28-dev:armhf \
+ zlib1g-dev:armhf"
+
+WORKDIR /usr/src/qpdf-${QPDF_VERSION}
+
+ENV CXX="/usr/bin/arm-linux-gnueabihf-g++" \
+ CC="/usr/bin/arm-linux-gnueabihf-gcc"
+
+RUN set -eux \
+ && echo "Beginning armhf" \
+ && echo "Install armhf packages" \
+ && dpkg --add-architecture armhf \
+ && apt-get update --quiet \
+ && apt-get install --yes --quiet --no-install-recommends ${ARMHF_PACKAGES} \
+ && echo "Building armhf" \
+ && dpkg-buildpackage --build=binary --unsigned-source --unsigned-changes --post-clean --host-arch armhf \
+ && echo "Removing debug files" \
+ && rm -f ../libqpdf29-dbgsym* \
+ && rm -f ../qpdf-dbgsym* \
+ && echo "Gathering package data" \
+ && dpkg-query -f '${Package;-40}${Version}\n' -W > ../pkg-list.txt
+
+#
+# Stage: aarch64-builder
+# Purpose:
+# - Sets aarch64 specific environment
+# - Builds qpdf for aarch64 (cross compile)
+#
+FROM pre-build as aarch64-builder
+
+ARG ARM64_PACKAGES="\
+ crossbuild-essential-arm64 \
+ libjpeg62-turbo-dev:arm64 \
+ libgnutls28-dev:arm64 \
+ zlib1g-dev:arm64"
+
+ENV CXX="/usr/bin/aarch64-linux-gnu-g++" \
+ CC="/usr/bin/aarch64-linux-gnu-gcc"
+
+WORKDIR /usr/src/qpdf-${QPDF_VERSION}
+
+RUN set -eux \
+ && echo "Beginning arm64" \
+ && echo "Install arm64 packages" \
+ && dpkg --add-architecture arm64 \
+ && apt-get update --quiet \
+ && apt-get install --yes --quiet --no-install-recommends ${ARM64_PACKAGES} \
+ && echo "Building arm64" \
+ && dpkg-buildpackage --build=binary --unsigned-source --unsigned-changes --post-clean --host-arch arm64 \
+ && echo "Removing debug files" \
+ && rm -f ../libqpdf29-dbgsym* \
+ && rm -f ../qpdf-dbgsym* \
+ && echo "Gathering package data" \
+ && dpkg-query -f '${Package;-40}${Version}\n' -W > ../pkg-list.txt
+
+#
+# Stage: package
+# Purpose: Holds the compiled .deb files in arch/variant specific folders
+#
+FROM alpine:3.17 as package
+
+LABEL org.opencontainers.image.description="A image with qpdf installers stored in architecture & version specific folders"
+
+ARG QPDF_VERSION
+
+WORKDIR /usr/src/qpdf/${QPDF_VERSION}/amd64
+
+COPY --from=amd64-builder /usr/src/*.deb ./
+COPY --from=amd64-builder /usr/src/pkg-list.txt ./
+
+# Note this is ${TARGETARCH}${TARGETVARIANT} for armv7
+WORKDIR /usr/src/qpdf/${QPDF_VERSION}/armv7
+
+COPY --from=armhf-builder /usr/src/*.deb ./
+COPY --from=armhf-builder /usr/src/pkg-list.txt ./
+
+WORKDIR /usr/src/qpdf/${QPDF_VERSION}/arm64
+
+COPY --from=aarch64-builder /usr/src/*.deb ./
+COPY --from=aarch64-builder /usr/src/pkg-list.txt ./