diff --git a/pkgs/development/libraries/gcc/libgcc/default.nix b/pkgs/development/libraries/gcc/libgcc/default.nix new file mode 100644 index 000000000000..835956055448 --- /dev/null +++ b/pkgs/development/libraries/gcc/libgcc/default.nix @@ -0,0 +1,156 @@ +{ lib, stdenvNoLibs, buildPackages +, gcc, glibc +, libiberty +}: + +stdenvNoLibs.mkDerivation rec { + pname = "libgcc"; + inherit (gcc.cc) src version; + + outputs = [ "out" "dev" ]; + + strictDeps = true; + depsBuildBuild = [ buildPackages.stdenv.cc ]; + nativeBuildInputs = [ libiberty ]; + + postUnpack = '' + mkdir -p ./build + buildRoot=$(readlink -e "./build") + ''; + + postPatch = '' + sourceRoot=$(readlink -e "./libgcc") + ''; + + hardeningDisable = [ "pie" ]; + + preConfigure = '' + cd "$buildRoot" + '' + + # Drop in libiberty, as external builds are not expected + + '' + ( + mkdir -p build-${stdenvNoLibs.buildPlatform.config}/libiberty/ + cd build-${stdenvNoLibs.buildPlatform.config}/libiberty/ + ln -s ${buildPackages.libiberty}/lib/libiberty.a ./ + ) + '' + # A few misc bits of gcc need to be built. + # + # - We "shift" the tools over to fake platforms perspective from the previous + # stage. + # + # - We define GENERATOR_FILE so nothing bothers looking for GNU GMP. + # + # - We remove the `libgcc.mvar` deps so that the bootstrap xgcc isn't built. + + '' + mkdir -p "$buildRoot/gcc" + cd "$buildRoot/gcc" + ( + export AS_FOR_BUILD=${buildPackages.stdenv.cc}/bin/$AS_FOR_BUILD + export CC_FOR_BUILD=${buildPackages.stdenv.cc}/bin/$CC_FOR_BUILD + export CPP_FOR_BUILD=${buildPackages.stdenv.cc}/bin/$CPP_FOR_BUILD + export CXX_FOR_BUILD=${buildPackages.stdenv.cc}/bin/$CXX_FOR_BUILD + export LD_FOR_BUILD=${buildPackages.stdenv.cc.bintools}/bin/$LD_FOR_BUILD + + export AS=$AS_FOR_BUILD + export CC=$CC_FOR_BUILD + export CPP=$CPP_FOR_BUILD + export CXX=$CXX_FOR_BUILD + export LD=$LD_FOR_BUILD + + export AS_FOR_TARGET=${stdenvNoLibs.cc}/bin/$AS + export CC_FOR_TARGET=${stdenvNoLibs.cc}/bin/$CC + export CPP_FOR_TARGET=${stdenvNoLibs.cc}/bin/$CPP + export LD_FOR_TARGET=${stdenvNoLibs.cc.bintools}/bin/$LD + + export NIX_CFLAGS_COMPILE_FOR_BUILD+=' -DGENERATOR_FILE=1' + + "$sourceRoot/../gcc/configure" $gccConfigureFlags + + sed -e 's,libgcc.mvars:.*$,libgcc.mvars:,' -i Makefile + + make \ + config.h \ + libgcc.mvars \ + tconfig.h \ + tm.h \ + options.h \ + insn-constants.h \ + insn-modes.h + ) + mkdir -p "$buildRoot/gcc/include" + '' + # Preparing to configure + build libgcc itself + + '' + mkdir -p "$buildRoot/gcc/${stdenvNoLibs.hostPlatform.config}/libgcc" + cd "$buildRoot/gcc/${stdenvNoLibs.hostPlatform.config}/libgcc" + configureScript=$sourceRoot/configure + chmod +x "$configureScript" + + export AS_FOR_BUILD=${buildPackages.stdenv.cc}/bin/$AS_FOR_BUILD + export CC_FOR_BUILD=${buildPackages.stdenv.cc}/bin/$CC_FOR_BUILD + export CPP_FOR_BUILD=${buildPackages.stdenv.cc}/bin/$CPP_FOR_BUILD + export CXX_FOR_BUILD=${buildPackages.stdenv.cc}/bin/$CXX_FOR_BUILD + export LD_FOR_BUILD=${buildPackages.stdenv.cc.bintools}/bin/$LD_FOR_BUILD + + export AS=${stdenvNoLibs.cc}/bin/$AS + export CC=${stdenvNoLibs.cc}/bin/$CC + export CPP=${stdenvNoLibs.cc}/bin/$CPP + export CXX=${stdenvNoLibs.cc}/bin/$CXX + export LD=${stdenvNoLibs.cc.bintools}/bin/$LD + + export AS_FOR_TARGET=${stdenvNoLibs.cc}/bin/$AS_FOR_TARGET + export CC_FOR_TARGET=${stdenvNoLibs.cc}/bin/$CC_FOR_TARGET + export CPP_FOR_TARGET=${stdenvNoLibs.cc}/bin/$CPP_FOR_TARGET + export LD_FOR_TARGET=${stdenvNoLibs.cc.bintools}/bin/$LD_FOR_TARGET + ''; + + gccConfigureFlags = [ + "--build=${stdenvNoLibs.buildPlatform.config}" + "--host=${stdenvNoLibs.buildPlatform.config}" + "--target=${stdenvNoLibs.hostPlatform.config}" + + "--disable-bootstrap" + "--disable-multilib" "--with-multilib-list=" + "--enable-languages=c" + + "--disable-fixincludes" + "--disable-intl" + "--disable-lto" + "--disable-libatomic" + "--disable-libbacktrace" + "--disable-libcpp" + "--disable-libssp" + "--disable-libquadmath" + "--disable-libgomp" + "--disable-libvtv" + "--disable-vtable-verify" + + "--with-system-zlib" + ] ++ lib.optional (stdenvNoLibs.hostPlatform.libc == "glibc") + "--with-glibc-version=${glibc.version}"; + + configurePlatforms = [ "build" "host" ]; + configureFlags = [ + "--disable-dependency-tracking" + # $CC cannot link binaries, let alone run then + "cross_compiling=true" + # Do not have dynamic linker without libc + "--enable-static" + "--disable-shared" + + # Avoid dependency on gcc. + "--disable-gcov" + ]; + + makeFlags = [ "MULTIBUILDTOP:=../" ]; + + postInstall = '' + moveToOutput "lib/gcc/${stdenvNoLibs.hostPlatform.config}/${version}/include" "$dev" + mkdir -p "$out/lib" "$dev/include" + ln -s "$out/lib/gcc/${stdenvNoLibs.hostPlatform.config}/${version}"/* "$out/lib" + ln -s "$dev/lib/gcc/${stdenvNoLibs.hostPlatform.config}/${version}/include"/* "$dev/include/" + ''; +} diff --git a/pkgs/top-level/aliases.nix b/pkgs/top-level/aliases.nix index 04273984e81d..1dc91abc1938 100644 --- a/pkgs/top-level/aliases.nix +++ b/pkgs/top-level/aliases.nix @@ -879,7 +879,6 @@ mapAliases ({ liberation_ttf_v1_from_source = throw "'liberation_ttf_v1_from_source' has been renamed to/replaced by 'liberation_ttf_v1'"; # Converted to throw 2022-02-22 liberation_ttf_v2_from_source = throw "'liberation_ttf_v2_from_source' has been renamed to/replaced by 'liberation_ttf_v2'"; # Converted to throw 2022-02-22 liberationsansnarrow = throw "'liberationsansnarrow' has been renamed to/replaced by 'liberation-sans-narrow'"; # Converted to throw 2022-02-22 - libgcc = throw "libgcc was removed, use gcc.cc.libgcc if needed"; # added 2023-05-13 libgksu = throw "libgksu has been removed"; # Added 2022-01-16 libgme = game-music-emu; # Added 2022-07-20 libgnome_keyring = throw "'libgnome_keyring' has been renamed to/replaced by 'libgnome-keyring'"; # Converted to throw 2022-02-22 diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 1613c7a2f075..1b6f36b8d2af 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -18911,6 +18911,10 @@ with pkgs; librarian-puppet-go = callPackage ../development/tools/librarian-puppet-go { }; + libgcc = callPackage ../development/libraries/gcc/libgcc { + stdenvNoLibs = gccStdenvNoLibs; # cannot be built with clang it seems + }; + # This is for e.g. LLVM libraries on linux. gccForLibs = if stdenv.targetPlatform == stdenv.hostPlatform && targetPackages.stdenv.cc.isGNU