build: check Apple clang version in configure script

Apple clang version number is not the same as the actual LLVM version

PR-URL: https://github.com/nodejs/node/pull/59358
Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
Reviewed-By: Richard Lau <richard.lau@ibm.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
This commit is contained in:
Michaël Zasso 2025-08-05 09:33:18 +02:00 committed by Node.js GitHub Bot
parent 0309806a74
commit 954d3f44ef

View file

@ -1117,18 +1117,20 @@ def try_check_compiler(cc, lang):
with proc: with proc:
proc.stdin.write(b'__clang__ __GNUC__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__ ' proc.stdin.write(b'__clang__ __GNUC__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__ '
b'__clang_major__ __clang_minor__ __clang_patchlevel__') b'__clang_major__ __clang_minor__ __clang_patchlevel__ '
b'__APPLE__')
if sys.platform == 'zos': if sys.platform == 'zos':
values = (to_utf8(proc.communicate()[0]).split('\n')[-2].split() + ['0'] * 7)[0:7] values = (to_utf8(proc.communicate()[0]).split('\n')[-2].split() + ['0'] * 7)[0:8]
else: else:
values = (to_utf8(proc.communicate()[0]).split() + ['0'] * 7)[0:7] values = (to_utf8(proc.communicate()[0]).split() + ['0'] * 7)[0:8]
is_clang = values[0] == '1' is_clang = values[0] == '1'
gcc_version = tuple(map(int, values[1:1+3])) gcc_version = tuple(map(int, values[1:1+3]))
clang_version = tuple(map(int, values[4:4+3])) if is_clang else None clang_version = tuple(map(int, values[4:4+3])) if is_clang else None
is_apple = values[7] == '1'
return (True, is_clang, clang_version, gcc_version) return (True, is_clang, clang_version, gcc_version, is_apple)
# #
@ -1292,18 +1294,18 @@ def check_compiler(o):
o['variables']['openssl_no_asm'] = 1 o['variables']['openssl_no_asm'] = 1
return return
ok, is_clang, clang_version, gcc_version = try_check_compiler(CXX, 'c++') ok, is_clang, clang_version, gcc_version, is_apple = try_check_compiler(CXX, 'c++')
o['variables']['clang'] = B(is_clang) o['variables']['clang'] = B(is_clang)
version_str = ".".join(map(str, clang_version if is_clang else gcc_version)) version_str = ".".join(map(str, clang_version if is_clang else gcc_version))
print_verbose(f"Detected {'clang ' if is_clang else ''}C++ compiler (CXX={CXX}) version: {version_str}") print_verbose(f"Detected {'Apple ' if is_apple else ''}{'clang ' if is_clang else ''}C++ compiler (CXX={CXX}) version: {version_str}")
if not ok: if not ok:
warn(f'failed to autodetect C++ compiler version (CXX={CXX})') warn(f'failed to autodetect C++ compiler version (CXX={CXX})')
elif clang_version < (19, 1, 0) if is_clang else gcc_version < (12, 2, 0): elif (is_apple and clang_version < (17, 0, 0) or not is_apple and clang_version < (19, 1, 0)) if is_clang else gcc_version < (12, 2, 0):
warn(f'C++ compiler (CXX={CXX}, {version_str}) too old, need g++ 12.2.0 or clang++ 19.1.0') warn(f'C++ compiler (CXX={CXX}, {version_str}) too old, need g++ 12.2.0, clang++ 19.1.0, or Apple clang++ 17.0.0')
ok, is_clang, clang_version, gcc_version = try_check_compiler(CC, 'c') ok, is_clang, clang_version, gcc_version, is_apple = try_check_compiler(CC, 'c')
version_str = ".".join(map(str, clang_version if is_clang else gcc_version)) version_str = ".".join(map(str, clang_version if is_clang else gcc_version))
print_verbose(f"Detected {'clang ' if is_clang else ''}C compiler (CC={CC}) version: {version_str}") print_verbose(f"Detected {'Apple ' if is_apple else ''}{'clang ' if is_clang else ''}C compiler (CC={CC}) version: {version_str}")
if not ok: if not ok:
warn(f'failed to autodetect C compiler version (CC={CC})') warn(f'failed to autodetect C compiler version (CC={CC})')
elif not is_clang and gcc_version < (4, 2, 0): elif not is_clang and gcc_version < (4, 2, 0):
@ -1481,7 +1483,7 @@ def configure_zos(o):
def clang_version_ge(version_checked): def clang_version_ge(version_checked):
for compiler in [(CC, 'c'), (CXX, 'c++')]: for compiler in [(CC, 'c'), (CXX, 'c++')]:
_, is_clang, clang_version, _1 = ( _, is_clang, clang_version, _1, _2 = (
try_check_compiler(compiler[0], compiler[1]) try_check_compiler(compiler[0], compiler[1])
) )
if is_clang and clang_version >= version_checked: if is_clang and clang_version >= version_checked:
@ -1490,7 +1492,7 @@ def clang_version_ge(version_checked):
def gcc_version_ge(version_checked): def gcc_version_ge(version_checked):
for compiler in [(CC, 'c'), (CXX, 'c++')]: for compiler in [(CC, 'c'), (CXX, 'c++')]:
_, is_clang, _1, gcc_version = ( _, is_clang, _1, gcc_version, _2 = (
try_check_compiler(compiler[0], compiler[1]) try_check_compiler(compiler[0], compiler[1])
) )
if is_clang or gcc_version < version_checked: if is_clang or gcc_version < version_checked: