nixpkgs mirror (for testing) github.com/NixOS/nixpkgs
nix
at python-updates 154 lines 4.8 kB view raw
1{ 2 lib, 3 stdenvNoLibs, 4 buildPackages, 5 gcc, 6 glibc, 7 libiberty, 8}: 9 10let 11 stdenv = stdenvNoLibs; 12 gccConfigureFlags = gcc.cc.configureFlags ++ [ 13 "--disable-fixincludes" 14 "--disable-intl" 15 "--enable-threads=posix" 16 "--with-glibc-version=${glibc.version}" 17 "--disable-plugin" 18 19 # these are required in order to prevent inhibit_libc=true, 20 # which will cripple libgcc's unwinder; see: 21 # https://github.com/NixOS/nixpkgs/issues/213453#issuecomment-1616346163 22 "--with-headers=${lib.getDev glibc}/include" 23 "--with-native-system-header-dir=${lib.getDev glibc}${glibc.incdir or "/include"}" 24 "--with-build-sysroot=/" 25 ]; 26 27in 28stdenv.mkDerivation (finalAttrs: { 29 pname = "libgcc"; 30 inherit (gcc.cc) src version; 31 32 outputs = [ 33 "out" 34 "dev" 35 ]; 36 37 strictDeps = true; 38 depsBuildBuild = [ buildPackages.stdenv.cc ]; 39 nativeBuildInputs = [ libiberty ]; 40 buildInputs = [ glibc ]; 41 42 postUnpack = '' 43 mkdir -p ./build 44 buildRoot=$(readlink -e "./build") 45 ''; 46 47 postPatch = gcc.cc.passthru.forceLibgccToBuildCrtStuff + '' 48 sourceRoot=$(readlink -e "./libgcc") 49 ''; 50 51 preConfigure = '' 52 # Drop in libiberty, as external builds are not expected 53 cd "$buildRoot" 54 ( 55 mkdir -p "build-${stdenv.buildPlatform.config}/libiberty/pic" 56 cd "build-${stdenv.buildPlatform.config}/libiberty/" 57 ln -s "${buildPackages.libiberty}/lib/libiberty.a" ./ 58 ln -s "${buildPackages.libiberty}/lib/libiberty_pic.a" pic/libiberty.a 59 ) 60 mkdir -p "$buildRoot/gcc" 61 cd "$buildRoot/gcc" 62 ( 63 # We "shift" the tools over to fake platforms perspective from the previous stage. 64 export AS_FOR_BUILD=${buildPackages.stdenv.cc}/bin/$AS_FOR_BUILD 65 export CC_FOR_BUILD=${buildPackages.stdenv.cc}/bin/$CC_FOR_BUILD 66 export CPP_FOR_BUILD=${buildPackages.stdenv.cc}/bin/$CPP_FOR_BUILD 67 export CXX_FOR_BUILD=${buildPackages.stdenv.cc}/bin/$CXX_FOR_BUILD 68 export LD_FOR_BUILD=${buildPackages.stdenv.cc.bintools}/bin/$LD_FOR_BUILD 69 70 export AS=$AS_FOR_BUILD 71 export CC=$CC_FOR_BUILD 72 export CPP=$CPP_FOR_BUILD 73 export CXX=$CXX_FOR_BUILD 74 export LD=$LD_FOR_BUILD 75 76 export AS_FOR_TARGET=${stdenv.cc}/bin/$AS 77 export CC_FOR_TARGET=${stdenv.cc}/bin/$CC 78 export CPP_FOR_TARGET=${stdenv.cc}/bin/$CPP 79 export LD_FOR_TARGET=${stdenv.cc.bintools}/bin/$LD 80 81 # We define GENERATOR_FILE so nothing bothers looking for GNU GMP. 82 export NIX_CFLAGS_COMPILE_FOR_BUILD+=' -DGENERATOR_FILE=1' 83 84 "$sourceRoot/../gcc/configure" ${lib.concatStringsSep " " gccConfigureFlags} 85 86 # We remove the `libgcc.mvar` deps so that the bootstrap xgcc isn't built. 87 sed -e 's,libgcc.mvars:.*$,libgcc.mvars:,' -i Makefile 88 89 make \ 90 config.h \ 91 libgcc.mvars \ 92 tconfig.h \ 93 tm.h \ 94 options.h \ 95 insn-constants.h \ 96 '' 97 + lib.optionalString stdenv.targetPlatform.isM68k '' 98 sysroot-suffix.h \ 99 '' 100 + lib.optionalString stdenv.targetPlatform.isAarch32 '' 101 arm-isa.h \ 102 arm-cpu.h \ 103 '' 104 + lib.optionalString stdenv.targetPlatform.isLoongArch64 '' 105 loongarch-multilib.h \ 106 '' 107 + '' 108 insn-modes.h 109 ) 110 mkdir -p "$buildRoot/gcc/include" 111 112 # Preparing to configure + build libgcc itself 113 mkdir -p "$buildRoot/gcc/${stdenv.hostPlatform.config}/libgcc" 114 cd "$buildRoot/gcc/${stdenv.hostPlatform.config}/libgcc" 115 configureScript=$sourceRoot/configure 116 chmod +x "$configureScript" 117 118 export AS_FOR_BUILD=${buildPackages.stdenv.cc}/bin/$AS_FOR_BUILD 119 export CC_FOR_BUILD=${buildPackages.stdenv.cc}/bin/$CC_FOR_BUILD 120 export CPP_FOR_BUILD=${buildPackages.stdenv.cc}/bin/$CPP_FOR_BUILD 121 export CXX_FOR_BUILD=${buildPackages.stdenv.cc}/bin/$CXX_FOR_BUILD 122 export LD_FOR_BUILD=${buildPackages.stdenv.cc.bintools}/bin/$LD_FOR_BUILD 123 124 export AS=${stdenv.cc}/bin/$AS 125 export CC=${stdenv.cc}/bin/$CC 126 export CPP=${stdenv.cc}/bin/$CPP 127 export CXX=${stdenv.cc}/bin/$CXX 128 export LD=${stdenv.cc.bintools}/bin/$LD 129 130 export AS_FOR_TARGET=${stdenv.cc}/bin/$AS_FOR_TARGET 131 export CC_FOR_TARGET=${stdenv.cc}/bin/$CC_FOR_TARGET 132 export CPP_FOR_TARGET=${stdenv.cc}/bin/$CPP_FOR_TARGET 133 export LD_FOR_TARGET=${stdenv.cc.bintools}/bin/$LD_FOR_TARGET 134 ''; 135 136 configurePlatforms = [ 137 "build" 138 "host" 139 ]; 140 configureFlags = [ 141 "cross_compiling=true" 142 "--disable-gcov" 143 "--with-glibc-version=${glibc.version}" 144 ]; 145 146 makeFlags = [ "MULTIBUILDTOP:=../" ]; 147 148 postInstall = '' 149 moveToOutput "lib/gcc/${stdenv.hostPlatform.config}/${finalAttrs.version}/include" "$dev" 150 mkdir -p "$out/lib" "$dev/include" 151 ln -s "$out/lib/gcc/${stdenv.hostPlatform.config}/${finalAttrs.version}"/* "$out/lib" 152 ln -s "$dev/lib/gcc/${stdenv.hostPlatform.config}/${finalAttrs.version}/include"/* "$dev/include/" 153 ''; 154})