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