aboutsummaryrefslogtreecommitdiff
path: root/configure
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2023-08-08 14:03:03 +0200
committerPaolo Bonzini <pbonzini@redhat.com>2023-08-08 20:44:11 +0200
commit971fac2731e60f2143f35648b14fd2f1b5b2c1af (patch)
treed3614200ee3b6c7fd378fe582505ef97695bbc2e /configure
parent50a001222737ca04feb77f9117a623b91d61f2cd (diff)
configure: unify case statements for CPU canonicalization
The CPU model has to be canonicalized to what Meson wants in the cross file, to what Linux uses for its asm-$ARCH directories, and to what QEMU uses for its user-mode emulation host/$ARCH directories. Do all three in a single case statement, and check that the Linux and QEMU directories actually exist. At a small cost in repeated lines, this ensures that there are no hidden ordering requirements between the case statements. In particular, commit 89e5b7935e9 ("configure: Fix linux-user host detection for riscv64", 2023-08-06) broke ppc64le because it assigned host_arch based on a non-canonicalized version of $cpu. Reported-by: Joel Stanley <joel@jms.id.au> Fixes: 89e5b7935e9 ("configure: Fix linux-user host detection for riscv64", 2023-08-06) Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Acked-by: Ilya Leoshkevich <iii@linux.ibm.com> Reviewed-by: Michael Tokarev <mjt@tls.msk.ru> Tested-by: Ilya Leoshkevich <iii@linux.ibm.com> Tested-by: Michael Tokarev <mjt@tls.msk.ru> Message-ID: <20230808120303.585509-4-pbonzini@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'configure')
-rwxr-xr-xconfigure165
1 files changed, 97 insertions, 68 deletions
diff --git a/configure b/configure
index 484d38d81f..133f4e3235 100755
--- a/configure
+++ b/configure
@@ -469,59 +469,119 @@ else
echo "WARNING: unrecognized host CPU, proceeding with 'uname -m' output '$cpu'"
fi
-case "$cpu" in
- riscv*)
- host_arch=riscv ;;
- x32)
- host_arch=x86_64 ;;
- *)
- host_arch="$cpu" ;;
-esac
-
-# Normalise host CPU name and set multilib cflags. The canonicalization
-# isn't really necessary, because the architectures that we check for
-# should not hit the 'uname -m' case, but better safe than sorry.
+# Normalise host CPU name to the values used by Meson cross files and in source
+# directories, and set multilib cflags. The canonicalization isn't really
+# necessary, because the architectures that we check for should not hit the
+# 'uname -m' case, but better safe than sorry in case --cpu= is used.
+#
# Note that this case should only have supported host CPUs, not guests.
+# Please keep it sorted and synchronized with meson.build's host_arch.
+host_arch=
+linux_arch=
case "$cpu" in
+ aarch64)
+ host_arch=aarch64
+ linux_arch=arm64
+ ;;
+
armv*b|armv*l|arm)
- cpu="arm" ;;
+ cpu=arm
+ host_arch=arm
+ linux_arch=arm
+ ;;
i386|i486|i586|i686)
cpu="i386"
- CPU_CFLAGS="-m32" ;;
- x32)
- cpu="x86_64"
- CPU_CFLAGS="-mx32" ;;
- x86_64|amd64)
- cpu="x86_64"
- # ??? Only extremely old AMD cpus do not have cmpxchg16b.
- # If we truly care, we should simply detect this case at
- # runtime and generate the fallback to serial emulation.
- CPU_CFLAGS="-m64 -mcx16" ;;
+ host_arch=i386
+ linux_arch=x86
+ CPU_CFLAGS="-m32"
+ ;;
+ loongarch*)
+ cpu=loongarch64
+ host_arch=loongarch64
+ ;;
+
+ mips64*)
+ cpu=mips64
+ host_arch=mips
+ linux_arch=mips
+ ;;
mips*)
- cpu="mips" ;;
+ cpu=mips
+ host_arch=mips
+ linux_arch=mips
+ ;;
ppc)
- CPU_CFLAGS="-m32" ;;
+ host_arch=ppc
+ linux_arch=powerpc
+ CPU_CFLAGS="-m32"
+ ;;
ppc64)
- CPU_CFLAGS="-m64 -mbig-endian" ;;
+ host_arch=ppc64
+ linux_arch=powerpc
+ CPU_CFLAGS="-m64 -mbig-endian"
+ ;;
ppc64le)
- cpu="ppc64"
- CPU_CFLAGS="-m64 -mlittle-endian" ;;
+ cpu=ppc64
+ host_arch=ppc64
+ linux_arch=powerpc
+ CPU_CFLAGS="-m64 -mlittle-endian"
+ ;;
+
+ riscv32 | riscv64)
+ host_arch=riscv
+ linux_arch=riscv
+ ;;
s390)
- CPU_CFLAGS="-m31" ;;
+ linux_arch=s390
+ CPU_CFLAGS="-m31"
+ ;;
s390x)
- CPU_CFLAGS="-m64" ;;
+ host_arch=s390x
+ linux_arch=s390
+ CPU_CFLAGS="-m64"
+ ;;
sparc|sun4[cdmuv])
- cpu="sparc"
- CPU_CFLAGS="-m32 -mv8plus -mcpu=ultrasparc" ;;
+ cpu=sparc
+ CPU_CFLAGS="-m32 -mv8plus -mcpu=ultrasparc"
+ ;;
sparc64)
- CPU_CFLAGS="-m64 -mcpu=ultrasparc" ;;
+ host_arch=sparc64
+ CPU_CFLAGS="-m64 -mcpu=ultrasparc"
+ ;;
+
+ x32)
+ cpu="x86_64"
+ host_arch=x86_64
+ linux_arch=x86
+ CPU_CFLAGS="-mx32"
+ ;;
+ x86_64|amd64)
+ cpu="x86_64"
+ host_arch=x86_64
+ linux_arch=x86
+ # ??? Only extremely old AMD cpus do not have cmpxchg16b.
+ # If we truly care, we should simply detect this case at
+ # runtime and generate the fallback to serial emulation.
+ CPU_CFLAGS="-m64 -mcx16"
+ ;;
esac
+if test -n "$host_arch" && {
+ ! test -d "$source_path/linux-user/include/host/$host_arch" ||
+ ! test -d "$source_path/common-user/host/$host_arch"; }; then
+ error_exit "linux-user/include/host/$host_arch does not exist." \
+ "This is a bug in the configure script, please report it."
+fi
+if test -n "$linux_arch" && ! test -d "$source_path/linux-headers/asm-$linux_arch"; then
+ error_exit "linux-headers/asm-$linux_arch does not exist." \
+ "This is a bug in the configure script, please report it."
+fi
+
check_py_version() {
# We require python >= 3.7.
# NB: a True python conditional creates a non-zero return code (Failure)
@@ -812,7 +872,7 @@ default_target_list=""
mak_wilds=""
if [ "$linux_user" != no ]; then
- if [ "$targetos" = linux ] && [ -d "$source_path/linux-user/include/host/$host_arch" ]; then
+ if [ "$targetos" = linux ] && [ -n "$host_arch" ]; then
linux_user=yes
elif [ "$linux_user" = yes ]; then
error_exit "linux-user not supported on this architecture"
@@ -1717,40 +1777,9 @@ echo "PKG_CONFIG=${pkg_config}" >> $config_host_mak
echo "CC=$cc" >> $config_host_mak
echo "EXESUF=$EXESUF" >> $config_host_mak
-# use included Linux headers
-if test "$linux" = "yes" ; then
- mkdir -p linux-headers
- case "$cpu" in
- i386|x86_64)
- linux_arch=x86
- ;;
- ppc|ppc64)
- linux_arch=powerpc
- ;;
- s390x)
- linux_arch=s390
- ;;
- aarch64)
- linux_arch=arm64
- ;;
- loongarch*)
- linux_arch=loongarch
- ;;
- mips64)
- linux_arch=mips
- ;;
- riscv32|riscv64)
- linux_arch=riscv
- ;;
- *)
- # For most CPUs the kernel architecture name and QEMU CPU name match.
- linux_arch="$cpu"
- ;;
- esac
- # For non-KVM architectures we will not have asm headers
- if [ -e "$source_path/linux-headers/asm-$linux_arch" ]; then
- symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
- fi
+# use included Linux headers for KVM architectures
+if test "$linux" = "yes" && test -n "$linux_arch"; then
+ symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
fi
for target in $target_list; do