Product SiteDocumentation Site

6.3. RPM Макросы

Макросы RPM — это прямые текстовые подстановки, которые происходят путем замены определенных выражений и условий на соответствующий текст во время процесса сборки пакета. Иными словами, макросы являются псевдонимами для часто используемых фрагментов текста, применение которых сокращает не только объем ввода, но и делает спецификацию легче читаемой и воспринимаемой. Имена макросов начинаются с символа «%».
Список пакетов, содержащих макросы можно получить, выполнив команду:
$ apt-cache search rpm | grep '^rpm-[bm]' | sort -n
rpm-build-apache2 - Набор утилит для автоматической Web серверов и приложений
rpm-build-browser-plugins - Netscape Gecko Plug-in API common packaging files
rpm-build-compat - ALT Linux compatibility macros for backport purposes
rpm-build-dmd - RPM build enviroment to build D lang(dmd) packages
rpm-build-emacs - Helper scripts and RPM macros to build GNU Emacs extensions
rpm-build-erlang - RPM helper scripts to calculate Erlang dependencies
rpm-build-extra-targets - Build packages for other platforms
rpm-build-fedora-compat-fonts - Build-stage rpm automation for fonts packages
rpm-build-file - Утилита для определения типов файлов
rpm-build-firefox - RPM helper macros to rebuild firefox packages
rpm-build-fonts - RPM helper scripts for building font packages
…
Для использования данных макросов, необходимо добавить в spec-файл строку:
BuildRequires(pre): имя-пакета-с-макросами
Например:
BuildRequires(pre): rpm-build-java
Списки макросов находятся в каталоге /usr/lib/rpm/macros.d/.
Получить список доступных макросов и их значения можно, выполнив команду:
$ rpm --showrc
Получить значение, раскрываемое макросом можно, выполнив команду:
$ rpm --eval <имя_макроса>
Например:
$ rpm --eval %_sysconfdir
/etc
Макросы можно использовать внутри других макросов. Так, например, если название архива исходных текстов проекта формируется из его имени и версии (директивы «Name» и «Version» транслируются в определенные макросы), то директива задания пути к файлу может выглядеть следующим образом:
Source0: %{name}-%{version}.tar.gz

Примечание

Не следует использовать в спеках внутренние макросы RPM, которые начинаются с двух подчеркиваний (например, %__install или %__mkdir_p).
В Макросы путей системных каталогов перечислены некоторые макросы.

Таблица 6.1. Макросы путей системных каталогов

Макрос
Описание
%homedir
Домашний каталог пользователя, вызывающего этот макрос
%_licensedir
Каталог лицензий (/usr/share/license)
%_controldir
Каталог control (/etc/control.d/facilities)
%_defaultdocdir
Каталог документации (/usr/share/doc)
%_defattr
Атрибуты файлов и каталогов по умолчанию для каждой секции %files и для каждого файла, включаемого в таких секциях (-,root,root,755)
%_man1dir, %_man2dir, %_man3dir, %_man4dir, %_man5dir, %_man6dir, %_man7dir, %_man8dir, %_man9dir
Каталог man-файлов (/usr/share/man/manX)
%java_dir %_javadir
Каталог для некоторых jar-файлов (/usr/share/java)
%_rpmmacrosdir
Каталог для установки сторонних макросов (/usr/lib/rpm/macros.d)
С целью сокращения написания часто требуемых команд при сборке пакета в блоках тела спецификации существует ряд полезных встроенных макросов. Некоторые из них рассмотрены ниже.
Макрос %setup — используется в блоке %prep. Этот макрос распаковывает архив с исходным кодом (с ключом -q подавляет подробный вывод при распаковке архива). По умолчанию распаковывается первый архив с исходным кодом (т. е. который имеет номер 0), для любых других необходимо использовать дополнительный параметр -a X, где X — номер, совпадающий с таковым у Source.
%prep
%setup -a1 -a100 -a101 -a102 -a103 -a104 -a105
%patch1 -p1
Макрос %setup в Sisyphus RPM использует ключ –q (подавляет подробный вывод при распаковке архива) по умолчанию. Запись %setup -q и %setup — полностью идентичны. Для включения отладочной информации следует использовать конструкцию с ключом -v.
%patch[X] — используется в блоке %prep и выполняет применение указанного патча (X — номер патча, такой же, как и при их описании в преамбуле, если патчей несколько). Применение патчей производится от текущего сборочного каталога, при необходимости обрезать часть пути к изменяемому файлу, можно использовать ключ –p (как и у самой утилиты patch). Например:
%patch3 -p1
Макрос %autopatch позволяет применить все патчи, описанные в основной секции spec-файла, в порядке возрастания их номера в имени. Макрос поддерживает использование ключей -p и -F, аналогичные таким же опциям директивы %patch.
Макрос %configure — применяется в блоке %build и используется для упрощения выполнения ./configure с соответствующими параметрами данной платформы. Почти всегда вполне достаточно выполнить %configure без параметров.
%build
%configure
%make_build
Если скрипта configure в архиве исходных текстов нет (обычное явление для исходников из git или иных SCM), но есть configure.ac — следует добавить перед вызовом %configure макрос %autoreconf.
Макрос %make_build — используется в блоке %build для выполнения команды make. По умолчанию поддерживает при сборке использование нескольких процессоров/ядер.
Макрос %makeinstall_std — применяется в блоке %install. Этот макрос рекомендуется применять вместо макроса %make_install с ключами install и DESTDIR=%buildroot:
%make_install DESTDIR=%buildroot install
Макрос %make_install — применяется в блоке %install. Используется для упрощения установки ПО и представляет собой запуск утилиты make с ключом install, и указанием каталога для установки (DESTDIR=%buildroot) и рядом других ключей:
%make_install DESTDIR=%buildroot install
или
%make_install DESTDIR=%buildroot %_make_install_target
Макрос %makeinstall — применяется в блоке %install. Это редко используемый макрос, предназначенный для установки ПО, Makefile которого не умеет использовать параметр DESTDIR.
Макрос %dir — макрос, используемый в блоке %files, указывающий, что путь является каталогом, который должен принадлежать этому RPM. Это указание важно для того, чтобы RPM точно знал, какие каталоги нужно очистить при удалении пакета.
Макрос %doc — макрос, используемый в блоке %files, обеспечивающий создание каталога документации (%_defaultdocdir/%name-%version) и копирование в него указанных в качестве аргументов файлов. Пути к файлам строятся относительно каталога сборки проекта, например:
%doc Examples