1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
|
<sect1 id="ch-tools-gcc-pass2">
<title>Installing GCC-&gcc-version; - Pass 2</title>
<?dbhtml filename="gcc-pass2.html" dir="chapter05"?>
<screen>&buildtime; &gcc-time-tools-pass2;
&diskspace; &gcc-compsize-tools-pass2;</screen>
&aa-gcc-down;
&aa-gcc-dep;
<sect2><title> </title><para> </para></sect2>
<sect2>
<title>Re-installation of GCC</title>
<para>The tools required to test GCC and Binutils are installed now: Tcl,
Expect and DejaGnu. Therefore we can now rebuild GCC and Binutils, linking
them against the new Glibc, and test them properly (if running the test suites
in this chapter). One thing to note, however, is that these test suites are
highly dependent on properly functioning pseudo terminals (PTYs) which are
provided by your host. These days, PTYs are most commonly implemented via the
<emphasis>devpts</emphasis> file system. You can quickly check if your host
system is set up correctly in this regard by performing a simple test:</para>
<screen><userinput>expect -c "spawn ls"</userinput></screen>
<para>The response might be:</para>
<blockquote><screen>The system has no more ptys. Ask your system administrator to create more.</screen></blockquote>
<para>If you receive the above message, your host doesn't have its PTYs set up
properly. In this case there is no point in running the test suites for GCC
and Binutils until you are able to resolve the issue. You can consult the LFS
Wiki at <ulink url="&wiki-root;"/> for more information on how to get PTYs
working.</para>
<para>This time we will build both the C and the C++ compilers, so you'll have
to unpack both the core and the g++ tarballs (and testsuite too, if you want to
run the tests). Unpacking them in your working directory, they will all unfold
into a single <filename>&gcc-dir;/</filename> subdirectory.</para>
<para>First correct a problem and make an essential adjustment:</para>
<screen><userinput>patch -Np1 -i ../&gcc-nofixincludes-patch;
patch -Np1 -i ../&gcc-specs-patch;</userinput></screen>
<para>The first patch disables the GCC "fixincludes" script. We mentioned this
briefly earlier, but a slightly more in-depth explanation of the fixincludes
process is warranted here. Under normal circumstances, the GCC fixincludes
script scans your system for header files that need to be fixed. It might find
that some Glibc header files on your host system need to be fixed, fix them and
put them in the GCC private include directory. Then, later on in
<xref linkend="chapter-building-system"/>, after we've installed the newer Glibc, this
private include directory would be searched before the system include
directory, resulting in GCC finding the fixed headers from the host system,
which would most likely not match the Glibc version actually used for the LFS
system.</para>
<para>The second patch changes GCC's default location of the dynamic linker
(typically <filename>ld-linux.so.2</filename>). It also removes
<filename class="directory">/usr/include</filename> from GCC's include search
path. Patching now rather than adjusting the specs file after installation
ensures that our new dynamic linker gets used during the actual build of GCC.
That is, all the final (and temporary) binaries created during the build will
link against the new Glibc.</para>
<important><para>The above patches are <emphasis>critical</emphasis> in ensuring
a successful overall build. Do not forget to apply them.</para></important>
<para>Create a separate build directory again:</para>
<screen><userinput>mkdir ../gcc-build
cd ../gcc-build</userinput></screen>
<para>Before starting to build GCC, remember to unset any environment
variables that override the default optimization flags.</para>
<para>Now prepare GCC for compilation:</para>
<screen><userinput>../&gcc-dir;/configure --prefix=/tools \
--with-local-prefix=/tools \
--enable-clocale=gnu --enable-shared \
--enable-threads=posix --enable-__cxa_atexit \
--enable-languages=c,c++</userinput></screen>
<para>The meaning of the new configure options:</para>
<itemizedlist>
<listitem><para><userinput>--enable-clocale=gnu</userinput>: This option
ensures the correct locale model is selected for the C++ libraries under all
circumstances. If the configure script finds the <emphasis>de_DE</emphasis>
locale installed, it will select the correct <emphasis>gnu</emphasis> locale
model. However, people who don't install the <emphasis>de_DE</emphasis> locale
would run the risk of building ABI incompatible C++ libraries due to the wrong
<emphasis>generic</emphasis> locale model being selected.</para></listitem>
<listitem><para><userinput>--enable-threads=posix</userinput>: This enables
C++ exception handling for multi-threaded code.</para></listitem>
<listitem><para><userinput>--enable-__cxa_atexit</userinput>: This option
allows use of __cxa_atexit, rather than atexit, to register C++ destructors for
local statics and global objects and is essential for fully standards-compliant
handling of destructors. It also affects the C++ ABI and therefore results in
C++ shared libraries and C++ programs that are interoperable with other Linux
distributions.</para></listitem>
<listitem><para><userinput>--enable-languages=c,c++</userinput>: This option
ensures that both the C and C++ compilers are built.</para></listitem>
</itemizedlist>
<para>Compile the package:</para>
<screen><userinput>make</userinput></screen>
<para>There is no need to use the <emphasis>bootstrap</emphasis> target now,
as the compiler we're using to compile this GCC was built from the exact same
version of the GCC sources we used earlier.</para>
<para>Compilation is now complete. As mentioned earlier, we don't recommend
running the test suites for the temporary tools here in this chapter. If you
still want to run the GCC test suite anyway, the following command will do
so:</para>
<screen><userinput>make -k check</userinput></screen>
<para>The <emphasis>-k</emphasis> flag is used to make the test suite run
through to completion and not stop at the first failure. The GCC test suite is
very comprehensive and is almost guaranteed to generate a few failures. To get
a summary of the test suite results, run this:</para>
<screen><userinput>../&gcc-dir;/contrib/test_summary</userinput></screen>
<para>(For just the summaries, pipe the output through
<userinput>grep -A7 Summ</userinput>.)</para>
<para>You can compare your results to those posted to the gcc-testresults
mailing list for similar configurations to your own. For an example of how
current GCC-&gcc-version; should look on i686-pc-linux-gnu, see
<ulink url="http://gcc.gnu.org/ml/gcc-testresults/2004-01/msg00826.html"/>.</para>
<para>Note that the results contain:</para>
<screen>* 1 XPASS (unexpected pass) for g++
* 1 FAIL (unexpected failure) for gcc
* 24 XPASS's for libstdc++</screen>
<para>The unexpected pass for g++ is due to the use of
<emphasis>--enable-__cxa_atexit</emphasis>. Apparently not all platforms
supported by GCC have support for "__cxa_atexit" in their C libraries, so this
test is not always expected to pass.</para>
<para>The 24 unexpected passes for libstdc++ are due to the use of
<emphasis>--enable-clocale=gnu</emphasis>. This option, which is the correct
choice on Glibc-based systems of versions 2.2.5 and above, enables in the GNU C
library a locale support that is superior to the otherwise selected
<emphasis>generic</emphasis> model (which may be applicable if for instance you
were using Newlibc, Sun-libc or whatever other libc). The libstdc++ test suite
is apparently expecting the <emphasis>generic</emphasis> model, hence those
tests are not always expected to pass.</para>
<para>Having a few unexpected failures often cannot be avoided. The GCC
developers are usually aware of these, but haven't yet gotten around to fixing
them. In short, unless your results are vastly different from those at the
above URL, it is safe to continue.</para>
<para>And finally install the package:</para>
<screen><userinput>make install</userinput></screen>
<note><para>At this point it is strongly recommended to repeat the sanity check
we performed earlier in this chapter. Refer back to
<xref linkend="ch-tools-adjusting"/> and repeat the little test compilation. If
the result is wrong, then most likely you forgot to apply the above mentioned
GCC Specs patch.</para></note>
</sect2>
<sect2><title> </title><para> </para>
<para>The details on this package are found in <xref linkend="contents-gcc"/>.</para>
<para> </para></sect2>
</sect1>
|