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 PKGBUILD(5).
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 (pkgname.pkg.tar.xz
). 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 pkgname
, pkgver
, pkgrel
e arch
. license
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.
PKGBUILD
s por erros comuns de empacotamento.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 pkgname
.
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, pkgname='foo'
) ou, para pacotes divididos, um vetor de nomes (por exemplo, pkgname=('foo' 'bar')
). Nomes não podem iniciar com hífenes. Por uma questão de consistência, pkgname
deve corresponder ao nome do tarball fonte do software: por exemplo, se o software está em foobar-2.5.tar.gz
, use pkgname=foobar
.
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 pkgver
é usada posteriormente no PKGBUILD
, então o sublinhado pode ser facilmente substituído por um hífen, ex.: source=("$pkgname-${pkgver//_/-}.tar.gz")
.
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 nova- A ordem de valores incomuns pode ser testada com vercmp, que é fornecido pelo pacote pacman.
-
makepkg pode atualizar automaticamente essa variável definindo uma função
pkgver()
noPKGBUILD
. Veja Diretrizes de pacotes VCS#A função pkgver() para detalhes.
pkgrel
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
epoch
só deve ser usado quando absolutamente necessário.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:
pkgver=5.13 pkgrel=2 epoch=1
1:5.13-2
Veja pacman(8) 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 pkgdesc="Text editor for X11"
em vez de pkgdesc="Nedit is a text editor for X11"
.
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 x86_64
, mas outros projetos podem oferecer suporte a outras arquiteturas. Por exemplo, Arch Linux 32 fornece suporte a i686
Arch Linux ARM forense suporte a arm
(armv5), armv6h
(armv6 hardfloat), armv7h
(armv7 hardfloat) e aarch64
(armv8 64-bit).
Há dois tipos de valores que o vetor pode usar:
-
arch=('any')
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.).
-
arch=('x86_64')
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 oPKGBUILD
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 $CARCH
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 licenses (uma dependência do metapacote base) 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.: license=('GPL')
). Se a licença adequada não estiver incluída, diversas coisas devem ser feitas:
- Adicione
custom
ao vetorlicense
. Opcionalmente, você pode substituircustom
comcustom:nome da licença
. 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 licenses. - Instale a licença em:
/usr/share/licenses/pkgname/
(ex.:/usr/share/licenses/foobar/LICENSE
). Uma boa forma de fazer isso é usando:install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
- 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 licenses. Para manter a consistência no vetor
license
, é tratado como licença comum (license=('BSD')
,license=('ISC')
,license=('MIT')
,license=('ZLIB')
,license=('Python')
elicense=('OFL')
), 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
license
como, por exemplo,license=('GPL' "custom:nome da licença")
. - (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
unknown
. Porém, o upstream deve ser contatado sobre as condições sob as quais o software está (e não está) disponível.
ReadMe.txt
comum. Essa informação pode ser extraída para um arquivo separado durante a build()
com alguma coisa como sed -n '/This software/,/ thereof./p' ReadMe.txt > LICENSE
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:
- Wikipedia:pt:Licença de software livre
- Wikipedia:Comparison of free and open-source software licenses
- A Legal Issues Primer for Open Source and Free Software Projects
- Projeto GNU - Várias licenças e comentários sobre elas
- Debian - License information
- Open Source Initiative - Licenses by Name
groups
O grupo ao qual o pacote pertence. Por exemplo, ao instalar o plasma, ele instala todos os pacotes pertencentes àquele grupo.
Dependências
optdepends_x86_64=()
.
depends
Um vetor de pacotes que devem ser instalados para o software compilar e executar. Dependências definidas dentro da função package()
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, depends=('foobar>=1.8.0' 'foobar<2.0.0')
.
O vetor depends
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, glibc não pode ser desinstalado, pois todo sistema precisa de alguma biblioteca C ou python 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, depends=('libfoobar.so=2')
.
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. [1] Se o software funciona em múltiplas dependências alternativas, todas elas podem ser listadas aqui, em vez de no vetor depends
.
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')
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 depends
. Os pacotes no vetor depends
são implicitamente necessários para compilar o pacote, então eles não devem ser duplicados aqui.
$ LC_ALL=C pacman -Si $(pactree -rl ''pacote'') 2>/dev/null | grep -q "^Groups *:.*base-devel"
makedepends
.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 depends
. Essas dependências são consideradas apenas quando a função check() estiver presente e for ser executada pelo makepkg.
checkdepends
.Relações do pacote
conflicts_x86_64=()
.provides
Um vetor de pacotes adicionais dos quais o software fornece as funcionalidades (ou um pacote virtual como o cron
ou sh
). Pacotes fornecendo o mesmo item podem ser instalados lado a lado, a menos que um deles use um vetor conflicts
.
pkgver
e potencialmente o pkgrel
), no caso de pacotes referenciando software que exigem uma. Por exemplo, um pacote modificado do qt na versão 3.3.8, chamado qt-foobar, deve usar provides=('qt=3.3.8')
; omitir o número de versão causaria as dependências a exigir uma versão específica do qt falharia. Não adicione pkgname
ao vetor provides
, pois isso é feito automaticamente.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 depends
.
Isso significa que quando você escreve um pacote para o qual uma versão alternativa está disponível (esteja ela nos pacotes oficiais ou no AUR e seu pacote conflita com aquela versão, você também precisa colocar as outras versões em seu vetor conflicts
.
No entanto, há uma exceção a essa regra. Definir pacotes conflitantes em todas as direções nem sempre é aplicável, especialmente se todos esses pacotes forem mantidos por pessoas diferentes. De fato, ter que entrar em contato com todos os mantenedores de pacotes de pacotes em conflito com sua própria versão e pedir que eles incluam o nome do seu pacote em seu vetor conflicts
é um processo complicado.
É por isso que, neste contexto, se seu pacote fornece provides
um recurso e outro pacote fornece provides
o mesmo recurso, você não precisa especificar aquele pacote conflitante em seu vetor conflicts
. Vejamos um exemplo concreto:
-
netbeans fornece implicitamente
netbeans
como opkgname
em si -
netbeans-javaseAUR[link quebrado: package not found] fornece
netbeans
e conflita comnetbeans
-
netbeans-phpAUR fornece
netbeans
e conflita comnetbeans
, mas não precisa conflitar com netbeans-javaseAUR[link quebrado: package not found] já que o pacman é suficientemente inteligente para descobrir que esses pacotes são incompatíveis, já que eles fornecem as mesmas funcionalidades e estão em conflito com isso.
- O mesmo se aplica no inverso: netbeans-javaseAUR[link quebrado: package not found] também não precisa conflitar com netbeans-phpAUR, porque eles fornecem o mesmo pacote.
replaces
Um vetor de pacotes obsoletos que são substituídos pelo pacote, como, por exemplo, wireshark-qt usa replaces=('wireshark')
. Ao sincronizar, o pacman vai imediatamente substituir um pacote instalado ao encontrar outro pelo replaces
correspondente nos repositórios. Se estiver fornecendo uma versão alternativa de um pacote já existente ou enviando para o AUR, use os vetores conflicts
e provides
, 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 /etc
.
Arquivos neste vetor devem usar caminhos relativos sem a barra inicial (/
) (ex.: etc/pacman.conf
, em vez de /etc/pacman.conf
).
Ao atualizar, novas versões podem ser salvadas como file.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 file.pacsave
a menos que o pacote tenha sido removido com o comando pacman -Rn
.
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 PKGBUILD(5).
install
O nome do script .install a ser incluído no pacote. Este deve ser o mesmo que pkgname
. pacman possui a habilidade 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:
-
pre_install
— O script é executado logo antes dos arquivos serem extraídos. Um argumento é passado: nova versão do pacote. -
post_install
— O script é executado logo após os arquivos serem extraídos. Um argumento é passado: nova versão do pacote. -
pre_upgrade
— 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. -
post_upgrade
— 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. -
pre_remove
— 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.
- Um protótipo de .install é fornecido em /usr/share/pacman/proto.install.
- Hooks do pacman fornecem funcionalidade similar.
exit
. Isso evitaria as funções contidas de serem executadas.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 pkgname
e pkgver
podem ser usadas efetivamente aqui como, por exemplo, source=("https://exemplo.com/$pkgname-$pkgver.tar.gz")
.
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")
.
- Vetores extras específicos por arquitetura podem ser adicionados anexando um sublinhado e o nome da arquitetura, ex.:
x86_64=()
. Deve haver um vetor de integridade correspondente com somas de verificação (checksums), ex.:sha256sums_x86_64=()
. - Alguns servidores restringem download filtrando a string "User-Agent" do cliente, a qual pode ser alterada com DLAGENTS.
noextract
Um vetor de arquivos listados sob source
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 /usr/bin/bsdtar
ou aqueles que precisam ser instalado como estão. Se uma ferramenta alternativa de extração for usada (e.g. lrzip), ela deve ser adicionada no vetor makedepends
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 source
aceita URLs, noextract
é 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
source
contém apenas URLs planas sem nomes de arquivos personalizados, remova do vetor de fontes antes da última barra:
noextract=("${source[@]##*/}")
- Se
source
contiver apenas entradas com nomes de arquivos personalizados, remova o vetor de entrada após o separador::
(retirado do PKGBUILD do firefox-i18n):
noextract=("${source[@]%%::*}")
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.
gpg --list-keys --fingerprint <ID-CHAVE>
para localizar a impressão digital da chave apropriada.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 SKIP
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: sha256
em sha1
e sha1
em 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 -g
/--geninteg
do makepkg e, então, anexado com makepkg -g >> PKGBUILD
. O comando updpkgsums
do pacman-contrib é 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 md5sums
se nada estiver definido.
As verificações de integridade de arquivo a serem usadas podem ser configuradas com a opção INTEGRITY_CHECK
no /etc/makepkg.conf
. Veja makepkg.conf(5).
sha256sums_x86_64=()
.md5sums
Um vetor de checksums de MD5 de 128 bits dos arquivos listados no vetor source
.
sha1sums
Um vetor de checksums de SHA-1 de 160 bits dos arquivos listados no vetor source
.
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 sha256sums
.
b2sums
Um vetor de checksums de BLAKE2 com tamanho de digest de 512 bits.
Veja também
- PKGBUILD(5) - página de manual do PKGBUILD
- Exemplo de arquivo PKGBUILD