А можете рассказать как это всё проделали, какие встретили препятствия и как их обошли?
1. Посмотрел, что проект собирается из Git. Это большой плюс, так как легче установить свежую версию (в git уже rc3), потом обновлять и тянуть интересные патчи. Склонировал себе:
git clone git://git.code.sf.net/p/kiwix/kiwix
2. Написал двустрочное правило .gear/rules для создания архива исходников, из которого уже будет собираться пакет через gear-hsh и основную сборочницу, и нестандартного расположения спека (в подкаталоге .gear)
3. Взял src.rpm от уважаемого YYY на предмет заготовки спека (всё равно его нужно упрощать и убирать хаки). Оттуда взял основные поля и зависимости.
Первым делом поменял %release. Так как версия rc3, она переносится из номера версии в номер релиза, а номер уменьшается до alt0 (выпущенная версия имела бы релиз alt1) и добавляем короткий номер последнего коммита Git (см. git log --oneline). Для удобства коммит указываем сверху спека через %define.
4. На официальном сайте kiwix посмотрел нормальное описание (summary и description) и заменил его в спеке. Там же посмотрел список зависимостей и добавил нужное в спек, подсматривая packages.altlinux.org (ссылка «Пакеты» вверху форума).
5. Начал приводить секцию %build к унифицированным макросам. Так как используется configure, нужно добавить макрос %autoreconf.
Запускаю сборку, automake обламывается на отсутствии файлов NEWS и ChangeLog (помним, что в UNIX имена файлов чувствительны к регистру!). В %prep добавляем:
touch NEWS
mv CHANGELOG ChangeLog
6. Прочитал COMPILE, сглупил и из COMPILE к configure добавил красивые опции --enable-compileall --disable-android
Опцию --enable-staticbins не стал брать — статические бинарники в нормальном репозитории не нужны.
И вот тут я конкретно встрял, так как Gecko не определялся.
Совет: не вставлять незнакомых опций!
7. Нашёл в исходниках спек для Fedora. Взял оттуда --with-gecko-sdk=%_libdir/xulrunner-devel. Не помогло.
Методом исключения убрал --enable-compileall и, ура!, сборка пошла. До ошибке об отсутствующих зависимостях.
8. Далее нудно в несколько заходов запускаем hsh-install <пакет> && hsh-shell и там configure.
9. Выяснилось, что в ALT Linux вообще не собраны zimlib и pugixml. Собрал отдельно zimlib из Fedora (по полиси библиотеки в ALT Linux должны начинаться с lib..., поэтому переименовал в libzim) и с autoimports.altlinux.org взял pugixml. Вот с ним пришлось повозиться.
10. При сборке выяснилось, что софт хочет aria2c (а у нас есть только бинарник aria2). Благо, есть опция у configure.
Совет: перед хаками посмотрите, нет ли параметра у configure (./configure --help)
11. При сборке с xulrunner она не нашла заголовочных файлов nspr (они в ALT Linux в подкаталоге лежат). Добавляем -I/usr/include/nspr к CXXFLAGS. Проще всего это сделать макросом (сразу после %build):
%add_optflags -I/usr/include/nspr
12. Заменяем запуск сборки и установки на стандартные макросы: %make_build и %makeinstall_std
Стандартные макросы хороши тем, что подставляют всё что нужно и программы собираются и ставятся как надо и куда надо.
Совет: лучше всегда использовать готовые макросы в спеке.
Полученная секция %build (для красоты параметры configure указывается по одному в строке с отступом (не забываем про \ в конце переводимой строки):
%build
%add_optflags -I/usr/include/nspr
%autoreconf
%configure --disable-android \
--with-gecko-sdk=%_libdir/xulrunner-devel \
--with-aria2=%_bindir/aria2
%make_build
13. Убираем секции %post и %posun — триггеры в ALT Linux умны настолько, чтобы не заморачиваться с прописыванием библиотек и обновлением значков. Эти секции используются только в настоящих хаках и создании пользователей для служб.
14. Убираем федорные атавизмы типа %defattr(-,root,root) в секции %files
15. Я люблю более читаемый код и потому фигурные скобки в именах макросов RPM используют только когда без них не обойтись. То есть заменяю: %{_sysconfdir}/* на %_sysconfdir/*
16. Тихий ужас в виде %{_datadir}/* оставлять нельзя, лучше прописать все установленные каталоги явно. Для этого удаляем эту запись и смотрим, какие файлы не упакованы. Вместо %{_datadir}/* получаем:
%_desktopdir/%name.desktop
%_datadir/application-registry/%name.applications
%_datadir/%name
%doc %_man1dir/*
%doc %_mandir/fr/man1/*
%_xdgmimedir/packages/%name.xml
%_iconsdir/%name
%_pixmapsdir/*
Обратите внимание на использование макросов %_desktopdir %_man1dir %_iconsdir %_pixmapsdir %_xdgmimedir. Они повышают читаемость, так как не нужно указывать весь путь.
Ещё интересен макрос %doc в начале строки — он помечает файлы как документацию (показываются командой rpm -qd <имя пакета>).
17. Заключительным этапом добавляем запись в %changelog. Я это делаю командой \ac в vim (при установленном пакете vim-plugin-spec_alt-ftplugin). Есть утилита add_changelog (пакет rpm-utils).
18. Собираю командой
gear-hsh $TMPDIR --commit
до тех пор, пока сборка не проходит, потерянных файлов нет и всё в порядке.
19. Коммитим нашу работу и делаем тег:
gear-commit -a
gear-create-tag
Эти утилиты пропишут правильное описание коммита и верный номер тега из номера версии и релиза спека.
20. Добавляем remote и пушим на git.altlinux.org:
ssh git.alt init-db kiwix
git remote add origin git.alt:packages/kiwix
git push origin <бранч> <тег>
Я обычно бранч переименовываю в sisyphus, а текущий тег подставляет скриптик.
21. Сборка в сборочнице:
ssh git.alt build kiwix <тег>
Всё, пакет в репозитории! :)