# -*- Mode: makefile -*- # # TCG tests (per-target rules) # # This Makefile fragment is included from the build-tcg target, once # for each target we build. We have two options for compiling, either # using a configured guest compiler or calling one of our docker images # to do it for us. # # The configure script fills in extra information about # useful docker images or alternative compiler flags. # Usage: $(call quiet-command,command and args,"NAME","args to print") # This will run "command and args", and either: # if V=1 just print the whole command and args # otherwise print the 'quiet' output in the format " NAME args to print" # NAME should be a short name of the command, 7 letters or fewer. # If called with only a single argument, will print nothing in quiet mode. quiet-command-run = $(if $(V),,$(if $2,printf " %-7s %s\n" $2 $3 && ))$1 quiet-@ = $(if $(V),,@) quiet-command = $(quiet-@)$(call quiet-command-run,$1,$2,$3) CROSS_CC_GUEST:= CROSS_AS_GUEST:= CROSS_LD_GUEST:= DOCKER_IMAGE:= -include tests/tcg/config-$(TARGET).mak GUEST_BUILD= TCG_MAKE=../Makefile.target # We also need the Docker make rules to depend on SKIP_DOCKER_BUILD=1 include $(SRC_PATH)/tests/docker/Makefile.include # Support installed Cross Compilers ifdef CROSS_CC_GUEST .PHONY: cross-build-guest-tests cross-build-guest-tests: $(call quiet-command, \ (mkdir -p tests/tcg/$(TARGET) && cd tests/tcg/$(TARGET) && \ $(MAKE) -f $(TCG_MAKE) TARGET="$(TARGET)" CC="$(CROSS_CC_GUEST)" \ $(if $(CROSS_AS_GUEST),AS="$(CROSS_AS_GUEST)") \ $(if $(CROSS_LD_GUEST),LD="$(CROSS_LD_GUEST)") \ SRC_PATH="$(SRC_PATH)" BUILD_STATIC=$(CROSS_CC_GUEST_STATIC) \ EXTRA_CFLAGS="$(CROSS_CC_GUEST_CFLAGS)"), \ "BUILD","$(TARGET) guest-tests with $(CROSS_CC_GUEST)") GUEST_BUILD=cross-build-guest-tests endif # Support building with Docker ifneq ($(DOCKER_IMAGE),) DOCKER_COMPILE_CMD="$(DOCKER_SCRIPT) cc \ --cc $(DOCKER_CROSS_CC_GUEST) \ -i qemu/$(DOCKER_IMAGE) \ -s $(SRC_PATH) -- " DOCKER_AS_CMD=$(if $(DOCKER_CROSS_AS_GUEST),"$(DOCKER_SCRIPT) cc \ --cc $(DOCKER_CROSS_AS_GUEST) \ -i qemu/$(DOCKER_IMAGE) \ -s $(SRC_PATH) -- ") DOCKER_LD_CMD=$(if $(DOCKER_CROSS_LD_GUEST),"$(DOCKER_SCRIPT) cc \ --cc $(DOCKER_CROSS_LD_GUEST) \ -i qemu/$(DOCKER_IMAGE) \ -s $(SRC_PATH) -- ") .PHONY: docker-build-guest-tests docker-build-guest-tests: docker-image-$(DOCKER_IMAGE) $(call quiet-command, \ (mkdir -p tests/tcg/$(TARGET) && cd tests/tcg/$(TARGET) && \ $(MAKE) -f $(TCG_MAKE) TARGET="$(TARGET)" CC=$(DOCKER_COMPILE_CMD) \ $(if $(DOCKER_AS_CMD),AS=$(DOCKER_AS_CMD)) \ $(if $(DOCKER_LD_CMD),LD=$(DOCKER_LD_CMD)) \ SRC_PATH="$(SRC_PATH)" BUILD_STATIC=y \ EXTRA_CFLAGS="$(CROSS_CC_GUEST_CFLAGS)"), \ "BUILD","$(TARGET) guest-tests with docker qemu/$(DOCKER_IMAGE)") GUEST_BUILD=docker-build-guest-tests endif # Final targets all: @echo "Do not invoke this Makefile directly"; exit 1 .PHONY: guest-tests ifneq ($(GUEST_BUILD),) guest-tests: $(GUEST_BUILD) run-guest-tests: guest-tests $(call quiet-command, \ (cd tests/tcg/$(TARGET) && \ $(MAKE) -f $(TCG_MAKE) TARGET="$(TARGET)" \ SRC_PATH="$(SRC_PATH)" SPEED=$(SPEED) run), \ "RUN", "tests for $(TARGET_NAME)") else guest-tests: $(call quiet-command, true, "BUILD", \ "$(TARGET) guest-tests SKIPPED") run-guest-tests: $(call quiet-command, true, "RUN", \ "tests for $(TARGET) SKIPPED") endif # It doesn't matter if these don't exits .PHONY: clean-guest-tests clean-guest-tests: rm -rf tests/tcg/$(TARGET)