3.11.2.2.3 Основные макросы
Скачать документКонсультации и оказание технической поддержки по данной статье не предоставляются.
Вы можете подробнее ознакомиться с принципами сборки пакетов для РЕД ОС, просмотрев наши обучающие видео:
на 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, но копирует файлы лицензий в соответствующий каталог.
Дата последнего изменения: 03.10.2024
Если вы нашли ошибку, пожалуйста, выделите текст и нажмите Ctrl+Enter.