system76 / firmware-open

System76 Open Firmware
Other
957 stars 86 forks source link

Containerize builds #463

Open crawfxrd opened 1 year ago

crawfxrd commented 1 year ago

Investigate using containers for building the project, potentially even using them for local development.

coreboot has some Dockerfiles for building images and publishes them on Docker Hub:

We only need crossgcc-i386 and crossgcc-x64, so we should build our own image to minimize the size.

crawfxrd commented 1 year ago

Example minimal Containerfile:

ARG CONTAINER_IMAGE="debian:12.2"
ARG COREBOOT_REPO="https://github.com/coreboot/coreboot.git"
ARG COREBOOT_COMMIT="4.21"

FROM ${CONTAINER_IMAGE} as crossgcc-build
ARG COREBOOT_COMMIT
ARG COREBOOT_REPO
WORKDIR /tmp
RUN apt-get --quiet update && \
    apt-get --quiet install --no-install-recommends --assume-yes \
        bash \
        bison \
        bzip2 \
        ca-certificates \
        curl \
        flex \
        g++ \
        gcc \
        git \
        gnat \
        libssl-dev \
        m4 \
        make \
        patch \
        pkgconf \
        python-is-python3 \
        python3 \
        tar \
        xz-utils \
        zlib1g-dev
RUN git clone ${COREBOOT_REPO} && \
    cd coreboot && \
    git checkout ${COREBOOT_COMMIT}
RUN make -C coreboot CPUS=$(nproc) DEST=/opt/xgcc crossgcc-i386 && \
    make -C coreboot CPUS=$(nproc) DEST=/opt/xgcc crossgcc-x64 && \
    rm -rf coreboot

FROM ${CONTAINER_IMAGE}
COPY --from=crossgcc-build /opt/xgcc /opt/xgcc
ENV XGCCPATH "/opt/xgcc/bin"
ENV PATH "$XGCCPATH:$PATH"
RUN apt-get --quiet update && \
    apt-get --quiet install --no-install-recommends --assume-yes \
        bash \
        ca-certificates \
        curl \
        git \
        git-lfs \
        make
WORKDIR /workspace

This could be used as-is, as it covers the most time spent for setting up the toolchains. scripts/_build/edk2.sh would need to be updated to handle path change (done in #489).