42d26b0984
Because common.nix is shared across these packages, they are upgraded together. This patch applies various x86_64-specific bugfixes to tinycc-bootstrappable and upgrades tinycc-mes to the latest "mob" version. The build scripts are updated to support 64-bit targets. The runtime library "libtcc1.c" is changed to include va_list.c for tinycc-bootstrappable, which is required to support variadic args on x86_64. On the other hand, we add alloca support to libtcc1.c on tinycc-mes.
127 lines
3.6 KiB
Nix
127 lines
3.6 KiB
Nix
# Build steps adapted from https://github.com/fosslinux/live-bootstrap/blob/1bc4296091c51f53a5598050c8956d16e945b0f5/sysa/tcc-0.9.27/tcc-0.9.27.kaem
|
|
#
|
|
# SPDX-FileCopyrightText: 2021-22 fosslinux <fosslinux@aussies.space>
|
|
#
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
{
|
|
lib,
|
|
fetchurl,
|
|
callPackage,
|
|
kaem,
|
|
tinycc-bootstrappable,
|
|
}:
|
|
let
|
|
inherit (callPackage ./common.nix { }) buildTinyccMes;
|
|
|
|
version = "unstable-2025-12-03";
|
|
rev = "cb41cbfe717e4c00d7bb70035cda5ee5f0ff9341";
|
|
|
|
tarball = fetchurl {
|
|
url = "https://repo.or.cz/tinycc.git/snapshot/${rev}.tar.gz";
|
|
hash = "sha256-MRuqq3TKcfIahtUWdhAcYhqDiGPkAjS8UTMsDE+/jGU=";
|
|
};
|
|
src =
|
|
(kaem.runCommand "tinycc-${version}-source" { } ''
|
|
ungz --file ${tarball} --output tinycc.tar
|
|
mkdir -p ''${out}
|
|
cd ''${out}
|
|
untar --file ''${NIX_BUILD_TOP}/tinycc.tar
|
|
|
|
# Patch
|
|
cd tinycc-${builtins.substring 0 7 rev}
|
|
# Static link by default
|
|
replace --file libtcc.c --output libtcc.c --match-on "s->ms_extensions = 1;" --replace-with "s->ms_extensions = 1; s->static_link = 1;"
|
|
replace --file i386-asm.c --output i386-asm.c --match-on "switch(size)" --replace-with "if (reg >= 8) { cstr_printf(add_str, \"%%r%d%c\", reg, (size == 1) ? 'b' : ((size == 2) ? 'w' : ((size == 4) ? 'd' : ' '))); return; } switch(size)"
|
|
|
|
# If performing ptr + (-1) for example, the offset should be ptrdiff_t and not size_t
|
|
replace --file tccgen.c --output tccgen.c --match-on "vpush_type_size(pointed_type(&vtop[-1].type), &align);" --replace-with "vpush_type_size(pointed_type(&vtop[-1].type), &align); if (!(vtop[-1].type.t & VT_UNSIGNED)) gen_cast_s(VT_PTRDIFF_T);"
|
|
'')
|
|
+ "/tinycc-${builtins.substring 0 7 rev}";
|
|
|
|
meta = {
|
|
description = "Small, fast, and embeddable C compiler and interpreter";
|
|
homepage = "https://repo.or.cz/w/tinycc.git";
|
|
license = lib.licenses.lgpl21Only;
|
|
teams = [ lib.teams.minimal-bootstrap ];
|
|
platforms = [
|
|
"i686-linux"
|
|
"x86_64-linux"
|
|
];
|
|
};
|
|
|
|
config_h = builtins.toFile "config_tccdefs.h" ''
|
|
"#include <mes/config.h>\n"
|
|
'';
|
|
tccdefs = kaem.runCommand "tccdefs-${version}" { } ''
|
|
mkdir ''${out}
|
|
${tinycc-bootstrappable.compiler}/bin/tcc \
|
|
-B ${tinycc-bootstrappable.libs}/lib \
|
|
-DC2STR \
|
|
-o c2str \
|
|
${src}/conftest.c
|
|
./c2str ${src}/include/tccdefs.h tccdefs_.h
|
|
catm ''${out}/tccdefs_.h tccdefs_.h ${config_h}
|
|
'';
|
|
|
|
tinycc-mes-boot = buildTinyccMes {
|
|
pname = "tinycc-mes-boot";
|
|
inherit src version meta;
|
|
prev = tinycc-bootstrappable;
|
|
buildOptions = [
|
|
"-D HAVE_BITFIELD=1"
|
|
"-D HAVE_FLOAT=1"
|
|
"-D HAVE_LONG_LONG=1"
|
|
"-D HAVE_SETJMP=1"
|
|
"-D CONFIG_TCC_PREDEFS=1"
|
|
"-I ${tccdefs}"
|
|
"-D CONFIG_TCC_SEMLOCK=0"
|
|
];
|
|
libtccSources = [
|
|
"${src}/lib/libtcc1.c"
|
|
"${src}/lib/alloca.S"
|
|
];
|
|
libtccObjects = [
|
|
"libtcc1.o"
|
|
"alloca.o"
|
|
];
|
|
libtccBuildOptions = [
|
|
"-D HAVE_FLOAT=1"
|
|
"-D HAVE_LONG_LONG=1"
|
|
"-D CONFIG_TCC_PREDEFS=1"
|
|
"-I ${tccdefs}"
|
|
"-D CONFIG_TCC_SEMLOCK=0"
|
|
];
|
|
};
|
|
in
|
|
buildTinyccMes {
|
|
pname = "tinycc-mes";
|
|
inherit src version meta;
|
|
prev = tinycc-mes-boot;
|
|
buildOptions = [
|
|
"-std=c99"
|
|
"-D HAVE_BITFIELD=1"
|
|
"-D HAVE_FLOAT=1"
|
|
"-D HAVE_LONG_LONG=1"
|
|
"-D HAVE_SETJMP=1"
|
|
"-D CONFIG_TCC_PREDEFS=1"
|
|
"-I ${tccdefs}"
|
|
"-D CONFIG_TCC_SEMLOCK=0"
|
|
];
|
|
libtccSources = [
|
|
"${src}/lib/libtcc1.c"
|
|
"${src}/lib/alloca.S"
|
|
];
|
|
libtccObjects = [
|
|
"libtcc1.o"
|
|
"alloca.o"
|
|
];
|
|
libtccBuildOptions = [
|
|
"-D HAVE_FLOAT=1"
|
|
"-D HAVE_LONG_LONG=1"
|
|
"-D CONFIG_TCC_PREDEFS=1"
|
|
"-I ${tccdefs}"
|
|
"-D CONFIG_TCC_SEMLOCK=0"
|
|
];
|
|
}
|