at master 6.9 kB view raw
1{ 2 lib, 3 stdenv, 4 gcc_meta, 5 release_version, 6 version, 7 getVersionFile, 8 monorepoSrc ? null, 9 fetchpatch, 10 autoreconfHook269, 11 buildGccPackages, 12 buildPackages, 13 which, 14 python3, 15}: 16stdenv.mkDerivation (finalAttrs: { 17 pname = "libgcc"; 18 inherit version; 19 20 src = monorepoSrc; 21 22 outputs = [ 23 "out" 24 "dev" 25 ]; 26 27 strictDeps = true; 28 29 depsBuildBuild = [ 30 buildPackages.stdenv.cc 31 buildGccPackages.libiberty 32 ]; 33 34 nativeBuildInputs = [ 35 autoreconfHook269 36 which 37 python3 38 ]; 39 40 patches = [ 41 (fetchpatch { 42 name = "delete-MACHMODE_H.patch"; 43 url = "https://github.com/gcc-mirror/gcc/commit/493aae4b034d62054d5e7e54dc06cd9a8be54e29.diff"; 44 hash = "sha256-oEk0lnI96RlpALWpb7J+GnrtgQsFVqDO57I/zjiqqTk="; 45 }) 46 (fetchpatch { 47 name = "custom-threading-model.patch"; 48 url = "https://inbox.sourceware.org/gcc-patches/20250716204545.1063669-1-git@JohnEricson.me/raw"; 49 hash = "sha256-NgiC4cFeFInXXg27me1XpSeImPaL0WHs50Tf1YHz4ps="; 50 }) 51 (fetchpatch { 52 name = "libgcc.mvars-less-0.patch"; 53 url = "https://inbox.sourceware.org/gcc-patches/20250716234028.1153560-1-John.Ericson@Obsidian.Systems/raw"; 54 hash = "sha256-NEcieDCsy+7IRU3qQKVD3i57OuwGZKB/rmNF8X2I1n0="; 55 }) 56 (fetchpatch { 57 name = "libgcc.mvars-less-1.patch"; 58 url = "https://inbox.sourceware.org/gcc-patches/20250716234028.1153560-2-John.Ericson@Obsidian.Systems/raw"; 59 hash = "sha256-nfRC4f6m3kHDro4+6E4y1ZPs+prxBQmn0H2rzIjaMWM="; 60 }) 61 (fetchpatch { 62 name = "regular-libdir-includedir.patch"; 63 url = "https://inbox.sourceware.org/gcc-patches/20250717174911.1536129-1-git@JohnEricson.me/raw"; 64 hash = "sha256-Cn7rvg1FI7H/26GzSe4pv5VW/gvwbwGqivAqEeawkwk="; 65 }) 66 (getVersionFile "libgcc/force-regular-dirs.patch") 67 ]; 68 69 autoreconfFlags = "--install --force --verbose . libgcc"; 70 71 postUnpack = '' 72 mkdir -p ./build 73 buildRoot=$(readlink -e "./build") 74 ''; 75 76 postPatch = '' 77 sourceRoot=$(readlink -e "./libgcc") 78 ''; 79 80 enableParallelBuilding = true; 81 82 preConfigure = '' 83 cd "$buildRoot" 84 85 mkdir -p build-${stdenv.buildPlatform.config}/libiberty/ 86 cd build-${stdenv.buildPlatform.config}/libiberty/ 87 ln -s ${buildGccPackages.libiberty}/lib/libiberty.a ./ 88 89 mkdir -p "$buildRoot/gcc" 90 cd "$buildRoot/gcc" 91 92 ( 93 export AS_FOR_BUILD=${lib.getExe' buildPackages.stdenv.cc "$(basename $AS_FOR_BUILD)"} 94 export CC_FOR_BUILD=${lib.getExe' buildPackages.stdenv.cc "$(basename $CC_FOR_BUILD)"} 95 export CPP_FOR_BUILD=${lib.getExe' buildPackages.stdenv.cc "$(basename $CPP_FOR_BUILD)"} 96 export CXX_FOR_BUILD=${lib.getExe' buildPackages.stdenv.cc "$(basename $CXX_FOR_BUILD)"} 97 export LD_FOR_BUILD=${lib.getExe' buildPackages.stdenv.cc.bintools "$(basename $LD_FOR_BUILD)"} 98 99 export AS=$AS_FOR_BUILD 100 export CC=$CC_FOR_BUILD 101 export CPP=$CPP_FOR_BUILD 102 export CXX=$CXX_FOR_BUILD 103 export LD=$LD_FOR_BUILD 104 105 export AS_FOR_TARGET=${lib.getExe' stdenv.cc "$(basename $AS)"} 106 export CC_FOR_TARGET=${lib.getExe' stdenv.cc "$(basename $CC)"} 107 export CPP_FOR_TARGET=${lib.getExe' stdenv.cc "$(basename $CPP)"} 108 export LD_FOR_TARGET=${lib.getExe' stdenv.cc.bintools "$(basename $LD)"} 109 110 export NIX_CFLAGS_COMPILE_FOR_BUILD+=' -DGENERATOR_FILE=1' 111 112 "$sourceRoot/../gcc/configure" $topLevelConfigureFlags 113 114 sed -e 's,libgcc.mvars:.*$,libgcc.mvars:,' -i Makefile 115 116 make \ 117 config.h \ 118 libgcc.mvars \ 119 tconfig.h \ 120 tm.h \ 121 options.h \ 122 insn-constants.h \ 123 version.h 124 ) 125 mkdir -p "$buildRoot/gcc/include" 126 127 mkdir -p "$buildRoot/gcc/${stdenv.hostPlatform.config}/libgcc" 128 cd "$buildRoot/gcc/${stdenv.hostPlatform.config}/libgcc" 129 configureScript=$sourceRoot/configure 130 chmod +x "$configureScript" 131 132 export AS_FOR_BUILD=${lib.getExe' buildPackages.stdenv.cc "$(basename $AS_FOR_BUILD)"} 133 export CC_FOR_BUILD=${lib.getExe' buildPackages.stdenv.cc "$(basename $CC_FOR_BUILD)"} 134 export CPP_FOR_BUILD=${lib.getExe' buildPackages.stdenv.cc "$(basename $CPP_FOR_BUILD)"} 135 export CXX_FOR_BUILD=${lib.getExe' buildPackages.stdenv.cc "$(basename $CXX_FOR_BUILD)"} 136 export LD_FOR_BUILD=${lib.getExe' buildPackages.stdenv.cc.bintools "$(basename $LD_FOR_BUILD)"} 137 138 export AS=${lib.getExe' stdenv.cc "$(basename $AS)"} 139 export CC=${lib.getExe' stdenv.cc "$(basename $CC)"} 140 export CPP=${lib.getExe' stdenv.cc "$(basename $CPP)"} 141 export CXX=${lib.getExe' stdenv.cc "$(basename $CXX)"} 142 export LD=${lib.getExe' stdenv.cc.bintools "$(basename $LD)"} 143 144 export AS_FOR_TARGET=${lib.getExe' stdenv.cc "$(basename $AS_FOR_TARGET)"} 145 export CC_FOR_TARGET=${lib.getExe' stdenv.cc "$(basename $CC_FOR_TARGET)"} 146 export CPP_FOR_TARGET=${lib.getExe' stdenv.cc "$(basename $CPP_FOR_TARGET)"} 147 export LD_FOR_TARGET=${lib.getExe' stdenv.cc.bintools "$(basename $LD_FOR_TARGET)"} 148 '' 149 + lib.optionalString stdenv.hostPlatform.isMusl '' 150 NIX_CFLAGS_COMPILE_OLD=$NIX_CFLAGS_COMPILE 151 NIX_CFLAGS_COMPILE+=' -isystem ${stdenv.cc.cc}/lib/gcc/${stdenv.hostPlatform.config}/${version}/include-fixed' 152 ''; 153 154 topLevelConfigureFlags = [ 155 "--build=${stdenv.buildPlatform.config}" 156 "--host=${stdenv.buildPlatform.config}" 157 "--target=${stdenv.hostPlatform.config}" 158 159 "--disable-bootstrap" 160 "--disable-multilib" 161 "--enable-languages=c" 162 163 "--disable-fixincludes" 164 "--disable-intl" 165 "--disable-lto" 166 "--disable-libatomic" 167 "--disable-libbacktrace" 168 "--disable-libcpp" 169 "--disable-libssp" 170 "--disable-libquadmath" 171 "--disable-libgomp" 172 "--disable-libvtv" 173 "--disable-vtable-verify" 174 175 "--with-system-zlib" 176 ] 177 ++ 178 lib.optional (!stdenv.hostPlatform.isRiscV) 179 # RISC-V does not like it being empty 180 "--with-multilib-list=" 181 ++ 182 lib.optional (stdenv.hostPlatform.libc == "glibc") 183 # Cheat and use previous stage's glibc to avoid infinite recursion. As 184 # of GCC 11, libgcc only cares if the version is greater than 2.19, 185 # which is quite ancient, so this little lie should be fine. 186 "--with-glibc-version=${buildPackages.glibc.version}"; 187 188 configurePlatforms = [ 189 "build" 190 "host" 191 ]; 192 193 configureFlags = [ 194 "--disable-dependency-tracking" 195 "gcc_cv_target_thread_file=single" 196 # $CC cannot link binaries, let alone run then 197 "cross_compiling=true" 198 # Do not have dynamic linker without libc 199 "--enable-static" 200 "--disable-shared" 201 ]; 202 203 # Set the variable back the way it was, see corresponding code in 204 # `preConfigure`. 205 postConfigure = lib.optionalString stdenv.hostPlatform.isMusl '' 206 NIX_CFLAGS_COMPILE=$NIX_CFLAGS_COMPILE_OLD 207 ''; 208 209 makeFlags = [ "MULTIBUILDTOP:=../" ]; 210 211 postInstall = '' 212 install -c -m 644 gthr-default.h "$dev/include" 213 ''; 214 215 doCheck = true; 216 217 passthru = { 218 isGNU = true; 219 }; 220 221 meta = gcc_meta // { 222 homepage = "https://gcc.gnu.org/"; 223 }; 224})