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 GitHub
parent d45f682573
commit dadb30f0e2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

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 List, Optional from typing import Dict, List, 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)
@ -38,7 +48,7 @@ def default_search_paths_from_dynamic_linker(dynamic_linker: str) -> List[str]:
"""If the dynamic linker is glibc at a certain version, we can query the hard-coded library """If the dynamic linker is glibc at a certain version, we can query the hard-coded library
search paths""" search paths"""
try: try:
result = run([dynamic_linker, "--help"], stdout=PIPE, stderr=PIPE, check=False) result = run([dynamic_linker, "--help"], stdout=PIPE, stderr=PIPE, check=False, env=_env())
assert result.returncode == 0 assert result.returncode == 0
out = result.stdout.decode("utf-8") out = result.stdout.decode("utf-8")
except Exception: except Exception:
@ -74,7 +84,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:
@ -91,7 +103,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: