nixpkgs mirror (for testing)
github.com/NixOS/nixpkgs
nix
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://github.com/gcc-mirror/gcc/commit/e5d853bbe9b05d6a00d98ad236f01937303e40c4.diff";
49 hash = "sha256-92LIttIXdh12/lRhivb2JTPpqUmGBRn+uKmR5pzuveo=";
50 includes = [
51 "config/*"
52 "libgcc/configure.ac"
53 ];
54 })
55 (fetchpatch {
56 name = "no-pie-cflags.patch";
57 url = "https://github.com/gcc-mirror/gcc/commit/77144dd3b6736e0166156bb509590d924375a4f1.diff";
58 hash = "sha256-QlxlTkWAK1dB7JiU5wz2iOW24gj3bFaeBpwb90oWwns=";
59 includes = [
60 "gcc/Makefile.in"
61 "gcc/configure.ac"
62 "libgcc/Makefile.in"
63 "libgcc/configure.ac"
64 ];
65 })
66 (fetchpatch {
67 name = "no-target-system-root.patch";
68 url = "https://github.com/gcc-mirror/gcc/commit/9947930b7ae923010c5061fd8fa6b1ec4f22f161.diff";
69 hash = "sha256-BZmpHpJuuyDmQMwpQhSgCZO0Rg7kXt8rTiJAT+e0sUw=";
70 })
71 (fetchpatch {
72 name = "regular-libdir-includedir.patch";
73 url = "https://inbox.sourceware.org/gcc-patches/20250717174911.1536129-1-git@JohnEricson.me/raw";
74 hash = "sha256-Cn7rvg1FI7H/26GzSe4pv5VW/gvwbwGqivAqEeawkwk=";
75 })
76 (getVersionFile "libgcc/force-regular-dirs.patch")
77 ];
78
79 autoreconfFlags = "--install --force --verbose . libgcc";
80
81 postUnpack = ''
82 mkdir -p ./build
83 buildRoot=$(readlink -e "./build")
84 '';
85
86 postPatch = ''
87 sourceRoot=$(readlink -e "./libgcc")
88 '';
89
90 enableParallelBuilding = true;
91
92 preConfigure = ''
93 cd "$buildRoot"
94
95 mkdir -p build-${stdenv.buildPlatform.config}/libiberty/
96 cd build-${stdenv.buildPlatform.config}/libiberty/
97 ln -s ${buildGccPackages.libiberty}/lib/libiberty.a ./
98
99 mkdir -p "$buildRoot/gcc"
100 cd "$buildRoot/gcc"
101
102 (
103 export AS_FOR_BUILD=${lib.getExe' buildPackages.stdenv.cc "$(basename $AS_FOR_BUILD)"}
104 export CC_FOR_BUILD=${lib.getExe' buildPackages.stdenv.cc "$(basename $CC_FOR_BUILD)"}
105 export CPP_FOR_BUILD=${lib.getExe' buildPackages.stdenv.cc "$(basename $CPP_FOR_BUILD)"}
106 export CXX_FOR_BUILD=${lib.getExe' buildPackages.stdenv.cc "$(basename $CXX_FOR_BUILD)"}
107 export LD_FOR_BUILD=${lib.getExe' buildPackages.stdenv.cc.bintools "$(basename $LD_FOR_BUILD)"}
108
109 export AS=$AS_FOR_BUILD
110 export CC=$CC_FOR_BUILD
111 export CPP=$CPP_FOR_BUILD
112 export CXX=$CXX_FOR_BUILD
113 export LD=$LD_FOR_BUILD
114
115 export AS_FOR_TARGET=${lib.getExe' stdenv.cc "$(basename $AS)"}
116 export CC_FOR_TARGET=${lib.getExe' stdenv.cc "$(basename $CC)"}
117 export CPP_FOR_TARGET=${lib.getExe' stdenv.cc "$(basename $CPP)"}
118 export LD_FOR_TARGET=${lib.getExe' stdenv.cc.bintools "$(basename $LD)"}
119
120 export NIX_CFLAGS_COMPILE_FOR_BUILD+=' -DGENERATOR_FILE=1'
121
122 "$sourceRoot/../gcc/configure" $topLevelConfigureFlags
123
124 sed -e 's,libgcc.mvars:.*$,libgcc.mvars:,' -i Makefile
125
126 make \
127 config.h \
128 libgcc.mvars \
129 tconfig.h \
130 tm.h \
131 options.h \
132 insn-constants.h \
133 version.h
134 )
135 mkdir -p "$buildRoot/gcc/include"
136
137 mkdir -p "$buildRoot/gcc/${stdenv.hostPlatform.config}/libgcc"
138 cd "$buildRoot/gcc/${stdenv.hostPlatform.config}/libgcc"
139 configureScript=$sourceRoot/configure
140 chmod +x "$configureScript"
141
142 export AS_FOR_BUILD=${lib.getExe' buildPackages.stdenv.cc "$(basename $AS_FOR_BUILD)"}
143 export CC_FOR_BUILD=${lib.getExe' buildPackages.stdenv.cc "$(basename $CC_FOR_BUILD)"}
144 export CPP_FOR_BUILD=${lib.getExe' buildPackages.stdenv.cc "$(basename $CPP_FOR_BUILD)"}
145 export CXX_FOR_BUILD=${lib.getExe' buildPackages.stdenv.cc "$(basename $CXX_FOR_BUILD)"}
146 export LD_FOR_BUILD=${lib.getExe' buildPackages.stdenv.cc.bintools "$(basename $LD_FOR_BUILD)"}
147
148 export AS=${lib.getExe' stdenv.cc "$(basename $AS)"}
149 export CC=${lib.getExe' stdenv.cc "$(basename $CC)"}
150 export CPP=${lib.getExe' stdenv.cc "$(basename $CPP)"}
151 export CXX=${lib.getExe' stdenv.cc "$(basename $CXX)"}
152 export LD=${lib.getExe' stdenv.cc.bintools "$(basename $LD)"}
153
154 export AS_FOR_TARGET=${lib.getExe' stdenv.cc "$(basename $AS_FOR_TARGET)"}
155 export CC_FOR_TARGET=${lib.getExe' stdenv.cc "$(basename $CC_FOR_TARGET)"}
156 export CPP_FOR_TARGET=${lib.getExe' stdenv.cc "$(basename $CPP_FOR_TARGET)"}
157 export LD_FOR_TARGET=${lib.getExe' stdenv.cc.bintools "$(basename $LD_FOR_TARGET)"}
158 ''
159 + lib.optionalString stdenv.hostPlatform.isMusl ''
160 NIX_CFLAGS_COMPILE_OLD=$NIX_CFLAGS_COMPILE
161 NIX_CFLAGS_COMPILE+=' -isystem ${stdenv.cc.cc}/lib/gcc/${stdenv.hostPlatform.config}/${version}/include-fixed'
162 '';
163
164 topLevelConfigureFlags = [
165 "--build=${stdenv.buildPlatform.config}"
166 "--host=${stdenv.buildPlatform.config}"
167 "--target=${stdenv.hostPlatform.config}"
168
169 "--disable-bootstrap"
170 "--disable-multilib"
171 "--enable-languages=c"
172
173 "--disable-fixincludes"
174 "--disable-intl"
175 "--disable-lto"
176 "--disable-libatomic"
177 "--disable-libbacktrace"
178 "--disable-libcpp"
179 "--disable-libssp"
180 "--disable-libquadmath"
181 "--disable-libgomp"
182 "--disable-libvtv"
183 "--disable-vtable-verify"
184
185 "--with-system-zlib"
186 ]
187 ++
188 lib.optional (!stdenv.hostPlatform.isRiscV)
189 # RISC-V does not like it being empty
190 "--with-multilib-list="
191 ++
192 lib.optional (stdenv.hostPlatform.libc == "glibc")
193 # Cheat and use previous stage's glibc to avoid infinite recursion. As
194 # of GCC 11, libgcc only cares if the version is greater than 2.19,
195 # which is quite ancient, so this little lie should be fine.
196 "--with-glibc-version=${buildPackages.glibc.version}";
197
198 configurePlatforms = [
199 "build"
200 "host"
201 ];
202
203 configureFlags = [
204 "--disable-dependency-tracking"
205 "gcc_cv_target_thread_file=single"
206 # $CC cannot link binaries, let alone run then
207 "cross_compiling=true"
208 # Do not have dynamic linker without libc
209 "--enable-static"
210 "--disable-shared"
211 ];
212
213 # Set the variable back the way it was, see corresponding code in
214 # `preConfigure`.
215 postConfigure = lib.optionalString stdenv.hostPlatform.isMusl ''
216 NIX_CFLAGS_COMPILE=$NIX_CFLAGS_COMPILE_OLD
217 '';
218
219 makeFlags = [ "MULTIBUILDTOP:=../" ];
220
221 postInstall = ''
222 install -c -m 644 gthr-default.h "$dev/include"
223 '';
224
225 doCheck = true;
226
227 passthru = {
228 isGNU = true;
229 };
230
231 meta = gcc_meta // {
232 homepage = "https://gcc.gnu.org/";
233 };
234})