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