at master 6.2 kB view raw
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}