Bootstrap: различия между версиями
м (→Применяем ручки: test) |
м (→Настраиваем hasher: 1-2-3) |
||
Строка 55: | Строка 55: | ||
Задействование этого всего вместе с указанием о необходимости перепаковки полученного на входе src.rpm может выглядеть в {{path|~/.hasher/config}} так: | Задействование этого всего вместе с указанием о необходимости перепаковки полученного на входе src.rpm может выглядеть в {{path|~/.hasher/config}} так: | ||
== первая стадия == | |||
Отрываем ''всё'', что можем, включаем [https://bugzilla.altlinux.org/8579 перепаковку srpm] перед выяснением сборочных зависимостей для учёта ключиков: | |||
<pre> | <pre> | ||
known_mountpoints=/proc | known_mountpoints=/proc | ||
repackage_source=1 | repackage_source=1 | ||
query_repackage=1 | query_repackage=1 | ||
rpmargs='--with bootstrap --disable check --without check --disable static --without doc --without apidocs --without profile --disable selinux --without selinux --disable java --without java --without python3 --disable ldap --disable udev' | rpmargs='--with bootstrap --disable check --without check --disable static --without doc --without apidocs --disable profile --without profile --disable selinux --without selinux --disable java --without java --without python3 --disable ldap --disable udev' | ||
# rpm | |||
rpmargs="$rpmargs --without libelf" | |||
# libcap-ng | # libcap-ng | ||
rpmargs="$rpmargs --without python" | rpmargs="$rpmargs --without python" | ||
Строка 66: | Строка 71: | ||
# vim | # vim | ||
rpmargs="$rpmargs --disable gui_gnome2 --disable gui_gtk2 --disable gui_neXtaw --disable perlinterp --disable rubyinterp --disable tclinterp --disable luainterp --disable gui_any" | rpmargs="$rpmargs --disable gui_gnome2 --disable gui_gtk2 --disable gui_neXtaw --disable perlinterp --disable rubyinterp --disable tclinterp --disable luainterp --disable gui_any" | ||
# openssl10 | |||
rpmargs="$rpmargs --without krb" | |||
# curl | |||
rpmargs="$rpmargs --without ssl" | |||
# util-linux | |||
rpmargs="$rpmargs --without audit --without udev" | |||
# audit | |||
rpmargs="$rpmargs --without prelude" | |||
</pre> | </pre> | ||
=== вторая стадия === | |||
После успешной сборки openssl10: | |||
* убираем '''--without ssl''' (т.е. разрешаем с ним собираться); | |||
* пересобираем python, | |||
после этого python-dev должен устанавливаться штатно без неудовлетворённой зависимости на _ssl. | |||
=== третья стадия === | |||
Разрешаем статическую сборку (убираем '''--disable static'''), пересобираем пакеты xz zlib bzip2 libpopt elfutils libdb4.7, затем rpm apt apt-repo-tools | |||
= Расставляем ручки = | = Расставляем ручки = |
Версия от 21:04, 9 февраля 2016
«Раскрутка» ALT Linux с нуля
...на новой архитектуре либо при необходимости обеспечить пересборку «с нуля» по иному поводу.
Типичная процедура
Начинаем с какой-либо существующей бинарной среды, пригодной для сборки содержимого базовой сборочной системы сизифа (rpm-build и его зависимости); см., например, опыт портирования на ARM.
Поскольку на первых порах собираемое будет устанавливаться в неё же, есть смысл работать в чруте, представляющем из себя копию корневой файловой системы, со смонтированным /proc.
- сперва собираем rpm
- для новой архитектуры потребуется дополнить installplatform, rpmrc.in
- может потребоваться подпирание по месту, отрыв статической сборки и т.п.
- после успешной сборки устанавливаем полученное и собираем rpm.rpm
- затем собираем toolchain (binutils, gcc, glibc)
- устанавливаем в сборочное окружение по мере сборки
- собираем все архитектурнозависимые пакеты, необходимые для сборки hasher
- rpm --rebuild --nodeps
- см. далее про ручки помимо --with bootstrap
- основное отрываемое: check, static, doc, apidocs, selinux, ssl, python, java
- запустив hasher, пересобираем его сборочные зависимости в нём самом (порядка 150 пакетов)
- разворачиваем BuildRequires по мере возможности, продолжая на этой стадии отключать избыточное
- по возможности дополняем в спеках набор ручек для отключения лишнего (тоже см. ниже)
- не откладывая в долгий ящик, стараемся пропихнуть полученные патчи в сизиф
- продолжаем работу над пополнением порта
При длительной сборке пакетов и ошибке в %files могут оказаться полезными возможности rpmbuild по продолжению сборки пакета:
rpm -bi --nodeps --short-circuit --without ... этот.spec rpm -bb --nodeps --short-circuit --disable ... этот.spec
Форма с -bi выполнит повторно секцию %install, а -bb отработает по %files, предполагая наличие уже установленного в пакет-buildroot/ содержимого.
Обратите внимание, что rpmbuild при указании --nodeps игнорирует сборочные зависимости, а не установочные.
Применяем ручки
Для начальной сборки при помощи rpm могут быть полезны следующие уже распространённые в сизифе ключи сборки пакетов:
- --disable check --without check --disable test --without test --disable static --without doc --without apidocs --without profile --disable selinux --without selinux --disable java --without java --without python3 --disable ldap --disable udev
Для конкретных пакетов могут быть реализованы иные, например:
- vim: --disable gui_gnome2 --disable gui_gtk2 --disable gui_neXtaw --disable perlinterp --disable rubyinterp --disable tclinterp --disable luainterp --disable gui_any
- python: --without valgrind --without tk
- libcap-ng: --without-python
- openssl10: --without-krb
- curl: --without-ssl
- где-то ещё видел cxx, cpp, nls, included_gettext
при этом:
- вполне возможно дополнить и другими ручками, но сперва лобовой rpm -ba --nodeps на имеющемся сборочном окружении
- хорошо бы по возможности приводить их к единой системе и фиксировать здесь
- тесты полезны в нормальном режиме, но занимают существенное время, а нередко требуют дополнительных BR или обламываются по мелочам (один перловый тест из ~6000, ага)
Настраиваем hasher
Задействование этого всего вместе с указанием о необходимости перепаковки полученного на входе src.rpm может выглядеть в ~/.hasher/config так:
первая стадия
Отрываем всё, что можем, включаем перепаковку srpm перед выяснением сборочных зависимостей для учёта ключиков:
known_mountpoints=/proc repackage_source=1 query_repackage=1 rpmargs='--with bootstrap --disable check --without check --disable static --without doc --without apidocs --disable profile --without profile --disable selinux --without selinux --disable java --without java --without python3 --disable ldap --disable udev' # rpm rpmargs="$rpmargs --without libelf" # libcap-ng rpmargs="$rpmargs --without python" # python rpmargs="$rpmargs --without valgrind --without tk" # vim rpmargs="$rpmargs --disable gui_gnome2 --disable gui_gtk2 --disable gui_neXtaw --disable perlinterp --disable rubyinterp --disable tclinterp --disable luainterp --disable gui_any" # openssl10 rpmargs="$rpmargs --without krb" # curl rpmargs="$rpmargs --without ssl" # util-linux rpmargs="$rpmargs --without audit --without udev" # audit rpmargs="$rpmargs --without prelude"
вторая стадия
После успешной сборки openssl10:
- убираем --without ssl (т.е. разрешаем с ним собираться);
- пересобираем python,
после этого python-dev должен устанавливаться штатно без неудовлетворённой зависимости на _ssl.
третья стадия
Разрешаем статическую сборку (убираем --disable static), пересобираем пакеты xz zlib bzip2 libpopt elfutils libdb4.7, затем rpm apt apt-repo-tools
Расставляем ручки
Поскольку анализ и разрывание циклов сборочных зависимостей — занятие довольно трудоёмкое и муторное, стоит фиксировать информацию о них в сизифных пакетах, чтоб в следующий раз было чуть легче (и нет, я видел уже слишком много случаев «это же только сейчас помучиться»).
Предлагаю дополнять спеки пакетов, которые затрагивает бутстрап базового сборочного окружения, параметром bootstrap, не перекрывающимся с перечисленными выше уже существующими; в частности:
- отключать сборку man/info, если требует help2man/makeinfo/texinfo;
- довольно неприятны в плане бутстрапа по части perl-*, если нет возможности воспользоваться имеющимися хостовыми или noarch-пакетами
- отключать поддержку SSL;
- задействовать bundle'ные gnulib/glib/... вместо системных, если есть;
- возможно, в %configure добавлять --disable-asm --disable-gtk-doc
Также обратите внимание на произведение --{without,disable} {test,check}, при обнаружении отличающегося от --disable check рекомендуется приводить к общему знаменателю