--- 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]] .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 <>. 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]] === 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 <> 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 <> 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.