Hi all.
The reported problem appeared with r118356 when some C99 related inline
changes were introduced. Fixinclude hacks `glibc_c99_inline_[1234]` were
introduced and adapted by Geoffrey and Richard respectively, to deal with
broken headers. Later, PR29867 was filed, it seemed that more headers needed
additional treatment. A closer look at some of the files involved in above
mentioned hacks, especially features.h which should be fixed by
`glibc_c99_inline_1`, gave that, this specific fix was never applied, thus
__USE_EXTERN_INLINES became defined therefore pulling in all those headers
that shouldn't, e.g. mathinline.h from math.h (see also PR30008). This again,
resulted in thousands of errors (as reported).
The reason `glibc_c99_inline_1` was never applied are non-standard file
locations. On my system (debian), e.g.:
$> cat /usr/include/features.h
#ifdef __x86_64__
#include <x86_64-linux/features.h>
#endif
#ifdef __i386__
#include <i486-linux/features.h>
#endif
The same holds for Roger's gentoo system, here the path are nested even deeper
(see attachment to PR29867). The hacks `glibc_c99_inline_[1234]` apply
correctly if used in /usr/include/<ditro-specific-path>/<files> instead
of /usr/include/<files> (bootstrapped and regtested r120053). Thus, the
attached patch is straighforward and lists all known file locations - which,
in turn, invalidates it. Any other distribution may add other paths, which
would give the same reports again and again.
Is there any mechanism in fixincludes that allows for a file at arbitrary
positions within /usr/include? I could not find one. Internally, fixincl.c
uses strstr() to check whether a path matches, no help there. Applying the
fixes to all files would presumely result in a couple of false positives as
e.g. `glibc_c99_inline_3` matches a few times within the tree.
Any hints how to proceed? Bruce?
Regards
Daniel
Index: inclhack.def
===================================================================
--- inclhack.def (revision 120053)
+++ inclhack.def (working copy)
@@ -1295,6 +1295,10 @@
fix = {
hackname = glibc_c99_inline_1;
files = features.h;
+ files = i486-linux/features.h;
+ files = x86_64-linux/features.h;
+ files = gentoo-multilib/x86/features.h;
+ files = gentoo-multilib/amd64/features.h;
select = "^ *&& !defined __OPTIMIZE_SIZE__ && !defined __NO_INLINE__$";
c_fix = format;
c_fix_arg = "%0 && __STDC_VERSION__ < 199901L";
@@ -1315,6 +1319,10 @@
fix = {
hackname = glibc_c99_inline_2;
files = sys/stat.h;
+ files = i486-linux/sys/stat.h;
+ files = x86_64-linux/sys/stat.h;
+ files = gentoo-multilib/x86/sys/stat.h;
+ files = gentoo-multilib/amd64/sys/stat.h;
select = "extern __inline__ int";
sed = "s/extern int \\(stat\\|lstat\\|fstat\\|mknod\\)/"
"#if __STDC_VERSION__ < 199901L\\\nextern\\\n#endif\\\n"
@@ -1337,6 +1345,10 @@
fix = {
hackname = glibc_c99_inline_3;
files = bits/string2.h;
+ files = i486-linux/bits/string2.h;
+ files = x86_64-linux/bits/string2.h;
+ files = gentoo-multilib/x86/bits/string2.h;
+ files = gentoo-multilib/amd64/bits/string2.h;
bypass = "__STDC_VERSION__";
c_fix = format;
c_fix_arg = "# if defined(__cplusplus) || __STDC_VERSION__ >= 19901L";
@@ -1354,6 +1366,10 @@
fix = {
hackname = glibc_c99_inline_4;
files = sys/sysmacros.h;
+ files = i486-linux/sys/sysmacros.h;
+ files = x86_64-linux/sys/sysmacros.h;
+ files = gentoo-multilib/x86/sys/sysmacros.h;
+ files = gentoo-multilib/amd64/sys/sysmacros.h;
bypass = "__STDC_VERSION__";
c_fix = format;
c_fix_arg = "\n#if __STDC_VERSION__ < 19901L\nextern\n#endif\n";