@@ -1868,6 +1868,7 @@ fi
: ${cross_cc_cflags_x86_64="-m64"}
compute_target_variable() {
+ eval "$2="
if eval test -n "\"\${cross_prefix_$1}\""; then
if eval has "\"\${cross_prefix_$1}\$3\""; then
eval "$2=\"\${cross_prefix_$1}\$3\""
@@ -1875,8 +1876,21 @@ compute_target_variable() {
fi
}
+# probe_target_compiler TARGET TEST-PROGRAM
+#
+# Look for a compiler for the given target, either native or cross.
+# Set variables target_* if a compiler is found, and container_cross_*
+# if a Docker-based cross-compiler image is known for the target.
+# Set got_cross_cc to yes/no depending on whether a non-container-based
+# compiler was found.
+#
+# If TEST-PROGRAM is present, use it to test the usability of the
+# compiler, and also set build_static to "y" if static linking is
+# possible.
+#
probe_target_compiler() {
# reset all output variables
+ got_cross_cc=no
container_image=
container_hosts=
container_cross_cc=
@@ -1887,14 +1901,6 @@ probe_target_compiler() {
container_cross_objcopy=
container_cross_ranlib=
container_cross_strip=
- target_cc=
- target_ar=
- target_as=
- target_ld=
- target_nm=
- target_objcopy=
- target_ranlib=
- target_strip=
case $1 in
aarch64) container_hosts="x86_64 aarch64" ;;
@@ -2041,22 +2047,8 @@ probe_target_compiler() {
: ${container_cross_strip:=${container_cross_prefix}strip}
done
- eval "target_cflags=\${cross_cc_cflags_$1}"
- if eval test -n "\"\${cross_cc_$1}\""; then
- if eval has "\"\${cross_cc_$1}\""; then
- eval "target_cc=\"\${cross_cc_$1}\""
- fi
- else
- compute_target_variable $1 target_cc gcc
- fi
- target_ccas=$target_cc
- compute_target_variable $1 target_ar ar
- compute_target_variable $1 target_as as
- compute_target_variable $1 target_ld ld
- compute_target_variable $1 target_nm nm
- compute_target_variable $1 target_objcopy objcopy
- compute_target_variable $1 target_ranlib ranlib
- compute_target_variable $1 target_strip strip
+ local t try
+ try=cross
case "$1:$cpu" in
aarch64_be:aarch64 | \
armeb:arm | \
@@ -2065,27 +2057,89 @@ probe_target_compiler() {
ppc*:ppc64 | \
sparc:sparc64 | \
"$cpu:$cpu")
- : ${target_cc:=$cc}
- : ${target_ccas:=$ccas}
- : ${target_as:=$as}
- : ${target_ld:=$ld}
- : ${target_ar:=$ar}
- : ${target_as:=$as}
- : ${target_ld:=$ld}
- : ${target_nm:=$nm}
- : ${target_objcopy:=$objcopy}
- : ${target_ranlib:=$ranlib}
- : ${target_strip:=$strip}
- ;;
+ try='native cross' ;;
esac
- if test -n "$target_cc"; then
- case $1 in
- i386|x86_64)
- if $target_cc --version | grep -qi "clang"; then
- unset target_cc
+ eval "target_cflags=\${cross_cc_cflags_$1}"
+ for t in $try; do
+ case $t in
+ native)
+ target_cc=$cc
+ target_ccas=$ccas
+ target_ar=$ar
+ target_as=$as
+ target_ld=$ld
+ target_nm=$nm
+ target_objcopy=$objcopy
+ target_ranlib=$ranlib
+ target_strip=$strip
+ ;;
+ cross)
+ target_cc=
+ if eval test -n "\"\${cross_cc_$1}\""; then
+ if eval has "\"\${cross_cc_$1}\""; then
+ eval "target_cc=\"\${cross_cc_$1}\""
fi
- ;;
+ else
+ compute_target_variable $1 target_cc gcc
+ fi
+ target_ccas=$target_cc
+ compute_target_variable $1 target_ar ar
+ compute_target_variable $1 target_as as
+ compute_target_variable $1 target_ld ld
+ compute_target_variable $1 target_nm nm
+ compute_target_variable $1 target_objcopy objcopy
+ compute_target_variable $1 target_ranlib ranlib
+ compute_target_variable $1 target_strip strip
+ ;;
esac
+
+ if test -n "$target_cc"; then
+ case $1 in
+ i386|x86_64)
+ if $target_cc --version | grep -qi "clang"; then
+ continue
+ fi
+ ;;
+ esac
+ elif test -n "$target_as" && test -n "$target_ld"; then
+ # Special handling for assembler only targets
+ case $target in
+ tricore-softmmu)
+ build_static=
+ got_cross_cc=yes
+ break
+ ;;
+ *)
+ continue
+ ;;
+ esac
+ else
+ continue
+ fi
+
+ if test $# = 2 && do_compiler "$target_cc" $target_cflags -o $TMPE $TMPC -static ; then
+ build_static=y
+ got_cross_cc=yes
+ break
+ fi
+ if test $# = 1 || do_compiler "$target_cc" $target_cflags -o $TMPE $TMPC ; then
+ build_static=
+ got_cross_cc=yes
+ break
+ fi
+ done
+ if test $got_cross_cc != yes; then
+ build_static=
+ target_cc=
+ target_ccas=
+ target_cflags=
+ target_ar=
+ target_as=
+ target_ld=
+ target_nm=
+ target_objcopy=
+ target_ranlib=
+ target_strip=
fi
}
@@ -2488,9 +2542,10 @@ tcg_tests_targets=
for target in $target_list; do
arch=${target%%-*}
- probe_target_compiler ${arch}
config_target_mak=tests/tcg/config-$target.mak
+ write_c_skeleton
+
echo "# Automatically generated by configure - do not modify" > $config_target_mak
echo "TARGET_NAME=$arch" >> $config_target_mak
case $target in
@@ -2501,35 +2556,14 @@ for target in $target_list; do
*-softmmu)
test -f $source_path/tests/tcg/$arch/Makefile.softmmu-target || continue
qemu="qemu-system-$arch"
+ probe_target_compiler ${arch}
;;
*-linux-user|*-bsd-user)
qemu="qemu-$arch"
+ probe_target_compiler ${arch} $TMPC
;;
esac
- got_cross_cc=no
- unset build_static
-
- if test -n "$target_cc"; then
- write_c_skeleton
- if ! do_compiler "$target_cc" $target_cflags \
- -o $TMPE $TMPC -static ; then
- # For host systems we might get away with building without -static
- if do_compiler "$target_cc" $target_cflags \
- -o $TMPE $TMPC ; then
- got_cross_cc=yes
- fi
- else
- got_cross_cc=yes
- build_static=y
- fi
- elif test -n "$target_as" && test -n "$target_ld"; then
- # Special handling for assembler only tests
- case $target in
- tricore-softmmu) got_cross_cc=yes ;;
- esac
- fi
-
if test $got_cross_cc = yes; then
# Test for compiler features for optional tests. We only do this
# for cross compilers because ensuring the docker containers based