nixpkgs mirror (for testing)
github.com/NixOS/nixpkgs
nix
1{
2 lib,
3 stdenvNoLibs,
4 buildPackages,
5 gcc,
6 glibc,
7 libiberty,
8}:
9
10let
11 stdenv = stdenvNoLibs;
12 gccConfigureFlags = gcc.cc.configureFlags ++ [
13 "--disable-fixincludes"
14 "--disable-intl"
15 "--enable-threads=posix"
16 "--with-glibc-version=${glibc.version}"
17 "--disable-plugin"
18
19 # these are required in order to prevent inhibit_libc=true,
20 # which will cripple libgcc's unwinder; see:
21 # https://github.com/NixOS/nixpkgs/issues/213453#issuecomment-1616346163
22 "--with-headers=${lib.getDev glibc}/include"
23 "--with-native-system-header-dir=${lib.getDev glibc}${glibc.incdir or "/include"}"
24 "--with-build-sysroot=/"
25 ];
26
27in
28stdenv.mkDerivation (finalAttrs: {
29 pname = "libgcc";
30 inherit (gcc.cc) src version;
31
32 outputs = [
33 "out"
34 "dev"
35 ];
36
37 strictDeps = true;
38 depsBuildBuild = [ buildPackages.stdenv.cc ];
39 nativeBuildInputs = [ libiberty ];
40 buildInputs = [ glibc ];
41
42 postUnpack = ''
43 mkdir -p ./build
44 buildRoot=$(readlink -e "./build")
45 '';
46
47 postPatch = gcc.cc.passthru.forceLibgccToBuildCrtStuff + ''
48 sourceRoot=$(readlink -e "./libgcc")
49 '';
50
51 preConfigure = ''
52 # Drop in libiberty, as external builds are not expected
53 cd "$buildRoot"
54 (
55 mkdir -p "build-${stdenv.buildPlatform.config}/libiberty/pic"
56 cd "build-${stdenv.buildPlatform.config}/libiberty/"
57 ln -s "${buildPackages.libiberty}/lib/libiberty.a" ./
58 ln -s "${buildPackages.libiberty}/lib/libiberty_pic.a" pic/libiberty.a
59 )
60 mkdir -p "$buildRoot/gcc"
61 cd "$buildRoot/gcc"
62 (
63 # We "shift" the tools over to fake platforms perspective from the previous stage.
64 export AS_FOR_BUILD=${buildPackages.stdenv.cc}/bin/$AS_FOR_BUILD
65 export CC_FOR_BUILD=${buildPackages.stdenv.cc}/bin/$CC_FOR_BUILD
66 export CPP_FOR_BUILD=${buildPackages.stdenv.cc}/bin/$CPP_FOR_BUILD
67 export CXX_FOR_BUILD=${buildPackages.stdenv.cc}/bin/$CXX_FOR_BUILD
68 export LD_FOR_BUILD=${buildPackages.stdenv.cc.bintools}/bin/$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=${stdenv.cc}/bin/$AS
77 export CC_FOR_TARGET=${stdenv.cc}/bin/$CC
78 export CPP_FOR_TARGET=${stdenv.cc}/bin/$CPP
79 export LD_FOR_TARGET=${stdenv.cc.bintools}/bin/$LD
80
81 # We define GENERATOR_FILE so nothing bothers looking for GNU GMP.
82 export NIX_CFLAGS_COMPILE_FOR_BUILD+=' -DGENERATOR_FILE=1'
83
84 "$sourceRoot/../gcc/configure" ${lib.concatStringsSep " " gccConfigureFlags}
85
86 # We remove the `libgcc.mvar` deps so that the bootstrap xgcc isn't built.
87 sed -e 's,libgcc.mvars:.*$,libgcc.mvars:,' -i Makefile
88
89 make \
90 config.h \
91 libgcc.mvars \
92 tconfig.h \
93 tm.h \
94 options.h \
95 insn-constants.h \
96 ''
97 + lib.optionalString stdenv.targetPlatform.isM68k ''
98 sysroot-suffix.h \
99 ''
100 + lib.optionalString stdenv.targetPlatform.isAarch32 ''
101 arm-isa.h \
102 arm-cpu.h \
103 ''
104 + lib.optionalString stdenv.targetPlatform.isLoongArch64 ''
105 loongarch-multilib.h \
106 ''
107 + ''
108 insn-modes.h
109 )
110 mkdir -p "$buildRoot/gcc/include"
111
112 # Preparing to configure + build libgcc itself
113 mkdir -p "$buildRoot/gcc/${stdenv.hostPlatform.config}/libgcc"
114 cd "$buildRoot/gcc/${stdenv.hostPlatform.config}/libgcc"
115 configureScript=$sourceRoot/configure
116 chmod +x "$configureScript"
117
118 export AS_FOR_BUILD=${buildPackages.stdenv.cc}/bin/$AS_FOR_BUILD
119 export CC_FOR_BUILD=${buildPackages.stdenv.cc}/bin/$CC_FOR_BUILD
120 export CPP_FOR_BUILD=${buildPackages.stdenv.cc}/bin/$CPP_FOR_BUILD
121 export CXX_FOR_BUILD=${buildPackages.stdenv.cc}/bin/$CXX_FOR_BUILD
122 export LD_FOR_BUILD=${buildPackages.stdenv.cc.bintools}/bin/$LD_FOR_BUILD
123
124 export AS=${stdenv.cc}/bin/$AS
125 export CC=${stdenv.cc}/bin/$CC
126 export CPP=${stdenv.cc}/bin/$CPP
127 export CXX=${stdenv.cc}/bin/$CXX
128 export LD=${stdenv.cc.bintools}/bin/$LD
129
130 export AS_FOR_TARGET=${stdenv.cc}/bin/$AS_FOR_TARGET
131 export CC_FOR_TARGET=${stdenv.cc}/bin/$CC_FOR_TARGET
132 export CPP_FOR_TARGET=${stdenv.cc}/bin/$CPP_FOR_TARGET
133 export LD_FOR_TARGET=${stdenv.cc.bintools}/bin/$LD_FOR_TARGET
134 '';
135
136 configurePlatforms = [
137 "build"
138 "host"
139 ];
140 configureFlags = [
141 "cross_compiling=true"
142 "--disable-gcov"
143 "--with-glibc-version=${glibc.version}"
144 ];
145
146 makeFlags = [ "MULTIBUILDTOP:=../" ];
147
148 postInstall = ''
149 moveToOutput "lib/gcc/${stdenv.hostPlatform.config}/${finalAttrs.version}/include" "$dev"
150 mkdir -p "$out/lib" "$dev/include"
151 ln -s "$out/lib/gcc/${stdenv.hostPlatform.config}/${finalAttrs.version}"/* "$out/lib"
152 ln -s "$dev/lib/gcc/${stdenv.hostPlatform.config}/${finalAttrs.version}/include"/* "$dev/include/"
153 '';
154})