at 25.11-pre 180 lines 4.9 kB view raw
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}