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.
159 lines
4.3 KiB
Nix
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;
|
|
};
|
|
}
|