patches/gcc/3.3.6/100-fix-fixincl.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Fri Sep 04 17:27:16 2009 +0200 (2009-09-04)
changeset 1512 439a6b292917
permissions -rw-r--r--
TODO: update

Add TODO list for m4, autoconf, automake and libtool.
Building our own versions would remove burden from the users
who have older versions on their distributions, and are not
ready/able/allowed to upgrade.
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