ОсобенностиСборкиПакетов: различия между версиями
м (В pre/post(un) зависимости уже ищутся) |
м (→Обновление базы обрабатываемых форматов: макрос %update_desktopdb устарел) |
||
(не показано 13 промежуточных версий 7 участников) | |||
Строка 1: | Строка 1: | ||
[[ | [[Категория:Devel]] | ||
{{MovedFromFreesourceInfo|AltLinux/Sisyphus/devel/ОсобенностиСборкиПакетов}} | {{MovedFromFreesourceInfo|AltLinux/Sisyphus/devel/ОсобенностиСборкиПакетов}} | ||
== Особенности сборки пакетов == | == Особенности сборки пакетов == | ||
По результатам переписки разработчиков ALT Linux Team составлены советы по упаковке программ GTK, GNOME и KDE. Они должны войти в книжку «ALT Linux Team и проект Sysiphus» проекта alt-docs. | |||
По результатам переписки разработчиков ALT Linux Team составлены советы по упаковке программ GTK, GNOME и KDE. Они должны войти в книжку | |||
=== Использование альтернатив === | === Использование альтернатив === | ||
* [http://alternatives.sourceforge.net/ http://alternatives.sourceforge.net/] | * [http://alternatives.sourceforge.net/ http://alternatives.sourceforge.net/] | ||
Создаём файл с описанием предоставляемой альтернативы | Создаём файл с описанием предоставляемой альтернативы такого вида: | ||
# имя альтернативы # один из вариантов альтернативы # вес | |||
/usr/bin/%альтернатива /usr/bin/%вариант 40 | |||
/usr/bin/ | |||
и складываем его в {{path|/etc/alternatives/packages.d/%пакет.alternatives}} при сборке. | |||
% | Поля в файле разделяются символом табуляции. Число в файле — вес альтернативы. Альтернатива с бОльшим весом будет выбрана, если не выбрано ручное управление альтернативами. Если в пакете содержится больше одного файла под управлением альтернатив, то %пакет.alternatives может содержать несколько строк. | ||
%files | Не забываем добавить файл в пакет: | ||
%_altdir/% | %files | ||
%_altdir/%пакет.alternatives | |||
=== pkg-config === | === pkg-config === | ||
Почему в pkg-config отключена рекурсия (особенность сборки в ALT). | Почему в pkg-config отключена рекурсия (особенность сборки в ALT). | ||
Рекурсивный сбор --libs в принципе не нужен, более | Рекурсивный сбор --libs в принципе не нужен, более того — вреден, хотя бы потому что является источником огромного числа лишних зависимостей, которые потом должен обрабатывать apt и rpm. | ||
Если программа не линкуется с какой-либо библиотекой, то весьма вероятно, что это ошибка в сборке | Если программа не линкуется с какой-либо библиотекой, то весьма вероятно, что это ошибка в сборке библиотеки — библиотека использует функции из других библиотек, но с ними не слинкована. Ошибка эта практически везде, кроме как в ALT Linux прикрыта стандартным поведением pkg-config. | ||
В качестве заглушки можно вписать | В качестве заглушки можно вписать | ||
Строка 44: | Строка 34: | ||
=== MIME-типы === | === MIME-типы === | ||
Файлы информации о MIME-типах. | Файлы информации о MIME-типах. | ||
В этих файлах хранится описание форматов файлов (их mime-type, комментарием, способом определения принадлежности к формату по MAGIC value и | В этих файлах хранится описание форматов файлов (их mime-type, комментарием, способом определения принадлежности к формату по MAGIC value и шаблону…) | ||
См. подробнее | См. подробнее | ||
[http://www.freedesktop.org/Standards/shared-mime-info-spec http://www.freedesktop.org/Standards/shared-mime-info-spec] | [http://www.freedesktop.org/Standards/shared-mime-info-spec http://www.freedesktop.org/Standards/shared-mime-info-spec] | ||
[http://www.freedesktop.org/Software/shared-mime-info http://www.freedesktop.org/Software/shared-mime-info] | [http://www.freedesktop.org/Software/shared-mime-info http://www.freedesktop.org/Software/shared-mime-info] | ||
1. Если в пакете есть файлы /usr/share/mime/packages/*.xml, то при их установке, удалении, обновлении кэш базы mime-типов обновляется автоматически (файл-триггер в пакете shared-mime-info). | |||
2. Файлы из каталога %_datadir/mime-info/* не используются GNOME-программами, которые получают mime-информацию из пакета shared-mime-info. | |||
2. Файлы из каталога %_datadir/mime-info/* не | |||
Тем не менее эти файлы используются рядом других программ (например, KDE), так что их тоже надо паковать. При этом пакет не получает никаких дополнительных зависимостей. | Тем не менее эти файлы используются рядом других программ (например, KDE), так что их тоже надо паковать. При этом пакет не получает никаких дополнительных зависимостей. | ||
Строка 80: | Строка 58: | ||
При сборке в пакете установку schemas надо отключать: | При сборке в пакете установку schemas надо отключать: | ||
%configure --disable-schemas-install | |||
так как эта процедура должна быть выполнена при установке пакета; под пользователем при сборке пакета это невозможно. | так как эта процедура должна быть выполнена при установке пакета; под пользователем при сборке пакета это невозможно. | ||
это рекомендуется вместо конструкции | это рекомендуется вместо конструкции | ||
export GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL=1 | |||
%makeinstall | %makeinstall | ||
unset GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL | unset GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL | ||
при установке. | при установке. | ||
В спеке должны быть секции: | В спеке должны быть секции: | ||
%post | |||
%gconf2_install %name | %gconf2_install %name | ||
%preun | %preun | ||
if [ $1 = 0 ]; then | if [ $1 = 0 ]; then | ||
%gconf2_uninstall %name | %gconf2_uninstall %name | ||
fi | fi | ||
в качестве параметров к | в качестве параметров к {{rpmmacro|gconf2-install}}/{{rpmmacro|gconf2-uninstall}} может быть указано несколько названий. | ||
Образец оформления секции %files: | Образец оформления секции %files: | ||
%config %_sysconfdir/gconf/schemas/* | |||
В зависимостях пакета должно быть: | В зависимостях пакета должно быть: | ||
BuildRequires(Pre): libGConf-devel | |||
(макросы %gconf2.* содержатся в пакете libGConf-devel) | |||
( | |||
=== Файлы scrollkeeper === | === Файлы scrollkeeper === | ||
Нельзя упаковывать каталог и файлы из %_localstatedir/scrollkeeper, если они получаются при сборке, их надо удалить командой | Нельзя упаковывать каталог и файлы из {{path|%_localstatedir/scrollkeeper}}, если они получаются при сборке, их надо удалить командой | ||
rm -rf %buildroot%_localstatedir/scrollkeeper | |||
в конце секции %install | в конце секции %install | ||
Если %make_install вызывает scrollkeeper-update и сборка прерывается по ошибке — перед %make_install нужно сделать export OMF_DIR=%buildroot%_localstatedir/scrollkeeper | |||
Если %make_install вызывает scrollkeeper-update и сборка прерывается по | |||
=== Файлы локализации === | === Файлы локализации === | ||
Информация по упаковке файлов локализации есть в [[FindLangPolicy|полиси по find_lang]]. | |||
=== Файлы меню === | === Файлы меню === | ||
После перемещения в alt-docs необходимо совместить данный раздел с файлом [ftp://ftp.altlinux.org/pub/people/zerg/menu/menu-packaging-howto-current.txt ftp://ftp.altlinux.org/pub/people/zerg/menu/menu-packaging-howto-current.txt] | После перемещения в alt-docs необходимо совместить данный раздел с файлом [ftp://ftp.altlinux.org/pub/people/zerg/menu/menu-packaging-howto-current.txt ftp://ftp.altlinux.org/pub/people/zerg/menu/menu-packaging-howto-current.txt] | ||
Файл меню либо создаётся непосредственно заданием его содержимого, либо формируется. Перевод строк, содержащихся в меню, содержится в пакете menu. Формат файла меню частично описан [http://lists.altlinux.ru/pipermail/community/2004-October/133634.html здесь]). На основе файла меню, устанавливающегося в /usr/lib/menu, генерируются меню для всех оконных менеджеров, установленных в системе. | Файл меню либо создаётся непосредственно заданием его содержимого, либо формируется. Перевод строк, содержащихся в меню, содержится в пакете menu. Формат файла меню частично описан [http://lists.altlinux.ru/pipermail/community/2004-October/133634.html здесь]). На основе файла меню, устанавливающегося в /usr/lib/menu, генерируются меню для всех оконных менеджеров, установленных в системе. | ||
Строка 175: | Строка 120: | ||
Устарело: | Устарело: | ||
<s>РЕКОМЕНДУЕМЫЙ СПОСОБ:</s> | <s>РЕКОМЕНДУЕМЫЙ СПОСОБ:</s> | ||
Как правило к программе прилагается файл .desktop, который уже содержит эту информацию, из него можно получить | Как правило к программе прилагается файл .desktop, который уже содержит эту информацию, из него можно получить файл меню с помощью скрипта <tt>freedesktop2menu.pl</tt> (планируется макрос <tt>%freedesktop2menu</tt> — см. [https://bugzilla.altlinux.org/show_bug.cgi?id=7972 bug#7972]). Добавьте следующие строки в раздел <tt>%install</tt>: | ||
<pre>%Md2m %name "Applications/Communications" \ | <pre>%Md2m %name "Applications/Communications" \ | ||
%buildroot%_desktopdir/%name.desktop \ | %buildroot%_desktopdir/%name.desktop \ | ||
Строка 187: | Строка 132: | ||
<pre>mkdir -p %buildroot%_menudir</pre> | <pre>mkdir -p %buildroot%_menudir</pre> | ||
Созданный файл меню устанавливается в каталог %_menudir. При установке или удалении пакета меню | Созданный файл меню устанавливается в каталог %_menudir. При установке или удалении пакета меню переформируется самостоятельно, с помощью файл-триггера в пакете {{pkg|menu}}. | ||
В секции %files: | В секции %files: | ||
Строка 204: | Строка 143: | ||
Сейчас *.desktop и menu-файлы существуют параллельно. %_menudir обязательно, а %_desktopdir/*. | Сейчас *.desktop и menu-файлы существуют параллельно. %_menudir обязательно, а %_desktopdir/*.desktop — нет. Когда-нибудь в далеком будущем бОльшая часть оконных менеджеров будет уметь самостоятельно читать %_desktopdir. Тогда пакет menu станет не нужен. | ||
Статичный вариант меню хранится в %_desktopdir, а генерируемый из menu-файлов | Статичный вариант меню хранится в %_desktopdir, а генерируемый из menu-файлов в — %_datadir/application-alt | ||
KDE не особо при чем, %_desktopdir и % | KDE не особо при чем, %_desktopdir и %_menudir — это общее для всех. | ||
После сборки нового пакета и его установке обязательно проверяйте, что программа появилась в меню на своём месте и имеет нужную пиктограмму. | После сборки нового пакета и его установке обязательно проверяйте, что программа появилась в меню на своём месте и имеет нужную пиктограмму. | ||
=== Обновление базы обрабатываемых форматов === | === Обновление базы обрабатываемых форматов === | ||
Строка 220: | Строка 158: | ||
Нижеописанное нужно только в случае если в %_desktopdir/*.desktop есть | Нижеописанное нужно только в случае если в %_desktopdir/*.desktop есть | ||
<pre>$ grep -i mime /usr/share/applications/*.desktop | <pre>$ grep -i mime /usr/share/applications/*.desktop | ||
MimeType=.....;</pre> | MimeType=.....;</pre> | ||
<!-- | |||
УСТАРЕЛО с переходом этой обработки на posttrans filetrigger --~~~~ | |||
В спеке должны быть секции: | В спеке должны быть секции: | ||
Строка 230: | Строка 171: | ||
%postun | %postun | ||
%clean_desktopdb</pre> | %clean_desktopdb</pre> | ||
--> | |||
В пакете должна быть указана зависимость: | В пакете должна быть указана зависимость: | ||
<pre>Requires(post,postun): desktop-file-utils | <pre>Requires(post,postun): desktop-file-utils | ||
Строка 236: | Строка 177: | ||
Используется вне зависимости от типа программы в пакете, и всегда должно быть указано. | Используется вне зависимости от типа программы в пакете, и всегда должно быть указано. | ||
=== Файлы bonobo === | === Файлы bonobo === | ||
Строка 258: | Строка 198: | ||
%endif</pre> | %endif</pre> | ||
Тогда чтобы получить lib%name-devel-static, нужно пересобрать пакет с `--enable static'. | Тогда чтобы получить lib%name-devel-static, нужно пересобрать пакет с `--enable static'. Установка lib%name-devel-static автоматически ставит на hold lib%name-devel и, следовательно, lib%name (если между пакетами правильные зависимости). | ||
Исключение: Если в пакете собирается только статическая библиотека, без динамической, то пакет должен называться -devel. | Исключение: Если в пакете собирается только статическая библиотека, без динамической, то пакет должен называться -devel. | ||
Строка 268: | Строка 208: | ||
1. | 1. | ||
<pre>%makeinstall_std</pre> | |||
(в случае если используется схема Makefile с DESTDIR) | |||
Этот макрос реализует | |||
<pre>%make_install install DESTDIR=%buildroot</pre> | <pre>%make_install install DESTDIR=%buildroot</pre> | ||
и рекомендован к использованию. | |||
2. | 2. | ||
Строка 278: | Строка 221: | ||
3. Иной способ. Возможно, ручная установка с помощью install | 3. Иной способ. Возможно, ручная установка с помощью install | ||
=== Дополнительно === | === Дополнительно === | ||
Будьте внимательны при написании скриптов pre/post и | Будьте внимательны при написании скриптов pre/post и прочих — <s>используемые там пакеты должны быть прописаны в Requires</s> их зависимости тоже проставляются в результирующий пакет. Желательно не использовать перенаправление вывода в /dev/null. | ||
=== Примеры использования === | === Примеры использования === | ||
Смотрите в Сизифе пакеты ggv2, rythmbox, eog2, gthumb, totem, conglomerate, inkscape | Смотрите в Сизифе пакеты ggv2, rythmbox, eog2, gthumb, totem, conglomerate, inkscape | ||
=== Авторы === | === Авторы === | ||
Yuri N. Sedunov <aris@altlinux.ru>, 2004 | Yuri N. Sedunov <aris@altlinux.ru>, 2004 | ||
Vitaly Lipatov <lav@altlinux.ru>, | Vitaly Lipatov <lav@altlinux.ru>, 2004—2005 | ||
Sergey Turchin <zerg@altlinux.ru>, | Sergey Turchin <zerg@altlinux.ru>, 2004—2005 | ||
Alexey Tourbin <at@altlinux.ru>, 2005 | Alexey Tourbin <at@altlinux.ru>, 2005 | ||
09.11.2004, 21.01.2005 | 09.11.2004, 21.01.2005 | ||
Текущая версия от 22:04, 16 января 2021
Особенности сборки пакетов
По результатам переписки разработчиков ALT Linux Team составлены советы по упаковке программ GTK, GNOME и KDE. Они должны войти в книжку «ALT Linux Team и проект Sysiphus» проекта alt-docs.
Использование альтернатив
Создаём файл с описанием предоставляемой альтернативы такого вида:
# имя альтернативы # один из вариантов альтернативы # вес /usr/bin/%альтернатива /usr/bin/%вариант 40
и складываем его в /etc/alternatives/packages.d/%пакет.alternatives при сборке.
Поля в файле разделяются символом табуляции. Число в файле — вес альтернативы. Альтернатива с бОльшим весом будет выбрана, если не выбрано ручное управление альтернативами. Если в пакете содержится больше одного файла под управлением альтернатив, то %пакет.alternatives может содержать несколько строк.
Не забываем добавить файл в пакет:
%files %_altdir/%пакет.alternatives
pkg-config
Почему в pkg-config отключена рекурсия (особенность сборки в ALT). Рекурсивный сбор --libs в принципе не нужен, более того — вреден, хотя бы потому что является источником огромного числа лишних зависимостей, которые потом должен обрабатывать apt и rpm.
Если программа не линкуется с какой-либо библиотекой, то весьма вероятно, что это ошибка в сборке библиотеки — библиотека использует функции из других библиотек, но с ними не слинкована. Ошибка эта практически везде, кроме как в ALT Linux прикрыта стандартным поведением pkg-config.
В качестве заглушки можно вписать
export ac_cv_path_PKG_CONFIG="%_bindir/pkg-config --recursive"
перед %configure, но лучше добиться исправления проблемной библиотеки (приложения). Пример исправления можно увидеть в спеке к libgtkmm2
MIME-типы
Файлы информации о MIME-типах. В этих файлах хранится описание форматов файлов (их mime-type, комментарием, способом определения принадлежности к формату по MAGIC value и шаблону…) См. подробнее http://www.freedesktop.org/Standards/shared-mime-info-spec http://www.freedesktop.org/Software/shared-mime-info
1. Если в пакете есть файлы /usr/share/mime/packages/*.xml, то при их установке, удалении, обновлении кэш базы mime-типов обновляется автоматически (файл-триггер в пакете shared-mime-info).
2. Файлы из каталога %_datadir/mime-info/* не используются GNOME-программами, которые получают mime-информацию из пакета shared-mime-info.
Тем не менее эти файлы используются рядом других программ (например, KDE), так что их тоже надо паковать. При этом пакет не получает никаких дополнительных зависимостей.
3. Для KDE определения типа файла задаётся в /usr/share/mimelnk/, например:
$ cat /usr/share/mimelnk/application/x-kompas.desktop [Desktop Entry] Encoding=UTF-8 Type=MimeType MimeType=application/x-kompas Icon=wine-kviewer Patterns=*.a3d;*.m3d;*.cdw;*.spw;*.A3D;*.M3D;*.CDW;*.SPW Comment=KOMPAS Comment[ru]=Файлы КОМПАС
Файлы schemas
При сборке в пакете установку schemas надо отключать:
%configure --disable-schemas-install
так как эта процедура должна быть выполнена при установке пакета; под пользователем при сборке пакета это невозможно.
это рекомендуется вместо конструкции
export GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL=1 %makeinstall unset GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL
при установке.
В спеке должны быть секции:
%post %gconf2_install %name
%preun if [ $1 = 0 ]; then %gconf2_uninstall %name fi
в качестве параметров к %gconf2-install/%gconf2-uninstall может быть указано несколько названий.
Образец оформления секции %files:
%config %_sysconfdir/gconf/schemas/*
В зависимостях пакета должно быть:
BuildRequires(Pre): libGConf-devel
(макросы %gconf2.* содержатся в пакете libGConf-devel)
Файлы scrollkeeper
Нельзя упаковывать каталог и файлы из %_localstatedir/scrollkeeper, если они получаются при сборке, их надо удалить командой
rm -rf %buildroot%_localstatedir/scrollkeeper
в конце секции %install
Если %make_install вызывает scrollkeeper-update и сборка прерывается по ошибке — перед %make_install нужно сделать export OMF_DIR=%buildroot%_localstatedir/scrollkeeper
Файлы локализации
Информация по упаковке файлов локализации есть в полиси по find_lang.
Файлы меню
После перемещения в alt-docs необходимо совместить данный раздел с файлом ftp://ftp.altlinux.org/pub/people/zerg/menu/menu-packaging-howto-current.txt
Файл меню либо создаётся непосредственно заданием его содержимого, либо формируется. Перевод строк, содержащихся в меню, содержится в пакете menu. Формат файла меню частично описан здесь). На основе файла меню, устанавливающегося в /usr/lib/menu, генерируются меню для всех оконных менеджеров, установленных в системе.
Пример того, как обычно в спеке создают файл меню:
mkdir -p %buildroot%_menudir cat << EOF > %buildroot%_menudir/%name ?package(%name):command="%name" \ needs="x11" \ section="Applications/Communications" \ title="wxDialer" \ longtitle="A phone dialer written in wxPython" \ genericname="Phone dialer" \ icon="%name.png" EOF
Устарело:
РЕКОМЕНДУЕМЫЙ СПОСОБ:
Как правило к программе прилагается файл .desktop, который уже содержит эту информацию, из него можно получить файл меню с помощью скрипта freedesktop2menu.pl (планируется макрос %freedesktop2menu — см. bug#7972). Добавьте следующие строки в раздел %install:
%Md2m %name "Applications/Communications" \ %buildroot%_desktopdir/%name.desktop \ %buildroot%_menudir/%name
При использовании этого скрипта в пакете должна быть указана зависимость:
BuildPreReq: menu-devel
Каталог для файлов меню обычно создают командой:
mkdir -p %buildroot%_menudir
Созданный файл меню устанавливается в каталог %_menudir. При установке или удалении пакета меню переформируется самостоятельно, с помощью файл-триггера в пакете menu.
В секции %files:
%_menudir/* %_desktopdir/* и возможно %_datadir/application-registry/*
Пережиток KDE-шного прошлого %_datadir/applnk тоже надо паковать, если имеется. При этом не появляется дополнительных зависимостей.
Сейчас *.desktop и menu-файлы существуют параллельно. %_menudir обязательно, а %_desktopdir/*.desktop — нет. Когда-нибудь в далеком будущем бОльшая часть оконных менеджеров будет уметь самостоятельно читать %_desktopdir. Тогда пакет menu станет не нужен.
Статичный вариант меню хранится в %_desktopdir, а генерируемый из menu-файлов в — %_datadir/application-alt
KDE не особо при чем, %_desktopdir и %_menudir — это общее для всех.
После сборки нового пакета и его установке обязательно проверяйте, что программа появилась в меню на своём месте и имеет нужную пиктограмму.
Обновление базы обрабатываемых форматов
В файлах desktop кроме названия программы, способа её запуска и комментария, обычно также указаны сведения о том, какие форматы способна обрабатывать та или иная программа.
Подробнее см. http://www.freedesktop.org/Standards/desktop-entry-spec
Нижеописанное нужно только в случае если в %_desktopdir/*.desktop есть
$ grep -i mime /usr/share/applications/*.desktop MimeType=.....;
В пакете должна быть указана зависимость:
Requires(post,postun): desktop-file-utils BuildPreReq: desktop-file-utils
Используется вне зависимости от типа программы в пакете, и всегда должно быть указано.
Файлы bonobo
Пока ничего не знаю кроме того, что в %files пишется %_libdir/bonobo/servers/*
Статические библиотеки
Общей тенденцией является условная упаковка статических библиотек. Упаковываются они в пакет с суффиксом -devel-static. Как правило, статические библиотеки не требуются, и поэтому в начале спеке ставится
%def_disable static
При конфигурировании указывается
%configure %{subst_enable static}
которое управляет сборкой статических библиотек.
При указании пакетов на упаковку
%if_enabled static %files -n lib%name-devel-static %_libdir/lib%name.a %endif
Тогда чтобы получить lib%name-devel-static, нужно пересобрать пакет с `--enable static'. Установка lib%name-devel-static автоматически ставит на hold lib%name-devel и, следовательно, lib%name (если между пакетами правильные зависимости).
Исключение: Если в пакете собирается только статическая библиотека, без динамической, то пакет должен называться -devel. devel@
Установка файлов
В секции %install для установки файлов используется несколько способов
1.
%makeinstall_std
(в случае если используется схема Makefile с DESTDIR) Этот макрос реализует
%make_install install DESTDIR=%buildroot
и рекомендован к использованию.
2.
%makeinstall
(она задаёт prefix и остальные пути по типу prefix=/home/lav/tmp/%{name}-buildroot/usr)
Это для программ, которые не пытаются запоминать пути, куда их устанавливают, при установке, а делают это при configure.
3. Иной способ. Возможно, ручная установка с помощью install
Дополнительно
Будьте внимательны при написании скриптов pre/post и прочих — используемые там пакеты должны быть прописаны в Requires их зависимости тоже проставляются в результирующий пакет. Желательно не использовать перенаправление вывода в /dev/null.
Примеры использования
Смотрите в Сизифе пакеты ggv2, rythmbox, eog2, gthumb, totem, conglomerate, inkscape
Авторы
Yuri N. Sedunov <aris@altlinux.ru>, 2004 Vitaly Lipatov <lav@altlinux.ru>, 2004—2005 Sergey Turchin <zerg@altlinux.ru>, 2004—2005 Alexey Tourbin <at@altlinux.ru>, 2005
09.11.2004, 21.01.2005