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.
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.
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.
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.
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}
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.
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.
“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
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
.
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
.
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
.
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
.
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
.
USES
não pode ser atribuído após a inclusão de bsd.port.pre.mk
.
Diversas variáveis existem para definir dependências comuns compartilhadas por muitos ports. O uso é opcional, mas ajuda a reduzir a verbosidade dos Makefile
s 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.
É 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!
USE_*
Variável | Significa |
---|---|
USE_GCC |
O port requer GCC ( Nota:
|
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.
Uma versão mínima de uma dependência pode ser especificada em qualquer
, exceto *
_DEPENDSLIB_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.
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
em vez de redefinir *
_DEPENDSDEPENDS_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.
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ê.
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.
.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.
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>.