forked from auxolotl/labs
feat: tinycc-musl
This commit is contained in:
parent
8e27d6d87e
commit
3a6d4526a6
|
@ -11,7 +11,7 @@ in {
|
||||||
./nyacc
|
./nyacc
|
||||||
./mes
|
./mes
|
||||||
./ln-boot
|
./ln-boot
|
||||||
./tinycc
|
./tinycc # With the exception of `tinycc-musl` which uses Bash.
|
||||||
./gnupatch
|
./gnupatch
|
||||||
./gnumake
|
./gnumake
|
||||||
./coreutils
|
./coreutils
|
||||||
|
@ -47,6 +47,8 @@ in {
|
||||||
stage1-gnutar-boot = stage1.gnutar.boot.package;
|
stage1-gnutar-boot = stage1.gnutar.boot.package;
|
||||||
stage1-gzip = stage1.gzip.package;
|
stage1-gzip = stage1.gzip.package;
|
||||||
stage1-musl-boot = stage1.musl.boot.package;
|
stage1-musl-boot = stage1.musl.boot.package;
|
||||||
|
stage1-tinycc-musl = stage1.tinycc.musl.compiler.package;
|
||||||
|
stage1-tinycc-musl-libs = stage1.tinycc.musl.libs.package;
|
||||||
};
|
};
|
||||||
|
|
||||||
extras = {
|
extras = {
|
||||||
|
|
|
@ -120,7 +120,7 @@ in {
|
||||||
# Configure
|
# Configure
|
||||||
bash ./configure \
|
bash ./configure \
|
||||||
--prefix=$out \
|
--prefix=$out \
|
||||||
--build=${(builtins.trace platform.build) platform.build} \
|
--build=${platform.build} \
|
||||||
--host=${platform.host} \
|
--host=${platform.host} \
|
||||||
--disable-shared \
|
--disable-shared \
|
||||||
CC=tcc
|
CC=tcc
|
||||||
|
|
|
@ -11,6 +11,7 @@ in {
|
||||||
includes = [
|
includes = [
|
||||||
./boot.nix
|
./boot.nix
|
||||||
./mes.nix
|
./mes.nix
|
||||||
|
./musl.nix
|
||||||
];
|
];
|
||||||
|
|
||||||
options.aux.foundation.stages.stage1.tinycc = {
|
options.aux.foundation.stages.stage1.tinycc = {
|
||||||
|
|
|
@ -8,7 +8,7 @@ args @ {
|
||||||
|
|
||||||
stage1 = config.aux.foundation.stages.stage1;
|
stage1 = config.aux.foundation.stages.stage1;
|
||||||
|
|
||||||
pname = "tinycc-boot";
|
pname = "tinycc-mes";
|
||||||
|
|
||||||
helpers = lib.fp.withDynamicArgs (import ./helpers.nix) args;
|
helpers = lib.fp.withDynamicArgs (import ./helpers.nix) args;
|
||||||
in {
|
in {
|
||||||
|
@ -56,7 +56,7 @@ in {
|
||||||
};
|
};
|
||||||
|
|
||||||
tinycc-mes-boot = helpers.createTinyccMes {
|
tinycc-mes-boot = helpers.createTinyccMes {
|
||||||
pname = "tinycc-mes-boot";
|
pname = "${pname}-boot";
|
||||||
version = stage1.tinycc.version;
|
version = stage1.tinycc.version;
|
||||||
src = cfg.src;
|
src = cfg.src;
|
||||||
args = [
|
args = [
|
||||||
|
@ -83,7 +83,7 @@ in {
|
||||||
};
|
};
|
||||||
in
|
in
|
||||||
helpers.createTinyccMes {
|
helpers.createTinyccMes {
|
||||||
pname = "tinycc-mes";
|
inherit pname;
|
||||||
version = stage1.tinycc.version;
|
version = stage1.tinycc.version;
|
||||||
src = cfg.src;
|
src = cfg.src;
|
||||||
args = [
|
args = [
|
||||||
|
|
177
foundation/src/stages/stage1/tinycc/musl.nix
Normal file
177
foundation/src/stages/stage1/tinycc/musl.nix
Normal file
|
@ -0,0 +1,177 @@
|
||||||
|
args @ {
|
||||||
|
lib,
|
||||||
|
config,
|
||||||
|
}: let
|
||||||
|
cfg = config.aux.foundation.stages.stage1.tinycc.musl;
|
||||||
|
|
||||||
|
builders = config.aux.foundation.builders;
|
||||||
|
|
||||||
|
stage1 = config.aux.foundation.stages.stage1;
|
||||||
|
|
||||||
|
pname = "tinycc-musl";
|
||||||
|
|
||||||
|
helpers = lib.fp.withDynamicArgs (import ./helpers.nix) args;
|
||||||
|
in {
|
||||||
|
options.aux.foundation.stages.stage1.tinycc.musl = {
|
||||||
|
compiler = {
|
||||||
|
package = lib.options.create {
|
||||||
|
type = lib.types.package;
|
||||||
|
description = "The package to use for the tinycc-musl compiler.";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
libs = {
|
||||||
|
package = lib.options.create {
|
||||||
|
type = lib.types.package;
|
||||||
|
description = "The package to use for the tinycc-musl libs.";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
src = lib.options.create {
|
||||||
|
type = lib.types.string;
|
||||||
|
description = "Source for the package.";
|
||||||
|
};
|
||||||
|
|
||||||
|
revision = lib.options.create {
|
||||||
|
type = lib.types.string;
|
||||||
|
description = "Revision of the package.";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = {
|
||||||
|
aux.foundation.stages.stage1.tinycc.musl = let
|
||||||
|
patches = [
|
||||||
|
./patches/ignore-duplicate-symbols.patch
|
||||||
|
./patches/ignore-static-inside-array.patch
|
||||||
|
./patches/static-link.patch
|
||||||
|
];
|
||||||
|
|
||||||
|
tinycc-musl = builders.bash.boot.build {
|
||||||
|
name = "${pname}-${stage1.tinycc.version}";
|
||||||
|
|
||||||
|
meta = stage1.tinycc.meta;
|
||||||
|
|
||||||
|
deps.build.host = [
|
||||||
|
stage1.tinycc.boot.compiler.package
|
||||||
|
stage1.gnupatch.package
|
||||||
|
stage1.gnutar.boot.package
|
||||||
|
stage1.gzip.package
|
||||||
|
];
|
||||||
|
|
||||||
|
script = ''
|
||||||
|
# Unpack
|
||||||
|
tar xzf ${cfg.src}
|
||||||
|
cd tinycc-${builtins.substring 0 7 cfg.revision}
|
||||||
|
|
||||||
|
# Patch
|
||||||
|
${lib.strings.concatMapSep "\n" (file: "patch -Np0 -i ${file}") patches}
|
||||||
|
|
||||||
|
# Configure
|
||||||
|
touch config.h
|
||||||
|
|
||||||
|
# Build
|
||||||
|
# We first have to recompile using tcc-0.9.26 as tcc-0.9.27 is not self-hosting,
|
||||||
|
# but when linked with musl it is.
|
||||||
|
ln -s ${stage1.musl.boot.package}/lib/libtcc1.a ./libtcc1.a
|
||||||
|
|
||||||
|
tcc \
|
||||||
|
-B ${stage1.tinycc.boot.libs.package}/lib \
|
||||||
|
-DC2STR \
|
||||||
|
-o c2str \
|
||||||
|
conftest.c
|
||||||
|
./c2str include/tccdefs.h tccdefs_.h
|
||||||
|
|
||||||
|
tcc -v \
|
||||||
|
-static \
|
||||||
|
-o tcc-musl \
|
||||||
|
-D TCC_TARGET_I386=1 \
|
||||||
|
-D CONFIG_TCCDIR=\"\" \
|
||||||
|
-D CONFIG_TCC_CRTPREFIX=\"{B}\" \
|
||||||
|
-D CONFIG_TCC_ELFINTERP=\"/musl/loader\" \
|
||||||
|
-D CONFIG_TCC_LIBPATHS=\"{B}\" \
|
||||||
|
-D CONFIG_TCC_SYSINCLUDEPATHS=\"${stage1.musl.boot.package}/include\" \
|
||||||
|
-D TCC_LIBGCC=\"libc.a\" \
|
||||||
|
-D TCC_LIBTCC1=\"libtcc1.a\" \
|
||||||
|
-D CONFIG_TCC_STATIC=1 \
|
||||||
|
-D CONFIG_USE_LIBGCC=1 \
|
||||||
|
-D TCC_VERSION=\"0.9.27\" \
|
||||||
|
-D ONE_SOURCE=1 \
|
||||||
|
-D TCC_MUSL=1 \
|
||||||
|
-D CONFIG_TCC_PREDEFS=1 \
|
||||||
|
-D CONFIG_TCC_SEMLOCK=0 \
|
||||||
|
-B . \
|
||||||
|
-B ${stage1.tinycc.boot.libs.package}/lib \
|
||||||
|
tcc.c
|
||||||
|
# libtcc1.a
|
||||||
|
rm -f libtcc1.a
|
||||||
|
tcc -c -D HAVE_CONFIG_H=1 lib/libtcc1.c
|
||||||
|
tcc -ar cr libtcc1.a libtcc1.o
|
||||||
|
|
||||||
|
# Rebuild tcc-musl with itself
|
||||||
|
./tcc-musl \
|
||||||
|
-v \
|
||||||
|
-static \
|
||||||
|
-o tcc-musl \
|
||||||
|
-D TCC_TARGET_I386=1 \
|
||||||
|
-D CONFIG_TCCDIR=\"\" \
|
||||||
|
-D CONFIG_TCC_CRTPREFIX=\"{B}\" \
|
||||||
|
-D CONFIG_TCC_ELFINTERP=\"/musl/loader\" \
|
||||||
|
-D CONFIG_TCC_LIBPATHS=\"{B}\" \
|
||||||
|
-D CONFIG_TCC_SYSINCLUDEPATHS=\"${stage1.musl.boot.package}/include\" \
|
||||||
|
-D TCC_LIBGCC=\"libc.a\" \
|
||||||
|
-D TCC_LIBTCC1=\"libtcc1.a\" \
|
||||||
|
-D CONFIG_TCC_STATIC=1 \
|
||||||
|
-D CONFIG_USE_LIBGCC=1 \
|
||||||
|
-D TCC_VERSION=\"0.9.27\" \
|
||||||
|
-D ONE_SOURCE=1 \
|
||||||
|
-D TCC_MUSL=1 \
|
||||||
|
-D CONFIG_TCC_PREDEFS=1 \
|
||||||
|
-D CONFIG_TCC_SEMLOCK=0 \
|
||||||
|
-B . \
|
||||||
|
-B ${stage1.musl.boot.package}/lib \
|
||||||
|
tcc.c
|
||||||
|
# libtcc1.a
|
||||||
|
rm -f libtcc1.a
|
||||||
|
./tcc-musl -c -D HAVE_CONFIG_H=1 lib/libtcc1.c
|
||||||
|
./tcc-musl -c -D HAVE_CONFIG_H=1 lib/alloca.S
|
||||||
|
./tcc-musl -ar cr libtcc1.a libtcc1.o alloca.o
|
||||||
|
|
||||||
|
# Install
|
||||||
|
install -D tcc-musl $out/bin/tcc
|
||||||
|
install -Dm444 libtcc1.a $out/lib/libtcc1.a
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
revision = "fd6d2180c5c801bb0b4c5dde27d61503059fc97d";
|
||||||
|
|
||||||
|
src = builtins.fetchurl {
|
||||||
|
url = "https://repo.or.cz/tinycc.git/snapshot/${cfg.revision}.tar.gz";
|
||||||
|
sha256 = "R81SNbEmh4s9FNQxCWZwUiMCYRkkwOHAdRf0aMnnRiA=";
|
||||||
|
};
|
||||||
|
|
||||||
|
compiler.package = builders.bash.boot.build {
|
||||||
|
name = "${pname}-${stage1.tinycc.version}-compiler";
|
||||||
|
|
||||||
|
meta = stage1.tinycc.meta;
|
||||||
|
|
||||||
|
script = ''
|
||||||
|
install -D ${tinycc-musl}/bin/tcc $out/bin/tcc
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
libs.package = builders.bash.boot.build {
|
||||||
|
name = "${pname}-${stage1.tinycc.version}-libs";
|
||||||
|
|
||||||
|
meta = stage1.tinycc.meta;
|
||||||
|
|
||||||
|
script = ''
|
||||||
|
mkdir $out
|
||||||
|
cp -r ${stage1.musl.boot.package}/* $out
|
||||||
|
chmod +w $out/lib/libtcc1.a
|
||||||
|
cp ${tinycc-musl}/lib/libtcc1.a $out/lib/libtcc1.a
|
||||||
|
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
--- tccelf.c
|
||||||
|
+++ tccelf.c
|
||||||
|
@@ -710,8 +710,9 @@ ST_FUNC int set_elf_sym(Section *s, addr_t value, unsigned long size,
|
||||||
|
#if 0
|
||||||
|
printf("new_bind=%x new_shndx=%x new_vis=%x old_bind=%x old_shndx=%x old_vis=%x\n",
|
||||||
|
sym_bind, shndx, new_vis, esym_bind, esym->st_shndx, esym_vis);
|
||||||
|
-#endif
|
||||||
|
tcc_error_noabort("'%s' defined twice", name);
|
||||||
|
+#endif
|
||||||
|
+ goto do_patch;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
esym->st_other = other;
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
--- tccgen.c
|
||||||
|
+++ tccgen.c
|
||||||
|
@@ -4941,7 +4941,7 @@ static int post_type(CType *type, AttributeDef *ad, int storage, int td)
|
||||||
|
next();
|
||||||
|
n = -1;
|
||||||
|
t1 = 0;
|
||||||
|
- if (td & TYPE_PARAM) while (1) {
|
||||||
|
+ while (1) {
|
||||||
|
/* XXX The optional type-quals and static should only be accepted
|
||||||
|
in parameter decls. The '*' as well, and then even only
|
||||||
|
in prototypes (not function defs). */
|
||||||
|
@@ -4972,7 +4972,8 @@ static int post_type(CType *type, AttributeDef *ad, int storage, int td)
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
- } else if (tok != ']') {
|
||||||
|
+ }
|
||||||
|
+ if (tok != ']') {
|
||||||
|
if (!local_stack || (storage & VT_STATIC))
|
||||||
|
vpushi(expr_const());
|
||||||
|
else {
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
--- libtcc.c
|
||||||
|
+++ libtcc.c
|
||||||
|
@@ -793,6 +793,7 @@ LIBTCCAPI TCCState *tcc_new(void)
|
||||||
|
|
||||||
|
s->gnu_ext = 1;
|
||||||
|
s->tcc_ext = 1;
|
||||||
|
+ s->static_link = 1;
|
||||||
|
s->nocommon = 1;
|
||||||
|
s->dollars_in_identifiers = 1; /*on by default like in gcc/clang*/
|
||||||
|
s->cversion = 199901; /* default unless -std=c11 is supplied */
|
||||||
|
|
|
@ -29,9 +29,7 @@ in {
|
||||||
expected = "64";
|
expected = "64";
|
||||||
actual = lib.numbers.into.hex 100;
|
actual = lib.numbers.into.hex 100;
|
||||||
in
|
in
|
||||||
(builtins.trace actual)
|
actual == expected;
|
||||||
actual
|
|
||||||
== expected;
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue