summary refs log tree commit diff
path: root/pkgs/tools/misc/coreutils/fix-arm64-macos.patch
diff options
context:
space:
mode:
authorPatrick Meyer <git@the-space.agency>2021-12-20 23:37:26 +0100
committerRaphael Megzari <raphael@megzari.com>2021-12-22 04:36:40 -0500
commit373d2348bedd941512f25d145c22a53be64c9b43 (patch)
treeca8331de01ad5f92dcf144692eb5f6fa38aa836b /pkgs/tools/misc/coreutils/fix-arm64-macos.patch
parent8cd976ffdbe0ad1b77334d1756c06e1c2918bd21 (diff)
downloadnixpkgs-373d2348bedd941512f25d145c22a53be64c9b43.tar
nixpkgs-373d2348bedd941512f25d145c22a53be64c9b43.tar.gz
nixpkgs-373d2348bedd941512f25d145c22a53be64c9b43.tar.bz2
nixpkgs-373d2348bedd941512f25d145c22a53be64c9b43.tar.lz
nixpkgs-373d2348bedd941512f25d145c22a53be64c9b43.tar.xz
nixpkgs-373d2348bedd941512f25d145c22a53be64c9b43.tar.zst
nixpkgs-373d2348bedd941512f25d145c22a53be64c9b43.zip
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
Diffstat (limited to 'pkgs/tools/misc/coreutils/fix-arm64-macos.patch')
-rw-r--r--pkgs/tools/misc/coreutils/fix-arm64-macos.patch124
1 files changed, 124 insertions, 0 deletions
diff --git a/pkgs/tools/misc/coreutils/fix-arm64-macos.patch b/pkgs/tools/misc/coreutils/fix-arm64-macos.patch
new file mode 100644
index 00000000000..d8880b23dcb
--- /dev/null
+++ b/pkgs/tools/misc/coreutils/fix-arm64-macos.patch
@@ -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))