qemu/tests/tcg/configure.sh
Paolo Bonzini 2038f8c877 tests/tcg: move configuration to a sub-shell script
Avoid the repeated inclusions of config-target.mak, which have
risks of namespace pollution, and instead build minimal configuration
files in a configuration script.  The same configuration files can
also be included in Makefile and Makefile.qemu

[AJB 10/09/19]
In the original PR this had inadvertently enabled tests
for ppc64abi32. However as the rest of the multiarch tests work rather
than disabling the otherwise correctly functioning build I've just
skipped the failing linux-test test. For some reason I can't debug it
with TCG so I'm leaving that to the PPC maintainers to look at.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Message-Id: <20190807143523.15917-4-pbonzini@redhat.com>
[AJB: s/docker/container/, rm last bits from configure, ppc6432abi hack]
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Cc: Richard Henderson <rth@twiddle.net>
2019-09-10 14:09:00 +01:00

234 lines
6.3 KiB
Bash
Executable file

#! /bin/sh
if test -z "$source_path"; then
echo Do not invoke this script directly. It is called
echo automatically by configure.
exit 1
fi
write_c_skeleton() {
cat > $TMPC <<EOF
int main(void) { return 0; }
EOF
}
has() {
command -v "$1" >/dev/null 2>&1
}
do_compiler() {
# Run the compiler, capturing its output to the log. First argument
# is compiler binary to execute.
local compiler="$1"
shift
if test -n "$BASH_VERSION"; then eval '
echo >>config.log "
funcs: ${FUNCNAME[*]}
lines: ${BASH_LINENO[*]}"
'; fi
echo $compiler "$@" >> config.log
$compiler "$@" >> config.log 2>&1 || return $?
}
TMPDIR1="config-temp"
TMPC="${TMPDIR1}/qemu-conf.c"
TMPE="${TMPDIR1}/qemu-conf.exe"
container="no"
if has "docker" || has "podman"; then
container=$($python $source_path/tests/docker/docker.py probe)
fi
# cross compilers defaults, can be overridden with --cross-cc-ARCH
: ${cross_cc_aarch64="aarch64-linux-gnu-gcc"}
: ${cross_cc_aarch64_be="$cross_cc_aarch64"}
: ${cross_cc_cflags_aarch64_be="-mbig-endian"}
: ${cross_cc_arm="arm-linux-gnueabihf-gcc"}
: ${cross_cc_cflags_armeb="-mbig-endian"}
: ${cross_cc_i386="i386-pc-linux-gnu-gcc"}
: ${cross_cc_cflags_i386="-m32"}
: ${cross_cc_x86_64="x86_64-pc-linux-gnu-gcc"}
: ${cross_cc_cflags_x86_64="-m64"}
: ${cross_cc_ppc="powerpc-linux-gnu-gcc"}
: ${cross_cc_cflags_ppc="-m32"}
: ${cross_cc_ppc64="powerpc-linux-gnu-gcc"}
: ${cross_cc_cflags_ppc64="-m64"}
: ${cross_cc_ppc64le="powerpc64le-linux-gnu-gcc"}
: ${cross_cc_cflags_s390x="-m64"}
: ${cross_cc_cflags_sparc="-m32 -mv8plus -mcpu=ultrasparc"}
: ${cross_cc_cflags_sparc64="-m64 -mcpu=ultrasparc"}
for target in $target_list; do
arch=${target%%-*}
case $arch in
arm|armeb)
arches=arm
;;
aarch64|aarch64_be)
arches="aarch64 arm"
;;
mips*)
arches=mips
;;
ppc*)
arches=ppc
;;
sh4|sh4eb)
arches=sh4
;;
x86_64)
arches="x86_64 i386"
;;
xtensa|xtensaeb)
arches=xtensa
;;
alpha|cris|hppa|i386|lm32|m68k|openrisc|riscv64|s390x|sh4|sparc64)
arches=$target
;;
*)
continue
;;
esac
container_image=
case $target in
aarch64-*)
# We don't have any bigendian build tools so we only use this for AArch64
container_image=debian-buster-arm64-cross
container_cross_cc=aarch64-linux-gnu-gcc
;;
alpha-*)
container_image=debian-alpha-cross
container_cross_cc=alpha-linux-gnu-gcc
;;
arm-*)
# We don't have any bigendian build tools so we only use this for ARM
container_image=debian-armhf-cross
container_cross_cc=arm-linux-gnueabihf-gcc
;;
cris-*)
container_image=fedora-cris-cross
container_cross_cc=cris-linux-gnu-gcc
;;
hppa-*)
container_image=debian-hppa-cross
container_cross_cc=hppa-linux-gnu-gcc
;;
i386-*)
container_image=fedora-i386-cross
container_cross_cc=gcc
;;
m68k-*)
container_image=debian-m68k-cross
container_cross_cc=m68k-linux-gnu-gcc
;;
mips64el-*)
container_image=debian-mips64el-cross
container_cross_cc=mips64el-linux-gnuabi64-gcc
;;
mips64-*)
container_image=debian-mips64-cross
container_cross_cc=mips64-linux-gnuabi64-gcc
;;
mipsel-*)
container_image=debian-mipsel-cross
container_cross_cc=mipsel-linux-gnu-gcc
;;
mips-*)
container_image=debian-mips-cross
container_cross_cc=mips-linux-gnu-gcc
;;
ppc-*|ppc64abi32-*)
container_image=debian-powerpc-cross
container_cross_cc=powerpc-linux-gnu-gcc
;;
ppc64-*)
container_image=debian-ppc64-cross
container_cross_cc=powerpc64-linux-gnu-gcc
;;
ppc64le-*)
container_image=debian-ppc64el-cross
container_cross_cc=powerpc64le-linux-gnu-gcc
;;
riscv64-*)
container_image=debian-riscv64-cross
container_cross_cc=riscv64-linux-gnu-gcc
;;
s390x-*)
container_image=debian-s390x-cross
container_cross_cc=s390x-linux-gnu-gcc
;;
sh4-*)
container_image=debian-sh4-cross
container_cross_cc=sh4-linux-gnu-gcc
;;
sparc64-*)
container_image=debian-sparc64-cross
container_cross_cc=sparc64-linux-gnu-gcc
;;
xtensa*-softmmu)
container_image=debian-xtensa-cross
# default to the dc232b cpu
container_cross_cc=/opt/2018.02/xtensa-dc232b-elf/bin/xtensa-dc232b-elf-gcc
;;
esac
config_target_mak=tests/tcg/config-$target.mak
echo "# Automatically generated by configure - do not modify" > $config_target_mak
echo "TARGET_NAME=$arch" >> $config_target_mak
case $target in
*-linux-user | *-bsd-user)
echo "CONFIG_USER_ONLY=y" >> $config_target_mak
echo "QEMU=\$(BUILD_DIR)/$target/qemu-$arch" >> $config_target_mak
;;
*-softmmu)
echo "CONFIG_SOFTMMU=y" >> $config_target_mak
echo "QEMU=\$(BUILD_DIR)/$target/qemu-system-$arch" >> $config_target_mak
;;
esac
eval "target_compiler_cflags=\${cross_cc_cflags_$arch}"
echo "CROSS_CC_GUEST_CFLAGS=$target_compiler_cflags" >> $config_target_mak
got_cross_cc=no
for i in $arch $arches; do
if eval test "x\${cross_cc_$i+yes}" != xyes; then
continue
fi
eval "target_compiler=\${cross_cc_$i}"
if ! has $target_compiler; then
continue
fi
write_c_skeleton
if ! do_compiler "$target_compiler" $target_compiler_cflags -o $TMPE $TMPC -static ; then
# For host systems we might get away with building without -static
if ! do_compiler "$target_compiler" $target_compiler_cflags -o $TMPE $TMPC ; then
continue
fi
echo "CROSS_CC_GUEST_STATIC=y" >> $config_target_mak
else
echo "CROSS_CC_GUEST_STATIC=y" >> $config_target_mak
fi
echo "CROSS_CC_GUEST=$target_compiler" >> $config_target_mak
enabled_cross_compilers="$enabled_cross_compilers $target_compiler"
got_cross_cc=yes
break
done
if test $got_cross_cc = no && test "$container" != no && test -n "$container_image"; then
echo "DOCKER_IMAGE=$container_image" >> $config_target_mak
echo "DOCKER_CROSS_CC_GUEST=$container_cross_cc" >> $config_target_mak
fi
done
# report container support state
echo "cross containers $container"
if test -n "$enabled_cross_compilers"; then
echo
echo "NOTE: guest cross-compilers enabled:$enabled_cross_compilers"
fi