Manual do Porter do FreeBSD

O Projeto de Documentação do FreeBSD

FreeBSD is a registered trademark of The FreeBSD Foundation.

UNIX is a registered trademark of The Open Group in the US and other countries.

Sun, Sun Microsystems, SunOS, Solaris, and Java are trademarks or registered trademarks of Sun Microsystems, Inc. in the United States and other countries.

Apple and QuickTime are trademarks of Apple Computer, Inc., registered in the U.S. and other countries.

Macromedia and Flash are trademarks or registered trademarks of Macromedia, Inc. in the United States and/or other countries.

Microsoft, Windows, and Windows Media are either registered trademarks or trademarks of Microsoft Corporation in the United States and/or other countries.

PartitionMagic is a registered trademark of PowerQuest Corporation in the United States and/or other countries.

Many of the designations used by manufacturers and sellers to distinguish their products are claimed as trademarks. Where those designations appear in this book, and the FreeBSD Project was aware of the trademark claim, the designations have been followed by the '"' symbol.

Redistribution and use in source (SGML DocBook) and 'compiled' forms (SGML, HTML, PDF, PostScript, RTF and so forth) with or without modification, are permitted provided that the following conditions are met:

  1. Redistributions of source code (SGML DocBook) must retain the above copyright notice, this list of conditions and the following disclaimer as the first lines of this file unmodified.

  2. Redistributions in compiled form (transformed to other DTDs, converted to PDF, PostScript, RTF and other formats) must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

Importante: THIS DOCUMENTATION IS PROVIDED BY THE FREEBSD DOCUMENTATION PROJECT "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FREEBSD DOCUMENTATION PROJECT BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


Índice
1. Fazendo um port si mesmo
2. Portando Rápido
2.1. Escrevendo o Makefile
2.2. Escrevendo o arquivos de descrição
2.2.1. pkg-descr
2.2.2. pkg-plist
2.3. Criando o arquivo de checksum
2.4. Testando o port
2.5. Verficando seu port com portlint
2.6. Enviando o port
3. Slow Porting
3.1. Como as coisas funcionam
3.2. Obtendo os fontes originais
3.3. Modificando o port
3.4. Patching
3.5. Configurando
3.6. Manuseando a entrada do usuário
4. Configurando o Makefile
4.1. O fonte original
4.2. Nomeando
4.2.1. PORTNAME e PORTVERSION
4.2.2. PORTREVISION e PORTEPOCH
4.2.3. PKGNAMEPREFIX e PKGNAMESUFFIX
4.2.4. Convenções do Nomeamento do Pacote
4.3. Categorização
4.3.1. CATEGORIAS
4.3.2. Lista atual das categorias
4.3.3. Escolhendo a categoria certa
4.4. Os arquivos de distribuição
4.4.1. DISTNAME
4.4.2. MASTER_SITES
4.4.3. EXTRACT_SUFX
4.4.4. DISTFILES
4.4.5. EXTRACT_ONLY
4.4.6. PATCHFILES
4.4.7. Arquivos de distribução multipla ou patches de diferentes sites e subdiretórios (MASTER_SITES:n)
4.4.8. DIST_SUBDIR
4.5. MANTEDOR
4.6. COMENTÁRIO
4.7. Dependências
4.7.1. LIB_DEPENDS
4.7.2. RUN_DEPENDS
4.7.3. BUILD_DEPENDS
4.7.4. FETCH_DEPENDS
4.7.5. DEPENDS
4.7.6. USE_*
4.7.7. Notas em dependências
4.7.8. Dependências opcionais
4.8. Especificando o diretório de funcionamento
4.8.1. WRKSRC
4.8.2. NO_WRKSUBDIR
4.9. CONFLITOS
4.10. Mecanismos de Construção
5. Considerações especiais
5.1. Bibliotecas Compartilhadas
5.2. Ports com restrições de distribuição
5.2.1. NO_PACKAGE
5.2.2. NO_CDROM
5.2.3. RESTRICTED
5.2.4. RESTRICTED_FILES
5.3. Usando o perl
5.4. Usando o X11
5.5. Usando o automake, autoconf, e libtool
5.6. Usando o GNOME
5.7. Usando o KDE
5.8. Usando Bison
5.9. Usando Java
5.10. Usando Python
5.11. Usando Emacs
5.12. Usando Ruby
6. MASTERDIR
7. Versões da biblioteca compartilhada
8. Manpages
9. Ports que necessitam Motif
9.1. USE_MOTIF
9.2. MOTIFLIB
10. Fontes do X11
11. Arquivos Info
12. Os arquivos pkg-*
12.1. pkg-message
12.2. pkg-install
12.3. pkg-deinstall
12.4. pkg-req
12.5. Mudando o pkg-plist baseado nas variáveis do make
12.6. Mudando os nomes dos arquivos pkg-*
13. Testando seu port
13.1. Portlint
13.2. PREFIX
13.3. Teste de sanidade do FreshPorts
14. Upgrading
15. Fazer e Não Fazer
15.1. Binários Stripping
15.2. INSTALL_* macros
15.3. WRKDIR
15.4. WRKDIRPREFIX
15.5. Diferenciando sistemas operacionais e versões de OS
15.6. Valores de __FreeBSD_version
15.7. Escrevendo algo após bsd.port.mk
15.8. Instale a documentação adicional
15.9. Subdiretórios
15.10. Cleaning up dos diretórios vazios
15.11. UIDs
15.12. Faça coisas racionalmente
15.13. Respeite ambos CC e CXX
15.14. Respeite as CFLAGS
15.15. Arquivos de Configuração
15.16. Feedback
15.17. README.html
15.18. Marcando um port como BROKEN, FORBIDDEN, ou de outra maneira
15.19. Miscellanea
15.20. If you are stuck...
16. Um exemplo de Makefile
17. Criação automatizada da lista do pacote
18. Mudanças a este documento e sistema ports
Lista de Tabelas
4-1. As variáveis USE_*
5-1. Variáveis para os ports que usam o perl
5-2. Variáveis para os ports que usam o X
5-3. Variáveis para os ports que usam o automake, autoconf ou libtool
5-4. Variáveis para os ports que usam o KDE
Lista de Exemplos
4-1. Uso simplificado do MASTER_SITES:n with 1 file per site
4-2. Uso simplificado do MASTER_SITES:n com mais de 1 arquivo por site
4-3. Uso detalhado do MASTER_SITES:n em MASTER_SITE_SUBDIR
4-4. Uso detalhado do MASTER_SITES:n com operador virgula, multiplos arquivos, multiplos sites e multiplos subdiretórios
4-5. Uso detalhado do MASTER_SITES:n com MASTER_SITE_SOURCEFORGE
4-6. Uso simplificado do MASTER_SITES:n com PATCH_SITES.

Capítulo 1. Fazendo um port si mesmo

Assim, agora você está interessado em fazer seu próprio port ou melhorando existente? Otimo!

O que segue são alguns guias para criar um novo port para o FreeBSD. Se você quiser melhorar um port existente, você deve ler isto e então ler Capítulo 14.

Quando este documento não for suficientemente detalhado, você deve consultar o /usr/ports/Mk/bsd.port.mk, qual todo port inclui Makefiles. Mesmo se você não hackeie Makefiles diariamente, ele é bem comentado, e você ainda ganhará muito conhecimento dele. Adicionalmente, você pode enviar perguntas específicas para o lista de discussão sobre FreeBSD ports e o sistema de ports FreeBSD.

Nota: Somente uma fração das variáveis (VAR) que pode ser sobrescritas são mencionados neste documento. A maioria (se não todas) estão documentadas no inicio do bsd.port.mk. Este arquivo usa um conjunto não-padrão de tabs. O Emacs e Vim deve reconhecer as definições carregando o arquivo. Ambos vi(1) e ex(1) podem ser definidos para usar o valor correto digitando :set tabstop=4 uma vez arquivos tenham sido carregados.


Capítulo 2. Portando Rápido

Esta seção lhe diz como fazer um rápido port. Em muitos casos, isto não é suficiente, mas nós veremos.

Primeiro, obter o tarball original e coloca-lo dentro DISTDIR, qual defaults to /usr/ports/distfiles.

Nota: O seguinte supõe que o software compilado out-of-the-box, ex., não havia absolutamente nenhuma mudança necessária para o port funcionar em seu FreeBSD box. Se você necessitar mudar algo, você terá consultar a próxima seção também.


2.1. Escrevendo o Makefile

O Makefile minimo pareceria algo como isto:

# New ports collection makefile for:   oneko
# Date created:        5 December 1994
# Whom:                asami
#
# $FreeBSD$
#

PORTNAME=      oneko
PORTVERSION=   1.1b
CATEGORIES=    games
MASTER_SITES=  ftp://ftp.cs.columbia.edu/archives/X11R5/contrib/

MAINTAINER=    asami@FreeBSD.org
COMMENT=       A cat chasing a mouse all over the screen

MAN1=          oneko.1
MANCOMPRESSED= yes
USE_IMAKE=     yes

.include <bsd.port.mk>

Veja se você pode comprende-lo. Não se preocupe sobre os índices da linha $FreeBSD$ , será preenchido automaticamente pelo CVS quando o port está importado a nossa arvore do ports principal. Você pode encontrar um exemplo mais detalhado na seção exemplo do Makefile.


2.2. Escrevendo o arquivos de descrição

Existem dois arquivos de descrição que são necessários para qualquer port, se eles são realmente pacotes ou não. Eles são pkg-descr e pkg-plist. Seus prefixos pkg- distingue-os de outros arquivos.


2.2.1. pkg-descr

Esta é uma descrição mais longa do port. Um a alguns parágrafos concietizamente explicando o que o port faz é suficiente.

Nota: Este não é um manual ou uma descrição aprofundada em como usar ou compilar o port! Por favor tenha cautela se você está compiando do README ou manpage; tão frequentemente eles não são uma descrição concisa do port ou está em um formato de difícil manipulação (ex., manpages tem espaçamento justificado). Se o software portado tem uma homepage WWW oficial, você deve lista-la aqui. Prefix one do websites com WWW: assim ferramentas automatizadas funcionarão corretamente.

Isto é recomendado que você assine seu nome no final deste arquivo, como em:

This is a port of oneko, in which a cat chases a poor mouse all over
the screen.
 :
(etc.)

WWW: http://www.oneko.org/

- Satoshi
asami@cs.berkeley.edu

2.2.2. pkg-plist

Este arquivo lista todos os arquivos instalados pelo port. Ele é tambem chamado de ``lista de empacotamento'' porque o pacote é gerado pelo empacotamento dos arquivos listados aqui. Os pathnames são relativos ao prefixo de instalação (normalmente /usr/local ou /usr/X11R6). Se você está usando o MANn variáveis (como você deve estar), não liste nenhum manpages aqui.

Aqui está um pequeno exemplo:

bin/oneko
lib/X11/app-defaults/Oneko
lib/X11/oneko/cat1.xpm
lib/X11/oneko/cat2.xpm
lib/X11/oneko/mouse.xpm
@dirrm lib/X11/oneko

Consulte a página do manual pkg_create(1) para detalhes na lista de empacotamento.

Nota: Você deve listar todos arquivos, mas não o nomes de diretórios, na lista. Também, se o port cria diretórios para si mesmo durante a instalação, certifique-se de adicionar linhas @dirrm tão necessária para remove-los quando o port é apagado.

É recomendavél que você mantenha todos nomes de arquivos neste arquivo sortidos alfabeticamente. Isto fará a verificação das mudanças quando você upgrade o port muito mais fácil.

Criação de uma lista de empacotamento manualmente pode ser uma tarefa muito intediante. Se o port instala um grande numero de arquivos, criando lista de empacotamento automaticamente pode economizar tempo.


2.3. Criando o arquivo de checksum

So digite make makesum. As regras do make do ports gerará automaticamente o arquivo distinfo.


2.4. Testando o port

Você deve certificar-se que a regras do port faz exatamente o que você quer que ele faça, incluindo empacotamento do port. Estes são os pontos importantes que você precisa verificar.

  • pkg-plist não contém nada instalado pelo seu port

  • pkg-plist contém tudo o que está instalado pelo seu port

  • Seu port pode ser instalado multiplas vezes usando o reinstall target

  • Seu port cleans up depois ele mesmo desinstala

Ordem de teste recomendada

  1. make install

  2. make package

  3. make deinstall

  4. pkg_add package-name

  5. make deinstall

  6. make reinstall

  7. make package

Certifique-se que não ha quetões avisos em nenhum dos estágios package e deinstall. Depois do passo 3, verifique para ver se todos os novos diretórios estão corretamente apagados. Também, tente usando o software depois do passo 4, para assegurar que está funciona corretamente quando instalado de um pacote.


2.5. Verficando seu port com portlint

Por favor use portlint para ver se seu port ajusta-se ao nossas orientações. O programa portlint é parte da coleção do ports. Em particular, você pode querer verificar se o Makefile está na forma correta e o pacotee está nomeado apropriadamente.


2.6. Enviando o port

Primeiro, certifique-se de ter lido a seção FAZERes e NÃO-FAZERes.

Agora que você está feliz com seu port, a unica coisa restante é coloca-lo na arvore do ports principal do FreeBSD e fazer todos felizes sobre ele também. Nós não necessitamos seu diretório work ou o pacote pkgname.tgz, assim apague-os agora. Próximo, simplesmente inclua a saida do shar `find port_dir` em um relatório do bug e envie-o com o programa send-pr(1) (veja Relatório do Bug e Comentário Geral para mais informações sobre send-pr(1)). Se o port descomprimido é maior que 20KB, você deve comprimi-lo dentro de um arquivo tar e usar o uuencode(1) antes de inclui-lo no relatório do bug (uuencoded tarfiles são aceitáveis mesmo se o relatório do relatório do bug é menor que 20KB mas não são preferidos). Esteja certo ao classificar o relatório do bug como categoria ports e classe change-request (Não marque o relatório como confidential!). Também adicione um curta descrição do programa que você portou ao campo ``Description'' do PR e o arquivo tar do shar ou uuencoded ao campo ``Fix''. A ultima ajuda muito os committers, quem usa scripts para o ports-funcionar.

Uma vez mais, não inclua a fonte original distfile, o diretório work, ou o pacote que você construiu com make package.

Nota: No passado, nos perguntavamos a você para upload novo port submissions em nosso site ftp (ftp.FreeBSD.org). Este não é longer recomendado assim o acesso a leitura é desativado no diretório incoming/ daquele site devido ao grande quantidade de software pirata aparecendo lá.

Depois que você have enviou seu port, por favor seja paciente. As vezes ele pode levar a alguns meses antes que um port seja incluido no FreeBSD, embora possa somente levar alguns dias. Você pode ver a lista de ports esperando para ser committed ao FreeBSD.

Uma vez que nós olharemos seu port, retornaremos para você se necessário, e coloca-lo na arvore. Seu nome também aparecerá na lista de Contribuidores Adicionais do FreeBSD e outros arquivos. Não é ótimo?!? :-)

Nota: Você pode facilitar nosso trabalho, se você usa uma boa descrição na sinopse do relatório do problema. Nós preferimos algo como ``New port: <categoria>/<port> <curta descrição do port>'' para novos ports e ``Update port: <categoria>/<port> <curta descrição da atualização>'' para atualização do port. Se você stick a este esquema, a chance que alguem olhe seu PR cedo é muito maior.


Capítulo 3. Slow Porting

Ok, assim não era aquilo simples, e o port necessita algumas modificações para funcionar. Nesta seção, nós explicaremos, passo a passo, como modifica-lo para funcionar com os paradigmas do ports.


3.1. Como as coisas funcionam

Primeiro, esta é sequencia de eventos que ocorrem quando o usuário primeiro digita make em seu diretório do port. Você pode encontrar que contem bsd.port.mk em uma outra janela enquanto você le isto realmente ajuda compreende-lo.

Mas não se preocupe se você não entendeu realmente o que bsd.port.mk está fazendo, muitas pessoas não entendem... :->

  1. O fetch target é executado. The fetch target é responsavel por certificar-se que o tarball existe localmente em DISTDIR. Se fetch não pode encontrar os arquivos necessários em DISTDIR ele procurará a URL MASTER_SITES, qual está definida no Makefile, tão bem quanto em nosso site principal de ftp em ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/, onde nós colocamos sansionados distfiles como backup. Então tentará buscar o arquivo distribuição chamado com FETCH, assumindo que o site pedido tenha acesso direto a Internet. Se sucedido, salvará o arquivo em DISTDIR para uso futuro e proseguir.

  2. The extract target é executado. Procurará em seu arquivo de distribuição do port (tipicamente um gzip'd tarball) em DISTDIR e desempacota-lo dentro de um especifico subdiretório temporário pelo WRKDIR (defaults to work).

  3. The patch target é executado. Primeiro, quaisquer patches definidos em PATCHFILES são aplicados. Segundo, se quaisquer arquivos patch chamados patch-* são encontrados em PATCHDIR (defaults ao subdiretório files), eles são aplicados neste tempo em ordem alfabética.

  4. The configure target é executado. Isto pode fazer qualquer de várias coisas diferentes.

    1. Se existe, scripts/configure é executado.

    2. Se HAS_CONFIGURE ou GNU_CONFIGURE é definido, WRKSRC/configure é executado.

    3. Se USE_IMAKE é definido, XMKMF (default: xmkmf -a) é executado.

  5. The build target é executado. Este é responsavel por ir descendo dentro do diretório de trabalho privado do port (WRKSRC) e construindo-o. Se USE_GMAKE é definido, GNU make será usado, caso contrário make do sistema será usado.

Acima são as ações. Adicionalmente, você pode definir targets pre-something ou post-something, ou colocar os scripts com aqueles nomes, no subdiretório scripts, e eles serão executados antes ou depois das ações padrões serem feitas.

Por exemplo, se você tem um post-extract target definido em seu Makefile, e um arquivo pre-build no subdiretório scripts, the post-extract target será chamado depois das ações de extração regular, e o script pre-build será executado antes das regras de construção padrão serem feitas. É recomendavel que você use Makefile targets se as ações são simples bastante, porque será mais fácil para alguem compreender que tipo de ação não-padrão o port necessita.

As ações padrões são feitas pelos bsd.port.mk targets do-something. Por exemplo, os comandos para extrair um port estão no target do-extract. Se você não está feliz com o target padrão, você pode conserta-lo redefinindo o do-something target em seu Makefile.

Nota: As ``principais'' targets (ex., extract, configure, etc.) não fazem nada mais que certificar todos os estágios acima daquele estão completos e chama os targets ou scripts reais, e eles não intended a ser mudados. Se você quer consertar a extração, conserte do-extract, mas nunca jamais toque extract!

Agora que você entendeu que está acontecendo quando o usuários digita make, deixe-nos ir através dos passos recomendados para criar o port perfeito.


3.2. Obtendo os fontes originais

Obter os fontes originais (normalmente) como um tarball comprimido (foo.tar.gz ou foo.tar.Z) e copie-o dentro DISTDIR. Sempre use mainstream fontes quando quando e onde você possa.

Se você não pode encontrar um site FTP/HTTP que está bem-conectado a rede, ou pode somente encontrar sites que tenham irritantemente formatos não-padrão, você pode querer colocar uma copia em um confiavel servidor FTP ou HTTP que você controle (ex., sua home page). Certifique-se de definir MASTER_SITES a refletir sua escolha.

Se você não pode encontrar algo conveniente e confiavel para colocar o distfile nós podemos ``house'' it nos mesmos no ftp.FreeBSD.org. O distfile tem que colocado dentro ~/public_distfiles/ da conta de alguem da freefall. Pergunte as pessoa quem commits seu port para fazer isto. Esta pessoa também definirá MASTER_SITES ao MASTER_SITE_LOCAL e MASTER_SITE_SUBDIR ao seu freefall username.

Se seu distfile do port muda todo tempo por isso não é boa razão, considere colocando o distfile em sua home page e listando-o como o primeiro MASTER_SITES. Isto empedirá usuários de obterem erros checksum mismatch, e também reduzir a carga de trabalho dos mantedores de nosso site ftp. Também, se há somente um site master para o port, é recomendado que você aloje um backup em seu site e liste-o como segundo MASTER_SITES.

Se seu port necessita alguns `patches' adicionais que estão disponíveis na Internet, busque-os também e coloque-os em DISTDIR. Não se preocupe se eles virem de um outro site de que onde você obteve o tarball do fonte principal, nós temos um meio para manusear estas situações (veja a descrição do PATCHFILES abaixo).


3.3. Modificando o port

Desempacote uma copia do tarball em um diretório privado e faça quaisquer mudaças que são necessárias para fazer o port compilar corretamente sob the versão atual do FreeBSD. Keep careful track de tudo que você fez, assim você estará automatizando o processo logo. Tudo, incluindo o exclusão, adição, ou modificação dos arquivos deve ser feita usando um arquivo script ou patch automatizado quando seu port é finalizado.

Se seu port necessita significantes interação/customização para compilar ou instalar, você deve procurar um dos scripts clássicos do Larry Wall Configure scripts e talvez faz algo similar si mesmo. A meta das novas coleção de ports é fazer cada port como ``plug-and-play'' assim possivel para o usuário-final enquanto usando o minimo de espaço de disco.

Nota: Ao menos que explicitamente indicado, arquivos patch, scripts, e outros arquivos você criou e contribuiu a coleção de ports do FreeBSD estão assumidos a ser cobertos pelas condições padrões do BSD copyright.


3.4. Patching

Na preparação do port, arquivos que foram adicionados ou mudados podem ser picked up com um recursivo diff(1) para depois feeding to patch(1). Cada conjunto de patches que você deseja aplicar deve ser coletado um arquivo chamado patch-* onde * denotas a sequencia em qual os patches serão aplicados -- estes são feitos em ordem alfabetica, assim aa primeiro, ab segundo e assim por diante. Se você deseja, você pode usar nomes que indicam os pathnames dos arquivos que são patched, como patch-Imakefile ou patch-src-config.h. Estes arquivos devem ser armazenados em PATCHDIR, de onde eles serão automaticamente aplicados. Todos patches devem ser relativos ao WRKSRC (normalmente o diretório que seu tarball do port se desempacota dentro, que estando onde a construção é feita). Para fazer consertos e melhorias facilmente, você deve evitar ter mais de um patch de conserto do mesmo arquivo (ex., patch-aa e patch-ab ambos mudando WRKSRC/foobar.c).

Não coloque RCS strings nos patches. O CVS mutilará-los quando nós colocamos os arquivos dentro da arvore do ports, e quando nós verificamos-as saídas novamente, eles sairão diferentes e o patch falhará. As strings RCS são cercadas por sinais de dollar ($), e tipicamente inicia com $Id ou $RCS.

Usando o recurso opção (-r) para diff(1) gerar patches é sutil, mas por favor de olhe os patches resultantes para certificar-se que você não tem nada desnecessário junk em lá. Em particular, diffs entre dois arquivos backup, Makefiles quando o port usa Imake ou GNU configure, etc., são desnecessários e devem ser apagados. Se você teve que editar configure.in e executar autoconf para gerar configure, não pegue os diffs faça configure (frequentemente cresce algumas milhares de linhas!); defina USE_AUTOCONF=yes e pegue os diffs do configure.in.

Também, se você teve que apagar um arquivo, então você pode faze-lo no post-extract target melhor que como parte do patch. Uma vez você está feliz com o diff resultante, por favor divida-o dentro de um arquivo fonte por arquivo patch.


3.5. Configurando

Inclua quaisquer comandos adicionais de customizações em seu script configure e salve-o no subdiretório scripts. Como mencionado acima, você pode também fazer isto com Makefile targets e/ou scripts com o nome pre-configure ou post-configure.


3.6. Manuseando a entrada do usuário

Se seu port necessita de entrada do usuário para construir, configurar, ou instalar, então defina IS_INTERACTIVE em seu Makefile. Isto permitirá ``overnight builds'' para pular seu port se as definições do usuário variável BATCH em seu ambiente (e se o usuário define a variável INTERACTIVE, então somente aqueles ports necessintando interação são construido).

É também recomendado que se há respostas padrões razoáveis para as perguntas, você deve verificar a variável PACKAGE_BUILDING e desativar o iscript interativo quando ele é definido. Isto permitirá-nos construir os pacotes aos CDROMs e FTP.


Capítulo 4. Configurando o Makefile

Configurar o Makefile e bastante simples, e novamente nós sugerimos que você olhe nos exemplos existentes antes de iniciar. Também, há exemplo do Makefile neste manual, assim de um olhada e por favor siga as orderns das variáveis e seções naquele template para fazer seu port facil para outros lerem.

Agora, considerando os seguintes problemas em sequencia como você design seu novo Makefile:


4.1. O fonte original

Ele mora em DISTDIR como em um padrão gzip'd tarball chamado algo como foozolix-1.2.tar.gz? Se sim, você pode ir ao ao próximo passo. Se não, você deve olhar em sobrescrevendo qualquer das variáveis DISTNAME, EXTRACT_CMD, EXTRACT_BEFORE_ARGS, EXTRACT_AFTER_ARGS, EXTRACT_SUFX, ou DISTFILES, dependendo em como alien um formato a seu arquivo distribuição é. (O mais caso comum é EXTRACT_SUFX=.tar.Z, quando o tarball está condensado regularmente compress, não gzip.)

No pior caso, você pode simplesmente criar seu próprio do-extract target para sobrescrever o padrão, embora este deve ser raramente, se for, necessário.


4.2. Nomeando

A primeira parte do Makefile do port nomeia o port, descreve seu número da versão, e lista-os na categoria correta.


4.2.1. PORTNAME e PORTVERSION

Você deve definir o PORTNAME ao nome da base de seu port, e PORTVERSION ao número da versão do port.


4.2.2. PORTREVISION e PORTEPOCH

4.2.2.1. PORTREVISION

A variável PORTREVISION é uma monotonically aumentando o valor qual é redefinido a 0 com cada aumento da PORTVERSION (ex. cada vez que um oficial vendor release é feita), e adicionando ao nome do pacote se não-zero. PORTREVISION é aumentado cada vez que uma mudança é feita ao port do FreeBSD qual significantemente afeta o conteúdo ou estutura dos pacotes derivados.

Exemplos de quando PORTREVISION deve ser bumped:

  • Adição de patches para corrigir as vulnerabilidades de segurança, bugs, ou para adicionar novas funcionalidades ao port do FreeBSD.

  • Mudanças ao Makefile do port para abilitar ou desabilitar opções no tempo de compilação no pacote.

  • Mudanças na lista de empacotamento ou no tempo-da-instalação comportamento do pacote (ex. mudança ao script qual gera initial data para o pacote, como chaves ssh do host).

  • Version bump de umas dependencias da biblioteca compartilhada do port (neste caso, alguem tentando instalar o pacote antigo depois da instalado uma nova versão da dependencia falhará desde que ele procurar o antigo libfoo.x ao invés de libfoo.(x+1)).

  • Mudanças silenciosas ao distfile do port qual tem significantes diferenças funcionais, ex. mudanças ao distfile necessitando de uma correção ao distinfo com mudança não correspondente ao PORTVERSION, onde um diff -ru do antigo e novas versões mostra mudanças não-triviais ao código.

Exemplos de mudanças qual não necessitam uma PORTREVISION bump:

  • Mudanças de estilo ao esqueleto do port com mudanças não funcionais para que apareçam no pacote resultante.

  • Mudanças ao MASTER_SITES ou outras mudanças funcionais ao port qual não afeta o pacote resultante.

  • Patches triviais ao distfile como correção de typos, qual não são suficiente importante que usuários do pacote devem ir a problemas de upgrading.

  • Consertos de construção qual causa uma pacote torna-se compilável onde ele estava anteriormente falhando (as long as as mudanças não introduziram quaisquer mudanças funcionais em quaisquer outras platformas em qual o port foi construido anteriormente). Desde PORTREVISION reflita o conteúdo do pacote, se nenhum pacote foi anteriormente contrutivel então não há necessidade para aumentar PORTREVISION para marcar uma mudança.

Uma regra do thumb é perguntar a si mesmo se uma mudança committed a um port é algo qual alguem, algum local, beneficiará de ter (either because of an enhancement, conserto, ou by virtue que o novo pacote fincionará atualmente para eles). Se sim , o PORTREVISION deve ser bumped assim que ferramentas automatizadas (ex. pkg_version(1)) irá highlight o fato que um novo pacote está disponível.


4.2.2.2. PORTEPOCH

De tempos em tempos um software vendor ou porter do FreeBSD fará algo silly e release uma versão de seus software qual está atualmente numericamente abaixo da versão anterior. Um exemplo disto é um port qual foi de foo-20000801 para foo-1.0 (o former será tratado incorretamente como uma versão mais nova desde 20000801 é um valor numericamente superior que 1).

Em situações como esta, a versão PORTEPOCH deve ser aumentada. Se PORTEPOCH é não-zero ele é adicionou ao nome do pacote como descrito na seção 0 acima. PORTEPOCH nunca é diminuido ou redefinido a zero, porque aquilo causaria comparação a um pacote de um anterior epoch a falhar (ex. o pacote não seria detectado como fora de data): o novo numero de versão (ex. 1.0,1 no exemplo acima) é ainda numericamente menor que a versão anterior (2000801), mas ferramentas automatizadas e encontradas para ser maior que o implica sufixo ,0 no pacote anterior.

É esperado que PORTEPOCH não será usado pela maioria dos ports, e que sensivel uso do PORTVERSION pode frequentemente pre-empt ele tornando-se necessário se uma futura release do software deve mudar a estrutura da versão. Entretanto, cuidado é necessário pelos porters do FreeBSD quando um vendor release é feito sem um número de versão oficial -- como um código ``snapshot'' release. A tentação é rotular a release com a data da release, qual causará problemas assim no exemplo acima quando uma nova release ``oficial'' é feita.

Por exemplo, se um snapshot release é feita na data 20000917, e a versão anterior do software foi a versão 1.2, a snapshot release deve ser dada a PORTVERSION de 1.2.20000917 ou similar, não 20000917, assim que a posterior release, diz 1.3, é ainda um valor numericamente superior.


4.2.2.3. Exemplo de uso do PORTREVISION e PORTEPOCH

O port gtkmumble, versão 0.10, é committed a coleção de ports:

PORTNAME=      gtkmumble
PORTVERSION=    0.10

PKGNAME torna-se gtkmumble-0.10.

Um buraco na segurança é descoberto qual necessita um patch local do FreeBSD. PORTREVISION é bumped de modo devido.

PORTNAME=      gtkmumble
PORTVERSION=    0.10
PORTREVISION=   1

PKGNAME torna-se gtkmumble-0.10_1

Uma nova versão é released pelo vendor, numerada 0.2 (it turns out the author actually intended 0.10 para atualmente mean 0.1.0, não ``que vem depois 0.9'' - oops, tão tarde agora). Desde o novo minor version 2 é numericamente abaixo que a versão anterior 10 o PORTEPOCH tem que ser bumped para forçar manualmente o novo pacote ser apagado como ``newer''. Desde que ele é um novo vendor release do código, PORTREVISION é redefinido a 0 (ou removido do Makefile).

PORTNAME=      gtkmumble
PORTVERSION=    0.2
PORTEPOCH=      1

PKGNAME torna-se gtkmumble-0.2,1

A próxima release é 0.3. Desde PORTEPOCH nunca diminuiu, as variáveis versão são agora:

PORTNAME=      gtkmumble
PORTVERSION=    0.3
PORTEPOCH=      1

PKGNAME torna-se gtkmumble-0.3,1

Nota: Se PORTEPOCH foi redefinido a 0 com esta melhoria, alguem que tinha instalado o pacote gtkmumble-0.10_1 não detectaria o pacote gtkmumble-0.3 como mais novo, desde 3 é ainda numericmente menor que 10.


4.2.3. PKGNAMEPREFIX e PKGNAMESUFFIX

Duas variáveis opcionais, PKGNAMEPREFIX e PKGNAMESUFFIX, são combinadas com PORTNAME e PORTVERSION ao form PKGNAME assim ${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}. Certifique-se que este conforme ao nossa orientação para um bom nome de pacote. Em particular, voce não está permitido a usar um hífen (-) em PORTVERSION. Também, se o nome do pacote tem a language- ou o -compiled.specifics part, use PKGNAMEPREFIX e PKGNAMESUFFIX, respectivamentes. Não faça-os parte do PORTNAME.


4.2.4. Convenções do Nomeamento do Pacote

Os seguintes são as convenções que voce deve seguir nomeando seus pacotes. Isto é ter nosso diretório de pacote fácil de scan, como há já muitos e muitos de pacotes e usuários are going to turn away se eles ferirem seus olhos!

O nome do pacote deve parecer como [language[_region]]-name[[-]compiled.specifics]-version.numbers.

O nome do pacote é definido como ${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}. Certifique-se de definir as variáveis to conform a aquele fornato.

  1. FreeBSD strives suportar a lingua nativa de seus usuários. A parte language- deve ser a abreviação de duas letras da lingua natural definida pelo ISO-639 se o port é especifico a uma certa lingua. Exemplos são ja para Japones, ru para Russo, vi para Vietnames, zh para Chines, ko para Koreano e de para Alemão.

    Se o port é especifica a certa região within the language area, adicione as duas letras do código do país bem assim. Examples are en_US for US English and fr_CH para Swiss French.

    A parte language- deve ser definida na variável PKGNAMEPREFIX.

  2. A primeira letra da parte do nome deve ser lowercase. (O resto do nome pode conter letras capitais, assim use sua própria descrição quando voce está convertendo um nome de software que tem algumas letras capitais nela.) Há uma tradição de nameamento de módulos perl 5 por prepending p5- e convertendo o separador dois-pontos a um hífen; por exemplo, o módulo Data::Dumper torna-se p5-Data-Dumper. Se o software em questão tem números, hífens, ou underscores em seu nome, voce pode inclui-los bem assim (como kinput2).

  3. Se o port pode ser construido com diferentes hardcoded defaults (normalmente parte do nome do diretório na familia do ports), a parte -compiled.specifics deve state the compiled-in defaults (o hífen é opcional). Exemplos são tamanho de papel e unidades de fontes.

    A parte -compiled.specifics deve ser definido na variável PKGNAMESUFFIX.

  4. A string da versão deve seguir um dash (-) e ser um separada-po-periodo lista de inteiros e single lowercase alphabetics. Em particular, não é permissivel ter um outro dash dentro da string da versão. A única execeção é a string pl (meaning ``patchlevel''), qual pode ser usada somente quando não há numeros de versão maior e menor no software. Se a versão do software tem strings como ``alpha'', ``beta'', ``rc'', ou ``pre'', pegue a primeira letra e coloque-a imediatamente depois de um periodo. Se a string da versão continua depois daqueles nomes, os numeros devem seguir o alfabeto somente sem um periodo extra entre eles.

    A idéia é faze-lo mais fácil para sortir os ports considerando a string da versão. Em particular, certifique-se que o numero da versão dos componentes estão sempre delimitados por um periodo, e se a data é parte da string, use o formato yyyy.mm.dd , não dd.mm.yyyy ou a não-Y2K compliant yy.mm.dd format.

Aqui está alguns exemplos (reais) em como converter o nome assim chamado pelos autores do software a um nome de pacote suitable:

Distribution Name PKGNAMEPREFIX PORTNAME PKGNAMESUFFIX PORTVERSION Reason
mule-2.2.2 (empty) mule (empty) 2.2.2 No changes required
XFree86-3.3.6 (empty) XFree86 (empty) 3.3.6 No changes required
EmiClock-1.0.2 (empty) emiclock (empty) 1.0.2 No uppercase names for single programs
rdist-1.3alpha (empty) rdist (empty) 1.3.a No strings like alpha allowed
es-0.9-beta1 (empty) es (empty) 0.9.b1 No strings like beta allowed
mailman-2.0rc3 (empty) mailman (empty) 2.0.r3 No strings like rc allowed
v3.3beta021.src (empty) tiff (empty) 3.3 What the heck was that anyway?
tvtwm (empty) tvtwm (empty) pl11 Version string always required
piewm (empty) piewm (empty) 1.0 Version string always required
xvgr-2.10pl1 (empty) xvgr (empty) 2.10.1 pl allowed only when no major/minor version numbers
gawk-2.15.6 ja- gawk (empty) 2.15.6 Japanese language version
psutils-1.13 (empty) psutils -letter 1.13 Papersize hardcoded at package build time
pkfonts (empty) pkfonts 300 1.0 Package for 300dpi fonts

Se há absolutamnete nenhum traço da informação da versão no fonte original e ele é unlikely original que o autor sempre liberará uma outra versão, só defina a string da versão a 1.0 (como o piewm exemplo acima). Caso contrário, pergunte o autor do original ou use a string da data (yyyy.mm.dd) as the version.


4.3. Categorização

4.3.1. CATEGORIAS

Quando um pacote é criado, ele é colocado baixo de /usr/ports/packages/All e links são feitos de um ou mais subdiretórios do /usr/ports/packages. Os nomes destes subdiretórios são especificados pela variável CATEGORIES. It is intended to fazer a vida mais fácil para os usuários quando ele está andando na pilha de pacotes no site FTP ou CDROM. Por favor take a look at the existing categories and pick the ones that are suitable para seu port.

Esta lista também determina onde na arvore do ports o port está importado. Se você colocar mais que uma categoria aqui, it é assumed that os arquivos do port serão colocados no subdiretório com o nome na primeira categoria. Veja a seção categories para mais discussões sobre como escolher as categorias certas.

Se seu port realmente pertence a algo que é diferente de todos os existentes, você pode até criar uma novo nome da categoria. Nesse caso, por favor envie um mail para os lista de discussão sobre FreeBSD ports e o sistema de ports FreeBSD para propor uma nova categoria.


4.3.2. Lista atual das categorias

Primeiro, esta é a lista atual de categorias dos ports. Aquelas marcadas com um asterisco (*) são categorias-- virtuais aquelas que não teem um subdiretório correspondente na arvore do ports.

Nota: Para categorias não-virtuais, você encontrará uma descrição de uma-linha no arquivo pkg/COMMENT naquele subdiret'rrio (ex., archivers/pkg/COMMENT).

Category Description
accessibility* Ports to help disabled users.
afterstep* Ports to support the AfterStep window manager.
arabic Arabic language support.
archivers Archiving tools.
astro Astronomical ports.
audio Sound support.
benchmarks Benchmarking utilities.
biology Biology-related software.
cad Computer aided design tools.
chinese Chinese language support.
comms Communication software. Mostly software to talk to your serial port.
converters Character code converters.
databases Databases.
deskutils Things that used to be on the desktop before computers were invented.
devel Development utilities. Do not put libraries here just because they are libraries--unless they truly do not belong anywhere else, they should not be in this category.
dns DNS-related software.
editors General editors. Specialized editors go in the section for those tools (e.g., a mathematical-formula editor will go in math).
elisp* Emacs-lisp ports.
emulators Emulators for other operating systems. Terminal emulators do not belong here--X-based ones should go to x11 and text-based ones to either comms or misc, depending on the exact functionality.
finance Monetary, financial and related applications.
french French language support.
ftp FTP client and server utilities. If your port speaks both FTP and HTTP, put it in ftp with a secondary category of www.
games Games.
german German language support.
gnome* Ports from the GNU Object Model Environment (GNOME) Project.
graphics Graphics utilities.
haskell* Software related to the Haskell language.
hebrew Hebrew language support.
hungarian Hungarian language support.
ipv6* IPv6 related software.
irc Internet Relay Chat utilities.
japanese Japanese language support.
java Software related to the Java language.
kde* Ports from the K Desktop Environment (KDE) Project.
korean Korean language support.
lang Programming languages.
linux* Linux applications and support utilities.
lisp* Software related to the Lisp language.
mail Mail software.
math Numerical computation software and other utilities for mathematics.
mbone MBone applications.
misc Miscellaneous utilities--basically things that do not belong anywhere else. This is the only category that should not appear with any other non-virtual category. If you have misc with something else in your CATEGORIES line, that means you can safely delete misc and just put the port in that other subdirectory!
multimedia Multimedia software.
net Miscellaneous networking software.
news USENET news software.
offix* Ports from the OffiX suite.
palm Software support for the Palm(tm) series.
parallel* Applications dealing with parallelism in computing.
pear* Ports related to the Pear PHP framework.
perl5* Ports that require perl version 5 to run.
picobsd Ports to support PicoBSD.
plan9* Various programs from Plan9.
polish Polish language support.
portuguese Portuguese language support.
print Printing software. Desktop publishing tools (previewers, etc.) belong here too.
python* Software related to the Python language.
ruby* Software related to the Ruby language.
russian Russian language support.
science Scientific ports that do not fit into other categories such as astro, biology and math.
security Security utilities.
shells Command line shells.
sysutils System utilities.
tcl76* Ports that use Tcl version 7.6 to run.
tcl80* Ports that use Tcl version 8.0 to run.
tcl81* Ports that use Tcl version 8.1 to run.
tcl82* Ports that use Tcl version 8.2 to run.
tcl83* Ports that use Tcl version 8.3 to run.
textproc Text processing utilities. It does not include desktop publishing tools, which go to print.
tk42* Ports that use Tk version 4.2 to run.
tk80* Ports that use Tk version 8.0 to run.
tk81* Ports that use Tk version 8.1 to run.
tk82* Ports that use Tk version 8.2 to run.
tk83* Ports that use Tk version 8.3 to run.
tkstep80* Ports that use TkSTEP version 8.0 to run.
ukrainian Ukrainian language support.
vietnamese Vietnamese language support.
windowmaker* Ports to support the WindowMaker window manager.
www Software related to the World Wide Web. HTML language support belongs here too.
x11 The X Window System and friends. This category is only for software that directly supports the window system. Do not put regular X applications here. If your port is an X application, define USE_XLIB (implied by USE_IMAKE) and put it in the appropriate categories. Also, many of them go into other x11-* categories (see below).
x11-clocks X11 clocks.
x11-fm X11 file managers.
x11-fonts X11 fonts and font utilities.
x11-servers X11 servers.
x11-toolkits X11 toolkits.
x11-wm X11 window managers.
zope* Zope support.

4.3.3. Escolhendo a categoria certa

Como muitas das categorias coincidem, você frequentemente tem que escolher qual das categorias deve ser a categoria primária de seu port. Há várias regras que governam esta questão. Aqui está a lista de prioridades, em diminuindo a ordem de precedencia:

  • Categorias específica de lingua sempre vem primeiro. Por exemplo, se seu port instala fontes X11 Japonesas, então sua linha de CATEGORIES leria japanese x11-fonts.

  • Categorias específicas conquistam as menos-específicas. Para instancia, um editor HTML deve ser listado como www editors, não the other way around. Também, você não precisa listar net quando o port pertence a quaisquer do irc, mail, mbone, news, security, ou www.

  • x11 é usado como uma categoria secundária somente quando a categoria primária é uma lingua natural. Em particular, você não deve colocar x11 na linha de categoria para aplicações do X.

  • Emacs modes devem ser colocados na mesma categoria do ports como a aplicação suportada pelo o mode, não em editors. Por exemplo, um Emacs mode para editar arquivos fontes de algumas linguagens de programação deve entrar em lang.

  • Se seu port realmente não pertence a nenhum local mais, coloque-o em misc.

Se você não está certo sobre que categoria, por favor coloque um comentário para que effect em seu send-pr(1) submission so nós podemos discutí-lo antes que nós o importemos. Se você é um committer, envie uma nota para o lista de discussão sobre FreeBSD ports e o sistema de ports FreeBSD assim nós podemos discutí-lo primeiro--muito frequentemente novos ports são importados a categoria errada somente para ser movidos para certa.


4.4. Os arquivos de distribuição

A segunda parte do Makefile descreve os arquivos que tem que ser obtidos em ordem para construir o port, e de onde eles podem ser obtidos.


4.4.1. DISTNAME

DISTNAME é o nome do port assim chamado pelos autores do software. DISTNAME defaults to ${PORTNAME}-${PORTVERSION}, so override it se necessário. DISTNAME é somente usado em dois lugares. Primeiro, a lista do arquivo de distribuição (DISTFILES) defaults to ${DISTNAME}${EXTRACT_SUFX}. Segundo, o arquivo de distribuição é experado para extrair dentro de um subdiretório chamado WRKSRC, qual defaults a work/${DISTNAME}.

Nota: PKGNAMEPREFIX e PKGNAMESUFFIX não afeta DISTNAME. Também note que quando WRKSRC é igual ao work/${PORTNAME}-${PORTVERSION} while o arquivo fonte original é chamado algo outro que ${PORTNAME}-${PORTVERSION}${EXTRACT_SUFX}, você deve provavelmente deixar DISTNAME alone-- você está melhor definindo DISTFILES que tendo que definir ambos DISTNAME e WRKSRC (and possibly EXTRACT_SUFX).


4.4.2. MASTER_SITES

Record a parte do diretório do FTP/HTTP-URL apontando no original tarball em MASTER_SITES. Não esqueça the trailing slash (/)!

Os macros do make tentarão usar esta especificação para grabbing o arquivo de distribuição com FETCH se eles não podem encontra-lo já no sistema.

It is recommended que você coloque multiplos sites nesta lista, preferencialmente de continentes diferentes. Isto protegerá contra problemas de rede de area-distantes, e nós estamos até planejando adicionar suporte para determinar automaticamente o mais próximo master site e fetching de lá!

Se o original tarball é parte de um dos arquivos populares como X-contrib, GNU, ou Perl CPAN, voce pode ser capaz referenciar a aqueles sites em uma forma fácil e compacta usando MASTER_SITE_* (ex., MASTER_SITE_XCONTRIB e MASTER_SITE_PERL_GNU). Simplesmente defina MASTER_SITES a uma dessas variáveis e MASTER_SITE_SUBDIR ao path com o arquivo. Aqui está um exemplo:

MASTER_SITES=         ${MASTER_SITE_XCONTRIB}
MASTER_SITE_SUBDIR=   applications

Estas variáveis são definidas em /usr/ports/Mk/bsd.sites.mk. Há novos arquivos adicionados todo o tempo, assim certifique-se de verificar a ultima versão deste arquivo antes do envio de um port.

O usuário pode também definir as variáveis MASTER_SITE_* em /etc/make.conf para override nossas escolhas, e usar seus mirrors favoritos destes arquivos populares ao invés.


4.4.3. EXTRACT_SUFX

Se você tem um arquivo de ditribuição, e ele usa um antigo sufixo para indicar o mecanismo de compressão, defina EXTRACT_SUFX.

Por exemplo, se o arquivo de distribuição foi chamado foo.tgz ao invés do mais normal foo.tar.gz, você escreveria:

DISTNAME=      foo
EXTRACT_SUFX=  .tgz

As variáveis USE_BZIP2 e USE_ZIP automaticamente defina EXTRACT_SUFX a .bz2 ou .zip como necessário. Se neither destes são definidos então EXTRACT_SUFX defaults to .tar.gz.

Você nunca precisou definir ambos EXTRACT_SUFX e DISTFILES.


4.4.4. DISTFILES

Algumas vezes os nomes dos arquivos para ser obtidos tem que não parecer com o nome do port. Por exemplo, ele pode ser chamado source.tar.gz ou similar. Em outros casos os códigos fontes da aplicação pode be em vários arquivos diferentes, todo do qual tem que ser obtido.

Se este é o caso, defina DISTFILES para ser uma lista separada de espaço de todos os arquivos que tem que ser obtidos.

DISTFILES=     source1.tar.gz source2.tar.gz

Se não explicitamente definido, DISTFILES defaults to ${DISTNAME}${EXTRACT_SUFX}.


4.4.5. EXTRACT_ONLY

Se somente alguns dos DISTFILES tem que ser extraidos--por exemplo, um deles é o código fonte, enquanto um outro é um documento uncompressed--lista os nomes de arquivos que tem que ser extraido em EXTRACT_ONLY.

DISTFILES=     source.tar.gz manual.html
EXTRACT_ONLY=  source.tar.gz

Se nenhum dos DISTFILES deve ser uncompressed então defina EXTRACT_ONLY a string vazia.

EXTRACT_ONLY=

4.4.6. PATCHFILES

Se seu port precisa algums patches adicionais que estão disponíveis por FTP ou HTTP, defina PATCHFILES aos nomes dos arquivos e PATCH_SITES a URL do diretório que os contém (o formato é o mesmo assim MASTER_SITES).

Se o patch não é relativo ao top da arvore do fonte (i.e., WRKSRC) porque ele contém algums pathnames extras, defina PATCH_DIST_STRIP accordingly. Para instância, se todos os pathnames no patch tem um extra foozolix-1.0/ em frente dos nomes dos arquivos, então defina PATCH_DIST_STRIP=-p1.

Não se preocupe se os patches estão compressed; eles serão decompressed automaticamnte os nomes dos arquivos finalizados com .gz ou .Z.

Se o patch é distribuído com alguns outros arquivos, como documentação, em um gzip'd tarball, você não pode somente usar PATCHFILES. Se aquele é o caso, adicione o nome e a localização do patch tarball ao DISTFILES e MASTER_SITES. Então, use a variável EXTRA_PATCHES para indicar aqueles arquivos e bsd.port.mk automaticamente aplicarão-lhes para você. Em particular, não copie arquivos patch dentro do diretório-- PATCHDIR aquele diretório pode não ser gravável.

Nota: O tarball terá que ser extraido alongside the regular source by then, assim não há necessidade para extrair explicitamente it se ele é um regular gzip'd ou compress'd tarball. Se você fazer o latter, tome cuidado extra para não overwrite alguma coisa que já existe naquele diretório. Também, não esqueça de adicionar um comando para remover o patch copiado no pre-clean target.


4.4.7. Arquivos de distribução multipla ou patches de diferentes sites e subdiretórios (MASTER_SITES:n)

Esta seção tinha informação sobre o mecanismo busca conhecido como ambos MASTER_SITES:n e MASTER_SITES_NN. Nós referenciaremos a este mecanismo assim MASTER_SITES:n hereon.

A little background first. OpenBSD tem uma engenhosa caracteristica dentro de ambas variáveis DISTFILES e PATCHFILES, ambos arquivos e patches podem ser postfixed com identificadores :n onde n ambos podem ser [0-9] e denotar um grupo designação. Por exemplo:

DISTFILES=      alpha:0 beta:1

No OpenBSD, o arquivo de distribuição alpha estará associado com a variável MASTER_SITES0 ao invés de nosso comum MASTER_SITES e beta com MASTER_SITES1.

Isto é uma característica muito interessante qual pode diminuir aquela interminável procura ao correto site para a obtenção.

Just picture 2 files in DISTFILES e 20 sites em MASTER_SITES, os sites slow as hell where beta está carried by all sites em MASTER_SITES, e alpha pode somente ser encontrado no 20th site. It would be such a waste to verificar todos all of them se maintainer knew this beforehand, would not it? Não é um bom começo para aquele fim-de-semana agradável!

Agora que você got the picture, só imagine mais DISTFILES e mais MASTER_SITES. Certamente nossos ``distfiles survey meister'' would appreciate the network strain relieve this would bring.

Nas próximas seções, informação seguirá na implementação FreeBSD desta idéia. Nós melhoramos um pouco o conceito do OpenBSD.


4.4.7.1. Informação Simplificada

Esta seção lhe diz como preparar rapidamente fine grained buscando de arquivos de distribução multipla e patches de diferentes sites e subdiretórios. Nós descrevemos aqui um caso simplificado MASTER_SITES:n usage. Isto será suficiente para most scenarios. Entretanto, se você precisar further informação, você terá que referir ao próxima seção.

Algumas aplicações consiste de multiplos arquivos de distribução que tem que ser obtidos deum numero de diferentes sites. Por exemplo, Ghostscript consiste do core do programa, e então um grande numero de arquivos driver que são usados dependendo da impressora do useuário. Alguns destes arquivos driver são fornecidos com o core, mas muitos outros tem que ser obtidos dee uma variedade de diferentes sites.

Para suportar isto, cada entrada em DISTFILES pode ser seguido por um colon e um ``tag name''. Cada site listado em MASTER_SITES é então seguido por um colon, e a tag que indica quais arquivos de distribução deve ser obtidos deste site.

Por exemplo, considere uma aplicação com o fonte dividido em duas partes, source1.tar.gz e source2.tar.gz, qual tem que ser obtidos de dois diferentes sites. O Makefile do port incluiria linhas como Exemplo 4-1.

Exemplo 4-1. Uso simplificado do MASTER_SITES:n with 1 file per site

MASTER_SITES=   ftp://ftp.example1.com/:source1 \
                ftp://ftp.example2.com/:source2
DISTFILES=      source1.tar.gz:source1 \
                source2.tar.gz:source2

Arquivos de distribuição multiplas podem ter a mesma tag. Continuando o exemplo anterior, suppose que havia um terceiro distfile, source3.tar.gz, que deve ser obtido de ftp.example2.com. O Makefile então seria escrito como Exemplo 4-2.

Exemplo 4-2. Uso simplificado do MASTER_SITES:n com mais de 1 arquivo por site

MASTER_SITES=   ftp://ftp.example1.com/:source1 \
                ftp://ftp.example2.com/:source2
DISTFILES=      source1.tar.gz:source1 \
                source2.tar.gz:source2 \
                source3.tar.gz:source2

4.4.7.2. Informação detalhada

Okay, assim o exemplo da seção anterior não refletia suas necessidades? Nesta seção nós explicaremos em detalhes como the fine grained fetching mechanism MASTER_SITES:n works and how you can modify your ports to use it.

  1. Elementos podem ser postfixed com :n onde n é [^:,]+, ex., n pode conceitualmente ser qualquer string alfanumerica mas nós o limitaremos a [a-zA-Z_][0-9a-zA-Z_]+ por agora.

    Alem do mais, comparamento de string é case sensitive; ex., n é diferente de N.

    No entanto, as palavras seguintes não podem ser usadas para postfixing purposes dedse que elas produzam um significado especial: default, all e ALL (elas são usadas internamente no item ii). Furthermore, DEFAULT is a special purpose word (verifique o item 3).

  2. Elementos postfixed com :n pertencem ao grupo n, :m pertencem ao grupo m e assim quarto.

  3. Elementos sem um postfix são groupless, ex., eles todos pertencem ao frupo especial DEFAULT. Se você postfix quaisquer elementos com DEFAULT, você está só sendo redundante unless você quer ter um elemento pertencendo a ambos DEFAULT e outros grupos ao mesmo tempo (verifique o item 5).

    Os exemplos seguintes são equivalentes mas o primeiro deles é preferido:

    MASTER_SITES=   alpha
    
    MASTER_SITES=   alpha:DEFAULT
    
  4. Grupos não são exclusivos, um elemento pode pertencer a vários diferentes grupos ao mesmo tempo e um grupo pode também ter também vários elementos diferentes ou nenhum em todos. Elementos repetidos com o mesmo grupo será simplesmente aquilo, elementos repetidos.

  5. Quando você quer um elemento pertença a vários grupos ao mesmo tempo, você pode usar uma operador virgula (,).

    Ao invés de repetir-lo várias vezes, cada vez com um diferente postfix, nós podemos listar vários grupos de uma vez no unico postfix. Para instancia, :m,n,o marca um elemento que pertence ao group m, n e o.

    Todos os exemplos seguintes são equivalentes mas o ultimo é preferido:

    MASTER_SITES=   alpha alpha:SOME_SITE
    
    MASTER_SITES=   alpha:DEFAULT alpha:SOME_SITE
    
    MASTER_SITES=   alpha:SOME_SITE,DEFAULT
    
    MASTER_SITES=   alpha:DEFAULT,SOME_SITE
    
  6. Todos sites com um given group são sortidos conforme o MASTER_SORT_AWK. Todos grupos com MASTER_SITES e PATCH_SITES são sortidos bem assim.

  7. Grupos semantics podem ser usados em quaisquer das seguintes variáveis MASTER_SITES, PATCH_SITES, MASTER_SITE_SUBDIR, PATCH_SITE_SUBDIR, DISTFILES, e PATCHFILES conforme a seguinte sintaxe:

    1. Todos elementos MASTER_SITES, PATCH_SITES, MASTER_SITE_SUBDIR e PATCH_SITE_SUBDIR tem que ser terminados com o caractere barra invertida /. Se quaisquer elementos pertecem a quaisquer grupos, o grupo postfix :n tem que vir a direta depois do terminator /. O mecanismo MASTER_SITES:n depende da existencia do terminator / para evitar confusing elementos onde uma :n é uma parte valida do elemento com ocurrences onde :n denota o grupo n. Para propositos de compatibilidade, desde o / terminator não foi necessário antes em ambos elementos MASTER_SITE_SUBDIR e PATCH_SITE_SUBDIR, se o postfix immediate precedindo caractere não é uma / então :n será considerada uma parte valida do elemento ao invés de um grupo postfix even se um elemento é postfixed com :n. Veja ambos Exemplo 4-3 and Exemplo 4-4.

      Exemplo 4-3. Uso detalhado do MASTER_SITES:n em MASTER_SITE_SUBDIR

      MASTER_SITE_SUBDIR=     old:n new/:NEW
      
      • Diretórios com grupo DEFAULT -> old:n

      • Diretórios com grupo NEW -> new

      Exemplo 4-4. Uso detalhado do MASTER_SITES:n com operador virgula, multiplos arquivos, multiplos sites e multiplos subdiretórios

      MASTER_SITES=   http://site1/%SUBDIR%/ http://site2/:DEFAULT \
                      http://site3/:group3 http://site4/:group4 \
                      http://site5/:group5 http://site6/:group6 \
                      http://site7/:DEFAULT,group6 \
                      http://site8/%SUBDIR%/:group6,group7 \
                      http://site9/:group8
      DISTFILES=      file1 file2:DEFAULT file3:group3 \
                      file4:group4,group5,group6 file5:grouping \
                      file6:group7
      MASTER_SITE_SUBDIR=     directory-trial:1 directory-n/:groupn \
                              directory-one/:group6,DEFAULT \
                              directory
      

      O exemplo anterior resulta no seguinte fine grained fetching. Sites são listados na ordem exata que eles serão usados.

      • file1 será buscado de

        • MASTER_SITE_OVERRIDE

        • http://site1/directory/

        • http://site1/directory-one/

        • http://site1/directory-trial:1/

        • http://site2/

        • http://site7/

        • MASTER_SITE_BACKUP

      • file2 será buscado exatamente assim file1 desde que eles ambos pertençam ao mesmo grupo

        • MASTER_SITE_OVERRIDE

        • http://site1/directory/

        • http://site1/directory-one/

        • http://site1/directory-trial:1/

        • http://site2/

        • http://site7/

        • MASTER_SITE_BACKUP

      • file3 será buscado de

        • MASTER_SITE_OVERRIDE

        • http://site3/

        • MASTER_SITE_BACKUP

      • file4 será buscado de

        • MASTER_SITE_OVERRIDE

        • http://site4/

        • http://site5/

        • http://site6/

        • http://site7/

        • http://site8/directory-one/

        • MASTER_SITE_BACKUP

      • file5 será buscado de

        • MASTER_SITE_OVERRIDE

        • MASTER_SITE_BACKUP

      • file6 será buscado de

        • MASTER_SITE_OVERRIDE

        • http://site8/directory-one/

        • MASTER_SITE_BACKUP

  8. Como eu faço um grupo das variáveis especiais de bsd.sites.mk, ex., MASTER_SITE_SOURCEFORGE?

    Veja Exemplo 4-5.

    Exemplo 4-5. Uso detalhado do MASTER_SITES:n com MASTER_SITE_SOURCEFORGE

    MASTER_SITES=   http://site1/ ${MASTER_SITE_SOURCEFORGE:S/$/:sourceforge,TEST/}
    DISTFILES=      something.tar.gz:sourceforge
    

    something.tar.gz será buscado de todos sites com MASTER_SITE_SOURCEFORGE.

  9. Como eu uso isto com variáveis PATCH*?

    Todos exemplos onde feitps com variáveis MASTER* mas eles funciarão exatamente o mesmo para as PATCH* assim pode ser vistas em Exemplo 4-6.

    Exemplo 4-6. Uso simplificado do MASTER_SITES:n com PATCH_SITES.

    PATCH_SITES=    http://site1/ http://site2/:test
    PATCHFILES=     patch1:test
    

4.4.7.3. What does change for ports? What does not?

  1. Todos pots atuais restam o mesmo. O MASTER_SITES:n feature code é somente ativado se há elementos postfixed com :n como elementos conforme as regras de sintaxe aforementioned, especialmente como aprasentadas no item 7.

  2. Os port targets restantes o mesmo: checksum, makesum, patch, configure, build, etc. Com obvias exceções de do-fetch, fetch-list, master-sites and patch-sites.

    • do-fetch: deploys the novo agrupamento postfixed DISTFILES e PATCHFILES com their matching group elements com ambos MASTER_SITES e PATCH_SITES qual usa matching group elements com ambos MASTER_SITE_SUBDIR and PATCH_SITE_SUBDIR. Verifique Exemplo 4-4.

    • fetch-list: funciona como o antigo fetch-list com a exceção que ele agrupa só como do-fetch.

    • master-sites e patch-sites: (incompatíveis com versões mais antigas) somente retorna os elementos do grupo DEFAULT; in fact, eles executam targets master-sites-default e patch-sites-default respectivamente.

      Além disso, usando a target either master-sites-all ou patch-sites-all é preferido verificando diretamente either MASTER_SITES ou PATCH_SITES. Também, verificando diretamente não é guarantidp que funcione em quaisquer versões futuras. Verifique o item iii.ii para mais informações nestes novos port targets.

  3. New port targets

    1. master-sites-n e patch-sites-n targets qual listará os elementos do respectivo grupo n within MASTER_SITES e PATCH_SITES respectivamente. Por exemplo, ambos master-sites-DEFAULT e patch-sites-DEFAULT retornará os elementos do grupo DEFAULT, master-sites-test e patch-sites-test do grupo test, e thereon.

    2. Há novos targets master-sites-all e patch-sites-all qual faz o trabalho do antigos master-sites e patch-sites. Eles retornam os elementos de todos os grupos assim se todos eles pertenciam ao mesmo grupo com o caveat that eles lista assim muitos MASTER_SITE_BACKUP e MASTER_SITE_OVERRIDE assim há grupos definidos com either DISTFILES ou PATCHFILES; respectivamente para master-sites-all e patch-sites-all.


4.4.8. DIST_SUBDIR

Não deixe seu port abarrotar /usr/ports/distfiles. Se seu port necessita de um muitos arquivos serem buscados, ou contem um arquivo que tem o nome que pode conflitar com outros ports (ex., Makefile), define DIST_SUBDIR ao nome do port (${PORTNAME} ou ${PKGNAMEPREFIX}${PORTNAME} deve funcionar bem). Isto mudará DISTDIR do default /usr/ports/distfiles a /usr/ports/distfiles/DIST_SUBDIR, e in effect colocará tudo que é necessário para seu port dentro daquele subdiretório.

Ele também look at the subdiretório com o mesmo nome no backup master site em ftp.FreeBSD.org. (Defindo explicitamente DISTDIR em seu Makefile não accomplish this, assim por favor use DIST_SUBDIR.)

Nota: Isto não afeta o MASTER_SITES você define em seu Makefile.


4.5. MANTEDOR

Defina seu endereço de mail aqui. Por favor. :-)

Para uma descrição detalhada das responsabilidades dos mantedores, consulte a seção Makefiles o MANTEDOR.

Note que somente um único endereço sem comentário part é permitido como um valor MAINTAINER.

Se o mantedor de um port não responder a um pedido de atualização de um usuário após duas semanas (excluindo principais feriados públicos), então that is considered a maintainer timeout, and the update pode ser feito sem aprovação explícita do mantedor. Se o mantedor não responder dentro de três meses, então esse mantedor é considerado ausente without leave, e pode ser substituído como o mantedor do particular port em questão. Exceções a isto são qualquer coisa mantida pelos Ports Management Team , ou o Security Officer Team . Nenhum desautorizado commits pode ser feito aos ports mantidos por aqueles grupos.

O Ports Management Team reserva o direito para revogar ou sobrescrever qualquer maintainership por qualquer razão, e o Security Officer Team reserva o direito para revogar ou sobrescrever maintainership por razões da segurança.


4.6. COMENTÁRIO

Esta é uma descrição de um-linha do port. Por favor não inclua o nome do pacote (ou o número versão do software) no comentário. O comentário deve começar com um capital, e o final sem um período. Aqui está um exemplo:

COMMENT=       A cat chasing a mouse all over the screen

A variável COMMENT deve imediatamente seguir a variável MAINTAINER no Makefile.


4.7. Dependências

Muitos ports dependem de outros ports. Há cinco variáveis que você pode usar para assegurar de que todos necessários bits estarão na máquina do usuário. Há também algum variáveis da dependencia pre-suportadas para casos comuns, mais alguns mais para controlar o comportamento das dependências.


4.7.1. LIB_DEPENDS

Esta variável especifica as bibliotecas que compartilhadas este port depende. É uma lista de lib:dir[:target] tuples onde lib é o nome da biblioteca compartilhada, dir é o diretório em qual escontrará caso não está disponível, e target é o target para chamar naquele diretório. Por exemplo,

 LIB_DEPENDS=
              jpeg.9:${PORTSDIR}/graphics/jpeg:install
verificará para ver se há uma biblioteca compartilhada jpeg com versão principal 9, e desceer dentro do subdiretório graphics/jpeg da sua árvore do ports para construir e instala-lo se não se encontrar. The target part pode ser omitida se for igual a DEPENDS_TARGET (qual defaults para instalar).

Nota: A parte lib é um argumento dado ao ldconfig -r | grep -wF. Não haverá nenhumas expressões regulares nesta variável.

A dependência é verificada duas vezes, uma vez dentro do extract target e então dentro do install target. Também, o nome da dependência é colocado dentro do pacote assim que pkg_add(1) o instalará automaticamente se não estiver no sistema do usuário.


4.7.2. RUN_DEPENDS

Esta variável especifica executáveis ou arquivos que este port depende durante o tempo-de-execução. É uma lista de path:dir[:target] tuples onde path é o nome do executável ou arquivo, dir é o diretório em qual encontrará-lo em caso que não está disponível, e target é o target para chamar naquele diretório. Se o path começar com uma barra (/), ele é tratado como um arquivo e sua existencia é testada com test -e; otherwise, it is assumed ser um executável, e which -s é usado para determinar se o programa existe no path de busca do usuário.

Por exemplo,

RUN_DEPENDS=   ${LOCALBASE}/etc/innd:${PORTSDIR}/news/inn \
               wish8.0:${PORTSDIR}/x11-toolkits/tk80

verificará se o arquivo ou o diretório /usr/local/etc/innd existe, e construir e instala-lo do subdiretório news/inn da arvore ports se ele não é encontrado. Verá também se um executével chamado wish8.0 está em seu path de procura, e descerá dentro do subdiretório x11-toolkits/tk80 da sua arvore ports para construir e instala-lo se ele não é encontrado.

Nota: Neste caso, innd é realmente um executável; se um executável estiver em um lugar que não esperado estra em um path normal de procura de usuário, você deve usar o pathname completo.

TA dependência é verificada dentro do install target. Também, o nome da dependência é colocado dentro do pacote assim que pkg_add(1) o instalará automaticamente se ele não estiver no sistema do usuário. A parte target pode ser omitida se for a mesma que DEPENDS_TARGET.


4.7.3. BUILD_DEPENDS

Esta variável especifica executáveis ou arquivos que este port necessita para construir. Como RUN_DEPENDS, é uma lista de path:dir[:target] tuples. Por exemplo,

 BUILD_DEPENDS=
              unzip:${PORTSDIR}/archivers/unzip
verificará para ver se há um executável chamado unzip, e descerá dentro do subdiretório archivers/unzip da sua arvore ports para construir e instala-lo se ele não for encontrado.

Nota: ``build'' aqui significa tudo da extração a compilação. A dependência é verificada dentro do extract target. A parte target pode ser omitida se for a mesma que DEPENDS_TARGET


4.7.4. FETCH_DEPENDS

Esta variável especifica executáveis ou arquivos que este port necessita para buscar. Como os dois anteriores, é uma lista de path:dir[:target] tuples. Por exemplo,

 FETCH_DEPENDS=
              ncftp2:${PORTSDIR}/net/ncftp2
verificará por um executável chamado ncftp2, e descerá dentro do subdiretório net/ncftp2 de sua arvore ports para construir e instala-lo se ele não for encontrado.

A dependência é verificada dentro do fetch target. A parte target pode ser omitida se for a mesma que DEPENDS_TARGET.


4.7.5. DEPENDS

Se há uma dependência em que não caia das quatro categorias acima, ou seu port necessita ter o fonte dos outros port extraídos em adição para te-lo instalado, então use esta variável. Esta é a lista de dir[:target], assim não há nada para verificar, ao contrário das quatro anteriores. A parte target pode ser omitida se ele for o mesmo que DEPENDS_TARGET.


4.7.6. USE_*

Um número de variáveis existem em ordem para encapsular dependências em comum que muitos ports tem.

Tabela 4-1. As variáveis USE_*

Variável Significado
USE_BZIP2 Os tarballs do port são comprimidos com bzip2.
USE_ZIP Os tarballs do port são comprimidos com zip.
USE_GMAKE O port necessita gmake para construir.
USE_PERL5 O port necessita perl 5 para construir e instalar. Veja Seção 5.3 para as variáveis adicionais que podem ser definidas relacionando ao perl.
USE_X_PREFIX O port instala na X11BASE melhor que PREFIX. Veja Seção 5.4 para as variáveis adicionais que podem ser definidas relacionando ao X11.
USE_AUTOMAKE O port usa GNU automake como parte de seu processo de construção. Veja Seção 5.5 para as variáveis adicionais que podem ser definidas relacionando ao automake.
USE_AUTOCONF O port usa GNU autoconf como parte de seu processo de construção. Veja Seção 5.5 para as variáveis adicionais que podem ser definidas relacionando ao autoconf.
USE_LIBTOOL O port usa GNU libtool como parte its build process. See Seção 5.5 para as variáveis adicionais que podem ser definidas relacionando ao libtool.
GMAKE O path completo para gmake se não está no PATH.
USE_BISON O port usa bison para construção.
NO_INSTALL_MANPAGES Não usa o install.man target.

Defina USE_XLIB=yes se seu port necessita o X Window System para ser instalado (é implicado pelo USE_IMAKE). Defina USE_GMAKE=yes se seu port necessita GNU make ao invés do BSD make. Define USE_AUTOCONF=yes se seu port necessita GNU autoconf para ser executado. Define USE_QT=yes se seu port usa o ultimo qt toolkit. Use USE_PERL5=yes se seu port necessita versão 5 da linguagem perl. (O ultimo é especialmente importante desde que algumas versões do FreeBSD tem perl5 como parte da base do sistema enquanto outras não.)


4.7.7. Notas em dependências

Como mencionado acima, o target padrão para chamar quando uma dependência é necessária é DEPENDS_TARGET. It defaults to install. Esta é uma variável do usuário; nunca é definida em um Makefile do port. Se seu port necessita um meio especial para manusear uma dependência, use a parte :target do the *_DEPENDS variables instead of redefining DEPENDS_TARGET.

Quando você digita make clean, suas dependências estão automaticamente limpadas também. Se você não deseja que isto aconteça, defina a variável NOCLEANDEPENDS em seu ambiente.

Depender de um outro port incondicionalmente, use a variável ${NONEXISTENT} assim o primeiro campo do BUILD_DEPENDS ou RUN_DEPENDS. Use isto somente quando você necessita obter o fonte de outro port. Você pode frequentemente economizar tempo de compilação especificando a target também. Por exemplo

BUILD_DEPENDS=   ${NONEXISTENT}:${PORTSDIR}/graphics/jpeg:extract
will always descend to the jpeg port and extract it.

Não use DEPENDS a menos que não há nenhum outro meio que o comportamento que você quer possa ser realizado. Causará a outro port ser sempre construido (e instalado, por padrão), e a dependência entrará nos pacotes também. Se isto for realmente o que você necessita, você deve provavelmente escrevê-lo assim BUILD_DEPENDS e RUN_DEPENDS ao invés -- ao memos a intenção será limpar.


4.7.8. Dependências opcionais

Algumas aplicações grandes podem ser construídas em um número de configurações, adicionando a funcionalidade se one of a number of bibliotecas ou de aplicações estiver disponível. Desde que não todos os usuários querem aquelas bibliotecas ou aplicações, o sistema de ports fornece os ganchos que o autor do port possa usar se decidir qual configuração deve ser construída. Suportando isto corretamente fará usuários felizes, e fornece eficazmente 2 ou mais ports pelo preço de um.

O mais fácil deste para usar é WITHOUT_X11. Se o port puder ser construído ambos com e sem suporte ao X, então ele deve normalmente ser construído com suporte ao X. Se WITHOUT_X11 é definido, então a versão que não tem suporte ao X deve ser construida.

Várias partes do GNOME têm tais botões, embora são ligeiramente mais difíceis de se usar. As variáveis para usar no Makefile são WANT_* e HAVE_*. Se a aplicação possa ser construida ambos com ou sem uma das dependências listadas abaixo, então o Makefile deve definir WANT_PKG, e deve construir a versão que usa PKG se HAVE_PKG for definido.

A variável WANT_* atualmente suporta esta maneira são WANT_GLIB, WANT_GTK, WANT_ESOUND, WANT_IMLIB, e WANT_GNOME.


4.8. Especificando o diretório de funcionamento

Cada port é extraído dentro a um diretório de funcionamento, qual tem que ser gravável. O sistema de ports supõe que os DISTFILES unpack dentro um diretório chamado ${DISTNAME}. Em outras palavras, se você definiu:

PORTNAME=      foo
PORTVERSION=   1.0

então os arquivos de distribuição do port contém um diretório top-level, foo-1.0, e o resto dos arquivos estão situados sob aquele diretório.

Há um número de variáveis que você pode definir se aquilo não for o caso.


4.8.1. WRKSRC

A variável lista o nome do diretório que é criado quando os distfiles da aplicação são extraídos. Se nosso exemplo anterior extraído em um diretório chamado foo (e não foo-1.0) você escreveria:

WRKSRC=      ${WRKDIR}/foo

ou possivelmente

WRKSRC=      ${WRKDIR}/${PORTNAME}

4.8.2. NO_WRKSUBDIR

Se o port não extrair dentro de um subdiretório em tudo então vcê deve definir NO_WRKSUBDIR a indicar aquele.

NO_WRKSUBDIR= yes

4.9. CONFLITOS

Se seu pacote não puder coexistir com outros pacotes (por causa de conflitos de arquivos, runtime incompatibilidade, etc.), liste os outros nomes dos pacotes na variável CONFLICTS. Você pode usar shell globs como * e ? aqui. Os nomes dos pacotes devem ser enumerados da mesma maneira que aparecem em /var/db/pkg.


4.10. Mecanismos de Construção

Se seu pacote usa GNU make, defina USE_GMAKE=yes. Se seu pacote usa configure, defina HAS_CONFIGURE=yes. Se seu pacote usa GNU configure, defina GNU_CONFIGURE=yes (this implies HAS_CONFIGURE). Se você quiser dar alguns argumentos extras para configure (a lista padrão de argumentos --prefix=${PREFIX} para GNU configure e vazia para não-GNU configure), defina aqueles argumentos extras em CONFIGURE_ARGS. Se seu pacote usar o GNU autoconf, defina USE_AUTOCONF=yes. Isto implica GNU_CONFIGURE, e fará autoconf ser executado antes de configure.

Nota: Se seu pacote usa GNU configure, e o arquivo executável resultante tem um ``estranho'' nome como i386-portbld-freebsd4.7-appname, você necessitará adicionalmente sobrescrever a variável CONFIGURE_TARGET para especificar o target na maneira necessária pelos scripts gerados pelos recentes versões do autoconf. Adicione a seguinte linha imediatamente após a linha GNU_CONFIGURE=yes em seu Makefile:

CONFIGURE_TARGET=--build=${MACHINE_ARCH}-portbld-freebsd${OSREL}

Se seu pacote for uma aplicação X que cria o Makefiles de Imakefiles usando imake, então defina USE_IMAKE=yes. Isto fará o estágio de configurar para automaticamente fazer um xmkmf -a. Se o -a flag for um problema para seu port, defina XMKMF=xmkmf. Se seu port usa imake mas não compreende o install.man target, NO_INSTALL_MANPAGES=yes deve ser definido. Em adição, o autor do port original deve ser shot. :->

Se seu fonte do port Makefile tem algo mais do que all assim a construção principal target, defina ALL_TARGET accordingly. Mesmo vai para install e INSTALL_TARGET.


Capítulo 5. Considerações especiais

Há algumas mais coisas que você tem que take into account quando você cria um port. Esta seção explica o mais comum daquelas.


5.1. Bibliotecas Compartilhadas

Se seu port instala uma ou mais bibliotecas compartilhadas, defina um INSTALLS_SHLIB make variable, qual instruirá um bsd.port.mk a executar ${LDCONFIG} -m no diretório onde a nova biblioteca for instalada (geralmente PREFIX/lib) durante post-install target para registra-lo dentro do cache da biblioteca compartilhada. Esta variável, quando definida, também facilitará a adição de um apropriado @exec /sbin/ldconfig -m e @unexec /sbin/ldconfig -R pair dentro de seu aerquivo pkg-plist, assim que um usuário que instalou o pacote possa começar usar a biblioteca compartilhada imediatamente e a desinstalação não fará o sistema ainda acreditar que a biblioteca está lá.

Se você necessitar, você pode sobrescrever a location padrão onde a nova biblioteca for instalada definindo LDCONFIG_DIRS make variable, qual deve conter uma lista de diretórios dentro da qual as bibliotecas compartilhadas serão instaladas. Por exemplo se seu port instala bibliotecas compartilhadas dentro dos diretórios PREFIX/lib/foo e PREFIX/lib/bar você pode usar as seguintes em seu Makefile:

INSTALLS_SHLIB= yes
LDCONFIG_DIRS=  %%PREFIX%%/lib/foo %%PREFIX%%/lib/bar

Note que indice de LDCONFIG_DIRS é passado através do sed(1) só como o resto do pkg-plist, assim substituições do PLIST_SUB também aplica aqui. É recomendado que você use %%PREFIX%% para PREFIX, %%LOCALBASE%% para LOCALBASE e %%X11BASE%% para X11BASE.


5.2. Ports com restrições de distribuição

As licenças variam, e algumas delas colocam restrições em como a aplicação pode ser empacotada, whether it possa ser vendido por lucro, e assim por diante.

Importante: É sua responsabilidade como um porter ler os termos de licenciamento do software e certificar-se que o projeto FreeBSD não segura responsável por viola-los redistribuindo o fonte ou binários compilados either via FTP ou CDROM. Se em dúvida, por favor contate o lista de discussão sobre FreeBSD ports e o sistema de ports FreeBSD.

Nas situações como esta, as seguintes variáveis pode ser definidas. Em adição, ports/LEGAL deve tamém ser atualizado.


5.2.1. NO_PACKAGE

Esta variável indica que nós não podemos gerar um pacote binário da aplicação. Entretanto, arquivos DISTFILES do port podem ser livremente distribuídos.

NO_PACKAGE deve também ser usado se o pacote binário não for geralmente útil, e a aplicação deve sempre ser compilada do código fonte. Por exemplo, se a aplicação tiver a informação da configuração em que é específico do local hard codicado dentro dele no tempo de compilar.

NO_PACKAGE deve ser definido a uma string descrevendo a razão porque o pacote não deve ser gerado.


5.2.2. NO_CDROM

Esta variável indica que embora sejamos permitidos nós gerar pacotes binários, não estamos permitidos nós pôr aqueles pacotes, ou os DISTFILES do port, no CDROM para revenda. Os DISTFILES ainda será disponível via FTP.

NO_PACKAGE e NO_CDROM pode ser definida simultaneamente.


5.2.3. RESTRICTED

Defina esta variável se a licença da aplicação também nos proíbe de espelhar os DISTFILES das aplicações via FTP.

Também defina esta se a licença da aplicação tem restrições gerais em quem pode usar, ex. a aplicação é para uso não-comercial somente.


5.2.4. RESTRICTED_FILES

Se somnete alguns dos arquivos de distribuição são restritos então defina esta variável para lista-los. It defaults to ${DISTFILES} ${PATCHFILES}.


5.3. Usando o perl

Tabela 5-1. Variáveis para os ports que usam o perl

Variável Significado
USE_PERL5 Diz que o port usa perl 5 para construir e executar.
PERL_CONFIGURE Configure usando MakeMaker do Perl. Implica USE_PERL5.
Variáveis somente Leitura  
PERL_VERSION A versão completa do perl instalado (ex., 5.00503).
PERL_VER A versão curta do perl instalado(ex., 5.005).
PERL_LEVEL A versão instalada do perl como um inteiro da forma MNNNPP (ex., 500503).
PERL_ARCH Onde o perl armazena bibliotecas dependente da arquitetura. Defaults to ${ARCH}-freebsd.

5.4. Usando o X11

Tabela 5-2. Variáveis para os ports que usam o X

USE_X_PREFIX O port instala em X11BASE, não em PREFIX.
USE_XLIB O port usa as bibliotecas do X.
USE_MOTIF O port usa o toolkit Motif. Implica USE_XPM.
USE_IMAKE O port usa imake. Implica USE_X_PREFIX.
XMKMF Define o path do xmkmf se não no PATH. Defaults to xmkmf -a.

5.5. Usando o automake, autoconf, e libtool

Tabela 5-3. Variáveis para os ports que usam o automake, autoconf ou libtool

Variável Significado
USE_AUTOMAKE O port usa o automake. Implica USE_AUTOCONF e USE_AUTOMAKE_VER?=14.
AUTOMAKE O path completo para o automake se não está no PATH.
USE_AUTOMAKE_VER O port usa o automake. Valores válidos para esta variável são 14 e 15, e define as variáveis AUTOMAKE_DIR e ACLOCAL_DIR apropriadamente.
AUTOMAKE_ARGS Um ou mais argumentos da linha de comando para passar ao AUTOMAKE se o USE_AUTOMAKE_VER é definido.
AUTOMAKE_ENV Uma ou mais variáveis de ambiente para definir (e seus valores) antes da execução AUTOMAKE.
ACLOCAL Define o path do GNU aclocal se ele não está no PATH. O padrão é definido de acordo com variável USE_AUTOMAKE_VER.
ACLOCAL_DIR Define ao path do GNU aclocal diretório compartilhado. O padrão é definido de acordo com a variável USE_AUTOMAKE_VER.
AUTOMAKE_DIR Define ao path do GNU automake diretório compartilhado. O padrão é definido de acordo com a variável USE_AUTOMAKE_VER.
USE_AUTOCONF_VER Especifica que o port use autoconf. O valor default é 213.
USE_AUTOCONF Especifica que o port use autoconf. Implica GNU_CONFIGURE e USE_AUTOCONF_VER?=213.
AUTOCONF Define ao path do GNU autoconf se ele não está no PATH. O padrão está definido de acordo com a variável USE_AUTOCONF_VER.
AUTOCONF_ARGS Argumentos da linha de comando para passar ao autoconf.
AUTOCONF_ENV Define estes pares variável=valor no ambiente antes da execução do autoconf.
AUTOHEADER Define ao path do GNU autoheader se ele não está no PATH. O default está definido de acordo com USE_AUTOCONF_VER.
AUTORECONF Define ao path do GNU autoreconf se ele não está no PATH. O default está definido de acordo com USE_AUTOCONF_VER.
AUTOSCAN Define ao path do GNU autoscan se ele não está no PATH. O padrão está definido de acordo com USE_AUTOCONF_VER.
AUTOIFNAMES Define ao path do GNU autoifnames se ele não está definido no PATH. O padrão está definido de acordo com USE_AUTOCONF_VER.
USE_LIBTOOL O port usa libtool. Implica GNU_CONFIGURE.
LIBTOOL Define ao path do libtool se ele não está definido no PATH.
LIBTOOLFILES Os arquivos ao patch para libtool. Defaults to aclocal.m4 se USE_AUTOCONF está definido, configure caso contrário.
LIBTOOLFLAGS Adicionais flags to passar ao ltconfig. Defaults ao --disable-ltlibs.

5.6. Usando o GNOME

O projeto FreeBSD/GNOME usa um sistema chamado GNOMENG para definir quais componentes do GNOME um particular port usa. Uma compreensiva lista destas variáveis existe com a homepage do projeto do FreeBSD/GNOME.


5.7. Usando o KDE

Tabela 5-4. Variáveis para os ports que usam o KDE

USE_QT_VER O port usa o toolkit do Qt. Possíveis valores são 1, 2 e 3; cada um especifica a versão principal do Qt para uso. Defina ambos MOC e QTCPPFLAGSaos valores padrões apropriados.
USE_KDELIBS_VER O port usa bibliotecas do KDE. Possíveis valores são 1, 2 e 3; cada um especifica a versão principal do KDE para uso. Implica USE_QT_VER da versão apropriada.
USE_KDEBASE_VER O port usa a base do KDE. Possíveis valores são 1, 2 e 3; cada um especifica a versão principal de KDE para uso. Implica USE_KDELIBS_VER da versão apropriada.
MOC Defina ao path do moc. Definição padrão de acordo com o valor do USE_QT_VER.
QTCPPFLAGS Defina o CPPFLAGS para usar quando processando o código Qt. Definição padrão de acordo com USE_QT_VER value.

Capítulo 6. MASTERDIR

Se seu port necessita construir versões ligeiramente diferentes dos pacotes tendo uma variável (por exemplo, resolução, ou tamanho do papel) pegue valores diferentes, crie um subdiretório por pacote para faze-lo mais facilmente aos usuários ver o que fazer, mas tentar compartilhar assim varios arquivos quanto possível entre os ports. Tipicamente você somente necessita um muito curto Makefile em tudo mas um dos diretórios se você usar variáveis inteligentes. No único Makefile, você pode usar MASTERDIR para especificar o diretório onde o resto dos arquivos estão. Também, use uma variável como parte do PKGNAMESUFFIX assim os pacotes terão nomes diferentes.

Isto será demonstrado melhor por um exemplo. Isto é parte do japanese/xdvi300/Makefile;

PORTNAME=       xdvi
PORTVERSION=    17
PKGNAMEPREFIX=  ja-
PKGNAMESUFFIX=  ${RESOLUTION}
 :
# default
RESOLUTION?=   300
.if ${RESOLUTION} != 118 && ${RESOLUTION} != 240 && \
       ${RESOLUTION} != 300 && ${RESOLUTION} != 400
       @${ECHO} "Error: invalid value for RESOLUTION: \"${RESOLUTION}\""
       @${ECHO} "Possible values are: 118, 240, 300 (default) and 400."
       @${FALSE}
.endif

japanese/xdvi300 tem também todos os regular patches, arquivos do pacote, etc. Se você digita make lá, ele pegará o valor padrão para a resolução (300) e construirá o port normalmente.

Assim para outras resoluções, este é o inteiro xdvi118/Makefile:

RESOLUTION=     118
MASTERDIR=      ${.CURDIR}/../xdvi300

.include "${MASTERDIR}/Makefile"

(xdvi240/Makefile e xdvi400/Makefile são similares). A definição MASTERDIR diz ao bsd.port.mk que a definição regular de subdiretórios como FILESDIR e SCRIPTDIR are ser encontrado abaixo de xdvi300. A linha RESOLUTION=118 sobreescreverá a linha RESOLUTION=300 em xdvi300/Makefile e o port será construido com a resolução definida a 118.


Capítulo 7. Versões da biblioteca compartilhada

Por favor leia nossa política na biblioteca compartilhada versioning para compreender o que fazer com versões da biblioteca compartilhada em geral. Não blindly assume software authors know sabe o que está fazendo; muitos deles não. É muito importante que estes detalhes são cuidadosamente considerados, assim nós temos quite a unique situation onde nós estamos tentando ter dúzias de pares de software potencialmente incompatíveis co-existindo. Importações de ports descuidadas tem causado grandes problemas considerando bibliotecas compartilhadas no passado (sempre queria saber por que o port jpeg-6b tem uma versão da biblioteca compartilhada de 9?). Se em dúvida, envie uma mensagem ao lista de discussão sobre FreeBSD ports e o sistema de ports FreeBSD. Na maioria das vezes, seu trabalho termina determinando a correta versão da biblioteca compartilhada e fazendo patches apropriados para implementá-lo.


Capítulo 8. Manpages

As variáveis MAN[1-9LN] automaticamente adicionarão quaisquer manpages ao pkg-plist (isto significa que você não tem que listar manpages no pkg-plist--veja gerando PLIST para mais). Também faz o estágio de instalar automaticamente compressa ou descompressa manpages dependendo das definições do NOMANCOMPRESS no /etc/make.conf.

Se seu port tenta instalar nomes multiplos para manpages usando symlinks ou hardlinks, você tem que usar a variável MLINKS para identificar estes. O link instalado pelo seu port será destruído e recriado pelo bsd.port.mk para certificar-se que ele indica ao arquivo correto. Quaisquer manpages listadas em MLINKS não tem que ser listada no pkg-plist.

Para especificar whether o manpages são comprimidas na instalação, use a variável MANCOMPRESSED. Esta variável pode ter três valores, yes, no e maybe. yes significa que manpages estão já instaladas comprimidas, no significa que elas não estão, e maybe significa que o software já cumpre o valor do NOMANCOMPRESS assim bsd.port.mk não tem que fazer nada especial.

O MANCOMPRESSED é automaticamente dfinido a yes se USE_IMAKE é definido e NO_INSTALL_MANPAGES não é definido, e para no ao contrário. Você não tem que defini-lo explicitamnete ao menos que o padrão não é suitable para seu port.

Se seu port anchors its man tree em outro algum lugar que PREFIX, você pode usar o MANPREFIX para defini-lo. Também, se somente manpages em certain sections go in a non-standard place, como alguns ports do módulos perl, você pode definir paths do man individual usando MANsectPREFIX (onde sect é um de 1-9, L ou N).

Se seus manpages forem aos subdiretórios de lingua-específica, defina o nome das linguas ao MANLANG. O valor desta variável defaults to "" (ex., somente Inglês).

Aqui está um exemplo que colocamos eles todos juntos.

MAN1=          foo.1
MAN3=          bar.3
MAN4=          baz.4
MLINKS=        foo.1 alt-name.8
MANLANG=       "" ja
MAN3PREFIX=    ${PREFIX}/share/foobar
MANCOMPRESSED= yes

Teste estados que seis arquivos são instalados por este port;

${PREFIX}/man/man1/foo.1.gz
${PREFIX}/man/ja/man1/foo.1.gz
${PREFIX}/share/foobar/man/man3/bar.3.gz
${PREFIX}/share/foobar/man/ja/man3/bar.3.gz
${PREFIX}/man/man4/baz.4.gz
${PREFIX}/man/ja/man4/baz.4.gz

Adicionalmente ${PREFIX}/man/man8/alt-name.8.gz pode or não ser instalado por seu port. Regardless, um symlink será criado para juntar o manpage foo(1) e manpage alt-name(8).


Capítulo 9. Ports que necessitam Motif

Há muitos programas que necessitam um biblioteca do Motif (disponível de diversos commercial vendors, enquanto há um clone livre relatado para ser capaz de executar muitas aplicações no x11-toolkits/lesstif) para compilar. Desde que ele é um popular toolkit e suas licenças normalmente permitem redistribuição dos binários linkados estaticamente, nós temos feito clausulas especiais para manusear ports que necessitam o Motif de um modo que nós podemos facilmente compilar binários linkados either dinâmicamente (para pessoas que estão compilando do port) ou estaticamente (para pessoas que distribuem pacotes).


9.1. USE_MOTIF

Se seu port necessita o Motif, defina esta variável no Makefile. Isto impedirá pessoas que não possui uma cópia do Motif de mesmo que tentando construí-lo.


9.2. MOTIFLIB

Esta variável será definida pelo bsd.port.mk para ser a referência apropriada a biblioteca do Motif. Por favor patch o fonte para usar isto onde quer que a biblioteca do Motif está referênciada no Makefile ou Imakefile.

Há dois casos comuns:

  • Se o port refere a biblioteca do Motif assim -lXm em seu Makefile ou Imakefile, simplesmente substitua ${MOTIFLIB} para ele.

  • Se o port usa XmClientLibs em seu Imakefile, mude-o para ${MOTIFLIB} ${XTOOLLIB} ${XLIB}.

Note que MOTIFLIB (geralmente) expande a -L/usr/X11R6/lib -lXm ou /usr/X11R6/lib/libXm.a, assim não há nenhuma necessidade para adicionar -L ou -l na frente.


Capítulo 10. Fontes do X11

Se seu port instala fontes para o X Window System, coloque-os em X11BASE/lib/X11/fonts/local. Este diretório é novo para XFree86 3.3.3. Se não existir, por favor crie-o, e print out um mensagem urging o usuário para atualizar suas XFree86 para 3.3.3 ou mais nova, ou ao menos adicione este diretório ao path da fonte em /etc/XF86Config.


Capítulo 11. Arquivos Info

Se seu pacote necessitar instalar arquivos GNU info, eles devem ser listados na variável INFO (sem o trailing .info), e apropriada instalação/desinstalação code será automaticamente adicionado ao temporário pkg-plist antes da registração do pacote.


Capítulo 12. Os arquivos pkg-*

Há alguns truques que nós não mencionamos ainda sobre os arquivos pkg-* que vem acessível às vezes.


12.1. pkg-message

Se você necessitar indicar uma mensagem ao instalador, você pode colocar a mensagem em pkg-message. Esta capability é frequentemente útil mostrar as etapas adicionais da instalação a ser feitas após um pkg_add(1) ou mostrar informação de licenceamento.

Nota: O arquivo pkg-message não precisa ser adicionado ao pkg-plist. Também, não começará automaticamente printed se o usuário está usando o port, não o pacote, assim você deve provavelmente mostra-lo do target post-install você mesmo.


12.2. pkg-install

Se seu port necessitar executar comandos quando o pacote binário está instalado com pkg_add(1) você pode fazer isto através do script pkg-install. Este script automaticamente será adicionado ao pacote, e será executado duas vezes pelo pkg_add(1). A primeira vez como ${SH} pkg-install ${PKGNAME} PRE-INSTALL e a segunda vez como ${SH} pkg-install ${PKGNAME} POST-INSTALL. $2 podem ser testados para determinar qual modo o script está sendo executado. A variável ambiental PKG_PREFIX será definida o diretório de instalação do pacote. Veja pkg_add(1) para informação adicional.

Nota: Este script não é executado automaticamente se você instala o port com make install. Se você está dependendo dele ser executado, você terá que explicitamente chamá-lo de seu Makefile port.


12.3. pkg-deinstall

Este script executa quando um pacote é removido.

Este script será executado duas vezes pelo pkg_delete(1). A primeira vez como ${SH} pkg-install ${PKGNAME} DEINSTALL e a segunda vez como ${SH} pkg-install ${PKGNAME} POST-DEINSTALL.


12.4. pkg-req

Se seu port precisa determinar se ele deve instalar ou não, você pode criar um script das ``necessidades'' do pkg-req. Será invocado automaticamente no tempo de instalação/desinstalação para determinar se ou não a instalação/desinstalação deve proseguir.

O script será executado no tempo instalação pelo pkg_add(1) como pkg-req ${PKGNAME} INSTALL. No tempo da desinstalação será executado pelo pkg_delete(1) como pkg-req ${PKGNAME} DEINSTALL.


12.5. Mudando o pkg-plist baseado nas variáveis do make

Alguns ports, particularmente os ports p5-, precisam mudar seus pkg-plist dependendo de que opções eles são configurados com (ou versão do perl, neste caso do ports p5-). Para fazer isto fácil, quaisquer instancias no pkg-plist do %%OSREL%%, %%PERL_VER%%, e %%PERL_VERSION%% será substituida apropriadamente. O valor de %%OSREL%% é a revisãso numérica do sistema operacional (ex., 2.2.7). %%PERL_VERSION%% é o numero da versão completa do perl (ex., 5.00502) e %%PERL_VER%% é o numero da versão do perl menos o patchlevel (ex., 5.005).

Se você precisar fazer outras substituições, você pode definir a variável PLIST_SUB com uma lista de pares VAR=VALUE e exemplos de %%VAR%% será substituída com o VALUE no pkg-plist.

Por exemplo, se você tiver um port que instale muitos arquivos no subdiretório da específica-versão, você pode colocaralgo como

OCTAVE_VERSION= 2.0.13
PLIST_SUB=      OCTAVE_VERSION=${OCTAVE_VERSION}
no Makefile e usar %%OCTAVE_VERSION%% onde quer que a versão apareça no pkg-plist. Essa maneira, quando você upgrade o port, não terá que mudar dúzias (ou em alguns casos, centenas) de linhas no pkg-plist.

Esta substituição (assim bem como adição de alguns manual pages) serão feitas entre o pre-install e do-install targets, lendo de PLIST e escrevendo ao TMPPLIST (default: WRKDIR/.PLIST.mktmp). Assim se seu port construir PLIST on the fly, faça assim ou antes de pre-install. Também, se seu port precisa de editar o arquivo resultante, faça assim que o post-install a um arquivo chamado TMPPLIST.


12.6. Mudando os nomes dos arquivos pkg-*

Todos os nomes dos arquivos pkg-* são definidos usando variáveis assim você pode mudá-las em seu Makefile se mprecisar ser. Isto é especialmente útil quando você está compartilhando os mesmos arquivos pkg-* entre diversos ports ou ter que escrever a um dos arquivos acima (veja escrevendo a outros lugares que WRKDIR for porque ele é uma má idéia escrever diretamente dentro do subdiretório pkg-*).

Aqui está uma lista de nomes de variáveis e seus valores padrões. (PKGDIR defaults to ${MASTERDIR}.)

Variável Valor Padrão
DESCR ${PKGDIR}/pkg-descr
PLIST ${PKGDIR}/pkg-plist
PKGINSTALL ${PKGDIR}/pkg-install
PKGDEINSTALL ${PKGDIR}/pkg-deinstall
PKGDEINSTALL ${PKGDIR}/pkg-deinstall
PKGREQ ${PKGDIR}/pkg-req
PKGMESSAGE ${PKGDIR}/pkg-message

Por favor mude estas variáveis melhor que sobrescrevendo PKG_ARGS. Se você mudar PKG_ARGS, aqueles arquivos não serão corretamente instalados sobre /var/db/pkg instale de um port.


Capítulo 13. Testando seu port

13.1. Portlint

Verifique seu trabalho com o portlint antes que você o envie ou commit.


13.2. PREFIX

Tente fazer seu port instalar relativo ao PREFIX. (O valor desta variável seá definida ao LOCALBASE (default /usr/local), ao menos USE_X_PREFIX ou USE_IMAKE é definido, em qual caso ele será X11BASE (default /usr/X11R6).

Não hard-coding /usr/local ou /usr/X11R6 qualquer lugar no fonte fará o port muito mais flexivel e capaz de atender as necessidades dos outros locais. Para ports do X que usam imake, isto é automático; caso contrário, isto pode frequentemente ser feito simplesmente substituindo as ocorrências de /usr/local (ou /usr/X11R6 para ports do X que não usam imake) nos vários scripts/Makefiles no port para ler PREFIX, assim esta variável é automaticamente passada abaixo a todo estágio do processo de construção e instalação.

Certifique-se que sua aplicação não está instalando coisas em /usr/local ao invés de PREFIX. Um teste rápido para isto é fazer isto:

# make clean; make package PREFIX=/var/tmp/port-name

Se qualquer coisa for instalada fora do PREFIX, fazendo o processo da criação do pacote queixará que ele não pode encontrar os arquivos.

Isto não testa a existência de referências internas, ou corrige o uso de LOCALBASE a referências ao files from other ports. Testing the installation in /var/tmp/port-name para fazer que enquanto você tenha-o instalado faria aquilo.

Não defina USE_X_PREFIX ao menos que seu port verdadeiramente necessite-o (ex., ele linka contra libs do X ou ele precisa referenciar arquivos em X11BASE).

A variável PREFIX pode ser reassigned em seu Makefile ou no ambiente do usuário. Entretanto, ele é fortemente desencorajado a ports individuais para definir esta variável explicitamente no Makefiles.

Também, refer aos programas/arquivos de outros ports com as variáveis mencionadas acima, não explicita pathnames. Por exemplo, se seu port necessita de um macro PAGER para ser o pathname completo do less, use a flag do compilador:

-DPAGER=\"${PREFIX}/bin/less\"
ou
-DPAGER=\"${LOCALBASE}/bin/less\"
se este é um port do X, ao invés de -DPAGER=\"/usr/local/bin/less\". Esta maneira ele terá um chance melhor de trabalho se o administrador do sistema moveu toda a arvore /usr/local em algum lugar mais.

13.3. Teste de sanidade do FreshPorts

O FreshPorts tem uma caracterisca teste de sanidade qual automaticamente testa cada commit a arvore do ports do FreeBSD. Se subscribed to este serviço, você será notificado de quaisquer erros qual o FreshPorts detecta durante o teste de sanidade de seus commits.

Se você desejar usar este serviço, tudo que você necessita é uma conta do FreshPorts. Se seu endereço de email registrado é @FreeBSD.org, você verá o link opt-in no no lado da mão direta das páguina da web. Para aqueles como você que já tem uma conta do FreshPorts, mas não estão usando seu endereço de email @FreeBSD.org, só mude seu email para @FreeBSD.org, subscribe, então mude-o de volta novamente.


Capítulo 14. Upgrading

Quando você notice que um port está fora da data comparado ao ultima versão do autores originais, primeiro certifique-se que você tenha o ultimo port. Você pode encontrá-los no diretório ports/ports-current dos sites espelhos do FTP. Você pode também usar CVSup manter sua coleção inteira dos ports up-to-date, como descrito no Handbook.

O próximo passo é enviar um email aoe mantedor, se ele está listado no Makefile do port. Essa pessoa pode já estar trabalhando em uma atualização, ou ter uma razão para não upgrade o port exato agora (por causa de, por exemplo, problemas de estabilidade da nova versão).

Se o mantedor pedir que você faça o melhoramento ou não há qualquer such pessoa para começar com, por favor faça o upgrade e envie o diff recursivo (either unified ou contexto diff é muito bom, mas o port committers parecem preferir unified diff more) do novo e antigos diretórios ports a nós (ex., se seu port modificado é chamado superedit e o original está em nossa arvore como superedit.bak, então envie-nos o resultado do diff -ruN superedit.bak superedit). Por favor examine a saída para certificar-se que todas as mudanças faça sentido. A melhor maneira para nos enviar o diff é incluindo ele através send-pr(1) (categoria ports). Se você for o mantedor para o port, be sure para colocar [atualização do mantedor] no começo da sua linha de sinopse e/ou defina a ``Class'' de seu PR ao maintainer-update. Por favor mencione quaisquer arquivos adicionados ou apagados na mensagem, as eles temm que ser explicitamente específicado ao CVS quando fazendo um commit. Se o diff é maior que 20KB, por favor comprima e uuencode ele; caso controrio, só inclua-o no PR as is.

Importante: Se seu upgrade é motivado por interesses da segunça ou uma falta séria no port committed atualmente, por favor notifíque o Ports Management Team para pedir imediata reconstrução e redistribuição de seu pacote do port. Usuários confiantes do pkg_add(1) caso contrário continuará instalar a versão antiga através do pkg_add -r por várias semanas.

Nota: Mais uma vez, por favor use diff(1) e não shar(1) para enviar atualizacões a ports existente!


Capítulo 15. Fazer e Não Fazer

Está aqui uma lista de comuns fazer e não fazer que você encontra durante o processo de porting. Você deve verificar seu próprio port against esta lista, but you can also check ports in the PR database that others have submitted. Envie quaisquer comentários no ports que você verificou assim descrito no Bug Reports e Comentário Geral. Verificando ports na base de dados do PR database ambos farão it mais rápido para nós commit -los, e provar que você sabe o que você está fazendo.


15.1. Binários Stripping

Não strip binários manualmente ao menos que você tenha. Todos binários devem ser stripped, mas o macro INSTALL_PROGRAM instalará e strip um binário ap mesmo tempo (veja a próxima seção).

Se você necessitar strip um arquivo, mas não deseje usar o macro INSTALL_PROGRAM, ${STRIP_CMD} will strip seu programa. Isto é feito tipicamente com o post-install target. Por exemplo:

post-install:
        ${STRIP_CMD} ${PREFIX}/bin/xdl

Use o comando file(1) nos executáveis instalados para verificar se o binário está stripped ou não. Se ele não diz not stripped, ele está stripped. Adicionalmente, strip(1) will not strip um programa anteoriormente previously stripped; ele ao invés sairá claramnete.


15.2. INSTALL_* macros

Use os macros fornecidos em bsd.port.mk para assegurar modos corretos e ownership dos arquivos em seu próprio *-install targets.

  • INSTALL_PROGRAM é um comando para instalar executáveis binários.

  • INSTALL_SCRIPT é um comando para instalar scripts executáveis.

  • INSTALL_DATA é um comando para instalar dados compartilhaveis.

  • INSTALL_MAN é um comando para instalar manpages e outras documentações (ele não comprime qualquer coisa).

Estes são basicamente o comando install com todos flags apropriadas. Veja abaixo para um exemplo em como usá-los.


15.3. WRKDIR

Não escreva qualquer coisa aos arquivos do lado de fora do WRKDIR. WRKDIR é o único lugar que é garantido para ser gravável durante a construção do port (veja compilando ports do CDROM para um exemplo de construção de ports de uma arvore somente-leitura). Se você necessitar modificar um dos arquivos pkg-*, faça assim redefinindo a variável, não escrevendo sobre ele.


15.4. WRKDIRPREFIX

Certifique-se que seu port honors WRKDIRPREFIX. A maioria dos ports não têm que preocupar-se sobre isto. Em particular, se você está referindo a um WRKDIR de um outro port, note que a posição correta é WRKDIRPREFIXPORTSDIR/subdir/name/work not PORTSDIR/subdir/name/work ou .CURDIR/../../subdir/name/work or some such.

Também, se você está definindo WRKDIR você mesmo, certifique-se que você prepend ${WRKDIRPREFIX}${.CURDIR} in the front.


15.5. Diferenciando sistemas operacionais e versões de OS

Você pode vir através do código que necessita as modificações ou a compilação condicional baseadas em que versão do Unix está executando sobre. Se você necessitar fazer tais mudanças ao código para a compilação condicional, certifique-se que você fez as mudanças tanto geral quanto possível assim que nós podemos back-port code aos sistemas FreeBSD 1.x e cross-port a outros sistemas BSD como 4.4BSD de CSRG, BSD/386, 386BSD, NetBSD, e OpenBSD.

A maneira preferida para dizer 4.3BSD/Reno (1990) e novas versões do código BSD code apart é usando o BSD macro definido no <sys/param.h>. Hopefully that arquivo está já incluido; se não, adicione o código:

#if (defined(__unix__) || defined(unix)) && !defined(USG)
#include <sys/param.h>
#endif

ao lugar apropriado no arquivo .c. Nós acreditamos que cada sistema que define estes dois símbolos tem sys/param.h. Se você encontrasse um sistema que não, nós gostaríamos de saber. Por favor envie o mail ao lista de discussão sobre FreeBSD ports e o sistema de ports FreeBSD.

Uma outra maneira é usar o estilo GNU Autoconf de fazer isto:

#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif

Não se esqueça de adicionar -DHAVE_SYS_PARAM_H ao CFLAGS no Makefile para este método.

Uma vez que você tenha sys/param.h incluído, você pode usar:

#if (defined(BSD) && (BSD >= 199103))

para detectar se o código é being compilado em um código base do 4.3 Net2 ou mais novo (ex. FreeBSD 1.x, 4.3/Reno, NetBSD 0.9, 386BSD, BSD/386 1.1 e acima).

Use:

#if (defined(BSD) && (BSD >= 199306))

para detectar se o código está sendo compilado em um código base do 4.4 ou mais novo (ex. FreeBSD 2.x, 4.4, NetBSD 1.0, BSD/386 2.0 ou acima).

O valor do macro BSD é 199506 para código base do 4.4BSD-Lite2. Isto é indicado para propósitos informacionais somente. Ele não deve ser usado para distinguição entre versões do FreeBSD baseado somente no 4.4-Lite vs. versões que tenham unido-se em mudanças do 4.4-Lite2. O macro do __FreeBSD__ deve ser usado ao invés.

Use sparingly:

  • __FreeBSD__ é definido em todas versões do FreeBSD. Use-o se a mudança que você está fazendo somente afetará o FreeBSD. Porting gotchas como o use de sys_errlist[] vs strerror() são Berkeley-isms, não mudanças do FreeBSD.

  • No FreeBSD 2.x, __FreeBSD__ é definido ser 2. Em mais novas versões, ele é 1. Ultaimas versões will bump it to match seu numero de versão principal.

  • Se você necessita dizer as diferenças entre um sistema FreeBSD 1.x e um sistema FreeBSD 2.x ou 3.x, usually a resposta certa é para usar os macros BSD descrito acima. Se há atualmente uma mudança específica de FreeBSD (tal como opções especiais da biblioteca compartilhada ao usar ld) então está OK para usar __FreeBSD__ e #if __FreeBSD__ > 1 para detectar um FreeBSD 2.x e sistemas posteriores. Se você necessitar mais granularidade em detectar sistemas do FreeBSD desde 2.0-RELEASE você pode usar o seguinte:

    #if __FreeBSD__ >= 2
    #include <osreldate.h>
    #    if __FreeBSD_version >= 199504
             /* 2.0.5+ release specific code here */
    #    endif
    #endif
    

Nas centenas de ports que feitos, houve somente um ou dois casos onde __FreeBSD__ devia ser usado. Só porque um port anterior screwed up e usou-o no lugar errado não significa que você deve fazer assim também.


15.6. Valores de __FreeBSD_version

Release __FreeBSD_version
2.0-RELEASE 119411
2.1-CURRENT 199501, 199503
2.0.5-RELEASE 199504
2.2-CURRENT antes do 2.1 199508
2.1.0-RELEASE 199511
2.2-CURRENT antes do 2.1.5 199512
2.1.5-RELEASE 199607
2.2-CURRENT antes do 2.1.6 199608
2.1.6-RELEASE 199612
2.1.7-RELEASE 199612
2.2-RELEASE 220000
2.2.1-RELEASE 220000 (nehuma mudança)
2.2-STABLE after 2.2.1-RELEASE 220000 (nehuma mudança)
2.2-STABLE depois do texinfo-3.9 221001
2.2-STABLE depois do top 221002
2.2.2-RELEASE 222000
2.2-STABLE depois do 2.2.2-RELEASE 222001
2.2.5-RELEASE 225000
2.2-STABLE depois do 2.2.5-RELEASE 225001
2.2-STABLE depois do ldconfig -R merge 225002
2.2.6-RELEASE 226000
2.2.7-RELEASE 227000
2.2-STABLE depois do 2.2.7-RELEASE 227001
2.2-STABLE depois do semctl(2) change 227002
2.2.8-RELEASE 228000
2.2-STABLE depois do 2.2.8-RELEASE 228001
3.0-CURRENT antes da mudança do mount(2) 300000
3.0-CURRENT depois da mudança do mount(2) 300001
3.0-CURRENT depois da mudança do semctl(2) 300002
3.0-CURRENT depois da mudança do arg do ioctl 300003
3.0-CURRENT depois da conversão ELF 300004
3.0-RELEASE 300005
3.0-CURRENT depois do 3.0-RELEASE 300006
3.0-STABLE depois do 3/4 branch 300007
3.1-RELEASE 310000
3.1-STABLE depois do 3.1-RELEASE 310001
3.1-STABLE depois da mudança da ordem do C++ constructor/destructor 310002
3.2-RELEASE 320000
3.2-STABLE 320001
3.2-STABLE depois das mudanças de incompatibilidade-binária do IPFW e socket 320002
3.3-RELEASE 330000
3.3-STABLE 330001
3.3-STABLE depois de adicionar mkstemp(3) a libc 330002
3.4-RELEASE 340000
3.4-STABLE 340001
3.5-RELEASE 350000
3.5-STABLE 350001
4.0-CURRENT depois 3.4 branch 400000
4.0-CURRENT depois da munça no manuseamenteo do linker dinâmico 400001
4.0-CURRENT depois das mudanças da ordem do C++ constructor/destructor 400002
4.0-CURRENT depois do funcionamento do dladdr(3) 400003
4.0-CURRENT depois do conserto do bug do linker dinâmico __deregister_frame_info (também 4.0-CURRENT depois da integração EGCS 1.1.2) 400004
4.0-CURRENT depois da mudança do API do suser(9) (também 4.0-CURRENT após newbus) 400005
4.0-CURRENT depois da mudança da registração do cdevsw 400006
4.0-CURRENT depois da adição do so_cred a credenciais do nível do socket 400007
4.0-CURRENT depois da adição de um poll syscall wrapper to libc_r 400008
4.0-CURRENT depois das mudança do tipo dev_t do kernel ao ponteiro struct specinfo 400009
4.0-CURRENT depois do conserto de um furo no jail(2) 400010
4.0-CURRENT depois da mudança do tipo de dado sigset_t 400011
4.0-CURRENT depois do cutover ao compilador GCC 2.95.2 400012
4.0-CURRENT depois de adicionar pluggable linux-mode ioctl handlers 400013
4.0-CURRENT depois de importar o OpenSSL 400014
4.0-CURRENT depois da mudança do C++ ABI no GCC 2.95.2 de -fvtable-thunks a -fno-vtable-thunks por padrão 400015
4.0-CURRENT depois de importar do OpenSSH 400016
4.0-RELEASE 400017
4.0-STABLE depois do 4.0-RELEASE 400018
4.0-STABLE depois da introdução do checksums atrasado. 400019
4.0-STABLE depois da unir o código libxpg4 dentro da libc. 400020
4.0-STABLE depois de upgrading Binutils a 2.10.0, mudanças do ELF branding, e tcsh na base do sistema. 400021
4.1-RELEASE 410000
4.1-STABLE depois do 4.1-RELEASE 410001
4.1-STABLE depois de movido o setproctitle(3) de libutil a libc. 410002
4.1.1-RELEASE 411000
4.1.1-STABLE depois do 4.1.1-RELEASE 411001
4.2-RELEASE 420000
4.2-STABLE depois das mudanças de combinar libgcc.a e libgcc_r.a, e associado GCC linkage. 420001
4.3-RELEASE 430000
4.3-STABLE depois da introdução do wint_t. 430001
4.3-STABLE depois da unir API powerstate do PCI. 430002
4.4-RELEASE 440000
4.4-STABLE depois da introdução do d_thread_t. 440001
4.4-STABLE depois das mudanças da estrutura do mount (afeta klds do sistemas de arquivo). 440002
4.4-STABLE depois que componetes a nivel de usuário do smbfs foram importados. 440003
4.5-RELEASE 450000
4.5-STABLE depois do renome do elementos da estrutura do usb. 450001
4.5-STABLE depois da variável sendmail_enable rc.conf(5) foi feita pegar o valor NONE. 450004
4.5-STABLE depois de mover o XFree86 4 por padrão para pacotes construidos. 450005
4.5-STABLE depois de accept filtering foi consertado assim que não é mais sucetível a um fácil DoS. 450006
4.6-RELEASE 460000
4.6-STABLE sendfile(2) fixed para comply com a documentação, não para contar quaisquer headers enviado contra a quanrtidade de dados para ser enviado do arquivo. 460001
4.6.2-RELEASE 460002
4.6-STABLE 460100
4.6-STABLE depois do MFC do `sed -i'. 460101
4.6-STABLE depois do MFC de muitas novas características do pkg_install do HEAD. 460102
4.7-RELEASE 470000
4.7-STABLE 470100
Start generated __std{in,out,err}p references rather than __sF. Esta mudança std{in,out,err} de uma expressão de tempo de compilar a um runtime one. 470101
4.7-STABLE depois do MFC das mudanças do mbuf para substituir m_aux mbufs pelo m_tag's 470102
4.7-STABLE obtem o OpenSSL 0.9.7 470103
4.8-RELEASE 480000
4.8-STABLE 480100
4.8-STABLE depois do realpath(3) foi feito thread-safe 480101
4.8-STABLE mudanças da API do 3ware to twe. 480102
4.9-RELEASE 490000
4.9-STABLE 490100
5.0-CURRENT 500000
5.0-CURRENT depois de adicionar adição campos do header do ELF, e mudando ELF binary branding method. 500001
5.0-CURRENT depois da mudança metdata do kld. 500002
5.0-CURRENT depois das mudanças buf/bio. 500003
5.0-CURRENT depois da binutils upgrade. 500004
5.0-CURRENT depois de unir o código libxpg4 dentro da libc e depois da introdução da interface do TASKQ. 500005
5.0-CURRENT depois da adição das interfaces do AGP. 500006
5.0-CURRENT depois do Perl upgrade to 5.6.0 500007
5.0-CURRENT depois da atualização do código do KAME aos fontes 2000/07. 500008
5.0-CURRENT depois das mudanças do ether_ifattach() e ether_ifdetach(). 500009
5.0-CURRENT depois de mudar mtree padrão de volta a variante original, adicionado -L ao seguinte symlinks. 500010
5.0-CURRENT depois da API do kqueue mudou. 500011
5.0-CURRENT depois do setproctitle(3) movido de libutil a libc. 500012
5.0-CURRENT depois do primeiro SMPng commit. 500013
5.0-CURRENT depois do <sys/select.h> movido para <sys/selinfo.h>. 500014
5.0-CURRENT depois de combinar a libgcc.a e libgcc_r.a, and associated GCC linkage changes. 500015
5.0-CURRENT depois da mudança permitindo a libc e libc_r ser linkada juntas, deprecating -pthread option. 500016
5.0-CURRENT after switch from struct ucred to struct xucred to stabilize kernel-exported API for mountd et al. 500017
5.0-CURRENT depois da adição da variável do make CPUTYPE para controlar otimizações específicas-da-CPU. 500018
5.0-CURRENT depois de mover machine/ioctl_fd.h para sys/fdcio.h 500019
5.0-CURRENT after locale names renaming. 500020
5.0-CURRENT depois de importar o Bzip2. Also signifies removal of S/Key. 500021
5.0-CURRENT after SSE support. 500022
5.0-CURRENT after KSE Milestone 2. 500023
5.0-CURRENT after d_thread_t, and moving UUCP to ports. 500024
5.0-CURRENT after ABI change for descriptor and creds passing on 64 bit platforms. 500025
5.0-CURRENT after moving to XFree86 4 by default for package builds, and after the new libc strnstr() function was added. 500026
5.0-CURRENT after the new libc strcasestr() function was added. 500027
5.0-CURRENT after the userland components of smbfs were imported. 500028
5.0-CURRENT after the new C99 specific-width integer types were added. (Not incremented.)
5.0-CURRENT after a change was made in the return value of sendfile(2). 500029
5.0-CURRENT after the introduction of the type fflags_t, which is the appropriate size for file flags. 500030
5.0-CURRENT after the usb structure element rename. 500031
5.0-CURRENT after the introduction of Perl 5.6.1. 500032
5.0-CURRENT after the sendmail_enable rc.conf(5) variable was made to take the value NONE. 500033
5.0-CURRENT after mtx_init() grew a third argument. 500034
5.0-CURRENT with Gcc 3.1. 500035
5.0-CURRENT without Perl in /usr/src 500036
5.0-CURRENT after the addition of dlfunc(3) 500037
5.0-CURRENT after the types of some struct sockbuf members were changed and the structure was reordered. 500038
5.0-CURRENT after headers stopped using _BSD_FOO_T_ and started using _FOO_T_DECLARED. This value can also be used as a conservative estimate of the start of bzip2(1) package support. 500039
5.0-CURRENT after various changes to disk functions were made in the name of removing dependency on disklabel structure internals. 500040
5.0-CURRENT after the addition of getopt_long(3) to libc. 500041
5.0-CURRENT after Binutils 2.13 upgrade, which included new FreeBSD emulation, vec, and output format. 500042
5.0-CURRENT after adding weak pthread_XXX stubs to libc, obsoleting libXThrStub.so. 5.0-RELEASE. 500043
5.0-CURRENT after branching for RELENG_5_0 500100
<sys/dkstat.h> is empty and should not be included. 500101
5.0-CURRENT after the d_mmap_t interface change. 500102
5.0-CURRENT after taskqueue_swi changed to run without Giant, and taskqueue_swi_giant added to run with Giant. 500103
cdevsw_add() and cdevsw_remove() no longer exists. Appearance of MAJOR_AUTO allocation facility. 500104
5.0-CURRENT after new cdevsw initialization method. 500105
devstat_add_entry() has been replaced by devstat_new_entry() 500106
Devstat interface change; see sys/sys/param.h 1.149 500107
Token-Ring interface changes. 500108
Addition of vm_paddr_t. 500109
5.0-CURRENT after realpath(3) has been made thread-safe 500110
5.0-CURRENT after usbhid(3) has been synced with NetBSD 500111
5.0-CURRENT after new NSS implementation and addition of POSIX.1 getpw*_r, getgr*_r functions 500112
5.0-CURRENT after removal of the old rc system. 500113
5.1-RELEASE. 501000
5.1-CURRENT after branching for RELENG_5_1. 501100
5.1-CURRENT after correcting the semantics of sigtimedwait(2) and sigwaitinfo(2). 501101
5.1-CURRENT after adding the lockfunc and lockfuncarg fields to bus_dma_tag_create(9). 501102
5.1-CURRENT after GCC 3.3.1-pre 20030711 snapshot integration. 501103
5.1-CURRENT 3ware API changes to twe. 501104
5.1-CURRENT dynamically-linked /bin and /sbin support and movement of libraries to /lib. 501105
5.1-CURRENT after adding kernel support for Coda 6.x. 501106
5.1-CURRENT after 16550 UART constants moved from <dev/sio/sioreg.h> to <dev/ic/ns16550.h>. Also when libmap functionality was unconditional supported by rtld. 501107
5.1-CURRENT after PFIL_HOOKS API update 501108
5.1-CURRENT after adding kiconv(3) 501109
5.1-CURRENT after changing default operations for open and close in cdevsw 501110
5.1-CURRENT after changed layout of cdevsw 501111
5.1-CURRENT after adding kobj multiple inheritance 501112
5.1-CURRENT after the if_xname change in struct ifnet 501113
5.1-CURRENT after changing /bin and /sbin to be dynamically linked 501114
5.2-RELEASE 502000
5.2-CURRENT after branching for RELENG_5_2 502100
5.2-CURRENT after __cxa_atexit/__cxa_finalize functions were added to libc. 502101

Nota: Note que 2.2-STABLE sometimes se identifica como ``2.2.5-STABLE'' após o 2.2.5-RELEASE. The pattern used para ser anos seguido pelo mês, mas nós decidimos mudá-lo para um mais sistema maior/menor direto iniciando do 2.2. Isto é porque o desenvolvimento paralelo em diversas branches made it infeasible para classificar as releases simplesmente pelas suas datas reais de release. Se você está fazendo um port agora, você não tem que se precocupar sobre old -CURRENTs; eles são listados aqui somente para sua referência.


15.7. Escrevendo algo após bsd.port.mk

Não escreva qualquer coisa após a linha do .include <bsd.port.mk>. Geralmente pode ser evitada incluindo bsd.port.pre.mk em algum lugar no meio de seu Makefile e bsd.port.post.mk no fim.

Nota: Você necessita incluir ambos os par bsd.port.pre.mk/bsd.port.post.mk ou somente bsd.port.mk; não misture este dois usos.

O bsd.port.pre.mk define somente algumas variáveis, que podem ser usadas em testes no Makefile, bsd.port.post.mk define o descanso.

Aqui estão algumas variáveis importantes definidas no bsd.port.pre.mk (esta não é a lista completa, por favor leia bsd.port.mk para a lista completa).

Variável Descrição
ARCH A arquitetura como retornada pelo uname -m (ex., i386)
OPSYS O tipo de sistema operacional, assim retornado pelo uname -s (ex., FreeBSD)
OSREL A versão do release do sistema operacional (ex., 2.1.5 ou 2.2.7)
OSVERSION A versão numérica do sistema operacional, o mesmo que __FreeBSD_version.
PORTOBJFORMAT O formato do objeto do sistema (aout ou elf)
LOCALBASE A base da arvore ``local'' (ex., /usr/local/)
X11BASE A base da arvore do ``X11'' (ex., /usr/X11R6)
PREFIX Onde o port se instala (veja mais em PREFIX).

Nota: Se você tem que definir as variáveis USE_IMAKE, USE_X_PREFIX, ou MASTERDIR, faça assim antes de incluir o bsd.port.pre.mk.

Estão aqui alguns exemplos das coisas que você pode escrever após o bsd.port.pre.mk:

# no need to compile lang/perl5 if perl5 is already in system
.if ${OSVERSION} > 300003
BROKEN= perl is in system
.endif

# only one shlib version number for ELF
.if ${PORTOBJFORMAT} == "elf"
TCL_LIB_FILE=  ${TCL_LIB}.${SHLIB_MAJOR}
.else
TCL_LIB_FILE=  ${TCL_LIB}.${SHLIB_MAJOR}.${SHLIB_MINOR}
.endif

# software already makes link for ELF, but not for a.out
post-install:
.if ${PORTOBJFORMAT} == "aout"
       ${LN} -sf liblinpack.so.1.0 ${PREFIX}/lib/liblinpack.so
.endif

15.8. Instale a documentação adicional

Se seu software tiver alguma documentação outra que o man padrão e páginas de info que você pense que é útil ao usuário, instale-o sob PREFIX/share/doc. Isto pode ser feito, como o item anterior, no post-install target.

Críe um novo diretório para seu port. O nome do diretório deve refletir o que o port é. Isto significa geralmente PORTNAME. Entretanto, se você pensa que o usuário pôde querer versões diferentes do port para ser instalado ao mesmo tempo, você pode usar o PKGNAME inteiro.

Facá as dependências da instalação a variável NOPORTDOCS assim que os usuários podem disabilitá-lo no /etc/make.conf, como este:

post-install:
.if !defined(NOPORTDOCS)
        ${MKDIR} ${DOCSDIR}
        ${INSTALL_MAN} ${WRKSRC}/docs/xvdocs.ps ${DOCSDIR}
.endif

Aqui estão algumas variáveis e como elas são expandidas quando usadas no Makefile:

  • ${DATADIR} começa expandido a ${PREFIX}/share/${PORTNAME}.

  • ${DOCSDIR} começa expandido a ${PREFIX}/share/doc/${PORTNAME}.

  • ${EXAMPLESDIR} começa expandido a ${PREFIX}/share/examples/${PORTNAME}.

Todos arquivos de documentação e diretórios instalados devem ser incluídos no pkg-plist com o prefixo %%PORTDOCS%%, por exemplo:

%%PORTDOCS%%%%DOCSDIR%%/AUTHORS
%%PORTDOCS%%%%DOCSDIR%%/CONTACT
%%PORTDOCS%%@dirrm %%DOCSDIR%%

Você pode também usar o arquivo pkg-message para mostrar mensagens sobre instalação. Veja a seção usando o pkg-message para detalhes.

Nota: pkg-message não necessita ser adicionada ao pkg-plist.


15.9. Subdiretórios

Tente deixar o port colocar coisas no subdiretórios certos do PREFIX. Alguns ports lump tudo e colocam ele no subdiretório com o nome do port, qual está incorreto. Também, muitos ports colocam tudo exceto binários, arquivos header e páginas do manual e um subdiretório do lib, qual não faz bode bem com o paradigma do BSD. Muitos dos arquivos devem ser movidos a um dos seguintes: etc (arquivos de setup/configuração), libexec (executáveis iniciados internamente), sbin (executáveis para superusuários/gerenciadores), info (documentação para navegadores de info) ou share (arquivos independentes de arquitetura). Veja hier(7) para detalhes; as regras governando o /usr muito aplicável ao /usr/local também. A exceção são ports concordam com USENET ``news''. Eles podem usar PREFIX/news como um destino para seus arquivos.


15.10. Cleaning up dos diretórios vazios

Faça seus ports clean up após eles mesmos quando eles são desinstalados. Isto é geralmente acomplished pelo adicionando linhas @dirrm para todos diretórios que são especificamente criados pelo port. Você necessita apagar subdiretórios antes que você possa apagar os diretórios pais.

 :
lib/X11/oneko/pixmaps/cat.xpm
lib/X11/oneko/sounds/cat.au
 :
@dirrm lib/X11/oneko/pixmaps
@dirrm lib/X11/oneko/sounds
@dirrm lib/X11/oneko

Entretanto, as vezes @dirrm dará a você erros porque outros ports também compartilham o mesmo subdiretório. Você pode chamar o rmdir de @unexec para remover somente diretórios vazios sem avisos.

@unexec rmdir %D/share/doc/gimp 2>/dev/null || true

Isto will neither imprimir any mensagens de erro nor cause pkg_delete(1) para sair abnormally even senão está vazio due para outros ports instalando alguns arquivos lá.


15.11. UIDs

Se seu port necessita de um determinado usuário para ser no sistema instalado, deixe o script pkg-install chamar o pw para cria-lo automaticamente. Olhe em net/cvsup-mirror para um exemplo.

Se seu port tem que usar o mesmo numero de ID do usuário/grupo quando ele é instalado como pacote binário como quando ele foi compilado, então você tem que escolher um UID livre de 50 a 999 e registrá-lo abaixo. Olhe em japanese/Wnn para um exemplo.

Certifique-se que você não usa um UID usado já pelo sistema ou outros ports. Esta é a lista atual de UIDs entre 50 e 999.

majordom:*:54:54:Majordomo Pseudo User:/usr/local/majordomo:/nonexistent
cyrus:*:60:60:the cyrus mail server:/nonexistent:/nonexistent
gnats:*:61:1:GNATS database owner:/usr/local/share/gnats/gnats-db:/bin/sh
proxy:*:62:62:Packet Filter pseudo-user:/nonexistent:/nonexistent
uucp:*:66:66:UUCP pseudo-user:/var/spool/uucppublic:/usr/libexec/uucp/uucico
xten:*:67:67:X-10 daemon:/usr/local/xten:/nonexistent
pop:*:68:6:Post Office Owner (popper):/nonexistent:/sbin/nologin
wnn:*:69:7:Wnn:/nonexistent:/nonexistent
pgsql:*:70:70:PostgreSQL pseudo-user:/usr/local/pgsql:/bin/sh
oracle:*:71:71::0:0:Oracle:/usr/local/oracle7:/sbin/nologin
ircd:*:72:72:IRC daemon:/nonexistent:/nonexistent
ircservices:*:73:73:IRC services:/nonexistent:/nonexistent
ifmail:*:75:66:Ifmail user:/nonexistent:/nonexistent
www:*:80:80:World Wide Web Owner:/nonexistent:/sbin/nologin
alias:*:81:81:QMail user:/var/qmail/alias:/nonexistent
qmaild:*:82:81:QMail user:/var/qmail:/nonexistent
qmaill:*:83:81:QMail user:/var/qmail:/nonexistent
qmailp:*:84:81:QMail user:/var/qmail:/nonexistent
qmailq:*:85:82:QMail user:/var/qmail:/nonexistent
qmailr:*:86:82:QMail user:/var/qmail:/nonexistent
qmails:*:87:82:QMail user:/var/qmail:/nonexistent
msql:*:87:87:mSQL-2 pseudo-user:/var/db/msqldb:/bin/sh
mysql:*:88:88:MySQL Daemon:/var/db/mysql:/sbin/nologin
vpopmail:*:89:89:VPop Mail User:/usr/local/vpopmail:/nonexistent
smmsp:*:90:90:Sendmail Queue:/nonexistent:/nonexistent
mailman:*:91:91:Mailman User:/usr/local/mailman:/sbin/nologin
gdm:*:92:92:GDM Sandbox:/:/sbin/nologin
jabber:*:93:93:Jabber Daemon:/nonexistent:/nonexistent
p4admin:*:94:94:Perforce admin:/usr/local/perforce:/sbin/nologin
interch:*:95:95:Interchange user:/usr/local/interchange:/sbin/nologin
squeuer:*:96:96:SQueuer Owner:/nonexistent:/bin/sh
mud:*:97:97:MUD Owner:/usr/local/share/dgd:/bin/sh
rscsi:*:99:99:Remote SCSI:/usr/local/rscsi:/usr/local/sbin/rscsi
fido:*:111:111:Fido System:/usr/local/fido:/bin/sh
ldap:*:389:389:OpenLDAP Server:/nonexistent:/sbin/nologin
drweb:*:426:426:Dr.Web Mail Scanner:/nonexistent:/sbin/nologin
bacula:*:910:910:Bacula Daemon:/var/db/bacula:/sbin/nologin

Por favor inclua uma observação quando você enviar um port (ou um upgrade) que reserve um novo UID ou GID nesta escala. Isto permite-nos manter a lista de IDs reservados atualizados.


15.12. Faça coisas racionalmente

O Makefile deve fazer coisas simples e razoavelmente. Se você pode faze-lo um couple de linhas mais curto ou mais legível, então faça assim. Exemplos incluem usando uma construção do .if do make ao invés de uma construção do if do shell, não redefinindo do-extract se você pode redefinir EXTRACT* ao invés, e usando GNU_CONFIGURE ao invés de CONFIGURE_ARGS += --prefix=${PREFIX}.


15.13. Respeite ambos CC e CXX

O port deve respeitar ambos variáveis CC e CXX. Se ele não faz, por favor adicione NO_PACKAGE=ignora ambos cc ou cxx ao Makefile.

Um exemplo de um Makefile respeitando ambas seguintes variáveis CC e CXX. Note que o ?=:

CC ?= gcc
CXX ?= g++

Aqui está um exemplo qual não respeita as variáveis CC nem CXX:

CC = gcc
CXX = g++

Ambas variáveis CC e CFLAGS podem ser definidas no sistema do FreeBSD no /etc/make.conf. O primeiro exemplo define um valor se ele não foi anteriormente definido no /etc/make.conf, preservando quaisquer definições system-wide. O segundo exemplo clobbers quaisquer coisas anteriormente definidas.


15.14. Respeite as CFLAGS

O port deve respeitas as variáveis CFLAGS. Se ele não faz, por favor adicione NO_PACKAGE=ignores cflags ao Makefile.

Um exemplo de um Makefile respeitando a seguinte variável CFLAGS. Note o +=:

CFLAGS += -Wall -Werror

Aqui está um exemplo qual não respeita a variável CFLAGS:

CFLAGS = -Wall -Werror

A variável CFLAGS é definida no sistema do FreeBSD no /etc/make.conf. O primeiro exemplo appends adicinais flags a variável CFLAGS, preservando quaisquer definições system-wide. O segundo exemplo clobbers quaisquer anteriormente definidos.


15.15. Arquivos de Configuração

Se seu port necessita alguns arquivos de configuração no PREFIX/etc, do not just instale-os e liste-os no pkg-plist. Aquilo fará pkg_delete(1) apagar arquivos cuidadosamente editados pelo usuário e uma nova instalação para wipe them out.

Ao invés, instale arquivos de exemplos com um sufixo (filename.sample funcionará bem) e imprima uma mensagem indicando out que o usuário tem que copiar e editar os arquivos antes que o software possa ser feito para executar.


15.16. Feedback

Envie mudanças/patches aplicáveis ao autor/mantedor original para inclusão no próxima release do código. Isto somente fará seu trabalho muito mais fácil a próxima release.


15.17. README.html

Não inclua o arquivo README.html. Este arquivo não é parte da coleção do cvs mas é gerado usando o comando make readme.


15.18. Marcando um port como BROKEN, FORBIDDEN, ou de outra maneira

Invariavelmente there will come a time quando um port particular conterá uma vulnerabilidade de segurança, será radical broken e necessita de muitas horas de tender loving care, ou está geralmente obsoleto, mas por uma razão ou uma outra deve remain na arvore (e ser consertada, certo?). Para designar um port como broken, há três variáveis make que podem ser usadas em um Makefile do port. O valor das seguintes variáveis do make serão a razão que é given back aos usuários para porque o port foi marcado como broken. Por favor use a variável correta do make assim cada variável do make conveys radicalmente diferentes significados a ambos usuários, e para sistemas automatizados que analise o Makefiles.

  • O BROKEN é reservado para os ports que não funcionam e não devem ser instalados pelos usuários. Isto will prevent usuários de instalarem o port, entretanto, o ports foi marcado como BROKEN ainda será construido pelo Bento cluster. Marque os ports como BROKEN se você quer que os usuários não instalem este port, mas você ainda quer te-lo construido pelo Bento.

  • O FORBIDDEN é usado para os ports que contém uma vulnerabilidade de segurança ou induzir grave interesse a respeito da segurança de um sistema FreeBSD com um given port instalado (ex: a reputably insecure program ou um programa que disponibiliza facilmente serviços exploitáveis). Os ports devem ser marcados como FORBIDDEN assim que um peça particular do software tenha uma vulnerabilidade e não há released upgrade. Idealmente ports devem ser upgraded assim que possível quando uma vulnerabilidade de segurança é discoberta so as to reduce the numero de vulnerabilidades do hosts FreeBSD (nós gostamos de saber para estar seguro), entretanto as vezes há uma noticeable time gap entre descoberta de uma vulnerabilidade e uma release de software atualizado de uma peça do software vulnerável. Não marque um port FORBIDDEN por quaisquer razão outra que segurança.

  • O IGNORE é reservado para ports que não devem ser construidos por uma razão ou uma outra. Usuários e o Bento cluster cluster não farão, sob quaisquer circunstâncias, os ports construidos marcados como IGNORE. Se em dúvida, use IGNORE para prevent um port de ser construido.

Lembre que estas variáveis são para ser usadas como um ultimo recurso se um port não é upgradeable. Permanentemente broken ports devem ser removidos da arvore inteiramente.


15.19. Miscellanea

Os arquivos pkg-descr e pkg-plist cada seve ser verificados-em-dobro. Se você está revendo um port e sente que eles podem ser expremido melhor, faça assim.

Não copie mais copias da Licença Pública Geral do GNU dentro de nosso sistema, por favor.

Por favor seja cuidadoso para anotar quaisquer legal issues! Não deixe-nos distribuir software ilegalmente!


15.20. If you are stuck...

Olhe em exemplos existentes e o arquivo bsd.port.mk antes de nos perguntar! ;-)

Pergunte nos se você tenha qualquer problema! Não só bata sua cabeça contra a parede! :-)


Capítulo 16. Um exemplo de Makefile

Aqui está um exemplo de Makefile that you can use to create a new port. Certifique-se que você remova todos os comentários extras (uns entre brackets)!

Recomenda-se que você siga este formato (ordering of variáveis, linhas vazias entre as seções, etc.). Este formato é projetado de modo que a informação a mais importante seja fácil de localizar. Nós recomendamos que você use portlint para verificar o Makefile.

[the header...just to make it easier for us to identify the ports.]
# New ports collection makefile for:   xdvi
[the "version required" line is only needed when the PORTVERSION
 variable is not specific enough to describe the port.]
# Date created:                26 May 1995
[this is the person who did the original port to FreeBSD, in particular, the
person who wrote the first version of this Makefile.  Remember, this should
not be changed when upgrading the port later.]
# Whom:                        Satoshi Asami <asami@FreeBSD.org>
#
# $FreeBSD$
[ ^^^^^^^^^ This will be automatically replaced with RCS ID string by CVS
when it is committed to our repository.  If upgrading a port, do not alter
this line back to "$FreeBSD$".  CVS deals with it automatically.]
#

[section to describe the port itself and the master site - PORTNAME
 and PORTVERSION are always first, followed by CATEGORIES,
 and then MASTER_SITES, which can be followed by MASTER_SITE_SUBDIR.
 PKGNAMEPREFIX and PKGNAMESUFFIX, if needed, will be after that.
 Then comes DISTNAME, EXTRACT_SUFX and/or DISTFILES, and then
 EXTRACT_ONLY, as necessary.]
PORTNAME=      xdvi
PORTVERSION=   18.2
CATEGORIES=    print
[do not forget the trailing slash ("/")!
 if you are not using MASTER_SITE_* macros]
MASTER_SITES=  ${MASTER_SITE_XCONTRIB}
MASTER_SITE_SUBDIR= applications
PKGNAMEPREFIX= ja-
DISTNAME=      xdvi-pl18
[set this if the source is not in the standard ".tar.gz" form]
EXTRACT_SUFX=  .tar.Z

[section for distributed patches -- can be empty]
PATCH_SITES=   ftp://ftp.sra.co.jp/pub/X11/japanese/
PATCHFILES=    xdvi-18.patch1.gz xdvi-18.patch2.gz

[maintainer; *mandatory*!  This is the person (preferably with commit
 privileges) whom a user can contact for questions and bug reports - this
 person should be the porter or someone who can forward questions to the
 original porter reasonably promptly.  If you really do not want to have
 your address here, set it to "ports@FreeBSD.org".]
MAINTAINER=    asami@FreeBSD.org
COMMENT=       A DVI Previewer for the X Window System

[dependencies -- can be empty]
RUN_DEPENDS=   gs:${PORTSDIR}/print/ghostscript
LIB_DEPENDS=   Xpm.5:${PORTSDIR}/graphics/xpm

[this section is for other standard bsd.port.mk variables that do not
 belong to any of the above]
[If it asks questions during configure, build, install...]
IS_INTERACTIVE=        yes
[If it extracts to a directory other than ${DISTNAME}...]
WRKSRC=                ${WRKDIR}/xdvi-new
[If the distributed patches were not made relative to ${WRKSRC}, you
 may need to tweak this]
PATCH_DIST_STRIP=      -p1
[If it requires a "configure" script generated by GNU autoconf to be run]
GNU_CONFIGURE= yes
[If it requires GNU make, not /usr/bin/make, to build...]
USE_GMAKE=     yes
[If it is an X application and requires "xmkmf -a" to be run...]
USE_IMAKE=     yes
[et cetera.]

[non-standard variables to be used in the rules below]
MY_FAVORITE_RESPONSE=  "yeah, right"

[then the special rules, in the order they are called]
pre-fetch:
        i go fetch something, yeah

post-patch:
        i need to do something after patch, great

pre-install:
        and then some more stuff before installing, wow

[and then the epilogue]
.include <bsd.port.mk>

Capítulo 17. Criação automatizada da lista do pacote

Primeiro, certifique-se que seu port está quase completo, com somente pkg-plist faltando.

Próximo, crie uma arvore de diretório temporário dentro da qual seu port possa ser instalado, e instala quaiquer dependências. port-type deve ser local para ports não-X e x11-4 ou x11 para ports qual instala dentro da hierarquia do diretório do XFree86 4 ou uma anterior XFree86 release, respectivamente.

# mkdir /var/tmp/port-name
# mtree -U -f /etc/mtree/BSD.port-type.dist -d -e -p /var/tmp/port-name
# make depends PREFIX=/var/tmp/port-name

Armazene a estrutura de diretório em um novo arquivo.

# (cd /var/tmp/port-name && find -d * -type d) | sort > OLD-DIRS

Crie um arquivo pkg-plist vazio:

# touch pkg-plist

Se seu port honors PREFIX (which it should) você pode então instalar o port e criar a lista de pacote.

# make install PREFIX=/var/tmp/port-name
# (cd /var/tmp/port-name && find -d * \! -type d) | sort > pkg-plist

Você tem que também adicionar quaiquer diretórios criados recentemente a lista de empacotamento.

# (cd /var/tmp/port-name && find -d * -type d) | sort | comm -13 OLD-DIRS - | sort -r | sed -e 's#^#@dirrm #' >> pkg-plist

Finalmente, você necessita to tidy up a lista de empacotamento pela mão; ele não é todo automatizado. Páginas do manual devem ser listadas no Makefile do port sob MANn, e não na lista de pacotes. Arquivos de configuração do usuário devem ser removidos, ou instalados como filename.sample. O arquivo info/dir não deve ser listado e apropriadas linhas install-info devem ser adicionadas como notas na seção info files. Quaisquer bibliotecas instaladas pelo port devem ser listadas como especificada na seção bibliotecas compartilhadas.

Alternativamente, use o script plist no /usr/ports/Tools/scripts/ para construir a lista de pacote automaticamente.


Capítulo 18. Mudanças a este documento e sistema ports

Se você mantem muitos ports, você deve considerar o seguinte lista de discussão sobre FreeBSD ports e o sistema de ports FreeBSD. Mudanças importantes ao modo que o ports funcione ser anunciado lá. Você pode sempre encontrar mais informações detalhadas das ultimas mudanças olhando em o log CVS do bsd.port.mk.

Outros recursos para assist mantedores do port inclui uma lista de pacotes construindo logs e errors e o exame do distfiles do Ports do FreeBSD.


For questions about the FreeBSD ports system, e-mail <ports@FreeBSD.org>.
For questions about this documentation, e-mail <doc@FreeBSD.org>.