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] https://github.com/NixOS/nixpkgs/issues/147914
This commit is contained in:
Patrick Meyer 2021-12-20 23:37:26 +01:00 committed by Raphael Megzari
parent 8cd976ffdb
commit 373d2348be
2 changed files with 127 additions and 0 deletions

View file

@ -33,6 +33,9 @@ stdenv.mkDerivation (rec {
./fix-chmod-exit-code.patch
# Workaround for https://debbugs.gnu.org/cgi/bugreport.cgi?bug=51433
./disable-seek-hole.patch
# Workaround for https://debbugs.gnu.org/cgi/bugreport.cgi?bug=52330
# This patch can be dropped, once we upgrade to the next coreutils version after 9.0
./fix-arm64-macos.patch
];
postPatch = ''

View file

@ -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))