5.11. Опции для Makefile

Некоторые большие приложения могут быть построены в различных конфигурациях, с дополнительной функциональностью, зависящей от наличия в системе определённых библиотек или приложений. Например, выбор естественного (человеческого) языка, GUI против командной строки или типа используемой базы данных. Так как не всем пользователям требуются эти библиотеки или приложения, то в системе портов предусмотрен механизм, позволяющий автору порта принимать решение о конфигурации, которая будет строиться. Полная поддержка этого механизма облегчает пользователям жизнь и даёт два или более порта ценой создания одного.

5.11.1. Knobs

5.11.1.1. WITH_* и WITHOUT_*

Эти переменные предназначены для установки системным администратором. Многие из них стандартизованы в файле ports/KNOBS.

При создании порта не давайте имя для knob, специфичное для данного приложения. На примере порта Avahi, используйте WITHOUT_MDNS вместо WITHOUT_AVAHI_MDNS.

Замечание: Не стоит рассчитывать, что WITH_* обязательно имеет соответствующую переменную WITHOUT_*, и наоборот. В общем случае, предполагается значение по умолчанию.

Замечание: Если обратное не указано, то проверяется только факт установки самих переменных, но не их значение типа YES или NO.

Таблица 5-3. Основные переменные WITH_* и WITHOUT_*

Переменная Значения
WITHOUT_NLS Если установлена, указывает не задействовать интернационализацию, что может ускорить компиляцию. По умолчанию, интернационализация используется.
WITH_OPENSSL_BASE Использовать версию OpenSSL из базовой системы.
WITH_OPENSSL_PORT Устанавливает версию OpenSSL из security/openssl, даже если в базовой системе последняя версия.
WITHOUT_X11 Если порт может быть собран с поддержкой или без поддержки X, то, как правило, обычно порт собирается с поддержкой X. Если эта переменная определена, то будет собрана версия без поддержки X.

5.11.1.2. Наименование KNOBS

Рекомендуется, чтобы портеры использовали так называемые knobs для помощи конечным пользователям и для поддержания количества наименований knobs в небольшом количестве. Список популярных названий knobs можно найти в файле KNOBS

Названия knobs должны отражать, что это такое и что выполняет. Если у порта имеется библиотечный префикс в PORTNAME, то он должен присутствовать в названии knobs.

5.11.2. OPTIONS

5.11.2.1. Описание

При установке порта переменная OPTIONS предоставляет пользователю окно диалога с доступными параметрами и сохраняет их в файл /var/db/ports/portname/options. Эти опции будут повторно использованы при следующем перестроении порта. Вам больше никогда не понадобится запоминать все двадцать опций WITH_* и WITHOUT_*, используемых вами при построении этого порта!

Когда пользователь запускает make config (или запускает впервые make build), инфраструктура выполнит проверку существования файла /var/db/ports/portname /options. Если этот файл не существует, то при создании диалогового окна будут использованы значения OPTIONS, в котором их можно переключить. Затем сохраняется файл опций, и выбранные переменные используются при построении порта.

Если новая версия порта добавляет новые значения OPTIONS, то пользователю будет представлено окно диалога с сохраненными заполненными значениями старых OPTIONS.

Для просмотра сохраненной конфигурации используйте make showconfig. Для удаления сохраненной конфигурации используйте make rmconfig.

5.11.2.2. Синтаксис

Синтаксис переменной OPTIONS:

OPTIONS=   OPTION  "descriptive text" default ...
Значением по умолчанию является или ON, или OFF. Разрешаются множественные повторы всех трех полей.

Определение OPTIONS обязано появиться до подключения bsd.port.options.mk. Переменные WITH_* и WITHOUT_* могут быть проверены только после подключения bsd.port.options.mk. Вместо этого также можно использовать подключение bsd.port.pre.mk, что все еще широко используется в портах, написанных до появления bsd.port.options.mk. Но имейте в виду, что некоторые переменные, обычно флаги USE_*, после подключения bsd.port.pre.mk будут работать не так, как это от них ожидается.

Пример 5-8. Простое использование OPTIONS

OPTIONS=      FOO "Enable option foo" On \
              BAR "Support feature bar" Off

.include <bsd.port.options.mk>

.if defined(WITHOUT_FOO)
CONFIGURE_ARGS+=    --without-foo
.else
CONFIGURE_ARGS+=    --witht-foo
.endif

.if defined(WITH_BAR)
RUN_DEPENDS+=   bar:${PORTSDIR}/bar/bar
.endif

.include <bsd.port.mk>


Пример 5-9. Использование OPTIONS в старом стиле

OPTIONS=      FOO "Enable option foo" On

.include <bsd.port.pre.mk>

.if defined(WITHOUT_FOO)
CONFIGURE_ARGS+=    --without-foo
.else
CONFIGURE_ARGS+=    --with-foo
.endif

.include <bsd.port.post.mk>


5.11.3. Функция автоматической активации

При использовании сценария GNU configure, следите за тем, какие необязательные функции задействуются посредством автоматической активации. Отключайте явным образом те необязательные функции, которые вы не хотели бы использовать, через передачу соответствующих --without-xxx или --disable-xxx в переменной CONFIGURE_ARGS.

Пример 5-10. Неправильное управление опцией

.if defined(WITH_FOO)
LIB_DEPENDS+=       foo.0:${PORTSDIR}/devel/foo
CONFIGURE_ARGS+=    --enable-foo
.endif

В приведенном выше примере представьте себе библиотеку libfoo, установленную в системе. Пользователь не желает, чтобы приложение использовало libfoo, и поэтому он выключает соответствующую опцию в диалоге make config. Но сценарий configure приложения определяет наличие библиотеки в системе и включает ее поддержку в итоговый исполняемый файл. Теперь, когда пользователь решит удалить libfoo из системы, система портов позволит это сделать (т.к. зависимость от libfoo не была записана), но приложение перестанет работать.

Пример 5-11. Правильное управление опцией

.if defined(WITH_FOO)
LIB_DEPENDS+=       foo.0:${PORTSDIR}/devel/foo
CONFIGURE_ARGS+=    --enable-foo
.else
CONFIGURE_ARGS+=    --disable-foo
.endif

Во втором примере библиотека libfoo отключена явным образом. Сценарий configure не включает соответствующие функции в приложении, несмотря на присутствие библиотеки в системе.

По вопросам связанным с системой портов для FreeBSD, пишите по адресу <ports@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите по адресу <doc@FreeBSD.org>.