Knobs: различия между версиями

Материал из ALT Linux Wiki
(нач)
 
Нет описания правки
 
(не показана 1 промежуточная версия 1 участника)
Строка 1: Строка 1:
= Ручки при сборке =
= Ручки при сборке =
Бывает, что в зависимости от условий пакет требуется собирать по-разному -- в [[bootstrap]]-режиме или полноценно, с той библиотекой или с этой; для этого в [[RPM]] существуют "ручки", симметричные configure-овым <tt>--disable</tt>/<tt>--enable</tt> и <tt>--with</tt>/<tt>--without</tt>.
Бывает, что пакет требуется собирать по-разному -- в [[bootstrap]]-режиме или полноценно, с той библиотекой или с этой; для этого в [[RPM]] существуют "ручки", соответствующие configure-овым опциям <tt>--disable</tt>/<tt>--enable</tt> и <tt>--with</tt>/<tt>--without</tt>.


== когда какие ==
== когда какие ==
Как правило, <tt>--disable</tt>/<tt>--enable</tt> применяются ко внутренней функциональности проекта (включить или выключить сборку/применение какой-либо части его кода), а <tt>--with</tt>/<tt>--without</tt> -- ко внешней (собираться ли с такой-то отдельной библиотекой).
Как правило, в configure, <tt>--disable</tt>/<tt>--enable</tt> применяются ко внутренней функциональности проекта (включить или выключить сборку/применение какой-либо части его кода), а <tt>--with</tt>/<tt>--without</tt> -- ко внешней (собираться ли с такой-то отдельной библиотекой).


== как ==
== как ==
Поведение по умолчанию задаётся макросами <tt>%def_*</tt>:
Поведение по умолчанию задаётся макросами <tt>%def_*</tt> (обычно в начале спека для лучшей видимости), при этом, задавать умолчание обязательно:
  %def_with python3
  %def_with python3
  %def_without bootstrap
  %def_without bootstrap
  %def_enable guile
  %def_enable guile
  %def_disable snapshot
  %def_disable snapshot
На эти параметры можно влиять во время сборки через --disable/--enable/--with/--without опции rpmbuild, это удобно для временного или глобального их отключения/включения без изменения спека (например <tt>--disable check</tt>).


Условные части spec-файла обрамляются так:
Условные части spec-файла обрамляются так:
Строка 16: Строка 18:
  %if_with python3
  %if_with python3
  BuildRequires(pre): rpm-build-python3
  BuildRequires(pre): rpm-build-python3
%endif
%if_enable guile
BuildRequires: guile-devel
  %endif
  %endif


либо так (однострочная форма более кратка и менее читабельна):
либо как условное раскрытие макроса (однострочная форма более кратка и менее читабельна):


  %{?_with_python3:BuildPreReq: rpm-build-python3}
  %{?_with_python3:BuildPreReq: rpm-build-python3}
%{?_enabled_guile:BuildPreReq: guile-devel}


Условия могут быть вложенными, в этом случае следует внимательно следить за их своевременным закрытием.
Условия могут быть вложенными, в этом случае следует внимательно следить за их своевременным закрытием.
Затем, в <tt>configure</tt> эти параметры передаются так:
  %configure \
      %{subst_with python3} \
      %{subst_enable guile}


== архитектуры ==
== архитектуры ==
Данностью является целевая архитектура сборки -- для неё существует особая форма <tt>%ifarch</tt>/<tt>%ifnarch</tt>, принимающая список архитектур:
Данностью является целевая архитектура сборки -- для неё существует особая форма <tt>%ifarch</tt>/<tt>%ifnarch</tt>, принимающая список архитектур. Если вы в зависимости от архитектуры включаете или выкроючаете <tt>%def_</tt> опцию, то необходимо задать и включающий, и выключающий вариант через <tt>%else</tt>, так как задание %def_enable/%def_with не подразумевает определение %def_disable/%def_without. Пример:


  %ifarch %e2k ppc64le
  %ifarch %e2k ppc64le
Строка 38: Строка 50:
  # ...
  # ...
  %ifarch %qt5_qtwebengine_arches
  %ifarch %qt5_qtwebengine_arches
В некоторой мере повлиять на эту данность (в случае совместимости сверху вниз -- i586 может выполнять код для i486) можно явным заданием версии архитектуры, например:
$ rpm -bb --define '_target_cpu e2kv4' *.spec


= Ссылки =
= Ссылки =

Текущая версия от 14:43, 6 марта 2024

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

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

Ссылки