1- # ====================== BASE IMAGE ======================
1+ # Define the source image from which we will copy GCC. This is needed because
2+ # the `COPY --from XXX` command used in a stage below does not allow `XXX` to
3+ # contain dynamic values supplied via an argument.
24ARG DEBIAN_VERSION=bookworm
5+ ARG GCC_VERSION=12
6+ FROM gcc:${GCC_VERSION}-${DEBIAN_VERSION} AS gcc-src
7+
8+ # ====================== BASE IMAGE ======================
39FROM debian:${DEBIAN_VERSION} AS base
410
511# Associate the image with the repository.
@@ -9,30 +15,30 @@ LABEL org.opencontainers.image.source=https://github.com/${GITHUB_REPO}
915# Ensure any packages installed directly or indirectly via dpkg do not require
1016# manual interaction.
1117ARG DEBIAN_FRONTEND=noninteractive
12- RUN apt update && apt upgrade -y && \
13- ln -fs /usr/share/zoneinfo/America/Los_Angeles /etc/localtime && \
14- apt install tzdata && \
18+ RUN apt update && apt upgrade -y
19+ RUN set -ex ;\
20+ ln -fs /usr/share/zoneinfo/America/Los_Angeles /etc/localtime ;\
21+ apt install tzdata ;\
1522 dpkg-reconfigure --frontend noninteractive tzdata
1623
1724# Install tools that are shared by all stages.
1825RUN apt install -y build-essential \
19- ca-certificates \
20- cmake \
21- curl \
22- git \
23- gpg \
24- libssl-dev \
25- libprotobuf-dev \
26- ninja-build \
27- protobuf-compiler
26+ ca-certificates \
27+ cmake \
28+ curl \
29+ git \
30+ gpg \
31+ libssl-dev \
32+ libprotobuf-dev \
33+ ninja-build \
34+ protobuf-compiler
2835
2936# Install Conan.
3037RUN apt install -y pipx
3138RUN PIPX_HOME=/opt/pipx \
32- PIPX_BIN_DIR=/usr/bin \
33- PIPX_MAN_DIR=/usr/share/man \
34- pipx install conan
35- RUN apt purge -y pipx && apt autoremove -y
39+ PIPX_BIN_DIR=/usr/bin \
40+ PIPX_MAN_DIR=/usr/share/man \
41+ pipx install conan
3642
3743# Create the user to switch to, once all packages have been installed.
3844ARG NONROOT_USER=ci
@@ -41,11 +47,28 @@ RUN useradd -ms /bin/bash ${NONROOT_USER}
4147# ====================== GCC IMAGE ======================
4248FROM base AS gcc
4349
44- # Install GCC.
45- ARG GCC_VERSION=12
46- RUN apt install -y gcc-${GCC_VERSION} g++-${GCC_VERSION}
47- ENV CC=/usr/bin/gcc-${GCC_VERSION}
48- ENV CXX=/usr/bin/gcc-${GCC_VERSION}
50+ # Copy GCC from the source image, make the package manager aware of its
51+ # existence, and create the necessary symlinks.
52+ COPY --from=gcc-src /usr/local/ /usr/local/
53+ COPY --from=gcc-src /etc/ld.so.conf.d/*.conf /etc/ld.so.conf.d/
54+ RUN set -ex ;\
55+ ldconfig -v ;\
56+ dpkg-divert --divert /usr/bin/gcc.orig --rename /usr/bin/gcc ;\
57+ dpkg-divert --divert /usr/bin/g++.orig --rename /usr/bin/g++ ;\
58+ dpkg-divert --divert /usr/bin/gfortran.orig --rename /usr/bin/gfortran ;\
59+ update-alternatives --install /usr/bin/cc cc /usr/local/bin/gcc 999 ;\
60+ update-alternatives --install \
61+ /usr/bin/gcc gcc /usr/local/bin/gcc 100 \
62+ --slave /usr/bin/g++ g++ /usr/local/bin/g++ \
63+ --slave /usr/bin/gcc-ar gcc-ar /usr/local/bin/gcc-ar \
64+ --slave /usr/bin/gcc-nm gcc-nm /usr/local/bin/gcc-nm \
65+ --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/local/bin/gcc-ranlib \
66+ --slave /usr/bin/gcov gcov /usr/local/bin/gcov \
67+ --slave /usr/bin/gcov-tool gcov-tool /usr/local/bin/gcov-tool \
68+ --slave /usr/bin/gcov-dump gcov-dump /usr/local/bin/gcov-dump \
69+ --slave /usr/bin/lto-dump lto-dump /usr/local/bin/lto-dump ;\
70+ update-alternatives --auto cc ;\
71+ update-alternatives --auto gcc
4972
5073# Clean up unnecessary files to reduce image size.
5174RUN rm -rf /var/lib/apt/lists/* && apt autoremove -y && apt clean
@@ -54,6 +77,9 @@ RUN rm -rf /var/lib/apt/lists/* && apt autoremove -y && apt clean
5477USER ${NONROOT_USER}
5578WORKDIR /home/${NONROOT_USER}
5679
80+ # Create a default Conan profile.
81+ RUN conan profile detect
82+
5783# ===================== CLANG IMAGE =====================
5884FROM base AS clang
5985
@@ -78,3 +104,6 @@ RUN rm -rf /var/lib/apt/lists/* && apt autoremove -y && apt clean
78104# Switch to the non-root user.
79105USER ${NONROOT_USER}
80106WORKDIR /home/${NONROOT_USER}
107+
108+ # Create a default Conan profile.
109+ RUN conan profile detect
0 commit comments