tests/tcg: invoke Makefile.target directly from QEMU's makefile
Build the "docker.py cc" invocation directly in tests/tcg/configure.sh, and remove the Makefile.qemu wrapper around Makefile.target. The config-*.mak files now include the actual variables used when building the tests, rather than the CROSS_* variables that Makefile.qemu used to "translate". This is a first step towards generalizing the cross-compilation infrastructure so that it can be used for firmware as well. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Message-Id: <20220401141326.1244422-15-pbonzini@redhat.com> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20220419091020.3008144-18-alex.bennee@linaro.org>
This commit is contained in:
parent
5377a10001
commit
eebf199c09
@ -48,25 +48,27 @@ RUN_TCG_TARGET_RULES=$(patsubst %,run-tcg-tests-%, $(TCG_TESTS_TARGETS))
|
|||||||
$(foreach TARGET,$(TCG_TESTS_TARGETS), \
|
$(foreach TARGET,$(TCG_TESTS_TARGETS), \
|
||||||
$(eval $(BUILD_DIR)/tests/tcg/config-$(TARGET).mak: config-host.mak))
|
$(eval $(BUILD_DIR)/tests/tcg/config-$(TARGET).mak: config-host.mak))
|
||||||
|
|
||||||
$(BUILD_TCG_TARGET_RULES): build-tcg-tests-%: $(if $(CONFIG_PLUGIN),test-plugins)
|
.PHONY: $(TCG_TESTS_TARGETS:%=build-tcg-tests-%)
|
||||||
$(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) \
|
$(TCG_TESTS_TARGETS:%=build-tcg-tests-%): build-tcg-tests-%: $(BUILD_DIR)/tests/tcg/config-%.mak
|
||||||
-f $(SRC_PATH)/tests/tcg/Makefile.qemu \
|
$(call quiet-command, \
|
||||||
SRC_PATH=$(SRC_PATH) \
|
$(MAKE) -C tests/tcg/$* -f ../Makefile.target $(SUBDIR_MAKEFLAGS) \
|
||||||
V="$(V)" TARGET="$*" guest-tests, \
|
DOCKER_SCRIPT="$(DOCKER_SCRIPT)" \
|
||||||
"BUILD", "TCG tests for $*")
|
TARGET="$*" SRC_PATH="$(SRC_PATH)", \
|
||||||
|
"BUILD","$* guest-tests")
|
||||||
|
|
||||||
$(RUN_TCG_TARGET_RULES): run-tcg-tests-%: build-tcg-tests-% all
|
.PHONY: $(TCG_TESTS_TARGETS:%=run-tcg-tests-%)
|
||||||
$(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) \
|
$(TCG_TESTS_TARGETS:%=run-tcg-tests-%): run-tcg-tests-%: build-tcg-tests-% $(if $(CONFIG_PLUGIN),test-plugins)
|
||||||
-f $(SRC_PATH)/tests/tcg/Makefile.qemu \
|
$(call quiet-command, \
|
||||||
SRC_PATH=$(SRC_PATH) SPEED="$(SPEED)" \
|
$(MAKE) -C tests/tcg/$* -f ../Makefile.target $(SUBDIR_MAKEFLAGS) \
|
||||||
V="$(V)" TARGET="$*" run-guest-tests, \
|
TARGET="$*" SRC_PATH="$(SRC_PATH)" SPEED=$(SPEED) run, \
|
||||||
"RUN", "TCG tests for $*")
|
"RUN", "$* guest-tests")
|
||||||
|
|
||||||
$(CLEAN_TCG_TARGET_RULES): clean-tcg-tests-%:
|
.PHONY: $(TCG_TESTS_TARGETS:%=clean-tcg-tests-%)
|
||||||
$(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) \
|
$(TCG_TESTS_TARGETS:%=clean-tcg-tests-%): clean-tcg-tests-%:
|
||||||
-f $(SRC_PATH)/tests/tcg/Makefile.qemu \
|
$(call quiet-command, \
|
||||||
SRC_PATH=$(SRC_PATH) TARGET="$*" clean-guest-tests, \
|
$(MAKE) -C tests/tcg/$* -f ../Makefile.target $(SUBDIR_MAKEFLAGS) \
|
||||||
"CLEAN", "TCG tests for $*")
|
TARGET="$*" SRC_PATH="$(SRC_PATH)" clean, \
|
||||||
|
"CLEAN", "$* guest-tests")
|
||||||
|
|
||||||
.PHONY: build-tcg
|
.PHONY: build-tcg
|
||||||
build-tcg: $(BUILD_TCG_TARGET_RULES)
|
build-tcg: $(BUILD_TCG_TARGET_RULES)
|
||||||
|
@ -1,110 +0,0 @@
|
|||||||
# -*- 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
|
|
||||||
|
|
||||||
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)")
|
|
||||||
|
|
||||||
# It doesn't matter if these don't exits
|
|
||||||
.PHONY: clean-guest-tests
|
|
||||||
clean-guest-tests:
|
|
||||||
rm -rf tests/tcg/$(TARGET)
|
|
@ -187,4 +187,5 @@ gdb-%: %
|
|||||||
.PHONY: run
|
.PHONY: run
|
||||||
run: $(RUN_TESTS)
|
run: $(RUN_TESTS)
|
||||||
|
|
||||||
# There is no clean target, the calling make just rm's the tests build dir
|
clean:
|
||||||
|
rm -f $(TESTS) *.o
|
||||||
|
@ -227,7 +227,6 @@ for target in $target_list; do
|
|||||||
|
|
||||||
echo "# Automatically generated by configure - do not modify" > $config_target_mak
|
echo "# Automatically generated by configure - do not modify" > $config_target_mak
|
||||||
echo "TARGET_NAME=$arch" >> $config_target_mak
|
echo "TARGET_NAME=$arch" >> $config_target_mak
|
||||||
echo "target=$target" >> $config_target_mak
|
|
||||||
case $target in
|
case $target in
|
||||||
*-softmmu)
|
*-softmmu)
|
||||||
test -f $source_path/tests/tcg/$arch/Makefile.softmmu-target || continue
|
test -f $source_path/tests/tcg/$arch/Makefile.softmmu-target || continue
|
||||||
@ -257,13 +256,13 @@ for target in $target_list; do
|
|||||||
if do_compiler "$target_compiler" $target_compiler_cflags \
|
if do_compiler "$target_compiler" $target_compiler_cflags \
|
||||||
-o $TMPE $TMPC ; then
|
-o $TMPE $TMPC ; then
|
||||||
got_cross_cc=yes
|
got_cross_cc=yes
|
||||||
echo "CROSS_CC_GUEST_STATIC=y" >> $config_target_mak
|
echo "BUILD_STATIC=y" >> $config_target_mak
|
||||||
echo "CROSS_CC_GUEST=$target_compiler" >> $config_target_mak
|
echo "CC=$target_compiler" >> $config_target_mak
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
got_cross_cc=yes
|
got_cross_cc=yes
|
||||||
echo "CROSS_CC_GUEST_STATIC=y" >> $config_target_mak
|
echo "BUILD_STATIC=y" >> $config_target_mak
|
||||||
echo "CROSS_CC_GUEST=$target_compiler" >> $config_target_mak
|
echo "CC=$target_compiler" >> $config_target_mak
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@ -274,9 +273,8 @@ for target in $target_list; do
|
|||||||
if has $target_as && has $target_ld; then
|
if has $target_as && has $target_ld; then
|
||||||
case $target in
|
case $target in
|
||||||
tricore-softmmu)
|
tricore-softmmu)
|
||||||
echo "CROSS_CC_GUEST=$target_as" >> $config_target_mak
|
echo "AS=$target_as" >> $config_target_mak
|
||||||
echo "CROSS_AS_GUEST=$target_as" >> $config_target_mak
|
echo "LD=$target_ld" >> $config_target_mak
|
||||||
echo "CROSS_LD_GUEST=$target_ld" >> $config_target_mak
|
|
||||||
got_cross_cc=yes
|
got_cross_cc=yes
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
@ -334,16 +332,13 @@ for target in $target_list; do
|
|||||||
for host in $container_hosts; do
|
for host in $container_hosts; do
|
||||||
if test "$host" = "$cpu"; then
|
if test "$host" = "$cpu"; then
|
||||||
echo "build-tcg-tests-$target: docker-image-$container_image" >> $makefile
|
echo "build-tcg-tests-$target: docker-image-$container_image" >> $makefile
|
||||||
echo "DOCKER_IMAGE=$container_image" >> $config_target_mak
|
echo "BUILD_STATIC=y" >> $config_target_mak
|
||||||
echo "DOCKER_CROSS_CC_GUEST=$container_cross_cc" >> \
|
echo "CC=\$(DOCKER_SCRIPT) cc --cc $container_cross_cc -i qemu/$container_image -s $source_path --" >> $config_target_mak
|
||||||
$config_target_mak
|
|
||||||
if test -n "$container_cross_as"; then
|
if test -n "$container_cross_as"; then
|
||||||
echo "DOCKER_CROSS_AS_GUEST=$container_cross_as" >> \
|
echo "AS=\$(DOCKER_SCRIPT) cc --cc $container_cross_as -i qemu/$container_image -s $source_path --" >> $config_target_mak
|
||||||
$config_target_mak
|
|
||||||
fi
|
fi
|
||||||
if test -n "$container_cross_ld"; then
|
if test -n "$container_cross_ld"; then
|
||||||
echo "DOCKER_CROSS_LD_GUEST=$container_cross_ld" >> \
|
echo "LD=\$(DOCKER_SCRIPT) cc --cc $container_cross_ld -i qemu/$container_image -s $source_path --" >> $config_target_mak
|
||||||
$config_target_mak
|
|
||||||
fi
|
fi
|
||||||
case $target in
|
case $target in
|
||||||
aarch64-*)
|
aarch64-*)
|
||||||
@ -367,8 +362,9 @@ for target in $target_list; do
|
|||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
if test $got_cross_cc = yes; then
|
if test $got_cross_cc = yes; then
|
||||||
|
mkdir -p tests/tcg/$target
|
||||||
echo "QEMU=$PWD/$qemu" >> $config_target_mak
|
echo "QEMU=$PWD/$qemu" >> $config_target_mak
|
||||||
echo "CROSS_CC_GUEST_CFLAGS=$target_compiler_cflags" >> $config_target_mak
|
echo "EXTRA_CFLAGS=$target_compiler_cflags" >> $config_target_mak
|
||||||
echo "run-tcg-tests-$target: $qemu\$(EXESUF)" >> $makefile
|
echo "run-tcg-tests-$target: $qemu\$(EXESUF)" >> $makefile
|
||||||
tcg_tests_targets="$tcg_tests_targets $target"
|
tcg_tests_targets="$tcg_tests_targets $target"
|
||||||
fi
|
fi
|
||||||
|
Loading…
Reference in New Issue
Block a user