--- description: 'Флейворы — это способ создания нескольких вариаций порта' next: books/porters-handbook/plist params: path: /books/porters-handbook/flavors/ prev: books/porters-handbook/special showBookMenu: 'true' tags: ["Ports", "Flavors", "introduction", "how-to", "guide"] title: 'Глава 7. Флейворы' weight: 7 --- [[flavors]] = Флейворы :doctype: book :toc: macro :toclevels: 1 :icons: font :sectnums: :sectnumlevels: 6 :sectnumoffset: 7 :partnums: :source-highlighter: rouge :experimental: :images-path: books/porters-handbook/ ifdef::env-beastie[] ifdef::backend-html5[] :imagesdir: ../../../../images/{images-path} endif::[] ifndef::book[] include::shared/authors.adoc[] include::shared/mirrors.adoc[] include::shared/releases.adoc[] include::shared/attributes/attributes-{{% lang %}}.adoc[] include::shared/{{% lang %}}/teams.adoc[] include::shared/{{% lang %}}/mailing-lists.adoc[] include::shared/{{% lang %}}/urls.adoc[] toc::[] endif::[] ifdef::backend-pdf,backend-epub3[] include::../../../../../shared/asciidoctor.adoc[] endif::[] endif::[] ifndef::env-beastie[] toc::[] include::../../../../../shared/asciidoctor.adoc[] endif::[] [[flavors-intro]] == Введение в флейворы (Flavors) Флейворы (Flavors) — это способ создания нескольких вариаций порта. Порт собирается несколько раз с различными вариациями. Например, порт может иметь обычную версию с множеством функций и значительным количеством зависимостей, а также облегчённую "lite"-версию только с базовыми функциями и минимальными зависимостями. Еще одним примером может быть порт с вариантом GTK и вариантом QT, в зависимости от используемого набора инструментов. [[flavors-using]] == Использование FLAVORS Чтобы объявить порт с несколькими флейворами, добавьте `FLAVORS` в его [.filename]#Makefile#. Первый вариант в `FLAVORS` является вариантом по умолчанию. [TIP] ==== Это может помочь упростить логику [.filename]#Makefile#, также определив `FLAVOR` как: [.programlisting] .... FLAVOR?= ${FLAVORS:[1]} .... ==== [IMPORTANT] ==== Чтобы отличать флейворы от опций, которые всегда обозначаются заглавными буквами, названия флейворов могут содержать _только_ строчные буквы, цифры и символ подчёркивания `_`. ==== [[flavors-using-ex1]] .Основы использования флейворов [example] ==== Если порт имеет "облегченный" подчиненный порт (lite slave port), подчиненный порт можно удалить, а порт преобразовать во флейворы с помощью: [.programlisting] .... FLAVORS= default lite lite_PKGNAMESUFFIX= -lite [...] .if ${FLAVOR:U} != lite [enable non lite features] .endif .... ==== [[flavors-using-ex2]] .Еще один пример базового использования флейворов [example] ==== Если порт имеет подчиненный порт `-nox11`, подчиненный порт можно удалить, а порт преобразовать в флейворы с помощью: [.programlisting] .... FLAVORS= x11 nox11 FLAVOR?= ${FLAVORS:[1]} nox11_PKGNAMESUFFIX= -nox11 [...] .if ${FLAVOR} == x11 [enable x11 features] .endif .... ==== [[flavors-using-ex3]] .Использование флейворов в более сложных примерах [example] ==== Вот слегка отредактированный отрывок из того, что присутствует в пакете package:devel/libpeas[], порте, который использует crossref:flavors[flavors-auto-python,флейворы Python]. При стандартных версиях Python 2 и 3, а именно 2.7 и 3.6, он автоматически получит `FLAVORS=py27 py36` [.programlisting] .... 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. Чтобы избежать ошибки в man:make[1] из-за пустого значения `FLAVOR`, используйте `${FLAVOR:U}` в сравнениях строк вместо `${FLAVOR}`. Привязки Gnome Python gobject3 имеют два разных названия: pygobject3 для Python 2 и py3gobject3 для Python 3. Скрипт `configure` должен выполняться в [.filename]#${WRKSRC}#, но нас интересует только сборка и установка частей программного обеспечения для Python 2 или Python 3, поэтому установите базовые каталоги сборки и установки соответствующим образом. Подсказка о правильном пути к конфигурационному скрипту Python 3. Список упаковки отличается при сборке с Python 3. Поскольку есть три возможные версии Python 3, установите `PLIST` для всех трёх с помощью crossref:flavors[flavors-using-helpers, вспомогательные инструменты флейворов]. ==== [[flavors-using-helpers]] === Вспомогательные инструменты для флейворов (Flavors Helpers) Чтобы упростить написание [.filename]#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` [[flavors-helpers-ex1]] .Специфичный для флейвора `PKGNAME` [example] ==== Поскольку все пакеты должны иметь уникальные имена, флейворы должны изменять их, используя `__flavor___PKGNAMEPREFIX` и `__flavor___PKGNAMESUFFIX`, что упрощает задачу: [.programlisting] .... FLAVORS= normal lite lite_PKGNAMESUFFIX= -lite .... ==== [[flavors-auto-php]] == `USES=php` и флейворы При использовании crossref:uses[uses-php,`php`] с одним из этих аргументов: `phpize`, `ext`, `zend` или `pecl`, порт автоматически получит заполненный параметр `FLAVORS` с версиями PHP, которые он поддерживает. [[flavors-auto-php-ex1]] .Простое расширение `USES=php` [example] ==== Это создаст пакет для всех поддерживаемых версий: [.programlisting] .... PORTNAME= some-ext PORTVERSION= 0.0.1 PKGNAMEPREFIX= ${PHP_PKGNAMEPREFIX} USES= php:ext .... Это создаст пакет для всех поддерживаемых версий, кроме 7.2: [.programlisting] .... PORTNAME= some-ext PORTVERSION= 0.0.1 PKGNAMEPREFIX= ${PHP_PKGNAMEPREFIX} USES= php:ext IGNORE_WITH_PHP= 72 .... ==== [[flavors-auto-php-app]] === Версии PHP с приложениями PHP Приложения PHP также могут быть созданы с использованием флейворов. Это позволяет создавать пакеты для всех версий PHP, чтобы пользователи могли использовать их с любой необходимой версией на своих серверах. [IMPORTANT] ==== Приложения PHP, которые используют флейворы, _обязаны_ добавлять `PHP_PKGNAMESUFFIX` к именам своих пакетов. ==== [[flavors-auto-php-app-ex1]] .Добавление флейворов в PHP-приложения [example] ==== Добавление поддержки флейворов в PHP-приложение просто: [.programlisting] .... PKGNAMESUFFIX= ${PHP_PKGNAMESUFFIX} USES= php:flavors .... ==== [TIP] ==== При добавлении зависимости к порту с вариантом PHP используйте `@${PHP_FLAVOR}`. _Никогда_ не используйте `FLAVOR` напрямую. ==== [[flavors-auto-python]] == `USES=python` и флейворы При использовании crossref:uses[uses-python,`python`] и `USE_PYTHON=distutils` порт автоматически получит заполненные `FLAVORS` с версиями Python, которые он поддерживает. [[flavors-auto-python-ex1]] .Простой `USES=python` [example] ==== Предполагая, что поддерживаемые версии Python — 2.7, 3.4, 3.5 и 3.6, а версии Python 2 и 3 по умолчанию — 2.7 и 3.6, порт с параметрами: [.programlisting] .... USES= python USE_PYTHON= distutils .... получит следующие флейворы: `py27` и `py36`. [.programlisting] .... USES= python USE_PYTHON= distutils allflavors .... получит следующие флейворы: `py27`, `py34`, `py35` и `py36`. ==== [[flavors-auto-python-ex2]] .`USES=python` с требованиями к версии [example] ==== Предполагая, что поддерживаемые версии Python — 2.7, 3.4, 3.5 и 3.6, а версии Python 2 и 3 по умолчанию — 2.7 и 3.6, порт с параметрами: [.programlisting] .... USES= python:-3.5 USE_PYTHON= distutils .... получит следующие флейвор: `py27`. [.programlisting] .... USES= python:-3.5 USE_PYTHON= distutils allflavors .... получит следующие флейворы: `py27`, `py34` и `py35`. [.programlisting] .... USES= python:3.4+ USE_PYTHON= distutils .... получит следующий флейвор: `py36`. [.programlisting] .... USES= python:3.4+ USE_PYTHON= distutils allflavors .... получит следующие флейворы: `py34`, `py35` и `py36`. ==== `PY_FLAVOR` доступен для указания правильной версии модулей Python. Все зависимости от вариантов портов Python должны использовать `PY_FLAVOR`, а не `FLAVOR` напрямую. [[flavors-auto-python-ex3]] .Для порта, не использующего `distutils` [example] ==== Если версия Python 3 по умолчанию — 3.6, следующая команда установит `PY_FLAVOR` в значение `py36`: [.programlisting] .... RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}mutagen>0:audio/py-mutagen@${PY_FLAVOR} USES= python:3.5+ .... ==== [[flavors-auto-lua]] == `USES=lua` и флейворы При использовании crossref:uses[uses-lua,`lua:module`] или crossref:uses[uses-lua,`lua:flavors`] порт автоматически получит заполненный параметр `FLAVORS` с версиями Lua, которые он поддерживает. Однако предполагается, что обычные приложения (а не модули Lua) не должны использовать эту возможность; большинству приложений, которые встраивают или иным образом используют Lua, следует просто указывать `USES=lua`. `LUA_FLAVOR` доступен (и должен использоваться) для зависимости от правильной версии зависимостей, независимо от того, использовал ли порт параметры `flavors` или `module`. См. crossref:special[using-lua,Использование Lua] для получения дополнительной информации. [[flavors-auto-guile]] == `USES=guile` и флейворы При использовании crossref:uses[uses-guile,`guile:flavors`] порт автоматически получит заполненное поле `FLAVORS` с версиями Guile, которые он поддерживает. Однако не предполагается, что обычные приложения должны использовать эту возможность; она в первую очередь предназначена для библиотек и расширений, таких как `guile-lib` или `guile-cairo`. `GUILE_FLAVOR` доступен (и должен использоваться) для зависимости от правильной версии зависимостей с флейворами, независимо от того, использовал ли порт параметр `flavors` или нет. См. crossref:special[using-guile,Использование Guile] для получения дополнительной информации.