patches/gcc/3.3.6/100-fix-fixincl.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Apr 26 10:47:00 2009 +0000 (2009-04-26)
branch1.4
changeset 1307 39b1c755f19b
permissions -rw-r--r--
1.4: update version to 1.4.0.

-------- diffstat follows --------
/branches/1.4/.version | 2 1 1 0 +-
1 file changed, 1 insertion(+), 1 deletion(-)
yann@402
     1
See http://gcc.gnu.org/PR22541
yann@402
     2
yann@402
     3
From: Dan Kegel
yann@402
     4
yann@402
     5
When building gcc-3.4.3 or gcc-4.0.0 as a cross into a clean $PREFIX
yann@402
     6
(the only two I've tried like this), the configure script happily copies
yann@402
     7
the glibc include files from include to sys-include; here's the line
yann@402
     8
from the log file (with $PREFIX instead of the real prefix):
yann@402
     9
yann@402
    10
Copying $PREFIX/i686-unknown-linux-gnu/include to $PREFIX/i686-unknown-linux-gnu/sys-include
yann@402
    11
yann@402
    12
But later, when running fixincludes, it gives the error message
yann@402
    13
 The directory that should contain system headers does not exist:
yann@402
    14
  $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/../../../../i686-unknown-linux-gnu/sys-include
yann@402
    15
yann@402
    16
Nevertheless, it continues building; the header files it installs in
yann@402
    17
 $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/include
yann@402
    18
do not include the boilerplate that would cause it to #include_next the
yann@402
    19
glibc headers in the system header directory.
yann@402
    20
Thus the resulting toolchain can't compile the following program:
yann@402
    21
#include <limits.h>
yann@402
    22
int x = PATH_MAX;
yann@402
    23
because its limits.h doesn't include the glibc header.
yann@402
    24
yann@402
    25
That's not nice.  I suspect the problem is that gcc/Makefile.in assumes that
yann@402
    26
it can refer to $PREFIX/i686-unknown-linux-gnu  with the path 
yann@402
    27
                $PREFIX/lib/../i686-unknown-linux-gnu, but
yann@402
    28
that fails because the directory $PREFIX/lib doesn't exist during 'make all';
yann@402
    29
it is only created later, during 'make install'.  (Which makes this problem
yann@402
    30
confusing, since one only notices the breakage well after 'make install',
yann@402
    31
at which point the path configure complained about does exist, and has the
yann@402
    32
right stuff in it.)
yann@402
    33
yann@402
    34
A possible fix is to replace the line in gcc/Makefile.in that says
yann@402
    35
    SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@
yann@402
    36
with a version that gets rid of extra ..'s, e.g.
yann@402
    37
    SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,,;ta"`
yann@402
    38
(hey, that's the first time I've ever used a label in a sed script; thanks to the sed faq
yann@402
    39
for explaining the :a ... ta method of looping to repeat a search-and-replace until it doesn't match.)
yann@402
    40
yann@402
    41
yann@402
    42
--- gcc-3.4.3/gcc/Makefile.in.foo	2005-05-20 11:41:39.000000000 -0700
yann@402
    43
+++ gcc-3.4.3/gcc/Makefile.in	2005-05-20 12:08:46.000000000 -0700
yann@402
    44
@@ -350,7 +350,10 @@
yann@402
    45
 CROSS_SYSTEM_HEADER_DIR = @CROSS_SYSTEM_HEADER_DIR@
yann@402
    46
 
yann@402
    47
 # autoconf sets SYSTEM_HEADER_DIR to one of the above.
yann@402
    48
-SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@
yann@402
    49
+# Purge it of unneccessary internal relative paths
yann@402
    50
+# to directories that might not exist yet.
yann@402
    51
+# The sed idiom for this is to repeat the search-and-replace until it doesn't match, using :a ... ta.
yann@402
    52
+SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`
yann@402
    53
 
yann@402
    54
 # Control whether to run fixproto and fixincludes.
yann@402
    55
 STMP_FIXPROTO = @STMP_FIXPROTO@
yann@402
    56
@@ -2532,11 +2535,13 @@
yann@402
    57
 	$(SHELL) ${srcdir}/mkinstalldirs $(DESTDIR)$(gcc_tooldir)
yann@402
    58
 
yann@402
    59
 # Build fixed copies of system files.
yann@402
    60
+# Abort if no system headers available, unless building a crosscompiler.
yann@402
    61
+# FIXME: abort unless building --without-headers would be more accurate and less ugly
yann@402
    62
 stmp-fixinc: fixinc.sh gsyslimits.h
yann@402
    63
 	@if test ! -d ${SYSTEM_HEADER_DIR}; then \
yann@402
    64
 	  echo The directory that should contain system headers does not exist: >&2 ; \
yann@402
    65
 	  echo "  ${SYSTEM_HEADER_DIR}" >&2 ; \
yann@402
    66
-	  if test "x${SYSTEM_HEADER_DIR}" = "x${gcc_tooldir}/sys-include"; \
yann@402
    67
+	  if test "x${SYSTEM_HEADER_DIR}" = "x`echo "${gcc_tooldir}/sys-include" | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`"; \
yann@402
    68
 	  then sleep 1; else exit 1; fi; \
yann@402
    69
 	fi
yann@402
    70
 	rm -rf include; mkdir include