Knobs
Ручки при сборке
Бывает, что пакет требуется собирать по-разному -- в bootstrap-режиме или полноценно, с той библиотекой или с этой; для этого в RPM существуют "ручки", соответствующие configure-овым опциям --disable/--enable и --with/--without.
когда какие
Как правило, в configure, --disable/--enable применяются ко внутренней функциональности проекта (включить или выключить сборку/применение какой-либо части его кода), а --with/--without -- ко внешней (собираться ли с такой-то отдельной библиотекой).
как
Поведение по умолчанию задаётся макросами %def_* (обычно в начале спека для лучшей видимости), при этом, задавать умолчание обязательно:
%def_with python3 %def_without bootstrap %def_enable guile %def_disable snapshot
На эти параметры можно влиять во время сборки через --disable/--enable/--with/--without опции rpmbuild, это удобно для временного или глобального их отключения/включения без изменения спека (например --disable check).
Условные части spec-файла обрамляются так:
%if_with python3 BuildRequires(pre): rpm-build-python3 %endif %if_enable guile BuildRequires: guile-devel %endif
либо как условное раскрытие макроса (однострочная форма более кратка и менее читабельна):
%{?_with_python3:BuildPreReq: rpm-build-python3} %{?_enabled_guile:BuildPreReq: guile-devel}
Условия могут быть вложенными, в этом случае следует внимательно следить за их своевременным закрытием.
Затем, в configure эти параметры передаются так:
%configure \ %{subst_with python3} \ %{subst_enable guile}
архитектуры
Данностью является целевая архитектура сборки -- для неё существует особая форма %ifarch/%ifnarch, принимающая список архитектур. Если вы в зависимости от архитектуры включаете или выкроючаете %def_ опцию, то необходимо задать и включающий, и выключающий вариант через %else, так как задание %def_enable/%def_with не подразумевает определение %def_disable/%def_without. Пример:
%ifarch %e2k ppc64le %def_enable webkit %else %def_disable webkit %endif
Для некоторых ходовых компонентов, состояние поддержки которых по архитектурам может меняться со временем (причём в любую сторону), сделаны макропакеты rpm-macros-*; например:
BuildRequires(pre): rpm-macros-qt5-webengine # ... %ifarch %qt5_qtwebengine_arches
В некоторой мере повлиять на эту данность (в случае совместимости сверху вниз -- i586 может выполнять код для i486) можно явным заданием версии архитектуры, например:
$ rpm -bb --define '_target_cpu e2kv4' *.spec