]>
Commit | Line | Data |
---|---|---|
324027c2 FZ |
1 | # Makefile for Docker tests |
2 | ||
3 | .PHONY: docker docker-test docker-clean docker-image docker-qemu-src | |
4 | ||
5 | DOCKER_SUFFIX := .docker | |
6 | DOCKER_FILES_DIR := $(SRC_PATH)/tests/docker/dockerfiles | |
7 | DOCKER_IMAGES := $(notdir $(basename $(wildcard $(DOCKER_FILES_DIR)/*.docker))) | |
8 | DOCKER_TARGETS := $(patsubst %,docker-image-%,$(DOCKER_IMAGES)) | |
9 | # Use a global constant ccache directory to speed up repetitive builds | |
10 | DOCKER_CCACHE_DIR := $$HOME/.cache/qemu-docker-ccache | |
11 | ||
12 | DOCKER_TESTS := $(notdir $(shell \ | |
13 | find $(SRC_PATH)/tests/docker/ -name 'test-*' -type f)) | |
14 | ||
15 | DOCKER_TOOLS := travis | |
16 | ||
17 | TESTS ?= % | |
18 | IMAGES ?= % | |
19 | ||
20 | # Make archive from git repo $1 to tar.gz $2 | |
21 | make-archive-maybe = $(if $(wildcard $1/*), \ | |
22 | $(call quiet-command, \ | |
23 | (cd $1; if git diff-index --quiet HEAD -- &>/dev/null; then \ | |
34c98c54 | 24 | git archive -1 HEAD --format=tar.gz; \ |
324027c2 | 25 | else \ |
34c98c54 PB |
26 | git archive -1 $$(git stash create) --format=tar.gz; \ |
27 | fi) > $2, \ | |
0bdb12c7 | 28 | "ARCHIVE","$(notdir $2)")) |
324027c2 FZ |
29 | |
30 | CUR_TIME := $(shell date +%Y-%m-%d-%H.%M.%S.$$$$) | |
d5aebef8 | 31 | DOCKER_SRC_COPY := docker-src.$(CUR_TIME) |
324027c2 FZ |
32 | |
33 | $(DOCKER_SRC_COPY): | |
34 | @mkdir $@ | |
35 | $(call make-archive-maybe, $(SRC_PATH), $@/qemu.tgz) | |
36 | $(call make-archive-maybe, $(SRC_PATH)/dtc, $@/dtc.tgz) | |
37 | $(call make-archive-maybe, $(SRC_PATH)/pixman, $@/pixman.tgz) | |
38 | $(call quiet-command, cp $(SRC_PATH)/tests/docker/run $@/run, \ | |
0bdb12c7 | 39 | "COPY","RUNNER") |
324027c2 FZ |
40 | |
41 | docker-qemu-src: $(DOCKER_SRC_COPY) | |
42 | ||
43 | docker-image: ${DOCKER_TARGETS} | |
44 | ||
45 | # General rule for building docker images | |
46 | docker-image-%: $(DOCKER_FILES_DIR)/%.docker | |
a351b4b0 SS |
47 | @if test "$@" = docker-image-debian-bootstrap -a -z "$(EXECUTABLE)"; then \ |
48 | echo WARNING: EXECUTABLE is not set, debootstrap may fail. 2>&1 ; \ | |
49 | fi | |
324027c2 FZ |
50 | $(call quiet-command,\ |
51 | $(SRC_PATH)/tests/docker/docker.py build qemu:$* $< \ | |
b7c851b2 | 52 | $(if $V,,--quiet) $(if $(NOCACHE),--no-cache) \ |
414a8ce5 | 53 | $(if $(NOUSER),,--add-current-user) \ |
4c84f662 | 54 | $(if $(EXTRA_FILES),--extra-files $(EXTRA_FILES))\ |
b7c851b2 | 55 | $(if $(EXECUTABLE),--include-executable=$(EXECUTABLE)),\ |
0bdb12c7 | 56 | "BUILD","$*") |
324027c2 | 57 | |
24e0131f AB |
58 | # Enforce dependancies for composite images |
59 | docker-image-debian-armhf-cross: docker-image-debian | |
60 | docker-image-debian-arm64-cross: docker-image-debian | |
61 | ||
324027c2 FZ |
62 | # Expand all the pre-requistes for each docker image and test combination |
63 | $(foreach i,$(DOCKER_IMAGES), \ | |
64 | $(foreach t,$(DOCKER_TESTS) $(DOCKER_TOOLS), \ | |
65 | $(eval .PHONY: docker-$t@$i) \ | |
66 | $(eval docker-$t@$i: docker-image-$i docker-run-$t@$i) \ | |
67 | ) \ | |
68 | $(foreach t,$(DOCKER_TESTS), \ | |
69 | $(eval docker-test: docker-$t@$i) \ | |
70 | ) \ | |
71 | ) | |
72 | ||
73 | docker: | |
74 | @echo 'Build QEMU and run tests inside Docker containers' | |
75 | @echo | |
76 | @echo 'Available targets:' | |
77 | @echo | |
78 | @echo ' docker: Print this help.' | |
79 | @echo ' docker-test: Run all image/test combinations.' | |
80 | @echo ' docker-clean: Kill and remove residual docker testing containers.' | |
81 | @echo ' docker-TEST@IMAGE: Run "TEST" in container "IMAGE".' | |
82 | @echo ' Note: "TEST" is one of the listed test name,' | |
83 | @echo ' or a script name under $$QEMU_SRC/tests/docker/;' | |
84 | @echo ' "IMAGE" is one of the listed container name."' | |
85 | @echo ' docker-image: Build all images.' | |
86 | @echo ' docker-image-IMAGE: Build image "IMAGE".' | |
e86c9a64 | 87 | @echo ' docker-run: For manually running a "TEST" with "IMAGE"' |
324027c2 FZ |
88 | @echo |
89 | @echo 'Available container images:' | |
90 | @echo ' $(DOCKER_IMAGES)' | |
91 | @echo | |
92 | @echo 'Available tests:' | |
93 | @echo ' $(DOCKER_TESTS)' | |
94 | @echo | |
95 | @echo 'Available tools:' | |
96 | @echo ' $(DOCKER_TOOLS)' | |
97 | @echo | |
98 | @echo 'Special variables:' | |
99 | @echo ' TARGET_LIST=a,b,c Override target list in builds.' | |
35e0f959 FZ |
100 | @echo ' EXTRA_CONFIGURE_OPTS="..."' |
101 | @echo ' Extra configure options.' | |
324027c2 FZ |
102 | @echo ' IMAGES="a b c ..": Filters which images to build or run.' |
103 | @echo ' TESTS="x y z .." Filters which tests to run (for docker-test).' | |
104 | @echo ' J=[0..9]* Overrides the -jN parameter for make commands' | |
105 | @echo ' (default is 1)' | |
106 | @echo ' DEBUG=1 Stop and drop to shell in the created container' | |
107 | @echo ' before running the command.' | |
414a8ce5 | 108 | @echo ' NOUSER Define to disable adding current user to containers passwd.' |
324027c2 | 109 | @echo ' NOCACHE=1 Ignore cache when build images.' |
b7c851b2 | 110 | @echo ' EXECUTABLE=<path> Include executable in image.' |
4c84f662 PMD |
111 | @echo ' EXTRA_FILES="<path> [... <path>]"' |
112 | @echo ' Include extra files in image.' | |
324027c2 | 113 | |
e86c9a64 AB |
114 | # This rule if for directly running against an arbitrary docker target. |
115 | # It is called by the expanded docker targets (e.g. make | |
116 | # docker-test-foo@bar) which will do additional verification. | |
117 | # | |
118 | # For example: make docker-run TEST="test-quick" IMAGE="debian:arm64" EXECUTABLE=./aarch64-linux-user/qemu-aarch64 | |
119 | # | |
120 | docker-run: docker-qemu-src | |
324027c2 | 121 | @mkdir -p "$(DOCKER_CCACHE_DIR)" |
e86c9a64 AB |
122 | @if test -z "$(IMAGE)" || test -z "$(TEST)"; \ |
123 | then echo "Invalid target $(IMAGE)/$(TEST)"; exit 1; \ | |
324027c2 | 124 | fi |
e86c9a64 AB |
125 | $(if $(EXECUTABLE), \ |
126 | $(call quiet-command, \ | |
127 | $(SRC_PATH)/tests/docker/docker.py update \ | |
128 | $(IMAGE) $(EXECUTABLE), \ | |
129 | " COPYING $(EXECUTABLE) to $(IMAGE)")) | |
130 | $(call quiet-command, \ | |
131 | $(SRC_PATH)/tests/docker/docker.py run \ | |
f9f65a4a | 132 | $(if $(NOUSER),,-u $(shell id -u)) -t \ |
e86c9a64 AB |
133 | $(if $V,,--rm) \ |
134 | $(if $(DEBUG),-i,--net=none) \ | |
135 | -e TARGET_LIST=$(TARGET_LIST) \ | |
136 | -e EXTRA_CONFIGURE_OPTS="$(EXTRA_CONFIGURE_OPTS)" \ | |
137 | -e V=$V -e J=$J -e DEBUG=$(DEBUG) \ | |
138 | -e SHOW_ENV=$(SHOW_ENV) \ | |
139 | -e CCACHE_DIR=/var/tmp/ccache \ | |
140 | -v $$(readlink -e $(DOCKER_SRC_COPY)):/var/tmp/qemu:z$(COMMA)ro \ | |
141 | -v $(DOCKER_CCACHE_DIR):/var/tmp/ccache:z \ | |
142 | $(IMAGE) \ | |
143 | /var/tmp/qemu/run \ | |
144 | $(TEST), " RUN $(TEST) in ${IMAGE}") | |
145 | ||
146 | # Run targets: | |
147 | # | |
148 | # Of the form docker-TEST-FOO@IMAGE-BAR which will then be expanded into a call to "make docker-run" | |
149 | docker-run-%: CMD = $(shell echo '$@' | sed -e 's/docker-run-\([^@]*\)@\(.*\)/\1/') | |
150 | docker-run-%: IMAGE = $(shell echo '$@' | sed -e 's/docker-run-\([^@]*\)@\(.*\)/\2/') | |
151 | docker-run-%: | |
152 | @$(MAKE) docker-run TEST=$(CMD) IMAGE=qemu:$(IMAGE) | |
324027c2 FZ |
153 | |
154 | docker-clean: | |
155 | $(call quiet-command, $(SRC_PATH)/tests/docker/docker.py clean) |