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