mirror of
https://git.linuxfromscratch.org/lfs.git
synced 2025-08-03 01:55:46 +01:00
This is the issue preventing us from cross-compiling libstdc++ in Chapter 6. By fixing this issue we can remove a seperate pass 2 for libstdc++ and simplify the instruction. The upstream fix will be released in 11.3 and 12.0, so we can remove the first sed upgrading gcc next time.
166 lines
5.8 KiB
XML
166 lines
5.8 KiB
XML
<?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>As in the first build of GCC, the GMP, ISL, MPFR, and MPC packages are
|
|
required. Unpack the tarballs and move them into the required directory
|
|
names:</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
|
|
tar -xf ../isl-&isl-version;.tar.xz
|
|
mv -v isl-&isl-version; isl</userinput></screen>
|
|
|
|
|
|
<para>If building on aarch64, change the default directory name for 64-bit
|
|
libraries to <quote>lib</quote>:</para>
|
|
|
|
<screen><userinput remap="pre">case $(uname -m) in
|
|
aarch64)
|
|
sed -e '/mabi.lp64=/s/lib64/lib/' \
|
|
-i.orig gcc/config/aarch64/t-aarch64-linux
|
|
;;
|
|
esac</userinput></screen>
|
|
|
|
<!-- https://gcc.gnu.org/PR100017 -->
|
|
<para>Fix an issue causing failure cross-compiling libstdc++:</para>
|
|
|
|
<screen><userinput remap="pre">sed 's/gnu++17/& -nostdinc++/' \
|
|
-i libstdc++-v3/src/c++17/Makefile.in</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 \
|
|
--prefix=/usr \
|
|
CC_FOR_TARGET=$LFS_TGT-gcc \
|
|
CXX_FOR_TARGET=$LFS_TGT-g++ \
|
|
LDFLAGS_FOR_TARGET=-L$PWD/$LFS_TGT/libgcc \
|
|
--with-build-sysroot=$LFS \
|
|
--enable-initfini-array \
|
|
--disable-nls \
|
|
--disable-multilib \
|
|
--disable-decimal-float \
|
|
--disable-libatomic \
|
|
--disable-libgomp \
|
|
--disable-libquadmath \
|
|
--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 of GCC uses
|
|
other tools, which are not aware of this location. This switch is
|
|
needed to have them find the needed files in <filename
|
|
class="directory">$LFS</filename>, and not on the host.</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><parameter>--enable-initfini-array</parameter></term>
|
|
<listitem>
|
|
<para>This option is automatically enabled when building a native
|
|
compiler with a native compiler on ARM. But here, we build with
|
|
a cross compiler, so we need to explicitly set this option.</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>
|