patches/gcc/4.1.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
parent 402 197e1b49586e
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.x into a clean $PREFIX,
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
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 fix that I've been using for a while is to use sed to canonicalize
yann@402
    34
the path.  The sed syntax is a bit obtuse, but it works. 
yann@402
    35
yann@402
    36
(hey, that's the first time I've ever used a label in a sed script; thanks to the sed faq
yann@402
    37
for explaining the :a ... ta method of looping to repeat a search-and-replace until it doesn't match.)
yann@402
    38
yann@402
    39
[rediffed against gcc-4.1-20060210]
yann@402
    40
yann@402
    41
--- gcc-4.1-20060210/gcc/Makefile.in.old	2006-01-11 06:29:29.000000000 -0800
yann@402
    42
+++ gcc-4.1-20060210/gcc/Makefile.in	2006-02-14 16:08:54.000000000 -0800
yann@402
    43
@@ -388,7 +388,10 @@
yann@402
    44
 CROSS_SYSTEM_HEADER_DIR = @CROSS_SYSTEM_HEADER_DIR@
yann@402
    45
 
yann@402
    46
 # autoconf sets SYSTEM_HEADER_DIR to one of the above.
yann@402
    47
-SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@
yann@402
    48
+# Purge it of unneccessary internal relative paths
yann@402
    49
+# to directories that might not exist yet.
yann@402
    50
+# The sed idiom for this is to repeat the search-and-replace until it doesn't match, using :a ... ta.
yann@402
    51
+SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`
yann@402
    52
 
yann@402
    53
 # Control whether to run fixproto and fixincludes.
yann@402
    54
 STMP_FIXPROTO = @STMP_FIXPROTO@
yann@402
    55
@@ -3167,13 +3170,15 @@
yann@402
    56
 ../$(build_subdir)/fixincludes/fixincl: ; @ :
yann@402
    57
 
yann@402
    58
 # Build fixed copies of system files.
yann@402
    59
+# Abort if no system headers available, unless building a crosscompiler.
yann@402
    60
+# Canonicalize $gcc_tooldir/sys-include in same way as $SYSTEM_HEADER_DIR was canonicalized so test still works
yann@402
    61
 stmp-fixinc: gsyslimits.h macro_list \
yann@402
    62
   $(build_objdir)/fixincludes/fixincl \
yann@402
    63
   $(build_objdir)/fixincludes/fixinc.sh
yann@402
    64
 	@if ! $(inhibit_libc) && test ! -d ${SYSTEM_HEADER_DIR}; then \
yann@402
    65
 	  echo The directory that should contain system headers does not exist: >&2 ; \
yann@402
    66
 	  echo "  ${SYSTEM_HEADER_DIR}" >&2 ; \
yann@402
    67
-	  if test "x${SYSTEM_HEADER_DIR}" = "x${gcc_tooldir}/sys-include"; \
yann@402
    68
+	  if test "x${SYSTEM_HEADER_DIR}" = "x`echo "${gcc_tooldir}/sys-include" | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`"; \
yann@402
    69
 	  then sleep 1; else exit 1; fi; \
yann@402
    70
 	fi
yann@402
    71
 	rm -rf include; mkdir include