libc.py: detect glibc also in chinese locale (#47434)
This commit is contained in:
parent
d45f682573
commit
dadb30f0e2
@ -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:
|
||||||
|
Loading…
Reference in New Issue
Block a user