--- mesonbuild/environment.py.orig 2023-12-01 21:19:37 +++ mesonbuild/environment.py 2023-12-01 21:24:12 @@ -15,6 +15,7 @@ import itertools import os, platform, re, sys, shutil +import subprocess import typing as T import collections @@ -283,6 +284,21 @@ if compiler.id == 'gcc' and compiler.has_builtin_define('__i386__'): return 'x86' return os_arch + +def detect_osx_arch() -> str: + """ + per #6187, handle early Mac 64-bit Intel CPU with 64-bit OSX using a **32-bit kernel** + testing this requires old MacOS and hardware, not easily available for cloud CI, + so users needing this functionality may kindly need to help with debugging info. + """ + try: + ret = subprocess.run(['sysctl', '-n', 'hw.cpu64bit_capable'], + universal_newlines=True, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL).stdout + trial = 'x86_64' if ret.strip() == '1' else 'x86' + except subprocess.SubprocessError: + # very old MacOS version with implicit 32-bit CPU due to calling if-elif stack + trial = 'x86' + return trial def any_compiler_has_define(compilers: CompilersDict, define: str) -> bool: for c in compilers.values(): @@ -308,7 +324,11 @@ else: trial = platform.machine().lower() if trial.startswith('i') and trial.endswith('86'): - trial = 'x86' + if mesonlib.is_osx(): + # handle corner case with early Mac 64-bit CPU and older OSX + trial = detect_osx_arch() + else: + trial = 'x86' elif trial == 'bepc': trial = 'x86' elif trial == 'arm64':