Knobs

Материал из ALT Linux Wiki

Ручки при сборке

Бывает, что пакет требуется собирать по-разному -- в 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

Ссылки