Детальная информация о пакете находится в Разделе 6.14.2, “Описание GCC”.
Библиотека сайта rus-linux.net
5.13. GCC-3.4.1 - Шаг 2
Расчетное время сборки 11.0 SBU
Требуемое место на диске 274 MB
GCC - зависимости установки: Bash, Binutils, Coreutils, Diffutils, Findutils, Gawk, Gettext, Glibc, Grep, Make, Perl, Sed и Texinfo
5.13.1. Переустановка GCC
Этот пакет известен своим нестабильным поведением при компиляции
с измененными опциями оптимизации
(включая опции -march
и
-mcpu
). GCC рекомендуется компилировать с
настройками по умолчанию. Если вы задали переменные такие как
CFLAGS
и CXXFLAGS
, рекомендуется убрать их при сборке пакета GCC.
Средства, необходимые для тестирования GCC и Binutils, теперь
установлены (Tcl, Expect и DejaGnu). Мы можем вернуться к пересборке GCC и
Binutils, соединить их с новым Glibc и правильно их протестировать.
Но есть одно замечание: тестирование сильно зависит от правильного
функционирования псевдо терминалов (PTY) из основной системы. На данный
момент PTY осуществляется с помощью файловой системы
devpts
.
Вы можете быстро проверить правильность установки системы командой:
expect -c "spawn ls"
Если вы получили ответ:
The system has no more ptys.
Ask your system administrator to create more.
Ваш основной дистрибутив не поддерживает операции PTY. В этом случае здесь не место запуску тестирования для GCC и Binutils и вы можете пропустить его. Вы можете проконсультироваться в LFS Wiki на http://wiki.linuxfromscratch.org/ для более подробной информации о работе с PTY.
Распакуйте все три тарбола GCC (-core, -g++ и -testsuite) в одной
рабочей директории. Они распакуются в одну общую поддиректорию
gcc-3.4.1/
Для начала исправим одну проблему и создадим необходимую сборку:
patch -Np1 -i ../gcc-3.4.1-no_fixincludes-1.patch patch -Np1 -i ../gcc-3.4.1-specs-1.patch
Первый патч отключит скрипт GCC fixincludes. Мы расскажем об этом вкратце, не вдаваясь в подробности. При нормальных обстоятельствах скрипт GCC fixincludes сканирует вашу систему на файлы заголовков Glibc, нуждающиеся в исправлении, исправляет их и переносит их в директорию включений для GCC. В Главе 6, после установки нового Glibc, эта директория будет найдена, в результате чего GCC найдет заголовки основной системы и мы не сможем корректно использовать Glibc в системе LFS.
Второй патч изменяет расположение по умолчанию для динамического
компоновщика GCC (обычно ld-linux.so.2
).
Он также удаляет /usr/include
из пути для поиска GCC.
Пропатчивание spec-файла сейчас позволит убедиться, что собираемый GCC
будет использовать наш новый динамический компоновщик. То есть,
наши окончательные (и временные) бинарники будут скомпонованы с новым Glibc.
Важно
Эти патчи критичны для правильной сборки. Не забудьте применить их.
Создайте отдельную директорию для сборки и перейдите в нее:
mkdir ../gcc-build cd ../gcc-build
Перед началом сборки GCC не забудьте дезактивировать все переменные окружения, в которых были изменены флаги оптимизации.
Теперь подготавливаем GCC для компиляции:
../gcc-3.4.1/configure --prefix=/tools \ --libexecdir=/tools/lib --with-local-prefix=/tools \ --enable-clocale=gnu --enable-shared \ --enable-threads=posix --enable-__cxa_atexit \ --enable-languages=c,c++ --disable-libstdcxx-pch
Описание новых опций конфигурации:
-
--enable-clocale=gnu
-
Эта опция позволяет убедиться в корректном выборе модели локали для библиотек C++ во всех обстоятельствах. Если скрипт конфигурации найдет установленную локаль de_DE, он выберет корректную модель. Тем не менее, если локаль de_DE не установлена, есть риск собрать Application Binary Interface (ABI)-несовместимые библиотеки C++ из-за неверной модели локали в общем случае.
-
--enable-threads=posix
-
Подключит расширение C++ для мультилинейного кода.
-
--enable-__cxa_atexit
-
Эта опция разрешит использование __cxa_atexit, которое предпочтительнее использования atexit, для регистрации деструкторов C++ для локальных и глобальных объектов для обеспечения полного соответствия стандартам ссылок на деструкторы. Он также повлияет на C++ ABI и некоторые другие результаты в библиотеках C++ и программах C++, которые взаимодействуют с другими дистрибутивами Linux.
-
--enable-languages=c,c++
-
Эта опция позволяет убедиться, что будут собраны компиляторы C и C++.
-
--disable-libstdcxx-pch
-
Не собирать предкомпилированные заголовки (PCH) для
libstdc++
. Они занимают некоторое место и мы не хотим их использовать.
Компилируем пакет
make
Здесь нет необходимости использовать bootstrap
, так как мы компилируем этот GCC
с помощью той же самой версии GCC, но установленой ранее.
Компиляция проведена. Как было сказано ранее, запуск теста для временной сборки в этой части проводить не обязательно. В любом случае, для запуска теста GCC используйте следующую команду:
make -k check
Флаг -k
используется для того, чтобы
тестирование не прекратилось после первого отрицательного результата, а
проводило дальнейшие тесты. Тестирование GCC довольно исчерпывающее, и
поэтому мы практически гарантировано получим пару отрицательных
результатов тестов. Для просмотра результатов тестирования выполните
команду:
../gcc-3.4.1/contrib/test_summary | more
Вы можете сравнить ваши результаты с результатами из списка рассылки для того, чтобы найти аналогичные вашим. К примеру, посмотреть результаты тестирования GCC-3.3.1 на i686-pc-linux-gnu можно на http://gcc.gnu.org/ml/gcc-testresults/2004-07/msg00179.html.
Неожиданные отрицательные результаты также не могут быть проигнорированы. Разработчики GCC обычно знают о них, но пока не могут исправить. В общем, проверьте результаты, как было описано выше. Если все в порядке, то можно продолжать.
Устанавливаем пакет
make install
Замечание
В этом месте рекомендуется повторить простой тест, описаный ранее. Вернитесь к Разделу 5.9, “Интеграция Glibc”, и повторите проверку. Если она не удалась, видимо, вы забыли наложить вышеупомянутый патч GCC Specs.