Copyright © 2000, 2001, 2002, 2003, 2004 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:
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.
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.
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.
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.
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.
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.
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
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.
So digite make makesum. As regras do make do ports gerará automaticamente o arquivo distinfo.
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
make install
make package
make deinstall
pkg_add package-name
make deinstall
make reinstall
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.
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.
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.
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.
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... :->
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.
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).
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.
The configure target é executado. Isto pode fazer qualquer de várias coisas diferentes.
Se existe, scripts/configure é executado.
Se HAS_CONFIGURE ou GNU_CONFIGURE é definido, WRKSRC/configure é executado.
Se USE_IMAKE é definido, XMKMF (default: xmkmf -a) é executado.
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.
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).
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.
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.
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.
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.
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:
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.
A primeira parte do Makefile do port nomeia o port, descreve seu número da versão, e lista-os na categoria correta.
Você deve definir o PORTNAME ao nome da base de seu port, e PORTVERSION ao número da versão do port.
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.
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.
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.
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.
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.
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.
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).
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.
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.
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.
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 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. |
| 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. |
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.
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.
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).
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.
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.
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}.
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=
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.
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.
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.
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.
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).
Elementos postfixed com :n pertencem ao grupo n, :m pertencem ao grupo m e assim quarto.
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
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.
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
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.
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:
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
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.
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.
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.
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.
New port targets
Há 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.
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.
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.
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 <portmgr@FreeBSD.org>, ou o
Security Officer Team <security-officer@FreeBSD.org>. Nenhum
desautorizado commits pode ser feito aos ports mantidos por aqueles grupos.
O Ports Management Team <portmgr@FreeBSD.org> reserva o direito para
revogar ou sobrescrever qualquer maintainership por qualquer razão, e o Security Officer
Team <security-officer@FreeBSD.org> reserva
o direito para revogar ou sobrescrever maintainership por razões da segurança.
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.
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.
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.
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.
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
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.
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.
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.)
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.
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.
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.
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}
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
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.
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.
Há algumas mais coisas que você tem que take into account quando você cria um port. Esta seção explica o mais comum daquelas.
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.
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.
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.
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.
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.
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}.
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. |
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. |
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. |
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.
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. |
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.
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.
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).
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).
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.
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.
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.
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.
Há alguns truques que nós não mencionamos ainda sobre os arquivos pkg-* que vem acessível às vezes.
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.
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.
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.
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.
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.
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.
Verifique seu trabalho com o portlint antes que você o envie ou commit.
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.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.
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
<portmgr@FreeBSD.org>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.
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.
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.
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.
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.
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.
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.
| 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.
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
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.
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.
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á.
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.
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}.
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.
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.
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.
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.
Não inclua o arquivo README.html. Este arquivo não é parte da coleção do cvs mas é gerado usando o comando make readme.
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.
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!
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! :-)
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>
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.
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.