# Makefile for Docker tests

.PHONY: docker docker-help docker-test docker-clean docker-image docker-qemu-src

NULL :=
SPACE := $(NULL) #
COMMA := ,

HOST_ARCH = $(shell uname -m)
USER = $(if $(NOUSER),,$(shell id -un))
UID = $(if $(NOUSER),,$(shell id -u))

DOCKER_FILES_DIR := $(SRC_PATH)/tests/docker/dockerfiles
ifeq ($(HOST_ARCH),x86_64)
DOCKER_DEFAULT_REGISTRY := registry.gitlab.com/qemu-project/qemu
endif
DOCKER_REGISTRY := $(if $(REGISTRY),$(REGISTRY),$(DOCKER_DEFAULT_REGISTRY))

CONTAINER_COMMAND ?= $(shell $(SRC_PATH)/tests/docker/docker.py probe)
DOCKER_SCRIPT=$(SRC_PATH)/tests/docker/docker.py --command "$(CONTAINER_COMMAND)"

CUR_TIME := $(shell date +%Y-%m-%d-%H.%M.%S.$$$$)
DOCKER_SRC_COPY := $(BUILD_DIR)/docker-src.$(CUR_TIME)

DOCKER_V ?= $(V)

.DELETE_ON_ERROR: $(DOCKER_SRC_COPY)
$(DOCKER_SRC_COPY):
	@mkdir $@
	$(if $(SRC_ARCHIVE), \
		$(call quiet-command, cp "$(SRC_ARCHIVE)" $@/qemu.tar, \
			"CP", "$@/qemu.tar"), \
		$(call quiet-command, cd $(SRC_PATH) && scripts/archive-source.sh $@/qemu.tar, \
			"GEN", "$@/qemu.tar"))
	$(call quiet-command, cp $(SRC_PATH)/tests/docker/run $@/run, \
		"COPY","RUNNER")

docker-qemu-src: $(DOCKER_SRC_COPY)

# General rule for building docker images.
docker-image-%: $(DOCKER_FILES_DIR)/%.docker
	  $(call quiet-command,			\
		DOCKER_BUILDKIT=1 $(CONTAINER_COMMAND) build \
		$(if $(DOCKER_V),,--quiet)		\
		$(if $(NOCACHE),--no-cache,		\
			$(if $(DOCKER_REGISTRY),--cache-from $(DOCKER_REGISTRY)/qemu/$*)) \
		--build-arg BUILDKIT_INLINE_CACHE=1 	\
		$(if $(NOUSER),,			\
			--build-arg USER=$(USER)	\
			--build-arg UID=$(UID))		\
		-t qemu/$* - < $< $(if $(DOCKER_V),,> /dev/null),\
		"BUILD", $*)

# General rule for inspecting registry images.
docker-verify-%: $(DOCKER_FILES_DIR)/%.docker
	  $(call quiet-command,			\
		skopeo inspect 			\
			--format '{{.Created}}' \
			docker://$(DOCKER_REGISTRY)/qemu/$*	\
		$(if $V,,> /dev/null),\
		"VERIFY", $*)

# Special rule for debootstraped binfmt linux-user images
docker-binfmt-image-debian-%: $(DOCKER_FILES_DIR)/debian-bootstrap.docker
	$(if $(EXECUTABLE),,\
		$(error EXECUTABLE not set, debootstrap of debian-$* would fail))
	$(if $(DEB_ARCH),,\
		$(error DEB_ARCH not set, debootstrap of debian-$* would fail))
	$(if $(DEB_TYPE),,\
		$(error DEB_TYPE not set, debootstrap of debian-$* would fail))
	$(if $(wildcard $(EXECUTABLE)),						\
		$(call quiet-command,						\
			DEB_ARCH=$(DEB_ARCH)					\
			DEB_TYPE=$(DEB_TYPE) 					\
			$(if $(DEB_URL),DEB_URL=$(DEB_URL),)			\
			$(DOCKER_SCRIPT) build -t qemu/debian-$* -f $< 		\
			$(if $(DOCKER_V),,--quiet) $(if $(NOCACHE),--no-cache) 	\
			$(if $(NOUSER),,--add-current-user) 			\
			$(if $(EXTRA_FILES),--extra-files $(EXTRA_FILES))	\
			$(if $(EXECUTABLE),--include-executable=$(EXECUTABLE)), \
			"BUILD","binfmt debian-$* (debootstrapped)"),		\
		$(call quiet-command,						\
			$(DOCKER_SCRIPT) check --quiet qemu/debian-$* $< || 	\
			{ echo "You will need to build $(EXECUTABLE)"; exit 1;},\
			"CHECK", "debian-$* exists"))

# Special case cross-compiling x86_64 on non-x86_64 systems.
ifeq ($(HOST_ARCH),x86_64)
DOCKER_PARTIAL_IMAGES += debian-amd64-cross
else
DOCKER_PARTIAL_IMAGES += debian-amd64
endif

# For non-x86 hosts not all cross-compilers have been packaged
ifneq ($(HOST_ARCH),x86_64)
DOCKER_PARTIAL_IMAGES += debian-ppc64el-cross
DOCKER_PARTIAL_IMAGES += debian-s390x-cross
DOCKER_PARTIAL_IMAGES += fedora
endif

# alpine has no adduser
docker-image-alpine: NOUSER=1

debian-toolchain-run = \
	$(if $(NOCACHE)$(NOFETCH),					\
		$(call quiet-command,					\
			$(DOCKER_SCRIPT) build -t qemu/$1 -f $< 	\
			$(if $(DOCKER_V),,--quiet) 			\
			$(if $(NOCACHE),--no-cache)			\
			--registry $(DOCKER_REGISTRY) --extra-files	\
			$(DOCKER_FILES_DIR)/$1.d/build-toolchain.sh,	\
			"BUILD", $1),				        \
		$(call quiet-command,					\
			$(DOCKER_SCRIPT) fetch $(if $(DOCKER_V),,--quiet) \
				qemu/$1 $(DOCKER_REGISTRY),		\
			"FETCH", $1)					\
		$(call quiet-command,					\
			$(DOCKER_SCRIPT) update $(if $(DOCKER_V),,--quiet) \
				qemu/$1 				\
				$(if $(NOUSER),,--add-current-user) 	\
			"PREPARE", $1))
debian-toolchain = $(call debian-toolchain-run,$(patsubst docker-image-%,%,$1))

docker-image-debian-microblaze-cross: $(DOCKER_FILES_DIR)/debian-toolchain.docker \
    $(DOCKER_FILES_DIR)/debian-microblaze-cross.d/build-toolchain.sh
	$(call debian-toolchain, $@)

# These images may be good enough for building tests but not for test builds
DOCKER_PARTIAL_IMAGES += debian-microblaze-cross
DOCKER_PARTIAL_IMAGES += debian-xtensa-cross

# images that are only used to build other images
DOCKER_VIRTUAL_IMAGES := debian-bootstrap debian-toolchain

__IMAGES := $(sort $(filter-out $(DOCKER_VIRTUAL_IMAGES), $(notdir $(basename $(wildcard $(DOCKER_FILES_DIR)/*.docker)))))
DOCKER_IMAGES := $(if $(IMAGES), $(filter $(IMAGES), $(__IMAGES)), $(__IMAGES))

__TESTS := $(notdir $(shell find $(SRC_PATH)/tests/docker/ -name 'test-*' -type f))
DOCKER_TESTS := $(if $(TESTS), $(filter $(TESTS), $(__TESTS)), $(__TESTS))

# Expand all the pre-requistes for each docker image and test combination
$(foreach i,$(filter-out $(DOCKER_PARTIAL_IMAGES),$(DOCKER_IMAGES)), \
	$(foreach t,$(DOCKER_TESTS), \
		$(eval .PHONY: docker-$t@$i) \
		$(eval docker-$t@$i: docker-image-$i; @$(MAKE) docker-run TEST=$t IMAGE=qemu/$i) \
	) \
	$(foreach t,$(DOCKER_TESTS), \
		$(eval docker-all-tests: docker-$t@$i) \
		$(eval docker-$t: docker-$t@$i) \
	) \
)

docker:
	@echo 'Build QEMU and run tests inside $(CONTAINER_COMMAND) containers'
	@echo
	@echo 'Available targets:'
	@echo
	@echo '    docker:              Print this help.'
	@echo '    docker-all-tests:    Run all image/test combinations.'
	@echo '    docker-TEST:         Run "TEST" on all image combinations.'
	@echo '    docker-clean:        Kill and remove residual docker testing containers.'
	@echo '    docker-TEST@IMAGE:   Run "TEST" in container "IMAGE".'
	@echo '                         Note: "TEST" is one of the listed test name,'
	@echo '                         or a script name under $$QEMU_SRC/tests/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)'
	@echo
	@echo 'Available tests:'
	@echo '    $(DOCKER_TESTS)'
	@echo
	@echo 'Special variables:'
	@echo '    TARGET_LIST=a,b,c    Override target list in builds.'
	@echo '    EXTRA_CONFIGURE_OPTS="..."'
	@echo '                         Extra configure options.'
	@echo '    TEST_COMMAND="..."   Override the default `make check` target.'
	@echo '    IMAGES="a b c ..":   Restrict available images to subset.'
	@echo '    TESTS="x y z .."     Restrict available tests to subset.'
	@echo '    J=[0..9]*            Overrides the -jN parameter for make commands'
	@echo '                         (default is 1)'
	@echo '    DEBUG=1              Stop and drop to shell in the created container'
	@echo '                         before running the command.'
	@echo '    NETWORK=1            Enable virtual network interface with default backend.'
	@echo '    NETWORK=$$BACKEND     Enable virtual network interface with $$BACKEND.'
	@echo '    NOUSER=1             Define to disable adding current user to containers passwd.'
	@echo '    NOCACHE=1            Ignore cache when build images.'
	@echo '    NOFETCH=1            Do not fetch from the registry.'
	@echo '    EXECUTABLE=<path>    Include executable in image.'
	@echo '    EXTRA_FILES="<path> [... <path>]"'
	@echo '                         Include extra files in image.'
	@echo '    REGISTRY=url         Cache builds from registry (default:$(DOCKER_REGISTRY))'

docker-help: docker

# Where QEMU caches build artefacts
DOCKER_QEMU_CACHE_DIR := $$HOME/.cache/qemu
# Use a global constant ccache directory to speed up repetitive builds
DOCKER_QEMU_CCACHE_DIR := DOCKER_QEMU_CACHE_DIR/docker-ccache

# 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 also ensure the image is up to date.
#
# 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_QEMU_CCACHE_DIR)"
	@if test -z "$(IMAGE)" || test -z "$(TEST)"; \
		then echo "Invalid target $(IMAGE)/$(TEST)"; exit 1; \
	fi
	$(if $(EXECUTABLE),						\
		$(call quiet-command,					\
			$(DOCKER_SCRIPT) update 			\
			$(IMAGE) --executable $(EXECUTABLE),		\
			"  COPYING $(EXECUTABLE) to $(IMAGE)"))
	$(call quiet-command,						\
		$(CONTAINER_COMMAND) run 				\
			--rm						\
			$(if $(NOUSER),,				\
				$(if $(filter docker,$(CONTAINER_COMMAND)), \
					-u $(UID),			\
					--userns keep-id		\
				)					\
			) 						\
			--security-opt seccomp=unconfined		\
			$(if $(DEBUG),-ti,)				\
			$(if $(NETWORK),$(if $(subst $(NETWORK),,1),--net=$(NETWORK)),--net=none) \
			-e TARGET_LIST=$(subst $(SPACE),$(COMMA),$(TARGET_LIST))	\
			-e EXTRA_CONFIGURE_OPTS="$(EXTRA_CONFIGURE_OPTS)" \
			-e TEST_COMMAND="$(TEST_COMMAND)" 		\
			-e V=$V						\
			-e DOCKER_V=$(DOCKER_V)				\
			-e J=$J						\
			-e DEBUG=$(DEBUG)				\
			-e SHOW_ENV=$(SHOW_ENV) 			\
			$(if $(NOUSER),,				\
				-v $(DOCKER_QEMU_CACHE_DIR):$(DOCKER_QEMU_CACHE_DIR) 	\
				-e CCACHE_DIR=$(DOCKER_QEMU_CCACHE_DIR)	\
			)						\
			-v $$(readlink -e $(DOCKER_SRC_COPY)):/var/tmp/qemu:z$(COMMA)ro \
			$(IMAGE) 					\
			/var/tmp/qemu/run 				\
			$(TEST), "  RUN $(TEST) in ${IMAGE}")
	$(call quiet-command, rm -r $(DOCKER_SRC_COPY), \
		"  CLEANUP $(DOCKER_SRC_COPY)")

docker-image: ${DOCKER_IMAGES:%=docker-image-%}

docker-verify: ${DOCKER_IMAGES:%=docker-verify-%}

docker-clean:
	$(call quiet-command, $(DOCKER_SCRIPT) clean)

# Overrides
docker-test-rust%: NETWORK=1
