1# Bootstrappable TCC is a fork from mainline TCC development
2# that can be compiled by MesCC
3
4# Build steps adapted from https://github.com/fosslinux/live-bootstrap/blob/1bc4296091c51f53a5598050c8956d16e945b0f5/sysa/tcc-0.9.26/tcc-0.9.26.kaem
5#
6# SPDX-FileCopyrightText: 2021-22 fosslinux <fosslinux@aussies.space>
7#
8# SPDX-License-Identifier: GPL-3.0-or-later
9
10{
11 lib,
12 callPackage,
13 fetchurl,
14 kaem,
15 mes,
16 mes-libc,
17}:
18let
19 inherit (callPackage ./common.nix { }) buildTinyccMes recompileLibc;
20
21 version = "unstable-2023-04-20";
22 rev = "80114c4da6b17fbaabb399cc29f427e368309bc8";
23
24 tarball = fetchurl {
25 url = "https://gitlab.com/janneke/tinycc/-/archive/${rev}/tinycc-${rev}.tar.gz";
26 sha256 = "1a0cw9a62qc76qqn5sjmp3xrbbvsz2dxrw21lrnx9q0s74mwaxbq";
27 };
28 src =
29 (kaem.runCommand "tinycc-bootstrappable-${version}-source" { } ''
30 ungz --file ${tarball} --output tinycc.tar
31 mkdir -p ''${out}
32 cd ''${out}
33 untar --file ''${NIX_BUILD_TOP}/tinycc.tar
34
35 # Patch
36 cd tinycc-${rev}
37 # Static link by default
38 replace --file libtcc.c --output libtcc.c --match-on "s->ms_extensions = 1;" --replace-with "s->ms_extensions = 1; s->static_link = 1;"
39 '')
40 + "/tinycc-${rev}";
41
42 meta = with lib; {
43 description = "Tiny C Compiler's bootstrappable fork";
44 homepage = "https://gitlab.com/janneke/tinycc";
45 license = licenses.lgpl21Only;
46 teams = [ teams.minimal-bootstrap ];
47 platforms = [ "i686-linux" ];
48 };
49
50 pname = "tinycc-boot-mes";
51
52 tinycc-boot-mes = rec {
53 compiler =
54 kaem.runCommand "${pname}-${version}"
55 {
56 passthru.tests.get-version =
57 result:
58 kaem.runCommand "${pname}-get-version-${version}" { } ''
59 ${result}/bin/tcc -version
60 mkdir ''${out}
61 '';
62 }
63 ''
64 catm config.h
65 ${mes.compiler}/bin/mes --no-auto-compile -e main ${mes.srcPost.bin}/bin/mescc.scm -- \
66 -S \
67 -o tcc.s \
68 -I . \
69 -D BOOTSTRAP=1 \
70 -I ${src} \
71 -D TCC_TARGET_I386=1 \
72 -D inline= \
73 -D CONFIG_TCCDIR=\"\" \
74 -D CONFIG_SYSROOT=\"\" \
75 -D CONFIG_TCC_CRTPREFIX=\"{B}\" \
76 -D CONFIG_TCC_ELFINTERP=\"/mes/loader\" \
77 -D CONFIG_TCC_LIBPATHS=\"{B}\" \
78 -D CONFIG_TCC_SYSINCLUDEPATHS=\"${mes-libc}/include\" \
79 -D TCC_LIBGCC=\"${mes-libc}/lib/x86-mes/libc.a\" \
80 -D CONFIG_TCC_LIBTCC1_MES=0 \
81 -D CONFIG_TCCBOOT=1 \
82 -D CONFIG_TCC_STATIC=1 \
83 -D CONFIG_USE_LIBGCC=1 \
84 -D TCC_MES_LIBC=1 \
85 -D TCC_VERSION=\"${version}\" \
86 -D ONE_SOURCE=1 \
87 ${src}/tcc.c
88 mkdir -p ''${out}/bin
89 ${mes.compiler}/bin/mes --no-auto-compile -e main ${mes.srcPost.bin}/bin/mescc.scm -- \
90 -L ${mes.libs}/lib \
91 -l c+tcc \
92 -o ''${out}/bin/tcc \
93 tcc.s
94 '';
95
96 libs = recompileLibc {
97 inherit pname version;
98 tcc = compiler;
99 src = mes-libc;
100 libtccOptions = mes-libc.CFLAGS;
101 };
102 };
103
104 # Bootstrap stage build flags obtained from
105 # https://gitlab.com/janneke/tinycc/-/blob/80114c4da6b17fbaabb399cc29f427e368309bc8/boot.sh
106
107 tinycc-boot0 = buildTinyccMes {
108 pname = "tinycc-boot0";
109 inherit src version meta;
110 prev = tinycc-boot-mes;
111 buildOptions = [
112 "-D HAVE_LONG_LONG_STUB=1"
113 "-D HAVE_SETJMP=1"
114 ];
115 libtccBuildOptions = [
116 "-D HAVE_LONG_LONG_STUB=1"
117 ];
118 };
119
120 tinycc-boot1 = buildTinyccMes {
121 pname = "tinycc-boot1";
122 inherit src version meta;
123 prev = tinycc-boot0;
124 buildOptions = [
125 "-D HAVE_BITFIELD=1"
126 "-D HAVE_LONG_LONG=1"
127 "-D HAVE_SETJMP=1"
128 ];
129 libtccBuildOptions = [
130 "-D HAVE_LONG_LONG=1"
131 ];
132 };
133
134 tinycc-boot2 = buildTinyccMes {
135 pname = "tinycc-boot2";
136 inherit src version meta;
137 prev = tinycc-boot1;
138 buildOptions = [
139 "-D HAVE_BITFIELD=1"
140 "-D HAVE_FLOAT_STUB=1"
141 "-D HAVE_LONG_LONG=1"
142 "-D HAVE_SETJMP=1"
143 ];
144 libtccBuildOptions = [
145 "-D HAVE_FLOAT_STUB=1"
146 "-D HAVE_LONG_LONG=1"
147 ];
148 };
149
150 tinycc-boot3 = buildTinyccMes {
151 pname = "tinycc-boot3";
152 inherit src version meta;
153 prev = tinycc-boot2;
154 buildOptions = [
155 "-D HAVE_BITFIELD=1"
156 "-D HAVE_FLOAT=1"
157 "-D HAVE_LONG_LONG=1"
158 "-D HAVE_SETJMP=1"
159 ];
160 libtccBuildOptions = [
161 "-D HAVE_FLOAT=1"
162 "-D HAVE_LONG_LONG=1"
163 ];
164 };
165in
166buildTinyccMes {
167 pname = "tinycc-bootstrappable";
168 inherit src version meta;
169 prev = tinycc-boot3;
170 buildOptions = [
171 "-D HAVE_BITFIELD=1"
172 "-D HAVE_FLOAT=1"
173 "-D HAVE_LONG_LONG=1"
174 "-D HAVE_SETJMP=1"
175 ];
176 libtccBuildOptions = [
177 "-D HAVE_FLOAT=1"
178 "-D HAVE_LONG_LONG=1"
179 ];
180}