11FROM gcc:12
22
3- ENV CMAKE_VERSION=3.31.8
4- ENV MOLD_VERSION=2.40.4
3+ ENV CMAKE_VERSION=3.31.10
4+ ENV MOLD_VERSION=2.42.1
5+
6+ ARG GCC_VERSION=16.2.0
7+ ARG CLANG_VERSION=22.1.8
8+ ARG TOOLCHAIN_BUILD_DIR=/tmp/toolchain-build
59
610ARG DEB_REGION=""
711ARG https_proxy=""
@@ -13,24 +17,16 @@ RUN if [ "$DEB_REGION" != "" ]; then \
1317fi
1418
1519RUN apt-get update && \
16- apt-get install -y \
20+ apt-get install -y --no-install-recommends \
1721 curl \
18- tar
19-
20- RUN arch=$(arch) && \
21- https_proxy=${https_proxy} \
22- curl -L -# -o /tmp/cmake.tar.gz https://github.com/Kitware/CMake/releases/download/v$CMAKE_VERSION/cmake-$CMAKE_VERSION-linux-${arch}.tar.gz && \
23- tar -xzvf /tmp/cmake.tar.gz -C /opt && \
24- ln -s /opt/cmake-$CMAKE_VERSION-linux-${arch}/bin/cmake /usr/local/bin/cmake && \
25- ln -s /opt/cmake-$CMAKE_VERSION-linux-${arch}/bin/ctest /usr/local/bin/ctest && \
26- rm /tmp/cmake.tar.gz
27-
28- RUN apt-get update && apt-get install -y \
22+ libgmp-dev \
23+ libmpc-dev \
24+ libmpfr-dev \
25+ wget \
26+ tar \
2927 sudo \
3028 bash \
31- vim-tiny \
3229 vim \
33- sudo \
3430 git \
3531 gdb \
3632 python3 \
@@ -39,13 +35,16 @@ RUN apt-get update && apt-get install -y \
3935 ssh-client \
4036 ninja-build \
4137 bison \
38+ flex \
39+ gawk \
40+ bzip2 \
41+ xz-utils \
4242 maven \
4343 net-tools \
4444 telnet \
4545 ssh \
4646 rsync \
4747 openssh-server \
48- lld \
4948 ccache \
5049 binutils-dev \
5150 make \
@@ -62,17 +61,99 @@ RUN apt-get update && apt-get install -y \
6261
6362RUN ln -sf /bin/bash /bin/sh
6463
65- RUN https_proxy=${https_proxy} curl -L -O --output-dir /tmp https://github.com/rui314/mold/releases/download/v$MOLD_VERSION/mold-$MOLD_VERSION-$(arch)-linux.tar.gz
66- RUN cd /tmp && \
67- sudo tar -C /usr/local --strip-components=1 -xzf mold-$MOLD_VERSION-$(arch)-linux.tar.gz
64+ # Replace the base image's GCC in /usr/local, including static and shared libraries.
65+ RUN set -eux; \
66+ mkdir -p "${TOOLCHAIN_BUILD_DIR}"; \
67+ cd "${TOOLCHAIN_BUILD_DIR}"; \
68+ wget --progress=dot:mega \
69+ "https://mirrors.aliyun.com/gnu/gcc/gcc-${GCC_VERSION}/gcc-${GCC_VERSION}.tar.gz"; \
70+ tar -xzf "gcc-${GCC_VERSION}.tar.gz"; \
71+ mkdir -p "${TOOLCHAIN_BUILD_DIR}/gcc-build-${GCC_VERSION}"; \
72+ cd "${TOOLCHAIN_BUILD_DIR}/gcc-build-${GCC_VERSION}"; \
73+ "${TOOLCHAIN_BUILD_DIR}/gcc-${GCC_VERSION}/configure" \
74+ --prefix=/usr/local \
75+ --libdir=/usr/local/lib64 \
76+ --enable-languages=c,c++ \
77+ --enable-static \
78+ --enable-shared \
79+ --disable-checking \
80+ --disable-multilib; \
81+ make -j "$(nproc)" || { \
82+ find . -path '*/libatomic/config.log' -exec tail -n 300 {} \;; \
83+ exit 1; \
84+ }; \
85+ make install-strip; \
86+ ln -sf /usr/local/bin/gcc /usr/local/bin/gcc-16; \
87+ ln -sf /usr/local/bin/g++ /usr/local/bin/g++-16; \
88+ system_libdir="/lib/$(arch)-linux-gnu"; \
89+ cp -a --remove-destination /usr/local/lib64/libstdc++.so* "${system_libdir}/"; \
90+ cp -a --remove-destination /usr/local/lib64/libgcc_s.so* "${system_libdir}/"; \
91+ ldconfig; \
92+ gcc-16 --version; \
93+ g++-16 --version; \
94+ rm -rf "${TOOLCHAIN_BUILD_DIR:?}"/*
95+
96+ RUN arch=$(arch) && \
97+ https_proxy=${https_proxy} \
98+ curl -L -# -o /tmp/cmake.tar.gz https://github.com/Kitware/CMake/releases/download/v$CMAKE_VERSION/cmake-$CMAKE_VERSION-linux-${arch}.tar.gz && \
99+ tar -xzvf /tmp/cmake.tar.gz -C /opt && \
100+ ln -s /opt/cmake-$CMAKE_VERSION-linux-${arch}/bin/cmake /usr/local/bin/cmake && \
101+ ln -s /opt/cmake-$CMAKE_VERSION-linux-${arch}/bin/ctest /usr/local/bin/ctest && \
102+ rm /tmp/cmake.tar.gz
103+
104+ # Install Clang 22 and the CI tools that are distributed with LLVM.
105+ # and replace system's ld to avoid llvm-core building errors
106+ COPY assets/patches/llvm-pr220492.patch /tmp/llvm-pr220492.patch
107+ RUN set -eux; \
108+ mkdir -p "${TOOLCHAIN_BUILD_DIR}"; \
109+ cd "${TOOLCHAIN_BUILD_DIR}"; \
110+ wget --progress=dot:mega -O "llvm-project-${CLANG_VERSION}.tar.gz" \
111+ "https://github.com/llvm/llvm-project/archive/refs/tags/llvmorg-${CLANG_VERSION}.tar.gz"; \
112+ tar -xzf "llvm-project-${CLANG_VERSION}.tar.gz"; \
113+ cd "llvm-project-llvmorg-${CLANG_VERSION}"; \
114+ git apply --check /tmp/llvm-pr220492.patch; \
115+ git apply /tmp/llvm-pr220492.patch; \
116+ rm /tmp/llvm-pr220492.patch; \
117+ cd "${TOOLCHAIN_BUILD_DIR}"; \
118+ cmake -S "llvm-project-llvmorg-${CLANG_VERSION}/llvm" -B llvm-build -G Ninja \
119+ -DCMAKE_BUILD_TYPE=Release \
120+ -DCMAKE_INSTALL_PREFIX="/opt/clang-${CLANG_VERSION}" \
121+ -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld" \
122+ -DLLVM_DISTRIBUTION_COMPONENTS="clang;clang-resource-headers;clang-tidy;lld;llvm-ar;llvm-ranlib" \
123+ -DLLVM_BUILD_TESTS=OFF \
124+ -DLLVM_INCLUDE_TESTS=OFF \
125+ -DLLVM_BUILD_DOCS=OFF \
126+ -DLLVM_INCLUDE_DOCS=OFF \
127+ -DLLVM_BUILD_EXAMPLES=OFF \
128+ -DLLVM_INCLUDE_EXAMPLES=OFF; \
129+ cmake --build llvm-build --target install-distribution-stripped \
130+ --parallel "$(nproc)"; \
131+ ln -sf "/opt/clang-${CLANG_VERSION}/bin/clang" /usr/local/bin/clang-22; \
132+ ln -sf "/opt/clang-${CLANG_VERSION}/bin/clang++" /usr/local/bin/clang++-22; \
133+ clang-22 --version; \
134+ clang++-22 --version; \
135+ /opt/clang-${CLANG_VERSION}/bin/clang-tidy --version; \
136+ /opt/clang-${CLANG_VERSION}/bin/ld.lld --version; \
137+ ln -sf /opt/clang-${CLANG_VERSION}/bin/ld.lld $(which ld); \
138+ test -x "/opt/clang-${CLANG_VERSION}/bin/llvm-ar"; \
139+ test -x "/opt/clang-${CLANG_VERSION}/bin/llvm-ranlib"; \
140+ rm -rf "${TOOLCHAIN_BUILD_DIR:?}"/*
141+
142+ ENV PATH="/opt/clang-${CLANG_VERSION}/bin:${PATH}"
143+
144+ RUN set -eux; \
145+ mold_archive="/tmp/mold-${MOLD_VERSION}-$(arch)-linux.tar.gz"; \
146+ https_proxy=${https_proxy} curl -fL -o "${mold_archive}" \
147+ "https://github.com/rui314/mold/releases/download/v${MOLD_VERSION}/mold-${MOLD_VERSION}-$(arch)-linux.tar.gz"; \
148+ tar -C /usr/local --strip-components=1 -xzf "${mold_archive}"; \
149+ rm "${mold_archive}"
68150
69- # Add mold's ld as the first on the path
70- env PATH=/usr/local/libexec/mold:$PATH
71151
72152# License header check tool
73153RUN https_proxy=${https_proxy} curl -L -# -o /tmp/skywalking-eyes-bin.tgz https://dlcdn.apache.org/skywalking/eyes/0.8.0/skywalking-license-eye-0.8.0-bin.tgz && \
74154 mkdir -p /opt/skywalking-license-eye && \
75- sudo tar -C /opt/skywalking-license-eye --strip-components=1 -xzf /tmp/skywalking-eyes-bin.tgz
155+ sudo tar -C /opt/skywalking-license-eye --strip-components=1 -xzf /tmp/skywalking-eyes-bin.tgz && \
156+ rm /tmp/skywalking-eyes-bin.tgz
76157
77158ENV PATH="/opt/skywalking-license-eye/bin/linux:${PATH}"
78159
@@ -102,31 +183,6 @@ RUN groupadd --gid $USER_GID $USERNAME \
102183
103184USER $USERNAME
104185
105- RUN conan profile detect && \
106- sed -i 's/gnu14/gnu17/g' ~/.conan2/profiles/default
107-
108- # Configure default conan profile to use the mold linker
109- RUN cat >> ~/.conan2/profiles/default <<EOF
110-
111- [conf]
112- tools.build:exelinkflags=['-fuse-ld=mold', '-Wl,--allow-multiple-definition']
113- tools.build:sharedlinkflags=['-fuse-ld=mold', '-Wl,--allow-multiple-definition']
114- EOF
115-
116- RUN cat > ~/.conan2/profiles/clang-profile <<EOF
117- [settings]
118- arch=$( [ "$arch" = "aarch64" ] && echo "armv8" || echo "$arch" )
119- build_type=Release
120- compiler=clang
121- compiler.cppstd=17
122- compiler.libcxx=libstdc++11
123- compiler.version=16
124- os=Linux
125-
126- [conf]
127- tools.build:compiler_executables={"c": "clang", "cpp": "clang++"}
128- EOF
129-
130186# Generate Locales
131187RUN sudo sed -i 's/^# *\(en_US.UTF-8\)/\1/' /etc/locale.gen && \
132188 sudo locale-gen && \
0 commit comments