<?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 arch="default">If building on x86_64, change the default directory name for 64-bit
    libraries to <quote>lib</quote>:</para>

<screen arch="default"><userinput remap="pre">case $(uname -m) in
  x86_64)
    sed -e '/m64=/s/lib64/lib/' -i.orig gcc/config/i386/t-linux64
  ;;
esac</userinput></screen>

    <para arch="ml_32,ml_x32,ml_all">Change the default directory name for the
    libraries:</para>

<screen arch="ml_32,ml_x32,ml_all"><userinput remap="pre">sed -e '/m64=/s/lib64/lib/' \
    -e '/m32=/s/m32=.*/m32=..\/lib32$(call if_multiarch,:i386-linux-gnu)/' \
    -i.orig gcc/config/i386/t-linux64</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 arch="default"><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-libssp                               \
    --disable-libvtv                               \
    --enable-languages=c,c++</userinput></screen>
<screen arch="ml_32,ml_x32,ml_all"><userinput remap="configure" 
    arch="ml_32">mlist=m64,m32</userinput><userinput remap="configure"
    arch="ml_x32">mlist=m64,mx32</userinput><userinput remap="configure"
    arch="ml_all">mlist=m64,m32,mx32</userinput>
<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                           \
    --enable-initfini-array                        \
    --disable-nls                                  \
    --enable-multilib --with-multilib-list=$mlist  \
    --disable-decimal-float                        \
    --disable-libatomic                            \
    --disable-libgomp                              \
    --disable-libquadmath                          \
    --disable-libssp                               \
    --disable-libvtv                               \
    --enable-languages=c,c++</userinput></screen>
<!--
    LDFLAGS_FOR_TARGET="-L$PWD/$LFS_TGT/libgcc -L$PWD/$LFS_TGT/32/libgcc -L$PWD/$LFS_TGT/x32/libgcc" \
-->
    <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>

    </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>