1{ lib
2, kaem
3, mes-libc
4}:
5
6rec {
7
8 # Recompile libc: crt{1,n,i}, libtcc.a, libc.a, libgetopt.a
9 recompileLibc =
10 { tcc
11 , pname
12 , version
13 , src
14 , libtccOptions
15 }:
16 let
17
18 crt = kaem.runCommand "crt" {} ''
19 mkdir -p ''${out}/lib
20 ${tcc}/bin/tcc ${mes-libc.CFLAGS} -c -o ''${out}/lib/crt1.o ${mes-libc}/lib/crt1.c
21 ${tcc}/bin/tcc ${mes-libc.CFLAGS} -c -o ''${out}/lib/crtn.o ${mes-libc}/lib/crtn.c
22 ${tcc}/bin/tcc ${mes-libc.CFLAGS} -c -o ''${out}/lib/crti.o ${mes-libc}/lib/crti.c
23 '';
24
25 library = lib: options: source: kaem.runCommand "${lib}.a" {} ''
26 ${tcc}/bin/tcc ${options} -c -o ${lib}.o ${source}
27 ${tcc}/bin/tcc -ar cr ''${out} ${lib}.o
28 '';
29
30 libtcc1 = library "libtcc1" libtccOptions "${src}/lib/libtcc1.c";
31 libc = library "libc" mes-libc.CFLAGS "${mes-libc}/lib/libc.c";
32 libgetopt = library "libgetopt" mes-libc.CFLAGS "${mes-libc}/lib/libgetopt.c";
33 in
34 kaem.runCommand "${pname}-libs-${version}" {} ''
35 mkdir -p ''${out}/lib
36 cp ${crt}/lib/crt1.o ''${out}/lib
37 cp ${crt}/lib/crtn.o ''${out}/lib
38 cp ${crt}/lib/crti.o ''${out}/lib
39 cp ${libtcc1} ''${out}/lib/libtcc1.a
40 cp ${libc} ''${out}/lib/libc.a
41 cp ${libgetopt} ''${out}/lib/libgetopt.a
42 '';
43
44 buildTinyccMes =
45 { pname
46 , version
47 , src
48 , prev
49 , buildOptions
50 , libtccBuildOptions
51 , meta
52 }:
53 let
54 options = lib.strings.concatStringsSep " " buildOptions;
55 libtccOptions = lib.strings.concatStringsSep " "
56 (["-c" "-D" "TCC_TARGET_I386=1" ] ++ libtccBuildOptions);
57 compiler = kaem.runCommand "${pname}-${version}" {
58 inherit pname version meta;
59 passthru.tests = rec {
60 get-version = result: kaem.runCommand "${pname}-get-version-${version}" {} ''
61 ${result}/bin/tcc -version
62 mkdir ''${out}
63 '';
64 chain = result: kaem.runCommand "${pname}-chain-${version}" {} ''
65 echo ${prev.compiler.tests.chain or prev.compiler.tests.get-version};
66 ${result}/bin/tcc -version
67 mkdir ''${out}
68 '';
69 };
70 } ''
71 catm config.h
72 mkdir -p ''${out}/bin
73 ${prev.compiler}/bin/tcc \
74 -B ${prev.libs}/lib \
75 -g \
76 -v \
77 -o ''${out}/bin/tcc \
78 -D BOOTSTRAP=1 \
79 ${options} \
80 -I . \
81 -I ${src} \
82 -D TCC_TARGET_I386=1 \
83 -D CONFIG_TCCDIR=\"\" \
84 -D CONFIG_SYSROOT=\"\" \
85 -D CONFIG_TCC_CRTPREFIX=\"{B}\" \
86 -D CONFIG_TCC_ELFINTERP=\"\" \
87 -D CONFIG_TCC_LIBPATHS=\"{B}\" \
88 -D CONFIG_TCC_SYSINCLUDEPATHS=\"${mes-libc}/include\" \
89 -D TCC_LIBGCC=\"libc.a\" \
90 -D TCC_LIBTCC1=\"libtcc1.a\" \
91 -D CONFIG_TCCBOOT=1 \
92 -D CONFIG_TCC_STATIC=1 \
93 -D CONFIG_USE_LIBGCC=1 \
94 -D TCC_MES_LIBC=1 \
95 -D TCC_VERSION=\"${version}\" \
96 -D ONE_SOURCE=1 \
97 ${src}/tcc.c
98 '';
99 libs = recompileLibc {
100 inherit pname version src libtccOptions;
101 tcc = compiler;
102 };
103 in { inherit prev compiler libs; };
104}