nixpkgs mirror (for testing)
github.com/NixOS/nixpkgs
nix
1{
2 lib,
3 fetchurl,
4 callPackage,
5 bash,
6 tinycc-bootstrappable,
7 musl,
8 gnupatch,
9 gnutar,
10 gzip,
11}:
12let
13 pname = "tinycc-musl";
14 # next commit introduces use of realpath (unsupported in mes-libc)
15 version = "unstable-2023-07-10";
16 rev = "fd6d2180c5c801bb0b4c5dde27d61503059fc97d";
17
18 src = fetchurl {
19 url = "https://repo.or.cz/tinycc.git/snapshot/${rev}.tar.gz";
20 hash = "sha256-R81SNbEmh4s9FNQxCWZwUiMCYRkkwOHAdRf0aMnnRiA=";
21 };
22
23 patches = [
24 ./ignore-duplicate-symbols.patch
25 ./ignore-static-inside-array.patch
26 ./static-link.patch
27 ];
28
29 meta = with lib; {
30 description = "Small, fast, and embeddable C compiler and interpreter";
31 homepage = "https://repo.or.cz/w/tinycc.git";
32 license = licenses.lgpl21Only;
33 teams = [ teams.minimal-bootstrap ];
34 platforms = [ "i686-linux" ];
35 };
36
37 tinycc-musl =
38 bash.runCommand "${pname}-${version}"
39 {
40 inherit pname version meta;
41
42 nativeBuildInputs = [
43 tinycc-bootstrappable.compiler
44 gnupatch
45 gnutar
46 gzip
47 ];
48 }
49 ''
50 # Unpack
51 tar xzf ${src}
52 cd tinycc-${builtins.substring 0 7 rev}
53
54 # Patch
55 ${lib.concatMapStringsSep "\n" (f: "patch -Np0 -i ${f}") patches}
56
57 # Configure
58 touch config.h
59
60 # Build
61 # We first have to recompile using tcc-0.9.26 as tcc-0.9.27 is not self-hosting,
62 # but when linked with musl it is.
63 ln -s ${musl}/lib/libtcc1.a ./libtcc1.a
64
65 tcc \
66 -B ${tinycc-bootstrappable.libs}/lib \
67 -DC2STR \
68 -o c2str \
69 conftest.c
70 ./c2str include/tccdefs.h tccdefs_.h
71
72 tcc -v \
73 -static \
74 -o tcc-musl \
75 -D TCC_TARGET_I386=1 \
76 -D CONFIG_TCCDIR=\"\" \
77 -D CONFIG_TCC_CRTPREFIX=\"{B}\" \
78 -D CONFIG_TCC_ELFINTERP=\"/musl/loader\" \
79 -D CONFIG_TCC_LIBPATHS=\"{B}\" \
80 -D CONFIG_TCC_SYSINCLUDEPATHS=\"${musl}/include\" \
81 -D TCC_LIBGCC=\"libc.a\" \
82 -D TCC_LIBTCC1=\"libtcc1.a\" \
83 -D CONFIG_TCC_STATIC=1 \
84 -D CONFIG_USE_LIBGCC=1 \
85 -D TCC_VERSION=\"0.9.27\" \
86 -D ONE_SOURCE=1 \
87 -D TCC_MUSL=1 \
88 -D CONFIG_TCC_PREDEFS=1 \
89 -D CONFIG_TCC_SEMLOCK=0 \
90 -B . \
91 -B ${tinycc-bootstrappable.libs}/lib \
92 tcc.c
93 # libtcc1.a
94 rm -f libtcc1.a
95 tcc -c -D HAVE_CONFIG_H=1 lib/libtcc1.c
96 tcc -ar cr libtcc1.a libtcc1.o
97
98 # Rebuild tcc-musl with itself
99 ./tcc-musl \
100 -v \
101 -static \
102 -o tcc-musl \
103 -D TCC_TARGET_I386=1 \
104 -D CONFIG_TCCDIR=\"\" \
105 -D CONFIG_TCC_CRTPREFIX=\"{B}\" \
106 -D CONFIG_TCC_ELFINTERP=\"/musl/loader\" \
107 -D CONFIG_TCC_LIBPATHS=\"{B}\" \
108 -D CONFIG_TCC_SYSINCLUDEPATHS=\"${musl}/include\" \
109 -D TCC_LIBGCC=\"libc.a\" \
110 -D TCC_LIBTCC1=\"libtcc1.a\" \
111 -D CONFIG_TCC_STATIC=1 \
112 -D CONFIG_USE_LIBGCC=1 \
113 -D TCC_VERSION=\"0.9.27\" \
114 -D ONE_SOURCE=1 \
115 -D TCC_MUSL=1 \
116 -D CONFIG_TCC_PREDEFS=1 \
117 -D CONFIG_TCC_SEMLOCK=0 \
118 -B . \
119 -B ${musl}/lib \
120 tcc.c
121 # libtcc1.a
122 rm -f libtcc1.a
123 ./tcc-musl -c -D HAVE_CONFIG_H=1 lib/libtcc1.c
124 ./tcc-musl -c -D HAVE_CONFIG_H=1 lib/alloca.S
125 ./tcc-musl -ar cr libtcc1.a libtcc1.o alloca.o
126
127 # Install
128 install -D tcc-musl $out/bin/tcc
129 install -Dm444 libtcc1.a $out/lib/libtcc1.a
130 '';
131in
132{
133 compiler = bash.runCommand "${pname}-${version}-compiler" {
134 inherit pname version meta;
135 passthru.tests.hello-world =
136 result:
137 bash.runCommand "${pname}-simple-program-${version}" { } ''
138 cat <<EOF >> test.c
139 #include <stdio.h>
140 int main() {
141 printf("Hello World!\n");
142 return 0;
143 }
144 EOF
145 ${result}/bin/tcc -v -static -B${musl}/lib -o test test.c
146 ./test
147 mkdir $out
148 '';
149 passthru.tinycc-musl = tinycc-musl;
150 } "install -D ${tinycc-musl}/bin/tcc $out/bin/tcc";
151
152 libs =
153 bash.runCommand "${pname}-${version}-libs"
154 {
155 inherit pname version meta;
156 }
157 ''
158 mkdir $out
159 cp -r ${musl}/* $out
160 chmod +w $out/lib/libtcc1.a
161 cp ${tinycc-musl}/lib/libtcc1.a $out/lib/libtcc1.a
162 '';
163}