"Чудесно праздновать свой успех, но более важным является умение выносить уроки из своих провалов." Билл Гейтс

Содержание:

5.4. Binutils-2.31.1 - Проход 1

Очень важно чтобы пакет BinUtils был скомпилирован первым потому, что пакеты Glibc и GCC в процессе конфигурирования выполняют проверки доступности компоновщика и ассемблера, чтобы определить какие функциональные возможности включить или выключить.
В документации пакета Binutils рекомендуется выполнять сборку в отдельном каталоге:

mkdir -v build
cd build


Необходимо подготовить пакет Binutils к компиляции:

../configure --prefix=/tools \
--with-sysroot=$LFS \
--with-lib-path=/tools/lib \
--target=$LFS_TGT \
--disable-nls \
--disable-werror


Значение параметров конфигурации:
--prefix=/tools Указывает сценарию configure подготовить установку программ пакета Binutils в каталог /tools.
--with-sysroot=$LFS Для выполнения кросс-компиляции, значение передается в систему сборки для поиска в каталоге $LFS целевых системных библиотек по мере необходимости.
--with-lib-path=/tools/lib Указывает в каком каталоге должен находится компоновщик.
--target=$LFS_TGT Поскольку название машины в значении переменной LFS_TGT может отличаться от значения, которое вернут сценарий config.guess, этот аргумент укажет сценарию configure настроить систему сборки пакета Binutils для создания кросс-линковщика.
--disable-nls Отключает интернационализацию, поскольку i18n не требуется во временном наборе инструментов.
--disable-werror Это предотвращает остановку сборки в том случае, если появляются предупреждения компилятора хост-системы.
Скомпилируем пакет:

make

Если сборка происходит на 64-разрядной машине, необходимо создать символическую ссылку для нормальной работы временного набора инструментов.

case $(uname -m) in
x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;;
esac


Установим пакет:

make install

5.5. GCC-8.1.0 - Проход 1

Пакет содержит набор компиляторов GNU, для таких языков, как Си и Си++.
Пакет GCC требует пакеты GMP, MPFR и MPC. Так как эти пакеты могут не быть установлены в хост-системе, они будут скомпилированы вместе с GCC. Распакуем каждый пакет в каталог с исходным кодом пакета GCC и переименуем их чтобы эти пакеты использовались в процессе сборки GCC и были скомпилированы автоматически.
В этом разделе часто возникают недоразумения. Процедуры таки же же как и в любом другом разделе, и полностью соответствуют инструкции по сборке пакетов (5.3. Общие инструкции по компиляции). Сначала распакуем пакет GCC из архива, который находится в каталоге с другими архивами пакетов и патчами, затем перейдём в распакованный каталог. Только после этого необходимо следовать приведенным ниже инструкциям.

tar -xf ../mpfr-4.0.1.tar.xz
mv -v mpfr-4.0.1 mpfr
tar -xf ../gmp-6.1.2.tar.xz
mv -v gmp-6.1.2 gmp
tar -xf ../mpc-1.1.0.tar.gz
mv -v mpc-1.1.0 mpc


Следующая команда изменит место расположения динамического компоновщика чтобы использовать тот, который находится в каталоге /tools. Команда также удалит каталог /usr/include из путей поиска GCC.

for file in gcc/config/{linux,i386/linux{,64}}.h
do
cp -uv $file{,.orig}
sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
-e 's@/usr@/tools@g' $file.orig > $file
echo '
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
touch $file.orig
done


Разберем содержимое команды:
Сначала копируем файлы gcc/config/linux.h, gcc/config/i386/linux.h и gcc/config/i368/linux64.h в файлы с таким же наименованием, но с добавлением суффикса «.orig». Затем первое выражение добавляет «/tools» к каждому экземпляру «/lib/ld», «/lib64/ld» или «/lib32/ld» в то время как второй заменяет жестко закодированные экземпляры «/usr». Потом добавляем нашу директиву define которая изменяет префикс начальных файлов на префикс конечных файлов. Обратите внимание что начальный символ «/» в «/tools/lib/» является обязательным. Потом используем команду touch для обновления даты и времени модификации скопированных файлов. При использовании в сочетании с cp -u предотвращает непредвиденные изменения исходных файлов, если команды случайно выполнили дважды.
Для хост-системы x86_64 устанавливаем каталогом по умолчанию наименование 64-битных библиотек в «lib»:

case $(uname -m) in
x86_64)
sed -e '/m64=/s/lib64/lib/' \
-i.orig gcc/config/i386/t-linux64
;;
esac


В документации пакета GCC рекомендуется выполнять сборку в отдельном каталоге:

mkdir -v build
cd build


Подготавливаем пакет GCC к компиляции:

../configure \
--target=$LFS_TGT \
--prefix=/tools \
--with-glibc-version=2.11 \
--with-sysroot=$LFS \
--with-newlib \
--without-headers \
--with-local-prefix=/tools \
--with-native-system-header-dir=/tools/include \
--disable-nls \
--disable-shared \
--disable-multilib \
--disable-decimal-float \
--disable-threads \
--disable-libatomic \
--disable-libgomp \
--disable-libmpx \
--disable-libquadmath \
--disable-libssp \
--disable-libvtv \
--disable-libstdcxx \
--enable-languages=c,c++


Значение параметров конфигурации:
--with-newlib Так как рабочая библиотека C пока недоступна, необходимо убедиться в том, что константа inhibit_libc определена, когда выполняется сборка libgcc. Также это предотвратит компиляцию любого кода, которому необходима поддержка библиотеки libc.
--without-headers Когда создается кросс-компилятор, пакету GCC необходимы стандартные заголовки, совместимые с целевой системой. Для требуемой задачи эти заголовочные файлы не нужны. Этот аргумент предотвращает поиск этих файлов пакетом GCC.
--with-local-prefix=/tools Этот аргумент (локальный префикс) является местом в системе, где GCC будет искать локально установленные include файлы. По умолчанию этот путь /usr/local. Указание на каталог /tools поможет оставить каталог /usr/local хост-системы за пределами поиска файлов устанавливаемого пакета GCC.
--with-native-system-header-dir=/tools/include По умолчанию, GCC выполняет поиск системных заголовочных файлов в каталоге /usr/include. В сочетании с аргументом sysroot, поиск системных заголовочных файлов будет производится в каталоге $LFS/tools/include.Однако заголовочные файлы , которые будут установлены в следующих двух разделах, будут располагаться в каталоге $LFS/tools/include. Этот аргумент позволит искать их по указанному в значении пути. Вторым проходом сборки GCC, этот же аргумент обеспечит отсутствие заголовочных файлов из хост-системы.
--disable-shared Аргумент указывает GCC, что необходимо произвести статическую линковку внутренних библиотек. Ето необходимо сделать, чтобы избежать возможных проблем с хост-системой.
--disable-decimal-float, --disable-threads, --disable-libatomic, --disable-libgomp, --disable-libmpx, --disable-libquadmath, --disable-libssp, --disable-libvtv, --disable-libstdcxx Этои аргументы отключают поддержку расширений для работы с десятичными числами и числами с плавающей запятой, потоками, библиотеками libatomic, libgomp, libmpx, libquadmath, libssp, libvtv и стандартной библиотеки C++ соответственно. При компиляции этих функций, возникнет ошибка и для кросс-компилятора, эти функции не нужны, для того чтобы выполнить кросс-компиляцию временной библиотеки C (libc).
--disable-multilib Для платформы x86_64, LFS пока не поддерживает конфигурацию multilib. Этот аргумент ни как не повлияет, если установка выполняется на платформе x86.
--enable-languages=c,c++ Этот параметр гарантирует, что будут созданы только компиляторы C и C ++. Это единственные языки, которые нужны сейчас.
Скомпилируем пакет:

make

На данном этапе необходимо выполнить наборы тестов для пакета, но сейчас пока рано, потому что инструменты для выполнения тестирования (Tcl, Expect, and DejaGNU) пока не на своём месте. Преимущества использования тестов на данный момент минимальны, поскольку программы из сборки первого прохода будут заменены на программы из сборки второго прохода.
Установим пакет:

make install

5.6. Заголовочные файлы Linux-4.17.8

Заголовочные файлы Linux APIlinux-4.17.8.tar.xz) предоставляют API для использования его библиотекой C (Glibc).
Ядро Linux должно предоставлять интерфейс (API) для его использования системной библиотекой C (Glibc в LFS).Это можно сделать, выделив различные заголовочные файлы C которые расположены в архиве исходных кодов пакета ядра.
Необходимо убедиться, что в пакете нет устаревших файлов:

make mrproper

Теперь установим видимые пользователям заголовочные файлы из каталога исходных кодов пакета ядра. Они будут расположены в промежуточном каталоге и будут скопированы в указанное местоположение, потому что процесс извлечения удаляет все существующие файлы в целевом каталоге.

make INSTALL_HDR_PATH=dest headers_install
cp -rv dest/include/* /tools/include

5.7. Glibc-2.27

Пакет содержит стандартную библиотеку языка Си (GNU C Library). Эта библиотека предоставляет функции для выделения памяти, поиска каталогов, открытия и закрытия файлов, чтения и записи файлов, обработку строк, соответствия шаблонов (pattern matching), арифметические операции, и так далее.
В документации пакета Glibc рекомендуется выполнять сборку в отдельном каталоге:

mkdir -v build
cd build


Подготовка пакета Glibc к компиляции:

../configure \
--prefix=/tools \
--host=$LFS_TGT \
--build=$(../scripts/config.guess) \
--enable-kernel=3.2 \
--with-headers=/tools/include \
libc_cv_forced_unwind=yes \
libc_cv_c_cleanup=yes


Значение параметров конфигурации:
--host=$LFS_TGT, --build=$(../scripts/config.guess) Комбинация этих аргументов указывает системе сборки Glibc выполнять кросс-компиляцию пакета, используя кросс-компоновщик и кросс-компилятор из каталога /tools.
--enable-kernel=3.2 Аргумент позволяет выполнять компиляцию с поддержкой ядер начиная с версии 3.2 и более поздних. Поддержка более старых ядер не будет включена.
--with-headers=/tools/include Аргумент позволяет выполнять компиляцию с указанием заголовочных файлов, установленных в каталог с временным набором инструментов, таким образом пакету будет известно, какие функции ядра используются, и будет выполнена оптимизация.
libc_cv_forced_unwind=yes Компоновщик «Binutils-2.31.1 - Проход 1» был кросс-компилирован и не может использоваться, пока не будет установлен пакет Glibc. Это означает, что тест конфигурирования для функции force-unwind будет провален, поскольку он полагается на рабочий компоновщик. Значение аргумента libc_cv_forced_unwind=yes передается, чтобы сообщить, сценарию configure что поддержка функция force-unwind доступна без необходимости проведения тестирования.
libc_cv_c_cleanup=yes Аналогично, передается значение аргумента libc_cv_c_cleanup=yes сценарию configure для того, чтобы тестирование не выполнялось и поддержка обработки очистки была сконфигурирована.
На этапе конфигурирования могут появиться следующие предупреждения:
configure: WARNING:
*** These auxiliary programs are missing or
*** incompatible versions: msgfmt
*** some features will be disabled.
*** Check the INSTALL file for required versions.

Отсутствие или несовместимость программы msgfmt безвредно. Это программа является частью пакета Gettext, который должен быть предоставлен хост-системой.
Пакет может не компилироваться при выполнении процедуры "параллельной сборки". Если это произойдет, повторим команду make с аргументом "-j1".
Скомпилируем пакет:

make

Установим пакет:

make install

На этом этапе, необходимо остановиться и проверить что базовый функционал (компиляция и линовка) созданных инструментов работает так, как необходимо:

echo 'int main(){}' > dummy.c
$LFS_TGT-gcc dummy.c
readelf -l a.out | grep ': /tools'


Если все работает правильно, не должно быть ошибок, и вывод последней команды будет иметь вид:

[Requesting program interpreter: /tools/lib64/ld-linux-x86-64.so.2]

На 32-битной машине наименование интерпретатора будет:/tools/lib/ld-linux.so.2.
Если вывод не соответствует тому, как показано выше, или вообще вывода нет, значит,что-то не так. Изучите и повторите шаги выше, чтобы выяснить где проблема и устраните её. Важно, устранить проблему до того, как вы продолжите следующие шаги.
Когда все будет хорошо, очистите тестовые файлы:

rm -v dummy.c a.out

5.8. Libstdc++ из пакета GCC-8.2.0

Libstdc++ является стандартной библиотекой языка Cи++. Она необходима для правильной работы компилятора g++ (часть GCC написана на языке Си++). Сборку пришлось отложить на этапе gcc-pass1 потому что присутствует зависимость с glibc, которая еще недоступна в каталоге /tools.
Libstdc++ является частью исходных кодов пакета GCC. Сначала необходимо распаковать архив с исходным кодом пакета GCC и перейти в каталог gcc-8.2.0.
Создаём отдельный каталог для сборки Libstdc++:

mkdir -v build
cd build


Подготовим пакет Libstdc++ к компиляции:

../libstdc++-v3/configure \
--host=$LFS_TGT \
--prefix=/tools \
--disable-multilib \
--disable-nls \
--disable-libstdcxx-threads \
--disable-libstdcxx-pch \
--with-gxx-include-dir=/tools/$LFS_TGT/include/c++/8.2.0


Значение параметров конфигурации:
--host=... Указывает на использование кросс-компилятора который был установлен вместо компилятора в каталоге /usr/bin.
--disable-libstdcxx-threads Поскольку сборка библиотеки Си для работы с потоками еще не создана, соответствующую библиотеку Си++ скомпилировать тоже не получится.
--disable-libstdcxx-pch Этот аргумент указывает на то, что не требуется установка предварительно скомпилированых заголовочных файлов, которые на данном этапе не требуются.
--with-gxx-include-dir=/tools/$LFS_TGT/include/c++/8.2.0 Это каталог, где будет выполнятся поиск стандартных заголовочных файлов компилятором Си++. При обычной сборке, эта информация автоматически передается сценарию configure пакета Libstdc++ из каталога верхнего уровня. В нашем случае, эта информация должны быть указана явно.
Скомпилируем пакет Libstdc++:

make

Установим бибоиотеку:

make install

5.9. Binutils-2.31.1 - Проход 2

Пакет содержит компоновщик, ассемблер, и другие утилиты и инструменты для работы с объектными файлам. Программы в этом пакете необходимы для компиляции как большинства пакетов системы LFS, так и многих пакетов за её пределами.
Необходимо снова создать отдельный каталог:

mkdir -v build
cd build


Подготовка пакета Binutils к компиляции:

CC=$LFS_TGT-gcc \
AR=$LFS_TGT-ar \
RANLIB=$LFS_TGT-ranlib \
../configure \
--prefix=/tools \
--disable-nls \
--disable-werror \
--with-lib-path=/tools/lib \
--with-sysroot


Значения новых параметров конфигурации:
CC=$LFS_TGT-gcc AR=$LFS_TGT-ar RANLIB=$LFS_TGT-ranlib Поскольку это нативная сборка пакета Binutils, указание этих переменных гарантирует что система сборки пакета будет использовать кросс-компилятор и связанные с ним инструменты, вместо инструментов хост-системы.
--with-lib-path=/tools/lib Указание аргумента сообщает сценарию configure использовать каталог для поиска библиотек, указанный в значении аргумента во время процесса компиляции пакета Binutils, в результате чего каталог /tools/lib будет передан компоновщику. Это предотвратит использование компоновщика хост-системы.
--with-sysroot Функция sysroot позволяет компоновщику находить общие объекты которые требуются для других общих объектов, явно включенных в команду компоновщика. Без указания этого аргумента, на некоторых хост-системах, компиляция пакетов может не выполнится.
Скомпилируем пакет:

make

Установим пакет:

make install

Если пакет Binutils не получится скомпилировать, или сконфигурировать, это будет явный признак того, что что-то пошло не так с предыдущими установками пакетов Binutils, GCC, или Glibc.
Подготовим компоновщик, для «перенастройки»:

make -C ld clean
make -C ld LIB_PATH=/usr/lib:/lib
cp -v ld/ld-new /tools/bin


Значение параметров команды make:
-C ld clean Аргумент сообщает программе make удалить все скомпилированые файлы в подкаталоге ld.
-C ld LIB_PATH=/usr/lib:/lib Этот аргумент сообщает выполнить пересборку всего содержимого в подкаталоге ld. Указание переменной LIB_PATH Makefile в командной строке позволяет переопределить значения по умолчанию для набора временных инструментов указанием правильного конечного пути. Значение этой переменной указывает компоновщику каталог для поиска библиотек. Эта подготовка требуется для выполнения процедур в следующем разделе.

5.10. GCC-8.2.0 - Проход 2

Пакет содержит набор компиляторов GNU, для таких языков, как Си и Си++.
В первом проходе сборки GCC были установлены некоторые внутренние заголовочные файлы. Обычно некоторые из них, например - limits.h, будет включен в систему как заголовочный файл limits.h, в нашем случае в каталог /tools/include/limits.h. Однако в первом проходе сборки файл /tools/include/limits.h не существует, таким образом внутренний заголовочный файл установленный GCC является частичным, автономный файл и не содержит функции системного заголовочного файла. Этого достаточно, для выполнения сборки временной библиотеки libc, но теперь, пакету GCC необходимы все внутренние заголовочные файлы. Создание полной версии внутренних заголовочных файлов используя идентичную команду, при которой система сборки GCC работает при обычных обстоятельствах:

cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
`dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h


Снова, изменим местоположение динамического компоновщика пакета GCC по умолчанию используя тот, который установлен в каталоге /tools.

for file in gcc/config/{linux,i386/linux{,64}}.h
do
cp -uv $file{,.orig}
sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
-e 's@/usr@/tools@g' $file.orig > $file
echo '
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
touch $file.orig
done


Для хост-системы x86_64 устанавливаем каталогом по умолчанию наименование 64-битных библиотек в «lib»:

case $(uname -m) in
x86_64)
sed -e '/m64=/s/lib64/lib/' \
-i.orig gcc/config/i386/t-linux64
;;
esac


Также, как и в первом проходе сборки GCC необходимы пакеты GMP, MPFR и MPC. распакуем архивы с исходными кодами этих пакетов и переместим их требуемые каталоги:

tar -xf ../mpfr-4.0.1.tar.xz
mv -v mpfr-4.0.1 mpfr
tar -xf ../gmp-6.1.2.tar.xz
mv -v gmp-6.1.2 gmp
tar -xf ../mpc-1.1.0.tar.gz
mv -v mpc-1.1.0 mpc


Создаём снова отдельный каталог для сборки:

mkdir -v build
cd build


Перед началом сборки GCC, очищаем все переменные окружения, которые переопределяют аргументы и флаги для оптимизации.
Подготовим пакет GCC к компиляции:

CC=$LFS_TGT-gcc \
CXX=$LFS_TGT-g++ \
AR=$LFS_TGT-ar \
RANLIB=$LFS_TGT-ranlib \
../configure \
--prefix=/tools \
--with-local-prefix=/tools \
--with-native-system-header-dir=/tools/include \
--enable-languages=c,c++ \
--disable-libstdcxx-pch \
--disable-multilib \
--disable-bootstrap \
--disable-libgomp


Значения новых параметров конфигурации:
--enable-languages=c,c++ Этот аргумент гарантирует, что будут собраны оба компилятора C и C ++.
--disable-libstdcxx-pch Не выполнят сборку предварительно скомпилированых заголовочных файлов (PCH) для libstdc++. Они занимают много места, и их использование не предусмотрено.
--disable-bootstrap Для нативной сборки пакета GCC по умолчанию используется механизм сборки bootstrap. Он не просто компилирует GCC, а выполняет компиляцию в несколько проходов. Он использует программы, скомпилированые в первом проходе, чтобы выполнить повторную компиляцию на втором проходе, и затем снова в третий раз. Результат компиляции второго и третьего прохода сравниваются чтобы убедиться в безотказности. Также выполняется проверка на предмет корректности компиляции. Однако метод сборки LFS должен обеспечивать надежный компилятор без использования механизма сборки bootstrap каждый раз.
Скомпилируем пакет:

make

Установим пакет:

make install

После установки, необходимо создать символические ссылки. Многие программы и файлы сценариев запускают cc вместо gcc, для обеспечения переносимости на все UNIX системы. Не у всех установлен именно компилятор GNU C. Запуск cc позволяет администратору выбирать, какой компилятор C устанавливать в систему, и мы создаем ссылку на него:

ln -sv gcc /tools/bin/cc

На этом этапе, необходимо остановиться и проверить что базовый функционал (компиляция и линовка) созданных инструментов работает так, как необходимо:

echo 'int main(){}' > dummy.c
cc dummy.c
readelf -l a.out | grep ': /tools'


Если все работает правильно, не должно быть ошибок, и вывод последней команды будет иметь вид:

[Requesting program interpreter: /tools/lib64/ld-linux-x86-64.so.2]

Для 32-битной машины, каталог динамического компоновщика будет /tools/lib/ld-linux.so.2.
Если вывод не соответствует тому, как показано выше, или вообще вывода нет, значит,что-то не так. Изучаем и повторяем шаги выше, чтобы выяснить где проблема. Важно, устранить проблему до следующих шагов. Во-первых, повторяем проверку работоспособности gcc вместо cc. Если все работает, тогда символическая ссылка /tools/bin/cc отсутствует. Далее, убедитмся что переменная окружения PATH указана корректно. Это можно проверить, запустив команду echo $PATH и проверить что каталог /tools/bin находиться в начале списка. Если переменная окружения некорректная, это может означать, что мы авторизованы не как пользователь lfs или что то пошло не так на более ранних этапах. Читаем раздел «4.4. Установка рабочего окружения».
Если всё в порядке, удаляем тестовые файлы:
rm -v dummy.c a.out

5.11. Tcl-8.6.8

Пакет содержит "командный язык инструментов" - скриптовый язык высокого уровня. Он необходим для выполнения тестов некоторых пакетов LFS, и будет установлен только во временный инструментарий.
Этот пакет, и следующие два (Expect и DejaGNU) будут установлены для возможности запуска набора тестов для пакетов GCC и Binutils и других. Установка трех пакетов для тестирования может показаться чрезмерным, но очень обнадеживает, если важно знать что скомпилированые инструменты работают правильно. Выполнение тестов в этой главе не является обязательным, эти пакеты необходимы для выполнения набора тестов в главе Chapter 6.
Используется минимальная версия пакета Tcl для запуска тестов LFS. Полный пакет доступен в BLFS.
Подготовим пакет Tcl к компиляции:

cd unix
./configure --prefix=/tools


Выполним сборку пакета:

make

Выполнение тестов не является обязательным для набора временных инструментов. Чтобы запустить выполнение тестов, в любом случае, выполним команду:

TZ=UTC make test

Наборы тестов Tcl могут завершаться с ошибками при определённых условиях в хост-системе, которые до конца не понятны. Следовательно, сбои при выполнении тестов набора вполне ожидаемы, и они не считаются критичными. Установка аргумента TZ=UTC устанавливает часовой пояс для Всемирного координированного времени (UTC) только на время выполнения тестового набора. Это гарантирует, что тесты времени осуществляются правильно. Информацию о переменной окружения TZ можно посмотреть в главе Chapter 7.
Установим пакет:

make install

Сделаем установленную библиотеку доступной для записи, чтобы отладочные символы могли быть удалены позднее:

chmod -v u+w /tools/lib/libtcl8.6.so

Установм заголовочные файлы Tcl. Следующему пакету, Expect, они необходимы чтобы выполнить сборку.

make install-private-headers

Создадим необходимую символическую ссылку:

ln -sv tclsh8.6 /tools/bin/tclsh

Содержимое пакета Tcl:
Установленные программы tclsh (link to tclsh8.6) and tclsh8.6
Установленные библиотеки libtcl8.6.so, libtclstub8.6.a
Краткое описание:
tclsh8.6 Командная оболочка Tcl tclsh Ссылка на tclsh8.6 libtcl8.6.so Библиотека Tcl libtclstub8.6.a Библиотека Tcl Stub

5.12. Expect-5.45.4

Пакет содержит инструменты для автоматизации и тестирования, и является расширением к скрипт-языку Tcl, для многих интерактивных приложений. Он будет установлен только во временный инструментарий.
Для начала, необходимо указать сценарию конфигурирования пакета использовать /bin/stty вместо /usr/local/bin/stty который он может искать в хост-системе. Это гарантирует что инструменты тестирования останутся в нормальном состоянии до окончания сборки всего временного набора инструментов:

cp -v configure{,.orig}
sed 's:/usr/local/bin:/bin:' configure.orig > configure


Подготовим пакет Expect к компиляции:

./configure --prefix=/tools \
--with-tcl=/tools/lib \
--with-tclinclude=/tools/include


Значение параметров конфигурации:
--with-tcl=/tools/lib Аргумент обеспечивает то что сценарий конфигурирования будет выполнять поиск установленного пакета Tcl во каталогах временного инструментария, вместо поиска в каталогах хост-системы.
--with-tclinclude=/tools/include Значение аргумента явно указывает, где выполнять поиск внутренних заголовочных файлов пакета Tcl. Использование этой опции позволяет избежать условий, при которых сценарий configure может не выполнится, потому что не сможет автоматически найти заголовочные файлы Tcl.
Выполнм сборку пакета:

make

Выполнение тестов не является обязательным для набора временных инструментов. Чтобы запустить выполнение тестов, в любом случае, выполним команду:

make test

Наборы тестов Tcl могут завершаться с ошибками, которые не возможно контролировать. Следовательно, сбои при выполнении тестов набора вполне ожидаемы, и они не считаются критичными.
Установим пакет:

make SCRIPTS="" install

Значение параметров make:
SCRIPTS="" Это предотвращает установку дополнительных сценариев Expect, которые не нужны.
Содержимое пакета Expect:
Установленная программа expect Общается с другими интерактивными программами в соответствии со сценарием
Установленная библиотека libexpect-5.45.so Содержит функции, которые позволяют пакету Expect быть использованным как расширение к Tcl или использоваться напрямую, из Си или Си++ (без Tcl)

5.13. DejaGNU-1.6.1

Пакет DejaGNU содержит framework для тестирования других программ.
Выполним подготовку пакета DejaGNU к компиляции:

./configure --prefix=/tools

Выполним сборку и установку пакета:

make install

Для выполнения тестов, выполните команду:

make check

Содержимое пакета DejaGNU: runtest Сценарий-обёртка, который находит правильную оболочку expect и затем, выполняет запуск DejaGNU.

5.14. M4-1.4.18

Пакет содержит общий макропроцессор текста - полезный инструмент для выполнения сборки других программ.
Сделаем некоторые исправления, требуемые glibc-2.28:

sed -i 's/IO_ftrylockfile/IO_EOF_SEEN/' lib/*.c
echo "#define _IO_IN_BACKUP 0x100" >> lib/stdio-impl.h


Выполним подготовку пакета M4 к компиляции:

./configure --prefix=/tools

Скомпилируем пакет:

make

Выполнение тестов не является обязательным для набора временных инструментов. Чтобы запустить выполнение тестов, в любом случае, выполним команду:

make check

Установим пакет:

make install

5.15. Ncurses-6.1

Пакет содержит библиотеку, предназначенную для управления вводом-выводом на терминал, в числе прочего, библиотека позволяет задавать экранные координаты (в знакоместах) и цвет выводимых символов. Предоставляет программисту уровень абстракции, позволяющий не беспокоиться об аппаратных различиях терминалов и писать переносимый код. Он необходим для ряда пакетов.
Необходимо убедиться в том, что программа gawk обнаружится первой, в процессе конфигурирования:

sed -i s/mawk// configure

Подготовим пакет Ncurses к компиляции:

./configure --prefix=/tools \
--with-shared \
--without-debug \
--without-ada \
--enable-widec \
--enable-overwrite


Значение параметров конфигурации: --without-ada Указание этого аргумента гарантирует что поддержка компилятора Ada не будет включена в сборку, который может присутствовать на хост-системе, но не будет доступен в chroot окружении.
--enable-overwrite Указание этого аргумента сообщает что необходимо установить заголовочные файлы в каталог /tools/include, вместо /tools/include/ncurses, чтобы быть уверенным в том, что остальные пакеты смогут легко найти заголовочные файлы пакета Ncurses.
--enable-widec Аргумент сообщает, что необходимо подключить wide-character библиотеки (например, libncursesw.so.6.1) вместо обычных библиотек (например, libncurses.so.6.1). Библиотеки wide-character могут использоваться как для многобайтовых, так и для традиционных 8-битных локалях, в то время как обычные библиотеки работают правильно только с 8-битными локалями. Библиотеки wide-character и обычные совместимы на уровне исходного кода, но не совместимы на бинарном уровне.
Скомпилируем пакет:

make

В пакет включен набор тестов, но они могут быть запущены только после того, как пакет будет установлен. Тесты находятся в каталоге test/. Читаем файл README в этом каталоге для получения дополнительной информации.
Установим пакет:

make install

5.16. Bash-4.4.18

Усовершенствованная и модернизированная вариация командной оболочки Bourne shell. Этот пакет выполняет требования стандарта LFS Core для обеспечения интерфейса Bourne Shell в системе. Он был выбран из числа других оболочек из-за широкого распространения, возможностей которые выходят далеко за пределы базовых функций программ-оболочек.
Подготовим пакет Bash к компиляции:

./configure --prefix=/tools --without-bash-malloc

Значение параметров конфигурации:
--without-bash-malloc Эта опция отключает использование функций выделения памяти Bash (malloc) которые, как известно, вызывают ошибки сегментации. При использовании этого аргумента, Bash будет использовать более надежные функции malloc из библиотеки Glibc.
Скомпилируем пакет:

make

Выполнение тестов не является обязательным для набора временных инструментов. Чтобы запустить выполнение тестов, в любом случае, выполним команду:

make tests

Установим пакет:

make install

Создаём символическую ссылку для программ, которые используют sh для работы с оболочкой:

ln -sv bash /tools/bin/sh

5.17. Bison-3.0.5

Пакет содержит GNU версию yacc (Ещё один компилятор компиляторов) необходимый для сборки некоторых пакетов LFS системы.
Подготовим пакет Bison к компиляции:

./configure --prefix=/tools

Скомпилируем пакет:

make

Для выполнения тестов, выполним команду:

make check

Установите пакет:

make install

5.18. Bzip2-1.0.6

Пакет содержит программы для сжатия и распаковки файлов. Он необходим для распаковки многих пакетов LFS. Сжатие текстовых файлов при помощи программы bzip2 даёт больший процент сжатия чем gzip.
Пакет Bzip2 не содержит сценария конфигурации configure. Выполним компиляцию и тестирование:

make

Установим пакет:

make PREFIX=/tools install

5.19. Coreutils-8.30

Coreutils - пакет программного обеспечения GNU, содержащий большое количество основных утилит, таких как cat, ls и rm, необходимых для UNIX-подобных операционных систем. Пакет включает несколько более ранних пакетов — textutils, shellutils и fileutils — и другие разнообразные утилиты.
Подготовим пакет Coreutils к компиляции:

./configure --prefix=/tools --enable-install-program=hostname

Значение параметров конфигурации:
--enable-install-program=hostname Аргумент включает в установку программу hostname. Эта программа по умолчанию выключена, но она необходима для выполнения набора тестов пакета Perl.
Скомпилируем пакет:

make

Выполнение тестов не является обязательным для набора временных инструментов. Чтобы запустить выполнение тестов, в любом случае, выполним команду:

make RUN_EXPENSIVE_TESTS=yes check

The RUN_EXPENSIVE_TESTS=yes аргумент сообщает включить в набор ресурсозатратные (с точки зрения мощности процессора и использования памяти) тесты для некоторых платформ. Как правило, такие тесты не вызывают проблем в Linux.
Установим пакет:

make install

5.20. Diffutils-3.6

Пакет содержит программы, которые отображают разницу в содержимом между файлами и каталогами. Эти программы могут быть использованы, для создания патчей, а также они используются в процедурах сборки для большинства пакетов.
Подготовим пакет Diffutils к компиляции:

./configure --prefix=/tools

Скомпилируем пакет:

make

Выполнение тестов не является обязательным для набора временных инструментов. Чтобы запустить выполнение тестов, в любом случае, выполните команду:

make check

Установим пакет:

make install

5.21. File-5.34

Пакет содержит утилиты для определения типов файлов. Некоторым пакетам требуется, чтобы этот пакет был установлен.
Подготовим пакет File к компиляции:

./configure --prefix=/tools

Скомпилируем пакет:

make

Выполнение тестов не является обязательным для набора временных инструментов. Чтобы запустить выполнение тестов, в любом случае, выполним команду:

make check

Установим пакет:
make install

5.22. Findutils-4.6.0

Findutils пакет содержит программы для поиска файлов. Программы предоставляют способы для рекурсивного поиска файлов по дереву каталогов, создания, обслуживания и поиска в базе данных (как правильно поиск выполняется быстрее, чем рекурсивный поиск, но менее надёжен, если база данных не в актуальном состоянии).
Сделаем некоторые исправления, требуемые glibc-2.28:

sed -i 's/IO_ftrylockfile/IO_EOF_SEEN/' gl/lib/*.c
sed -i '/unistd/a #include <sys/sysmacros.h>' gl/lib/mountlist.c
echo "#define _IO_IN_BACKUP 0x100" >> gl/lib/stdio-impl.h


Подготовим пакет Findutils к компиляции:

./configure --prefix=/tools

Скомпилируем пакет:

make

Выполнение тестов не является обязательным для набора временных инструментов. Чтобы запустить выполнение тестов, в любом случае, выполним команду:

make check

Установите пакет:

make install

5.23. Gawk-4.2.1

Пакет содержит программы для манипуляции с текстовыми файлами. Это GNU версия awk (Aho-Weinberg-Kernighan). Он используется в процедурах сборки для большинства пакетов.
Подготовим пакет Gawk к компиляции:

./configure --prefix=/tools

Скомпилируем пакет:

make

Выполнение тестов не является обязательным для набора временных инструментов. Чтобы запустить выполнение тестов, в любом случае, выполним команду:

make check

Установим пакет:

make install

5.24. Gettext-0.19.8.1

Пакет содержит утилиты и библиотеки для работы с локализацией и интернационализацией необходимые для некоторых пакетов. Что позволяет программам, которые скомпилированы с поддержкой NLS (Поддержка нативных языков), показывать сообщения в пользовательском нативном языке.
Для временного набора инструментов, необходимо скомпилировать и установить только три программы из пакета Gettext.
Подготовим пакет Gettext к компиляции:

cd gettext-tools
EMACS="no" ./configure --prefix=/tools --disable-shared


Значения параметров конфигурации:
EMACS="no" Аргумент сообщает сценарию конфигурирования не определять куда установить файлы Emacs Lisp. Как известно, такая проверка может вызывать зваисание, на некоторых хост-системах.
--disable-shared Не требуется установка и компиляция общих библиотек пакета Gettext.
Скомпилируем пакет:

make -C gnulib-lib
make -C intl pluralx.c
make -C src msgfmt
make -C src msgmerge
make -C src xgettext


Поскольку было скомпилировано всего три программы, запустить набор тестов невозможно, без компиляции дополнительных библиотек пакета Gettext. Поэтому не рекомендуется запускать наборы тестов на этом этапе.
Установим msgfmt, msgmerge и xgettext программы:

cp -v src/{msgfmt,msgmerge,xgettext} /tools/bin

5.25. Grep-3.1

Пакет содержит программу, которая находит на вводе строки, отвечающие заданному регулярному выражению, и выводит их, если вывод не отменён специальным ключом. Пакет используется в процедурах сборки для большинства пакетов.
Подготовим пакет Grep к компиляции:

./configure --prefix=/tools

Скомпилируем пакет:

make

Выполнение тестов не является обязательным для набора временных инструментов. Чтобы запустить выполнение тестов, в любом случае, выполним команду:

make check

Установим пакет:

make install

5.26. Gzip-1.9

Пакет содержит программы для сжатия и распаковки файлов. Он необходим, чтобы выполнять распаковку большинства пакетов LFS.
Сделаем некоторые исправления, требуемые glibc-2.28:

sed -i 's/IO_ftrylockfile/IO_EOF_SEEN/' lib/*.c
echo "#define _IO_IN_BACKUP 0x100" >> lib/stdio-impl.h


Подготовим пакет Gzip к компиляции:

./configure --prefix=/tools

Скомпилируем пакет:

make

Выполнение тестов не является обязательным для набора временных инструментов в этой главе. Чтобы запустить выполнение тестов, в любом случае, выполним команду:

make check

Установим пакет:

make install

5.27. Make-4.2.1

Пакет содержит программы которые автоматизируют процесс преобразования файлов из одной формы в другую. Чаще всего это компиляция исходного кода в объектные файлы и последующая компоновка в исполняемые файлы или библиотеки. Он необходим для сборки пакетов LFS.
Необходимо обойти ошибку, вызванную glibc-2.27:

sed -i '211,217 d; 219,229 d; 232 d' glob/glob.c

Подготовим пакет Make к компиляции:

./configure --prefix=/tools --without-guile

Значения параметров конфигурации:
--without-guile Аргумент указывает программе Make-4.2.1 не линковаться с библиотеками Guile, которые могут быть на хост-системе, но отсутствовать в среде chroot.
Скомпилируем пакет:

make

Выполнение тестов не является обязательным для набора временных инструментов. Чтобы запустить выполнение тестов, в любом случае, выполним команду:

make check

Установм пакет:

make install

5.28. Patch-2.7.6

Пакет содержит программу предназначенную для переноса правок (изменений) между разными версиями текстовых файлов. Информация о правке обычно содержится в отдельном файле, называемом "заплаткой" (patch), "правкой" или "файлом правки" (англ. patch file). Подобный файл, как правило, создается с помощью другой утилиты Unix — diff, позволяющей автоматически извлечь информацию о различиях в тексте файлов. Он необходим для выполнения сборки некоторых пакетов LFS.
Подготовим пакет Patch к компиляции:

./configure --prefix=/tools

Скомпилируем пакет:

make

Выполнение тестов не является обязательным для набора временных инструментов. Чтобы запустить выполнение тестов, в любом случае, выполним команду:

make check

Установим пакет:

make install

5.29. Perl-5.28.0

Высокоуровневый интерпретируемый динамический язык программирования общего назначения, он необходим для установки и выполнения тестов некоторых пакетов LFS.
Подготовим пакет Perl к компиляции:

sh Configure -des -Dprefix=/tools -Dlibs=-lm

Выполним сборку пакета:

make

Хотя Perl поставляется с набором тестов, было бы лучше пока воздержаться от тестирования.
На данный момент, только некоторые из утилит и библиотек должны быть установлены:

cp -v perl cpan/podlators/scripts/pod2man /tools/bin
mkdir -pv /tools/lib/perl5/5.28.0
cp -Rv lib/* /tools/lib/perl5/5.28.0

5.30. Sed-4.5

Sed - потоковый текстовый редактор (а также язык программирования), применяющий различные предопределённые текстовые преобразования к последовательному потоку текстовых данных. Он необходим для многих пакетов LFS, на этапе конфигурирования.
Подготовим пакет Sed к компиляции:

./configure --prefix=/tools

Скомпилируем пакет:

make

Выполнение тестов не является обязательным для набора временных инструментов. Чтобы запустить выполнение тестов, в любом случае, выполним команду:

make check

Установим пакет:

make install

5.31. Tar-1.30

Этот пакет обеспечивает возможности архивирования и извлечения почти всех пакетов, используемых в LFS.
Подготовим пакет Tar к компиляции:

./configure --prefix=/tools

Скомпилируем пакет:

make

Выполнение тестов не является обязательным для набора временных инструментов. Чтобы запустить выполнение тестов, в любом случае, выполним команду:

make check

Установим пакет:

make install

5.32. Texinfo-6.5

Этот пакет - система документирования и язык разметки, позволяющие создавать документы в разных форматах из одного исходного текста. Он используется в процедурах установки многих пакетов LFS.
Подготовим пакет к компиляции:

./configure --prefix=/tools

В процессе конфигурирования, могут быть отображены ошибки для TestXS_la-TestXS.lo..Эти ошибки не имеют никакого отношения к LFS, и их можно игнорировать.
Скомпилируем пакет:

make

Выполнение тестов не является обязательным для набора временных инструментов. Чтобы запустить выполнение тестов, в любом случае, выполним команду:

make check

Установим пакет:

make install

5.33. Util-linux-2.32.1

Пакет содержит стандартный набор служебных утилит командной строки, такие как - утилиты для работы с файловой системой, консолью, разделами, и сообщениями.
Подготовим пакет Util-linux к компиляции:

./configure --prefix=/tools \
--without-python \
--disable-makeinstall-chown \
--without-systemdsystemunitdir \
--without-ncurses \
PKG_CONFIG=""


Значения параметров конфигурации:
--without-python Этот аргумент отключает использование Python, если он установлен на хост-системе. Это позволяет избежать попыток построить выполнить сборку ненужных привязок.
--disable-makeinstall-chown Этот аргумент отключает использование команды chown в процессе установки. В этом нет необходимости, когда установка будет производится в каталог /tools. Также, это позволит избежать установки от пользователя root.
--without-ncurses Этот аргумент отключает использование библиотеки ncurses в процессе сборки. В этом нет необходимости, когда установка будет производится в каталог /tools. Также, это позволит избежать проблем при установке на некоторых дистрибутивах.
--without-systemdsystemunitdir На системах, где используется systemd, пакет будет устанавливать специфичные для systemd файлы в несуществующие места в каталоге /tools. Этот аргумент отключает действия, которые не требуются.
PKG_CONFIG="" Установка этой переменной окружения отключает добавления функций, которые не требуются и могут быть доступны в хост-системе. Обратите внимание что место, где устанавливается значение этой переменной различается от инструкций в других главах книги LFS. Здесь показан ещё один способ, каким образом можно устанавливать значения переменным окружения при использовании сценария configure.
Скомпилируем пакет:

make

Установим пакет:

make install

5.34. Xz-5.2.4

Пакет содержит программы для сжатия и распаковки файлов. Он обеспечивает высокое сжатие и используется для распаковки пакетов форматов XZ и LZMA. Сжатие текстовых файлов при помощи программы Xz даёт больший процент сжатия чем gzip или bzip2.
Подготовим пакет Xz к компиляции:

./configure --prefix=/tools

Скомпилируем пакет:

make

Выполнение тестов не является обязательным для набора временных инструментов. Чтобы запустить выполнение тестов, в любом случае, выполним команду:

make check

Установим пакет:

make install

5.35. Удаление ненужных файлов

Исполняемые файлы и библиотеки, которые были скомпилированы, имеют файлы отладочных символов, общим размером около 70 Мегабайт. Их можно удалить:

strip --strip-debug /tools/lib/*
/usr/bin/strip --strip-unneeded /tools/{,s}bin/*


Этот набор команд пропустит некоторые файлы, сообщив что не удается распознать формат. Большинство из них являются файлами сценариев а не библиотеками. Также, используется системная команда очистки бинарных файлов в каталоге /tools.
Будем осторожны, и не применяем аргумент --strip-unneeded к библиотекам. Статические библиотеки будут уничтожены и пакеты временного набора инструментов придется компилировать заново.
Можно удалить документацию:

rm -rf /tools/{,share}/{info,man,doc}

Удаление ненужных файлов:

find /tools/{lib,libexec} -name \*.la -delete

5.36. Изменение прав

Далее команды должны выполняться от пользователя root и более не использовать временного пользователя lfs. Также, проверяем, что переменная окружения $LFS установлена пользователю root.
Сейчас, права на каталог $LFS/tools принадлежат пользователю lfs, который существует только в хост-системе. Если права на каталог оставить как есть, файлы будут иметь принадлежность к пользовательскому идентификатору но без соответствующей учетной записи. Это небезопасно, потому что в дальнейшем когда будут создаваться новые учетные записи, идентификатор может быть кому нибудь назначен, и права на этот каталог будут ему предоставлены, следовательно он сможет манипулировать всем содержимым каталога без каких либо ограничений.
Во избежание этой проблемы, позднее, можно добавить пользователя lfs в новую систему, когда будет создан файл /etc/passwd, назначим ему тоже имя и идентификатор группы как в хост-системе. Лучше всего изменить права на каталог $LFS/tools, и назначить их пользователю root, запустив команду:

chown -R root:root $LFS/tools

Несмотря на то, что каталог $LFS/tools может быть удалён, как только сборка системы LFS будет завершена, его можно сохранить для сборки другой системы LFS, выполнив резервное копирование каталога $LFS/tools.

Продаются
книги

Оставить отзыв

Установи и
БУДЕШЬ СЧАСТЛИВ!

Спасибо, Господи, что взял деньгами...

Scrooge
Dollar
Ruble
Ruble
Gold