From c1eb3f965b293d381868dbccd48a74e2ce137a71 Mon Sep 17 00:00:00 2001
From: Harmen Stoppels <me@harmenstoppels.nl>
Date: Tue, 5 Nov 2024 12:30:32 +0100
Subject: [PATCH] libc.py: detect glibc also in chinese locale (#47434)

---
 lib/spack/spack/util/libc.py | 22 +++++++++++++++++-----
 1 file changed, 17 insertions(+), 5 deletions(-)

diff --git a/lib/spack/spack/util/libc.py b/lib/spack/spack/util/libc.py
index bcfbbec646a..c4650728214 100644
--- a/lib/spack/spack/util/libc.py
+++ b/lib/spack/spack/util/libc.py
@@ -9,20 +9,30 @@
 import shlex
 import sys
 from subprocess import PIPE, run
-from typing import Optional
+from typing import Dict, Optional
 
 import spack.spec
 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"]:
     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")
     except Exception:
         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
 
     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.
     # In recent glibc we can simply execute the dynamic loader. In musl that's always the case.
     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")
         stderr = result.stderr.decode("utf-8")
     except Exception:
@@ -75,7 +87,7 @@ def libc_from_dynamic_linker(dynamic_linker: str) -> Optional["spack.spec.Spec"]
             return spec
         except Exception:
             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."
         match = re.search(r"version (\d+\.\d+(?:\.\d+)?)", stdout)
         if not match:
-- 
GitLab