Skip to content

Commit f07de7f

Browse files
authored
Install ccache latest released version instead of version from package manager (#90)
Ccache has had many improvements over the years, including one that no longer considers the `-fprofile-update=atomic` compiler flag to be unsupported. This change therefore installs the most recent version directly from their GitHub repo instead of using the version bundled by the OS package manager. However, note that RHEL 8 and Debian Bullseye do not support the latest version due to the GLIBC version of the distro being too old. While an older ccache version could be installed, these are only available for direct download for x86_64. Since we don't use the problematic flag on these two distros (and, since we release using Debian Bullseye where we disable ccache anyway), this is fine. Also note that as the flags in the README and CI were an unorganized mess, I've ordered them as follows, which should make things more readable: * OS version (e.g. DEBIAN_VERSION) * Compiler version (CLANG_VERSION, GCC_VERSION, BASE_IMAGE) * Flags (alphabetical).
1 parent 84afd81 commit f07de7f

File tree

9 files changed

+123
-49
lines changed

9 files changed

+123
-49
lines changed

.github/workflows/debian.yml

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,14 @@ env:
2727
PUSH: ${{ github.event_name == 'push' }}
2828
CONTAINER_REGISTRY: ghcr.io
2929
BUILDKIT_PROGRESS: plain
30+
FALLBACK_GCC: 12
31+
FALLBACK_CLANG: 16
32+
CCACHE_VERSION: 4.12.2
33+
CMAKE_VERSION: 4.1.0
3034
CONAN_VERSION: 2.22.2
3135
GCOVR_VERSION: 8.3
32-
CMAKE_VERSION: 4.1.0
3336
MOLD_VERSION: 2.40.4
3437
RUST_VERSION: 1.91.1
35-
FALLBACK_GCC: 12
36-
FALLBACK_CLANG: 16
3738

3839
jobs:
3940
# Build the Docker image for Debian using different versions of GCC and Clang.
@@ -149,15 +150,16 @@ jobs:
149150
build-args: |
150151
BUILDKIT_DOCKERFILE_CHECK=skip=InvalidDefaultArgInFrom
151152
BUILDKIT_INLINE_CACHE=1
153+
DEBIAN_VERSION=${{ matrix.os.release }}
152154
CLANG_VERSION=${{ matrix.os.compiler_name == 'clang' && matrix.os.compiler_version || env.FALLBACK_CLANG }}
153-
CONAN_VERSION=${{ env.CONAN_VERSION }}
154155
GCC_VERSION=${{ matrix.os.compiler_name == 'gcc' && matrix.os.compiler_version || env.FALLBACK_GCC }}
155-
GCOVR_VERSION=${{ env.GCOVR_VERSION }}
156+
BASE_IMAGE=${{ env.CONTAINER_IMAGE_GCC && format('{0}:{1}-{2}', env.CONTAINER_IMAGE_GCC, matrix.os.compiler_version, matrix.os.release) || format('gcc:{0}-{1}', matrix.os.compiler_version, matrix.os.release) }}
157+
CCACHE_VERSION=${{ env.CCACHE_VERSION }}
156158
CMAKE_VERSION=${{ env.CMAKE_VERSION }}
159+
CONAN_VERSION=${{ env.CONAN_VERSION }}
160+
GCOVR_VERSION=${{ env.GCOVR_VERSION }}
157161
MOLD_VERSION=${{ env.MOLD_VERSION }}
158162
RUST_VERSION=${{ env.RUST_VERSION }}
159-
DEBIAN_VERSION=${{ matrix.os.release }}
160-
BASE_IMAGE=${{ env.CONTAINER_IMAGE_GCC && format('{0}:{1}-{2}', env.CONTAINER_IMAGE_GCC, matrix.os.compiler_version, matrix.os.release) || format('gcc:{0}-{1}', matrix.os.compiler_version, matrix.os.release) }}
161163
context: .
162164
file: docker/debian/Dockerfile
163165
outputs: type=image,name=${{ env.CONTAINER_IMAGE }},push-by-digest=true,name-canonical=true,push=${{ env.PUSH }}

.github/workflows/rhel.yml

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,10 @@ env:
2727
PUSH: ${{ github.event_name == 'push' }}
2828
CONTAINER_REGISTRY: ghcr.io
2929
BUILDKIT_PROGRESS: plain
30+
CCACHE_VERSION: 4.12.2
31+
CMAKE_VERSION: 4.1.0
3032
CONAN_VERSION: 2.22.2
3133
GCOVR_VERSION: 8.3
32-
CMAKE_VERSION: 4.1.0
3334
MOLD_VERSION: 2.40.4
3435
RUST_VERSION: 1.91.1
3536

@@ -118,13 +119,14 @@ jobs:
118119
build-args: |
119120
BUILDKIT_DOCKERFILE_CHECK=skip=InvalidDefaultArgInFrom
120121
BUILDKIT_INLINE_CACHE=1
121-
CONAN_VERSION=${{ env.CONAN_VERSION }}
122+
RHEL_VERSION=${{ matrix.os.release }}
122123
GCC_VERSION=${{ matrix.os.compiler_version }}
123-
GCOVR_VERSION=${{ env.GCOVR_VERSION }}
124+
CCACHE_VERSION=${{ env.CCACHE_VERSION }}
124125
CMAKE_VERSION=${{ env.CMAKE_VERSION }}
126+
CONAN_VERSION=${{ env.CONAN_VERSION }}
127+
GCOVR_VERSION=${{ env.GCOVR_VERSION }}
125128
MOLD_VERSION=${{ env.MOLD_VERSION }}
126129
RUST_VERSION=${{ env.RUST_VERSION }}
127-
RHEL_VERSION=${{ matrix.os.release }}
128130
context: .
129131
file: docker/rhel/Dockerfile
130132
outputs: type=image,name=${{ env.CONTAINER_IMAGE }},push-by-digest=true,name-canonical=true,push=${{ env.PUSH }}

.github/workflows/ubuntu.yml

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,14 @@ env:
2727
PUSH: ${{ github.event_name == 'push' }}
2828
CONTAINER_REGISTRY: ghcr.io
2929
BUILDKIT_PROGRESS: plain
30+
FALLBACK_GCC: 12
31+
FALLBACK_CLANG: 16
32+
CCACHE_VERSION: 4.12.2
33+
CMAKE_VERSION: 4.1.0
3034
CONAN_VERSION: 2.22.2
3135
GCOVR_VERSION: 8.3
32-
CMAKE_VERSION: 4.1.0
3336
MOLD_VERSION: 2.40.4
3437
RUST_VERSION: 1.91.1
35-
FALLBACK_GCC: 12
36-
FALLBACK_CLANG: 16
3738

3839
jobs:
3940
# Build the Docker image for Ubuntu using different versions of GCC and Clang.
@@ -120,14 +121,15 @@ jobs:
120121
build-args: |
121122
BUILDKIT_DOCKERFILE_CHECK=skip=InvalidDefaultArgInFrom
122123
BUILDKIT_INLINE_CACHE=1
124+
UBUNTU_VERSION=${{ matrix.os.release }}
123125
CLANG_VERSION=${{ matrix.os.compiler_name == 'clang' && matrix.os.compiler_version || env.FALLBACK_CLANG }}
124-
CONAN_VERSION=${{ env.CONAN_VERSION }}
125126
GCC_VERSION=${{ matrix.os.compiler_name == 'gcc' && matrix.os.compiler_version || env.FALLBACK_GCC }}
126-
GCOVR_VERSION=${{ env.GCOVR_VERSION }}
127+
CCACHE_VERSION=${{ env.CCACHE_VERSION }}
127128
CMAKE_VERSION=${{ env.CMAKE_VERSION }}
129+
CONAN_VERSION=${{ env.CONAN_VERSION }}
130+
GCOVR_VERSION=${{ env.GCOVR_VERSION }}
128131
MOLD_VERSION=${{ env.MOLD_VERSION }}
129132
RUST_VERSION=${{ env.RUST_VERSION }}
130-
UBUNTU_VERSION=${{ matrix.os.release }}
131133
context: .
132134
file: docker/ubuntu/Dockerfile
133135
outputs: type=image,name=${{ env.CONTAINER_IMAGE }},push-by-digest=true,name-canonical=true,push=${{ env.PUSH }}

docker/debian/Dockerfile

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ FROM ${BASE_IMAGE} AS gcc-src
1515
# ====================== BASE IMAGE ======================
1616
FROM debian:${DEBIAN_VERSION} AS base
1717

18+
# This is not inherited from the base image.
19+
ARG DEBIAN_VERSION
20+
1821
# Use Bash as the default shell for RUN commands, using the options
1922
# `set -o errexit -o pipefail`, and as the entrypoint.
2023
SHELL ["/bin/bash", "-e", "-o", "pipefail", "-c"]
@@ -40,7 +43,6 @@ RUN <<EOF
4043
pkgs=()
4144
pkgs+=(ca-certificates) # Enable TLS verification for HTTPS connections by providing trusted root certificates.
4245
pkgs+=(binutils-gold) # Required build tool.
43-
pkgs+=(ccache) # Optional build tool for caching build artifacts.
4446
pkgs+=(curl) # Dependency for tools requiring downloading data.
4547
pkgs+=(dpkg-dev) # Required packaging tool.
4648
pkgs+=(debhelper) # Required packaging tool.
@@ -77,7 +79,28 @@ RUN pip install --no-cache \
7779
gcovr==${GCOVR_VERSION} \
7880
cmake==${CMAKE_VERSION}
7981

80-
# Install mold https://github.com/rui314/mold
82+
# Install ccache. Note that the ccache version from the package manager is
83+
# installed for Debian Bullseye, as the latest version requires a newer GLIBC
84+
# version, and older compatible releases are x86-64 only.
85+
ARG CCACHE_VERSION
86+
87+
RUN <<EOF
88+
if [[ "${DEBIAN_VERSION}" == "bullseye" ]]; then
89+
apt-get update
90+
apt-get install -y --no-install-recommends ccache
91+
apt-get clean
92+
rm -rf /var/lib/apt/lists/*
93+
else
94+
ARCH=$(uname -m)
95+
wget -O ccache.tar.xz https://github.com/ccache/ccache/releases/download/v${CCACHE_VERSION}/ccache-${CCACHE_VERSION}-linux-${ARCH}.tar.xz
96+
tar -xf ccache.tar.xz
97+
cp ccache-${CCACHE_VERSION}-linux-${ARCH}/ccache /usr/local/bin
98+
rm -r ccache-${CCACHE_VERSION}-linux-${ARCH}
99+
rm ccache.tar.xz
100+
fi
101+
EOF
102+
103+
# Install mold.
81104
ARG MOLD_VERSION
82105

83106
RUN <<EOF

docker/debian/README.md

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,10 @@ directory of the repository.
3838
```shell
3939
DEBIAN_VERSION=bookworm
4040
GCC_VERSION=12
41+
CCACHE_VERSION=4.12.2
42+
CMAKE_VERSION=4.1.0
4143
CONAN_VERSION=2.22.2
4244
GCOVR_VERSION=8.3
43-
CMAKE_VERSION=4.1.0
4445
MOLD_VERSION=2.40.4
4546
RUST_VERSION=1.91.1
4647
CONTAINER_IMAGE=ghcr.io/xrplf/ci/debian-${DEBIAN_VERSION}:gcc-${GCC_VERSION}
@@ -50,11 +51,12 @@ docker buildx build . \
5051
--target gcc \
5152
--build-arg BUILDKIT_DOCKERFILE_CHECK=skip=InvalidDefaultArgInFrom \
5253
--build-arg BUILDKIT_INLINE_CACHE=1 \
53-
--build-arg CONAN_VERSION=${CONAN_VERSION} \
5454
--build-arg DEBIAN_VERSION=${DEBIAN_VERSION} \
5555
--build-arg GCC_VERSION=${GCC_VERSION} \
56-
--build-arg GCOVR_VERSION=${GCOVR_VERSION} \
56+
--build-arg CCACHE_VERSION=${CCACHE_VERSION} \
5757
--build-arg CMAKE_VERSION=${CMAKE_VERSION} \
58+
--build-arg CONAN_VERSION=${CONAN_VERSION} \
59+
--build-arg GCOVR_VERSION=${GCOVR_VERSION} \
5860
--build-arg MOLD_VERSION=${MOLD_VERSION} \
5961
--build-arg RUST_VERSION=${RUST_VERSION} \
6062
--tag ${CONTAINER_IMAGE}
@@ -66,27 +68,29 @@ In order to build a GCC image for Bullseye, you also need to explicitly set
6668
```shell
6769
DEBIAN_VERSION=bullseye
6870
GCC_VERSION=12
71+
BASE_IMAGE=ghcr.io/xrplf/ci/gcc:${GCC_VERSION}-bullseye
72+
CCACHE_VERSION=4.12.2
73+
CMAKE_VERSION=4.1.0
6974
CONAN_VERSION=2.22.2
7075
GCOVR_VERSION=8.3
71-
CMAKE_VERSION=4.1.0
7276
MOLD_VERSION=2.40.4
7377
RUST_VERSION=1.91.1
74-
BASE_IMAGE=ghcr.io/xrplf/ci/gcc:12-bullseye
7578
CONTAINER_IMAGE=ghcr.io/xrplf/ci/debian-${DEBIAN_VERSION}:gcc-${GCC_VERSION}
7679

7780
docker buildx build . \
7881
--file docker/debian/Dockerfile \
7982
--target gcc \
8083
--build-arg BUILDKIT_DOCKERFILE_CHECK=skip=InvalidDefaultArgInFrom \
8184
--build-arg BUILDKIT_INLINE_CACHE=1 \
82-
--build-arg CONAN_VERSION=${CONAN_VERSION} \
8385
--build-arg DEBIAN_VERSION=${DEBIAN_VERSION} \
8486
--build-arg GCC_VERSION=${GCC_VERSION} \
85-
--build-arg GCOVR_VERSION=${GCOVR_VERSION} \
87+
--build-arg BASE_IMAGE=${BASE_IMAGE} \
88+
--build-arg CCACHE_VERSION=${CCACHE_VERSION} \
8689
--build-arg CMAKE_VERSION=${CMAKE_VERSION} \
90+
--build-arg CONAN_VERSION=${CONAN_VERSION} \
91+
--build-arg GCOVR_VERSION=${GCOVR_VERSION} \
8792
--build-arg MOLD_VERSION=${MOLD_VERSION} \
8893
--build-arg RUST_VERSION=${RUST_VERSION} \
89-
--build-arg BASE_IMAGE=${BASE_IMAGE} \
9094
--tag ${CONTAINER_IMAGE}
9195
```
9296

@@ -98,9 +102,10 @@ directory of the repository.
98102
```shell
99103
DEBIAN_VERSION=bookworm
100104
CLANG_VERSION=17
105+
CCACHE_VERSION=4.12.2
106+
CMAKE_VERSION=4.1.0
101107
CONAN_VERSION=2.22.2
102108
GCOVR_VERSION=8.3
103-
CMAKE_VERSION=4.1.0
104109
MOLD_VERSION=2.40.4
105110
RUST_VERSION=1.91.1
106111
CONTAINER_IMAGE=ghcr.io/xrplf/ci/debian-${DEBIAN_VERSION}:clang-${CLANG_VERSION}
@@ -110,11 +115,12 @@ docker buildx build . \
110115
--target clang \
111116
--build-arg BUILDKIT_DOCKERFILE_CHECK=skip=InvalidDefaultArgInFrom \
112117
--build-arg BUILDKIT_INLINE_CACHE=1 \
118+
--build-arg DEBIAN_VERSION=${DEBIAN_VERSION} \
113119
--build-arg CLANG_VERSION=${CLANG_VERSION} \
120+
--build-arg CCACHE_VERSION=${CCACHE_VERSION} \
121+
--build-arg CMAKE_VERSION=${CMAKE_VERSION} \
114122
--build-arg CONAN_VERSION=${CONAN_VERSION} \
115-
--build-arg DEBIAN_VERSION=${DEBIAN_VERSION} \
116123
--build-arg GCOVR_VERSION=${GCOVR_VERSION} \
117-
--build-arg CMAKE_VERSION=${CMAKE_VERSION} \
118124
--build-arg MOLD_VERSION=${MOLD_VERSION} \
119125
--build-arg RUST_VERSION=${RUST_VERSION} \
120126
--tag ${CONTAINER_IMAGE}

docker/rhel/Dockerfile

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,11 @@ EOF
2323
RUN <<EOF
2424
pkgs=()
2525
pkgs+=(ca-certificates) # Enable TLS verification for HTTPS connections by providing trusted root certificates.
26-
if [ "${RHEL_VERSION}" -eq "8" ]; then
26+
if [[ "${RHEL_VERSION}" == "8" ]]; then
2727
pkgs+=(binutils) # Required build tool.
2828
else
2929
pkgs+=(binutils-gold) # Required build tool.
3030
fi
31-
pkgs+=(ccache) # Optional build tool for caching build artifacts.
3231
pkgs+=(file) # Required packaging tool.
3332
pkgs+=(git) # Required build tool.
3433
pkgs+=(gpg) # Dependency for tools requiring signing or encrypting/decrypting.
@@ -91,7 +90,28 @@ RUN pip install --no-cache \
9190
gcovr==${GCOVR_VERSION} \
9291
cmake==${CMAKE_VERSION}
9392

94-
# Install mold https://github.com/rui314/mold
93+
# Install ccache. Note that the ccache version from the package manager is
94+
# installed for RHEL 8, as the latest version requires a newer GLIBC version,
95+
# and older compatible releases are x86-64 only.
96+
ARG CCACHE_VERSION
97+
98+
RUN <<EOF
99+
if [[ "${RHEL_VERSION}" == "8" ]]; then
100+
dnf update -y
101+
dnf install -y --allowerasing --setopt=tsflags=nodocs ccache
102+
dnf clean -y all
103+
rm -rf /var/cache/dnf/*
104+
else
105+
ARCH=$(uname -m)
106+
wget -O ccache.tar.xz https://github.com/ccache/ccache/releases/download/v${CCACHE_VERSION}/ccache-${CCACHE_VERSION}-linux-${ARCH}.tar.xz
107+
tar -xf ccache.tar.xz
108+
cp ccache-${CCACHE_VERSION}-linux-${ARCH}/ccache /usr/local/bin
109+
rm -r ccache-${CCACHE_VERSION}-linux-${ARCH}
110+
rm ccache.tar.xz
111+
fi
112+
EOF
113+
114+
# Install mold.
95115
ARG MOLD_VERSION
96116

97117
RUN <<EOF

docker/rhel/README.md

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,10 @@ directory of the repository.
2525
```shell
2626
RHEL_VERSION=9
2727
GCC_VERSION=12
28+
CCACHE_VERSION=4.12.2
29+
CMAKE_VERSION=4.1.0
2830
CONAN_VERSION=2.22.2
2931
GCOVR_VERSION=8.3
30-
CMAKE_VERSION=4.1.0
3132
MOLD_VERSION=2.40.4
3233
RUST_VERSION=1.91.1
3334
CONTAINER_IMAGE=ghcr.io/xrplf/ci/rhel-${RHEL_VERSION}:gcc-${GCC_VERSION}
@@ -37,13 +38,14 @@ docker buildx build . \
3738
--target gcc \
3839
--build-arg BUILDKIT_DOCKERFILE_CHECK=skip=InvalidDefaultArgInFrom \
3940
--build-arg BUILDKIT_INLINE_CACHE=1 \
40-
--build-arg CONAN_VERSION=${CONAN_VERSION} \
41+
--build-arg RHEL_VERSION=${RHEL_VERSION} \
4142
--build-arg GCC_VERSION=${GCC_VERSION} \
42-
--build-arg GCOVR_VERSION=${GCOVR_VERSION} \
43+
--build-arg CCACHE_VERSION=${CCACHE_VERSION} \
4344
--build-arg CMAKE_VERSION=${CMAKE_VERSION} \
45+
--build-arg CONAN_VERSION=${CONAN_VERSION} \
46+
--build-arg GCOVR_VERSION=${GCOVR_VERSION} \
4447
--build-arg MOLD_VERSION=${MOLD_VERSION} \
4548
--build-arg RUST_VERSION=${RUST_VERSION} \
46-
--build-arg RHEL_VERSION=${RHEL_VERSION} \
4749
--tag ${CONTAINER_IMAGE}
4850
```
4951

@@ -54,9 +56,10 @@ directory of the repository.
5456

5557
```shell
5658
RHEL_VERSION=10
59+
CCACHE_VERSION=4.12.2
60+
CMAKE_VERSION=4.1.0
5761
CONAN_VERSION=2.22.2
5862
GCOVR_VERSION=8.3
59-
CMAKE_VERSION=4.1.0
6063
MOLD_VERSION=2.40.4
6164
RUST_VERSION=1.91.1
6265
CONTAINER_IMAGE=ghcr.io/xrplf/ci/rhel-${RHEL_VERSION}:clang-any
@@ -66,12 +69,13 @@ docker buildx build . \
6669
--target clang \
6770
--build-arg BUILDKIT_DOCKERFILE_CHECK=skip=InvalidDefaultArgInFrom \
6871
--build-arg BUILDKIT_INLINE_CACHE=1 \
72+
--build-arg RHEL_VERSION=${RHEL_VERSION} \
73+
--build-arg CCACHE_VERSION=${CCACHE_VERSION} \
74+
--build-arg CMAKE_VERSION=${CMAKE_VERSION} \
6975
--build-arg CONAN_VERSION=${CONAN_VERSION} \
7076
--build-arg GCOVR_VERSION=${GCOVR_VERSION} \
71-
--build-arg CMAKE_VERSION=${CMAKE_VERSION} \
7277
--build-arg MOLD_VERSION=${MOLD_VERSION} \
7378
--build-arg RUST_VERSION=${RUST_VERSION} \
74-
--build-arg RHEL_VERSION=${RHEL_VERSION} \
7579
--tag ${CONTAINER_IMAGE}
7680
```
7781

docker/ubuntu/Dockerfile

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ RUN <<EOF
2727
pkgs=()
2828
pkgs+=(ca-certificates) # Enable TLS verification for HTTPS connections by providing trusted root certificates.
2929
pkgs+=(binutils-gold) # Required build tool.
30-
pkgs+=(ccache) # Optional build tool for caching build artifacts.
3130
pkgs+=(curl) # Dependency for tools requiring downloading data.
3231
pkgs+=(dpkg-dev) # Required packaging tool.
3332
pkgs+=(file) # Required packaging tool.
@@ -63,7 +62,19 @@ RUN pip install --no-cache \
6362
gcovr==${GCOVR_VERSION} \
6463
cmake==${CMAKE_VERSION}
6564

66-
# Install mold https://github.com/rui314/mold
65+
# Install ccache.
66+
ARG CCACHE_VERSION
67+
68+
RUN <<EOF
69+
ARCH=$(uname -m)
70+
wget -O ccache.tar.xz https://github.com/ccache/ccache/releases/download/v${CCACHE_VERSION}/ccache-${CCACHE_VERSION}-linux-${ARCH}.tar.xz
71+
tar -xf ccache.tar.xz
72+
cp ccache-${CCACHE_VERSION}-linux-${ARCH}/ccache /usr/local/bin
73+
rm -r ccache-${CCACHE_VERSION}-linux-${ARCH}
74+
rm ccache.tar.xz
75+
EOF
76+
77+
# Install mold.
6778
ARG MOLD_VERSION
6879

6980
RUN <<EOF

0 commit comments

Comments
 (0)