gitlab: enable ccache for many build jobs
The `ccache` tool can be very effective at reducing compilation times when re-running pipelines with only minor changes each time. For example a fresh 'build-system-fedora' job will typically take 20 minutes on the gitlab.com shared runners. With ccache this is reduced to as little as 6 minutes. Normally meson would auto-detect existance of ccache in $PATH and use it automatically, but the way we wrap meson from configure breaks this, as we're passing in an config file with explicitly set compiler paths. Thus we need to add $CCACHE_WRAPPERSPATH to the front of $PATH. For unknown reasons if doing this in msys though, gcc becomes unable to invoke 'cc1' when run from meson. For msys we thus set CC='ccache gcc' before invoking 'configure' instead. A second problem with msys is that cache misses are incredibly expensive, so enabling ccache massively slows down the build when the cache isn't well populated. This is suspected to be a result of the cost of spawning processes under the msys architecture. To deal with this we set CCACHE_DEPEND=1 which enables ccache's 'depend_only' strategy. This avoids extra spawning of the pre-processor during cache misses, with the downside that is it less likely ccache will find a cache hit after semantically benign compiler flag changes. This is the lesser of two evils, as otherwise we can't use ccache at all under msys and remain inside the job time limit. If people are finding ccache to hurt their pipelines, it can be disabled by setting the 'CCACHE_DISABLE=1' env variable against their gitlab fork CI settings. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Message-Id: <20230804111054.281802-2-berrange@redhat.com> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <20230829161528.2707696-2-alex.bennee@linaro.org>
This commit is contained in:
parent
813bac3d8d
commit
2f7350cd43
@ -2,11 +2,21 @@
|
|||||||
extends: .base_job_template
|
extends: .base_job_template
|
||||||
stage: build
|
stage: build
|
||||||
image: $CI_REGISTRY_IMAGE/qemu/$IMAGE:$QEMU_CI_CONTAINER_TAG
|
image: $CI_REGISTRY_IMAGE/qemu/$IMAGE:$QEMU_CI_CONTAINER_TAG
|
||||||
|
cache:
|
||||||
|
paths:
|
||||||
|
- ccache
|
||||||
|
key: "$CI_JOB_NAME"
|
||||||
|
when: always
|
||||||
before_script:
|
before_script:
|
||||||
- JOBS=$(expr $(nproc) + 1)
|
- JOBS=$(expr $(nproc) + 1)
|
||||||
script:
|
script:
|
||||||
|
- export CCACHE_BASEDIR="$(pwd)"
|
||||||
|
- export CCACHE_DIR="$CCACHE_BASEDIR/ccache"
|
||||||
|
- export CCACHE_MAXSIZE="500M"
|
||||||
|
- export PATH="$CCACHE_WRAPPERSDIR:$PATH"
|
||||||
- mkdir build
|
- mkdir build
|
||||||
- cd build
|
- cd build
|
||||||
|
- ccache --zero-stats
|
||||||
- ../configure --enable-werror --disable-docs --enable-fdt=system
|
- ../configure --enable-werror --disable-docs --enable-fdt=system
|
||||||
${TARGETS:+--target-list="$TARGETS"}
|
${TARGETS:+--target-list="$TARGETS"}
|
||||||
$CONFIGURE_ARGS ||
|
$CONFIGURE_ARGS ||
|
||||||
@ -20,6 +30,7 @@
|
|||||||
then
|
then
|
||||||
make -j"$JOBS" $MAKE_CHECK_ARGS ;
|
make -j"$JOBS" $MAKE_CHECK_ARGS ;
|
||||||
fi
|
fi
|
||||||
|
- ccache --show-stats
|
||||||
|
|
||||||
# We jump some hoops in common_test_job_template to avoid
|
# We jump some hoops in common_test_job_template to avoid
|
||||||
# rebuilding all the object files we skip in the artifacts
|
# rebuilding all the object files we skip in the artifacts
|
||||||
|
@ -2,10 +2,20 @@
|
|||||||
extends: .base_job_template
|
extends: .base_job_template
|
||||||
stage: build
|
stage: build
|
||||||
image: $CI_REGISTRY_IMAGE/qemu/$IMAGE:$QEMU_CI_CONTAINER_TAG
|
image: $CI_REGISTRY_IMAGE/qemu/$IMAGE:$QEMU_CI_CONTAINER_TAG
|
||||||
|
cache:
|
||||||
|
paths:
|
||||||
|
- ccache
|
||||||
|
key: "$CI_JOB_NAME"
|
||||||
|
when: always
|
||||||
timeout: 80m
|
timeout: 80m
|
||||||
script:
|
script:
|
||||||
|
- export CCACHE_BASEDIR="$(pwd)"
|
||||||
|
- export CCACHE_DIR="$CCACHE_BASEDIR/ccache"
|
||||||
|
- export CCACHE_MAXSIZE="500M"
|
||||||
|
- export PATH="$CCACHE_WRAPPERSDIR:$PATH"
|
||||||
- mkdir build
|
- mkdir build
|
||||||
- cd build
|
- cd build
|
||||||
|
- ccache --zero-stats
|
||||||
- ../configure --enable-werror --disable-docs --enable-fdt=system
|
- ../configure --enable-werror --disable-docs --enable-fdt=system
|
||||||
--disable-user $QEMU_CONFIGURE_OPTS $EXTRA_CONFIGURE_OPTS
|
--disable-user $QEMU_CONFIGURE_OPTS $EXTRA_CONFIGURE_OPTS
|
||||||
--target-list-exclude="arm-softmmu cris-softmmu
|
--target-list-exclude="arm-softmmu cris-softmmu
|
||||||
@ -18,6 +28,7 @@
|
|||||||
version="$(git describe --match v[0-9]* 2>/dev/null || git rev-parse --short HEAD)";
|
version="$(git describe --match v[0-9]* 2>/dev/null || git rev-parse --short HEAD)";
|
||||||
mv -v qemu-setup*.exe qemu-setup-${version}.exe;
|
mv -v qemu-setup*.exe qemu-setup-${version}.exe;
|
||||||
fi
|
fi
|
||||||
|
- ccache --show-stats
|
||||||
|
|
||||||
# Job to cross-build specific accelerators.
|
# Job to cross-build specific accelerators.
|
||||||
#
|
#
|
||||||
@ -29,7 +40,15 @@
|
|||||||
stage: build
|
stage: build
|
||||||
image: $CI_REGISTRY_IMAGE/qemu/$IMAGE:$QEMU_CI_CONTAINER_TAG
|
image: $CI_REGISTRY_IMAGE/qemu/$IMAGE:$QEMU_CI_CONTAINER_TAG
|
||||||
timeout: 30m
|
timeout: 30m
|
||||||
|
cache:
|
||||||
|
paths:
|
||||||
|
- ccache/
|
||||||
|
key: "$CI_JOB_NAME"
|
||||||
script:
|
script:
|
||||||
|
- export CCACHE_BASEDIR="$(pwd)"
|
||||||
|
- export CCACHE_DIR="$CCACHE_BASEDIR/ccache"
|
||||||
|
- export CCACHE_MAXSIZE="500M"
|
||||||
|
- export PATH="$CCACHE_WRAPPERSDIR:$PATH"
|
||||||
- mkdir build
|
- mkdir build
|
||||||
- cd build
|
- cd build
|
||||||
- ../configure --enable-werror --disable-docs $QEMU_CONFIGURE_OPTS
|
- ../configure --enable-werror --disable-docs $QEMU_CONFIGURE_OPTS
|
||||||
@ -40,7 +59,14 @@
|
|||||||
extends: .base_job_template
|
extends: .base_job_template
|
||||||
stage: build
|
stage: build
|
||||||
image: $CI_REGISTRY_IMAGE/qemu/$IMAGE:$QEMU_CI_CONTAINER_TAG
|
image: $CI_REGISTRY_IMAGE/qemu/$IMAGE:$QEMU_CI_CONTAINER_TAG
|
||||||
|
cache:
|
||||||
|
paths:
|
||||||
|
- ccache/
|
||||||
|
key: "$CI_JOB_NAME"
|
||||||
script:
|
script:
|
||||||
|
- export CCACHE_BASEDIR="$(pwd)"
|
||||||
|
- export CCACHE_DIR="$CCACHE_BASEDIR/ccache"
|
||||||
|
- export CCACHE_MAXSIZE="500M"
|
||||||
- mkdir build
|
- mkdir build
|
||||||
- cd build
|
- cd build
|
||||||
- ../configure --enable-werror --disable-docs $QEMU_CONFIGURE_OPTS
|
- ../configure --enable-werror --disable-docs $QEMU_CONFIGURE_OPTS
|
||||||
|
@ -5,13 +5,14 @@
|
|||||||
- windows
|
- windows
|
||||||
- windows-1809
|
- windows-1809
|
||||||
cache:
|
cache:
|
||||||
key: "${CI_JOB_NAME}-cache"
|
key: "$CI_JOB_NAME"
|
||||||
paths:
|
paths:
|
||||||
- msys64/var/cache
|
- msys64/var/cache
|
||||||
|
- ccache
|
||||||
when: always
|
when: always
|
||||||
needs: []
|
needs: []
|
||||||
stage: build
|
stage: build
|
||||||
timeout: 80m
|
timeout: 100m
|
||||||
variables:
|
variables:
|
||||||
# This feature doesn't (currently) work with PowerShell, it stops
|
# This feature doesn't (currently) work with PowerShell, it stops
|
||||||
# the echo'ing of commands being run and doesn't show any timing
|
# the echo'ing of commands being run and doesn't show any timing
|
||||||
@ -72,6 +73,7 @@
|
|||||||
bison diffutils flex
|
bison diffutils flex
|
||||||
git grep make sed
|
git grep make sed
|
||||||
$MINGW_TARGET-capstone
|
$MINGW_TARGET-capstone
|
||||||
|
$MINGW_TARGET-ccache
|
||||||
$MINGW_TARGET-curl
|
$MINGW_TARGET-curl
|
||||||
$MINGW_TARGET-cyrus-sasl
|
$MINGW_TARGET-cyrus-sasl
|
||||||
$MINGW_TARGET-dtc
|
$MINGW_TARGET-dtc
|
||||||
@ -101,11 +103,18 @@
|
|||||||
- Write-Output "Running build at $(Get-Date -Format u)"
|
- Write-Output "Running build at $(Get-Date -Format u)"
|
||||||
- $env:CHERE_INVOKING = 'yes' # Preserve the current working directory
|
- $env:CHERE_INVOKING = 'yes' # Preserve the current working directory
|
||||||
- $env:MSYS = 'winsymlinks:native' # Enable native Windows symlink
|
- $env:MSYS = 'winsymlinks:native' # Enable native Windows symlink
|
||||||
|
- $env:CCACHE_BASEDIR = "$env:CI_PROJECT_DIR"
|
||||||
|
- $env:CCACHE_DIR = "$env:CCACHE_BASEDIR/ccache"
|
||||||
|
- $env:CCACHE_MAXSIZE = "500M"
|
||||||
|
- $env:CCACHE_DEPEND = 1 # cache misses are too expensive with preprocessor mode
|
||||||
|
- $env:CC = "ccache gcc"
|
||||||
- mkdir build
|
- mkdir build
|
||||||
- cd build
|
- cd build
|
||||||
|
- ..\msys64\usr\bin\bash -lc "ccache --zero-stats"
|
||||||
- ..\msys64\usr\bin\bash -lc "../configure --enable-fdt=system $CONFIGURE_ARGS"
|
- ..\msys64\usr\bin\bash -lc "../configure --enable-fdt=system $CONFIGURE_ARGS"
|
||||||
- ..\msys64\usr\bin\bash -lc "make"
|
- ..\msys64\usr\bin\bash -lc "make"
|
||||||
- ..\msys64\usr\bin\bash -lc "make check MTESTARGS='$TEST_ARGS' || { cat meson-logs/testlog.txt; exit 1; } ;"
|
- ..\msys64\usr\bin\bash -lc "make check MTESTARGS='$TEST_ARGS' || { cat meson-logs/testlog.txt; exit 1; } ;"
|
||||||
|
- ..\msys64\usr\bin\bash -lc "ccache --show-stats"
|
||||||
- Write-Output "Finished build at $(Get-Date -Format u)"
|
- Write-Output "Finished build at $(Get-Date -Format u)"
|
||||||
|
|
||||||
msys2-64bit:
|
msys2-64bit:
|
||||||
|
@ -188,3 +188,10 @@ If you've got access to a CentOS Stream 8 x86_64 host that can be
|
|||||||
used as a gitlab-CI runner, you can set this variable to enable the
|
used as a gitlab-CI runner, you can set this variable to enable the
|
||||||
tests that require this kind of host. The runner should be tagged with
|
tests that require this kind of host. The runner should be tagged with
|
||||||
both "centos_stream_8" and "x86_64".
|
both "centos_stream_8" and "x86_64".
|
||||||
|
|
||||||
|
CCACHE_DISABLE
|
||||||
|
~~~~~~~~~~~~~~
|
||||||
|
The jobs are configured to use "ccache" by default since this typically
|
||||||
|
reduces compilation time, at the cost of increased storage. If the
|
||||||
|
use of "ccache" is suspected to be hurting the overall job execution
|
||||||
|
time, setting the "CCACHE_DISABLE=1" env variable to disable it.
|
||||||
|
@ -15,6 +15,7 @@ RUN apt-get update && \
|
|||||||
# Install common build utilities
|
# Install common build utilities
|
||||||
apt-get install -y --no-install-recommends \
|
apt-get install -y --no-install-recommends \
|
||||||
curl \
|
curl \
|
||||||
|
ccache \
|
||||||
xz-utils \
|
xz-utils \
|
||||||
ca-certificates \
|
ca-certificates \
|
||||||
bison \
|
bison \
|
||||||
@ -27,7 +28,12 @@ RUN apt-get update && \
|
|||||||
python3-wheel && \
|
python3-wheel && \
|
||||||
# Install QEMU build deps for use in CI
|
# Install QEMU build deps for use in CI
|
||||||
DEBIAN_FRONTEND=noninteractive eatmydata \
|
DEBIAN_FRONTEND=noninteractive eatmydata \
|
||||||
apt build-dep -yy --arch-only qemu
|
apt build-dep -yy --arch-only qemu && \
|
||||||
|
mkdir -p /usr/libexec/ccache-wrappers && \
|
||||||
|
ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/c++ && \
|
||||||
|
ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc && \
|
||||||
|
ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/g++ && \
|
||||||
|
ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc
|
||||||
|
|
||||||
RUN /usr/bin/pip3 install tomli
|
RUN /usr/bin/pip3 install tomli
|
||||||
|
|
||||||
@ -35,6 +41,7 @@ ENV TOOLCHAIN_INSTALL /opt
|
|||||||
ENV TOOLCHAIN_RELEASE 16.0.0
|
ENV TOOLCHAIN_RELEASE 16.0.0
|
||||||
ENV TOOLCHAIN_BASENAME "clang+llvm-${TOOLCHAIN_RELEASE}-cross-hexagon-unknown-linux-musl"
|
ENV TOOLCHAIN_BASENAME "clang+llvm-${TOOLCHAIN_RELEASE}-cross-hexagon-unknown-linux-musl"
|
||||||
ENV TOOLCHAIN_URL https://codelinaro.jfrog.io/artifactory/codelinaro-toolchain-for-hexagon/v${TOOLCHAIN_RELEASE}/${TOOLCHAIN_BASENAME}.tar.xz
|
ENV TOOLCHAIN_URL https://codelinaro.jfrog.io/artifactory/codelinaro-toolchain-for-hexagon/v${TOOLCHAIN_RELEASE}/${TOOLCHAIN_BASENAME}.tar.xz
|
||||||
|
ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
|
||||||
|
|
||||||
RUN curl -#SL "$TOOLCHAIN_URL" | tar -xJC "$TOOLCHAIN_INSTALL"
|
RUN curl -#SL "$TOOLCHAIN_URL" | tar -xJC "$TOOLCHAIN_INSTALL"
|
||||||
ENV PATH $PATH:${TOOLCHAIN_INSTALL}/${TOOLCHAIN_BASENAME}/x86_64-linux-gnu/bin
|
ENV PATH $PATH:${TOOLCHAIN_INSTALL}/${TOOLCHAIN_BASENAME}/x86_64-linux-gnu/bin
|
||||||
|
Loading…
Reference in New Issue
Block a user