Linux From Scratch. Версия 6.0

Глава 5. Построение временной системы

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”.