about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/compilers/gcc/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/development/compilers/gcc/default.nix')
-rw-r--r--nixpkgs/pkgs/development/compilers/gcc/default.nix457
1 files changed, 457 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/compilers/gcc/default.nix b/nixpkgs/pkgs/development/compilers/gcc/default.nix
new file mode 100644
index 000000000000..f467aa32f7d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/compilers/gcc/default.nix
@@ -0,0 +1,457 @@
+{ lib, stdenv, targetPackages, fetchurl, fetchpatch, noSysDirs
+, langC ? true, langCC ? true, langFortran ? false
+, langAda ? false
+, langObjC ? stdenv.targetPlatform.isDarwin
+, langObjCpp ? stdenv.targetPlatform.isDarwin
+, langD ? false
+, langGo ? false
+, reproducibleBuild ? true
+, profiledCompiler ? false
+, langJit ? false
+, staticCompiler ? false
+, enableShared ? stdenv.targetPlatform.hasSharedLibraries
+, enableLTO ? stdenv.hostPlatform.hasSharedLibraries
+, texinfo ? null
+, perl ? null # optional, for texi2pod (then pod2man)
+, gmp, mpfr, libmpc, gettext, which, patchelf, binutils
+, isl ? null # optional, for the Graphite optimization framework.
+, zlib ? null
+, libucontext ? null
+, gnat-bootstrap ? null
+, enableMultilib ? false
+, enablePlugin ? stdenv.hostPlatform == stdenv.buildPlatform # Whether to support user-supplied plug-ins
+, name ? "gcc"
+, libcCross ? null
+, threadsCross ? null # for MinGW
+, withoutTargetLibc ? false
+, gnused ? null
+, cloog # unused; just for compat with gcc4, as we override the parameter on some places
+, buildPackages
+, libxcrypt
+, disableGdbPlugin ? !enablePlugin
+, nukeReferences
+, callPackage
+, majorMinorVersion
+
+# only for gcc<=6.x
+, langJava ? false
+, flex
+, boehmgc ? null
+, zip ? null, unzip ? null, pkg-config ? null
+, gtk2 ? null, libart_lgpl ? null
+, libX11 ? null, libXt ? null, libSM ? null, libICE ? null, libXtst ? null
+, libXrender ? null, xorgproto ? null
+, libXrandr ? null, libXi ? null
+, x11Support ? langJava
+}:
+
+let
+  version = {
+    "13" = "13.2.0";
+    "12" = "12.3.0";
+    "11" = "11.4.0";
+    "10" = "10.5.0";
+    "9"  =  "9.5.0";
+    "8"  =  "8.5.0";
+    "7"  =  "7.5.0";
+    "6"  =  "6.5.0";
+    "4.9"=  "4.9.4";
+    "4.8"=  "4.8.5";
+  }."${majorMinorVersion}";
+
+  majorVersion = lib.versions.major version;
+  atLeast13 = lib.versionAtLeast version "13";
+  atLeast12 = lib.versionAtLeast version "12";
+  atLeast11 = lib.versionAtLeast version "11";
+  atLeast10 = lib.versionAtLeast version "10";
+  atLeast9  = lib.versionAtLeast version  "9";
+  atLeast8  = lib.versionAtLeast version  "8";
+  atLeast7  = lib.versionAtLeast version  "7";
+  atLeast6  = lib.versionAtLeast version  "6";
+  atLeast49 = lib.versionAtLeast version  "4.9";
+  is13 = majorVersion == "13";
+  is12 = majorVersion == "12";
+  is11 = majorVersion == "11";
+  is10 = majorVersion == "10";
+  is9  = majorVersion == "9";
+  is8  = majorVersion == "8";
+  is7  = majorVersion == "7";
+  is6  = majorVersion == "6";
+  is49 = majorVersion == "4" && lib.versions.minor version == "9";
+  is48 = majorVersion == "4" && lib.versions.minor version == "8";
+in
+
+# We enable the isl cloog backend.
+assert !atLeast6 -> (cloog != null -> isl != null);
+
+assert langJava -> !atLeast7 && zip != null && unzip != null && zlib != null && boehmgc != null && perl != null;  # for `--enable-java-home'
+
+# Make sure we get GNU sed.
+assert stdenv.buildPlatform.isDarwin -> gnused != null;
+
+# The go frontend is written in c++
+assert langGo -> langCC;
+assert (atLeast6 && !is7 && !is8) -> (langAda -> gnat-bootstrap != null);
+
+# TODO: fixup D bootstapping, probably by using gdc11 (and maybe other changes).
+#   error: GDC is required to build d
+assert atLeast12 -> !langD;
+
+# threadsCross is just for MinGW
+assert threadsCross != {} -> stdenv.targetPlatform.isWindows;
+
+# profiledCompiler builds inject non-determinism in one of the compilation stages.
+# If turned on, we can't provide reproducible builds anymore
+assert reproducibleBuild -> profiledCompiler == false;
+
+with lib;
+with builtins;
+
+let inherit version;
+    disableBootstrap = atLeast11 && !stdenv.hostPlatform.isDarwin && (atLeast12 -> !profiledCompiler);
+
+    inherit (stdenv) buildPlatform hostPlatform targetPlatform;
+
+    patches = callFile ./patches {};
+
+    /* Cross-gcc settings (build == host != target) */
+    crossMingw = targetPlatform != hostPlatform && targetPlatform.libc == "msvcrt";
+    stageNameAddon = if withoutTargetLibc then "stage-static" else "stage-final";
+    crossNameAddon = optionalString (targetPlatform != hostPlatform) "${targetPlatform.config}-${stageNameAddon}-";
+
+    javaAwtGtk = langJava && x11Support;
+    xlibs = [
+      libX11 libXt libSM libICE libXtst libXrender libXrandr libXi
+      xorgproto
+    ];
+    callFile = lib.callPackageWith ({
+      # lets
+      inherit
+        majorVersion
+        version
+        buildPlatform
+        hostPlatform
+        targetPlatform
+        patches
+        crossMingw
+        stageNameAddon
+        crossNameAddon
+      ;
+      # inherit generated with 'nix eval --json --impure --expr "with import ./. {}; lib.attrNames (lib.functionArgs gcc${majorVersion}.cc.override)" | jq '.[]' --raw-output'
+      inherit
+        binutils
+        buildPackages
+        cloog
+        withoutTargetLibc
+        disableBootstrap
+        disableGdbPlugin
+        enableLTO
+        enableMultilib
+        enablePlugin
+        enableShared
+        fetchpatch
+        fetchurl
+        gettext
+        gmp
+        gnat-bootstrap
+        gnused
+        isl
+        langAda
+        langC
+        langCC
+        langD
+        langFortran
+        langGo
+        langJit
+        langObjC
+        langObjCpp
+        lib
+        libcCross
+        libmpc
+        libucontext
+        libxcrypt
+        mpfr
+        name
+        noSysDirs
+        nukeReferences
+        patchelf
+        perl
+        profiledCompiler
+        reproducibleBuild
+        staticCompiler
+        stdenv
+        targetPackages
+        texinfo
+        threadsCross
+        which
+        zip
+        zlib
+      ;
+    } // lib.optionalAttrs (!atLeast7) {
+      inherit
+        boehmgc
+        flex
+        gnat-bootstrap
+        gtk2
+        langAda
+        langJava
+        libICE
+        libSM
+        libX11
+        libXi
+        libXrandr
+        libXrender
+        libXt
+        libXtst
+        libart_lgpl
+        pkg-config
+        unzip
+        x11Support
+        xorgproto
+        javaAwtGtk
+        xlibs
+      ;
+      javaEcj = fetchurl {
+        # The `$(top_srcdir)/ecj.jar' file is automatically picked up at
+        # `configure' time.
+
+        # XXX: Eventually we might want to take it from upstream.
+        url = "ftp://sourceware.org/pub/java/ecj-4.3.jar";
+        sha256 = "0jz7hvc0s6iydmhgh5h2m15yza7p2rlss2vkif30vm9y77m97qcx";
+      };
+
+      # Antlr (optional) allows the Java `gjdoc' tool to be built.  We want a
+      # binary distribution here to allow the whole chain to be bootstrapped.
+      javaAntlr = fetchurl {
+        url = "https://www.antlr.org/download/antlr-4.4-complete.jar";
+        sha256 = "02lda2imivsvsis8rnzmbrbp8rh1kb8vmq4i67pqhkwz7lf8y6dz";
+      };
+    });
+
+in
+
+# We need all these X libraries when building AWT with GTK.
+assert !atLeast7 -> (x11Support -> (filter (x: x == null) ([ gtk2 libart_lgpl ] ++ xlibs)) == []);
+
+lib.pipe ((callFile ./common/builder.nix {}) ({
+  pname = "${crossNameAddon}${name}";
+  inherit version;
+
+  src = if is6 && stdenv.targetPlatform.isVc4 then fetchFromGitHub {
+    owner = "itszor";
+    repo = "gcc-vc4";
+    rev = "e90ff43f9671c760cf0d1dd62f569a0fb9bf8918";
+    sha256 = "0gxf66hwqk26h8f853sybphqa5ca0cva2kmrw5jsiv6139g0qnp8";
+  } else if is6 && stdenv.targetPlatform.isRedox then fetchFromGitHub {
+    owner = "redox-os";
+    repo = "gcc";
+    rev = "f360ac095028d286fc6dde4d02daed48f59813fa"; # `redox` branch
+    sha256 = "1an96h8l58pppyh3qqv90g8hgcfd9hj7igvh2gigmkxbrx94khfl";
+  } else fetchurl {
+    url = if atLeast7
+          then "mirror://gcc/releases/gcc-${version}/gcc-${version}.tar.xz"
+          else if atLeast6
+          then "mirror://gnu/gcc/gcc-${version}/gcc-${version}.tar.xz"
+          else "mirror://gnu/gcc/gcc-${version}/gcc-${version}.tar.bz2";
+    ${if is10 || is11 || is13 then "hash" else "sha256"} = {
+      "13.2.0" = "sha256-4nXnZEKmBnNBon8Exca4PYYTFEAEwEE1KIY9xrXHQ9o=";
+      "12.3.0" = "sha256-lJpdT5nnhkIak7Uysi/6tVeN5zITaZdbka7Jet/ajDs=";
+      "11.4.0" = "sha256-Py2yIrAH6KSiPNW6VnJu8I6LHx6yBV7nLBQCzqc6jdk=";
+      "10.5.0" = "sha256-JRCVQ/30bzl8NHtdi3osflaUpaUczkucbh6opxyjB8E=";
+      "9.5.0"  = "13ygjmd938m0wmy946pxdhz9i1wq7z4w10l6pvidak0xxxj9yxi7";
+      "8.5.0"  = "0l7d4m9jx124xsk6xardchgy2k5j5l2b15q322k31f0va4d8826k";
+      "7.5.0"  = "0qg6kqc5l72hpnj4vr6l0p69qav0rh4anlkk3y55540zy3klc6dq";
+      "6.5.0"  = "0i89fksfp6wr1xg9l8296aslcymv2idn60ip31wr9s4pwin7kwby";
+      "4.9.4"  = "14l06m7nvcvb0igkbip58x59w3nq6315k6jcz3wr9ch1rn9d44bc";
+      "4.8.5"  = "08yggr18v373a1ihj0rg2vd6psnic42b518xcgp3r9k81xz1xyr2";
+    }."${version}";
+  };
+
+  inherit patches;
+
+  outputs =
+    if atLeast7
+    then [ "out" "man" "info" ] ++ lib.optional (!langJit) "lib"
+    else if atLeast49 && (langJava || langGo || (if atLeast6 then langJit else targetPlatform.isDarwin)) then ["out" "man" "info"]
+    else [ "out" "lib" "man" "info" ];
+
+  setOutputFlags = false;
+  NIX_NO_SELF_RPATH = true;
+
+  libc_dev = stdenv.cc.libc_dev;
+
+  hardeningDisable = [ "format" "pie" ]
+  ++ lib.optionals (is11 && langAda) [ "fortify3" ];
+
+  postPatch = lib.optionalString atLeast7 ''
+    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.
+  + lib.optionalString (atLeast6 && hostPlatform.isDarwin) ''
+    substituteInPlace gcc/config/darwin-c.c${lib.optionalString atLeast12 "c"} \
+      --replace 'if (stdinc)' 'if (0)'
+
+    substituteInPlace libgcc/config/t-slibgcc-darwin \
+      --replace "-install_name @shlib_slibdir@/\$(SHLIB_INSTALL_NAME)" "-install_name ''${!outputLib}/lib/\$(SHLIB_INSTALL_NAME)"
+
+    substituteInPlace libgfortran/configure \
+      --replace "-install_name \\\$rpath/\\\$soname" "-install_name ''${!outputLib}/lib/\\\$soname"
+  ''
+  + (
+    lib.optionalString (targetPlatform != hostPlatform || stdenv.cc.libc != null)
+      # On NixOS, use the right path to the dynamic linker instead of
+      # `/lib/ld*.so'.
+      (let
+        libc = if libcCross != null then libcCross else stdenv.cc.libc;
+      in
+        (
+        '' echo "fixing the \`GLIBC_DYNAMIC_LINKER'${lib.optionalString atLeast6 ", \\`UCLIBC_DYNAMIC_LINKER',"} and \`${if atLeast6 then "MUSL" else "UCLIBC"}_DYNAMIC_LINKER' macros..."
+           for header in "gcc/config/"*-gnu.h "gcc/config/"*"/"*.h
+           do
+             grep -q ${lib.optionalString (!atLeast6) "LIBC"}_DYNAMIC_LINKER "$header" || continue
+             echo "  fixing \`$header'..."
+             sed -i "$header" \
+                 -e 's|define[[:blank:]]*\([UCG]\+\)LIBC_DYNAMIC_LINKER\([0-9]*\)[[:blank:]]"\([^\"]\+\)"$|define \1LIBC_DYNAMIC_LINKER\2 "${libc.out}\3"|g'${lib.optionalString atLeast6 " \\"}
+        '' + lib.optionalString atLeast6 ''
+${""}                -e 's|define[[:blank:]]*MUSL_DYNAMIC_LINKER\([0-9]*\)[[:blank:]]"\([^\"]\+\)"$|define MUSL_DYNAMIC_LINKER\1 "${libc.out}\2"|g'
+        '' + ''
+${""}          done
+        '' + lib.optionalString (atLeast6 && targetPlatform.libc == "musl") ''
+           sed -i gcc/config/linux.h -e '1i#undef LOCAL_INCLUDE_DIR'
+        ''
+        )
+    ))
+      + lib.optionalString (atLeast7 && targetPlatform.isAvr) (''
+            makeFlagsArray+=(
+          '' + (lib.optionalString atLeast10 ''
+               '-s' # workaround for hitting hydra log limit
+          '') + ''
+               'LIMITS_H_TEST=false'
+            )
+          '');
+
+  inherit noSysDirs staticCompiler withoutTargetLibc
+    libcCross crossMingw;
+
+  inherit (callFile ./common/dependencies.nix { }) depsBuildBuild nativeBuildInputs depsBuildTarget buildInputs depsTargetTarget;
+
+  preConfigure = (callFile ./common/pre-configure.nix { }) + lib.optionalString atLeast10 ''
+    ln -sf ${libxcrypt}/include/crypt.h libsanitizer/sanitizer_common/crypt.h
+  '';
+
+  dontDisableStatic = true;
+
+  configurePlatforms = [ "build" "host" "target" ];
+
+  configureFlags = (callFile ./common/configure-flags.nix { })
+    ++ optional (is7 && targetPlatform.isAarch64) "--enable-fix-cortex-a53-843419"
+    ++ optional (is7 && targetPlatform.isNetBSD) "--disable-libcilkrts";
+
+  targetConfig = if targetPlatform != hostPlatform then targetPlatform.config else null;
+
+  buildFlags =
+    # we do not yet have Nix-driven profiling
+    assert atLeast12 -> (profiledCompiler -> !disableBootstrap);
+    if atLeast11
+    then let target =
+               lib.optionalString (profiledCompiler) "profiled" +
+               lib.optionalString (targetPlatform == hostPlatform && hostPlatform == buildPlatform && !disableBootstrap) "bootstrap";
+         in lib.optional (target != "") target
+    else
+      optional
+        (targetPlatform == hostPlatform && hostPlatform == buildPlatform)
+        (if profiledCompiler then "profiledbootstrap" else "bootstrap");
+
+  inherit (callFile ./common/strip-attributes.nix { })
+    stripDebugList
+    stripDebugListTarget
+    preFixup;
+
+  # https://gcc.gnu.org/PR109898
+  enableParallelInstalling = false;
+
+  # https://gcc.gnu.org/install/specific.html#x86-64-x-solaris210
+  ${if hostPlatform.system == "x86_64-solaris" then "CC" else null} = "gcc -m64";
+
+  # Setting $CPATH and $LIBRARY_PATH to make sure both `gcc' and `xgcc' find the
+  # library headers and binaries, regarless of the language being compiled.
+  #
+  # Note: When building the Java AWT GTK peer, the build system doesn't honor
+  # `--with-gmp' et al., e.g., when building
+  # `libjava/classpath/native/jni/java-math/gnu_java_math_GMP.c', so we just add
+  # them to $CPATH and $LIBRARY_PATH in this case.
+  #
+  # Likewise, the LTO code doesn't find zlib.
+  #
+  # Cross-compiling, we need gcc not to read ./specs in order to build the g++
+  # compiler (after the specs for the cross-gcc are created). Having
+  # LIBRARY_PATH= makes gcc read the specs from ., and the build breaks.
+
+  CPATH = optionals (targetPlatform == hostPlatform) (makeSearchPathOutput "dev" "include" ([]
+    ++ optional (zlib != null) zlib
+    ++ optional langJava boehmgc
+    ++ optionals javaAwtGtk xlibs
+    ++ optionals javaAwtGtk [ gmp mpfr ]
+  ));
+
+  LIBRARY_PATH = optionals (targetPlatform == hostPlatform) (makeLibraryPath (
+    optional (zlib != null) zlib
+    ++ optional langJava boehmgc
+    ++ optionals javaAwtGtk xlibs
+    ++ optionals javaAwtGtk [ gmp mpfr ]
+  ));
+
+  inherit (callFile ./common/extra-target-flags.nix { })
+    EXTRA_FLAGS_FOR_TARGET
+    EXTRA_LDFLAGS_FOR_TARGET
+    ;
+
+  passthru = {
+    inherit langC langCC langObjC langObjCpp langAda langFortran langGo langD version;
+    isGNU = true;
+  } // lib.optionalAttrs (!atLeast12) {
+    hardeningUnsupportedFlags = lib.optionals is48 [ "stackprotector" ] ++ [ "fortify3" ];
+  };
+
+  enableParallelBuilding = true;
+  inherit enableShared enableMultilib;
+
+  meta = {
+    inherit (callFile ./common/meta.nix { })
+      homepage
+      license
+      description
+      longDescription
+      platforms
+      maintainers
+    ;
+  } // lib.optionalAttrs (!atLeast11) {
+    badPlatforms = if !is49 then [ "aarch64-darwin" ] else lib.platforms.darwin;
+  };
+} // optionalAttrs is7 {
+  env.NIX_CFLAGS_COMPILE = lib.optionalString (stdenv.cc.isClang && langFortran) "-Wno-unused-command-line-argument";
+} // optionalAttrs (!atLeast7) {
+  env.langJava = langJava;
+} // optionalAttrs atLeast6 {
+  NIX_LDFLAGS = lib.optionalString  hostPlatform.isSunOS "-lm";
+} // optionalAttrs (!atLeast8) {
+  doCheck = false; # requires a lot of tools, causes a dependency cycle for stdenv
+} // optionalAttrs enableMultilib {
+  dontMoveLib64 = true;
+} // optionalAttrs (((is49 && !stdenv.hostPlatform.isDarwin) || is6) && langJava) {
+  postFixup = ''
+    target="$(echo "$out/libexec/gcc"/*/*/ecj*)"
+    patchelf --set-rpath "$(patchelf --print-rpath "$target"):$out/lib" "$target"
+  '';
+}
+))
+([
+  (callPackage ./common/libgcc.nix   { inherit version langC langCC langJit targetPlatform hostPlatform withoutTargetLibc enableShared; })
+] ++ optionals atLeast11 [
+  (callPackage ./common/checksum.nix { inherit langC langCC; })
+])
+