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