2.11.2.2.3 Основные макросы
Консультации и оказание технической поддержки по данной статье не предоставляются.
Вы можете подробнее ознакомиться с принципами сборки пакетов для РЕД ОС, просмотрев наши обучающие видео:
-
на RuTube — Макросы | Курс по сборке пакетов в РЕД ОС;
-
в VK Видео — Макросы | Курс по сборке пакетов в РЕД ОС.
На наших каналах вы также сможете найти много другой полезной информации.
Как уже говорилось ранее, макрос RPM — это прямая текстовая подстановка. Имеется ряд основных макросов, как явно заданных в установленной сборочной системе, так и задаваемых по мере обработки спецификации.
Получить значение заданного в сборочной системе макроса можно с помощью команды
rpm --eval %{<ИМЯ_МАКРОСА>}
Например, получим значение уже упомянутого выше макроса %{?dist}:
rpm --eval %{?dist}
.el7
Тип значения макроса как переменной считается строковым (по аналогии с переменными в сценариях оболочки)!
С целью избежания нештатных ситуаций в случаях, когда макрос не определён, рекомендуется в конструкциях, где он используется как переменная, содержащая какое-либо значение, после открывающей скобки его имени ставить символ «?». Такая форма обращения к не определённому макросу при подстановке возвратит пустое значение, без знака вопроса — строку с именем данного макроса.
Например:

Макросы можно использовать внутри других макросов. Так, например, если название архива исходных текстов проекта формируется из его имени и версии (директивы Name и Version транслируются в определённые макросы, о чём будет рассказано ниже), то директива задания пути к файлу может выглядеть следующим образом:
Source0: %{name}-%{version}.tar.gz
Пути к системным каталогам и каталогам сборочного окружения могут быть получены в спецификации через заданные макросы, представленные в таблицах ниже.
Таблица 1. Макросы путей системных каталогов
|
Макрос |
Определение |
|---|---|
|
%{_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}/libexec = /usr/lubexec |
|
%{_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 |
|
%{_sharedstatedir} |
/var/lib |
Таблица 2. Макросы путей каталогов сборочного окружения
|
Макрос |
Определение |
|---|---|
|
%{_topdir} |
%{getenv:HOME}/rpmbuild |
|
%{_buildrootdir} |
%{_topdir}/BUILDROOT |
|
%{buildroot} |
%{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch} |
|
%{_builddir} |
%{_topdir}/BUILD |
|
%{_rpmdir} |
%{_topdir}/RPMS |
|
%{_sourcedir} |
%{_topdir}/SOURCES |
|
%{_specdir} |
%{_topdir}/SPECS |
|
%{_srcrpmdir} |
%{_topdir}/SRPMS |
Значения, определяемые директивами преамбулы, транслируются для данной сборки в стандартные макросы. Связь директив и макросов дана в следующей таблице.
Таблица 3. Связь директив преамбулы и некоторых макросов
|
Директива |
Соответствующий макрос |
|---|---|
|
Name |
%{name} |
|
Version |
%{version} |
|
Release |
%{release} |
|
Epoch |
%{epoch} |
|
URL |
%{url} |
|
SourceX |
%{SOURCEX} или %{S:X} |
С целью сокращения написания часто требуемых команд при сборке пакета в блоках тела спецификации существует ряд полезных встроенных макросов:
1) %setup — используется в блоке %prep и выполняет следующие действия:
-
переходит в дерево сборки;
-
распаковывает архив с исходным кодом (с ключом -q подавляет подробный вывод при распаковке архива);
-
изменяет владельца и права доступа к файлам с исходным кодом;
-
переходит в распакованный каталог.
По умолчанию распаковывается первый архив с исходным кодом (т. е. который имеет номер 0), для любых других необходимо использовать дополнительный параметр -a X, где X — номер, совпадающий с таковым у Source.
По умолчанию считается, что рабочим каталогом сборки в BUILD является тот, у которого имя совпадает с именем архива без суффикса (.tar.gz и пр.), если каталог с исходными текстами имеет другое название, то его указывают с ключом -n (например: %setup -n %{name}-master).
2) %patch[X] — используется в блоке %prep и выполняет применение указанного патча (здесь X — номер патча, такой же, как и при их описании в преамбуле, если патчей несколько). Применение патчей производится от текущего сборочного каталога, при необходимости обрезать часть пути к изменяемому файлу, можно использовать ключ -p (как и у самой утилиты patch). Например:
%patch3 -p1
3) %autopatch — применение всех патчей в порядке возрастания их номера в имени. Макрос также поддерживает использование ключа -p.
4) %autosetup — макрос, объединяющий функционал %setup и %autopatch; поддерживает все ключи, применимые в этих двум макросах.
5) %configure — применяется в блоке %build для выполнения сценария configure с подстановкой преднастроенных значений (обычно имён каталогов). Макрос принимает любые аргументы, которые при его раскрытии будут переданы скрипту configure.
6) %make_build — используется в блоке %build для выполнения команды make с установленными значениями %{?_smp_mflags} %{_make_verbose}. Здесь %{?_smp_mflags} раскрывается в -j <ЧИСЛО_ПОТОКОВ> и %{_make_verbose} — в V=1 VERBOSE=1.
Данный макрос также может принимать любые аргументы, которые при его раскрытии будут переданы утилите make.
7) %make_install — применяется в блоке %install, и представляет собой запуск утилиты make с ключом install, указанием каталога для установки (DESTDIR=%{buildroot}) и рядом других ключей.
Макрос также может принимать любые аргументы, которые при его раскрытии будут переданы утилите make.
8) %dir — макрос, используемый в блоке %files, указывающий, что путь является каталогом, который должен принадлежать этому RPM. Это указание важно для того, чтобы манифест файла RPM точно знал, какие каталоги нужно очистить при удалении пакета;
9) %doc — макрос, используемый в блоке %files, обеспечивающий создание каталога документации (%{_docdir}/%{name}-%{version}) и копирование в него указанных в качестве аргументов файлов. Пути к файлам строятся относительно каталога сборки проекта.
Например: %doc README docs/Changelog
10) %license — макрос, применяемый в блоке %files, аналогичный %doc, но копирует файлы лицензий в соответствующий каталог.
Дата последнего изменения: 01.12.2025
Если вы нашли ошибку, пожалуйста, выделите текст и нажмите Ctrl+Enter.