]>
Commit | Line | Data |
---|---|---|
324027c2 FZ |
1 | # Makefile for Docker tests |
2 | ||
6147c249 | 3 | .PHONY: docker docker-help docker-test docker-clean docker-image docker-qemu-src |
324027c2 | 4 | |
660f7930 PB |
5 | NULL := |
6 | SPACE := $(NULL) # | |
7 | COMMA := , | |
8 | ||
06746324 AB |
9 | HOST_ARCH = $(if $(ARCH),$(ARCH),$(shell uname -m)) |
10 | ||
324027c2 | 11 | DOCKER_FILES_DIR := $(SRC_PATH)/tests/docker/dockerfiles |
34019198 AB |
12 | ifeq ($(HOST_ARCH),x86_64) |
13 | DOCKER_DEFAULT_REGISTRY := registry.gitlab.com/qemu-project/qemu | |
14 | endif | |
15 | DOCKER_REGISTRY := $(if $(REGISTRY),$(REGISTRY),$(DOCKER_DEFAULT_REGISTRY)) | |
324027c2 | 16 | |
05af039d | 17 | ENGINE := auto |
05af039d | 18 | DOCKER_SCRIPT=$(SRC_PATH)/tests/docker/docker.py --engine $(ENGINE) |
e27cae26 | 19 | |
324027c2 | 20 | CUR_TIME := $(shell date +%Y-%m-%d-%H.%M.%S.$$$$) |
bc739b8e | 21 | DOCKER_SRC_COPY := $(BUILD_DIR)/docker-src.$(CUR_TIME) |
324027c2 | 22 | |
b28ef6b9 | 23 | .DELETE_ON_ERROR: $(DOCKER_SRC_COPY) |
324027c2 FZ |
24 | $(DOCKER_SRC_COPY): |
25 | @mkdir $@ | |
73fb4f1d FZ |
26 | $(if $(SRC_ARCHIVE), \ |
27 | $(call quiet-command, cp "$(SRC_ARCHIVE)" $@/qemu.tar, \ | |
28 | "CP", "$@/qemu.tar"), \ | |
29 | $(call quiet-command, cd $(SRC_PATH) && scripts/archive-source.sh $@/qemu.tar, \ | |
30 | "GEN", "$@/qemu.tar")) | |
324027c2 | 31 | $(call quiet-command, cp $(SRC_PATH)/tests/docker/run $@/run, \ |
0bdb12c7 | 32 | "COPY","RUNNER") |
324027c2 FZ |
33 | |
34 | docker-qemu-src: $(DOCKER_SRC_COPY) | |
35 | ||
77162849 | 36 | # General rule for building docker images. |
324027c2 FZ |
37 | docker-image-%: $(DOCKER_FILES_DIR)/%.docker |
38 | $(call quiet-command,\ | |
767b6bd2 | 39 | $(DOCKER_SCRIPT) build -t qemu/$* -f $< \ |
e6f1306b AB |
40 | $(if $V,,--quiet) \ |
41 | $(if $(NOCACHE),--no-cache, \ | |
42 | $(if $(DOCKER_REGISTRY),--registry $(DOCKER_REGISTRY))) \ | |
414a8ce5 | 43 | $(if $(NOUSER),,--add-current-user) \ |
4c84f662 | 44 | $(if $(EXTRA_FILES),--extra-files $(EXTRA_FILES))\ |
b7c851b2 | 45 | $(if $(EXECUTABLE),--include-executable=$(EXECUTABLE)),\ |
0bdb12c7 | 46 | "BUILD","$*") |
dc338fdb AB |
47 | |
48 | # Special rule for debootstraped binfmt linux-user images | |
49 | docker-binfmt-image-debian-%: $(DOCKER_FILES_DIR)/debian-bootstrap.docker | |
50 | $(if $(EXECUTABLE),,\ | |
51 | $(error EXECUTABLE not set, debootstrap of debian-$* would fail)) | |
dc338fdb AB |
52 | $(if $(DEB_ARCH),,\ |
53 | $(error DEB_ARCH not set, debootstrap of debian-$* would fail)) | |
54 | $(if $(DEB_TYPE),,\ | |
55 | $(error DEB_TYPE not set, debootstrap of debian-$* would fail)) | |
27963460 | 56 | $(if $(wildcard $(EXECUTABLE)), \ |
19c9a18f AB |
57 | $(call quiet-command, \ |
58 | DEB_ARCH=$(DEB_ARCH) \ | |
4d26c7fe AB |
59 | DEB_TYPE=$(DEB_TYPE) \ |
60 | $(if $(DEB_URL),DEB_URL=$(DEB_URL),) \ | |
182ec060 | 61 | $(DOCKER_SCRIPT) build -t qemu/debian-$* -f $< \ |
19c9a18f AB |
62 | $(if $V,,--quiet) $(if $(NOCACHE),--no-cache) \ |
63 | $(if $(NOUSER),,--add-current-user) \ | |
64 | $(if $(EXTRA_FILES),--extra-files $(EXTRA_FILES)) \ | |
65 | $(if $(EXECUTABLE),--include-executable=$(EXECUTABLE)), \ | |
66 | "BUILD","binfmt debian-$* (debootstrapped)"), \ | |
67 | $(call quiet-command, \ | |
767b6bd2 | 68 | $(DOCKER_SCRIPT) check --quiet qemu/debian-$* $< || \ |
d19f5fc0 | 69 | { echo "You will need to build $(EXECUTABLE)"; exit 1;},\ |
19c9a18f | 70 | "CHECK", "debian-$* exists")) |
dc338fdb | 71 | |
9d5e546a | 72 | # Enforce dependencies for composite images |
79bd3ae9 PB |
73 | # we don't run tests on intermediate images (used as base by another image) |
74 | DOCKER_PARTIAL_IMAGES := debian10 debian11 | |
06746324 | 75 | ifeq ($(HOST_ARCH),x86_64) |
698a71ed | 76 | docker-image-debian-amd64: docker-image-debian10 |
ec22b726 AB |
77 | DOCKER_PARTIAL_IMAGES += debian-amd64-cross |
78 | else | |
79 | docker-image-debian-amd64-cross: docker-image-debian10 | |
80 | DOCKER_PARTIAL_IMAGES += debian-amd64 | |
81 | endif | |
409c1c9c | 82 | |
e5389e44 | 83 | # For non-x86 hosts not all cross-compilers have been packaged |
06746324 | 84 | ifneq ($(HOST_ARCH),x86_64) |
e5389e44 AB |
85 | DOCKER_PARTIAL_IMAGES += debian-mips-cross debian-mipsel-cross debian-mips64el-cross |
86 | DOCKER_PARTIAL_IMAGES += debian-ppc64el-cross | |
87 | DOCKER_PARTIAL_IMAGES += debian-s390x-cross | |
d79f5c8b | 88 | DOCKER_PARTIAL_IMAGES += fedora |
e5389e44 AB |
89 | endif |
90 | ||
e3386c27 | 91 | docker-image-debian-alpha-cross: docker-image-debian10 |
698a71ed | 92 | docker-image-debian-armel-cross: docker-image-debian10 |
c268700b | 93 | docker-image-debian-hppa-cross: docker-image-debian10 |
20f8b1a2 | 94 | docker-image-debian-m68k-cross: docker-image-debian10 |
698a71ed | 95 | docker-image-debian-mips-cross: docker-image-debian10 |
4575a701 | 96 | docker-image-debian-mips64-cross: docker-image-debian10 |
698a71ed AB |
97 | docker-image-debian-mips64el-cross: docker-image-debian10 |
98 | docker-image-debian-mipsel-cross: docker-image-debian10 | |
698a71ed | 99 | docker-image-debian-ppc64el-cross: docker-image-debian10 |
923984c5 | 100 | docker-image-debian-sh4-cross: docker-image-debian10 |
78d1d696 | 101 | docker-image-debian-sparc64-cross: docker-image-debian10 |
18b6be43 | 102 | |
17888749 AB |
103 | # The native build should never use the registry |
104 | docker-image-debian-native: DOCKER_REGISTRY= | |
105 | ||
d47e3751 AB |
106 | # base images should not add a local user |
107 | docker-image-debian10: NOUSER=1 | |
108 | docker-image-debian11: NOUSER=1 | |
17888749 | 109 | |
5dbefb87 AB |
110 | # alpine has no adduser |
111 | docker-image-alpine: NOUSER=1 | |
112 | ||
2eb4461a RH |
113 | debian-toolchain-run = \ |
114 | $(if $(NOCACHE), \ | |
115 | $(call quiet-command, \ | |
116 | $(DOCKER_SCRIPT) build -t qemu/$1 -f $< \ | |
117 | $(if $V,,--quiet) --no-cache \ | |
118 | --registry $(DOCKER_REGISTRY) --extra-files \ | |
119 | $(DOCKER_FILES_DIR)/$1.d/build-toolchain.sh, \ | |
120 | "BUILD", $1), \ | |
121 | $(call quiet-command, \ | |
122 | $(DOCKER_SCRIPT) fetch $(if $V,,--quiet) \ | |
123 | qemu/$1 $(DOCKER_REGISTRY), \ | |
124 | "FETCH", $1) \ | |
125 | $(call quiet-command, \ | |
126 | $(DOCKER_SCRIPT) update $(if $V,,--quiet) \ | |
127 | qemu/$1 \ | |
128 | $(if $(NOUSER),,--add-current-user) \ | |
129 | "PREPARE", $1)) | |
130 | debian-toolchain = $(call debian-toolchain-run,$(patsubst docker-image-%,%,$1)) | |
131 | ||
426045ae PB |
132 | docker-image-debian-hexagon-cross: $(DOCKER_FILES_DIR)/debian-hexagon-cross.docker \ |
133 | $(DOCKER_FILES_DIR)/debian-hexagon-cross.d/build-toolchain.sh | |
134 | $(call debian-toolchain, $@) | |
135 | ||
b58a4e68 RH |
136 | docker-image-debian-microblaze-cross: $(DOCKER_FILES_DIR)/debian-toolchain.docker \ |
137 | $(DOCKER_FILES_DIR)/debian-microblaze-cross.d/build-toolchain.sh | |
138 | $(call debian-toolchain, $@) | |
139 | ||
2eb4461a RH |
140 | docker-image-debian-nios2-cross: $(DOCKER_FILES_DIR)/debian-toolchain.docker \ |
141 | $(DOCKER_FILES_DIR)/debian-nios2-cross.d/build-toolchain.sh | |
142 | $(call debian-toolchain, $@) | |
143 | ||
36dc5fed | 144 | # Specialist build images, sometimes very limited tools |
cf63177e | 145 | docker-image-debian-tricore-cross: docker-image-debian10 |
27ebeda0 | 146 | docker-image-debian-all-test-cross: docker-image-debian10 |
b58a4e68 | 147 | docker-image-debian-microblaze-cross: docker-image-debian10 |
2eb4461a | 148 | docker-image-debian-nios2-cross: docker-image-debian10 |
cf9b6d21 | 149 | docker-image-debian-powerpc-test-cross: docker-image-debian11 |
7d5817a4 | 150 | docker-image-debian-riscv64-test-cross: docker-image-debian11 |
36dc5fed | 151 | |
77b08f73 | 152 | # These images may be good enough for building tests but not for test builds |
ac276a4b | 153 | DOCKER_PARTIAL_IMAGES += debian-alpha-cross |
cf9b6d21 | 154 | DOCKER_PARTIAL_IMAGES += debian-powerpc-test-cross |
ac276a4b AB |
155 | DOCKER_PARTIAL_IMAGES += debian-hppa-cross |
156 | DOCKER_PARTIAL_IMAGES += debian-m68k-cross debian-mips64-cross | |
b58a4e68 | 157 | DOCKER_PARTIAL_IMAGES += debian-microblaze-cross |
2eb4461a | 158 | DOCKER_PARTIAL_IMAGES += debian-nios2-cross |
7d5817a4 | 159 | DOCKER_PARTIAL_IMAGES += debian-riscv64-test-cross |
ac276a4b AB |
160 | DOCKER_PARTIAL_IMAGES += debian-sh4-cross debian-sparc64-cross |
161 | DOCKER_PARTIAL_IMAGES += debian-tricore-cross | |
162 | DOCKER_PARTIAL_IMAGES += debian-xtensa-cross | |
6a2b0fd1 | 163 | DOCKER_PARTIAL_IMAGES += fedora-cris-cross |
77b08f73 | 164 | |
79bd3ae9 PB |
165 | # images that are only used to build other images |
166 | DOCKER_VIRTUAL_IMAGES := debian-bootstrap debian-toolchain | |
167 | ||
168 | __IMAGES := $(sort $(filter-out $(DOCKER_VIRTUAL_IMAGES), $(notdir $(basename $(wildcard $(DOCKER_FILES_DIR)/*.docker))))) | |
169 | DOCKER_IMAGES := $(if $(IMAGES), $(filter $(IMAGES), $(__IMAGES)), $(__IMAGES)) | |
170 | ||
171 | __TESTS := $(notdir $(shell find $(SRC_PATH)/tests/docker/ -name 'test-*' -type f)) | |
172 | DOCKER_TESTS := $(if $(TESTS), $(filter $(TESTS), $(__TESTS)), $(__TESTS)) | |
173 | ||
324027c2 | 174 | # Expand all the pre-requistes for each docker image and test combination |
bbb5ba86 | 175 | $(foreach i,$(filter-out $(DOCKER_PARTIAL_IMAGES),$(DOCKER_IMAGES)), \ |
d79f5c8b | 176 | $(foreach t,$(DOCKER_TESTS), \ |
324027c2 | 177 | $(eval .PHONY: docker-$t@$i) \ |
d39eaa22 | 178 | $(eval docker-$t@$i: docker-image-$i; @$(MAKE) docker-run TEST=$t IMAGE=$i) \ |
324027c2 FZ |
179 | ) \ |
180 | $(foreach t,$(DOCKER_TESTS), \ | |
ff1a3902 AB |
181 | $(eval docker-all-tests: docker-$t@$i) \ |
182 | $(eval docker-$t: docker-$t@$i) \ | |
324027c2 FZ |
183 | ) \ |
184 | ) | |
185 | ||
186 | docker: | |
05af039d | 187 | @echo 'Build QEMU and run tests inside Docker or Podman containers' |
324027c2 FZ |
188 | @echo |
189 | @echo 'Available targets:' | |
190 | @echo | |
191 | @echo ' docker: Print this help.' | |
ff1a3902 | 192 | @echo ' docker-all-tests: Run all image/test combinations.' |
87db9018 | 193 | @echo ' docker-TEST: Run "TEST" on all image combinations.' |
324027c2 FZ |
194 | @echo ' docker-clean: Kill and remove residual docker testing containers.' |
195 | @echo ' docker-TEST@IMAGE: Run "TEST" in container "IMAGE".' | |
196 | @echo ' Note: "TEST" is one of the listed test name,' | |
197 | @echo ' or a script name under $$QEMU_SRC/tests/docker/;' | |
87db9018 | 198 | @echo ' "IMAGE" is one of the listed container name.' |
324027c2 FZ |
199 | @echo ' docker-image: Build all images.' |
200 | @echo ' docker-image-IMAGE: Build image "IMAGE".' | |
87db9018 | 201 | @echo ' docker-run: For manually running a "TEST" with "IMAGE".' |
324027c2 FZ |
202 | @echo |
203 | @echo 'Available container images:' | |
204 | @echo ' $(DOCKER_IMAGES)' | |
205 | @echo | |
206 | @echo 'Available tests:' | |
207 | @echo ' $(DOCKER_TESTS)' | |
208 | @echo | |
324027c2 FZ |
209 | @echo 'Special variables:' |
210 | @echo ' TARGET_LIST=a,b,c Override target list in builds.' | |
35e0f959 FZ |
211 | @echo ' EXTRA_CONFIGURE_OPTS="..."' |
212 | @echo ' Extra configure options.' | |
be20302a AB |
213 | @echo ' IMAGES="a b c ..": Restrict available images to subset.' |
214 | @echo ' TESTS="x y z .." Restrict available tests to subset.' | |
324027c2 FZ |
215 | @echo ' J=[0..9]* Overrides the -jN parameter for make commands' |
216 | @echo ' (default is 1)' | |
217 | @echo ' DEBUG=1 Stop and drop to shell in the created container' | |
218 | @echo ' before running the command.' | |
8a2390a4 | 219 | @echo ' NETWORK=1 Enable virtual network interface with default backend.' |
6423795e | 220 | @echo ' NETWORK=$$BACKEND Enable virtual network interface with $$BACKEND.' |
dc23bbc3 | 221 | @echo ' NOUSER=1 Define to disable adding current user to containers passwd.' |
324027c2 | 222 | @echo ' NOCACHE=1 Ignore cache when build images.' |
b7c851b2 | 223 | @echo ' EXECUTABLE=<path> Include executable in image.' |
4c84f662 PMD |
224 | @echo ' EXTRA_FILES="<path> [... <path>]"' |
225 | @echo ' Include extra files in image.' | |
05af039d MAL |
226 | @echo ' ENGINE=auto/docker/podman' |
227 | @echo ' Specify which container engine to run.' | |
e6f1306b | 228 | @echo ' REGISTRY=url Cache builds from registry (default:$(DOCKER_REGISTRY))' |
324027c2 | 229 | |
6147c249 AB |
230 | docker-help: docker |
231 | ||
79bd3ae9 PB |
232 | # Use a global constant ccache directory to speed up repetitive builds |
233 | DOCKER_CCACHE_DIR := $$HOME/.cache/qemu-docker-ccache | |
234 | ||
e86c9a64 AB |
235 | # This rule if for directly running against an arbitrary docker target. |
236 | # It is called by the expanded docker targets (e.g. make | |
d39eaa22 | 237 | # docker-test-foo@bar) which will also ensure the image is up to date. |
e86c9a64 AB |
238 | # |
239 | # For example: make docker-run TEST="test-quick" IMAGE="debian:arm64" EXECUTABLE=./aarch64-linux-user/qemu-aarch64 | |
240 | # | |
241 | docker-run: docker-qemu-src | |
324027c2 | 242 | @mkdir -p "$(DOCKER_CCACHE_DIR)" |
e86c9a64 AB |
243 | @if test -z "$(IMAGE)" || test -z "$(TEST)"; \ |
244 | then echo "Invalid target $(IMAGE)/$(TEST)"; exit 1; \ | |
324027c2 | 245 | fi |
e86c9a64 AB |
246 | $(if $(EXECUTABLE), \ |
247 | $(call quiet-command, \ | |
e27cae26 | 248 | $(DOCKER_SCRIPT) update \ |
8d628d07 | 249 | $(IMAGE) --executable $(EXECUTABLE), \ |
e86c9a64 AB |
250 | " COPYING $(EXECUTABLE) to $(IMAGE)")) |
251 | $(call quiet-command, \ | |
e27cae26 | 252 | $(DOCKER_SCRIPT) run \ |
2461d80e | 253 | $(if $(NOUSER),,--run-as-current-user) \ |
44707491 | 254 | --security-opt seccomp=unconfined \ |
4b2c6bc5 | 255 | $(if $(DEBUG),-ti,) \ |
8a2390a4 | 256 | $(if $(NETWORK),$(if $(subst $(NETWORK),,1),--net=$(NETWORK)),--net=none) \ |
5609c512 | 257 | -e TARGET_LIST=$(subst $(SPACE),$(COMMA),$(TARGET_LIST)) \ |
e86c9a64 AB |
258 | -e EXTRA_CONFIGURE_OPTS="$(EXTRA_CONFIGURE_OPTS)" \ |
259 | -e V=$V -e J=$J -e DEBUG=$(DEBUG) \ | |
260 | -e SHOW_ENV=$(SHOW_ENV) \ | |
36ac78e6 FZ |
261 | $(if $(NOUSER),, \ |
262 | -e CCACHE_DIR=/var/tmp/ccache \ | |
263 | -v $(DOCKER_CCACHE_DIR):/var/tmp/ccache:z \ | |
264 | ) \ | |
e86c9a64 | 265 | -v $$(readlink -e $(DOCKER_SRC_COPY)):/var/tmp/qemu:z$(COMMA)ro \ |
e86c9a64 AB |
266 | $(IMAGE) \ |
267 | /var/tmp/qemu/run \ | |
268 | $(TEST), " RUN $(TEST) in ${IMAGE}") | |
08c3f6d5 PX |
269 | $(call quiet-command, rm -r $(DOCKER_SRC_COPY), \ |
270 | " CLEANUP $(DOCKER_SRC_COPY)") | |
e86c9a64 | 271 | |
79bd3ae9 PB |
272 | docker-image: ${DOCKER_IMAGES:%=docker-image-%} |
273 | ||
324027c2 | 274 | docker-clean: |
e27cae26 | 275 | $(call quiet-command, $(DOCKER_SCRIPT) clean) |