Bootstrap: различия между версиями
м (ещё пара слов) |
м (→Ссылки: +2) |
||
(не показано 26 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
= «Раскрутка» ALT | = «Раскрутка» ALT с нуля = | ||
...на новой архитектуре либо при необходимости обеспечить пересборку «с нуля» по иному поводу. | ...на новой [[ports|архитектуре]] либо при необходимости обеспечить пересборку «с нуля» по иному поводу. | ||
NB: glebfm@ разработан [http://git.altlinux.org/people/glebfm/public/?p=bootstrap.git инструментарий] для автоматизации процесса, см. тж. [http://0x1.tv/20170923J доклад] на OSSDEVCONF-2017. | |||
= Типичная процедура = | = Типичная процедура = | ||
Строка 7: | Строка 9: | ||
Начинаем с какой-либо существующей бинарной среды, пригодной для сборки содержимого базовой сборочной системы сизифа (rpm-build и его зависимости); см., например, [[Ports/arm/Experience|опыт портирования на ARM]]. | Начинаем с какой-либо существующей бинарной среды, пригодной для сборки содержимого базовой сборочной системы сизифа (rpm-build и его зависимости); см., например, [[Ports/arm/Experience|опыт портирования на ARM]]. | ||
Поскольку на первых порах собираемое будет устанавливаться в неё же, есть смысл работать в чруте, представляющем из себя копию корневой файловой системы, со | Поскольку на первых порах собираемое будет устанавливаться в неё же, есть смысл работать в чруте, представляющем из себя копию корневой файловой системы, со смонтированными /proc и /dev/pts. | ||
# сперва собираем rpm | # сперва собираем rpm | ||
#* для новой архитектуры потребуется [http://git.altlinux.org/gears/r/rpm.git?p=rpm.git;a=commitdiff;h=ed33f2daf72e74cf5f5ff33efac2c14714c25bac дополнить] installplatform, rpmrc.in | #* для новой архитектуры потребуется [http://git.altlinux.org/gears/r/rpm.git?p=rpm.git;a=commitdiff;h=ed33f2daf72e74cf5f5ff33efac2c14714c25bac дополнить] installplatform, rpmrc.in | ||
#* может потребоваться подпирание по месту, отрыв | #* может потребоваться подпирание по месту, отрыв функциональности и т.п. | ||
#* после успешной сборки устанавливаем полученное и собираем rpm.rpm | #* после успешной сборки устанавливаем полученное и собираем rpm.rpm | ||
# затем собираем toolchain (binutils, gcc, glibc) | # затем собираем toolchain (binutils, gcc, glibc) | ||
Строка 24: | Строка 26: | ||
# не откладывая в долгий ящик, стараемся пропихнуть полученные патчи в сизиф | # не откладывая в долгий ящик, стараемся пропихнуть полученные патчи в сизиф | ||
# продолжаем работу над пополнением порта | # продолжаем работу над пополнением порта | ||
При длительной сборке пакетов и ошибке в <tt>%files</tt> могут оказаться полезными возможности {{cmd|rpmbuild}} по ''продолжению'' сборки пакета: | |||
rpm -bi --nodeps --short-circuit --without ... этот.spec | |||
rpm -bb --nodeps --short-circuit --disable ... этот.spec | |||
Форма с <tt>-bi</tt> выполнит повторно секцию <tt>%install</tt>, а <tt>-bb</tt> отработает по <tt>%files</tt>, предполагая наличие уже установленного в {{path|''пакет''-buildroot/}} содержимого. | |||
Обратите внимание, что {{cmd|rpmbuild}} при указании <tt>--nodeps</tt> игнорирует ''сборочные'' зависимости, а не установочные. | |||
= Применяем ручки = | = Применяем ручки = | ||
Строка 29: | Строка 39: | ||
Для начальной сборки при помощи {{pkg|rpm}} могут быть полезны следующие уже распространённые в сизифе ключи сборки пакетов: | Для начальной сборки при помощи {{pkg|rpm}} могут быть полезны следующие уже распространённые в сизифе ключи сборки пакетов: | ||
* <tt>--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</tt> | * <tt>--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</tt> | ||
Для конкретных пакетов могут быть реализованы иные, например: | Для конкретных пакетов могут быть реализованы иные, например: | ||
* vim: <tt>--disable gui_gnome2 --disable gui_gtk2 --disable gui_neXtaw --disable perlinterp --disable rubyinterp --disable tclinterp --disable luainterp --disable gui_any</tt> | * vim: <tt>--disable gui_gnome2 --disable gui_gtk2 --disable gui_neXtaw --disable perlinterp --disable rubyinterp --disable tclinterp --disable luainterp --disable gui_any</tt> | ||
* python: <tt>--without valgrind --without tk</tt> | * python: <tt>--without valgrind --without tk</tt> | ||
* где-то ещё видел <tt>cxx, cpp, nls, included_gettext</tt> | * libcap-ng: <tt>--without-python</tt> | ||
* openssl10: <tt>--without-krb</tt> | |||
* curl: <tt>--without-ssl</tt> | |||
* libao: <tt>--disable pulse</tt> | |||
* SDL: <tt>--without pulse</tt> | |||
* libshell, libgtk+2: <tt>--disable man</tt> | |||
* где-то ещё видел <tt>cxx, cpp, nls, included_gettext</tt> <!-- TODO: список по всему сизифу? // mike@ --> | |||
* '''внимание:''' qt5-* используют <tt>--disable bootstrap</tt> в своих целях (отвязка от qt5-tools)! это не противоречит предлагаемому <tt>--with-bootstrap</tt>, но может сбить с толку | |||
* '''внимание:''' а вот perl-* порой используют <tt>--without bootstrap</tt> в своих целях, причём в случае perl-Pod-Usage [https://bugzilla.altlinux.org/show_bug.cgi?id=31371 теряется] зависимость на perl-podlators, что может неочевидным образом разваливать сборку других пакетов (вроде perl-Package) | |||
при этом: | при этом: | ||
Строка 44: | Строка 62: | ||
Задействование этого всего вместе с указанием о необходимости перепаковки полученного на входе 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" | ||
Строка 55: | Строка 78: | ||
# 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 | |||
= Расставляем ручки = | = Расставляем ручки = | ||
Строка 61: | Строка 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-пакетами | ||
Строка 68: | Строка 109: | ||
# возможно, в <tt>%configure</tt> добавлять <tt>--disable-asm --disable-gtk-doc</tt> | # возможно, в <tt>%configure</tt> добавлять <tt>--disable-asm --disable-gtk-doc</tt> | ||
Также обратите внимание на произведение <tt>--{without,disable} {test,check}</tt>, при обнаружении отличающегося от '''<tt>--disable check</tt>''' рекомендуется приводить к общему знаменателю | Обратите внимание на то, что ''enable'' bootstrap используется в: | ||
* qt5-xmlpatterns, qt5-declarative | |||
* libpsl | |||
Также обратите внимание на произведение <tt>--{without,disable} {test,check}</tt>, при обнаружении отличающегося от '''<tt>--disable check</tt>''' рекомендуется приводить к общему знаменателю. | |||
Применять можно, например, так: | |||
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; "не надо ручек") | |||
= renoarch = | |||
Порой циклы BuildRequires: оказывается удобно разрывать при помощи srpm специального вида, содержащих перепакованные noarch.rpm и собирающиеся в них же, но без "проблемных" BR: (с пустым списком таковых). Для создания таких времянок может пригодиться скрипт [http://lists.altlinux.org/pipermail/devel-ports/2021-November/000927.html renoarch] (см. [http://git.altlinux.org/people/iv/public/?p=renoarch.git;a=blob;f=renoarch;hb=HEAD доработанную версию iv@] с поправкой на ".rv64"). | |||
= Ссылки = | = Ссылки = | ||
Строка 74: | Строка 130: | ||
* [[Ports]] | * [[Ports]] | ||
* [[Ports/arm/Experience]] (kas@) | * [[Ports/arm/Experience]] (kas@) | ||
* [[Ports/e2k]] (повод для создания этой странички) | |||
** скорее даже [[Эльбрус/портирование]] | |||
* [[Ports/loongarch64/Porting]] | |||
* [[git.alt/girar-nmu]] (viy@; инструментарий для упорядочивания сборки) | |||
* [http://wiki.debian.org/DebianBootstrap DebianBootstrap] | * [http://wiki.debian.org/DebianBootstrap DebianBootstrap] | ||
* [https://lists.altlinux.org/pipermail/devel/2014-December/199334.html girar-nmu-sort-transaction] | * [https://lists.altlinux.org/pipermail/devel/2014-December/199334.html girar-nmu-sort-transaction] | ||
* [http://git.altlinux.org/gears/p/perl.git?p=perl.git;a=tree;f=altlinux/maintainer_notes;hb=HEAD perl/altlinux/maintainer_notes/] | * [http://git.altlinux.org/gears/p/perl.git?p=perl.git;a=tree;f=altlinux/maintainer_notes;hb=HEAD perl/altlinux/maintainer_notes/] | ||
* [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] | |||
* порт 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=*}} |
Текущая версия от 23:04, 7 декабря 2023
«Раскрутка» ALT с нуля
...на новой архитектуре либо при необходимости обеспечить пересборку «с нуля» по иному поводу.
NB: glebfm@ разработан инструментарий для автоматизации процесса, см. тж. доклад на OSSDEVCONF-2017.
Типичная процедура
Начинаем с какой-либо существующей бинарной среды, пригодной для сборки содержимого базовой сборочной системы сизифа (rpm-build и его зависимости); см., например, опыт портирования на ARM.
Поскольку на первых порах собираемое будет устанавливаться в неё же, есть смысл работать в чруте, представляющем из себя копию корневой файловой системы, со смонтированными /proc и /dev/pts.
- сперва собираем 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
- 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)
при этом:
- вполне возможно дополнить и другими ручками, но сперва лобовой 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 (with, не enable -- см. ниже), не перекрывающимся с перечисленными выше уже существующими; в частности:
- отключать сборку man/info, если требует help2man/makeinfo/texinfo;
- довольно неприятны в плане бутстрапа по части perl-*, если нет возможности воспользоваться имеющимися хостовыми или noarch-пакетами
- отключать поддержку SSL;
- задействовать bundle'ные gnulib/glib/... вместо системных, если есть;
- возможно, в %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'
Не попавшее в сизиф
renoarch
Порой циклы BuildRequires: оказывается удобно разрывать при помощи srpm специального вида, содержащих перепакованные noarch.rpm и собирающиеся в них же, но без "проблемных" BR: (с пустым списком таковых). Для создания таких времянок может пригодиться скрипт renoarch (см. доработанную версию iv@ с поправкой на ".rv64").
Ссылки
- Ports
- Ports/arm/Experience (kas@)
- Ports/e2k (повод для создания этой странички)
- скорее даже Эльбрус/портирование
- Ports/loongarch64/Porting
- git.alt/girar-nmu (viy@; инструментарий для упорядочивания сборки)
- DebianBootstrap
- girar-nmu-sort-transaction
- perl/altlinux/maintainer_notes/
- --query-repackage does not work properly
- |devel| Re: Q: hsh --repackage-source
- порт BH_QUERY_REPACKAGE с girar на beehive есть у bircoph@
- Re: Инструментальные средства сборки базовой системы