Foundry/barswap/k80_quirk/Dockerfile

75 lines
3.4 KiB
Docker

# Reproducible cross-build of the K80 BAR1-strap kernel for the K80 host.
#
# Produces an x86-64 Ubuntu linux-image .deb (kernel 6.8.0-106.106 + the
# built-in GK210 PSTRAPS pci_fixup_early) by CROSS-COMPILING — so it builds at
# native speed on an arm64 host (Apple Silicon) with no emulation.
#
# Reproducibility: the kernel source is pinned to an exact Ubuntu version (pulled
# from Launchpad, which keeps every version permanently) and the config is the
# target host's own /boot/config, fetched at build time by build.sh (never committed). Same inputs -> same kernel. For
# bit-exact rebuilds also pin the base image by digest and point apt at
# snapshot.ubuntu.com.
#
# Layer order keeps the big source fetch cached independently of the build-deps
# layer, so adding a build dependency does not re-download the kernel source.
#
# Build: see build.sh (wraps `docker build` + copies the .deb out).
FROM ubuntu:24.04
ARG KSRC_VERSION=6.8.0-106.106
ENV DEBIAN_FRONTEND=noninteractive \
ARCH=x86_64 \
CROSS_COMPILE=x86_64-linux-gnu- \
KSRC_VERSION=${KSRC_VERSION}
WORKDIR /build
# 1) Tools needed only to fetch the exact historical kernel source from Launchpad.
RUN apt-get update && apt-get install -y --no-install-recommends \
ubuntu-dev-tools ca-certificates && \
rm -rf /var/lib/apt/lists/*
# 2) Fetch + extract the exact Ubuntu kernel source (extracts to linux-*/).
# Cached unless KSRC_VERSION changes.
RUN pull-lp-source linux ${KSRC_VERSION}
# 3) Build dependencies: native host compiler (HOSTCC) AND the x86-64 cross
# toolchain (target CC), plus kernel build + Debian packaging tools. zstd is
# required because the target config sets CONFIG_KERNEL_ZSTD / MODULE_COMPRESS_ZSTD.
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
gcc-x86-64-linux-gnu g++-x86-64-linux-gnu \
bc bison flex libssl-dev libelf-dev \
kmod cpio rsync xz-utils zstd dpkg-dev debhelper fakeroot && \
rm -rf /var/lib/apt/lists/*
# 4) Drop in the built-in quirk and the target's config.
COPY k80-strap-quirk.c /build/k80-strap-quirk.c
COPY target.config /build/target.config
# 5) Patch the tree, configure from the target's config, cross-build the .deb.
# Neutralise Ubuntu's Canonical signing-key paths and disable module signing
# (Secure Boot is off on the target). LOCALVERSION forks the kernel to
# 6.8.0-k80strap so it coexists with the stock 6.8.0-106-generic.
# (rm -rf debian: drop Ubuntu's heavy packaging so upstream bindeb-pkg generates
# its own minimal package with only the deps we installed.)
RUN set -eux; \
cd "$(echo linux-*/ | head -1)"; \
rm -rf debian; \
cp /build/k80-strap-quirk.c drivers/pci/k80-strap-quirk.c; \
grep -q 'k80-strap-quirk.o' drivers/pci/Makefile || \
echo 'obj-y += k80-strap-quirk.o' >> drivers/pci/Makefile; \
cp /build/target.config .config; \
./scripts/config --set-str SYSTEM_TRUSTED_KEYS ""; \
./scripts/config --set-str SYSTEM_REVOCATION_KEYS ""; \
./scripts/config --disable MODULE_SIG; \
./scripts/config --disable DEBUG_INFO_BTF; \
./scripts/config --disable LOCALVERSION_AUTO; \
./scripts/config --set-str LOCALVERSION "-k80strap"; \
make ARCH="$ARCH" CROSS_COMPILE="$CROSS_COMPILE" olddefconfig; \
make ARCH="$ARCH" CROSS_COMPILE="$CROSS_COMPILE" -j"$(nproc)" bindeb-pkg; \
mkdir -p /out; cp /build/linux-image-*.deb /out/
# The .deb lands in /out; build.sh copies it to the host.