nixpkgs mirror (for testing)
github.com/NixOS/nixpkgs
nix
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 (toString ../.) + "/${if (gitRelease != null) then "git" else lib.versions.major release_version}";
63 getVersionFile =
64 p:
65 builtins.path {
66 name = baseNameOf p;
67 path =
68 let
69 patches = args.patchesFn (import ./patches.nix);
70
71 constraints = patches."${p}" or null;
72 matchConstraint =
73 {
74 before ? null,
75 after ? null,
76 path,
77 }:
78 let
79 check = fn: value: if value == null then true else fn release_version value;
80 matchBefore = check lib.versionOlder before;
81 matchAfter = check lib.versionAtLeast after;
82 in
83 matchBefore && matchAfter;
84
85 patchDir =
86 toString
87 (
88 if constraints == null then
89 { path = metadata.versionDir; }
90 else
91 (lib.findFirst matchConstraint { path = metadata.versionDir; } constraints)
92 ).path;
93 in
94 "${patchDir}/${p}";
95 };
96 };
97in
98makeScopeWithSplicing' {
99 inherit otherSplices;
100 f =
101 gccPackages:
102 let
103 callPackage = gccPackages.newScope (args // metadata);
104 in
105 {
106 stdenv = overrideCC stdenv gccPackages.gcc;
107
108 gcc-unwrapped = callPackage ./gcc {
109 bintools = binutils;
110 };
111
112 libbacktrace = callPackage ./libbacktrace { };
113 libiberty = callPackage ./libiberty { };
114 libsanitizer = callPackage ./libsanitizer { };
115 libquadmath = callPackage ./libquadmath { };
116
117 gfortran-unwrapped = gccPackages.gcc-unwrapped.override {
118 stdenv = overrideCC stdenv buildGccPackages.gcc;
119 langFortran = true;
120 };
121
122 gfortran = wrapCCWith {
123 cc = gccPackages.gfortran-unwrapped;
124 libcxx = targetGccPackages.libstdcxx;
125 bintools = binutils;
126 extraPackages = [
127 targetGccPackages.libgcc
128 ];
129 nixSupport.cc-cflags = [
130 "-B${targetGccPackages.libgcc}/lib"
131 "-B${targetGccPackages.libssp}/lib"
132 "-B${targetGccPackages.libatomic}/lib"
133 "-B${targetGccPackages.libgfortran}/lib/"
134 ];
135 };
136
137 gfortranNoLibgfortran = wrapCCWith {
138 cc = gccPackages.gfortran-unwrapped;
139 libcxx = targetGccPackages.libstdcxx;
140 bintools = binutils;
141 extraPackages = [
142 targetGccPackages.libgcc
143 ];
144 nixSupport.cc-cflags = [
145 "-B${targetGccPackages.libgcc}/lib"
146 "-B${targetGccPackages.libssp}/lib"
147 "-B${targetGccPackages.libatomic}/lib"
148 ];
149 };
150
151 gcc = wrapCCWith {
152 cc = gccPackages.gcc-unwrapped;
153 libcxx = targetGccPackages.libstdcxx;
154 bintools = binutils;
155 extraPackages = [
156 targetGccPackages.libgcc
157 ];
158 nixSupport.cc-cflags = [
159 "-B${targetGccPackages.libgcc}/lib"
160 "-B${targetGccPackages.libssp}/lib"
161 "-B${targetGccPackages.libatomic}/lib"
162 ];
163 };
164
165 gccNoLibgcc = wrapCCWith {
166 cc = gccPackages.gcc-unwrapped;
167 libcxx = null;
168 bintools = binutilsNoLibc;
169 extraPackages = [ ];
170 nixSupport.cc-cflags = [
171 "-nostartfiles"
172 ];
173 };
174
175 libgcc = callPackage ./libgcc {
176 stdenv = overrideCC stdenv buildGccPackages.gccNoLibgcc;
177 };
178
179 gccWithLibc = wrapCCWith {
180 cc = gccPackages.gcc-unwrapped;
181 libcxx = null;
182 bintools = binutils;
183 extraPackages = [
184 targetGccPackages.libgcc
185 ];
186 nixSupport.cc-cflags = [
187 "-B${targetGccPackages.libgcc}/lib"
188 ];
189 };
190
191 libssp = callPackage ./libssp {
192 stdenv = overrideCC stdenv buildGccPackages.gccWithLibc;
193 };
194
195 gccWithLibssp = wrapCCWith {
196 cc = gccPackages.gcc-unwrapped;
197 libcxx = null;
198 bintools = binutils;
199 extraPackages = [
200 targetGccPackages.libgcc
201 ];
202 nixSupport.cc-cflags = [
203 "-B${targetGccPackages.libgcc}/lib"
204 "-B${targetGccPackages.libssp}/lib"
205 ];
206 };
207
208 libatomic = callPackage ./libatomic {
209 stdenv = overrideCC stdenv buildGccPackages.gccWithLibssp;
210 };
211
212 gccWithLibatomic = wrapCCWith {
213 cc = gccPackages.gcc-unwrapped;
214 libcxx = null;
215 bintools = binutils;
216 extraPackages = [
217 targetGccPackages.libgcc
218 ];
219 nixSupport.cc-cflags = [
220 "-B${targetGccPackages.libgcc}/lib"
221 "-B${targetGccPackages.libssp}/lib"
222 "-B${targetGccPackages.libatomic}/lib"
223 ];
224 };
225
226 libgfortran = callPackage ./libgfortran {
227 stdenv = overrideCC stdenv buildGccPackages.gcc;
228 gfortran = buildGccPackages.gfortranNoLibgfortran;
229 };
230
231 libstdcxx = callPackage ./libstdcxx {
232 stdenv = overrideCC stdenv buildGccPackages.gccWithLibatomic;
233 };
234 };
235}