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})