#
# 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 pre-build

ARG QPDF_VERSION

ARG COMMON_BUILD_PACKAGES="\
  cmake \
  debhelper\
  debian-keyring \
  devscripts \
  dpkg-dev \
  equivs \
  packaging-dev \
  libtool"

ENV DEB_BUILD_OPTIONS="terse nocheck nodoc parallel=2"

WORKDIR /usr/src

RUN set -eux \
  && echo "Installing common packages" \
    && apt-get update --quiet \
    && 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 --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 ./