Spec start devel: различия между версиями
Нет описания правки |
|||
(не показано 10 промежуточных версий этого же участника) | |||
Строка 36: | Строка 36: | ||
%prep \ | %prep \ | ||
% | %setup -q | | ||
| | | | ||
| | | | ||
Строка 45: | Строка 45: | ||
| | | | ||
%install | | %install | | ||
%makeinstall_std | | |||
> Тело | |||
%files | | %files | | ||
%license add-license-file-here | | %license add-license-file-here | | ||
Строка 158: | Строка 156: | ||
{|class="wikitable" style="float:center; margin-left:2em" | {|class="wikitable" style="float:center; margin-left:2em" | ||
!Блоки | !Блоки | ||
!Определение | |||
|- | |- | ||
|'''%prep''' | |'''%prep''' | ||
Строка 169: | Строка 167: | ||
|Команды установки/копирования файлов из сборочного каталога в псевдо-корневую директорию | |Команды установки/копирования файлов из сборочного каталога в псевдо-корневую директорию | ||
|- | |- | ||
|%check | |'''%check''' | ||
|Команды для тестирования программного обеспечения. Данный блок обычно включают в себя модульные тесты | |Команды для тестирования программного обеспечения. Данный блок обычно включают в себя модульные тесты | ||
|- | |- | ||
Строка 231: | Строка 229: | ||
|- | |- | ||
| <code>% | | <code>%_sysconfdir</code> | ||
| <code>/etc</code> | | <code>/etc</code> | ||
|- | |- | ||
| <code>% | | <code>%_lib</code> | ||
| <code>lib64</code> (для 64-битных платформ)<br/><code>lib</code> (для 32-битных платформ) | | <code>lib64</code> (для 64-битных платформ)<br/><code>lib</code> (для 32-битных платформ) | ||
|- | |- | ||
| <code>% | | <code>%_prefix</code> | ||
| <code>/usr</code> | | <code>/usr</code> | ||
|- | |- | ||
| <code>% | | <code>%_includedir</code> | ||
| <code>% | | <code>%_prefix/include</code> = <code>/usr/include</code> | ||
|- | |- | ||
| <code>% | | <code>%_bindir</code> | ||
| <code>% | | <code>%_prefix/bin</code> = <code>/usr/bin</code> | ||
|- | |- | ||
| <code>% | | <code>%_libdir</code> | ||
| <code>% | | <code>%_prefix/%_lib</code> = <code>/usr/%_lib</code> | ||
|- | |- | ||
| <code>% | | <code>%_libexecdir</code> | ||
| <code>% | | <code>%_prefix/lib</code> = <code>/usr/lib</code> | ||
|- | |- | ||
| <code>% | | <code>%_sbindir</code> | ||
| <code>% | | <code>%_prefix/sbin</code> = <code>/usr/sbin</code> | ||
|- | |- | ||
| <code>% | | <code>%_datadir</code> | ||
| <code>% | | <code>%_prefix/share</code> = <code>/usr/share</code> | ||
|- | |- | ||
| <code>% | | <code>%_infodir</code> | ||
| <code>% | | <code>%_datadir/info</code> = <code>/usr/share/info</code> | ||
|- | |- | ||
| <code>% | | <code>%_mandir</code> | ||
| <code>% | | <code>%_datadir/man</code> = <code>/usr/share/man</code> | ||
|- | |- | ||
| <code>% | | <code>%_docdir</code> | ||
| <code>% | | <code>%_datadir/doc</code> = <code>/usr/share/doc</code> | ||
|- | |- | ||
| <code>% | | <code>%_rundir</code> | ||
| <code>/run</code> | | <code>/run</code> | ||
|- | |- | ||
| <code>% | | <code>%_localstatedir</code> | ||
| <code>/var/lib</code> | | <code>/var/lib</code> | ||
|- | |- | ||
| <code>% | | <code>%_sharedstatedir</code> | ||
| <code>/var/lib</code> | | <code>/var/lib</code> | ||
|} | |} | ||
Строка 296: | Строка 294: | ||
! Определение | ! Определение | ||
|- | |- | ||
| <code>% | | <code>%_tmppath</code> | ||
| <code>/usr/src/tmp</code> | | <code>/usr/src/tmp</code> | ||
|- | |- | ||
| <code>% | | <code>%_topdir</code> | ||
| <code>/usr/src/RPM</code> | | <code>/usr/src/RPM</code> | ||
|- | |- | ||
| <code>% | | <code>%_buildrootdir</code> | ||
| <code>% | | <code>%_tmppath</code> | ||
|- | |- | ||
| <code>% | | <code>%_builddir</code> | ||
| <code>% | | <code>%_topdir/BUILD</code> | ||
|- | |- | ||
| <code>% | | <code>%_rpmdir</code> | ||
| <code>% | | <code>%_topdir/RPMS</code> | ||
|- | |- | ||
| <code>% | | <code>%_sourcedir</code> | ||
| <code>% | | <code>%_topdir/SOURCES</code> | ||
|- | |- | ||
| <code>% | | <code>%_specdir</code> | ||
| <code>% | | <code>%_topdir/SPECS</code> | ||
|- | |- | ||
| <code>% | | <code>%_srcrpmdir</code> | ||
| <code>% | | <code>%_topdir/SRPMS</code> | ||
|} | |} | ||
==== | ====Связь директив преамбулы и некоторых макросов==== | ||
{| class="wikitable" | {| class="wikitable" | ||
! Директива | ! Директива | ||
Строка 328: | Строка 326: | ||
|- | |- | ||
| <code>Name</code> | | <code>Name</code> | ||
| <code>% | | <code>%name</code> | ||
|- | |- | ||
| <code>Version</code> | | <code>Version</code> | ||
| <code>% | | <code>%version</code> | ||
|- | |- | ||
| <code>Release</code> | | <code>Release</code> | ||
| <code>% | | <code>%release</code> | ||
|- | |- | ||
| <code>Epoch</code> | | <code>Epoch</code> | ||
| <code>% | | <code>%epoch</code> | ||
|- | |- | ||
| <code>URL</code> | | <code>URL</code> | ||
| <code>% | | <code>%url</code> | ||
|- | |- | ||
| <code>SourceX</code> | | <code>SourceX</code> | ||
| <code>% | | <code>%SOURCEX</code> | ||
|} | |} | ||
Строка 358: | Строка 356: | ||
|- | |- | ||
!rowspan=" | !rowspan="2"|%prep | ||
| <code>%setup</code> | | <code>%setup</code> | ||
| Используется в блоке <code>%prep</code>. | | Используется в блоке <code>%prep</code>. | ||
Строка 373: | Строка 371: | ||
| <code>%patch[X]</code> | | <code>%patch[X]</code> | ||
| Используется в блоке <code>%prep</code> для применения патча под номером X, как в директиве <code>PatchX</code>. Поддерживает ключ <code>-p</code> (обрезка пути). | | Используется в блоке <code>%prep</code> для применения патча под номером X, как в директиве <code>PatchX</code>. Поддерживает ключ <code>-p</code> (обрезка пути). | ||
|- | |- | ||
Строка 389: | Строка 379: | ||
|- | |- | ||
| <code>%make_build</code> | | <code>%make_build</code> | ||
| Используется в блоке <code>%build</code> для вызова <code>make</code> с макросами <code>% | | Используется в блоке <code>%build</code> для вызова <code>make</code> с макросами <code>%_smp_mflags</code> и <code>%make_bin</code> | ||
|- | |- | ||
Строка 403: | Строка 393: | ||
|- | |- | ||
| <code>%doc</code> | | <code>%doc</code> | ||
| Используется в блоке <code>%files</code> для копирования файлов документации в <code>% | | Используется в блоке <code>%files</code> для копирования файлов документации в <code>%_docdir/%name-%version</code>. Пути задаются относительно сборочного каталога. | ||
|- | |- |
Текущая версия от 11:42, 15 мая 2025
Написание спека
Файл спека
Файл спека (он же файл спецификации) - файл со сценарием сборки пакета, описанный специальным синтаксисом по которому собирается бинарный пакет.
Данный файл состоит из макросов - специальных команд, начинающихся с %, которые сокращают объем ввода и делают спецификацию легче читаемой и воспринимаемой.
Файл спека состоит из двух частей:
- преамбулы (заголовка) - в которой описываются базовые метаданные;
- текста (тела) - в котором описывается основная часть инструкций;
спецификации
Каждая из этих частей содержит как обязательные, так и опциональные подразделы и элементы.
Автогенерация спека
С помощью утилиты rpmdev-newpec из пакета rpmdevtools можно сгенерировать базовый спек:
$ rpmdev-newspec hello
Пример полученного спека |
---|
Name: hello \
Version: |
Release: alt1 |
Summary: |
|
License: |
URL: > Преамбула
Source0: |
|
BuildRequires: |
Requires: |
|
%description /
%prep \
%setup -q |
|
|
%build |
%configure |
%make_build |
|
|
%install |
%makeinstall_std |
> Тело
%files |
%license add-license-file-here |
%doc add-docs-here |
|
|
|
%changelog |
* Mon May 5 2025 Petr Akhlamov akhlamovpm@altlinux.org |
- /
|
Преамбула
В нижеприведенной таблице перечислены элементы, используемые в преамбуле файла спецификации RPM, которые называются директивами или тэгами. В таблице жирным шрифтом выделены обязательные директивы.
Директива | Определение |
---|---|
Name | Базовое имя пакета, которое должно совпадать с именем файла спецификации |
Version | Номер версии программного обеспечения |
Release | Количество раз, когда данная версия программного продукта была собрана. Как правило, при первой сборке конкретной версии пакета значение устанавливается равным 1 и увеличивается на единицу с каждой новой сборкой пакета. После цифры указывают суффикс макросом alt1 |
Epoch | Способ определения взвешенных зависимостей на основе номеров версий. Если директива явно не задана, то значение по умолчанию равно 0. Данный параметр влияет на полную версию пакета при построении зависимостей в базе данных RPM или в репозитории
Полная версия выглядит как Epoch:Version-Release |
Summary | Краткое, однострочное описание пакета |
License | Лицензия на упаковываемое программное обеспечение |
URL | Полный URL (адрес) для получения дополнительной информации о программе. Обычно это веб-сайт проекта для упаковываемого программного обеспечения |
Source[X] | Путь (абсолютный или относительный) или URL-адрес к исходным файлам проекта. Директива может указывать как на сжатые архивы исходных кодов, так и на отдельные файлы. Проект может содержать несколько исходных файлов, тогда для их нумерации вместо [X] указывается цифра, например: Source3. Если имеется только один исходный файл, то нумерацию можно опустить, указав просто Source. |
Patch[X] | Файлы патчей, которые при необходимости будут применены к исходному коду. Проект может содержать несколько патчей, тогда вместо [X] указывают их номер, например: Patch2. Если патч единственный, то номер можно не присваивать (Patch) |
BuildArch | Явное указание архитектуры, под которую собирается двоичный пакет. Если параметр не задан, то пакет автоматически наследует архитектуру машины, на которой он собран. В случае с архитектурно-независимыми пакетами указание данной директивы обязательно: BuildArch: noarch |
ExcludeArch | Если программное обеспечение, для которого собирается двоичный пакет, не может работать на определённой архитектуре процессора, то можно исключить эту архитектуру данной директивой |
BuildRequires | Список пакетов, разделённых запятыми или пробелами либо указанных по одному в строке с данной директивой, необходимых для компиляции/создания программы или формирования пакета |
Requires | Список пакетов, разделённых запятыми или пробелами, необходимых программному обеспечению для запуска после установки. В файле спецификации может быть несколько записей Requires, каждая из которых находится в отдельной строке |
Provides | Указание дополнительных имён, библиотек или иных сущностей, которые предоставляет данный пакет. Используется для создания псевдонимов пакета, которые можно использовать как в тэгах спецификаций при сборке других пакетов, так и для установки пакета через пакетный менеджер |
Obsoletes | Перечисление имён пакетов, которые данный пакет делает устаревшими. При установке данного пакета устаревшие пакеты будут автоматически удалены из системы пакетным менеджером |
Confilcts | Перечисление имён пакетов, с которыми конфликтует данный пакет, т.е. все эти пакеты не могут быть одновременно установлены в системе |
Например:
Name: openssl Version: 1.0.2 Release: alt3
Завершается преамбула обязательным блоком описания назначения пакета, идущим после тэга %description, в котором, в отличие от директивы Summary, даётся развёрнутая информация о пакете. Описание может занимать любое количество строк и быть разбито на абзацы по желанию автора спецификации. Важно!
В таком случае один проект будет представлен несколькими двоичными RPM-файлами. Заголовки других пакетов в подобной спецификации должны начинаться с макроса %package <ИМЯ_ПАКЕТА>, причём имя другого пакета тэгом Name задавать не нужно — оно будет сформировано из опций указанного макроса. Также можно не указывать версию и релиз, если они совпадают (или должны совпадать по задумке автора спецификации) со значениями таковых же директив всего проекта. Например:
Name: superproj Version: 1.0 Release: alt1 Summary: Super Project ... %description This is the Super Project from our Company for all people. %package devel Summary: Development files for Super Project ... %descrtiption devel This package contains libraries and header files for development with Super Project. ...
В результате успешного завершения сборки согласно данной спецификации будут получены два пакета, например (для архитектуры x86_64):
superproj-1.0-1.alt1.x86_64.rpm и superproj-devel-1.0-1.alt1.x86_64.rpm
Тело спецификации
В таблице ниже перечислены основные блоки, используемые в тексте (теле) спецификации, причём все они, кроме %check, являются обязательными.
Важно заметить, что сколько бы двоичных пакетов не было описано в спецификации, все ниже приведённые директивы, кроме %files, фигурируют в тексте только один раз — разделение на разные двоичные RPM происходит именно в блоках %files согласно преамбуле.
Блоки | Определение |
---|---|
%prep | Команды для подготовки программного обеспечения к сборке, например, распаковка архива, указанного в Source или Source0. |
%build | Команды для фактической сборки программного обеспечения в машинный код (для компилируемых языков) или байт-код (для некоторых интерпретируемых языков) |
%install | Команды установки/копирования файлов из сборочного каталога в псевдо-корневую директорию |
%check | Команды для тестирования программного обеспечения. Данный блок обычно включают в себя модульные тесты |
%files | Список файлов для каждого двоичного пакета (если их создаётся несколько по одной спецификации), которые будут установлены в системе конечного пользователя |
%changelog | Список изменений, произошедших в пакете между сборками разных версий или релизов |
Командами внутри блоков могут быть как макросы сборочной системы RPM, так и вызовы внешних приложений, включая сценарии оболочки.
Если при сборке какого-либо пакета нет необходимости в каком-то блоке, всё равно его название необходимо указать в спецификации. Например, упаковывается тема пиктограмм и компилировать просто нечего при сборке двоичного пакета, то в спецификации такого пакета блок %build будет пустым.
Основные макросы
Как посмотреть значение макросов в сборочнице
Перейдите в каталог, где у вас сборка. Выполните:
$ hsh-shell
Выполните команду rpm --showrc с фильтром, где в фильтре будет указан нужный макрос:
$ rpm --showrc | grep _libdir
Пример вывода |
---|
-14: _exec_prefix /usr -14: _gamesbindir %{_prefix}/%{_gamesdir} -14: _menudir %_prefix/lib/menu -14: _prefix /usr -14: _rpmlibdir %_prefix/lib/rpm %{expand: %%global __python_module_prefix python%%{__python_package_version}-module} %{expand: %%global packagename %%{__python_module_prefix}-%%{modulename}} -14: _x11dir %{_prefix} -14: _x11drvddir %{_prefix}/libexec/X11/drv.d --prefix=%{_prefix} \ --exec-prefix=%{_exec_prefix} \ -14: luarocks_dbdir %luarocks_dbdir_prefix-%luarocks_versions_installed -14: luarocks_dbdir_prefix %_prefix/lib/luarocks/rocks mkdir -p %buildroot%luarocks_dbdir_prefix-$v ; cp -a %luarocks_dbdir_prefix-$v/manifest %buildroot%luarocks_dbdir_prefix-$v ||: ; find %luarocks_dbdir_prefix-$v -mindepth 1 -maxdepth 1 -type d ! -name %oname -exec ln -s {} %buildroot%luarocks_dbdir_prefix-$v \; ; find %buildroot%luarocks_dbdir_prefix-$v -maxdepth 1 -type l -exec rm -f {} \; mv -f %buildroot%luarocks_dbdir_prefix-$v/%oname/%oversion/%1/* docs_from_rockstree/ ||: ; rm -rf %buildroot%luarocks_dbdir_prefix-$v/%oname/%oversion/%1 ; ln -s %_docdir/lua$v-module-%oname-%version %buildroot%luarocks_dbdir_prefix-$v/%oname/%oversion/%1 ; prefix=%{?buildroot:%{buildroot}}%{_prefix} \ exec_prefix=%{?buildroot:%{buildroot}}%{_exec_prefix} \ %__perl Makefile.PL PREFIX=%_prefix INSTALLDIRS=vendor "$@" </dev/null DESTDIR=%buildroot PREFIX=%_prefix INSTALLDIRS=vendor \ -14: prefix %_prefix -DCMAKE_INSTALL_PREFIX:PATH=%{_prefix} \ |
Четвертая строка --> -14: _prefix /usr.
Пути системных каталогов
Макрос | Определение |
---|---|
%_sysconfdir
|
/etc
|
%_lib
|
lib64 (для 64-битных платформ)lib (для 32-битных платформ)
|
%_prefix
|
/usr
|
%_includedir
|
%_prefix/include = /usr/include
|
%_bindir
|
%_prefix/bin = /usr/bin
|
%_libdir
|
%_prefix/%_lib = /usr/%_lib
|
%_libexecdir
|
%_prefix/lib = /usr/lib
|
%_sbindir
|
%_prefix/sbin = /usr/sbin
|
%_datadir
|
%_prefix/share = /usr/share
|
%_infodir
|
%_datadir/info = /usr/share/info
|
%_mandir
|
%_datadir/man = /usr/share/man
|
%_docdir
|
%_datadir/doc = /usr/share/doc
|
%_rundir
|
/run
|
%_localstatedir
|
/var/lib
|
%_sharedstatedir
|
/var/lib
|
Пути каталогов сборочного окружения
Макрос | Определение |
---|---|
%_tmppath
|
/usr/src/tmp
|
%_topdir
|
/usr/src/RPM
|
%_buildrootdir
|
%_tmppath
|
%_builddir
|
%_topdir/BUILD
|
%_rpmdir
|
%_topdir/RPMS
|
%_sourcedir
|
%_topdir/SOURCES
|
%_specdir
|
%_topdir/SPECS
|
%_srcrpmdir
|
%_topdir/SRPMS
|
Связь директив преамбулы и некоторых макросов
Директива | Соответствующий макрос |
---|---|
Name
|
%name
|
Version
|
%version
|
Release
|
%release
|
Epoch
|
%epoch
|
URL
|
%url
|
SourceX
|
%SOURCEX
|
Встроенные макросы RPM
Блок | Макрос | Назначение и описание |
---|---|---|
%prep | %setup
|
Используется в блоке %prep .
Выполняет:
Ключ |
%patch[X]
|
Используется в блоке %prep для применения патча под номером X, как в директиве PatchX . Поддерживает ключ -p (обрезка пути).
| |
%build | %configure
|
Используется в блоке %build для вызова скрипта configure с предустановленными значениями переменных. Принимает любые аргументы.
|
%make_build
|
Используется в блоке %build для вызова make с макросами %_smp_mflags и %make_bin
| |
%install | %make_install
|
Используется в блоке %install для установки: вызывает make install с указанием DESTDIR=%{buildroot} . Принимает дополнительные аргументы.
|
%files | %dir
|
Применяется в блоке %files для указания, что объект — каталог, который должен быть включён в RPM.
|
%doc
|
Используется в блоке %files для копирования файлов документации в %_docdir/%name-%version . Пути задаются относительно сборочного каталога.
| |
%license
|
Аналог %doc , но используется для лицензий. Файлы копируются в специальный каталог лицензий.
|