libc.py: detect glibc also in chinese locale (#47434)

This commit is contained in:
Harmen Stoppels 2024-11-05 12:30:32 +01:00 committed by Harmen Stoppels
parent e0d246210f
commit c1eb3f965b

View File

@ -9,20 +9,30 @@
import shlex import shlex
import sys import sys
from subprocess import PIPE, run from subprocess import PIPE, run
from typing import Optional from typing import Dict, Optional
import spack.spec import spack.spec
import spack.util.elf import spack.util.elf
#: Pattern to distinguish glibc from other libc implementations
GLIBC_PATTERN = r"\b(?:Free Software Foundation|Roland McGrath|Ulrich Depper)\b"
def _env() -> Dict[str, str]:
"""Currently only set LC_ALL=C without clearing further environment variables"""
return {**os.environ, "LC_ALL": "C"}
def _libc_from_ldd(ldd: str) -> Optional["spack.spec.Spec"]: def _libc_from_ldd(ldd: str) -> Optional["spack.spec.Spec"]:
try: try:
result = run([ldd, "--version"], stdout=PIPE, stderr=PIPE, check=False) result = run([ldd, "--version"], stdout=PIPE, stderr=PIPE, check=False, env=_env())
stdout = result.stdout.decode("utf-8") stdout = result.stdout.decode("utf-8")
except Exception: except Exception:
return None return None
if not re.search(r"\bFree Software Foundation\b", stdout): # The string "Free Software Foundation" is sometimes translated and not detected, but the names
# of the authors are typically present.
if not re.search(GLIBC_PATTERN, stdout):
return None return None
version_str = re.match(r".+\(.+\) (.+)", stdout) version_str = re.match(r".+\(.+\) (.+)", stdout)
@ -58,7 +68,9 @@ def libc_from_dynamic_linker(dynamic_linker: str) -> Optional["spack.spec.Spec"]
# Now try to figure out if glibc or musl, which is the only ones we support. # Now try to figure out if glibc or musl, which is the only ones we support.
# In recent glibc we can simply execute the dynamic loader. In musl that's always the case. # In recent glibc we can simply execute the dynamic loader. In musl that's always the case.
try: try:
result = run([dynamic_linker, "--version"], stdout=PIPE, stderr=PIPE, check=False) result = run(
[dynamic_linker, "--version"], stdout=PIPE, stderr=PIPE, check=False, env=_env()
)
stdout = result.stdout.decode("utf-8") stdout = result.stdout.decode("utf-8")
stderr = result.stderr.decode("utf-8") stderr = result.stderr.decode("utf-8")
except Exception: except Exception:
@ -75,7 +87,7 @@ def libc_from_dynamic_linker(dynamic_linker: str) -> Optional["spack.spec.Spec"]
return spec return spec
except Exception: except Exception:
return None return None
elif re.search(r"\bFree Software Foundation\b", stdout): elif re.search(GLIBC_PATTERN, stdout):
# output is like "ld.so (...) stable release version 2.33." # output is like "ld.so (...) stable release version 2.33."
match = re.search(r"version (\d+\.\d+(?:\.\d+)?)", stdout) match = re.search(r"version (\d+\.\d+(?:\.\d+)?)", stdout)
if not match: if not match: