В прошлой записи были заданны переменные окружения для пользователя user и подготовлена файловая система для сборки.

Немного о папках подробнее:

  • /cross-tools — собственно предназначена для кросскомпилятора. Может самостоятельно использоваться из на данный момент основной системы.
  • /tools — будет содержать в себе временную систему, на базе которой в дальнейшем будет происходить сбор собственно дистрибутива. Для сборки чистого кросскомпилятора можно обойтись и без неё.
  • /sources — используется для хранения исходных текстов программ и их компиляции.

Команды данные для компиляции программы из исходных текстов предполагаются, что архив с исходным кодом уже скачан, распакован и повествование ведётся изнутри этой папки.

Всего будет необходимо скачать следующие программы:

Лично я качал самые свежие версии. Этот путь тернист и, возможно, ждут в будущем определённые баги. Но система собирается раз и на долгое время. Что-то может быть будет обновлено в будущем, а что-то будет обновлять сложно. Поэтому желательно, чтобы программы были в актуальном состоянии как можно дольше.

ВАЖНО ВЫПОЛНИТЬ ПЕРЕД СБОРКОЙ КРОССКОМПИЛЯТОРА

Перед началом процесса проверьте на что ссылается /bin/sh:
$ ls -l /bin/shЕсли на несуществующий dash, то сделайте симлинк на /bin/bash:
# rm -r /bin/sh # ln -sv /bin/bash /bin/shБез этого на самом последнем шагу gcc откажется собираться и придётся повторять весь процесс компиляции, начиная с Binutils.

Сборка File 5.28

Небольшая программка, которая используется для идентификации типа файла.

$ ./configure --prefix=/cross-tools $ make $ make installprefix указывает, куда будет установлена программа

Установка Linux Headers 4.7

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

$ make ARCH=x86_64 headers_check $ make ARCH=x86_64 INSTALL_HDR_PATH=/tools headers_install

M4 1.4.17

Представляет из себя макропроцессор и требуется для GMP.

$ ./configure --prefix=/cross-tools $ make $ make install

Ncurses 6.0 и получение информации о терминале

На данный момент нам не нужна полная библиотека, достаточно лишь небольшой утилиты tic. Которая при компиляции и установке создаст базу данных о терминалах в /cross-tools/share/terminfo.

$ ./configure --prefix=/cross-tools --without-debug $ make -C include $ make -C progs tic $ install -v -m755 progs/tic /cross-tools/bin

Установка pkg-config-lite 0.28-1

Используется многими программами для компиляции, чтобы найти зависимости. При этом может затронуть файлы базовой системы. Чтобы этого не произошло, сконфигурируем пакет на поиск файлов в /tools.

$ ./configure --prefix=/cross-tools --host=${CLFS_TARGET} --with-pc-path=/tools/lib/pkgconfig:/tools/share/pkgconfig $ make $ make install

Сборка GMP 6.1

Данная библиотека необходима для кросскомпилятора gcc и реализует работу с большими числами.

$ ./configure --prefix=/cross-tools --enable-cxx --disable-static $ make $ make install

MPFR 3.1.4

Используется для работы с дробными числами и также требуется для сборки gcc.

$ LDFLAGS="-Wl,-rpath,/cross-tools/lib" ./configure --prefix=/cross-tools --disable-static --with-gmp=/cross-tools $ make $ make install

MPC 1.0.3

А эта библиотека реализует уже работу с комплексными числами. gcc требуется и она.

$ LDFLAGS="-Wl,-rpath,/cross-tools/lib" ./configure --prefix=/cross-tools --disable-static --with-gmp=/cross-tools --with-mpfr=/cross-tools $ make $ make install

ISL 0.17

Библиотека для работы с целыми числами. Не входит в обязательные требования gcc, но лучше собрать кросскомпилятор с ней. Быстрее бегать будет.

$ LDFLAGS="-Wl,-rpath,/cross-tools/lib" ./configure --prefix=/cross-tools --disable-static --with-gmp-prefix=/cross-tools $ make $ make install

Binutils 2.26

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

$ mkdir ../bin-build $ cd ../bin-build $ AR=ar AS=as ../binutils-2.26/configure --prefix=/cross-tools --host=${LFS64_HOST} --target=${LFS64_TARGET} --with-sysroot=${LFS64} --with-lib-path=/tools/lib --disable-nls --disable-static --enable-64-bit-bfd --disable-multilib --enable-gold=yes --enable-plugins --enable-threads --disable-werror $ make $ make install

Временный GCC 6.1

Потребуется для сборки Glibc 2.23, а потом уже только можно собрать полную версию кросскомпилятора в GNU/Linux. При этом компилируется не полная версия компилятора, а лишь нужный кусочек. Собирается также в отдельной папке.

$ mkdir ../gcc-build $ cd ../gcc-build $ AR=ar LDFLAGS="-Wl,-rpath,/cross-tools/lib" ../gcc-6.1.0/configure --prefix=/cross-tools --build=${LFS64_HOST} --host=${LFS64_HOST} --target=${LFS64_TARGET} --with-sysroot=${LFS64} --with-local-prefix=/tools --with-native-system-header-dir=/tools/include --disable-shared --with-mpfr=/cross-tools --with-gmp=/cross-tools --with-isl=/cross-tools --with-mpc=/cross-tools --without-headers --with-newlib --disable-decimal-float --disable-libgomp --disable-libssp --disable-libatomic --disable-libitm --disable-libsanitizer --disable-libquadmath --disable-libvtv --disable-libcilkrts --disable-libstdc++-v3 --disable-threads --disable-multilib --with-system-zlib --enable-languages=c --with-glibc-version=2.23 $ make all-gcc all-target-libgcc $ make install-gcc install-target-libgcc

Компиляция Glibc 2.23 с помощью GCC 6.1

Тут я и столкнулся с первой кочкой на тернистом пути свежих версий, последний (на данный момент) GCC не хочет нормально собирать конструкции вида:

if() if() ... else ... else ... Для успешной сборки необходимо расставить скобочки:
if(){ if() ... else ... }else ... У меня лично компилятор застопорился на двух таких местах при сборке Glibc 2.23. Благо он говорит в каком файле и какой строчке находится проблема.

Ну а сам пакет содержит в себе основную библиотеку C для GNU/Linux и собирается в отдельной папке:

$ mkdir ../glibc-build $ cd ../glibc-build $ BUILD_CC="gcc" CC="${LFS64_TARGET}-gcc ${BUILD64}" AR="${LFS64_TARGET}-ar" RANLIB="${LFS64_TARGET}-ranlib" ../glibc-2.23/configure --prefix=/tools --host=${LFS64_TARGET} --build=${LFS64_HOST} --enable-kernel=2.6.32 --with-binutils=/cross-tools/bin --with-headers=/tools/include --enable-obsolete-rpc $ make $ make install

Сборка финальной версии GCC 6.1

Собственно осталось собрать именно кросскомпилятор, но сначала необходимо очистить файлы, созданные при сборке временной версии:

$ cd ../gcc-build $ rm -rf * $ AR=ar LDFLAGS="-Wl,-rpath,/cross-tools/lib" ../gcc-6.1.0/configure --prefix=/cross-tools --build=${LFS64_HOST} --host=${CLFS64_HOST} --target=${LFS64_TARGET} --with-sysroot=${LFS64} --with-local-prefix=/tools --with-native-system-header-dir=/tools/include --with-libs=/tools/lib --disable-nls --disable-static --enable-languages=c,c++ --disable-multilib --with-mpc=/cross-tools --with-mpfr=/cross-tools --with-gmp=/cross-tools --with-isl=/cross-tools --with-system-zlib $ make AS_FOR_TARGET="${LFS64_TARGET}-as" LD_FOR_TARGET="${LFS64_TARGET}-ld" $ make install

Добавление переменных окружений кросскомпилятора

Чтобы каждый раз не указывать следующие переменные, занесём в глобальные переменные следующие сокращения:
export CC="${LFS64_TARGET}-gcc ${BUILD64}" export CXX="${LFS64_TARGET}-g++ ${BUILD64}" export AR="${LFS64_TARGET}-ar" export AS="${LFS64_TARGET}-as" export RANLIB="${LFS64_TARGET}-ranlib" export LD="${LFS64_TARGET}-ld" export STRIP="${LFS64_TARGET}-strip"А чтобы не делать это при каждом логине в терминал, добавим их в файл /home/user/.bashrc

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

Итоги

В конце необходимо удалить все файлы, которые были сгенерированы при сборке пакетов. Они теперь не нужны.

Дальше опробовал его на деле во время сборки временной системы.

Навигация по записям