Capítulo 7. Flavors

7.1. 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.

7.2. Usando FLAVORS

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

Isso pode ajudar a simplificar a lógica do Makefile para também definir um FLAVOR como:

FLAVOR?=	${FLAVORS:[1]}

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 _.

Exemplo 1. Uso Básico de Flavors

Se um port tiver um port slave "lite", o port slave pode ser removido, e o port pode ser convertido em flavors com:

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

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 Outro Uso Básico de Flavors.

Exemplo 2. Outro Uso Básico de Flavors

Se um port tiver um port slave -nox11, o port slave pode ser removido, e o port pode ser convertido em flavors com:

FLAVORS=	x11 nox11
FLAVOR?=	${FLAVORS:[1]}
nox11_PKGNAMESUFFIX=	-nox11
[...]
.if ${FLAVOR} == x11
[enable x11 features]
.endif
Exemplo 3. Uso Mais Complexo de Flavors

Aqui está um excerto ligeiramente editado do que está presente em devel/libpeas, um port que usa os 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

USES=		gnome python
USE_PYTHON=	flavors (1)

.if ${FLAVOR:Upy27:Mpy2*} (2)
USE_GNOME=	pygobject3 (3)

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

BUILD_WRKSRC=	${WRKSRC}/loaders/python (4)
INSTALL_WRKSRC=	${WRKSRC}/loaders/python (5)
.else # py3*
USE_GNOME+=	py3gobject3 (6)

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

BUILD_WRKSRC=	${WRKSRC}/loaders/python3 (8)
INSTALL_WRKSRC=	${WRKSRC}/loaders/python3 (9)
.endif

py34_PLIST=	${.CURDIR}/pkg-plist-py3 (10)
py35_PLIST=	${.CURDIR}/pkg-plist-py3 (11)
py36_PLIST=	${.CURDIR}/pkg-plist-py3 (12)
1Este port não usa o USE_PYTHON=distutils mas precisa do flavor Python de qualquer maneira.
2Para proteger contra o FLAVOR estar vazio, o que causaria um erro no make(1), use ${FLAVOR:U} em comparações de strings em vez de ${FLAVOR}.
3As ligações gobject3 doGnome Python têm dois nomes diferentes, um para Python2, pygobject3 e um para Python3, py3gobject3.
4O script configure tem que ser executado em ${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.
5Sugestão sobre o nome correto do caminho do script de configuração do Python 3.
6A 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 helper.

7.2.1. Flavors Helpers

Para tornar o 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

Exemplo 4. Flavor Específico PKGNAME

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:

FLAVORS=	normal lite
lite_PKGNAMESUFFIX=	-lite

7.3. USES=php e Flavors

Ao usar o 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.

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

Exemplo 5. Extensão Simples USES=php

Isso irá gerar o pacote para todas as versões suportadas:

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:

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

USES=		php:ext
IGNORE_WITH_PHP=	72

7.3.1. 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.

Aplicações PHP que são acrescidas de flavors devem acrescentar PHP_PKGNAMESUFFIX aos nomes dos pacotes.

Exemplo 6. Adicionando Flavors em uma Aplicação PHP

Incluir o suporte de Flavors em uma aplicação PHP é simples:

PKGNAMESUFFIX=	${PHP_PKGNAMESUFFIX}

USES=	php:flavors

Ao adicionar uma dependência em um port com flavors PHP, use @${PHP_FLAVOR}. Nunca use FLAVOR diretamente.

7.4. USES=python e Flavors

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

Exemplo 7. Simples USES=python

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:

USES=	python
USE_PYTHON=	distutils

Receberá esses flavors: py27 e py36.

USES=	python
USE_PYTHON=	distutils allflavors

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

Exemplo 8. USES=python com Requisitos de Versão

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:

USES=	python:-3.5
USE_PYTHON=	distutils

Vai ter esse flavor: py27.

USES=	python:-3.5
USE_PYTHON=	distutils allflavors

Receberá esses flavors: py27, py34 e py35.

USES=	python:3.4+
USE_PYTHON=	distutils

Vai ter esse flavor: py36.

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.

Exemplo 9. Para um port que não usa distutils

Se a versão padrão do Python3 é 3.6, o seguinte irá definir a variável PY_FLAVOR para py36:

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

USES=	python:3.5+

7.5. USES=lua e Flavors

Ao usar lua:module ou 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 Usando Lua para maiores informações.


Última alteração em: 11 de dezembro de 2021 por Sergio Carlavilla Delgado