On Thu, 09/22 14:57, 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>

You probably need to rebase as a pull req is on the way that updates this file
and causes conflict.

> 
> ---
> 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.

Does this mean that "make docker-test" will unconditionally run
debian-bootstrap and fail if binfmt is not setup properly?

Fam

> 
> 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
> ---
>  tests/docker/Makefile.include | 88 
> ++++++++++++++++++++++++++++++++-----------
>  1 file changed, 65 insertions(+), 23 deletions(-)
> 
> diff --git a/tests/docker/Makefile.include b/tests/docker/Makefile.include
> index 19d4cc7..5f71293 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,72 @@ 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 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 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
> 

Reply via email to