On 9/15/2026 10:10 AM, Alex Bennée wrote: > Pierrick Bouvier <[email protected]> writes: > >> On 9/14/2026 12:28 AM, Alex Bennée wrote: >>> Pierrick Bouvier <[email protected]> writes: >>> >>>> On 9/10/26 11:15 AM, Alex Bennée wrote: >>>>> Previously we had the default baked into Makefile.include but as the >>>>> meson container logic will also benefit from it we update the configure >>>>> machinery. >>>>> For now we allow direct make invocations to override but for the >>>>> normal case it is in one place now. >>>>> Signed-off-by: Alex Bennée <[email protected]> >>>>> --- >>>>> configure | 8 ++++++++ >>>>> meson_options.txt | 3 +++ >>>>> tests/docker/Makefile.include | 4 +--- >>>>> tests/tcg/meson.build | 6 ++++++ >>>>> 4 files changed, 18 insertions(+), 3 deletions(-) >>>>> diff --git a/configure b/configure >>>>> index aaa41fe47aa..7d6b11ddd35 100755 >>>>> --- a/configure >>>>> +++ b/configure >>>>> @@ -172,6 +172,7 @@ fi >>>>> # some defaults, based on the host environment >>>>> # default parameters >>>>> +container_registry="registry.gitlab.com/qemu-project/qemu" >>>>> cpu="" >>>>> cross_compile="no" >>>>> cross_prefix="" >>>>> @@ -728,6 +729,9 @@ for opt do >>>>> ;; >>>>> --container-command=*) meson_option_add -Dcontainer_command="$optarg" >>>>> ;; >>>>> + --container-registry=*) container_registry="$optarg" >>>>> + meson_option_add -Dcontainer_registry="$optarg" >>>>> + ;; >>>>> --rust-target-triple=*) rust_target_triple="$optarg" >>>>> ;; >>>>> --gdb=*) meson_option_add -Dgdb="$optarg" >>>>> @@ -862,6 +866,7 @@ Advanced options (experts only): >>>>> --cpu=CPU Build for host CPU [$cpu] >>>>> --disable-containers don't use containers for cross-building >>>>> --container-command=CMD which container command to use [autodetect] >>>>> + --container-registry=URL which container registry to cache from >>>>> [$container_registry] >>>>> --gdb=GDB-path gdb to use for gdbstub tests [autodetect] >>>>> --wasm64-32bit-address-limit Restrict wasm64 address space to 32-bit >>>>> (default >>>>> is to use the whole 64-bit range). >>>>> @@ -1318,6 +1323,9 @@ echo "GENISOIMAGE=$genisoimage" >> $config_host_mak >>>>> echo "MESON=$meson" >> $config_host_mak >>>>> echo "NINJA=$ninja" >> $config_host_mak >>>>> echo "EXESUF=$EXESUF" >> $config_host_mak >>>>> +if test -n "$container_registry"; then >>>>> + echo "DOCKER_DEFAULT_REGISTRY=$container_registry" >> $config_host_mak >>>>> +fi >>>>> if test "$default_targets" = "yes"; then >>>>> echo "CONFIG_DEFAULT_TARGETS=y" >> $config_host_mak >>>>> fi >>>>> diff --git a/meson_options.txt b/meson_options.txt >>>>> index 292625af08a..030231492e1 100644 >>>>> --- a/meson_options.txt >>>>> +++ b/meson_options.txt >>>>> @@ -391,6 +391,9 @@ option('containers', type: 'boolean', value: true, >>>>> description: 'use containers to cross compile tcg tests') >>>>> option('container_command', type: 'string', >>>>> description: 'command to build/run containers') >>>>> +option('container_registry', type: 'string', >>>>> + value: 'registry.gitlab.com/qemu-project/qemu', >>>>> + description: 'container registry to cache from') >>>>> option('tcg_tests_cross_cc_aarch64', type: 'string', >>>>> description: 'cc for aarch64 tcg tests') >>>>> diff --git a/tests/docker/Makefile.include b/tests/docker/Makefile.include >>>>> index 0adddb6a5c6..74bf471f171 100644 >>>>> --- a/tests/docker/Makefile.include >>>>> +++ b/tests/docker/Makefile.include >>>>> @@ -11,9 +11,7 @@ USER = $(if $(NOUSER),,$(shell id -un)) >>>>> UID = $(if $(NOUSER),,$(shell id -u)) >>>>> DOCKER_FILES_DIR := $(SRC_PATH)/tests/docker/dockerfiles >>>>> -ifeq ($(HOST_ARCH),x86_64) >>>>> -DOCKER_DEFAULT_REGISTRY := registry.gitlab.com/qemu-project/qemu >>>>> -endif >>>>> +DOCKER_DEFAULT_REGISTRY ?= registry.gitlab.com/qemu-project/qemu >>>>> DOCKER_REGISTRY := $(if >>>>> $(REGISTRY),$(REGISTRY),$(DOCKER_DEFAULT_REGISTRY)) >>>>> >>>> >>>> Couldn't we read the default from config_host_mak generated by >>>> configure instead? >>>> >>>>> CONTAINER_COMMAND ?= $(shell $(SRC_PATH)/tests/docker/docker.py probe) >>>>> diff --git a/tests/tcg/meson.build b/tests/tcg/meson.build >>>>> index 814f2f8cd8c..22157a47c96 100644 >>>>> --- a/tests/tcg/meson.build >>>>> +++ b/tests/tcg/meson.build >>>>> @@ -101,6 +101,9 @@ if get_option('containers') >>>>> endif >>>>> endif >>>>> tcg_tests_summary += {'container command': container_command} >>>>> +if get_option('container_registry') != '' >>>>> + tcg_tests_summary += {'container registry': >>>>> get_option('container_registry')} >>>>> +endif >>>>> # plugins come first, as we need to build the list >>>>> test_plugins = {} >>>>> @@ -257,6 +260,9 @@ foreach target, plan: tcg_tests >>>>> if cc_dockerfile not in image_targets and has_docker >>>>> cmd = [docker_wrapper, 'build', '-f', dockerfile, '-t', 'qemu/' + >>>>> cc_dockerfile, >>>>> '--add-current-user'] >>>>> + if get_option('container_registry') != '' >>>>> + cmd += ['--registry', get_option('container_registry')] >>>>> + endif >>>>> t = custom_target(image_name, command: cmd, >>>>> build_by_default: false, >>>>> output: 'no_output_' + image_name) >>>> >>>> Do user benefit from this, or is it mostly for CI need? >>> >>> The aim is for faster image builds because the CI registry should always >>> be up to date. Most of the time the images don't change. >>> >> >> Ok. In this case, you need to add --timestamp 0 (that's enough in what I >> tested) to original build command that generates those layers from our >> CI, and use it here also. Else --cache-from does not work as intended >> and you'll see have some duplication because timestamp is part of hash >> for each layer. >> >> See this guide for more info: >> https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/10/html/building_running_and_managing_containers/introduction-to-reproducible-container-builds > > Hmm is that a podman only option? >
Yes, indeed. Portable option seems to be: --build-arg SOURCE_DATE_EPOCH=0. You can experiment with this using a personal registry (like dockerhub). 1. Build an image with: --cache-to myregistry --build-arg SOURCE_DATE_EPOCH=0. 2. Then purge image and all its layers. 3. Rebuild it using: --cache-from myregistry --build-arg SOURCE_DATE_EPOCH=0. => You should observe that all layers are effectively cached. See a concrete example here: original build: https://github.com/p-b-o/qemu-ci/actions/runs/34837577836/job/103954828254#step:4:3170 cached build: https://github.com/p-b-o/qemu-ci/actions/runs/34806642832/job/103859733976#step:6:9 Disclaimer: I exclusively use podman (for years), so not sure if docker has its own idiosyncrasies on top. >>>> The effect is to use --cache-from $registry, which I'm not sure is >>>> what we want by default, given all the "caching issues" we had >>>> previously with dockerfiles already. >>>> If that's for CI, maybe it could simply set with --container-command >>>> in our CI only. >>>> >>>> Regards, >>>> Pierrick >>> >
