Files
nixpkgs/pkgs/os-specific/linux/minimal-bootstrap/tinycc/common.nix
T
Aleksi Hannula 42d26b0984 minimal-bootstrap.tinycc-{bootstrappable,mes}: Support x86_64-linux
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.
2025-12-13 11:27:13 +02:00

159 lines
4.3 KiB
Nix

{
lib,
kaem,
mes-libc,
buildPlatform,
}:
rec {
# Recompile libc: crt{1,n,i}, libtcc.a, libc.a, libgetopt.a
recompileLibc =
{
tcc,
pname,
version,
src,
libtccOptions,
libtccSources ? [
"${src}/lib/libtcc1.c"
"${src}/lib/va_list.c"
],
libtccObjects ? [
"libtcc1.o"
"va_list.o"
],
}:
let
crt = kaem.runCommand "crt" { } ''
mkdir -p ''${out}/lib
${tcc}/bin/tcc ${mes-libc.CFLAGS} -c -o ''${out}/lib/crt1.o ${mes-libc}/lib/crt1.c
${tcc}/bin/tcc ${mes-libc.CFLAGS} -c -o ''${out}/lib/crtn.o ${mes-libc}/lib/crtn.c
${tcc}/bin/tcc ${mes-libc.CFLAGS} -c -o ''${out}/lib/crti.o ${mes-libc}/lib/crti.c
'';
library =
let
compileCmd = options: source: "${tcc}/bin/tcc ${options} -c ${source}";
in
libName: options: sources: objs:
kaem.runCommand "${libName}.a" { } ''
${lib.strings.concatMapStringsSep "\n" (compileCmd options) sources}
${tcc}/bin/tcc -ar cr ''${out} ${lib.strings.concatStringsSep " " objs}
'';
libtcc1 = library "libtcc1" libtccOptions libtccSources libtccObjects;
libc = library "libc" mes-libc.CFLAGS [ "${mes-libc}/lib/libc.c" ] [ "libc.o" ];
libgetopt = library "libgetopt" mes-libc.CFLAGS [ "${mes-libc}/lib/libgetopt.c" ] [ "libgetopt.o" ];
in
kaem.runCommand "${pname}-libs-${version}" { } ''
mkdir -p ''${out}/lib
cp ${crt}/lib/crt1.o ''${out}/lib
cp ${crt}/lib/crtn.o ''${out}/lib
cp ${crt}/lib/crti.o ''${out}/lib
cp ${libtcc1} ''${out}/lib/libtcc1.a
cp ${libc} ''${out}/lib/libc.a
cp ${libgetopt} ''${out}/lib/libgetopt.a
'';
buildTinyccMes =
{
pname,
version,
src,
prev,
buildOptions,
libtccSources ? [
"${src}/lib/libtcc1.c"
"${src}/lib/va_list.c"
],
libtccObjects ? [
"libtcc1.o"
"va_list.o"
],
libtccBuildOptions,
meta,
}:
let
tccTarget =
{
i686-linux = "I386";
x86_64-linux = "X86_64";
}
.${buildPlatform.system};
options = lib.strings.concatStringsSep " " buildOptions;
libtccOptions = lib.strings.concatStringsSep " " (
[
"-c"
"-D"
"TCC_TARGET_${tccTarget}=1"
]
++ libtccBuildOptions
);
compiler =
kaem.runCommand "${pname}-${version}"
{
inherit pname version meta;
passthru.tests = {
get-version =
result:
kaem.runCommand "${pname}-get-version-${version}" { } ''
${result}/bin/tcc -version
mkdir ''${out}
'';
chain =
result:
kaem.runCommand "${pname}-chain-${version}" { } ''
echo ${prev.compiler.tests.chain or prev.compiler.tests.get-version};
${result}/bin/tcc -version
mkdir ''${out}
'';
};
}
''
catm config.h
mkdir -p ''${out}/bin
${prev.compiler}/bin/tcc \
-B ${prev.libs}/lib \
-g \
-v \
-o ''${out}/bin/tcc \
-D BOOTSTRAP=1 \
${options} \
-I . \
-I ${src} \
-D TCC_TARGET_${tccTarget}=1 \
-D CONFIG_TCCDIR=\"\" \
-D CONFIG_SYSROOT=\"\" \
-D CONFIG_TCC_CRTPREFIX=\"{B}\" \
-D CONFIG_TCC_ELFINTERP=\"\" \
-D CONFIG_TCC_LIBPATHS=\"{B}\" \
-D CONFIG_TCC_SYSINCLUDEPATHS=\"${src}/include:${mes-libc}/include\" \
-D TCC_LIBGCC=\"libc.a\" \
-D TCC_LIBTCC1=\"libtcc1.a\" \
-D CONFIG_TCCBOOT=1 \
-D CONFIG_TCC_STATIC=1 \
-D CONFIG_USE_LIBGCC=1 \
-D TCC_MES_LIBC=1 \
-D TCC_VERSION=\"0.9.28-${version}\" \
-D ONE_SOURCE=1 \
${src}/tcc.c
'';
libs = recompileLibc {
inherit
pname
version
src
libtccOptions
libtccSources
libtccObjects
;
tcc = compiler;
};
in
{
inherit prev compiler libs;
};
}