at 23.11-beta 172 lines 4.7 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{ 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}