Глава 7. Флейворы | FreeBSD Documentation Portal
Description: Флейворы — это способ создания нескольких вариаций порта
Keywords: Ports,Flavors,introduction,how-to,guide

# Глава 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 для получения дополнительной информации.

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

Назад
Главная
Далее