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