Подробная информация об этом пакете находится в Раздел 8.29.2, «Содержимое пакета GCC.»
Пакет GCC содержит коллекцию компиляторов GNU, которая включает компиляторы C и C++.
Как и при первой сборке GCC, требуются пакеты GMP, MPFR и MPC. Распакуйте архивы и переименуйте каталоги:
tar -xf ../mpfr-4.2.1.tar.xz mv -v mpfr-4.2.1 mpfr tar -xf ../gmp-6.3.0.tar.xz mv -v gmp-6.3.0 gmp tar -xf ../mpc-1.3.1.tar.gz mv -v mpc-1.3.1 mpc
Измените имя каталога по умолчанию для библиотек:
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
Переопределите правила сборки заголовочных файлов libgcc и libstdc++, чтобы разрешить создание этих библиотек с поддержкой потоков POSIX:
sed '/thread_header =/s/@.*@/gthr-posix.h/' \ -i libgcc/Makefile.in libstdc++-v3/include/Makefile.in
Снова создайте отдельный каталог сборки:
mkdir -v build cd build
Перед началом сборки GCC не забудьте отключить все переменные среды, которые переопределяют флаги оптимизации по умолчанию.
Теперь подготовьте GCC к компиляции:
mlist=m64,m32 ../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++
Значение новых параметров настройки:
--with-build-sysroot=$LFS
Обычно, использование --host
гарантирует, что для
сборки GCC используется кросс-компилятор, и этот компилятор
знает, что он должен искать заголовочные файлы и библиотеки в
$LFS
. Но сборочная система GCC
использует другие инструменты, которые не знают об этом
местоположении. Этот параметр необходим для того, чтобы они
могли найти нужные файлы в $LFS
, а не на хосте.
--target=$LFS_TGT
Поскольку мы выполняем кросс-компиляцию GCC, невозможно
создать целевые библиотеки (libgcc
и libstdc++
) с ранее скомпилированными
двоичными файлами GCC, потому что эти двоичные файлы не будут
работать на хост-дистрибутиве. Система сборки GCC по
умолчанию попытается использовать компиляторы C и C++ хоста в
качестве обходного пути. Сейчас не поддерживается создание
целевых библиотек GCC с помощью другой версии GCC, поэтому
использование компиляторов хоста может привести к сбою
сборки. Этот параметр гарантирует сборку библиотек с помощью
GCC собранного на первом проходе.
LDFLAGS_FOR_TARGET=...
Разрешить libstdc++
использовать общую библиотеку libgcc
, собранную на этом этапе, вместо
статической версии, собранной в GCC Проход 1. Это необходимо
для поддержки обработки исключений C++
--disable-libsanitizer
Отключает библиотеки среды выполнения GCC sanitizer. Они не
нужны для временного набора инструментов. Этот параметр
необходим для сборки GCC без установки libcrypt
для целевого объекта. В
GCC-Проход 1 это решалось с
помощью параметра --disable-libstdcxx
, но теперь
мы должны передать его явно.
Скомпилируйте пакет:
make
Установите пакет:
make DESTDIR=$LFS install
В качестве завершающего штриха создайте символическую ссылку на утилиту. Многие программы и скрипты используют cc вместо gcc, чтобы сделать программы более универсальными и, следовательно, для совместимости со всеми типами UNIX-систем, где компилятор GNU C не всегда установлен. Наличие cc оставляет системному администратору право самостоятельно решать, какой компилятор C устанавливать:
ln -sv gcc $LFS/usr/bin/cc
Подробная информация об этом пакете находится в Раздел 8.29.2, «Содержимое пакета GCC.»