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.

[Important]

Важно

Эти патчи критичны для правильной сборки. Не забудьте применить их.

Создайте отдельную директорию для сборки и перейдите в нее:

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
[Note]

Замечание

В этом месте рекомендуется повторить простой тест, описаный ранее. Вернитесь к Разделу 5.9, “Интеграция Glibc”, и повторите проверку. Если она не удалась, видимо, вы забыли наложить вышеупомянутый патч GCC Specs.

Детальная информация о пакете находится в Разделе 6.14.2, “Описание GCC”.