Некоторые большие приложения могут быть построены в различных конфигурациях, с дополнительной функциональностью, зависящей от наличия в системе определённых библиотек или приложений. Например, выбор естественного (человеческого) языка, GUI против командной строки или типа используемой базы данных. Так как не всем пользователям требуются эти библиотеки или приложения, то в системе портов предусмотрен механизм, позволяющий автору порта принимать решение о конфигурации, которая будет строиться. Полная поддержка этого механизма облегчает пользователям жизнь и даёт два или более порта ценой создания одного.
Эти переменные предназначены для установки системным администратором. Многие из них стандартизованы в файле 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. |
Рекомендуется, чтобы портеры использовали так называемые knobs для помощи конечным пользователям и для поддержания количества наименований knobs в небольшом количестве. Список популярных названий knobs можно найти в файле KNOBS
Названия knobs должны отражать, что это такое и что выполняет. Если у порта имеется библиотечный префикс в PORTNAME, то он должен присутствовать в названии knobs.
При установке порта переменная OPTIONS предоставляет пользователю окно диалога с доступными параметрами и сохраняет их в файл /var/db/ports/portname/options. Эти опции будут повторно использованы при следующем перестроении порта. Вам больше никогда не понадобится запоминать все двадцать опций WITH_* и WITHOUT_*, используемых вами при построении этого порта!
Когда пользователь запускает make config (или запускает впервые make build), инфраструктура выполнит проверку существования файла /var/db/ports/portname /options. Если этот файл не существует, то при создании диалогового окна будут использованы значения OPTIONS, в котором их можно переключить. Затем сохраняется файл опций, и выбранные переменные используются при построении порта.
Если новая версия порта добавляет новые значения OPTIONS, то пользователю будет представлено окно диалога с сохраненными заполненными значениями старых OPTIONS.
Для просмотра сохраненной конфигурации используйте make showconfig. Для удаления сохраненной конфигурации используйте make rmconfig.
Синтаксис переменной 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>
При использовании сценария 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 не включает соответствующие функции в приложении, несмотря на присутствие библиотеки в системе.
Пред. | Начало | След. |
Файлы в формате info | Уровень выше | Задание рабочего каталога |