aboutsummaryrefslogtreecommitdiffstats
path: root/chapter06/gcc-pass2.xml
blob: 770f6b187d39c81a90783ce0a48f5315f453f5a1 (plain)
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
184
185
186
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
  "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
  <!ENTITY % general-entities SYSTEM "../general.ent">
  %general-entities;
]>

<sect1 id="ch-tools-gcc-pass2" role="wrap" xreflabel="gcc-pass2">
  <?dbhtml filename="gcc-pass2.html"?>

  <sect1info condition="script">
    <productname>gcc-pass2</productname>
    <productnumber>&gcc-version;</productnumber>
    <address>&gcc-url;</address>
  </sect1info>

  <title>GCC-&gcc-version; - Pass 2</title>

  <indexterm zone="ch-tools-gcc-pass2">
    <primary sortas="a-GCC">GCC</primary>
    <secondary>tools, pass 2</secondary>
  </indexterm>

  <sect2 role="package">
    <title/>

    <xi:include xmlns:xi="http://www.w3.org/2001/XInclude"
    href="../chapter08/gcc.xml"
    xpointer="xpointer(/sect1/sect2[1]/para[1])"/>

    <segmentedlist>
      <segtitle>&buildtime;</segtitle>
      <segtitle>&diskspace;</segtitle>

      <seglistitem>
        <seg>&gcc-tmpp2-sbu;</seg>
        <seg>&gcc-tmpp2-du;</seg>
      </seglistitem>
    </segmentedlist>

  </sect2>

  <sect2 role="installation">
    <title>Installation of GCC</title>
<!--
    <para>First fix a problem with the latest version of glibc:</para>

    <screen><userinput remap="pre">patch -Np1 -i ../&gcc-upstream-fixes-patch;</userinput></screen>
-->
    <para>As in the first build of GCC, the GMP, MPFR, and MPC packages are
    required. Unpack the tarballs and move them into the required directories:</para>

<screen><userinput remap="pre">tar -xf ../mpfr-&mpfr-version;.tar.xz
mv -v mpfr-&mpfr-version; mpfr
tar -xf ../gmp-&gmp-version;.tar.xz
mv -v gmp-&gmp-version; gmp
tar -xf ../mpc-&mpc-version;.tar.gz
mv -v mpc-&mpc-version; mpc</userinput></screen>

    <para>On ARM64 hosts, set the default directory name for
    64-bit libraries to <quote>lib</quote>:</para>

<screen><userinput remap="pre">sed -e '/lp64=/s/lib64/lib/' \
    -i.orig gcc/config/aarch64/t-aarch64-linux</userinput></screen>

    <para>Override the building rule of libgcc and libstdc++ headers, to
    allow building these libraries with POSIX threads support:</para>

<screen><userinput remap="pre">sed '/thread_header =/s/@.*@/gthr-posix.h/' \
    -i libgcc/Makefile.in libstdc++-v3/include/Makefile.in</userinput></screen>

    <para>Create a separate build directory again:</para>

<screen><userinput remap="pre">mkdir -v build
cd       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 remap="configure">../configure                                       \
    --build=$(../config.guess)                     \
    --host=$LFS_TGT                                \
    --target=$LFS_TGT                              \
    LDFLAGS_FOR_TARGET=-L$PWD/$LFS_TGT/libgcc      \
    --prefix=/usr                                  \
    --with-build-sysroot=$LFS                      \
    --enable-default-pie                           \
    --enable-default-ssp                           \
    --disable-nls                                  \
    --disable-multilib                             \
    --disable-libatomic                            \
    --disable-libgomp                              \
    --disable-libquadmath                          \
    --disable-libsanitizer                         \
    --disable-libssp                               \
    --disable-libvtv                               \
    --enable-languages=c,c++</userinput></screen>

    <variablelist>
      <title>The meaning of the new configure options:</title><!-- WIP -->

      <varlistentry>
        <term><parameter>--with-build-sysroot=$LFS</parameter></term>
        <listitem>
          <para>Normally, using <parameter>--host</parameter> ensures that
          a cross-compiler is used for building GCC, and that compiler knows
          that it has to look for headers and libraries in <filename
          class="directory">$LFS</filename>. But the build system for GCC uses
          other tools, which are not aware of this location. This switch is
          needed so those tools will find the needed files in <filename
          class="directory">$LFS</filename>, and not on the host.</para>
        </listitem>
      </varlistentry>

      <varlistentry>
        <term><parameter>--target=$LFS_TGT</parameter></term>
        <listitem>
          <para>We are cross-compiling GCC, so it's impossible to build
          target libraries (<filename class="libraryfile">libgcc</filename>
          and <filename class="libraryfile">libstdc++</filename>) with the
          previously compiled GCC binaries&mdash;those binaries won't run on the
          host.  The GCC build system will attempt to use the host's
          C and C++ compilers as a workaround by default.
          Building the GCC target libraries with a different
          version of GCC is not supported, so using the host's compilers may cause
          the build to fail. This parameter ensures the libraries are built by GCC
          pass 1.</para>
        </listitem>
      </varlistentry>

      <varlistentry>
        <term><parameter>LDFLAGS_FOR_TARGET=...</parameter></term>
        <listitem>
          <para>Allow <filename class="libraryfile">libstdc++</filename> to
          use the shared <filename class="libraryfile">libgcc</filename> being
          built in this pass, instead of the static version that was built in GCC
          pass 1. This is necessary to support C++ exception
          handling.</para>
        </listitem>
      </varlistentry>

      <varlistentry>
        <term><parameter>--disable-libsanitizer</parameter></term>
        <listitem>
          <para>Disable GCC sanitizer runtime libraries.  They are not
          needed for the temporary installation.  This switch is necessary
          to build GCC without
          <systemitem class='library'>libcrypt</systemitem> installed for
          the target.  In <xref linkend='ch-tools-gcc-pass1'/> it was
          implied by <parameter>--disable-libstdcxx</parameter>, but now we
          have to explicitly pass it.</para>
        </listitem>
      </varlistentry>

    </variablelist>

    <para>Compile the package:</para>

<screen><userinput remap="make">make</userinput></screen>

    <para>Install the package:</para>

<screen><userinput remap="install">make DESTDIR=$LFS install</userinput></screen>

    <para>As a finishing touch, create a utility symlink. Many programs and scripts
    run <command>cc</command> instead of <command>gcc</command>, which is
    used to keep programs generic and therefore usable on all kinds of UNIX
    systems where the GNU C compiler is not always installed. Running
    <command>cc</command> leaves the system administrator free to decide
    which C compiler to install:</para>

<screen><userinput remap="install">ln -sv gcc $LFS/usr/bin/cc</userinput></screen>

  </sect2>

  <sect2 role="content">
    <title/>

    <para>Details on this package are located in
    <xref linkend="contents-gcc" role="."/></para>

  </sect2>

</sect1>