Hello prologic, Michael, Michael Matz wrote in <alpine.lsu.2.21.2004150458590.9...@hell6.fritz.box>: |On Wed, 15 Apr 2020, James Mills wrote: |> I am trying to understand this "invalid type" I keep getting when \ |> trying to |> compile software that wants to pull in syslog.h -- e.g: libressl and most |> recently I also tried util-linux. |> |> You can see the full issue/details |> here: https://github.com/prologic/ulinux/issues/24 | |Well, what declaration or type is on syslog.h:68 ? (Possibly look at |preprocessed output (-E) in case some macro substitution is going on). ... |> I would appreciate some help understanding this syslog.h "invalid type" |> problem. I don't quite get it :) FWIW that line references va_list which | |... ah, oh, see? :) Hmm, so is TCC's stdarg.h really being included, or |is it picking up some other stdarg.h?
On AlpineLinux with musl, at [096c93c], if i add the diff diff --git a/lib/Makefile b/lib/Makefile index 9d74dc3..cb67731 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -11,7 +11,7 @@ X = $(if $(CROSS_TARGET),$(CROSS_TARGET)-) XTCC ?= $(TOP)/$(X)tcc$(EXESUF) XCC = $(XTCC) XAR = $(XTCC) -ar -XFLAGS-unx = -B$(TOPSRC) +XFLAGS-unx = -B$(TOPSRC) -B$(TOPSRC)/include -I$(TOPSRC)/include XFLAGS-win = -B$(TOPSRC)/win32 -I$(TOPSRC)/include XFLAGS = $(XFLAGS$(XCFG)) -I$(TOP) XCFG = $(or $(findstring -win,$T),-unx) diff --git a/lib/bt-log.c b/lib/bt-log.c index 73e0067..d767f08 100644 --- a/lib/bt-log.c +++ b/lib/bt-log.c @@ -1,6 +1,7 @@ /* ------------------------------------------------------------- */ /* function to get a stack backtrace on demand with a message */ +#include <stdarg.h> #include <stdio.h> #include <string.h> then i get to it, if i also include my patches from 2017 diff --git a/libtcc.c b/libtcc.c index fdbe2e7..73b0b05 100644 --- a/libtcc.c +++ b/libtcc.c @@ -922,6 +922,7 @@ LIBTCCAPI TCCState *tcc_new(void) # if defined(TCC_MUSL) tcc_define_symbol(s, "__DEFINED_va_list", ""); tcc_define_symbol(s, "__DEFINED___isoc_va_list", ""); + tcc_define_symbol(s, "__builtin_va_list", "va_list"); tcc_define_symbol(s, "__isoc_va_list", "void *"); # endif /* TCC_MUSL */ /* Some GCC builtins that are simple to express as macros. */ @@ -940,6 +941,7 @@ LIBTCCAPI void tcc_delete(TCCState *s1) dynarray_reset(&s1->crt_paths, &s1->nb_crt_paths); /* free include paths */ + dynarray_reset(&s1->tccinclude_paths, &s1->nb_tccinclude_paths); dynarray_reset(&s1->include_paths, &s1->nb_include_paths); dynarray_reset(&s1->sysinclude_paths, &s1->nb_sysinclude_paths); @@ -983,6 +985,7 @@ LIBTCCAPI int tcc_set_output_type(TCCState *s, int output_type) if (!s->nostdinc) { /* default include paths */ /* -isystem paths have already been handled */ + tcc_add_tccinclude_path(s, CONFIG_TCC_TCCINCLUDEPATHS); tcc_add_sysinclude_path(s, CONFIG_TCC_SYSINCLUDEPATHS); } @@ -1020,6 +1023,12 @@ LIBTCCAPI int tcc_set_output_type(TCCState *s, int output_type) return 0; } +LIBTCCAPI int tcc_add_tccinclude_path(TCCState *s, const char *pathname) +{ + tcc_split_path(s, &s->tccinclude_paths, &s->nb_tccinclude_paths, pathname); + return 0; +} + LIBTCCAPI int tcc_add_include_path(TCCState *s, const char *pathname) { tcc_split_path(s, &s->include_paths, &s->nb_include_paths, pathname); diff --git a/libtcc.h b/libtcc.h index e164f5c..60c87a3 100644 --- a/libtcc.h +++ b/libtcc.h @@ -39,6 +39,9 @@ LIBTCCAPI void tcc_set_options(TCCState *s, const char *str); /*****************************/ /* preprocessor */ +/* add in tcc include path, searched before anything else */ +LIBTCCAPI int tcc_add_tccinclude_path(TCCState *s, const char *pathname); + /* add include path */ LIBTCCAPI int tcc_add_include_path(TCCState *s, const char *pathname); diff --git a/tcc.c b/tcc.c index 34bfa00..fed6dc2 100644 --- a/tcc.c +++ b/tcc.c @@ -183,6 +183,7 @@ static void print_search_dirs(TCCState *s) { printf("install: %s\n", s->tcc_lib_path); /* print_dirs("programs", NULL, 0); */ + print_dirs("tcc-include", s->tccinclude_paths, s->nb_tccinclude_paths); print_dirs("include", s->sysinclude_paths, s->nb_sysinclude_paths); print_dirs("libraries", s->library_paths, s->nb_library_paths); #ifdef TCC_TARGET_PE diff --git a/tcc.h b/tcc.h index a4506f4..1329ffe 100644 --- a/tcc.h +++ b/tcc.h @@ -214,13 +214,20 @@ extern long double strtold (const char *__nptr, char **__endptr); /* Below: {B} is substituted by CONFIG_TCCDIR (rsp. -B option) */ /* system include paths */ +#ifndef CONFIG_TCC_TCCINCLUDEPATHS +# ifdef TCC_TARGET_PE +# define CONFIG_TCC_TCCINCLUDEPATHS "{B}/include"PATHSEP"{B}/include/winapi" +# else +# define CONFIG_TCC_TCCINCLUDEPATHS "{B}/include" +# endif +#endif + #ifndef CONFIG_TCC_SYSINCLUDEPATHS # ifdef TCC_TARGET_PE -# define CONFIG_TCC_SYSINCLUDEPATHS "{B}/include"PATHSEP"{B}/include/winapi" +# define CONFIG_TCC_SYSINCLUDEPATHS "" # else # define CONFIG_TCC_SYSINCLUDEPATHS \ - "{B}/include" \ - ":" ALSO_TRIPLET(CONFIG_SYSROOT "/usr/local/include") \ + ALSO_TRIPLET(CONFIG_SYSROOT "/usr/local/include") \ ":" ALSO_TRIPLET(CONFIG_SYSROOT "/usr/include") # endif #endif @@ -753,7 +760,10 @@ struct TCCState { DLLReference **loaded_dlls; int nb_loaded_dlls; - /* include paths */ + /* include paths, search order */ + char **tccinclude_paths; + int nb_tccinclude_paths; + char **include_paths; int nb_include_paths; diff --git a/tccpp.c b/tccpp.c index 2802d8e..52d46d9 100644 --- a/tccpp.c +++ b/tccpp.c @@ -1809,7 +1809,8 @@ ST_FUNC void preprocess(int is_bof) /* push current file on stack */ *s1->include_stack_ptr++ = file; i = tok == TOK_INCLUDE_NEXT ? file->include_next_index: 0; - n = 2 + s1->nb_include_paths + s1->nb_sysinclude_paths; + n = 2 + s1->nb_tccinclude_paths + s1->nb_include_paths + + s1->nb_sysinclude_paths; for (; i < n; ++i) { char buf1[sizeof file->filename]; CachedInclude *e; @@ -1831,8 +1832,14 @@ ST_FUNC void preprocess(int is_bof) } else { /* search in all the include paths */ - int j = i - 2, k = j - s1->nb_include_paths; - path = k < 0 ? s1->include_paths[j] : s1->sysinclude_paths[k]; + int k, j = i - 2; + + if (j < (k = s1->nb_tccinclude_paths)) + path = s1->tccinclude_paths[j]; + else if ((j -= k) < s1->nb_include_paths) + path = s1->include_paths[j]; + else if ((j -= s1->nb_include_paths) < s1->nb_sysinclude_paths) + path = s1->sysinclude_paths[j]; pstrcpy(buf1, sizeof(buf1), path); pstrcat(buf1, sizeof(buf1), "/"); } which is ugly since there is no equivalent to the -B option which can drive this, but it then works. However, it seems you need more for libressl, so i added for tinycc a new internal header in include/, syslog.h: #ifndef _TINY_SYSLOG_H #define _TINY_SYSLOG_H #include <stdarg.h> #include <syslog.h> #endif /* _TINY_SYSLOG_H */ because musl plays around with va_list in syslog.h. |> I've been able to get other software built that wants to use valist |> successfully be ensuring -I/usr/lib/tcc/include comes first by adding \ |> this |> to an export CFLAGS=... in /etc/pkg.conf (pkg is what builds ports from |> Pkgfile(s)) Ah ja, that and syslog.h wrapper could get you going, until you fail with CCLD libcompat.la ar: `u' modifier ignored since `D' is the default (see `U') CCLD libcrypto.la tcc: error: invalid option -- '--whole-archive' make[2]: *** [Makefile:3904: libcrypto.la] Error 1 make[2]: Leaving directory '/tmp/x/libressl-3.1.0/crypto' make[1]: *** [Makefile:2165: all] Error 2 make[1]: Leaving directory '/tmp/x/libressl-3.1.0/crypto' make: *** [Makefile:453: all-recursive] Error 1 Ciao, out for cycling now :) --steffen | |Der Kragenbaer, The moon bear, |der holt sich munter he cheerfully and one by one |einen nach dem anderen runter wa.ks himself off |(By Robert Gernhardt) _______________________________________________ Tinycc-devel mailing list Tinycc-devel@nongnu.org https://lists.nongnu.org/mailman/listinfo/tinycc-devel