Глава 7. Флейворы

Этот перевод может быть устаревшим. Для того, чтобы помочь с переводом, пожалуйста, обратитесь к Сервер переводов FreeBSD.

7.1. Введение в флейворы (Flavors)

Флейворы (Flavors) — это способ создания нескольких вариаций порта. Порт собирается несколько раз с различными вариациями.

Например, порт может иметь обычную версию с множеством функций и значительным количеством зависимостей, а также облегчённую "lite"-версию только с базовыми функциями и минимальными зависимостями.

Еще одним примером может быть порт с вариантом GTK и вариантом QT, в зависимости от используемого набора инструментов.

7.2. Использование FLAVORS

Чтобы объявить порт с несколькими флейворами, добавьте FLAVORS в его Makefile. Первый вариант в FLAVORS является вариантом по умолчанию.

Это может помочь упростить логику Makefile, также определив FLAVOR как:

FLAVOR?=	${FLAVORS:[1]}

Чтобы отличать флейворы от опций, которые всегда обозначаются заглавными буквами, названия флейворов могут содержать только строчные буквы, цифры и символ подчёркивания _.

Пример 1. Основы использования флейворов

Если порт имеет "облегченный" подчиненный порт (lite slave port), подчиненный порт можно удалить, а порт преобразовать во флейворы с помощью:

FLAVORS=	default lite
lite_PKGNAMESUFFIX=	-lite
[...]
.if ${FLAVOR:U} != lite
[enable non lite features]
.endif
Пример 2. Еще один пример базового использования флейворов

Если порт имеет подчиненный порт -nox11, подчиненный порт можно удалить, а порт преобразовать в флейворы с помощью:

FLAVORS=	x11 nox11
FLAVOR?=	${FLAVORS:[1]}
nox11_PKGNAMESUFFIX=	-nox11
[...]
.if ${FLAVOR} == x11
[enable x11 features]
.endif
Пример 3. Использование флейворов в более сложных примерах

Вот слегка отредактированный отрывок из того, что присутствует в пакете devel/libpeas, порте, который использует флейворы Python. При стандартных версиях Python 2 и 3, а именно 2.7 и 3.6, он автоматически получит FLAVORS=py27 py36

USES=		gnome python
USE_PYTHON=	flavors

.if ${FLAVOR:Upy27:Mpy2*}
USE_GNOME=	pygobject3

CONFIGURE_ARGS+=	--enable-python2 --disable-python3

BUILD_WRKSRC=	${WRKSRC}/loaders/python
INSTALL_WRKSRC=	${WRKSRC}/loaders/python
.else # py3*
USE_GNOME+=	py3gobject3

CONFIGURE_ARGS+=	--disable-python2 --enable-python3 \
			ac_cv_path_PYTHON3_CONFIG=${LOCALBASE}/bin/python${PYTHON_VER}-config

BUILD_WRKSRC=	${WRKSRC}/loaders/python3
INSTALL_WRKSRC=	${WRKSRC}/loaders/python3
.endif

py34_PLIST=	${.CURDIR}/pkg-plist-py3
py35_PLIST=	${.CURDIR}/pkg-plist-py3
py36_PLIST=	${.CURDIR}/pkg-plist-py3

Этот порт не использует USE_PYTHON=distutils, но всё равно требует флейворы Python. Чтобы избежать ошибки в make(1) из-за пустого значения FLAVOR, используйте ${FLAVOR:U} в сравнениях строк вместо ${FLAVOR}. Привязки Gnome Python gobject3 имеют два разных названия: pygobject3 для Python 2 и py3gobject3 для Python 3. Скрипт configure должен выполняться в ${WRKSRC}, но нас интересует только сборка и установка частей программного обеспечения для Python 2 или Python 3, поэтому установите базовые каталоги сборки и установки соответствующим образом. Подсказка о правильном пути к конфигурационному скрипту Python 3. Список упаковки отличается при сборке с Python 3. Поскольку есть три возможные версии Python 3, установите PLIST для всех трёх с помощью вспомогательные инструменты флейворов.

7.2.1. Вспомогательные инструменты для флейворов (Flavors Helpers)

Чтобы упростить написание Makefile, существуют несколько вспомогательных инструментов (помощников) флейворов.

Этот список помощников установит их переменную:

  • flavor_PKGNAMEPREFIX

  • flavor_PKGNAMESUFFIX

  • flavor_PLIST

  • flavor_DESCR

Этот список помощников будет добавлен к их переменной:

  • flavor_CONFLICTS

  • flavor_CONFLICTS_BUILD

  • flavor_CONFLICTS_INSTALL

  • flavor_PKG_DEPENDS

  • flavor_EXTRACT_DEPENDS

  • flavor_PATCH_DEPENDS

  • flavor_FETCH_DEPENDS

  • flavor_BUILD_DEPENDS

  • flavor_LIB_DEPENDS

  • flavor_RUN_DEPENDS

  • flavor_TEST_DEPENDS

Пример 4. Специфичный для флейвора PKGNAME

Поскольку все пакеты должны иметь уникальные имена, флейворы должны изменять их, используя flavor_PKGNAMEPREFIX и flavor_PKGNAMESUFFIX, что упрощает задачу:

FLAVORS=	normal lite
lite_PKGNAMESUFFIX=	-lite

7.3. USES=php и флейворы

При использовании php с одним из этих аргументов: phpize, ext, zend или pecl, порт автоматически получит заполненный параметр FLAVORS с версиями PHP, которые он поддерживает.

Пример 5. Простое расширение USES=php

Это создаст пакет для всех поддерживаемых версий:

PORTNAME=	some-ext
PORTVERSION=	0.0.1
PKGNAMEPREFIX=	${PHP_PKGNAMEPREFIX}

USES=		php:ext

Это создаст пакет для всех поддерживаемых версий, кроме 7.2:

PORTNAME=	some-ext
PORTVERSION=	0.0.1
PKGNAMEPREFIX=	${PHP_PKGNAMEPREFIX}

USES=		php:ext
IGNORE_WITH_PHP=	72

7.3.1. Версии PHP с приложениями PHP

Приложения PHP также могут быть созданы с использованием флейворов.

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

Приложения PHP, которые используют флейворы, обязаны добавлять PHP_PKGNAMESUFFIX к именам своих пакетов.

Пример 6. Добавление флейворов в PHP-приложения

Добавление поддержки флейворов в PHP-приложение просто:

PKGNAMESUFFIX=	${PHP_PKGNAMESUFFIX}

USES=	php:flavors

При добавлении зависимости к порту с вариантом PHP используйте @${PHP_FLAVOR}. Никогда не используйте FLAVOR напрямую.

7.4. USES=python и флейворы

При использовании python и USE_PYTHON=distutils порт автоматически получит заполненные FLAVORS с версиями Python, которые он поддерживает.

Пример 7. Простой USES=python

Предполагая, что поддерживаемые версии Python — 2.7, 3.4, 3.5 и 3.6, а версии Python 2 и 3 по умолчанию — 2.7 и 3.6, порт с параметрами:

USES=	python
USE_PYTHON=	distutils

получит следующие флейворы: py27 и py36.

USES=	python
USE_PYTHON=	distutils allflavors

получит следующие флейворы: py27, py34, py35 и py36.

Пример 8. USES=python с требованиями к версии

Предполагая, что поддерживаемые версии Python — 2.7, 3.4, 3.5 и 3.6, а версии Python 2 и 3 по умолчанию — 2.7 и 3.6, порт с параметрами:

USES=	python:-3.5
USE_PYTHON=	distutils

получит следующие флейвор: py27.

USES=	python:-3.5
USE_PYTHON=	distutils allflavors

получит следующие флейворы: py27, py34 и py35.

USES=	python:3.4+
USE_PYTHON=	distutils

получит следующий флейвор: py36.

USES=	python:3.4+
USE_PYTHON=	distutils allflavors

получит следующие флейворы: py34, py35 и py36.

PY_FLAVOR доступен для указания правильной версии модулей Python. Все зависимости от вариантов портов Python должны использовать PY_FLAVOR, а не FLAVOR напрямую.

Пример 9. Для порта, не использующего distutils

Если версия Python 3 по умолчанию — 3.6, следующая команда установит PY_FLAVOR в значение py36:

RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}mutagen>0:audio/py-mutagen@${PY_FLAVOR}

USES=	python:3.5+

7.5. USES=lua и флейворы

При использовании lua:module или lua:flavors порт автоматически получит заполненный параметр FLAVORS с версиями Lua, которые он поддерживает. Однако предполагается, что обычные приложения (а не модули Lua) не должны использовать эту возможность; большинству приложений, которые встраивают или иным образом используют Lua, следует просто указывать USES=lua.

LUA_FLAVOR доступен (и должен использоваться) для зависимости от правильной версии зависимостей, независимо от того, использовал ли порт параметры flavors или module.

См. Использование Lua для получения дополнительной информации.

7.6. USES=guile и флейворы

При использовании guile:flavors порт автоматически получит заполненное поле FLAVORS с версиями Guile, которые он поддерживает. Однако не предполагается, что обычные приложения должны использовать эту возможность; она в первую очередь предназначена для библиотек и расширений, таких как guile-lib или guile-cairo.

GUILE_FLAVOR доступен (и должен использоваться) для зависимости от правильной версии зависимостей с флейворами, независимо от того, использовал ли порт параметр flavors или нет.

См. Использование Guile для получения дополнительной информации.


Изменено: 18 сентября 2025 г. by Vladlen Popolitov