1{
2 lib,
3 newScope,
4 stdenv,
5 overrideCC,
6 fetchgit,
7 fetchurl,
8 gitRelease ? null,
9 officialRelease ? null,
10 monorepoSrc ? null,
11 version ? null,
12 patchesFn ? lib.id,
13 wrapCCWith,
14 binutilsNoLibc,
15 binutils,
16 buildGccPackages,
17 targetGccPackages,
18 makeScopeWithSplicing',
19 otherSplices,
20 ...
21}@args:
22
23assert lib.assertMsg (lib.xor (gitRelease != null) (officialRelease != null)) (
24 "must specify `gitRelease` or `officialRelease`"
25 + (lib.optionalString (gitRelease != null) " — not both")
26);
27
28let
29 monorepoSrc' = monorepoSrc;
30
31 metadata = rec {
32 inherit
33 (import ./common-let.nix {
34 inherit (args)
35 lib
36 gitRelease
37 officialRelease
38 version
39 ;
40 })
41 releaseInfo
42 ;
43 inherit (releaseInfo) release_version version;
44 inherit
45 (import ./common-let.nix {
46 inherit
47 lib
48 fetchgit
49 fetchurl
50 release_version
51 gitRelease
52 officialRelease
53 monorepoSrc'
54 version
55 ;
56 })
57 gcc_meta
58 monorepoSrc
59 ;
60 src = monorepoSrc;
61 versionDir =
62 (builtins.toString ../.)
63 + "/${if (gitRelease != null) then "git" else lib.versions.major release_version}";
64 getVersionFile =
65 p:
66 builtins.path {
67 name = builtins.baseNameOf p;
68 path =
69 let
70 patches = args.patchesFn (import ./patches.nix);
71
72 constraints = patches."${p}" or null;
73 matchConstraint =
74 {
75 before ? null,
76 after ? null,
77 path,
78 }:
79 let
80 check = fn: value: if value == null then true else fn release_version value;
81 matchBefore = check lib.versionOlder before;
82 matchAfter = check lib.versionAtLeast after;
83 in
84 matchBefore && matchAfter;
85
86 patchDir =
87 toString
88 (
89 if constraints == null then
90 { path = metadata.versionDir; }
91 else
92 (lib.findFirst matchConstraint { path = metadata.versionDir; } constraints)
93 ).path;
94 in
95 "${patchDir}/${p}";
96 };
97 };
98in
99makeScopeWithSplicing' {
100 inherit otherSplices;
101 f =
102 gccPackages:
103 let
104 callPackage = gccPackages.newScope (args // metadata);
105 in
106 {
107 stdenv = overrideCC stdenv gccPackages.gcc;
108
109 gcc-unwrapped = callPackage ./gcc {
110 bintools = binutils;
111 };
112
113 libbacktrace = callPackage ./libbacktrace { };
114 libiberty = callPackage ./libiberty { };
115 libsanitizer = callPackage ./libsanitizer { };
116 libquadmath = callPackage ./libquadmath { };
117
118 gfortran-unwrapped = gccPackages.gcc-unwrapped.override {
119 stdenv = overrideCC stdenv buildGccPackages.gcc;
120 langFortran = true;
121 };
122
123 gfortran = wrapCCWith rec {
124 cc = gccPackages.gfortran-unwrapped;
125 libcxx = targetGccPackages.libstdcxx;
126 bintools = binutils;
127 extraPackages = [
128 targetGccPackages.libgcc
129 ];
130 nixSupport.cc-cflags = [
131 "-B${targetGccPackages.libgcc}/lib"
132 "-B${targetGccPackages.libssp}/lib"
133 "-B${targetGccPackages.libatomic}/lib"
134 "-B${targetGccPackages.libgfortran}/lib/"
135 ];
136 };
137
138 gfortranNoLibgfortran = wrapCCWith rec {
139 cc = gccPackages.gfortran-unwrapped;
140 libcxx = targetGccPackages.libstdcxx;
141 bintools = binutils;
142 extraPackages = [
143 targetGccPackages.libgcc
144 ];
145 nixSupport.cc-cflags = [
146 "-B${targetGccPackages.libgcc}/lib"
147 "-B${targetGccPackages.libssp}/lib"
148 "-B${targetGccPackages.libatomic}/lib"
149 ];
150 };
151
152 gcc = wrapCCWith rec {
153 cc = gccPackages.gcc-unwrapped;
154 libcxx = targetGccPackages.libstdcxx;
155 bintools = binutils;
156 extraPackages = [
157 targetGccPackages.libgcc
158 ];
159 nixSupport.cc-cflags = [
160 "-B${targetGccPackages.libgcc}/lib"
161 "-B${targetGccPackages.libssp}/lib"
162 "-B${targetGccPackages.libatomic}/lib"
163 ];
164 };
165
166 gccNoLibgcc = wrapCCWith rec {
167 cc = gccPackages.gcc-unwrapped;
168 libcxx = null;
169 bintools = binutilsNoLibc;
170 extraPackages = [ ];
171 nixSupport.cc-cflags = [
172 "-nostartfiles"
173 ];
174 };
175
176 libgcc = callPackage ./libgcc {
177 stdenv = overrideCC stdenv buildGccPackages.gccNoLibgcc;
178 };
179
180 gccWithLibc = wrapCCWith rec {
181 cc = gccPackages.gcc-unwrapped;
182 libcxx = null;
183 bintools = binutils;
184 extraPackages = [
185 targetGccPackages.libgcc
186 ];
187 nixSupport.cc-cflags = [
188 "-B${targetGccPackages.libgcc}/lib"
189 ];
190 };
191
192 libssp = callPackage ./libssp {
193 stdenv = overrideCC stdenv buildGccPackages.gccWithLibc;
194 };
195
196 gccWithLibssp = wrapCCWith rec {
197 cc = gccPackages.gcc-unwrapped;
198 libcxx = null;
199 bintools = binutils;
200 extraPackages = [
201 targetGccPackages.libgcc
202 ];
203 nixSupport.cc-cflags = [
204 "-B${targetGccPackages.libgcc}/lib"
205 "-B${targetGccPackages.libssp}/lib"
206 ];
207 };
208
209 libatomic = callPackage ./libatomic {
210 stdenv = overrideCC stdenv buildGccPackages.gccWithLibssp;
211 };
212
213 gccWithLibatomic = wrapCCWith rec {
214 cc = gccPackages.gcc-unwrapped;
215 libcxx = null;
216 bintools = binutils;
217 extraPackages = [
218 targetGccPackages.libgcc
219 ];
220 nixSupport.cc-cflags = [
221 "-B${targetGccPackages.libgcc}/lib"
222 "-B${targetGccPackages.libssp}/lib"
223 "-B${targetGccPackages.libatomic}/lib"
224 ];
225 };
226
227 libgfortran = callPackage ./libgfortran {
228 stdenv = overrideCC stdenv buildGccPackages.gcc;
229 gfortran = buildGccPackages.gfortranNoLibgfortran;
230 };
231
232 libstdcxx = callPackage ./libstdcxx {
233 stdenv = overrideCC stdenv buildGccPackages.gccWithLibatomic;
234 };
235 };
236}