1{
2 lib,
3 stdenv,
4 gfortran,
5 gcc_meta,
6 release_version,
7 version,
8 getVersionFile,
9 monorepoSrc ? null,
10 autoreconfHook269,
11 libiberty,
12 buildPackages,
13 libgcc,
14 libbacktrace,
15}:
16stdenv.mkDerivation (finalAttrs: {
17 pname = "libgfortran";
18 inherit version;
19
20 src = monorepoSrc;
21
22 outputs = [
23 "out"
24 "dev"
25 ];
26
27 strictDeps = true;
28
29 depsBuildBuild = [ buildPackages.stdenv.cc ];
30 nativeBuildInputs = [
31 autoreconfHook269
32 libiberty
33 gfortran
34 ];
35
36 patches = [
37 (getVersionFile "libgfortran/force-regular-dirs.patch")
38 ];
39
40 autoreconfFlags = "--install --force --verbose . libgfortran";
41
42 postUnpack = ''
43 mkdir -p ./build
44 buildRoot=$(readlink -e "./build")
45 '';
46
47 postPatch = ''
48 sourceRoot=$(readlink -e "./libgfortran")
49 '';
50
51 enableParallelBuilding = true;
52
53 preConfigure = ''
54 cd "$buildRoot"
55
56 mkdir -p build-${stdenv.buildPlatform.config}/libiberty/
57 cd build-${stdenv.buildPlatform.config}/libiberty/
58 ln -s ${libiberty}/lib/libiberty.a ./
59
60 mkdir -p "$buildRoot/gcc"
61 cd "$buildRoot/gcc"
62
63 (
64 export AS_FOR_BUILD=${lib.getExe' buildPackages.stdenv.cc "$AS_FOR_BUILD"}
65 export CC_FOR_BUILD=${lib.getExe' buildPackages.stdenv.cc "$CC_FOR_BUILD"}
66 export CPP_FOR_BUILD=${lib.getExe' buildPackages.stdenv.cc "$CPP_FOR_BUILD"}
67 export CXX_FOR_BUILD=${lib.getExe' buildPackages.stdenv.cc "$CXX_FOR_BUILD"}
68 export LD_FOR_BUILD=${lib.getExe' buildPackages.stdenv.cc.bintools "$LD_FOR_BUILD"}
69
70 export AS=$AS_FOR_BUILD
71 export CC=$CC_FOR_BUILD
72 export CPP=$CPP_FOR_BUILD
73 export CXX=$CXX_FOR_BUILD
74 export LD=$LD_FOR_BUILD
75
76 export AS_FOR_TARGET=${lib.getExe' stdenv.cc "$AS"}
77 export CC_FOR_TARGET=${lib.getExe' stdenv.cc "$CC"}
78 export CPP_FOR_TARGET=${lib.getExe' stdenv.cc "$CPP"}
79 export LD_FOR_TARGET=${lib.getExe' stdenv.cc.bintools "$LD"}
80
81 export NIX_CFLAGS_COMPILE_FOR_BUILD+=' -DGENERATOR_FILE=1'
82
83 "$sourceRoot/../gcc/configure" $topLevelConfigureFlags
84
85 make \
86 config.h
87 )
88 mkdir -p "$buildRoot/gcc/include"
89
90 mkdir -p "$buildRoot/gcc/libbacktrace/.libs"
91 cp ${libbacktrace}/lib/libbacktrace.a "$buildRoot/gcc/libbacktrace/.libs/libbacktrace.a"
92 cp -r ${libbacktrace}/lib/*.la "$buildRoot/gcc/libbacktrace"
93 cp -r ${libbacktrace.dev}/include/*.h "$buildRoot/gcc/libbacktrace"
94
95 mkdir -p "$buildRoot/gcc/libgcc"
96 ln -s "${libgcc.dev}/include/gthr-default.h" "$buildRoot/gcc/libgcc"
97
98 mkdir -p "$buildRoot/gcc/${stdenv.hostPlatform.config}/libgfortran"
99 ln -s "$buildRoot/gcc/libbacktrace" "$buildRoot/gcc/${stdenv.buildPlatform.config}/libbacktrace"
100 ln -s "$buildRoot/gcc/libgcc" "$buildRoot/gcc/${stdenv.buildPlatform.config}/libgcc"
101 cd "$buildRoot/gcc/${stdenv.hostPlatform.config}/libgfortran"
102 configureScript=$sourceRoot/configure
103 chmod +x "$configureScript"
104
105 export AS_FOR_BUILD=${lib.getExe' buildPackages.stdenv.cc "$AS_FOR_BUILD"}
106 export CC_FOR_BUILD=${lib.getExe' buildPackages.stdenv.cc "$CC_FOR_BUILD"}
107 export CPP_FOR_BUILD=${lib.getExe' buildPackages.stdenv.cc "$CPP_FOR_BUILD"}
108 export CXX_FOR_BUILD=${lib.getExe' buildPackages.stdenv.cc "$CXX_FOR_BUILD"}
109 export LD_FOR_BUILD=${lib.getExe' buildPackages.stdenv.cc.bintools "$LD_FOR_BUILD"}
110
111 export AS=${lib.getExe' stdenv.cc "$AS"}
112 export CC=${lib.getExe' stdenv.cc "$CC"}
113 export CPP=${lib.getExe' stdenv.cc "$CPP"}
114 export CXX=${lib.getExe' stdenv.cc "$CXX"}
115 export LD=${lib.getExe' stdenv.cc.bintools "$LD"}
116
117 export AS_FOR_TARGET=${lib.getExe' stdenv.cc "$AS_FOR_TARGET"}
118 export CC_FOR_TARGET=${lib.getExe' stdenv.cc "$CC_FOR_TARGET"}
119 export CPP_FOR_TARGET=${lib.getExe' stdenv.cc "$CPP_FOR_TARGET"}
120 export LD_FOR_TARGET=${lib.getExe' stdenv.cc.bintools "$LD_FOR_TARGET"}
121 ''
122 + lib.optionalString stdenv.hostPlatform.isMusl ''
123 NIX_CFLAGS_COMPILE_OLD=$NIX_CFLAGS_COMPILE
124 NIX_CFLAGS_COMPILE+=' -isystem ${stdenv.cc.cc}/lib/gcc/${stdenv.hostPlatform.config}/${version}/include-fixed'
125 '';
126
127 topLevelConfigureFlags = [
128 "--build=${stdenv.buildPlatform.config}"
129 "--host=${stdenv.buildPlatform.config}"
130 "--target=${stdenv.hostPlatform.config}"
131
132 "--disable-bootstrap"
133 "--disable-multilib"
134 "--with-multilib-list="
135 "--enable-languages=fortran"
136
137 "--disable-fixincludes"
138 "--disable-intl"
139 "--disable-lto"
140 "--disable-libatomic"
141 "--disable-libbacktrace"
142 "--disable-libcpp"
143 "--disable-libssp"
144 "--disable-libquadmath"
145 "--disable-libgomp"
146 "--disable-libvtv"
147 "--disable-vtable-verify"
148
149 "--with-system-zlib"
150 ]
151 ++
152 lib.optional (stdenv.hostPlatform.libc == "glibc")
153 # Cheat and use previous stage's glibc to avoid infinite recursion. As
154 # of GCC 11, libgcc only cares if the version is greater than 2.19,
155 # which is quite ancient, so this little lie should be fine.
156 "--with-glibc-version=${buildPackages.glibc.version}";
157
158 configurePlatforms = [
159 "build"
160 "host"
161 ];
162
163 configureFlags = [
164 "--disable-dependency-tracking"
165 "gcc_cv_target_thread_file=single"
166 # $CC cannot link binaries, let alone run then
167 "cross_compiling=true"
168 "--with-toolexeclibdir=${builtins.placeholder "dev"}/lib"
169 ];
170
171 # Set the variable back the way it was, see corresponding code in
172 # `preConfigure`.
173 postConfigure = lib.optionalString stdenv.hostPlatform.isMusl ''
174 NIX_CFLAGS_COMPILE=$NIX_CFLAGS_COMPILE_OLD
175 '';
176
177 makeFlags = [ "MULTIBUILDTOP:=../" ];
178
179 doCheck = true;
180
181 passthru = {
182 isGNU = true;
183 };
184
185 meta = gcc_meta // {
186 homepage = "https://gcc.gnu.org/";
187 };
188})