lfs-ru/chapter06/gcc-pass2.xml
2024-02-12 01:28:02 +05:00

216 lines
11 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?xml version="1.0" encoding="UTF-8"?>
<!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-Проход 2">
<?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; - Проход 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>Установка пакета GCC</title>
<!--
<para>Сначала устраните проблему с последней версией glibc:</para>
<screen><userinput remap="pre">patch -Np1 -i ../&gcc-upstream-fixes-patch;</userinput></screen>
-->
<para>Как и при первой сборке GCC, требуются пакеты GMP, MPFR и MPC. Распакуйте
архивы и переименуйте каталоги:</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">При сборке на x86_64 измените имя каталога по умолчанию для 64-разрядных
библиотек на <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">Измените имя каталога по умолчанию для библиотек:</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>Переопределите правила сборки заголовочных файлов libgcc и libstdc++, чтобы
разрешить создание этих библиотек с поддержкой потоков POSIX:</para>
<screen><userinput remap="pre">sed '/thread_header =/s/@.*@/gthr-posix.h/' \
-i libgcc/Makefile.in libstdc++-v3/include/Makefile.in</userinput></screen>
<para>Снова создайте отдельный каталог сборки:</para>
<screen><userinput remap="pre">mkdir -v build
cd build</userinput></screen>
<para>Перед началом сборки GCC не забудьте отключить все переменные среды,
которые переопределяют флаги оптимизации по умолчанию.</para>
<para>Теперь подготовьте GCC к компиляции:</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-libsanitizer \
--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 \
--disable-nls \
--enable-multilib --with-multilib-list=$mlist \
--disable-libatomic \
--disable-libgomp \
--disable-libquadmath \
--disable-libsanitizer \
--disable-libssp \
--disable-libvtv \
--enable-languages=c,c++</userinput></screen>
<variablelist>
<title>Значение новых параметров настройки:</title><!-- WIP -->
<varlistentry>
<term><parameter>--with-build-sysroot=$LFS</parameter></term>
<listitem>
<para>Обычно, использование <parameter>--host</parameter> гарантирует, что
для сборки GCC используется кросс-компилятор, и этот компилятор знает,
что он должен искать заголовочные файлы и библиотеки в <filename
class="directory">$LFS</filename>. Но сборочная система GCC использует
другие инструменты, которые не знают об этом местоположении. Этот
параметр необходим для того, чтобы они могли найти нужные файлы в <filename
class="directory">$LFS</filename>, а не на хосте.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>--target=$LFS_TGT</parameter></term>
<listitem>
<para>Поскольку мы выполняем кросс-компиляцию GCC, невозможно создать
целевые библиотеки (<filename class="libraryfile">libgcc</filename>
и <filename class="libraryfile">libstdc++</filename>) с ранее скомпилированными
двоичными файлами GCC, потому что эти двоичные файлы не будут работать на
хост-дистрибутиве. Система сборки GCC по умолчанию попытается использовать
компиляторы C и C++ хоста в качестве обходного пути.
Сейчас не поддерживается создание целевых библиотек GCC с помощью другой версии GCC,
поэтому использование компиляторов хоста может привести к сбою сборки. Этот
параметр гарантирует сборку библиотек с помощью GCC собранного на первом проходе.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>LDFLAGS_FOR_TARGET=...</parameter></term>
<listitem>
<para>Разрешить <filename class="libraryfile">libstdc++</filename> использовать
общую библиотеку <filename class="libraryfile">libgcc</filename>,
собранную на этом этапе, вместо статической версии, собранной в GCC
Проход 1. Это необходимо для поддержки обработки исключений C++</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>--disable-libsanitizer</parameter></term>
<listitem>
<para>Отключает библиотеки среды выполнения GCC sanitizer. Они не нужны для
временного набора инструментов. Этот параметр необходим для сборки GCC без
установки <systemitem class='library'>libcrypt</systemitem> для целевого
объекта. В <xref linkend='ch-tools-gcc-pass1'/> это решалось с помощью
параметра <parameter>--disable-libstdcxx</parameter>, но теперь мы должны
передать его явно.</para>
</listitem>
</varlistentry>
</variablelist>
<para>Скомпилируйте пакет:</para>
<screen><userinput remap="make">make</userinput></screen>
<para>Установите пакет:</para>
<screen><userinput remap="install">make DESTDIR=$LFS install</userinput></screen>
<para>В качестве завершающего штриха создайте символическую ссылку на утилиту.
Многие программы и скрипты используют <command>cc</command> вместо <command>gcc</command>,
чтобы сделать программы более универсальными и, следовательно, для совместимости со всеми
типами UNIX-систем, где компилятор GNU C не всегда установлен. Наличие <command>cc</command>
оставляет системному администратору право самостоятельно решать, какой компилятор C устанавливать:</para>
<screen><userinput remap="install">ln -sv gcc $LFS/usr/bin/cc</userinput></screen>
</sect2>
<sect2 role="content">
<title/>
<para>Подробная информация об этом пакете находится в
<xref linkend="contents-gcc" role="."/></para>
</sect2>
</sect1>