5.9. Dependências

Muitos ports dependem de outros ports. Esta é uma característica muito conveniente da maioria dos sistemas operacionais Unix-like, incluindo FreeBSD. Vários ports podem compartilhar uma dependência comum, ao invés de agrupar essa dependência com cada port ou pacote que precisa dela. Há sete variáveis ​​que podem ser usadas para garantir que todos os bits necessários estejam na máquina do usuário. Existem também algumas variáveis ​​de dependência pré-suportadas para casos comuns, além de algumas outras para controlar o comportamento das dependências.

Importante:

Quando o software possui dependências extras que fornecem recursos extras, as dependências básicas listadas em *_DEPENDS devem incluir as dependências extras que beneficiariam a maioria dos usuários. As dependências básicas nunca devem ser um conjunto de dependências mínima. O objetivo não é incluir todas as dependências possíveis. Inclua apenas aquelas que beneficiarão a maioria das pessoas.

5.9.1. LIB_DEPENDS

Esta variável especifica as bibliotecas compartilhadas das quais este port depende. É uma lista de tuplas lib:dir onde lib é o nome da biblioteca compartilhada, dir é o diretório no qual encontrá-lo, caso não esteja disponível. Por exemplo,

LIB_DEPENDS=   libjpeg.so:graphics/jpeg

irá verificar se há uma biblioteca jpeg compartilhada com qualquer versão no subdiretório graphics/jpeg da árvore de ports para compilar e instalar se não for encontrado.

A dependência é verificada duas vezes, uma vez dentro do target build e depois dentro do target install. Além disso, o nome da dependência é colocado no pacote para que o pkg-install (veja pkg-install(8)) a instale automaticamente se a mesma não estiver no sistema do usuário.

5.9.2. RUN_DEPENDS

Esta variável especifica arquivos executáveis ou arquivos para os quais este port depende durante o tempo de execução. É uma lista de tuplas path:dir[:target] onde path é o nome do executável ou arquivo,dir é o diretório no qual encontrá-lo, caso não esteja disponível, e o target é o target para chamar nesse diretório. E se o path começar com uma barra (/), ele será tratado como um arquivo e sua existência é testada com test -e; caso contrário, é assumido como um executável e which -s é usado para determinar se o programa existe no caminho de pesquisa.

Por exemplo,

RUN_DEPENDS=	${LOCALBASE}/news/bin/innd:news/inn \
		xmlcatmgr:textproc/xmlcatmgr

irá verificar se o arquivo ou diretório /usr/local/news/bin/innd existe, e compilar e instalá-lo a partir do subdiretório news/inn da árvore de ports, caso não seja encontrado. Ele também verá se um executável chamado xmlcatmgr está no caminho de pesquisa em textproc/xmlcatmgr para compilar e instalar se não for encontrado.

Nota:

Nesse caso, innd é na verdade um executável; se um executável estiver em um local que não deve estar no caminho de pesquisa, use o nome do caminho completo.

Nota:

A pesquisa oficial PATH usado no cluster de construção de ports é

/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin

A dependência é verificada a partir do target install. Além disso, o nome da dependência é colocado no pacote para que o pkg-install (veja pkg-install(8)) a instale automaticamente se a mesma não estiver no sistema do usuário. A parte target pode ser omitida se for igual a DEPENDS_TARGET.

Uma situação bastante comum é quando RUN_DEPENDS é literalmente o mesmo que BUILD_DEPENDS, especialmente se o software portado é escrito em uma linguagem de script ou se requer o mesmo ambiente de compilação e tempo de execução. Neste caso, é tentador e intuitivo atribuir diretamente um ao outro:

RUN_DEPENDS=	${BUILD_DEPENDS}

No entanto, essa atribuição pode poluir as dependências de tempo de execução com entradas não definidas no BUILD_DEPENDS original do port. Isso acontece por causa de uma avaliação preguiçosa de atribuição de variáveis do make(1). Considere um Makefile com USES_*, que são processados ​​por ports/Mk/bsd.*.mk para aumentar as dependências iniciais de compilação. Por exemplo, USES=gmake adiciona devel/gmake para BUILD_DEPENDS. Para evitar que essas dependências adicionais poluam RUN_DEPENDS, crie outra variável com o conteúdo atual de BUILD_DEPENDS e atribua-a para ambos BUILD_DEPENDS e RUN_DEPENDS:

MY_DEPENDS=	some:devel/some \
		other:lang/other
BUILD_DEPENDS=	${MY_DEPENDS}
RUN_DEPENDS=	${MY_DEPENDS}

Importante:

Não use := para atribuir BUILD_DEPENDS para RUN_DEPENDS ou vice-versa. Todas as variáveis ​​são expandidas imediatamente, o que é exatamente a coisa errada a fazer e quase sempre um fracasso.

5.9.3. BUILD_DEPENDS

Esta variável especifica executáveis ​​ou arquivos que este port requer para ser compilado. Como RUN_DEPENDS, ela é uma lista de tuplas path:dir[:target]. Por exemplo,

BUILD_DEPENDS=	unzip:archivers/unzip

irá procurar por um executável chamado unzip, e ir para o subdiretório archivers/unzip da árvore de ports para compilar e instalar se não for encontrado.

Nota:

build aqui significa tudo, desde a extração até a compilação. A dependência é verificada a partir do target extract. A parte do target pode ser omitida se for igual a DEPENDS_TARGET

5.9.4. FETCH_DEPENDS

Esta variável especifica executáveis ​​ou arquivos que este port requer para fazer os downloads. Como os dois anteriores, é uma lista de tuplas path:dir[:target]. Por exemplo,

FETCH_DEPENDS=	ncftp2:net/ncftp2

irá procurar por um executável chamado ncftp2 e ir para o subdiretório net/ncftp2 da árvore de ports para compilar e instalar se não for encontrado.

A dependência é verificada a partir do target fetch. A parte target pode ser omitida se for igual a DEPENDS_TARGET.

5.9.5. EXTRACT_DEPENDS

Esta variável especifica executáveis ​​ou arquivos que este port requer para extração. Como no anterior, é uma lista de tuplas path:dir[:target]. Por exemplo,

EXTRACT_DEPENDS=	unzip:archivers/unzip

irá procurar por um executável chamado unzip, e ir para o subdiretório archivers/unzip da árvore de ports para compilar e instalar se não for encontrado.

A dependência é verificada a partir do target extract. A parte target pode ser omitida se for igual a DEPENDS_TARGET.

Nota:

Use esta variável somente se a extração ainda não funcionar (o padrão usa tar) e não funciona com USES=tar, USES=lha ou USES=zip descrito em Capítulo 17, Usando Macros USES.

5.9.6. PATCH_DEPENDS

Esta variável especifica executáveis ​​ou arquivos que este port requer para aplicar patches. Como no anterior, é uma lista de path:dir[:target]. Por exemplo,

PATCH_DEPENDS=	${NONEXISTENT}:java/jfc:extract

vai descer para o subdiretório java/jfc da árvore de ports para extraí-lo.

A dependência é verificada a partir do target patch. A parte target pode ser omitida se for igual a DEPENDS_TARGET.

5.9.7. USES

Parâmetros podem ser adicionados para definir diferentes recursos e dependências usados ​​pelo port. Eles são especificados adicionando esta linha ao Makefile:

USES= feature[:arguments]

Para a lista completa de valores, por favor veja o Capítulo 17, Usando Macros USES.

Atenção:

USES não pode ser atribuído após a inclusão de bsd.port.pre.mk.

5.9.8. USE_*

Diversas variáveis ​​existem para definir dependências comuns compartilhadas por muitos ports. O uso é opcional, mas ajuda a reduzir a verbosidade dos Makefiles de port . Cada um deles é denominado como USES_*. Essas variáveis ​​podem ser usadas apenas no Makefile do port e ports/Mk/bsd.*.mk. Elas não são destinadas a opções configuráveis ​​pelo usuário - use PORT_OPTIONS para esse propósito.

Nota:

É sempre incorreto definir qualquer USE_* dentro de /etc/make.conf. Por exemplo, definindo

USE_GCC=X.Y

(onde XY é o número da versão) adicionaria uma dependência do gccXY para cada port, incluindo lang/gccXY em si!

Tabela 5.8. USE_*
VariávelSignifica
USE_GCC

O port requer GCC (gcc ou g++) para compilar. Alguns ports precisam de qualquer versão do GCC, algumas exigem versões modernas e recentes. Normalmente, é configurado para qualquer (neste caso, o GCC da base seria usado em versões do FreeBSD que ainda o possuem, ou o port lang/gcc seria instalado quando o compilador C/C++ padrão for o Clang); ou yes (significa usar sempre GCC estável e moderno do port lang/gcc). A versão exata também pode ser especificada, com um valor como 4.7. A versão mínima exigida pode ser especificada como 4.6+. O GCC do sistema base é usado quando satisfaz a versão solicitada, caso contrário, um compilador apropriado é compilado a partir do port, e CC e CXX são ajustados em conformidade.

Nota:

USE_GCC irá registrar uma dependência de tempo de compilação e uma de tempo de execução.


Variáveis ​​relacionadas ao gmake e configure são descritos em Seção 6.5, “Mecanismos de Compilação”, enquanto autoconf, automake e libtool são descritos em Seção 6.6, “Usando o GNU Autotools”. Variáveis relacionadas ao Perl ​são descritas em Seção 6.8, “Usando Perl. Variáveis ​​X11 são listadas em Seção 6.9, “Usando o X11”. Seção 6.10, “Usando o GNOME” lida com o GNOME e Seção 6.13, “Usando o KDE” com variáveis ​​relacionadas ao KDE. Seção 6.15, “Usando Java” documenta variáveis ​​Java, enquanto Seção 6.16, “Aplicações Web, Apache e PHP” contém informações sobre Apache, PHP e módulos PEAR. Python é discutido em Seção 6.17, “Usando Python”, e Ruby em Seção 6.19, “Usando Ruby”. Seção 6.20, “Usando SDL” fornece variáveis ​​usadas para aplicações SDL e, finalmente, Seção 6.24, “Usando o Xfce” contém informações sobre o Xfce.

5.9.9. Versão Mínima de uma Dependência

Uma versão mínima de uma dependência pode ser especificada em qualquer *_DEPENDS, exceto LIB_DEPENDS, usando esta sintaxe:

p5-Spiffy>=0.26:devel/p5-Spiffy

O primeiro campo contém um nome de pacote dependente, que deve corresponder à entrada no banco de dados de pacotes, um sinal de comparação e uma versão do pacote. A dependência é satisfeita se o p5-Spiffy-0.26 ou mais recente estiver instalado na máquina.

5.9.10. Notas sobre Dependências

Como mencionado acima, o target padrão para chamar quando uma dependência é necessária é o DEPENDS_TARGET. Seu padrão é o install. Esta é uma variável de usuário; nunca é definido em um Makefile de port. Se o port precisar de uma maneira especial de lidar com uma dependência, use a parte :target de *_DEPENDS em vez de redefinir DEPENDS_TARGET.

Quando rodar make clean, as dependências de port também são limpas automaticamente. Se isso não for desejável, defina NOCLEANDEPENDS no ambiente. Isto pode ser particularmente desejável se o port tiver algo que demore muito tempo para recompilar em sua lista de dependências, como o KDE, o GNOME ou o Mozilla.

Para depender de outro port incondicionalmente, use a variável ${NONEXISTENT} no primeiro campo do BUILD_DEPENDS ou RUN_DEPENDS. Use isto somente quando o código fonte do outro port for necessário. Tempo de compilação pode ser economizado especificando o target também. Por exemplo

BUILD_DEPENDS=	${NONEXISTENT}:graphics/jpeg:extract

sempre descerá para o port jpeg e extrai-lo.

5.9.11. Dependências Circulares são Fatais

Importante:

Não insira nenhuma dependência circular na árvore de ports!

A tecnologia de compilação de ports não tolera dependências circulares. Se uma for inserida, alguém, em algum lugar do mundo, terá sua instalação do FreeBSD quebrada quase que imediatamente, e muitos outros rapidamente terão o mesmo problema. Estes erros podem ser realmente difíceis de serem detectados. Em caso de dúvida, antes de fazer qualquer alteração, certifique-se de executar: cd /usr/ports; make index. Esse processo pode ser muito lento em máquinas mais antigas, mas pode evitar dor de cabeça para um grande número de pessoas, incluindo você.

5.9.12. Problemas Causados ​​por Dependências Automáticas

Dependências devem ser declaradas explicitamente ou usando o framework OPTIONS. Usar outros métodos, como a detecção automática, dificulta a indexação, o que causa problemas para o gerenciamento de ports e pacotes.

Exemplo 5.37. Declaração Errada de uma Dependência Opcional
.include <bsd.port.pre.mk>

.if exists(${LOCALBASE}/bin/foo)
LIB_DEPENDS=	libbar.so:foo/bar
.endif

O problema em tentar adicionar dependências automaticamente é que os arquivos e configurações fora de um port individual podem ser alterados a qualquer momento. Por exemplo: um índice é construído, depois um lote de ports é instalado. Mas um dos ports instala o arquivo testado. O índice então fica incorreto, porque um port instalado inesperadamente tem uma nova dependência. O índice ainda pode estar errado mesmo após a recriação, se outros ports também determinarem a necessidade de dependências com base na existência de outros arquivos.

Exemplo 5.38. Declaração Correta de uma Dependência Opcional
OPTIONS_DEFINE=	BAR
BAR_DESC=	Calling cellphones via bar

BAR_LIB_DEPENDS=	libbar.so:foo/bar

Testar variáveis ​​de opções é o método correto. Ele não causará inconsistências no índice de um lote de ports, desde que as opções tenham sido definidas antes da construção do índice. Scripts simples podem ser usados ​​para automatizar a compilação, instalação e atualização desses ports e seus pacotes.

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