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
|