patches/gcc/4.0.0/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.[01] into a clean $PREFIX (the only two I've tried like this),
yann@402
     6
the configure script happily copies the glibc include files from include to sys-include;
yann@402
     7
here's the line from the log file (with $PREFIX instead of the real prefix):
yann@402
     8
yann@402
     9
Copying $PREFIX/i686-unknown-linux-gnu/include to $PREFIX/i686-unknown-linux-gnu/sys-include
yann@402
    10
yann@402
    11
But later, when running fixincludes, it gives the error message
yann@402
    12
 The directory that should contain system headers does not exist:
yann@402
    13
  $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/../../../../i686-unknown-linux-gnu/sys-include
yann@402
    14
yann@402
    15
Nevertheless, it continues building; the header files it installs in
yann@402
    16
 $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/include
yann@402
    17
do not include the boilerplate that would cause it to #include_next the
yann@402
    18
glibc headers in the system header directory.
yann@402
    19
Thus the resulting toolchain can't compile the following program:
yann@402
    20
#include <limits.h>
yann@402
    21
int x = PATH_MAX;
yann@402
    22
because its limits.h doesn't include the glibc header.
yann@402
    23
yann@402
    24
That's not nice.  I suspect the problem is that gcc/Makefile.in assumes that
yann@402
    25
it can refer to $PREFIX/i686-unknown-linux-gnu  with the path 
yann@402
    26
                $PREFIX/lib/../i686-unknown-linux-gnu, but
yann@402
    27
that fails because the directory $PREFIX/lib doesn't exist during 'make all';
yann@402
    28
it is only created later, during 'make install'.  (Which makes this problem
yann@402
    29
confusing, since one only notices the breakage well after 'make install',
yann@402
    30
at which point the path configure complained about does exist, and has the
yann@402
    31
right stuff in it.)
yann@402
    32
yann@402
    33
A possible fix is to replace the line in gcc/Makefile.in that says
yann@402
    34
    SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@
yann@402
    35
with a version that gets rid of extra ..'s, e.g.
yann@402
    36
    SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,,;ta"`
yann@402
    37
(hey, that's the first time I've ever used a label in a sed script; thanks to the sed faq
yann@402
    38
for explaining the :a ... ta method of looping to repeat a search-and-replace until it doesn't match.)
yann@402
    39
yann@402
    40
[rediffed against gcc-4.0.0]
yann@402
    41
yann@402
    42
--- gcc-4.0.0/gcc/Makefile.in.orig	2005-04-04 12:45:13.000000000 -0700
yann@402
    43
+++ gcc-4.0.0/gcc/Makefile.in	2005-05-20 12:33:43.000000000 -0700
yann@402
    44
@@ -378,7 +378,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
@@ -2838,13 +2841,15 @@
yann@402
    57
 ../$(build_subdir)/fixincludes/fixincl: ; @ :
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: gsyslimits.h macro_list \
yann@402
    63
   ../$(build_subdir)/fixincludes/fixincl \
yann@402
    64
   ../$(build_subdir)/fixincludes/fixinc.sh
yann@402
    65
 	@if test ! -d ${SYSTEM_HEADER_DIR}; then \
yann@402
    66
 	  echo The directory that should contain system headers does not exist: >&2 ; \
yann@402
    67
 	  echo "  ${SYSTEM_HEADER_DIR}" >&2 ; \
yann@402
    68
-	  if test "x${SYSTEM_HEADER_DIR}" = "x${gcc_tooldir}/sys-include"; \
yann@402
    69
+	  if test "x${SYSTEM_HEADER_DIR}" = "x`echo "${gcc_tooldir}/sys-include" | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`"; \
yann@402
    70
 	  then sleep 1; else exit 1; fi; \
yann@402
    71
 	fi
yann@402
    72
 	rm -rf include; mkdir include