| # -*- 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) |