mirror of
https://github.com/qemu/qemu.git
synced 2024-12-15 07:23:52 +08:00
2f7350cd43
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>
90 lines
3.1 KiB
YAML
90 lines
3.1 KiB
YAML
.cross_system_build_job:
|
|
extends: .base_job_template
|
|
stage: build
|
|
image: $CI_REGISTRY_IMAGE/qemu/$IMAGE:$QEMU_CI_CONTAINER_TAG
|
|
cache:
|
|
paths:
|
|
- ccache
|
|
key: "$CI_JOB_NAME"
|
|
when: always
|
|
timeout: 80m
|
|
script:
|
|
- export CCACHE_BASEDIR="$(pwd)"
|
|
- export CCACHE_DIR="$CCACHE_BASEDIR/ccache"
|
|
- export CCACHE_MAXSIZE="500M"
|
|
- export PATH="$CCACHE_WRAPPERSDIR:$PATH"
|
|
- mkdir build
|
|
- cd build
|
|
- ccache --zero-stats
|
|
- ../configure --enable-werror --disable-docs --enable-fdt=system
|
|
--disable-user $QEMU_CONFIGURE_OPTS $EXTRA_CONFIGURE_OPTS
|
|
--target-list-exclude="arm-softmmu cris-softmmu
|
|
i386-softmmu microblaze-softmmu mips-softmmu mipsel-softmmu
|
|
mips64-softmmu ppc-softmmu riscv32-softmmu sh4-softmmu
|
|
sparc-softmmu xtensa-softmmu $CROSS_SKIP_TARGETS"
|
|
- make -j$(expr $(nproc) + 1) all check-build $MAKE_CHECK_ARGS
|
|
- if grep -q "EXESUF=.exe" config-host.mak;
|
|
then make installer;
|
|
version="$(git describe --match v[0-9]* 2>/dev/null || git rev-parse --short HEAD)";
|
|
mv -v qemu-setup*.exe qemu-setup-${version}.exe;
|
|
fi
|
|
- ccache --show-stats
|
|
|
|
# Job to cross-build specific accelerators.
|
|
#
|
|
# Set the $ACCEL variable to select the specific accelerator (default to
|
|
# KVM), and set extra options (such disabling other accelerators) via the
|
|
# $EXTRA_CONFIGURE_OPTS variable.
|
|
.cross_accel_build_job:
|
|
extends: .base_job_template
|
|
stage: build
|
|
image: $CI_REGISTRY_IMAGE/qemu/$IMAGE:$QEMU_CI_CONTAINER_TAG
|
|
timeout: 30m
|
|
cache:
|
|
paths:
|
|
- ccache/
|
|
key: "$CI_JOB_NAME"
|
|
script:
|
|
- export CCACHE_BASEDIR="$(pwd)"
|
|
- export CCACHE_DIR="$CCACHE_BASEDIR/ccache"
|
|
- export CCACHE_MAXSIZE="500M"
|
|
- export PATH="$CCACHE_WRAPPERSDIR:$PATH"
|
|
- mkdir build
|
|
- cd build
|
|
- ../configure --enable-werror --disable-docs $QEMU_CONFIGURE_OPTS
|
|
--disable-tools --enable-${ACCEL:-kvm} $EXTRA_CONFIGURE_OPTS
|
|
- make -j$(expr $(nproc) + 1) all check-build $MAKE_CHECK_ARGS
|
|
|
|
.cross_user_build_job:
|
|
extends: .base_job_template
|
|
stage: build
|
|
image: $CI_REGISTRY_IMAGE/qemu/$IMAGE:$QEMU_CI_CONTAINER_TAG
|
|
cache:
|
|
paths:
|
|
- ccache/
|
|
key: "$CI_JOB_NAME"
|
|
script:
|
|
- export CCACHE_BASEDIR="$(pwd)"
|
|
- export CCACHE_DIR="$CCACHE_BASEDIR/ccache"
|
|
- export CCACHE_MAXSIZE="500M"
|
|
- mkdir build
|
|
- cd build
|
|
- ../configure --enable-werror --disable-docs $QEMU_CONFIGURE_OPTS
|
|
--disable-system --target-list-exclude="aarch64_be-linux-user
|
|
alpha-linux-user cris-linux-user m68k-linux-user microblazeel-linux-user
|
|
nios2-linux-user or1k-linux-user ppc-linux-user sparc-linux-user
|
|
xtensa-linux-user $CROSS_SKIP_TARGETS"
|
|
- make -j$(expr $(nproc) + 1) all check-build $MAKE_CHECK_ARGS
|
|
|
|
# We can still run some tests on some of our cross build jobs. They can add this
|
|
# template to their extends to save the build logs and test results
|
|
.cross_test_artifacts:
|
|
artifacts:
|
|
name: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG"
|
|
when: always
|
|
expire_in: 7 days
|
|
paths:
|
|
- build/meson-logs/testlog.txt
|
|
reports:
|
|
junit: build/meson-logs/testlog.junit.xml
|