From 4aa95e33121c316c5b34031bb08106d2dc113e38 Mon Sep 17 00:00:00 2001 From: Ivan Babrou Date: Fri, 5 Mar 2021 23:23:35 -0800 Subject: gcc: native aarch64-darwin support --- pkgs/build-support/cc-wrapper/default.nix | 6 ++++-- pkgs/development/compilers/gcc/11/default.nix | 23 +++++++++++++--------- .../compilers/gcc/common/configure-flags.nix | 3 ++- pkgs/top-level/all-packages.nix | 10 +++++++--- 4 files changed, 27 insertions(+), 15 deletions(-) diff --git a/pkgs/build-support/cc-wrapper/default.nix b/pkgs/build-support/cc-wrapper/default.nix index 14317cbe4cc..12c4a3ee0d4 100644 --- a/pkgs/build-support/cc-wrapper/default.nix +++ b/pkgs/build-support/cc-wrapper/default.nix @@ -432,14 +432,16 @@ stdenv.mkDerivation { # Always add -march based on cpu in triple. Sometimes there is a # discrepency (x86_64 vs. x86-64), so we provide an "arch" arg in # that case. - + optionalString ((targetPlatform ? gcc.arch) && + # TODO: aarch64-darwin has mcpu incompatible with gcc + + optionalString ((targetPlatform ? gcc.arch) && (isClang || !(stdenv.isDarwin && stdenv.isAarch64)) && isGccArchSupported targetPlatform.gcc.arch) '' echo "-march=${targetPlatform.gcc.arch}" >> $out/nix-support/cc-cflags-before '' # -mcpu is not very useful. You should use mtune and march # instead. It’s provided here for backwards compatibility. - + optionalString (targetPlatform ? gcc.cpu) '' + # TODO: aarch64-darwin has mcpu incompatible with gcc + + optionalString ((targetPlatform ? gcc.cpu) && (isClang || !(stdenv.isDarwin && stdenv.isAarch64))) '' echo "-mcpu=${targetPlatform.gcc.cpu}" >> $out/nix-support/cc-cflags-before '' diff --git a/pkgs/development/compilers/gcc/11/default.nix b/pkgs/development/compilers/gcc/11/default.nix index 73f3d7b2a97..8dcebfec8ae 100644 --- a/pkgs/development/compilers/gcc/11/default.nix +++ b/pkgs/development/compilers/gcc/11/default.nix @@ -72,6 +72,11 @@ let majorVersion = "11"; ++ optional langFortran ../gfortran-driving.patch ++ optional (targetPlatform.libc == "musl" && targetPlatform.isPower) ../ppc-musl.patch + ++ optional (stdenv.isDarwin && stdenv.isAarch64) (fetchpatch { + url = "https://github.com/fxcoudert/gcc/compare/releases/gcc-11.1.0...gcc-11.1.0-arm-20210504.diff"; + sha256 = "sha256-JqCGJAfbOxSmkNyq49aFHteK/RFsCSLQrL9mzUCnaD0="; + }) + # Obtain latest patch with ../update-mcfgthread-patches.sh ++ optional (!crossStageStatic && targetPlatform.isMinGW) ./Added-mcf-thread-model-support-from-mcfgthread.patch; @@ -103,9 +108,15 @@ stdenv.mkDerivation ({ hardeningDisable = [ "format" "pie" ]; + postPatch = '' + configureScripts=$(find . -name configure) + for configureScript in $configureScripts; do + patchShebangs $configureScript + done + '' # This should kill all the stdinc frameworks that gcc and friends like to # insert into default search paths. - prePatch = lib.optionalString hostPlatform.isDarwin '' + + lib.optionalString hostPlatform.isDarwin '' substituteInPlace gcc/config/darwin-c.c \ --replace 'if (stdinc)' 'if (0)' @@ -114,14 +125,8 @@ stdenv.mkDerivation ({ substituteInPlace libgfortran/configure \ --replace "-install_name \\\$rpath/\\\$soname" "-install_name ''${!outputLib}/lib/\\\$soname" - ''; - - postPatch = '' - configureScripts=$(find . -name configure) - for configureScript in $configureScripts; do - patchShebangs $configureScript - done - '' + ( + '' + + ( if targetPlatform != hostPlatform || stdenv.cc.libc != null then # On NixOS, use the right path to the dynamic linker instead of # `/lib/ld*.so'. diff --git a/pkgs/development/compilers/gcc/common/configure-flags.nix b/pkgs/development/compilers/gcc/common/configure-flags.nix index 7f7a40f3368..ec3488f61d9 100644 --- a/pkgs/development/compilers/gcc/common/configure-flags.nix +++ b/pkgs/development/compilers/gcc/common/configure-flags.nix @@ -170,7 +170,8 @@ let ++ lib.optional javaAwtGtk "--enable-java-awt=gtk" ++ lib.optional (langJava && javaAntlr != null) "--with-antlr-jar=${javaAntlr}" - ++ (import ../common/platform-flags.nix { inherit (stdenv) targetPlatform; inherit lib; }) + # TODO: aarch64-darwin has clang stdenv and its arch and cpu flag values are incompatible with gcc + ++ lib.optional (!(stdenv.isDarwin && stdenv.isAarch64)) (import ../common/platform-flags.nix { inherit (stdenv) targetPlatform; inherit lib; }) ++ lib.optionals (targetPlatform != hostPlatform) crossConfigureFlags ++ lib.optional (targetPlatform != hostPlatform) "--disable-bootstrap" diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index e7cfe7eaf95..7f7835ce96a 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -10350,7 +10350,9 @@ in else ../development/compilers/gcc/10); gcc = if (with stdenv.targetPlatform; isVc4 || libc == "relibc") then gcc6 else - if stdenv.targetPlatform.isAarch64 then gcc9 else gcc10; + # aarch64-darwin doesn't support earlier gcc + if (stdenv.targetPlatform.isAarch64 && stdenv.isDarwin) then gcc11 + else if stdenv.targetPlatform.isAarch64 then gcc9 else gcc10; gcc-unwrapped = gcc.cc; gccStdenv = if stdenv.cc.isGNU then stdenv else stdenv.override { @@ -10562,7 +10564,8 @@ in gcc_latest = gcc11; - gfortran = gfortran9; + # aarch64-darwin doesn't support earlier gcc + gfortran = if (stdenv.isDarwin && stdenv.isAarch64) then gfortran11 else gfortran9; gfortran48 = wrapCC (gcc48.cc.override { name = "gfortran"; @@ -10650,7 +10653,8 @@ in inherit (gnome2) libart_lgpl; }); - gnat = gnat9; + # aarch64-darwin doesn't support earlier gcc + gnat = if (stdenv.isDarwin && stdenv.isAarch64) then gnat11 else gnat9; gnat6 = wrapCC (gcc6.cc.override { name = "gnat"; -- cgit 1.4.1