PKGBUILD (Português)
Esse artigo discute variáveis definíveis pelo mantenedor em um PKGBUILD
. Para informações sobre funções do PKGBUILD
e criação de pacotes em geral, veja Criando pacotes. Leia também .
Um PKGBUILD
é um script shell contendo as informações de compilação necessárias por pacotes do Arch Linux.
Pacotes no Arch Linux são compilados usando o utilitário makepkg. Quando makepkg é executado, ele pesquisa por um arquivo PKGBUILD
no diretório atual e segue as instruções dele para compilar ou obter os arquivos para compilar um pacote (). O pacote resultante contém arquivos binários e instruções de instalação, prontos para serem instalados com pacman.
Variáveis obrigatórias são , , pkgrel
e arch
. não é estritamente necessária para compilar um pacote, mas é recomendada para qualquer PKGBUILD
compartilhado com outras pessoas, já que makepkg vai produzir um aviso se não estiver presente.
É uma prática comum definir as variáveis no PKGBUILD
da mesma forma dadas aqui. Porém, isso não é obrigatório, desde que a sintaxe Bash correta seja usada.
Nome do pacote
pkgbase
Ao compilar pacotes comuns, esta variável não deve ser explicitamente declarada no PKGBUILD
: seu valor é padronizado para o do #pkgname.
Ao criar um pacote dividido (split package, em inglês), essa variável pode ser usada para especificar explicitamente o nome a ser usado para se referir ao grupo de pacotes na saída de makepkg e na nomeação de tarballs somente de origem. O valor não é permitido para começar com um hífen. Se não for especificado, o valor será o padrão para o primeiro elemento no vetor .
Todas opções e diretivas para pacotes divididos têm como padrão os valores globais definidos no PKGBUILD
. Mesmo assim, os seguintes podem ser sobrescritos dentro de cada função de empacotameto do pacote dividido: #pkgdesc, #arch, #url, #license, #groups, #depends, #optdepends, #provides, #conflicts, #replaces, #backup, #options, #install e #changelog.
pkgname
O nome do pacote (por exemplo, ) ou, para pacotes divididos, um vetor de nomes (por exemplo, ). Nomes não podem iniciar com hífenes. Por uma questão de consistência, deve corresponder ao nome do tarball fonte do software: por exemplo, se o software está em , use .
Versão
pkgver
A versão do pacote. Ela deve ser a mesma que a versão publicada pelo autor do software upstream. Ela pode conter letras, números, pontos e sublinhados, mas não um hífen (). Se o autor do software usa um hífen, substitua-o com um sublinhado (). Se a variável é usada posteriormente no PKGBUILD
, então o sublinhado pode ser facilmente substituído por um hífen, ex.: .
30102014
, certifique-se de usar a data reversa, i.e. 20141030
(formato ISO 8601). Do contrário, ela não aparecerá como uma versão mais novapkgrel
O número de lançamento. Geralmente é um número inteiro positivo que permite diferenciar entre compilações consecutivas da mesma versão de um pacote. Na medida em que correções e funcionalidades adicionais são adicionadas ao PKGBUILD
que influencie no pacote resultante, pkgrel
deve ser incrementado em 1. Quando uma nova versão do software é lançada, esse valor deve ser redefinido para 1. Em casos excepcionais, outros formatos podem ser encontrados em uso, como em maior.menor.
epoch
Usado para forçar o pacote a ser visto como mais novo do que uma versão anterior com um epoch menor. Esse valor tem que ser um inteiro não negativo; o padrão é 0. É usado quando o esquema de numeração de versão de um pacote muda (ou é alfanumérico), quebrando a lógica de comparação de versão normal. Por exemplo:
Veja para mais informações sobre comparações de versão.
Genérica
pkgdesc
A descrição do pacote. É recomendado no máximo 80 caracteres e não deve incluir o nome do pacote em uma forma autorreferenciativa, a menos que o nome do aplicativo seja diferente do nome do pacote. Por exemplo, use em vez de .
Também é importante usar palavras-chaves com sabedoria para aumentar as chances de aparecer em consultas de pesquisas relevantes.
arch
Um vetor de arquiteturas nas quais o PKGBUILD
deve poder ser compilado e funcionar. Arch oferece suporte oficialmente apenas , mas outros projetos podem oferecer suporte a outras arquiteturas. Por exemplo, Arch Linux 32 fornece suporte a e pentium4
, e Arch Linux ARM forense suporte a (armv5), armv6h
(armv6 hardfloat), (armv7 hardfloat) e (armv8 64-bit).
Há dois tipos de valores que o vetor pode usar:
- indica que o pacote pode ser compilado em uma arquitetura e, após compilado, independe da arquitetura em seu estado compilado (shell scripts, fontes, ema, muitos tipos de extensões etc.).
- com uma ou mais arquiteturas indica que o pacote pode ser compilado para qualquer uma das arquiteturas especificadas, mas é específico da arquitetura depois de compilado. Para esses pacotes, especifique todas as arquiteturas as quais o
PKGBUILD
oficialmente possui suporte. Para repositórios oficiais e pacotes AUR, isso significa x86_64. Opcionalmente, os pacotes AUR podem optar por ter suporte adicional a outras arquiteturas que sabe-se que funcionam.
A arquitetura alvo pode ser acessada com a variável durante uma compilação.
url
A URL do site oficial do software sendo empacotado.
license
A licença sob a qual o software é distribuído. O pacote (uma dependência do metapacote ) contém muitas licenças comumente usadas, que são instaladas em /usr/share/licenses/common
. Se um pacote é licenciado sob uma dessas licenças, o valor deve ser definido para o nome do diretório (ex.: ). Se a licença adequada não estiver incluída, diversas coisas devem ser feitas:
- Adicione
custom
ao vetor . Opcionalmente, você pode substituircustom
com . Uma vez que uma licença é usada em dois ou mais pacotes em um repositório oficial (incluindo repositório community), ela se torna parte do pacote . - Instale a licença em: (ex.: ). Uma boa forma de fazer isso é usando:
- Se a licença é encontrada apenas em um site, então você precisa incluí-la separadamente no pacote.
- As licenças BSD, ISC, MIT, zlib/png, Python e OFL são casos especiais e não podem ser incluídos no pacote , por elas incluírem avisos de direitos autorais (copyright notices) . Para manter a consistência no vetor , é tratado como licença comum (, , ,
license=('ZLIB')
, e ), mas tecnicamente cada uma é uma licença personalizada, porque cada uma possui sua própria linha de copyright. Qualquer pacote licenciado sob essas cinco devem ter um arquivo de licença única armazenada em/usr/share/licenses/pkgname
. - Alguns pacotes podem não estar cobertos por uma única licença. Nestes casos, múltiplas entradas podem ser feitas no vetor como, por exemplo, .
- (L)GPL possui muitas verões e permutações daquelas versões. Para softwares sob (L)GPL, a convenção é:
- (L)GPL — (L)GPLv2 ou qualquer versão posterior
- (L)GPL2 — (L)GPL2 apenas
- (L)GPL3 — (L)GPL3 ou qualquer versão posterior
- Se após pesquisar a questão nenhuma licença puder ser determinada, PKGBUILD.proto sugere . Porém, o upstream deve ser contatado sobre as condições sob as quais o software está (e não está) disponível.
Veja também Diretrizes de pacotes de aplicativos não livres (nonfree).
Informações e perspectivas adicionais sobre licenças de software aberto e livre podem ser encontradas nas seguintes páginas:
groups
O grupo ao qual o pacote pertence. Por exemplo, ao instalar o , ele instala todos os pacotes pertencentes àquele grupo.
Dependências
depends
Um vetor de pacotes que devem ser instalados para o software compilar e executar. Dependências definidas dentro da função são necessárias apenas para executar o software.
Restrições de versões podem ser especificadas com operadores de comparação, como, por exemplo, depends=('foobar>=1.8.0')
; se múltiplas restrições forem necessárias, a dependência pode ser repetida para cada uma, como, por exemplo, .
O vetor deve listar todas as dependências diretas de primeiro nível, mesmo quando algumas já são declaradas transitivamente. Por exemplo, se um pacote foo depende de tanto bar quanto baz, e o pacote bar depende de baz também, acabará levando a um comportamento indesejado se bar parar de depender de baz. O pacman não aplicará a instalação de baz em sistemas que instalaram recentemente o pacote foo ou limparam pacotes órfãos, e o foo falhará durante a execução ou se comportará mal.
Em alguns casos, isso não é necessário e pode ou não estar listado, por exemplo, não pode ser desinstalado, pois todo sistema precisa de alguma biblioteca C ou para um pacote que já depende de outro módulo python-, pois o segundo módulo deve, por definição, depender de python e não pode parar de puxá-lo como uma dependência.
As dependências normalmente devem incluir os requisitos para criar todos os recursos opcionais de um pacote. Como alternativa, qualquer recurso cujas dependências não estejam incluídas deve ser explicitamente desabilitado por meio de uma opção de configuração. A falha em fazer isso pode levar a pacotes com recursos opcionais em tempo de compilação por "dependências automágicas" que são imprevisivelmente ativados devido a dependências transitivas ou softwares não relacionados instalados na máquina de compilação, mas que não são refletidas nas dependências do pacote.
Se o nome da dependência parece ser uma biblioteca, como, por exemplo, depends=('libfoobar.so')
, makepkg vai tentar localizar um binário que depende da biblioteca no pacote compilado e anexar a versão de soname necessária pelo binário. Anexar você mesmo a versão desabilita a detecção automática, como, por exemplo, .
makedepends
Um vetor de pacotes que são necessários apenas para compilar o software. A versão mínima de dependência pode ser especificada no mesmo formato que no vetor . Os pacotes no vetor são implicitamente necessários para compilar o pacote, então eles não devem ser duplicados aqui.
checkdepends
Um vetor de pacotes dos quais o software depende para executar sua suíte de testes, mas que não são necessários em tempo de execução. Pacotes nesta lista seguem o mesmo formato que . Essas dependências são consideradas apenas quando a função check() estiver presente e for ser executada pelo makepkg.
optdepends
Um vetor de pacotes que não são necessários pelo software para funcionar, mas fornecem funcionalidades adicionais. Isso pode implicar em nem todos os executáveis fornecidos por um pacote funcionarem sem a respectiva optdepends. Se o software funciona em múltiplas dependências alternativas, todas elas podem ser listadas aqui, em vez de no vetor .
Uma descrição curta da funcionalidade extra de cada optdepend também deve ser anotado:
optdepends=('cups: printing support' 'sane: scanners support' 'libgphoto2: digital cameras support' 'alsa-lib: sound support' 'giflib: GIF images support' 'libjpeg: JPEG images support' 'libpng: PNG images support')
Relações do pacote
provides
Um vetor de pacotes adicionais dos quais o software fornece as funcionalidades (ou um pacote virtual como o cron
ou ). Pacotes fornecendo o mesmo item podem ser instalados lado a lado, a menos que um deles use um vetor .
conflicts
Um vetor de pacotes que conflitam com, ou causa problemas com o pacote, se instalado. Todos esses pacotes e pacotes fornecendo este item precisarão ser removidos. As propriedades da versão dos pacotes conflitantes também podem ser especificados no mesmo formato que o vetor .
Observe que os conflitos são verificados em relação a , bem como os nomes especificados no vetor . Portanto, se seu pacote um recurso , especificar no vetor causará um conflito entre seu pacote e todos os outros pacotes que contenham em seu vetor (ou seja, você não precisa especificar todos esses nomes de pacotes conflitantes em seu vetor ). Vejamos um exemplo concreto:
- fornece implicitamente
netbeans
como o em si - fornece
netbeans
e conflita comnetbeans
- fornece
netbeans
e conflita comnetbeans
, mas não precisa explicitamente conflitar com já que os pacotes fornecendo os mesmos recursos estão implicitamente em conflito
Quando os pacotes fornecem o mesmo recurso por meio do vetor , há uma diferença entre adicionar explicitamente o pacote alternativo ao vetor e não adicioná-lo. Se o vetor for declarado explicitamente, os dois pacotes que fornecem o mesmo recurso serão considerados como alternativa; se o vetor estiver faltando, os dois pacotes que fornecem o mesmo recurso serão considerados como possivelmente coabitando. Os empacotadores devem sempre ignorar o conteúdo da variável ao decidir se devem ou não declarar uma variável .
replaces
Um vetor de pacotes obsoletos que são substituídos pelo pacote, como, por exemplo, wireshark-qt usa . Ao sincronizar, o pacman vai imediatamente substituir um pacote instalado ao encontrar outro pelo correspondente nos repositórios. Se estiver fornecendo uma versão alternativa de um pacote já existente ou enviando para o AUR, use os vetores e , que são avaliados apenas ao instalar o pacote conflitante.
Outros
backup
Um array de arquivos que contêm alterações feitas pelo usuário e, portanto, devem ser preservados durante a atualização ou remoção de um pacote, destinado principalmente para arquivos em .
Arquivos neste vetor devem usar caminhos relativos sem a barra inicial () (ex.: , em vez de ).
Ao atualizar, novas versões podem ser salvadas como arquivo.pacnew
para evitar sobrescrever um arquivo que já existe e foi previamente modificado pelo usuário. De forma similar, quando o pacote é removido, os arquivos modificados pelo usuário serão preservados como a menos que o pacote tenha sido removido com o comando .
Veja também os arquivos Pacnew e Pacsave.
options
Esse vetor permite sobrescrever alguns dos comportamentos padrões do makepkg, definidos no /etc/makepkg.conf
. Para definir uma opção, inclua o nome no vetor. Para inverter o comportamento, coloque um na frente.
A lista completa das opções disponíveis podem ser localizadas em .
install
O nome do script .install a ser incluído no pacote.
pacman possui a capacidade de armazenar e executar um script específico por pacote durante a instalação, remoção ou atualização de um pacote. O script contém as seguintes funções que são executadas em momentos diferentes:
- — O script é executado logo antes dos arquivos serem extraídos. Um argumento é passado: nova versão do pacote.
- — O script é executado logo após os arquivos serem extraídos. Um argumento é passado: nova versão do pacote.
- — O script é executado logo antes dos arquivos serem extraídos. Dois argumentos são passados na seguinte ordem: nova versão do pacote, versão antiga do pacote.
- — O script é executado logo após os arquivos serem extraídos. Dois argumentos são passados na seguinte ordem: nova versão do pacote, versão antiga do pacote.
- — O script é executado logo antes dos arquivos serem removidos. Um argumento é passado: versão antiga do pacote.
post_remove
— O script é executado logo após os arquivos serem removidos. Um argumento é passado: versão antiga do pacote.
Cada função é executada em chroot dentro do diretório de instalação do pacman. Veja esse tópico.
changelog
O nome do changelog do pacote. Para ver os registros de alterações de pacotes instalados (que tenha esse arquivo):
$ pacman -Qc pkgname
Fontes
source
Um vetor de arquivos necessários para compilar o pacote. Deve conter a localização do fonte do software, que na maioria dos casos é uma URL HTTP ou FTP completa. As variáveis anteriormente definidas e podem ser usadas efetivamente aqui como, por exemplo, .
Os arquivos também podem ser fornecidos no mesmo diretório onde o PKGBUILD
está localizado, e seus nomes adicionados a este vetor. Antes do processo de compilação iniciar, todos os arquivos referenciados neste vetor serão baixados ou verificados pela existência, e o makepkg não dará continuidade, se algum deles estiver faltando.
Arquivos .install são reconhecidos automaticamente pelo makepkg e não devem ser incluídos no vetor de fontes. Arquivos no vetor de fontes com extensões .sig, .sign ou .asc são reconhecidos pelo makepkg como assinaturas PGP e serão usados automaticamente para verificar a integridade do arquivo fonte correspondente.
source=('nome_pacote_único::uri_arquivo')
- por exemplo, source=("$pkgname-$pkgver.tar.gz::https://github.com/codificador/programa/archive/v$pkgver.tar.gz")
.
noextract
Um vetor de arquivos listados sob que não devem ser extraídos de seu formato empacotado pelo makepkg. Isso pode ser usado com pacotes que não podem ser tratados pelo ou aqueles que precisam ser instalado como estão. Se uma ferramenta alternativa de extração for usada (e.g. ), ela deve ser adicionada no vetor e a primeira linha da função prepare() deve extrair manualmente o pacote fonte; por exemplo:
prepare() { lrzip -d source.tar.lrz }
Note que enquanto o vetor aceita URLs, é apenas a porção de nome do arquivo:
source=("http://foo.org/bar/foobar.tar.xz")
noextract=('foobar.tar.xz')
Para extrair nada, você pode fazer alguma coisa como:
- Se contém apenas URLs planas sem nomes de arquivos personalizados, remova do vetor de fontes antes da última barra:
noextract=("${source[@]##*/}")
- Se contiver apenas entradas com nomes de arquivos personalizados, remova o vetor de entrada após o separador (retirado do PKGBUILD do firefox-i18n):
validpgpkeys
Um vetor de impressões digitais PGP. Se usado, makepkg só aceitará assinaturas das chaves listadas aqui e vai ignorar os valores de confiança do chaveiro. Se o arquivo fonte foi assinado com uma subchave, makepkg ainda vai usar a chave primária para comparação.
Apenas impressões digitais completas são aceitas. Elas devem estar em caixa alta e não devem conter caracteres em branco.
Por favor, leia makepkg (Português)#Verificação de assinatura para mais informações.
Integridade
Essas variáveis são vetores cujos itens são strings de checksums (soma de verificação) que serão usadas para verificar a integridade dos respectivos arquivos no vetor source. Você também pode inserir para um arquivo em particular e seu checksum não será testado.
O tipo e os valores da soma de verificação (checksum) devem ser sempre aqueles fornecidos pelo upstream, como nos anúncios de lançamento. Quando vários tipos estão disponíveis, a soma de verificação mais forte deve ser preferida: à sha512
, sha512
à , à , à , à , à md5
e md5
à . Isso garante a integridade dos arquivos baixados, desde o anúncio do upstream até o desenvolvimento de pacotes.
Os valores para essas variáveis podem ser geradas automaticamente pela opção / do makepkg e, então, anexado com . O comando updpkgsums(8) do é capaz de atualizar as variáveis onde quer que elas estejam no PKGBUILD
. Ambas ferramentas usarão a variável que já está definida no PKGBUILD
, ou voltarão para se nada estiver definido.
As verificações de integridade de arquivo a serem usadas podem ser configuradas com a opção no /etc/makepkg.conf
. Veja .
sha256sums_x86_64=()
.md5sums
Um vetor de checksums de MD5 de 128 bits dos arquivos listados no vetor .
sha1sums
Um vetor de checksums de SHA-1 de 160 bits dos arquivos listados no vetor .
sha256sums
Um vetor de checksums de SHA-2 com tamanho de digest de 256 bits.
sha224sums, sha384sums, sha512sums
Um vetor de checksums de SHA-2 com tamanhos de digest 224, 384 e 512 bits, respectivamente. Essas são alternativas mais comuns a .
b2sums
Um vetor de checksums de BLAKE2 com tamanho de digest de 512 bits.
Veja também
- - página de manual do PKGBUILD
- Exemplo de arquivo PKGBUILD