| FROM ubuntu:22.04 | |
| ARG DEBIAN_FRONTEND=noninteractive | |
| RUN apt-get update -y && apt-get install -y --no-install-recommends \ | |
| bc \ | |
| bzip2 \ | |
| ca-certificates \ | |
| cmake \ | |
| cpio \ | |
| curl \ | |
| file \ | |
| g++ \ | |
| g++-arm-linux-gnueabihf \ | |
| git \ | |
| libc6-dev \ | |
| libc6-dev-armhf-cross \ | |
| libssl-dev \ | |
| make \ | |
| ninja-build \ | |
| python3 \ | |
| qemu-system-arm \ | |
| xz-utils | |
| ENV ARCH=arm \ | |
| CROSS_COMPILE=arm-linux-gnueabihf- | |
| WORKDIR /build | |
| # Compile the kernel that we're going to run and be emulating with. This is | |
| # basically just done to be compatible with the QEMU target that we're going | |
| # to be using when running tests. If any other kernel works or if any | |
| # other QEMU target works with some other stock kernel, we can use that too! | |
| # | |
| # The `vexpress_config` config file was a previously generated config file for | |
| # the kernel. This file was generated by running `make vexpress_defconfig` | |
| # followed by `make menuconfig` and then enabling the IPv6 protocol page. | |
| COPY host-x86_64/armhf-gnu/vexpress_config /build/.config | |
| RUN curl https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.14.320.tar.xz | \ | |
| tar xJf - && \ | |
| cd /build/linux-4.14.320 && \ | |
| cp /build/.config . && \ | |
| make -j$(nproc) all && \ | |
| cp arch/arm/boot/zImage /tmp && \ | |
| cd /build && \ | |
| rm -rf linux-4.14.320 | |
| # Compile an instance of busybox as this provides a lightweight system and init | |
| # binary which we will boot into. Only trick here is configuring busybox to | |
| # build static binaries. | |
| RUN curl https://www.busybox.net/downloads/busybox-1.32.1.tar.bz2 | tar xjf - && \ | |
| cd busybox-1.32.1 && \ | |
| make defconfig && \ | |
| sed -i 's/.*CONFIG_STATIC.*/CONFIG_STATIC=y/' .config && \ | |
| make -j$(nproc) && \ | |
| make install && \ | |
| mv _install /tmp/rootfs && \ | |
| cd /build && \ | |
| rm -rf busybox-1.32.1 | |
| # Download the ubuntu rootfs, which we'll use as a chroot for all our tests. | |
| WORKDIR /tmp | |
| RUN mkdir rootfs/ubuntu | |
| RUN curl https://cdimage.ubuntu.com/ubuntu-base/releases/22.04/release/ubuntu-base-22.04.2-base-armhf.tar.gz | \ | |
| tar xzf - -C rootfs/ubuntu && \ | |
| cd rootfs && mkdir proc sys dev etc etc/init.d | |
| # Copy over our init script, which starts up our test server and also a few | |
| # other misc tasks. | |
| COPY scripts/qemu-bare-bones-rcS rootfs/etc/init.d/rcS | |
| RUN chmod +x rootfs/etc/init.d/rcS | |
| # Helper to quickly fill the entropy pool in the kernel. | |
| COPY scripts/qemu-bare-bones-addentropy.c /tmp/addentropy.c | |
| RUN arm-linux-gnueabihf-gcc addentropy.c -o rootfs/addentropy -static | |
| # TODO: What is this?! | |
| # Source of the file: https://github.com/vfdev-5/qemu-rpi2-vexpress/raw/master/vexpress-v2p-ca15-tc1.dtb | |
| RUN curl -O https://ci-mirrors.rust-lang.org/rustc/vexpress-v2p-ca15-tc1.dtb | |
| COPY scripts/sccache.sh /scripts/ | |
| RUN sh /scripts/sccache.sh | |
| COPY static/gitconfig /etc/gitconfig | |
| ENV RUST_CONFIGURE_ARGS="--qemu-armhf-rootfs=/tmp/rootfs" | |
| ENV SCRIPT="python3 ../x.py --stage 2 test --host= --target arm-unknown-linux-gnueabihf" | |
| ENV NO_CHANGE_USER=1 |