gcc-pass2.xml 8.4 KB

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