-
-
Notifications
You must be signed in to change notification settings - Fork 14.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
coreutils: patch for uname to show the correct arch on arm macos
Until a recent patch in coreutils, gnus uname -p returned a different arch on apple silicon macs, compared to the uname shipped with macos. This causes config.guess to produce incorrect build system triplets for various projects on these systems when in a nix-shell.[23][42] As coreutils only releases every few months/years and no release is planned at the moment, I'm introducing the patch here. We can drop it once the next coreutils version is released. I made a tiny adjustment to the patch from [23]. I removed the usage of MAYBE_UNUSED, which currently only compiles against HEAD. [23] https://debbugs.gnu.org/cgi/bugreport.cgi?bug=52330 [42] #147914
- Loading branch information
1 parent
8cd976f
commit 373d234
Showing
2 changed files
with
127 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,124 @@ | ||
diff --git a/src/uname.c b/src/uname.c | ||
index ae9b8e29d..e84fc477a 100644 | ||
--- a/src/uname.c | ||
+++ b/src/uname.c | ||
@@ -27,7 +27,7 @@ | ||
# include <sys/systeminfo.h> | ||
#endif | ||
|
||
-#if HAVE_SYS_SYSCTL_H && ! defined __GLIBC__ | ||
+#if HAVE_SYS_SYSCTL_H && ! defined __GLIBC__ && ! defined __APPLE__ | ||
# if HAVE_SYS_PARAM_H | ||
# include <sys/param.h> /* needed for OpenBSD 3.0 */ | ||
# endif | ||
@@ -44,11 +44,6 @@ | ||
# endif | ||
#endif | ||
|
||
-#ifdef __APPLE__ | ||
-# include <mach/machine.h> | ||
-# include <mach-o/arch.h> | ||
-#endif | ||
- | ||
#include "system.h" | ||
#include "die.h" | ||
#include "error.h" | ||
@@ -167,6 +162,24 @@ print_element (char const *element) | ||
fputs (element, stdout); | ||
} | ||
|
||
+/* Print ELEMENT, preceded by a space if something has already been | ||
+ printed. But if the environment variable ENVVAR is set, print its | ||
+ value instead of ELEMENT. */ | ||
+ | ||
+static void | ||
+print_element_env (char const *element, char const *envvar) | ||
+{ | ||
+#ifdef __APPLE__ | ||
+ if (envvar) | ||
+ { | ||
+ char const *val = getenv (envvar); | ||
+ if (val) | ||
+ element = val; | ||
+ } | ||
+#endif | ||
+ print_element (element); | ||
+} | ||
+ | ||
|
||
/* Set all the option flags according to the switches specified. | ||
Return the mask indicating which elements to print. */ | ||
@@ -287,26 +300,36 @@ main (int argc, char **argv) | ||
die (EXIT_FAILURE, errno, _("cannot get system name")); | ||
|
||
if (toprint & PRINT_KERNEL_NAME) | ||
- print_element (name.sysname); | ||
+ print_element_env (name.sysname, "UNAME_SYSNAME"); | ||
if (toprint & PRINT_NODENAME) | ||
- print_element (name.nodename); | ||
+ print_element_env (name.nodename, "UNAME_NODENAME"); | ||
if (toprint & PRINT_KERNEL_RELEASE) | ||
- print_element (name.release); | ||
+ print_element_env (name.release, "UNAME_RELEASE"); | ||
if (toprint & PRINT_KERNEL_VERSION) | ||
- print_element (name.version); | ||
+ print_element_env (name.version, "UNAME_VERSION"); | ||
if (toprint & PRINT_MACHINE) | ||
- print_element (name.machine); | ||
+ print_element_env (name.machine, "UNAME_MACHINE"); | ||
} | ||
|
||
if (toprint & PRINT_PROCESSOR) | ||
{ | ||
char const *element = unknown; | ||
+#ifdef __APPLE__ | ||
+# if defined __arm__ || defined __arm64__ | ||
+ element = "arm"; | ||
+# elif defined __i386__ || defined __x86_64__ | ||
+ element = "i386"; | ||
+# elif defined __ppc__ || defined __ppc64__ | ||
+ element = "powerpc"; | ||
+# endif | ||
+#endif | ||
#if HAVE_SYSINFO && defined SI_ARCHITECTURE | ||
- { | ||
- static char processor[257]; | ||
- if (0 <= sysinfo (SI_ARCHITECTURE, processor, sizeof processor)) | ||
- element = processor; | ||
- } | ||
+ if (element == unknown) | ||
+ { | ||
+ static char processor[257]; | ||
+ if (0 <= sysinfo (SI_ARCHITECTURE, processor, sizeof processor)) | ||
+ element = processor; | ||
+ } | ||
#endif | ||
#ifdef UNAME_PROCESSOR | ||
if (element == unknown) | ||
@@ -316,26 +339,6 @@ main (int argc, char **argv) | ||
static int mib[] = { CTL_HW, UNAME_PROCESSOR }; | ||
if (sysctl (mib, 2, processor, &s, 0, 0) >= 0) | ||
element = processor; | ||
- | ||
-# ifdef __APPLE__ | ||
- /* This kludge works around a bug in Mac OS X. */ | ||
- if (element == unknown) | ||
- { | ||
- cpu_type_t cputype; | ||
- size_t cs = sizeof cputype; | ||
- NXArchInfo const *ai; | ||
- if (sysctlbyname ("hw.cputype", &cputype, &cs, NULL, 0) == 0 | ||
- && (ai = NXGetArchInfoFromCpuType (cputype, | ||
- CPU_SUBTYPE_MULTIPLE)) | ||
- != NULL) | ||
- element = ai->name; | ||
- | ||
- /* Hack "safely" around the ppc vs. powerpc return value. */ | ||
- if (cputype == CPU_TYPE_POWERPC | ||
- && STRNCMP_LIT (element, "ppc") == 0) | ||
- element = "powerpc"; | ||
- } | ||
-# endif | ||
} | ||
#endif | ||
if (! (toprint == UINT_MAX && element == unknown)) |