Spec start devel

Материал из ALT Linux Wiki

Написание спека

Файл спека

Файл спека (он же файл спецификации) - файл со сценарием сборки пакета, описанный специальным синтаксисом по которому собирается бинарный пакет.

Данный файл состоит из макросов - специальных команд, начинающихся с %, которые сокращают объем ввода и делают спецификацию легче читаемой и воспринимаемой.

Файл спека состоит из двух частей:

  • преамбулы (заголовка) - в которой описываются базовые метаданные;
  • текста (тела) - в котором описывается основная часть инструкций;

спецификации

Каждая из этих частей содержит как обязательные, так и опциональные подразделы и элементы.

Автогенерация спека

С помощью утилиты 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.

Выполняет:

  • переход в дерево сборки
  • распаковку первого архива с исходниками (с ключом -q — без лишнего вывода)
  • установку прав
  • переход в каталог исходников.

Ключ -a X — для распаковки дополнительных архивов, -n — указание другого имени каталога.

%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, но используется для лицензий. Файлы копируются в специальный каталог лицензий.