5.13. Opções do Makefile

Muitas aplicações podem ser compiladas com configurações opcionais ou diferentes. Exemplos podem ser a escolha de linguagem natural (humana), GUI versus linha de comando ou qual tipo de banco de dados será suportado. Os usuários podem precisar de uma configuração diferente do padrão, portanto o sistema de ports fornece ganchos em que o autor do port pode usar para controlar qual variante será compilada. Suportar essas opções corretamente fará com que os usuários fiquem felizes, e efetivamente forneça dois ou mais ports pelo preço de um.

5.13.1. OPTIONS

5.13.1.1. Background

OPTIONS_* fornece ao usuário que está instalando o port uma caixa de diálogo mostrando as opções disponíveis e, em seguida, salva essas opções em ${PORT_DBDIR}/${OPTIONS_NAME}/options. Na próxima vez que o port for compilado, as opções serão reutilizadas. O padrão de PORT_DBDIR é /var/db/ports. OPTIONS_NAME é a origem do port com um underline como o separador de espaço, por exemplo, dns/bind99 será dns_bind99.

Quando o usuário executa make config (ou executa make build pela primeira vez), o framework verifica ${PORT_DBDIR}/${OPTIONS_NAME}/options. Se esse arquivo não existir, os valores de OPTIONS_* são usados ​​e uma caixa de diálogo é exibida onde as opções podem ser ativadas ou desativadas. Então as options são salvas e as variáveis ​​configuradas são utilizadas ao compilar o port.

Se uma nova versão do port adicionar novas OPTIONS, a caixa de diálogo será apresentada ao usuário, já preenchido com os valores salvos das antigas OPTIONS.

make showconfig mostra a configuração salva. Use make rmconfig para remover a configuração salva.

5.13.1.2. Sintaxe

OPTIONS_DEFINE contém uma lista de OPTIONS para serem utilizadas. Elas são independentes umas das outras e não são agrupadas:

OPTIONS_DEFINE=	OPT1 OPT2

Uma vez definido, as OPTIONS são descritas (opcionalmente, mas fortemente recomendado):

OPT1_DESC=	Describe OPT1
OPT2_DESC=	Describe OPT2
OPT3_DESC=	Describe OPT3
OPT4_DESC=	Describe OPT4
OPT5_DESC=	Describe OPT5
OPT6_DESC=	Describe OPT6

ports/Mk/bsd.options.desc.mk possui descrições para muitas OPTIONS comuns. Geralmente são úteis, mas podem ser substituas se a descrição for insuficiente para o port.

Dica:

Ao descrever as opções, visualize-as da perspectiva do usuário: Qual funcionalidade ela muda? e Por que eu iria querer habilitar ela? Não repita apenas o nome. Por exemplo, descrever a opção NLS como incluir suporte NLS não ajuda o usuário, que já pode ver o nome da opção, mas pode não saber o que isso significa. Descrevendo-a como Suporte a idiomas nativos por meio de utilitários gettext é muito mais útil.

Importante:

Os nomes das opções são sempre em letras maiúsculas. Não podem estar misturadas ou apenas em minúsculo.

OPTIONS podem ser agrupadas como opções radio, onde apenas uma escolha de cada grupo é permitida:

OPTIONS_SINGLE=		SG1
OPTIONS_SINGLE_SG1=	OPT3 OPT4

Atenção:

Deve estar sempre selecionada uma de cada OPTIONS_SINGLE para as opções serem válidas. Uma opção de cada grupo deve ser adicionada a OPTIONS_DEFAULT.

OPTIONS podem ser agrupadas como opções radio, onde nenhuma ou apenas uma escolha de cada grupo é permitida:

OPTIONS_RADIO=		RG1
OPTIONS_RADIO_RG1=	OPT7 OPT8

OPTIONS também pode ser agrupadas como listas de múltipla-escolha, onde pelo menos uma opção deve estar habilitada:

OPTIONS_MULTI=		MG1
OPTIONS_MULTI_MG1=	OPT5 OPT6

OPTIONS também pode ser agrupadas como listas de múltipla-escolha, onde nenhuma ou qualquer opção pode ser ativada:

OPTIONS_GROUP=		GG1
OPTIONS_GROUP_GG1=	OPT9 OPT10

OPTIONS são desativadas por padrão, a menos que estejam listadas em OPTIONS_DEFAULT:

OPTIONS_DEFAULT=	OPT1 OPT3 OPT6

Definições de OPTIONS devem aparecer antes da inclusão de bsd.port.options.mk. Valores de PORT_OPTIONS só podem ser testados após a inclusão de bsd.port.options.mk. Inclusão de bsd.port.pre.mk pode ser usado também, e ainda é amplamente usado em ports escritos antes da introdução de bsd.port.options.mk. Mas esteja ciente de que algumas variáveis não funcionarão como esperado após a inclusão de bsd.port.pre.mk, tipicamente algumas flags USE_*.

Exemplo 5.39. Uso Simples de OPTIONS
OPTIONS_DEFINE=	FOO BAR
OPTIONS_DEFAULT=FOO

FOO_DESC=	Option foo support
BAR_DESC=	Feature bar support

# Will add --with-foo / --without-foo
FOO_CONFIGURE_WITH=	foo
BAR_RUN_DEPENDS=	bar:bar/bar

.include <bsd.port.mk>

Exemplo 5.40. Verificar OPTIONS Desmacadas
.if ! ${PORT_OPTIONS:MEXAMPLES}
CONFIGURE_ARGS+=--without-examples
.endif

O formato acima não é recomendado. O método preferido é usar um configure knob para realmente ativar e desativar o recurso coincidindo com a opção:

# Will add --with-examples / --without-examples
EXAMPLES_CONFIGURE_WITH=	examples

Exemplo 5.41. Uso Prático de OPTIONS
OPTIONS_DEFINE=		EXAMPLES
OPTIONS_DEFAULT=	PGSQL LDAP SSL

OPTIONS_SINGLE=		BACKEND
OPTIONS_SINGLE_BACKEND=	MYSQL PGSQL BDB

OPTIONS_MULTI=		AUTH
OPTIONS_MULTI_AUTH=	LDAP PAM SSL

EXAMPLES_DESC=		Install extra examples
MYSQL_DESC=		Use MySQL as backend
PGSQL_DESC=		Use PostgreSQL as backend
BDB_DESC=		Use Berkeley DB as backend
LDAP_DESC=		Build with LDAP authentication support
PAM_DESC=		Build with PAM support
SSL_DESC=		Build with OpenSSL support

# Will add USE_PGSQL=yes
PGSQL_USE=	pgsql=yes
# Will add --enable-postgres / --disable-postgres
PGSQL_CONFIGURE_ENABLE=	postgres

ICU_LIB_DEPENDS=	libicuuc.so:devel/icu

# Will add --with-examples / --without-examples
EXAMPLES_CONFIGURE_WITH=	examples

# Check other OPTIONS

.include <bsd.port.mk>

5.13.1.3. Opções Padrão

Essas opções estão sempre ativadas por padrão.

  • DOCS — build and install documentation.

  • NLS — Native Language Support.

  • EXAMPLES — build and install examples.

  • IPV6 — IPv6 protocol support.

Nota:

Não há necessidade de adicioná-las em OPTIONS_DEFAULT. Para ativá-las e mostra-las na caixa de diálogo de seleção de opções, elas devem ser adicionadas em OPTIONS_DEFINE.

5.13.2. Feature de Ativação Automática

Ao usar um script configure GNU, fique de olho em quais recursos opcionais são ativados por detecção automática. Desative explicitamente os recursos opcionais que não são necessários, adicionando --without-xxx ou --disable-xxx em CONFIGURE_ARGS.

Exemplo 5.42. Manipulação Incorreta de uma Opção
.if ${PORT_OPTIONS:MFOO}
LIB_DEPENDS+=		libfoo.so:devel/foo
CONFIGURE_ARGS+=	--enable-foo
.endif

No exemplo acima, imagine que uma biblioteca libfoo está instalada no sistema. O usuário não quer que este aplicativo use libfoo, então ele desabilitou a opção na caixa de diálogo do make config. Mas o script configure do aplicativo detecta a biblioteca presente no sistema e inclui seu suporte no executável resultante. Agora, quando o usuário decide remover libfoo do sistema, o sistema de ports não protesta (nenhuma dependência de libfoo foi registrada), e então o aplicativo quebra.

Exemplo 5.43. Manuseio Correto de uma Opção
FOO_LIB_DEPENDS=		libfoo.so:devel/foo
# Will add --enable-foo / --disable-foo
FOO_CONFIGURE_ENABLE=	foo

Nota:

Sob algumas circunstâncias, a sintaxe condicional abreviada pode causar problemas com construções complexas. Os erros são geralmente Malformed conditional, e uma sintaxe alternativa pode ser usada.

.if !empty(VARIABLE:MVALUE)

como uma alternativa para

.if ${VARIABLE:MVALUE}

5.13.3. Assistentes de Opções

Existem algumas macros para ajudar a simplificar valores condicionais que diferem com base nas opções definidas. Para facilitar o acesso, é fornecida uma lista abrangente:

PLIST_SUB, SUB_LIST

Para geração automática de %%OPT%% e %%NO_OPT%%, veja Seção 5.13.3.1, “OPTIONS_SUB.

Para uso mais complexo, veja Seção 5.13.3.11, “Substituição de Variáveis ​​Genéricas, OPT_VARIABLE e OPT_VARIABLE_OFF.

CONFIGURE_ARGS

Para --enable-x e --disable-x, veja Seção 5.13.3.3.1, “OPT_CONFIGURE_ENABLE.

Para --with-x e --without-x, veja Seção 5.13.3.3.2, “OPT_CONFIGURE_WITH.

Para todos os outros casos, veja Seção 5.13.3.3.3, “OPT_CONFIGURE_ON e OPT_CONFIGURE_OFF.

CMAKE_ARGS

Para argumentos que são booleanos (on, off, true, false, 0, 1) veja Seção 5.13.3.4.2, “OPT_CMAKE_BOOL e OPT_CMAKE_BOOL_OFF.

Para todos os outros casos, veja Seção 5.13.3.4.1, “OPT_CMAKE_ON e OPT_CMAKE_OFF.

MESON_ARGS

Para argumentos que precisam de true ou false, veja Seção 5.13.3.5.2, “OPT_MESON_TRUE e OPT_MESON_FALSE.

Para argumentos que precisam de yes ou no, use Seção 5.13.3.5.3, “OPT_MESON_YES e OPT_MESON_NO.

Para argumentos que precisam de true ou false, veja Seção 5.13.3.5.4, “OPT_MESON_ENABLED e OPT_MESON_DISABLED.

Para todos os outros casos, use Seção 5.13.3.5.1, “OPT_MESON_ON e OPT_MESON_OFF.

QMAKE_ARGS

Veja Seção 5.13.3.6, “OPT_QMAKE_ON e OPT_QMAKE_OFF.

USE_*

Veja Seção 5.13.3.2, “OPT_USE e OPT_USE_OFF.

*_DEPENDS

Veja Seção 5.13.3.10, “Dependências, OPT_DEPTYPE e OPT_DEPTYPE_OFF.

* (Qualquer variável)

As variáveis ​​mais usadas possuem assistentes diretos, veja Seção 5.13.3.11, “Substituição de Variáveis ​​Genéricas, OPT_VARIABLE e OPT_VARIABLE_OFF.

Para qualquer variável sem um assistente específico, veja Seção 5.13.3.9, “OPT_VARS e OPT_VARS_OFF.

Dependências de opções

Quando uma opção precisa de outra opção para funcionar, veja Seção 5.13.3.7, “OPT_IMPLIES.

Conflitos de opções

Quando uma opção não funciona se outra também estiver ativada, consulte Seção 5.13.3.8, “OPT_PREVENTS e OPT_PREVENTS_MSG.

Targets para Build

Quando uma opção precisa de algum processamento extra, veja Seção 5.13.3.12, “Targets Adicionais de Compilação, target-OPT-on e target-OPT-off.

5.13.3.1. OPTIONS_SUB

Se OPTIONS_SUB está definido com yes então cada uma das opções adicionadas a OPTIONS_DEFINE será adicionada em PLIST_SUB e SUB_LIST, por exemplo:

OPTIONS_DEFINE=	OPT1
OPTIONS_SUB=	yes

é equivalente a:

OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
PLIST_SUB+=	OPT1="" NO_OPT1="@comment "
SUB_LIST+=	OPT1="" NO_OPT1="@comment "
.else
PLIST_SUB+=	OPT1="@comment " NO_OPT1=""
SUB_LIST+=	OPT1="@comment " NO_OPT1=""
.endif

Nota:

O valor de OPTIONS_SUB é ignorado. Definindo-o com qualquer valor irá adicionar entradas PLIST_SUB e SUB_LIST para todas as opções.

5.13.3.2. OPT_USE e OPT_USE_OFF

Quando a opção OPT é selecionada, para cada par key=value em OPT_USE, value é anexado ao USE_KEY correspondente. E se value tiver espaços, substitua-os por vírgulas e eles serão alterados de volta para espaços durante o processamento. OPT_USE_OFF funciona da mesma maneira, quando OPT não for selecionada. Por exemplo:

OPTIONS_DEFINE=	OPT1
OPT1_USES=	xorg
OPT1_USE=	mysql=yes xorg=x11,xextproto,xext,xrandr
OPT1_USE_OFF=	openssl=yes

é equivalente a:

OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
USE_MYSQL=	yes
USES+=		xorg
USE_XORG=	x11 xextproto xext xrandr
.else
USE_OPENSSL=	yes
.endif

5.13.3.3. Assistentes CONFIGURE_ARGS

5.13.3.3.1. OPT_CONFIGURE_ENABLE

Quando a opção OPT é selecionada, para cada valor em OPT_CONFIGURE_ENABLE, --enable-valor será anexado a CONFIGURE_ARGS. Quando a opção OPT não for selecionada, --disable-valor será anexado a CONFIGURE_ARGS. Um argumento opcional pode ser especificado com um símbolo =. Este argumento é apenas anexado na entrada de opção do script configure --enable-valor. Por exemplo:

OPTIONS_DEFINE=	OPT1 OPT2
OPT1_CONFIGURE_ENABLE=	test1 test2
OPT2_CONFIGURE_ENABLE=	test2=exhaustive

é equivalente a:

OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
CONFIGURE_ARGS+=	--enable-test1 --enable-test2
.else
CONFIGURE_ARGS+=	--disable-test1 --disable-test2
.endif

.if ${PORT_OPTIONS:MOPT2}
CONFIGURE_ARGS+=	--enable-test2=exhaustive
.else
CONFIGURE_ARGS+=	--disable-test2
.endif
5.13.3.3.2. OPT_CONFIGURE_WITH

Quando a opção OPT é selecionada, para cada valor em OPT_CONFIGURE_WITH, --with-valor será anexado a CONFIGURE_ARGS. Quando a opção OPT não for selecionada, --without-valor será anexado a CONFIGURE_ARGS. Um argumento opcional pode ser especificado com um símbolo =. Este argumento é apenas anexado na entrada de opção do script configure --with-valor. Por exemplo:

OPTIONS_DEFINE=	OPT1 OPT2
OPT1_CONFIGURE_WITH=	test1
OPT2_CONFIGURE_WITH=	test2=exhaustive

é equivalente a:

OPTIONS_DEFINE=	OPT1 OPT2

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
CONFIGURE_ARGS+=	--with-test1
.else
CONFIGURE_ARGS+=	--without-test1
.endif

.if ${PORT_OPTIONS:MOPT2}
CONFIGURE_ARGS+=	--with-test2=exhaustive
.else
CONFIGURE_ARGS+=	--without-test2
.endif
5.13.3.3.3. OPT_CONFIGURE_ON e OPT_CONFIGURE_OFF

Quando a opção OPT é selecionada, o valor de OPT_CONFIGURE_ON, se definido, é anexado a CONFIGURE_ARGS. OPT_CONFIGURE_OFF funciona da mesma maneira, quando OPTnão for selecionada. Por exemplo:

OPTIONS_DEFINE=	OPT1
OPT1_CONFIGURE_ON=	--add-test
OPT1_CONFIGURE_OFF=	--no-test

é equivalente a:

OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
CONFIGURE_ARGS+=	--add-test
.else
CONFIGURE_ARGS+=	--no-test
.endif

Dica:

Na maioria das vezes, os assistentes em Seção 5.13.3.3.1, “OPT_CONFIGURE_ENABLE e Seção 5.13.3.3.2, “OPT_CONFIGURE_WITH fornecem uma funcionalidade mais curta e abrangente.

5.13.3.4. Assistentes CMAKE_ARGS

5.13.3.4.1. OPT_CMAKE_ON e OPT_CMAKE_OFF

Quando a opção OPT é selecionada, o valor de OPT_CMAKE_ON, se definido, é anexado a CMAKE_ARGS. OPT_CMAKE_OFF funciona da mesma maneira, mas quando OPT não for selecionada. Por exemplo:

OPTIONS_DEFINE=	OPT1
OPT1_CMAKE_ON=	-DTEST:BOOL=true -DDEBUG:BOOL=true
OPT1_CMAKE_OFF=	-DOPTIMIZE:BOOL=true

é equivalente a:

OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
CMAKE_ARGS+=	-DTEST:BOOL=true -DDEBUG:BOOL=true
.else
CMAKE_ARGS+=	-DOPTIMIZE:BOOL=true
.endif

Dica:

Veja Seção 5.13.3.4.2, “OPT_CMAKE_BOOL e OPT_CMAKE_BOOL_OFF para um assistente mais curto quando o valor for booleano.

5.13.3.4.2. OPT_CMAKE_BOOL e OPT_CMAKE_BOOL_OFF

Quando a opção OPT é selecionada, para cada valor em OPT_CMAKE_BOOL, -Dvalor:BOOL=true será anexado a CMAKE_ARGS. Quando a opção OPT não for selecionada, -Dvalor:BOOL=false será anexado a CONFIGURE_ARGS. O OPT_CMAKE_BOOL_OFF é o oposto, -Dvalor:BOOL=false será anexado a CMAKE_ARGS quando a opção é selecionada, e a entrada -Dvalor:BOOL=true quando a opção não for selecionada. Por exemplo:

OPTIONS_DEFINE=	OPT1
OPT1_CMAKE_BOOL=	TEST DEBUG
OPT1_CMAKE_BOOL_OFF=	OPTIMIZE

é equivalente a:

OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
CMAKE_ARGS+=	-DTEST:BOOL=true -DDEBUG:BOOL=true \
		-DOPTIMIZE:BOOL=false
.else
CMAKE_ARGS+=	-DTEST:BOOL=false -DDEBUG:BOOL=false \
		-DOPTIMIZE:BOOL=true
.endif

5.13.3.5. Assistentes MESON_ARGS

5.13.3.5.1. OPT_MESON_ON e OPT_MESON_OFF

Quando a opção OPT é selecionada, o valor de OPT_MESON_ON, se definido, é anexado a MESON_ARGS. OPT_MESON_OFF funciona da mesma maneira, quando OPT não for selecionada. Por exemplo:

OPTIONS_DEFINE=	OPT1
OPT1_MESON_ON=	-Dopt=1
OPT1_MESON_OFF=	-Dopt=2

é equivalente a:

OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
MESON_ARGS+=	-Dopt=1
.else
MESON_ARGS+=	-Dopt=2
.endif
5.13.3.5.2. OPT_MESON_TRUE e OPT_MESON_FALSE

Quando a opção OPT é selecionada, para cada valor em OPT_MESON_TRUE, -Dvalor=true será anexado a MESON_ARGS. Quando a opção OPT não for selecionada, -Dvalor=false será anexado a MESON_ARGS. O OPT_MESON_FALSE é o oposto, a entrada -Dvalor=false será anexado a MESON_ARGS quando a opção for selecionada e a entrada -Dvalor=true quando a opção não for selecionada. Por exemplo:

OPTIONS_DEFINE=	OPT1
OPT1_MESON_TRUE=	test debug
OPT1_MESON_FALSE=	optimize

é equivalente a:

OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
MESON_ARGS+=	-Dtest=true -Ddebug=true \
		-Doptimize=false
.else
MESON_ARGS+=	-Dtest=false -Ddebug=false \
		-Doptimize=true
.endif
5.13.3.5.3. OPT_MESON_YES e OPT_MESON_NO

Quando a opção OPT é selecionada, para cada entrada dentro da variável OPT_MESON_YES a entrada -D=yes é anexada a variável MESON_ARGS. Quando a opção OPTnão é selecionada, então a entrada -D=no é anexada a variável MESON_ARGS. O OPT_MESON_NO é o oposto, a entrada -D=no é anexada a variável MESON_ARGS quando a opção é selecionada e a entrada -D=yes quando a opção não é selecionada. Por exemplo:

OPTIONS_DEFINE=	OPT1
OPT1_MESON_YES=	test debug
OPT1_MESON_NO=	optimize

é equivalente a:

OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
MESON_ARGS+=	-Dtest=yes -Ddebug=yes \
		-Doptimize=no
.else
MESON_ARGS+=	-Dtest=no -Ddebug=no \
		-Doptimize=yes
.endif
5.13.3.5.4. OPT_MESON_ENABLED e OPT_MESON_DISABLED

Quando a opção OPT é selecionada, para cada valor em OPT_MESON_ENABLED, -Dvalor=enabled será anexado a MESON_ARGS. Quando a opção OPT não for selecionada, -Dvalor=disabled será anexado a MESON_ARGS. O OPT_MESON_DISABLED é o oposto, a entrada -Dvalor=disabled será anexado a MESON_ARGS quando a opção for selecionada e a entrada -Dvalor=enabled quando a opção não for selecionada. Por exemplo:

OPTIONS_DEFINE=	OPT1
OPT1_MESON_ENABLED=	test
OPT1_MESON_DISABLED=	debug

é equivalente a:

OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
MESON_ARGS+=	-Dtest=enabled -Ddebug=disabled
.else
MESON_ARGS+=	-Dtest=disabled -Ddebug=enabled
.endif

5.13.3.6. OPT_QMAKE_ON e OPT_QMAKE_OFF

Quando a opção OPT é selecionada, o valor de OPT_QMAKE_ON, se definido, é anexado a QMAKE_ARGS. OPT_QMAKE_OFF funciona da mesma maneira, quando OPT não for selecionada. Por exemplo:

OPTIONS_DEFINE=	OPT1
OPT1_QMAKE_ON=	-DTEST:BOOL=true
OPT1_QMAKE_OFF=	-DPRODUCTION:BOOL=true

é equivalente a:

OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
QMAKE_ARGS+=	-DTEST:BOOL=true
.else
QMAKE_ARGS+=	-DPRODUCTION:BOOL=true
.endif

5.13.3.7. OPT_IMPLIES

Fornece uma maneira de adicionar dependências entre as opções.

Quando OPT for selecionada, todas as opções listadas nesta variável também serão selecionadas. Usando o OPT_CONFIGURE_ENABLE descrito anteriormente para demonstrar:

OPTIONS_DEFINE=	OPT1 OPT2
OPT1_IMPLIES=	OPT2

OPT1_CONFIGURE_ENABLE=	opt1
OPT2_CONFIGURE_ENABLE=	opt2

É equivalente a:

OPTIONS_DEFINE=	OPT1 OPT2

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
CONFIGURE_ARGS+=	--enable-opt1
.else
CONFIGURE_ARGS+=	--disable-opt1
.endif

.if ${PORT_OPTIONS:MOPT2} || ${PORT_OPTIONS:MOPT1}
CONFIGURE_ARGS+=	--enable-opt2
.else
CONFIGURE_ARGS+=	--disable-opt2
.endif
Exemplo 5.44. Uso Simples de OPT_IMPLIES

Este port tem uma opção X11 e uma opção GNOME que precisa da opção X11 selecionada para poder compilar.

OPTIONS_DEFINE=	X11 GNOME
OPTIONS_DEFAULT=	X11

X11_USES=	xorg
X11_USE=	xorg=xi,xextproto
GNOME_USE=	gnome=gtk30
GNOME_IMPLIES=	X11

5.13.3.8. OPT_PREVENTS e OPT_PREVENTS_MSG

Fornece uma maneira de adicionar conflitos entre as opções.

Quando OPT for selecionada, todas as opções listadas em OPT_PREVENTS devem estar desmarcadas. Se OPT_PREVENTS_MSG estiver definido e um conflito for acionado, seu conteúdo será exibido explicando o por que do conflito. Por exemplo:

OPTIONS_DEFINE=	OPT1 OPT2
OPT1_PREVENTS=	OPT2
OPT1_PREVENTS_MSG=	OPT1 and OPT2 enable conflicting options

É aproximadamente equivalente a:

OPTIONS_DEFINE=	OPT1 OPT2

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT2} && ${PORT_OPTIONS:MOPT1}
BROKEN=	Option OPT1 conflicts with OPT2 (select only one)
.endif

A única diferença é que o primeiro irá apresentar um erro depois de executar make config, sugerindo alterar as opções selecionadas.

Exemplo 5.45. Uso Simples de OPT_PREVENTS

Este port tem as opções X509 e SCTP. Ambas as opções adicionam patches, mas os patches entram em conflito uns com os outros, então eles não podem ser selecionados ao mesmo tempo.

OPTIONS_DEFINE=	X509 SCTP

SCTP_PATCHFILES=	${PORTNAME}-6.8p1-sctp-2573.patch.gz:-p1
SCTP_CONFIGURE_WITH=	sctp

X509_PATCH_SITES=	http://www.roumenpetrov.info/openssh/x509/:x509
X509_PATCHFILES=	${PORTNAME}-7.0p1+x509-8.5.diff.gz:-p1:x509
X509_PREVENTS=		SCTP
X509_PREVENTS_MSG=	X509 and SCTP patches conflict

5.13.3.9. OPT_VARS e OPT_VARS_OFF

Fornece uma maneira genérica de definir e acrescentar valores em variáveis.

Atenção:

Antes de usar OPT_VARS e OPT_VARS_OFF, veja se já não existe um assistente mais específico disponível em Seção 5.13.3.11, “Substituição de Variáveis ​​Genéricas, OPT_VARIABLE e OPT_VARIABLE_OFF.

Quando a opção OPT está selecionada e OPT_VARS definido, os pares chave=valor e chave+=valor são avaliados a partir da variável OPT_VARS. Um = sobrescreve o valor existente da CHAVE, um += acrescenta o valor a chave. OPT_VARS_OFF funciona da mesma maneira, quando a opção OPT não for selecionada.

OPTIONS_DEFINE=	OPT1 OPT2 OPT3
OPT1_VARS=	also_build+=bin1
OPT2_VARS=	also_build+=bin2
OPT3_VARS=	bin3_build=yes
OPT3_VARS_OFF=	bin3_build=no

MAKE_ARGS=	ALSO_BUILD="${ALSO_BUILD}" BIN3_BUILD="${BIN3_BUILD}"

é equivalente a:

OPTIONS_DEFINE=	OPT1 OPT2

MAKE_ARGS=	ALSO_BUILD="${ALSO_BUILD}" BIN3_BUILD="${BIN3_BUILD}"

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
ALSO_BUILD+=	bin1
.endif

.if ${PORT_OPTIONS:MOPT2}
ALSO_BUILD+=	bin2
.endif

.if ${PORT_OPTIONS:MOPT2}
BIN3_BUILD=	yes
.else
BIN3_BUILD=	no
.endif

Importante:

Valores contendo espaços em branco devem ser colocados entre aspas:

OPT_VARS=	foo="bar baz"

Isso se deve ao jeito que a variável de expansão make(1) lida com espaço em branco. Quando a opção OPT_VARS=foo=bar baz é expandida, a variável acaba contendo duas strings, foo=bar e baz. Mas quem está submetendo o código provavelmente pretendia que houvesse apenas uma string, foo=bar baz. Inserir o valor entre aspas impede que o espaço em branco seja usado como um delimitador.

Além disso, não adicione espaços extras após o símbolo var= e antes do valor, pois assim também seria dividido o valor em duas strings. Isso não irá funcionar:

OPT_VARS=	foo=	bar

5.13.3.10. Dependências, OPT_DEPTYPE e OPT_DEPTYPE_OFF

Para qualquer um desses tipos de dependência:

  • PKG_DEPENDS

  • EXTRACT_DEPENDS

  • PATCH_DEPENDS

  • FETCH_DEPENDS

  • BUILD_DEPENDS

  • LIB_DEPENDS

  • RUN_DEPENDS

Quando opção OPT é selecionada, o valor de OPT_DEPTYPE, se definido, é anexado a DEPTYPE. OPT_DEPTYPE_OFF funciona da mesma forma, quando OPT não for selecionada. Por exemplo:

OPTIONS_DEFINE=	OPT1
OPT1_LIB_DEPENDS=	liba.so:devel/a
OPT1_LIB_DEPENDS_OFF=	libb.so:devel/b

é equivalente a:

OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
LIB_DEPENDS+=	liba.so:devel/a
.else
LIB_DEPENDS+=	libb.so:devel/b
.endif

5.13.3.11. Substituição de Variáveis ​​Genéricas, OPT_VARIABLE e OPT_VARIABLE_OFF

Para qualquer uma destas variáveis:

  • ALL_TARGET

  • BINARY_ALIAS

  • BROKEN

  • CATEGORIES

  • CFLAGS

  • CONFIGURE_ENV

  • CONFLICTS

  • CONFLICTS_BUILD

  • CONFLICTS_INSTALL

  • CPPFLAGS

  • CXXFLAGS

  • DESKTOP_ENTRIES

  • DISTFILES

  • EXTRACT_ONLY

  • EXTRA_PATCHES

  • GH_ACCOUNT

  • GH_PROJECT

  • GH_SUBDIR

  • GH_TAGNAME

  • GH_TUPLE

  • GL_ACCOUNT

  • GL_COMMIT

  • GL_PROJECT

  • GL_SITE

  • GL_SUBDIR

  • GL_TUPLE

  • IGNORE

  • INFO

  • INSTALL_TARGET

  • LDFLAGS

  • LIBS

  • MAKE_ARGS

  • MAKE_ENV

  • MASTER_SITES

  • PATCHFILES

  • PATCH_SITES

  • PLIST_DIRS

  • PLIST_FILES

  • PLIST_SUB

  • PORTDOCS

  • PORTEXAMPLES

  • SUB_FILES

  • SUB_LIST

  • TEST_TARGET

  • USES

Quando a opção OPT é selecionada, o valor da variável OPT_ABOVEVARIABLE, se definido, é anexado a ABOVEVARIABLE. OPT_ABOVEVARIABLE_OFF funciona da mesma maneira, quando OPT não for selecionada. Por exemplo:

OPTIONS_DEFINE=	OPT1
OPT1_USES=	gmake
OPT1_CFLAGS_OFF=	-DTEST

é equivalente a:

OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
USES+=		gmake
.else
CFLAGS+=	-DTEST
.endif

Nota:

Algumas variáveis ​​não estão nesta lista, em particular PKGNAMEPREFIX e PKGNAMESUFFIX. Isso é intencional. Um port não deve mudar seu nome quando alguma de suas opções forem alteradas.

Atenção:

Algumas dessas variáveis, pelo menos ALL_TARGET, DISTFILES e INSTALL_TARGET, tem seus valores padrão definidos depois das opções serem processadas.

Com estas linhas no Makefile:

ALL_TARGET=	all

DOCS_ALL_TARGET=	doc

Se a opção DOCS estiver ativada, ALL_TARGET terá o valor all doc; se a opção estiver desativada, ela terá o valor all.

Com apenas a linha do assistente de opções no Makefile:

DOCS_ALL_TARGET=	doc

Se a opção DOCS estiver ativada, ALL_TARGET terá o valor doc; se a opção estiver desativada, ela terá o valor all.

5.13.3.12. Targets Adicionais de Compilação, target-OPT-on e target-OPT-off

Estes targets de Makefile podem aceitar targets extras de compilação:

  • pre-fetch

  • do-fetch

  • post-fetch

  • pre-extract

  • do-extract

  • post-extract

  • pre-patch

  • do-patch

  • post-patch

  • pre-configure

  • do-configure

  • post-configure

  • pre-build

  • do-build

  • post-build

  • pre-install

  • do-install

  • post-install

  • post-stage

  • pre-package

  • do-package

  • post-package

Quando a opção OPT é selecionada, o target TARGET-OPT-on, se definido, é executado após TARGET. TARGET-OPT-off funciona da mesma maneira, quando OPT não for selecionada. Por exemplo:

OPTIONS_DEFINE=	OPT1

post-patch-OPT1-on:
	@${REINPLACE_CMD} -e '/opt1/s|/usr/bin/|${EXAMPLESDIR}/|' ${WRKSRC}/Makefile

post-patch-OPT1-off:
	@${REINPLACE_CMD} -e '/opt1/s|/usr/bin/|${PREFIX}/bin/|' ${WRKSRC}/Makefile

é equivalente a:

OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

post-patch:
.if ${PORT_OPTIONS:MOPT1}
	@${REINPLACE_CMD} -e '/opt1/s|/usr/bin/|${EXAMPLESDIR}/|' ${WRKSRC}/Makefile
.else
	@${REINPLACE_CMD} -e '/opt1/s|/usr/bin/|${PREFIX}/bin/|' ${WRKSRC}/Makefile
.endif

All FreeBSD documents are available for download at https://download.freebsd.org/ftp/doc/

Questions that are not answered by the documentation may be sent to <freebsd-questions@FreeBSD.org>.
Send questions about this document to <freebsd-doc@FreeBSD.org>.