From 7ba023284196a536079f856e4cdbf30212169890 Mon Sep 17 00:00:00 2001 From: Jeremy Drake Date: Sat, 19 Apr 2025 22:42:54 +0300 Subject: [PATCH] run-tests: Inspect the msys2 "uname" output While msys2 itself may be x86_64 running emulated, it still does indicate whether the host machine runs ARM64 (since recent changes in https://github.com/msys2/msys2-runtime/pull/244 and https://github.com/msys2/msys2-runtime/pull/245). The msys2 uname command also exposes the Windows build number, which allows determining whether armv7 and/or x86_64 binaries can be executed. --- run-tests.sh | 55 ++++++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/run-tests.sh b/run-tests.sh index eb53efa..3175bf5 100755 --- a/run-tests.sh +++ b/run-tests.sh @@ -88,37 +88,36 @@ if [ -z "$RUN_X86_64" ] && [ -z "$RUN_I686" ] && [ -z "$RUN_ARMV7" ] && [ -z "$R case $(uname) in MINGW*|MSYS*) # On Windows/arm64, we may be running x86_64 msys2 emulated, so we - # can't rely on "uname -m" here. Inspect the default target architecture - # of the native toolchain instead; we can be sure that we can execute - # the kind of binary that the toolchain consists of. - case $(clang -dumpmachine | sed 's/-.*//') in - i686|x86_64) - # For i686, we could in theory be running on an i686-only machine, - # but let's assume that we can execute x86_64 binaries too - # (for wider test coverage). - NATIVE_X86=1 - RUN_X86_64=true - RUN_I686=true - ;; - armv7) - # This is most probably running on aarch64 so those probably - # could be executed too, but let's skip that for now. - NATIVE_ARMV7=1 - RUN_ARMV7=true - ;; - aarch64) - # Windows/ARM64 can run i686 binaries (and also x86_64 since - # Windows 11). Not setting NATIVE_X86 - the asan tests don't run - # correctly when emulated on ARM64. - # Since Windows 11 24H2 (10.0.26100) armv7 binaries can no longer - # be executed, so out of future precaution, don't automatically - # try to execute them. + # can't rely on "uname -m" here. But the msys2 "uname" output indicates + # the real host architecture, and the Windows build version. + if [ "$(uname | cut -d - -f 4)" = "ARM64" ]; then + # Windows/ARM64 can run i686 binaries. Not setting NATIVE_X86 - the + # asan tests don't run correctly when emulated on ARM64. NATIVE_AARCH64=1 RUN_I686=true - RUN_X86_64=true RUN_AARCH64=true - ;; - esac + + winbuild="$(uname | cut -d - -f 3)" + if [ "$winbuild" -ge 22000 ]; then + # Since Windows 11, x86_64 binaries can also be emulated. + RUN_X86_64=true + fi + if [ "$winbuild" -lt 26100 ]; then + # Since Windows 11 24H2 armv7 binaries can no longer be + # executed. (It is also possible to be unable to run armv7 + # binaries on older OS versions, if the hardware is incapable + # of it, like on Apple Silicon macs.) + NATIVE_ARMV7=1 + RUN_ARMV7=true + fi + elif [ "$(uname -m)" = "i686" ] && [ "$(uname | cut -d - -f 4)" != "WOW64" ]; then + NATIVE_X86=1 + RUN_I686=true + else + NATIVE_X86=1 + RUN_I686=true + RUN_X86_64=true + fi ;; Linux) if command -v wine >/dev/null; then