Skip to content
Snippets Groups Projects
Commit c1eb3f96 authored by Harmen Stoppels's avatar Harmen Stoppels Committed by Harmen Stoppels
Browse files

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

parent e0d24621
No related branches found
Tags
No related merge requests found
...@@ -9,20 +9,30 @@ ...@@ -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"] ...@@ -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"] ...@@ -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:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment