Spec start devel: различия между версиями

Материал из ALT Linux Wiki
Метка: отменено
 
(не показано 9 промежуточных версий этого же участника)
Строка 36: Строка 36:


%prep                                                    \
%prep                                                    \
%autosetup                                                |
%setup -q                                                |
                                                           |
                                                           |
                                                           |
                                                           |
Строка 45: Строка 45:
                                                           |
                                                           |
%install                                                  |
%install                                                  |
rm -rf $RPM_BUILD_ROOT                                    |
%makeinstall_std                                          |
%make_install                                            > Тело
                                                          > Тело
                                                          |
                                                          |
%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'''
|Команды для тестирования программного обеспечения. Данный блок обычно включают в себя модульные тесты
|Команды для тестирования программного обеспечения. Данный блок обычно включают в себя модульные тесты
|-
|-
Строка 252: Строка 250:
|-
|-
| <code>%_libdir</code>
| <code>%_libdir</code>
| <code>%_prefix/%_lib</code> = <code>/usr/%{_lib}</code>
| <code>%_prefix/%_lib</code> = <code>/usr/%_lib</code>


|-
|-
Строка 321: Строка 319:
|}
|}


====Пути каталогов сборочного окружения====
====Связь директив преамбулы и некоторых макросов====
{| class="wikitable"
{| class="wikitable"
! Директива
! Директива
Строка 351: Строка 349:
|}
|}


=Написание спека=
====Встроенные макросы RPM====
== Файл спека ==
{| class="wikitable"
Файл спека (он же файл спецификации) - файл со сценарием сборки пакета, описанный специальным синтаксисом по которому собирается бинарный пакет.
!Блок
! Макрос
! Назначение и описание


Данный файл состоит из макросов - специальных команд, начинающихся с %, которые сокращают объем ввода и делают спецификацию легче читаемой и воспринимаемой.
|-
!rowspan="2"|%prep
| <code>%setup</code>
| Используется в блоке <code>%prep</code>.


Файл спека состоит из двух частей:
Выполняет:
*преамбулы (заголовка) - в которой описываются базовые метаданные;
*переход в дерево сборки
*текста (тела) - в котором описывается основная часть инструкций;
*распаковку первого архива с исходниками (с ключом <code>-q</code> — без лишнего вывода)
спецификации
*установку прав
*переход в каталог исходников.


Каждая из этих частей содержит как обязательные, так и опциональные подразделы и элементы.
Ключ <code>-a X</code> — для распаковки дополнительных архивов, <code>-n</code> — указание другого имени каталога.


===Автогенерация спека===
|-
С помощью утилиты {{cmd|rpmdev-newpec}} из пакета {{pkg|rpmdevtools}} можно сгенерировать базовый спек:
| <code>%patch[X]</code>
$ rpmdev-newspec hello
| Используется в блоке <code>%prep</code> для применения патча под номером X, как в директиве <code>PatchX</code>. Поддерживает ключ <code>-p</code> (обрезка пути).


{|class="wikitable mw-collapsible mw-collapsed" style="float:center; margin-left:2em"
!Пример полученного спека
|-
|-
|<syntaxhighlight lang="spec">
!rowspan="2"|%build
Name:          hello                                    \
| <code>%configure</code>
Version:                                                  |
| Используется в блоке <code>%build</code> для вызова скрипта <code>configure</code> с предустановленными значениями переменных. Принимает любые аргументы.
Release:        alt1                                      |
Summary:                                                  |
                                                          |
License:                                                  |       
URL:                                                      > Преамбула
Source0:                                                  |
                                                          |
BuildRequires:                                            |
Requires:                                                |
                                                          |
%description                                              /


|-
| <code>%make_build</code>
| Используется в блоке <code>%build</code> для вызова <code>make</code> с макросами <code>%_smp_mflags</code> и <code>%make_bin</code>


%prep                                                    \
|-
%autosetup                                                |
!%install
                                                          |
| <code>%make_install</code>
                                                          |
| Используется в блоке <code>%install</code> для установки: вызывает <code>make install</code> с указанием <code>DESTDIR=%{buildroot}</code>. Принимает дополнительные аргументы.
%build                                                    |
%configure                                                |
%make_build                                              |
                                                          |
                                                          |
%install                                                 |
rm -rf $RPM_BUILD_ROOT                                    |
%make_install                                             > Тело
                                                          |
                                                          |
%files                                                    |
%license add-license-file-here                            |
%doc add-docs-here                                        |
                                                          |
                                                          |
                                                          |
%changelog                                                |
* Mon May  5 2025 Petr Akhlamov akhlamovpm@altlinux.org  |
-                                                        /
</syntaxhighlight>
|}
 
===Преамбула===
В нижеприведенной таблице перечислены элементы, используемые в преамбуле файла спецификации RPM, которые называются директивами или тэгами. В таблице жирным шрифтом выделены обязательные директивы.


{|class="wikitable" style="float:center; margin-left:2em"
!Директива
!Определение
|-
|'''''Name'''''
|Базовое имя пакета, которое должно совпадать с именем файла спецификации
|-
|-
|'''''Version'''''
!rowspan="3"|%files
|Номер версии программного обеспечения
| <code>%dir</code>
|-
| Применяется в блоке <code>%files</code> для указания, что объект — каталог, который должен быть включён в RPM.
|'''''Release'''''
|Количество раз, когда данная версия программного продукта была собрана. Как правило, при первой сборке конкретной версии пакета значение устанавливается равным 1 и увеличивается на единицу с каждой новой сборкой пакета. После цифры указывают суффикс макросом '''alt1'''
|-
|''Epoch''
|Способ определения взвешенных зависимостей на основе номеров версий. Если директива явно не задана, то значение по умолчанию равно 0. Данный параметр влияет на полную версию пакета при построении зависимостей в базе данных RPM или в репозитории


Полная версия выглядит как '''Epoch:Version-Release'''
|-
|-
|'''''Summary'''''
| <code>%doc</code>
|Краткое, однострочное описание пакета
| Используется в блоке <code>%files</code> для копирования файлов документации в <code>%_docdir/%name-%version</code>. Пути задаются относительно сборочного каталога.
|-
|'''''License'''''
|Лицензия на упаковываемое программное обеспечение
|-
|'''''URL'''''
|Полный URL (адрес) для получения дополнительной информации о программе. Обычно это веб-сайт проекта для упаковываемого программного обеспечения
|-
|''Source[X]''
|Путь (абсолютный или относительный) или URL-адрес к исходным файлам проекта. Директива может указывать как на сжатые архивы исходных кодов, так и на отдельные файлы. Проект может содержать несколько исходных файлов, тогда для их нумерации вместо '''[X]''' указывается цифра, например: '''Source3'''. Если имеется только один исходный файл, то нумерацию можно опустить, указав просто '''Source'''.
|-
|''Patch[X]''
|Файлы патчей, которые при необходимости будут применены к исходному коду. Проект может содержать несколько патчей, тогда вместо '''[X]''' указывают их номер, например: '''Patch2'''. Если патч единственный, то номер можно не присваивать ('''Patch''')
|-
|''BuildArch''
|Явное указание архитектуры, под которую собирается двоичный пакет. Если параметр не задан, то пакет автоматически наследует архитектуру машины, на которой он собран.<br>
В случае с архитектурно-независимыми пакетами указание данной директивы обязательно: '''BuildArch: noarch'''
|-
|''ExcludeArch''
|Если программное обеспечение, для которого собирается двоичный пакет, не может работать на определённой архитектуре процессора, то можно исключить эту архитектуру данной директивой
|-
|''BuildRequires''
|Список пакетов, разделённых запятыми или пробелами либо указанных по одному в строке с данной директивой, необходимых для компиляции/создания программы или формирования пакета
|-
|''Requires''
|Список пакетов, разделённых запятыми или пробелами, необходимых программному обеспечению для запуска после установки. В файле спецификации может быть несколько записей '''Requires''', каждая из которых находится в отдельной строке
|-
|''Provides''
|Указание дополнительных имён, библиотек или иных сущностей, которые предоставляет данный пакет. Используется для создания псевдонимов пакета, которые можно использовать как в тэгах спецификаций при сборке других пакетов, так и для установки пакета через пакетный менеджер
|-
|''Obsoletes''
|Перечисление имён пакетов, которые данный пакет делает устаревшими. При установке данного пакета устаревшие пакеты будут автоматически удалены из системы пакетным менеджером
|-
|''Confilcts''
|Перечисление имён пакетов, с которыми конфликтует данный пакет, т.е. все эти пакеты не могут быть одновременно установлены в системе
|}
 
{{Attention|Каждая директива обязательно разделяется от её значения символом «:», между директивой и двоеточием '''не должно быть пробелов'''!}}
Например:
Name: openssl
Version: 1.0.2
Release: alt3
 
Завершается преамбула обязательным блоком описания назначения пакета, идущим после тэга '''%description''', в котором, в отличие от директивы '''Summary''', даётся развёрнутая информация о пакете. Описание может занимать любое количество строк и быть разбито на абзацы по желанию автора спецификации.
Важно!
 
{{Attention|В '''одном''' файле спецификации может быть описано '''несколько''' двоичных пакетов!}}
 
В таком случае один проект будет представлен несколькими двоичными 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''' согласно преамбуле.
{|class="wikitable" style="float:center; margin-left:2em"
!Блоки
|Определение
|-
|'''%prep'''
|Команды для подготовки программного обеспечения к сборке, например, распаковка архива, указанного в '''Source''' или '''Source0'''.
|-
|-
|'''%build'''
| <code>%license</code>
|Команды для фактической сборки программного обеспечения в машинный код (для компилируемых языков) или байт-код (для некоторых интерпретируемых языков)
| Аналог <code>%doc</code>, но используется для лицензий. Файлы копируются в специальный каталог лицензий.
|-
|'''%install'''
|Команды установки/копирования файлов из сборочного каталога в псевдо-корневую директорию
|-
|%check
|Команды для тестирования программного обеспечения. Данный блок обычно включают в себя модульные тесты
|-
|'''%files'''
|Список файлов для каждого двоичного пакета (если их создаётся несколько по одной спецификации), которые будут установлены в системе конечного пользователя
|-
|'''%changelog'''
|Список изменений, произошедших в пакете между сборками разных версий или релизов
|}
|}
Командами внутри блоков могут быть как макросы сборочной системы RPM, так и вызовы внешних приложений, включая сценарии оболочки.
Если при сборке какого-либо пакета нет необходимости в каком-то блоке, всё равно его название необходимо указать в спецификации. Например, упаковывается тема пиктограмм и компилировать просто нечего при сборке двоичного пакета, то в спецификации такого пакета блок '''%build''' будет пустым.
[[Категория:RPM spec]]
[[Категория:RPM spec]]
{{Category navigation|title=Начинающему разработчику|category=Начинающему разработчику|sortkey={{SUBPAGENAME}}}}
{{Category navigation|title=Начинающему разработчику|category=Начинающему разработчику|sortkey={{SUBPAGENAME}}}}
[[Категория:Сборка пакетов]]
[[Категория:Сборка пакетов]]

Текущая версия от 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.

Выполняет:

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