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.