Bootstrap: различия между версиями

Материал из ALT Linux Wiki
(не показано 5 промежуточных версий этого же участника)
Строка 3: Строка 3:
...на новой [[ports|архитектуре]] либо при необходимости обеспечить пересборку «с нуля» по иному поводу.
...на новой [[ports|архитектуре]] либо при необходимости обеспечить пересборку «с нуля» по иному поводу.


NB: glebfm@ разработан [http://git.altlinux.org/people/glebfm/public/?p=bootstrap.git инструментарий] для автоматизации процесса.
NB: glebfm@ разработан [http://git.altlinux.org/people/glebfm/public/?p=bootstrap.git инструментарий] для автоматизации процесса, см. тж. [http://0x1.tv/20170923J доклад] на OSSDEVCONF-2017.


= Типичная процедура =
= Типичная процедура =
Строка 49: Строка 49:
* libao: <tt>--disable pulse</tt>
* libao: <tt>--disable pulse</tt>
* SDL: <tt>--without pulse</tt>
* SDL: <tt>--without pulse</tt>
* libshell, libgtk+2: <tt>--disable man</tt>
* где-то ещё видел <tt>cxx, cpp, nls, included_gettext</tt> <!-- TODO: список по всему сизифу? // mike@ -->
* где-то ещё видел <tt>cxx, cpp, nls, included_gettext</tt> <!-- TODO: список по всему сизифу? // mike@ -->
* '''внимание:''' qt5-* используют <tt>--disable bootstrap</tt> в своих целях (отвязка от qt5-tools)! это не противоречит предлагаемому <tt>--with-bootstrap</tt>, но может сбить с толку
* '''внимание:''' qt5-* используют <tt>--disable bootstrap</tt> в своих целях (отвязка от qt5-tools)! это не противоречит предлагаемому <tt>--with-bootstrap</tt>, но может сбить с толку
Строка 101: Строка 102:
Поскольку анализ и разрывание циклов сборочных зависимостей — занятие довольно трудоёмкое и муторное, стоит фиксировать информацию о них в сизифных пакетах, чтоб в следующий раз было чуть легче (и нет, я видел уже слишком много случаев «это же только сейчас помучиться»).
Поскольку анализ и разрывание циклов сборочных зависимостей — занятие довольно трудоёмкое и муторное, стоит фиксировать информацию о них в сизифных пакетах, чтоб в следующий раз было чуть легче (и нет, я видел уже слишком много случаев «это же только сейчас помучиться»).


Предлагаю дополнять спеки пакетов, которые затрагивает бутстрап базового сборочного окружения, параметром bootstrap, ''не'' перекрывающимся с перечисленными выше уже существующими; в частности:
Предлагаю дополнять спеки пакетов, которые затрагивает бутстрап базового сборочного окружения, параметром bootstrap (''with'', не enable -- см. ниже), ''не'' перекрывающимся с перечисленными выше уже существующими; в частности:
# отключать сборку man/info, если требует {{pkg|help2man}}/{{pkg|makeinfo}}/{{pkg|texinfo}};
# отключать сборку man/info, если требует {{pkg|help2man}}/{{pkg|makeinfo}}/{{pkg|texinfo}};
#* довольно неприятны в плане бутстрапа по части {{pkg|perl-*}}, если нет возможности воспользоваться имеющимися хостовыми или noarch-пакетами
#* довольно неприятны в плане бутстрапа по части {{pkg|perl-*}}, если нет возможности воспользоваться имеющимися хостовыми или noarch-пакетами
Строка 107: Строка 108:
# задействовать bundle'ные gnulib/glib/... вместо системных, если есть;
# задействовать bundle'ные gnulib/glib/... вместо системных, если есть;
# возможно, в <tt>%configure</tt> добавлять <tt>--disable-asm --disable-gtk-doc</tt>
# возможно, в <tt>%configure</tt> добавлять <tt>--disable-asm --disable-gtk-doc</tt>
Обратите внимание на то, что ''enable'' bootstrap используется в:
* qt5-xmlpatterns, qt5-declarative
* libpsl


Также обратите внимание на произведение <tt>--{without,disable} {test,check}</tt>, при обнаружении отличающегося от '''<tt>--disable check</tt>''' рекомендуется приводить к общему знаменателю.
Также обратите внимание на произведение <tt>--{without,disable} {test,check}</tt>, при обнаружении отличающегося от '''<tt>--disable check</tt>''' рекомендуется приводить к общему знаменателю.
Строка 112: Строка 117:
Применять можно, например, так:
Применять можно, например, так:
  gear-rpm -bs --nodeps --commit --define '_without_doc 1' --define '_without_idn 1'
  gear-rpm -bs --nodeps --commit --define '_without_doc 1' --define '_without_idn 1'
= Не попавшее в сизиф =
* [http://git.altlinux.org/people/mike/packages/?p=curl.git;a=shortlog;h=refs/heads/bootstrap curl] (static, ssl, python, krb5; bootstrap; "патч страшный")
* [http://git.altlinux.org/people/mike/packages/?p=rpcbind.git;a=shortlog;h=refs/heads/bootstrap rpcbind] (systemd; "не надо ручек")


= Ссылки =
= Ссылки =
Строка 124: Строка 133:
* [https://bugzilla.altlinux.org/8579 --query-repackage does not work properly]
* [https://bugzilla.altlinux.org/8579 --query-repackage does not work properly]
* [https://lists.altlinux.org/pipermail/devel/2005-April/114109.html |devel| Re: Q: hsh --repackage-source]
* [https://lists.altlinux.org/pipermail/devel/2005-April/114109.html |devel| Re: Q: hsh --repackage-source]
* порт BH_QUERY_REPACKAGE с girar на beehive есть у bircoph@
* [http://forum.altlinux.org/index.php?topic=40511.msg320666#msg320666 Re: Инструментальные средства сборки базовой системы]


[[Категория:Sisyphus]]
[[Категория:Sisyphus]]
{{Category navigation|title=Ports|category=Ports|sortkey=*}}
{{Category navigation|title=Ports|category=Ports|sortkey=*}}

Версия от 13:45, 16 января 2021

«Раскрутка» ALT с нуля

...на новой архитектуре либо при необходимости обеспечить пересборку «с нуля» по иному поводу.

NB: glebfm@ разработан инструментарий для автоматизации процесса, см. тж. доклад на OSSDEVCONF-2017.

Типичная процедура

Начинаем с какой-либо существующей бинарной среды, пригодной для сборки содержимого базовой сборочной системы сизифа (rpm-build и его зависимости); см., например, опыт портирования на ARM.

Поскольку на первых порах собираемое будет устанавливаться в неё же, есть смысл работать в чруте, представляющем из себя копию корневой файловой системы, со смонтированными /proc и /dev/pts.

  1. сперва собираем rpm
    • для новой архитектуры потребуется дополнить installplatform, rpmrc.in
    • может потребоваться подпирание по месту, отрыв функциональности и т.п.
    • после успешной сборки устанавливаем полученное и собираем rpm.rpm
  2. затем собираем toolchain (binutils, gcc, glibc)
    • устанавливаем в сборочное окружение по мере сборки
  3. собираем все архитектурнозависимые пакеты, необходимые для сборки hasher
    • rpm --rebuild --nodeps
    • см. далее про ручки помимо --with bootstrap
    • основное отрываемое: check, static, doc, apidocs, selinux, ssl, python, java
  4. запустив hasher, пересобираем его сборочные зависимости в нём самом (порядка 150 пакетов)
    • разворачиваем BuildRequires по мере возможности, продолжая на этой стадии отключать избыточное
    • по возможности дополняем в спеках набор ручек для отключения лишнего (тоже см. ниже)
  5. не откладывая в долгий ящик, стараемся пропихнуть полученные патчи в сизиф
  6. продолжаем работу над пополнением порта

При длительной сборке пакетов и ошибке в %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
  • libao: --disable pulse
  • SDL: --without pulse
  • libshell, libgtk+2: --disable man
  • где-то ещё видел cxx, cpp, nls, included_gettext
  • внимание: qt5-* используют --disable bootstrap в своих целях (отвязка от qt5-tools)! это не противоречит предлагаемому --with-bootstrap, но может сбить с толку
  • внимание: а вот perl-* порой используют --without bootstrap в своих целях, причём в случае perl-Pod-Usage теряется зависимость на perl-podlators, что может неочевидным образом разваливать сборку других пакетов (вроде perl-Package)

при этом:

  1. вполне возможно дополнить и другими ручками, но сперва лобовой rpm -ba --nodeps на имеющемся сборочном окружении
  2. хорошо бы по возможности приводить их к единой системе и фиксировать здесь
  3. тесты полезны в нормальном режиме, но занимают существенное время, а нередко требуют дополнительных 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 (with, не enable -- см. ниже), не перекрывающимся с перечисленными выше уже существующими; в частности:

  1. отключать сборку man/info, если требует help2man/makeinfo/texinfo;
    • довольно неприятны в плане бутстрапа по части perl-*, если нет возможности воспользоваться имеющимися хостовыми или noarch-пакетами
  2. отключать поддержку SSL;
  3. задействовать bundle'ные gnulib/glib/... вместо системных, если есть;
  4. возможно, в %configure добавлять --disable-asm --disable-gtk-doc

Обратите внимание на то, что enable bootstrap используется в:

  • qt5-xmlpatterns, qt5-declarative
  • libpsl

Также обратите внимание на произведение --{without,disable} {test,check}, при обнаружении отличающегося от --disable check рекомендуется приводить к общему знаменателю.

Применять можно, например, так:

gear-rpm -bs --nodeps --commit --define '_without_doc 1' --define '_without_idn 1'

Не попавшее в сизиф

  • curl (static, ssl, python, krb5; bootstrap; "патч страшный")
  • rpcbind (systemd; "не надо ручек")

Ссылки