nixpkgs mirror (for testing) github.com/NixOS/nixpkgs
nix
at devShellTools-shell 163 lines 4.5 kB view raw
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}