Knobs
Ручки при сборке
Бывает, что в зависимости от условий пакет требуется собирать по-разному -- в bootstrap-режиме или полноценно, с той библиотекой или с этой; для этого в RPM существуют "ручки", симметричные configure-овым --disable/--enable и --with/--without.
когда какие
Как правило, --disable/--enable применяются ко внутренней функциональности проекта (включить или выключить сборку/применение какой-либо части его кода), а --with/--without -- ко внешней (собираться ли с такой-то отдельной библиотекой).
как
Поведение по умолчанию задаётся макросами %def_*:
%def_with python3 %def_without bootstrap %def_enable guile %def_disable snapshot
Условные части spec-файла обрамляются так:
%if_with python3 BuildRequires(pre): rpm-build-python3 %endif
либо так (однострочная форма более кратка и менее читабельна):
%{?_with_python3:BuildPreReq: rpm-build-python3}
Условия могут быть вложенными, в этом случае следует внимательно следить за их своевременным закрытием.
архитектуры
Данностью является целевая архитектура сборки -- для неё существует особая форма %ifarch/%ifnarch, принимающая список архитектур:
%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