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

Материал из ALT Linux Wiki
 
Строка 1: Строка 1:
{{merge|ALT Packaging HOWTO}}
#REDIRECT [[ALT_Packaging_HOWTO]]
 
При разработке этих правил решались следующие задачи:
 
* Обеспечить желаемую функциональность. Пакеты должны отвечать правилам упаковки, о которых речь идёт в [[SecurePackagingPolicy]]. Для этого надо, чтобы spec-файлы обеспечивали выполнение этих правил.
* Помочь разработчику. Так как spec-файлы ''все ещё'' пишут люди, то их работу нужно свести к тому минимуму, который, собственно, и требует участия человека. Разработчик не должен копировать блоки кода из файла в файл, ибо эта неинтеллектуальная работа отнимает массу сил и чревата ошибками.
 
== spec-файлы ==
 
=== Устаревшие конструкции ===
 
Не следует использовать устаревшие конструкции  — они лишь загромождают spec-файл, снижая тем самым его читабельность. К устаревшим конструкциям относятся:
* тэг <tt>BuildRoot</tt> (BuildRoot выбирается автоматически);
* строки вида <tt>rm -rf $RPM_BUILD_ROOT</tt> (BuildRoot очищается автоматически);
* <tt>%_defattr</tt> со стандартными аргументами в начале файлов и секций <tt>%files</tt> (такое поведение действует по умолчанию);
* секция <tt>%clean</tt>, пустая либо без разумного содержания.
 
=== Фигурные скобки ===
 
Нет смысла засорять текст spec-файла ненужными фигурными скобками. Избавиться от них можно с помощью команды <tt>cleanup_spec</tt> из пакета <tt>rpm-utils</tt>.
 
=== Выравнивание ===
 
Используйте табуляции для выравнивания. Избегайте пробельных символов в конце строк.
 
=== Порядок тэгов ===
 
Рекомендуемый порядок заголовочных тэгов:
* Name
* Version
* Release
* Epoch (Serial)
 
* Summary
* License
* Group
* Url
* Packager
* BuildArch
 
* Source*
* Patch*
 
* PreReqs
* Requires
* Provides
* Conflicts
 
* Prefix
* BuildPreReqs
* BuildRequires.
 
Разумеется, не все из вышеперечисленных тэгов используются во всех пакетах, равно как встречаются и другие редко используемые тэги.
 
В связи с тем, что BuildRequires зарезервирован для автоматически вычисляемых зависимостей, для указания особых зависимостей следует использовать BuildPreReq.
 
=== Значения тэгов ===
 
Значение тэга от его имени следует разделять одним пробелом. Элементы списка значений следует разделять запятой с последующим пробелом. Значение тэга Summary следует начинать с прописной буквы. Значение тэга <tt>Summary</tt> не следует завершать точкой. Значения тэга <tt>Summary</tt> и секции <tt>%description</tt> могут содержать названия команд только в не изменённом виде.
 
=== Группы ===
 
Значение тэга <tt>Group</tt> должно соответствовать действительности и при этом принадлежать фиксированному множеству, перечисленному в файле <tt>/usr/lib/rpm/GROUPS</tt>.
 
=== ChangeLog ===
{{Main|Руководство по написанию changelog}}
Для формирования первой строки changelog-записи удобно использовать утилиту <tt>add_changelog</tt> из пакета <tt>rpm-utils</tt>.
 
=== Файлы локализации ===
 
Если в состав пакета входят файлы локализации либо другие файлы на разных языках, следует использовать макрос <tt>%find_lang</tt>. Подробную информацию можно получить, выполнив команду <tt>/usr/lib/rpm/find-lang -h</tt>.
 
=== Внутрипакетные зависимости ===
 
При работе с мультипакетными spec-файлами соблюдайте правило внутрипакетных зависимостей: Если один пакет в какой-либо мере зависит от другого подпакета, то эта зависимость должна быть указана полностью, включая не только имя, но также версию, релиз и epoch (если есть). Например, <tt>Requires: %name = %version-%release</tt> или <tt>Requires: %name = %epoch:%version-%release</tt>. Обратите внимание на синтаксис: знак равенства, в отличие от дефиса, окружён пробелами.
 
=== Разделяемые библиотеки ===
 
Пакеты, содержащие как разделяемые библиотеки, так и использующие их программы, должны быть разделены на подпакеты таким образом, чтобы в подпакет, содержащий разделяемые библиотеки, не входили использующие их программы. Это, в частности, позволяет уменьшить количество циклических зависимостей.
 
По традиции, имена пакетов, состоящих только из разделяемых библиотек, должны начинаться с префикса lib либо содержать его внутри слова. При разделении подпакетов следует помнить о внутрипакетных зависимостях.
 
=== Статические библиотеки ===
 
Статические библиотеки должны паковаться в отдельные подпакеты, что связано со спецификой их использования. Если имя devel-подпакета заканчивается суффиксом -devel, то имя нового devel-static-подпакета будет заканчиваться суффиксом -devel-static. При разделении подпакетов следует помнить о внутрипакетных зависимостях: в списке зависимостей devel-static-подпакета должна присутствовать зависимость от -devel = %version-%release.
 
=== Переименование пакетов ===
 
Иногда пакеты переименовывают. Например, это случается при упаковке разделяемых библиотек. В таких случаях следует указывать правильную информацию о зависимостях, необходимую для корректного обновления. В частности, должен присутствовать:
 
<pre>
Provides: старое_имя = %version
Obsoletes: старое_имя
</pre>
 
== Патчи ==
 
=== Наименование патчей ===
 
При создании новых патчей, а также при импортировании патчей из других источников необходимо придерживаться единых правил наименования имён патч-файлов: NAME-VERSION-ORIGIN-WHAT.patch, где
 
* NAME и VERSION  — имя и версия пакета, для которого сделан патч;
* ORIGIN  — аббревиатуры источников патча (обычно дистрибутивов);
* WHAT  — краткое описание патча.
 
В случае, когда патч образован из нескольких частей, полученных из разных источников, компонента имени ORIGIN должна содержать аббревиатуры всех источников. Если патч был создан или адаптирован для ALT Linux, то в ORIGIN, соответственно, должно присутствовать -alt-. Для патчей, созданных на базе CVS, компонента имени ORIGIN должна начинаться с cvs-YYYYMMDD.
 
При составлении описания патча следует иметь в виду следующие общепринятые сокращения:
* makefile - патчи, затрагивающие исключительно makefile*;
* bound - проверки на границы (буфера, целых чисел, и т.п.);
* config - патчи, затрагивающие исключительно конфигурационные файлы;
* configure - патчи, затрагивающие исключительно configure*;
* doc - патчи, затрагивающие исключительно документацию;
* fixes - кумулятивные патчи и/или исправления по надёжности и/или безопасности;
* format - патчи на использование форматирования строк (printf);
* install - патчи, направленные на возможность выполнения make install непривилегированным пользователем;
* linux - патчи, предназначенные для портирования ПО на Linux;
* man - патчи, затрагивающие исключительно man-страницы;
* texinfo - патчи, затрагивающие исключительно документацию в формате texinfo;
* tmp - патчи, предназначенные для решения различных вопросов, связанных с временными файлами;
* vitmp - патчи, направленные на поддержку vitmp(1);
* warnings - патчи, исправляющие ошибки, найденные компилятором.
 
[[Category:Sisyphus]]
[[Category:Devel]]
[[Category:Руководства]]
[[Category:RPM spec]]

Текущая версия от 10:00, 13 февраля 2011

Перенаправление на: