Fam Zheng <f...@redhat.com> writes: > On Mon, 10/03 17:32, Alex Bennée wrote: >> This re-factors the docker makefile to include a docker-run target which >> can be controlled entirely from environment variables specified on the >> make command line. This allows us to run against any given docker image >> we may have in our repository, for example: >> >> make docker-run TEST="test-quick" IMAGE="debian:arm64" \ >> EXECUTABLE=./aarch64-linux-user/qemu-aarch64 >> >> The existing docker-foo@bar targets still work but the inline >> verification has been shunted into other target prerequisites before a >> sub-make is invoked for the docker-run target. >> >> Signed-off-by: Alex Bennée <alex.ben...@linaro.org> > > Actually I now realize we never use the verification for invalid tests and > images because of other implicit/pattern rules in rules.mak: > > $ make docker-test-quick@bar > LD -r docker-test-qu...@bar.mo > /usr/bin/ld: no input files > collect2: error: ld returned 1 exit status > rules.mak:99: recipe for target 'docker-test-qu...@bar.mo' failed > make: *** [docker-test-qu...@bar.mo] Error 1 > $ make docker-test-quick@bar^C > $ make docker-test-foo@fedora > LD -r docker-test-...@fedora.mo > /usr/bin/ld: no input files > collect2: error: ld returned 1 exit status > rules.mak:99: recipe for target 'docker-test-...@fedora.mo' failed > make: *** [docker-test-...@fedora.mo] Error 1 > > Maybe we can simply get rid of that altogether? What do you think?
Yeah it looks like it. I'll include a patch to drop them which you can squash into the other one if you want. > > Fam > >> >> --- >> NB: I dropped the awk magic that verifies the image exists before >> running. I couldn't get the thing to work in my shell so wasn't quite >> sure what it was doing. >> >> v2 >> - fix spelling on arbitrary >> - document docker-run in help >> - add note on docker.py update >> - reduce noise on verifying other images >> - revert back to using filter >> - fix merge conflict >> --- >> tests/docker/Makefile.include | 89 >> ++++++++++++++++++++++++++++++++----------- >> 1 file changed, 66 insertions(+), 23 deletions(-) >> >> diff --git a/tests/docker/Makefile.include b/tests/docker/Makefile.include >> index 2fcc3c6..87735d8 100644 >> --- a/tests/docker/Makefile.include >> +++ b/tests/docker/Makefile.include >> @@ -78,6 +78,7 @@ docker: >> @echo ' "IMAGE" is one of the listed container >> name."' >> @echo ' docker-image: Build all images.' >> @echo ' docker-image-IMAGE: Build image "IMAGE".' >> + @echo ' docker-run: For manually running a "TEST" with >> "IMAGE"' >> @echo >> @echo 'Available container images:' >> @echo ' $(DOCKER_IMAGES)' >> @@ -101,31 +102,73 @@ docker: >> @echo ' NOCACHE=1 Ignore cache when build images.' >> @echo ' EXECUTABLE=<path> Include executable in image.' >> >> -docker-run-%: CMD = $(shell echo '$@' | sed -e >> 's/docker-run-\([^@]*\)@\(.*\)/\1/') >> -docker-run-%: IMAGE = $(shell echo '$@' | sed -e >> 's/docker-run-\([^@]*\)@\(.*\)/\2/') >> -docker-run-%: docker-qemu-src >> +# This rule if for directly running against an arbitrary docker target. >> +# It is called by the expanded docker targets (e.g. make >> +# docker-test-foo@bar) which will do additional verification. >> +# >> +# For example: make docker-run TEST="test-quick" IMAGE="debian:arm64" >> EXECUTABLE=./aarch64-linux-user/qemu-aarch64 >> +# >> +docker-run: docker-qemu-src >> @mkdir -p "$(DOCKER_CCACHE_DIR)" >> - @if test -z "$(IMAGE)" || test -z "$(CMD)"; \ >> - then echo "Invalid target"; exit 1; \ >> + @if test -z "$(IMAGE)" || test -z "$(TEST)"; \ >> + then echo "Invalid target $(IMAGE)/$(TEST)"; exit 1; \ >> + fi >> + $(if $(EXECUTABLE), \ >> + $(call quiet-command, \ >> + $(SRC_PATH)/tests/docker/docker.py update \ >> + $(IMAGE) $(EXECUTABLE), \ >> + " COPYING $(EXECUTABLE) to $(IMAGE)")) >> + $(call quiet-command, \ >> + $(SRC_PATH)/tests/docker/docker.py run \ >> + -t \ >> + $(if $V,,--rm) \ >> + $(if $(DEBUG),-i,--net=none) \ >> + -e TARGET_LIST=$(TARGET_LIST) \ >> + -e EXTRA_CONFIGURE_OPTS="$(EXTRA_CONFIGURE_OPTS)" \ >> + -e V=$V -e J=$J -e DEBUG=$(DEBUG) \ >> + -e SHOW_ENV=$(SHOW_ENV) \ >> + -e CCACHE_DIR=/var/tmp/ccache \ >> + -v $$(readlink -e >> $(DOCKER_SRC_COPY)):/var/tmp/qemu:z$(COMMA)ro \ >> + -v $(DOCKER_CCACHE_DIR):/var/tmp/ccache:z \ >> + $(IMAGE) \ >> + /var/tmp/qemu/run \ >> + $(TEST), " RUN $(TEST) in ${IMAGE}") >> + >> +# >> +# Verification targets >> +# >> +# These targets help verify the test (CMD) and docker tag (IMAGE) are >> +# part of the built in set of tests and images. You can still call the >> +# docker-run target directly for testsing against arbitary images. >> +# >> + >> +docker-verify-image-%: IMAGE = $(shell echo '$@' | sed -e >> 's/docker-verify-image-\([^@]*\)@\(.*\)/\2/') >> +docker-verify-image-%: >> + @if test -z "$(IMAGE)"; \ >> + then echo "Invalid image"; exit 1; \ >> fi >> - $(if $(filter $(TESTS),$(CMD)),$(if $(filter $(IMAGES),$(IMAGE)), \ >> - $(call quiet-command,\ >> - if $(SRC_PATH)/tests/docker/docker.py images | \ >> - awk '$$1=="qemu" && $$2=="$(IMAGE)"{found=1} >> END{exit(!found)}'; then \ >> - $(SRC_PATH)/tests/docker/docker.py run $(if >> $V,,--rm) \ >> - -t \ >> - $(if $(DEBUG),-i,--net=none) \ >> - -e TARGET_LIST=$(TARGET_LIST) \ >> - -e EXTRA_CONFIGURE_OPTS=$(EXTRA_CONFIGURE_OPTS) >> \ >> - -e V=$V -e J=$J -e DEBUG=$(DEBUG) -e >> SHOW_ENV=$(SHOW_ENV)\ >> - -e CCACHE_DIR=/var/tmp/ccache \ >> - -v $$(readlink -e >> $(DOCKER_SRC_COPY)):/var/tmp/qemu:z$(COMMA)ro \ >> - -v $(DOCKER_CCACHE_DIR):/var/tmp/ccache:z \ >> - qemu:$(IMAGE) \ >> - /var/tmp/qemu/run \ >> - $(CMD); \ >> - fi \ >> - , " RUN $(CMD) in $(IMAGE)"))) >> + $(if $(filter $(IMAGE), $(DOCKER_IMAGES)), , \ >> + echo "$(IMAGE) is not a known image"; exit 1) \ >> + >> +docker-verify-test-%: CMD = $(shell echo '$@' | sed -e >> 's/docker-verify-test-\([^@]*\)@\(.*\)/\1/') >> +docker-verify-test-%: >> + @if test -z "$(CMD)"; \ >> + then echo "Invalid test"; exit 1; \ >> + fi >> + $(if $(filter $(CMD), $(DOCKER_TESTS)), , \ >> + echo "$(CMD) is not a known test"; exit 1) >> + >> +# Run targets >> +# >> +# This will take a target such as docker-test-foo@bar and verify that: >> +# - the test test-foo is a known test >> +# - the image bar is a known image >> +# >> +# It will then call the docker-run >> +docker-run-%: CMD = $(shell echo '$@' | sed -e >> 's/docker-run-\([^@]*\)@\(.*\)/\1/') >> +docker-run-%: IMAGE = $(shell echo '$@' | sed -e >> 's/docker-run-\([^@]*\)@\(.*\)/\2/') >> +docker-run-%: docker-verify-image-% docker-verify-test-% >> + @make docker-run TEST=$(CMD) IMAGE=qemu:$(IMAGE) >> >> docker-clean: >> $(call quiet-command, $(SRC_PATH)/tests/docker/docker.py clean) >> -- >> 2.9.3 >> -- Alex Bennée