source: chapter05/gcc-pass1.xml@ d568769

ml-11.0 multilib xry111/multilib
Last change on this file since d568769 was 5066dee, checked in by Xℹ Ruoyao <xry111@…>, 3 years ago

MultiLib: Merge changes from trunk

git-svn-id: http://svn.linuxfromscratch.org/LFS/branches/multilib@11623 4aa44e1e-78dd-0310-a6d2-fbcd4c07a689

  • Property mode set to 100644
File size: 13.1 KB
RevLine 
[673b0d8]1<?xml version="1.0" encoding="ISO-8859-1"?>
[b06ca36]2<!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
3 "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
[673b0d8]4 <!ENTITY % general-entities SYSTEM "../general.ent">
5 %general-entities;
6]>
[1f7ca93]7
[1067bac]8<sect1 id="ch-tools-gcc-pass1" role="wrap" xreflabel="gcc-pass1">
[1f7ca93]9 <?dbhtml filename="gcc-pass1.html"?>
10
[e747759]11 <sect1info condition="script">
[714599f]12 <productname>gcc-pass1</productname>
[e747759]13 <productnumber>&gcc-version;</productnumber>
14 <address>&gcc-url;</address>
15 </sect1info>
16
[1f7ca93]17 <title>GCC-&gcc-version; - Pass 1</title>
18
19 <indexterm zone="ch-tools-gcc-pass1">
20 <primary sortas="a-GCC">GCC</primary>
21 <secondary>tools, pass 1</secondary>
22 </indexterm>
23
24 <sect2 role="package">
25 <title/>
[bc82645e]26
[d9441360]27 <xi:include xmlns:xi="http://www.w3.org/2001/XInclude"
[1f7ca93]28 href="../chapter06/gcc.xml"
29 xpointer="xpointer(/sect1/sect2[1]/para[1])"/>
[81fd230]30
[1f7ca93]31 <segmentedlist>
32 <segtitle>&buildtime;</segtitle>
33 <segtitle>&diskspace;</segtitle>
[5888299]34
[1f7ca93]35 <seglistitem>
[e4a5635]36 <seg>&gcc-ch5p1-sbu;</seg>
37 <seg>&gcc-ch5p1-du;</seg>
[1f7ca93]38 </seglistitem>
39 </segmentedlist>
[673b0d8]40
[1f7ca93]41 </sect2>
[73aedd1d]42
[1f7ca93]43 <sect2 role="installation">
[4e82d47]44 <title>Installation of Cross GCC</title>
[73aedd1d]45
[b3f1ebb3]46 <para arch="default">GCC now requires the GMP, MPFR, and MPC packages. As
47 these packages may not be included in your host distribution, they will be
48 built with GCC. Unpack each package into the GCC source directory and
49 rename the resulting directories so the GCC build procedures will
50 automatically use them:</para>
51
[fd48baa]52 <para arch="ml_32,ml_x32,ml_all">GCC now requires the GMP, ISL, MPFR, and MPC packages.
[b3f1ebb3]53 As these packages may not be included in your host distribution, they will
54 be built with GCC. Unpack each package into the GCC source directory and
55 rename the resulting directories so the GCC build procedures will
56 automatically use them:</para>
[6cc0516]57
[3380af3]58 <note><para>There are frequent misunderstandings about this chapter. The
59 procedures are the same as every other chapter as explained earlier (<xref
60 linkend='buildinstr'/>). First extract the gcc tarball from the sources
61 directory and then change to the directory created. Only then should you
62 proceed with the instructions below.</para></note>
63
[b3f1ebb3]64<screen arch="default"><userinput remap="pre">tar -xf ../mpfr-&mpfr-version;.tar.xz
[e311865]65mv -v mpfr-&mpfr-version; mpfr
[ee648fd]66tar -xf ../gmp-&gmp-version;.tar.xz
[b2f3f15]67mv -v gmp-&gmp-version; gmp
[ee648fd]68tar -xf ../mpc-&mpc-version;.tar.gz
[4916842]69mv -v mpc-&mpc-version; mpc</userinput></screen>
[fd48baa]70<screen arch="ml_32,ml_x32,ml_all"><userinput remap="pre">tar -xf ../mpfr-&mpfr-version;.tar.xz
[b3f1ebb3]71mv -v mpfr-&mpfr-version; mpfr
72tar -xf ../gmp-&gmp-version;.tar.xz
73mv -v gmp-&gmp-version; gmp
74tar -xf ../mpc-&mpc-version;.tar.gz
75mv -v mpc-&mpc-version; mpc
76tar -xf ../isl-&isl-version;.tar.xz
77mv -v isl-&isl-version; isl</userinput></screen>
[6cc0516]78
[1a3e6a3]79 <para>The following command will change the location of GCC's default
80 dynamic linker to use the one installed in <filename
81 class="directory">/tools</filename>. It also removes <filename
82 class="directory">/usr/include</filename> from GCC's include search path.
83 Issue:</para>
84
[be3d9f3]85<screen><userinput remap="pre">for file in gcc/config/{linux,i386/linux{,64}}.h
[1a3e6a3]86do
87 cp -uv $file{,.orig}
[b3f1ebb3]88 sed -e 's@/lib\(64\)\?\(32\)\?\(x32\)\?/ld@/tools&amp;@g' \
[1a3e6a3]89 -e 's@/usr@/tools@g' $file.orig &gt; $file
90 touch $file.orig
[5066dee]91done
92sed -e "/^#define[[:blank:]]*STANDARD_STARTFILE_PREFIX_1/ s;\".*\";\"/tools/lib/\";" \
93 -e "/^#define[[:blank:]]*STANDARD_STARTFILE_PREFIX_2/ s;\".*\";\"\";" \
94 -i gcc/gcc.c</userinput></screen>
[1a3e6a3]95
96 <para>In case the above seems hard to follow, let's break it down a bit.
[a05450f]97 First we copy the files <filename>gcc/config/linux.h</filename>,
98 <filename>gcc/config/i386/linux.h</filename>, and
[0d84af1]99 <filename>gcc/config/i368/linux64.h</filename> to a file of
[1a3e6a3]100 the same name but with an added suffix of <quote>.orig</quote>. Then the
101 first sed expression prepends <quote>/tools</quote> to every instance of
102 <quote>/lib/ld</quote>, <quote>/lib64/ld</quote> or
103 <quote>/lib32/ld</quote>, while the second one replaces hard-coded
104 instances of <quote>/usr</quote>. Next, we add our define statements which
105 alter the default startfile prefix to the end of the file. Note that the
106 trailing <quote>/</quote> in <quote>/tools/lib/</quote> is required.
107 Finally, we use <command>touch</command> to update the timestamp on the
108 copied files. When used in conjunction with <command>cp -u</command>, this
109 prevents unexpected changes to the original files in case the commands are
[be3d9f3]110 inadvertently run twice.</para>
111
[b3f1ebb3]112 <para arch="default">Finally, on x86_64 hosts, set the default directory
113 name for 64-bit libraries to <quote>lib</quote>:</para>
[be3d9f3]114
[b3f1ebb3]115<screen arch="default"><userinput remap="pre">case $(uname -m) in
[be3d9f3]116 x86_64)
117 sed -e '/m64=/s/lib64/lib/' \
118 -i.orig gcc/config/i386/t-linux64
119 ;;
120esac</userinput></screen>
121
[9c0c3a0]122<screen arch="ml_32,ml_x32,ml_all"><userinput remap="pre">sed -e '/m64=/s/lib64/lib/' \
123 -e '/m32=/s/m32=.*/m32=..\/lib32$(call if_multiarch,:i386-linux-gnu)/' \
124 -i.orig gcc/config/i386/t-linux64</userinput></screen>
[b3f1ebb3]125
[5f28def]126<!--
[f1c177f]127 <para>GCC doesn't detect stack protection correctly, which causes problems
128 for the build of Glibc-&glibc-version;, so fix that by issuing the following
129 command:</para>
130
131<screen><userinput remap="pre">sed -i '/k prot/agcc_cv_libc_provides_ssp=yes' gcc/configure</userinput></screen>
[5f28def]132-->
133
[238d351]134<!--
[8a8177f9]135 <para>Also fix a problem identified upstream:</para>
136
137<screen><userinput remap="pre">sed -i 's/if \((code.*))\)/if (\1 \&amp;\&amp; \!DEBUG_INSN_P (insn))/' gcc/sched-deps.c</userinput></screen>
[238d351]138-->
[b3f1ebb3]139
140 <!-- Following patch might be obsolete with gcc >= 8.2.1 -->
141 <!-- see: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86724 -->
142 <!-- Fix applied in ch5-gcc-pass{1,2}, ch6-gcc -->
[fd48baa]143 <para arch="ml_32,ml_x32,ml_all">Fix an issue with isl-&isl-version;:</para>
[b3f1ebb3]144
[fd48baa]145<screen arch="ml_32,ml_x32,ml_all"><userinput remap="pre">sed -e "/#include &lt;isl\/schedule_node.h&gt;/ a#include &lt;isl/id.h&gt;\n#include &lt;isl/space.h&gt;" \
[b3f1ebb3]146 -i gcc/graphite.h</userinput></screen>
147
[f1dd547]148 <para>The GCC documentation recommends building GCC
149 in a dedicated build directory:</para>
[3d36131c]150
[f1dd547]151<screen><userinput remap="pre">mkdir -v build
152cd build</userinput></screen>
[73aedd1d]153
[1f7ca93]154 <para>Prepare GCC for compilation:</para>
[73aedd1d]155
[f5ae110a]156<screen><userinput arch="default" remap="configure">mloptions="--disable-multilib"</userinput>
157<userinput arch="ml_32,ml_x32,ml_all" remap="configure">mloptions="--enable-multilib --with-multilib-list=m64"</userinput>
158<userinput arch="ml_32,ml_all" remap="configure">mloptions="$mloptions,m32"</userinput>
159<userinput arch="ml_x32,ml_all" remap="configure">mloptions="$mloptions,mx32"</userinput>
[fd48baa]160<userinput remap="configure">../configure \
[b3f1ebb3]161 --target=$LFS_TGT \
162 --prefix=/tools \
163 --with-glibc-version=2.11 \
164 --with-sysroot=$LFS \
165 --with-newlib \
166 --without-headers \
167 --with-local-prefix=/tools \
168 --with-native-system-header-dir=/tools/include \
169 --disable-nls \
170 --disable-shared \
171 --disable-decimal-float \
172 --disable-threads \
173 --disable-libatomic \
174 --disable-libgomp \
175 --disable-libquadmath \
176 --disable-libssp \
177 --disable-libvtv \
178 --disable-libstdcxx \
[f5ae110a]179 --enable-languages=c,c++ \
180 $mloptions</userinput></screen>
[b3f1ebb3]181
[1f7ca93]182 <variablelist>
183 <title>The meaning of the configure options:</title>
184
[1a3e6a3]185 <varlistentry>
186 <term><parameter>--with-newlib</parameter></term>
187 <listitem>
188 <para>Since a working C library is not yet available, this ensures
189 that the inhibit_libc constant is defined when building libgcc. This prevents
190 the compiling of any code that requires libc support.</para>
191 </listitem>
192 </varlistentry>
193
194 <varlistentry>
195 <term><parameter>--without-headers</parameter></term>
196 <listitem>
197 <para>When creating a complete cross-compiler, GCC requires
198 standard headers compatible with the target system. For our
199 purposes these headers will not be needed. This switch prevents
200 GCC from looking for them.</para>
201 </listitem>
202 </varlistentry>
203
204 <varlistentry>
205 <term><parameter>--with-local-prefix=/tools</parameter></term>
206 <listitem>
207 <para>The local prefix is the location in the system that GCC will search
208 for locally installed include files. The default is <filename>/usr/local</filename>.
209 Setting this to <filename>/tools</filename> helps keep the host location of
210 <filename>/usr/local</filename> out of this GCC's search path.</para>
211 </listitem>
212 </varlistentry>
213
214 <varlistentry>
215 <term><parameter>--with-native-system-header-dir=/tools/include</parameter></term>
216 <listitem>
[0d84af1]217 <para>By default GCC searches <filename>/usr/include</filename> for
218 system headers. In conjunction with the sysroot switch, this would
219 normally translate to <filename>$LFS/usr/include</filename>. However
220 the headers that will be installed in the next two sections will go
221 to <filename>$LFS/tools/include</filename>. This switch ensures that
222 gcc will find them correctly. In the second pass of GCC, this same
223 switch will ensure that no headers from the host system are
224 found.</para>
[1a3e6a3]225 </listitem>
226 </varlistentry>
227
[1f7ca93]228 <varlistentry>
[0eb90658]229 <term><parameter>--disable-shared</parameter></term>
[1f7ca93]230 <listitem>
[c49647b1]231 <para>This switch forces GCC to link its internal libraries
[0eb90658]232 statically. We do this to avoid possible issues with the host
233 system.</para>
[1f7ca93]234 </listitem>
235 </varlistentry>
236
[182d5d3]237 <varlistentry>
[908077d]238 <term><parameter>--disable-decimal-float, --disable-threads,
[cad96bf]239 --disable-libatomic, --disable-libgomp, <!--- -disable-libmpx,-->
[42130d6]240 --disable-libquadmath, --disable-libssp, --disable-libvtv,
241 --disable-libstdcxx</parameter></term>
[182d5d3]242 <listitem>
[8aad4385]243 <para>These switches disable support for the decimal floating point
[cad96bf]244 extension, threading, libatomic, libgomp, <!--libmpx, --> libquadmath, libssp,
[05a0344]245 libvtv, and the C++ standard library respectively. These features
246 will fail to compile when building a cross-compiler and are not
247 necessary for the task of cross-compiling the temporary libc.</para>
[182d5d3]248 </listitem>
249 </varlistentry>
250
[b3f1ebb3]251 <varlistentry arch="default">
[4e82d47]252 <term><parameter>--disable-multilib</parameter></term>
[1f7ca93]253 <listitem>
[4e82d47]254 <para>On x86_64, LFS does not yet support a multilib configuration.
255 This switch is harmless for x86.</para>
[1f7ca93]256 </listitem>
257 </varlistentry>
258
[fd48baa]259 <varlistentry arch="ml_32,ml_x32,ml_all">
[b3f1ebb3]260 <term><parameter>--enable-multilib,
261 --with-multilib-list=m32,m64,mx32</parameter></term>
262 <listitem>
263 <para>LFS now supports a multilib configuration. Enable it for the
264 32bit, the 64-bit, and the mixed mode.</para>
265 </listitem>
266 </varlistentry>
267
[6e88633]268 <varlistentry>
[908077d]269 <term><parameter>--enable-languages=c,c++</parameter></term>
[6e88633]270 <listitem>
[908077d]271 <para>This option ensures that only the C and C++ compilers are built.
272 These are the only languages needed now.</para>
[6e88633]273 </listitem>
274 </varlistentry>
275
[1f7ca93]276 </variablelist>
277
[4e82d47]278 <para>Compile GCC by running:</para>
[b0a4c9a]279
[0445a3d]280<screen><userinput remap="make">make</userinput></screen>
[81fd230]281
[1f7ca93]282 <para>Compilation is now complete. At this point, the test suite would
283 normally be run, but, as mentioned before, the test suite framework is
284 not in place yet. The benefits of running the tests at this point
285 are minimal since the programs from this first pass will soon be
286 replaced.</para>
287
288 <para>Install the package:</para>
[73aedd1d]289
[0445a3d]290<screen><userinput remap="install">make install</userinput></screen>
[e079f16]291<!--
292 <para>Using <parameter>- -disable-shared</parameter> means that the
[0eb90658]293 <filename>libgcc_eh.a</filename> file isn't created and installed. The
294 Glibc package depends on this library as it uses
[4e82d47]295 <parameter>-lgcc_eh</parameter> within its build system. This dependency
296 can be satisfied by creating a symlink to <filename>libgcc.a</filename>,
[0eb90658]297 since that file will end up containing the objects normally contained in
[5f7456b]298 <filename>libgcc_eh.a</filename>:</para>
[0eb90658]299
[5cef314]300<screen><userinput remap="install">ln -sv libgcc.a `$LFS_TGT-gcc -print-libgcc-file-name | sed 's/libgcc/&amp;_eh/'`</userinput></screen>
[e079f16]301-->
[1f7ca93]302 </sect2>
[bc82645e]303
[1f7ca93]304 <sect2 role="content">
305 <title/>
[81fd230]306
[1f7ca93]307 <para>Details on this package are located in
308 <xref linkend="contents-gcc" role="."/></para>
[81fd230]309
[1f7ca93]310 </sect2>
311
312</sect1>
Note: See TracBrowser for help on using the repository browser.