1{ runCommand,
2clang,
3gcc64,
4gcc32,
5glibc_multi
6}:
7
8let
9 combine = basegcc: runCommand "combine-gcc-libc" {} ''
10 mkdir -p $out
11 cp -r ${basegcc.cc}/lib $out/lib
12
13 chmod u+rw -R $out/lib
14 cp -r ${basegcc.libc}/lib/* $(ls -d $out/lib/gcc/*/*)
15 '';
16 gcc_multi_sysroot = runCommand "gcc-multi-sysroot" {} ''
17 mkdir -p $out/lib/gcc
18
19 ln -s ${combine gcc64}/lib/gcc/* $out/lib/gcc/
20 ln -s ${combine gcc32}/lib/gcc/* $out/lib/gcc/
21 # XXX: This shouldn't be needed, clang just doesn't look for "i686-unknown"
22 ln -s $out/lib/gcc/i686-unknown-linux-gnu $out/lib/gcc/i686-pc-linux-gnu
23
24
25 # includes
26 ln -s ${glibc_multi.dev}/include $out/
27
28 # dynamic linkers
29 mkdir -p $out/lib/32
30 ln -s ${glibc_multi.out}/lib/ld-linux* $out/lib
31 ln -s ${glibc_multi.out}/lib/32/ld-linux* $out/lib/32/
32 '';
33
34 clangMulti = clang.override {
35 # Only used for providing expected structure re:dynamic linkers, AFAIK
36 # Most of the magic is done by setting the --gcc-toolchain option below
37 libc = gcc_multi_sysroot;
38
39 bintools = clang.bintools.override {
40 libc = gcc_multi_sysroot;
41 };
42
43 extraBuildCommands = ''
44 sed -e '$a --gcc-toolchain=${gcc_multi_sysroot}' -i $out/nix-support/libc-cflags
45 '';
46 };
47
48in clangMulti