build-cran-binaries/local/compiler-cache.sh
pat-s 7f6a15abb2
perf(ci): route compiles through ccache and use parallel make
Prepend ccache's masquerade dir to PATH in the build pipelines and set the ccache options that make hits possible for R's per-package temp dirs, plus MAKEFLAGS matched to each step's CPU limit.
2026-10-23 13:16:33 +00:00

32 lines
1.5 KiB
Shell

# Sourced (`. local/compiler-cache.sh`) by the build pipelines before any
# package is compiled. POSIX sh: the Alpine images run steps under busybox.
#
# Routes gcc/g++ through ccache. The images name their compilers by bare
# `gcc`/`g++` in both R's Makeconf and /root/.R/Makevars, so prepending ccache's
# masquerade dir catches every compile, CMake-driven vendored builds included.
# Wrapping CC in a Makevars instead would need R_MAKEVARS_USER, which replaces
# the images' /root/.R/Makevars (CXX_STD, the musl defines) rather than adding
# to it. The dir differs per distro: Alpine, RHEL, Debian/Ubuntu.
for dir in /usr/lib/ccache/bin /usr/lib64/ccache /usr/lib/ccache; do
if [ -x "$dir/gcc" ]; then
PATH="$dir:$PATH"
break
fi
done
export PATH
# R compiles every package in a fresh /tmp/RtmpXXXXXX/<pkg> dir. R's default
# flags include -g, which makes ccache hash the working directory, and the line
# markers carry the absolute source path, so without these two settings no
# compile ever hits the cache across runs.
export CCACHE_BASEDIR="${CCACHE_BASEDIR:-/tmp}"
export CCACHE_NOHASHDIR=1
# The images are rebuilt regularly, which changes the compiler's mtime but not
# its content. ccache's default mtime check would discard the cache each time.
export CCACHE_COMPILERCHECK=content
# Parallel make inside a single package build. Match it to the step's CPU limit
# via MAKE_JOBS; an explicit MAKEFLAGS wins.
export MAKEFLAGS="${MAKEFLAGS:--j${MAKE_JOBS:-2}}"
echo "compiler-cache: $(command -v gcc), CCACHE_DIR=${CCACHE_DIR:-unset}, MAKEFLAGS=$MAKEFLAGS"