---
title: Capítulo 7. Flavors
prev: books/porters-handbook/special
next: books/porters-handbook/plist
showBookMenu: true
weight: 7
params:
  path: "/books/porters-handbook/flavors/"
---

[[flavors]]
= 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]]
== Uma Introdução aos Flavors

Os flavors são uma maneira de ter várias variações de um port. O port é construído várias vezes, com variações.

Por exemplo, um port pode ter uma versão normal com muitos recursos e algumas dependências, e uma versão leve "lite" com apenas recursos básicos e dependências mínimas.

Outro exemplo poderia ser, um port pode ter um flavor GTK e um QT, dependendo de qual kit de ferramentas ele usa.

[[flavors-using]]
== Usando FLAVORS

Para declarar um port com vários flavors, adicione `FLAVORS` no seu [.filename]#Makefile#. O primeiro flavor em `FLAVORS` é o flavor padrão.

[TIP]
====
Isso pode ajudar a simplificar a lógica do [.filename]#Makefile# para também definir um `FLAVOR` como:

[.programlisting]
....
FLAVOR?=	${FLAVORS:[1]}
....

====

[IMPORTANT]
====
Para distinguir os flavors das opções, que são sempre letras maiúsculas, os nomes dos flavors podem conter _apenas_ letras minúsculas, números e underline `_`.
====

[[flavors-using-ex1]]
.Uso Básico de Flavors
[example]
====
Se um port tiver um port slave "lite", o port slave pode ser removido, e o port pode ser convertido em flavors com:

[.programlisting]
....
FLAVORS=	default lite
lite_PKGNAMESUFFIX=	-lite
[...]
.if ${FLAVOR:U} != lite
[enable non lite features]
.endif
....

[NOTE]
======
O primeiro flavor é o padrão, e é chamado aqui de `default`. Não é uma obrigação e, se possível, use um nome de flavor mais específico, como em <<flavors-using-ex2>>.
======

====

[[flavors-using-ex2]]
.Outro Uso Básico de Flavors
[example]
====
Se um port tiver um port slave `-nox11`, o port slave pode ser removido, e o port pode ser convertido em flavors com:

[.programlisting]
....
FLAVORS=	x11 nox11
FLAVOR?=	${FLAVORS:[1]}
nox11_PKGNAMESUFFIX=	-nox11
[...]
.if ${FLAVOR} == x11
[enable x11 features]
.endif
....

====

[[flavors-using-ex3]]
.Uso Mais Complexo de Flavors
[example]
====
Aqui está um excerto ligeiramente editado do que está presente em package:devel/libpeas[], um port que usa os <<flavors-auto-python,flavors Python>>. Com as versões padrões do Python 2 e 3 sendo 2.7 e 3.6, ele irá automaticamente mudar para `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 <.>
....

<.> Este port não usa o `USE_PYTHON=distutils` mas precisa do flavor Python de qualquer maneira.
<.> Para proteger contra o `FLAVOR` estar vazio, o que causaria um erro no man:make[1], use `${FLAVOR:U}` em comparações de strings em vez de `${FLAVOR}`.
<.> As ligações gobject3 doGnome Python têm dois nomes diferentes, um para Python2, pygobject3 e um para Python3, py3gobject3.
<.> O script `configure` tem que ser executado em [.filename]#${WRKSRC}#, mas estamos interessados ​​apenas em compilar e instalar as partes Python 2 ou Python 3 do software, então configure os diretórios base de compilação e instalação apropriadamente.
<.> Sugestão sobre o nome correto do caminho do script de configuração do Python 3.
<.> A lista de empacotamento é diferente quando compilada com Python 3. Como existem três possíveis versões do Python3 , defina `PLIST` para todos os três usando o <<flavors-using-helpers,helper>>.
====

[[flavors-using-helpers]]
=== Flavors Helpers

Para tornar o [.filename]#Makefile# mais fácil de ser escrito, existem alguns flavors helpers.

Esta lista de helpers definirá sua variável:

* `flavor_PKGNAMEPREFIX`
* `flavor_PKGNAMESUFFIX`
* `flavor_PLIST`
* `flavor_DESCR`

Esta lista de helpers será anexada à sua variável:

* `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]]
.Flavor Específico `PKGNAME`
[example]
====
Como todos os pacotes devem ter um nome de pacote diferente, os flavors devem mudar os seus, usando `flavor_PKGNAMEPREFIX` e o `flavor_PKGNAMESUFFIX` torna isso fácil:

[.programlisting]
....
FLAVORS=	normal lite
lite_PKGNAMESUFFIX=	-lite
....

====

[[flavors-auto-php]]
== `USES=php` e Flavors

Ao usar o <<uses-php,USES=php>> com um destes argumentos, `phpize`, `ext`, `zend` ou `pecl`, o port terá automaticamente o `FLAVORS` preenchido com a versão PHP que ele suporta.

[NOTE]
====
Todos os exemplos assumem que as versões PHP suportadas atualmente são 5.6, 7.0, 7.1 e 7.2.
====

[[flavors-auto-php-ex1]]
.Extensão Simples `USES=php`
[example]
====
Isso irá gerar o pacote para todas as versões suportadas:

[.programlisting]
....
PORTNAME=	some-ext
PORTVERSION=	0.0.1
PKGNAMEPREFIX=	${PHP_PKGNAMEPREFIX}

USES=		php:ext
....

Isto irá gerar pacotes para todas as versões suportadas, menos a 7.2:

[.programlisting]
....
PORTNAME=	some-ext
PORTVERSION=	0.0.1
PKGNAMEPREFIX=	${PHP_PKGNAMEPREFIX}

USES=		php:ext
IGNORE_WITH_PHP=	72
....

====

[[flavors-auto-php-app]]
=== Flavors PHP com Aplicações PHP

Aplicações PHP também podem ter flavors.

Isso permite gerar pacotes para todas as versões do PHP, para que os usuários possam usá-los com qualquer versão que precisarem em seus servidores.

[IMPORTANT]
====
Aplicações PHP que são acrescidas de flavors _devem_ acrescentar `PHP_PKGNAMESUFFIX` aos nomes dos pacotes.
====

[[flavors-auto-php-app-ex1]]
.Adicionando Flavors em uma Aplicação PHP
[example]
====
Incluir o suporte de Flavors em uma aplicação PHP é simples:

[.programlisting]
....
PKGNAMESUFFIX=	${PHP_PKGNAMESUFFIX}

USES=	php:flavors
....

====

[TIP]
====
Ao adicionar uma dependência em um port com flavors PHP, use `@${PHP_FLAVOR}`. _Nunca_ use `FLAVOR` diretamente.
====

[[flavors-auto-python]]
== `USES=python` e Flavors

Ao usar <<uses-python,`USES=python`>> e `USE_PYTHON=distutils`, o port irá automaticamente preencher `FLAVORS` com a versão Python que suporta.

[[flavors-auto-python-ex1]]
.Simples `USES=python`
[example]
====
Supondo que as versões suportadas do Python são 2.7, 3.4, 3.5 e 3.6, e a versão padrão do Python 2 e 3 são 2.7 e 3.6, um port com:

[.programlisting]
....
USES=	python
USE_PYTHON=	distutils
....

Receberá esses flavors: `py27` e `py36`.

[.programlisting]
....
USES=	python
USE_PYTHON=	distutils allflavors
....

Receberá esses flavors: `py27`, `py34`, `py35` e `py36`.
====

[[flavors-auto-python-ex2]]
.`USES=python` com Requisitos de Versão
[example]
====
Supondo que as versões suportadas do Python são 2.7, 3.4, 3.5 e 3.6, e a versão padrão do Python 2 e 3 são 2.7 e 3.6, um port com:

[.programlisting]
....
USES=	python:-3.5
USE_PYTHON=	distutils
....

Vai ter esse flavor: `py27`.

[.programlisting]
....
USES=	python:-3.5
USE_PYTHON=	distutils allflavors
....

Receberá esses flavors: `py27`, `py34` e `py35`.

[.programlisting]
....
USES=	python:3.4+
USE_PYTHON=	distutils
....

Vai ter esse flavor: `py36`.

[.programlisting]
....
USES=	python:3.4+
USE_PYTHON=	distutils allflavors
....

Receberá esses flavors: `py34`, `py35` e `py36`.
====

A variável `PY_FLAVOR` é disponibilizada para depender da versão correta dos módulos Python. Todas as dependências em ports Python com flavors devem usar `PY_FLAVOR`, e não `FLAVOR` diretamente.

[[flavors-auto-python-ex3]]
.Para um port que não usa `distutils`
[example]
====
Se a versão padrão do Python3 é 3.6, o seguinte irá definir a variável `PY_FLAVOR` para `py36`:

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

USES=	python:3.5+
....

====

[[flavors-auto-lua]]
== `USES=lua` e Flavors

Ao usar crossref:uses[uses-lua,`lua:module`] ou crossref:uses[uses-lua,`lua:flavors`], o port terá automaticamente `FLAVORS` preenchidos com as versões Lua que suporta. No entanto, não se espera que aplicativos comuns (em vez de módulos Lua) usem este recurso; a maioria das aplicações que incorporam ou usam Lua simplesmente devem usar `USES=lua`.

`LUA_FLAVOR` está disponível (e deve ser usado) para depender da versão correta das dependências, independentemente do port usar os parâmetros `flavors` ou `module`.

Veja crossref:special[using-lua,Usando Lua] para maiores informações.
