PKGBUILD - Arquivo de descrição de
compilação de pacotes
Esta página do manual descreve as regras gerais sobre
PKGBUILDs. Uma vez que um PKGBUILD é escrito, o pacote real é
compilado usando makepkg e instalado com pacman.
Nota
Um exemplo de PKGBUILD, útil para referência,
está localizado em /usr/share/pacman junto com outros arquivos
de exemplo, como um script de instalação. Você pode
copiar o arquivo PKGBUILD.proto fornecido para um novo diretório de
compilação de pacote e fazer personalizações
para atender às suas necessidades.
A seguir está uma lista de opções e diretivas
padrão disponíveis para uso em um PKGBUILD. Todos eles
são compreendidos e interpretados pelo makepkg, e a maioria deles
será transferida diretamente para o pacote compilado. Os campos
obrigatórios para um PKGBUILD minimamente funcional são
pkgname, pkgver, pkgrel e arch.
Se você precisar criar qualquer variável
personalizada para uso em seu processo de compilação, é
recomendado prefixar seu nome com um _ (sublinhado). Isso
evitará qualquer conflito de nome possível com
variáveis internas do makepkg. Por exemplo, para armazenar a
versão base do kernel em uma variável, use algo semelhante a
$_basekernver.
pkgname (array)
O nome do pacote ou um array de nomes para pacotes
divididos. Os caracteres válidos para membros deste array são
alfanuméricos e qualquer um dos seguintes caracteres: “@ . _ +
-”. Além disso, os nomes não podem começar com
hífenes ou pontos.
pkgver
A versão do software conforme lançada pelo
autor (por exemplo,
2.7.1). A variável não pode conter
dois pontos, barras, hífenes ou espaços em branco.
A variável pkgver pode ser atualizada automaticamente
fornecendo uma função pkgver() no PKGBUILD que produz a nova
versão do pacote. Isso é executado após o download e a
extração de fontes e a execução da
função prepare() (se houver), para que possa usar esses
arquivos para determinar o novo pacote. Isso é mais útil
quando usado com fontes de sistemas de controle de versão (veja
abaixo).
pkgrel
Este é o número de lançamento
específico para a distribuição. Isso permite que os
mantenedores do pacote façam atualizações nos
sinalizadores de configuração do pacote, por exemplo. Isso
normalmente é definido como 1 para cada nova versão de
software upstream e incrementado para atualizações
intermediárias de PKGBUILD. A variável é positiva
inteiro, com um nível de sub-lançamento opcional especificado
pela adição de outro inteiro positivo separado por um ponto (ou
seja, na forma x.y).
epoch
Usado para forçar o pacote a ser visto como mais
novo do que qualquer versão anterior com uma época inferior,
mesmo se o número da versão normalmente não acionaria tal
atualização. Este valor deve ser um número inteiro
positivo; o valor padrão se não for especificado é
0. Isso é útil 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. Veja
pacman(8) para mais
informações sobre comparações de
versão.
pkgdesc
Esta deve ser uma breve descrição do pacote
e sua funcionalidade. Tente manter a descrição em uma linha de
texto e não usar o nome do pacote.
url
Este campo contém uma URL que está
associado ao software sendo empacotado. Normalmente é o site do projeto
.
license (array)
Este campo especifica as licenças que se aplicam
ao pacote. Se múltiplas licenças forem aplicáveis, lista
todas elas: license=('GPL' 'FDL').
install
Especifica um script de instalação especial
que deve ser incluído no pacote. Este arquivo deve residir no mesmo
diretório que o PKGBUILD e será copiado para o pacote por
makepkg. Não precisa ser incluído no array de fontes (por
exemplo, install=$pkgname.install).
changelog
Especifica um arquivo changelog que deve ser
incluído no pacote. O arquivo changelog deve terminar com uma
única nova linha. Este arquivo deve residir no mesmo diretório
que o PKGBUILD e será copiado para o pacote pelo makepkg. Não
precisa ser incluído no array de fontes (por exemplo,
changelog=$pkgname.changelog).
source (array)
Um array de arquivos fonte necessários para
compilar o pacote. Os arquivos fonte devem residir no mesmo diretório
que o PKGBUILD ou ser uma URL totalmente qualificada que o makepkg pode usar
para baixar o arquivo. Para simplificar a manutenção de
PKGBUILDs, use as variáveis $pkgname e $pkgver ao especificar o local
do download, se possível. Os arquivos compactados serão
extraídos automaticamente, a menos que sejam encontrados no array
noextract descrito abaixo.
Fontes adicionais específicas da arquitetura podem ser
adicionadas anexando um sublinhado e o nome da arquitetura, como, por
exemplo, source_x86_64=(). Deve haver uma array de integridade
correspondente com somas de verificação, por exemplo,
cksums_x86_64=().
Também é possível alterar o nome do arquivo
baixado, o que é útil com URLs estranhas e para lidar com
vários arquivos fonte com o mesmo nome. A sintaxe é:
source=('nomedoarquivo::url').
makepkg também oferece suporte à
compilação de versões de desenvolvimento de pacotes
usando fontes baixadas de sistemas de controle de versão (VCS). Para
obter mais informações, consulte Usando fontes VCS abaixo.
Os arquivos no array fonte 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.
validpgpkeys (array)
Um array de impressões digitais PGP. Se este array
não estiver vazio, makepkg só aceitará assinaturas das
chaves listadas aqui e irá ignorar os valores de confiança do
chaveiro. Se o arquivo fonte foi assinado com uma subchave, makepkg ainda
usará a chave primária para comparação.
Somente impressões digitais completas são aceitas.
Elas devem estar em maiúsculas e não devem conter caracteres
de espaço em branco.
noextract (array)
Um array de nomes de arquivos correspondentes aos do
array fonte. Os arquivos listados aqui não serão
extraídos com o restante dos arquivos fonte. Isso é útil
para pacotes que usam dados compactados diretamente.
cksums (array)
Este array contém somas de
verificação CRC para cada arquivo fonte especificado no array de
fontes (na mesma ordem). makepkg usará isso para verificar a
integridade do arquivo fonte durante as compilações
subsequentes. Se SKIP for colocado no array no lugar de um hash normal,
a verificação de integridade desse arquivo fonte será
ignorada. Para gerar facilmente cksums, execute “makepkg -g >>
PKGBUILD”. Se desejar, mova a linha ck5sums para um local apropriado.
Note que somas de verificação gerados por "makepkg -g"
devem ser verificados usando valores de soma de verificação
fornecido pelo desenvolvedor do software.
md5sums, sha1sums, sha224sums, sha256sums, sha384sums,
sha512sums, b2sums (arrays)
Verificações de integridade alternativas
aceitas pelo makepkg; todos elas se comportam de forma semelhante à
opção cksums descrita acima. Para habilitar o uso e
geração dessas somas de verificação, certifique-se
de configurar a opção INTEGRITY_CHECK em
makepkg.conf(5).
groups (array)
Um array de nomes simbólicos que representam
grupos de pacotes, permitindo que você instale vários pacotes
solicitando um único destino. Por exemplo, pode-se instalar todos os
pacotes do KDE instalando o grupo kde.
arch (array)
Define em quais arquiteturas o pacote fornecido
está disponível (por exemplo, arch=('i686' 'x86_64')). Pacotes
que não contêm arquivos específicos de arquitetura deve
usar arch=('any'). Os caracteres válidos para membros desta matriz
são alfanuméricos e “_”.
backup (array)
Um array de nomes de arquivo, sem barras no
início, cujo backup deve ser feito se o pacote for removido ou
atualizado. Isso é comumente usado para pacotes que colocam arquivos de
configuração em
/etc. Veja
"Manipulação de Arquivos de
Configuração" em
pacman(8) para mais
informações.
depends (array)
Um array de pacotes dos quais este pacote depende para
executar. As entradas nesta lista devem ser colocadas entre aspas simples e
conter pelo menos o nome do pacote. As inscrições também
podem incluir um requisito de versão no formato
nome<>versão, onde <> é uma das cinco
comparações: >= (maior ou igual a), <= (menor ou igual a),
= (igual a), > (maior que) ou < (menor que).
Dependências específicas da arquitetura adicionais
podem ser adicionadas anexando um sublinhado e o nome da arquitetura, por
exemplo, depends_x86_64=().
makedepends (array)
Um array de pacotes dos quais este pacote depende para
compilar, mas não são necessários em tempo de
execução. Os pacotes nesta lista seguem o mesmo formato que o
array depends.
Outros makedepends específicos de arquitetura podem ser
adicionados anexando um sublinhado e o nome da arquitetura, por exemplo,
makedepends_x86_64=().
checkdepends (array)
Um array de pacotes dos quais este pacote depende para
executar seu conjunto de testes, mas não são necessários
em tempo de execução. Os pacotes nesta lista seguem o mesmo
formato que depends. Essas dependências são consideradas apenas
quando a função check() está presente e deve ser
executada por makepkg.
Outros checkdepends específicos da arquitetura podem ser
adicionados anexando um sublinhado e o nome da arquitetura, por exemplo,
checkdepends_x86_64=().
optdepends (array)
Um array de pacotes (e os motivos que os acompanham) que
não são essenciais para a funcionalidade básica, mas
podem ser necessários para fazer uso completo do conteúdo deste
pacote. optdepends são atualmente apenas para fins informativos e
não são utilizados pelo pacman durante a resolução
de dependência. Os pacotes nesta lista seguem o mesmo formato que
depende, com uma descrição opcional anexada. O formato para
especificar as descrições optdepends é:
optdepends=('python: for library bindings')
Opções adicionais específicas da arquitetura
podem ser adicionadas anexando um sublinhado e o nome da arquitetura, por
exemplo, optdepends_x86_64=().
conflicts (array)
Um array de pacotes que entrarão em conflito com
este pacote (ou seja, eles não podem ser instalados ao mesmo tempo).
Esta diretiva segue o mesmo formato que depends. Conflitos versionados
são suportados usando os operadores conforme descrito em depends.
Conflitos específicos de arquitetura adicionais podem ser
adicionados anexando um sublinhado e o nome da arquitetura, por exemplo,
conflicts_x86_64=().
provides (array)
Um array de “provisões virtuais” que
este pacote oferece. Isso permite que um pacote forneça
dependências diferentes de seu próprio nome de pacote. Por
exemplo, o pacote dcron pode fornecer
cron, que permite que os pacotes
dependam do
cron em vez de
dcron OU fcron.
Provisões versionadas também são
possíveis, no formato nome=versão. Por exemplo, dcron
pode fornecer cron=2.0 para satisfazer a dependência
cron>=2.0 de outros pacotes. As disposições que
envolvem os operadores > e < são inválidas, pois apenas
versões específicas de um pacote podem ser fornecidas.
Provisões específicas de arquitetura adicionais
podem ser adicionadas anexando um sublinhado e o nome da arquitetura, por
exemplo, provides_x86_64=().
replaces (array)
Um array de pacotes que este pacote deve substituir. Isso
pode ser usado para lidar com pacotes renomeados/combinados. Por exemplo, se o
pacote
j2re for renomeado para
jre, esta diretiva permite que
atualizações futuras continuem conforme o esperado, mesmo que o
pacote tenha sido movido. Há suporte a substituições
versionadas ao usar os operadores conforme descrito em depends.
O sysupgrade é atualmente a única
operação pacman que utiliza este campo. Uma
sincronização ou atualização normal não
usará seu valor.
Substituições específicas de arquitetura
adicionais podem ser adicionadas anexando um sublinhado e o nome da
arquitetura, por exemplo, replaces_x86_64=().
options (array)
Este array permite que você substitua alguns dos
comportamentos padrão do makepkg ao compilar pacotes. Para definir uma
opção, apenas inclua o nome da opção na array de
opções. Para reverter o comportamento padrão, coloque um
“!” na frente da opção. Especifique apenas as
opções que deseja substituir, o resto será obtido de
makepkg.conf(5).
NOTA: force é uma
opção agora removida em favor da variável de nível
superior
epoch.
strip
Retira símbolos de binários e bibliotecas.
Se você usa frequentemente um depurador em programas ou bibliotecas,
pode ser útil desabilitar esta opção.
docs
Armazena diretórios de documentação.
Se você deseja excluir diretórios doc, especifique !docs no
array.
libtool
Deixa arquivos libtool (.la) nos pacotes. Especifique
!libtool para removê-los.
staticlibs
Deixa os arquivos de biblioteca estática (.a) nos
pacotes. Especifique !staticlibs para removê-los (se eles tiverem uma
contraparte compartilhada).
emptydirs
Deixa diretórios vazios nos pacotes.
zipman
Comprime páginas man e info com gzip.
ccache
Permite o uso de ccache durante o build(). Mais
útil em sua forma negativa !ccache com pacotes selecionados que
têm problemas de compilação com ccache.
distcc
Permite o uso de distcc durante o build(). Mais
útil em sua forma negativa !distcc com pacotes selecionados que
têm problemas de compilação com distcc.
buildflags
Permite o uso de buildflags específicos do
usuário (CPPFLAGS, CFLAGS, CXXFLAGS, LDFLAGS) durante o build()
conforme especificado no
makepkg.conf(5). Mais útil em sua forma
negativa !buildflags com pacotes selecionados que têm problemas de
compilação com buildflags personalizados.
makeflags
Permite o uso de makeflags específicos do
usuário durante o build() conforme especificado no
makepkg.conf(5). Mais útil em sua forma negativa !makeflags com
pacotes selecionados que têm problemas para compilar com makeflags
personalizados como -j2 (ou superior).
debug
Adiciona os sinalizadores de depuração
especificados pelo usuário (DEBUG_CFLAGS, DEBUG_CXXFLAGS) aos seus
buildflags correspondentes, conforme especificado em
makepkg.conf(5).
Quando usado em combinação com a opção
‘strip’, um pacote separado contendo os símbolos de
depuração é criado.
lto
Habilita compilação de pacotes usando
otimização em tempo de vinculação (link time
optimization). Adiciona -flto a CFLAGS e CXXFLAGS.
Além das diretivas acima, PKGBUILDs exigem um conjunto de
funções que fornecem instruções para compilar e
instalar o pacote. No mínimo, o PKGBUILD deve conter uma
função package() que instala todos os arquivos do pacote no
diretório de empacotamento, com funções opcionais
prepare(), build() e check() sendo usadas para criar esses arquivos a partir
do código-fonte.
Ele é obtido e executado diretamente pelo makepkg,
portanto, qualquer coisa que o Bash ou o sistema tenha disponível
está disponível para uso aqui. Certifique-se de que quaisquer
comandos exóticos usados sejam cobertos pelo array
makedepends.
Se você criar qualquer variável própria em
qualquer uma dessas funções, é recomendável usar
a palavra-chave local do Bash para definir o escopo da variável
dentro da função.
Função package()
A função package() é usada para
instalar arquivos no diretório que se tornará o diretório
raiz do pacote compilado e é executada após todas as
funções opcionais listadas abaixo. O estágio de
empacotamento é executado usando fakeroot para garantir as
permissões de arquivo corretas no pacote resultante. Todas as outras
funções serão executadas como o usuário chamando
makepkg. Esta função é executada dentro de $srcdir.
Função verify()
Uma função opcional verify() pode ser
especificada para implementar autenticação de origem
arbitrária. A função deve retornar um código de
saída diferente de zero quando a verificação falhar. Esta
função é executada antes que as fontes sejam
extraídas. Esta função é executada dentro de
$startdir.
Função prepare()
Uma função opcional prepare() pode ser
especificada na qual operações para preparar fontes para
compilação, como aplicação de patches, são
realizadas. Esta função é executada após a
extração de fonte e antes da função build(). A
função prepare() é ignorada quando a
extração de fonte é ignorada. Esta função
é executada dentro de $srcdir.
Função build()
A função opcional build() é usada
para compilar e/ou ajustar os arquivos fontes na preparação para
serem instalados pela função package(). Esta
função é executada dentro de $srcdir.
Função check()
Uma função opcional check() pode ser
especificada na qual um conjunto de testes do pacote pode ser executado. Esta
função é executada entre as funções build()
e package(). Certifique-se de que todos os comandos exóticos usados
sejam cobertos pelo array checkdepends. Esta
função é executada dentro de $srcdir.
Todas as variáveis acima, como $pkgname e
$pkgver, estão disponíveis para uso nas funções
de empacotamento. Além disso, makepkg define as seguintes
variáveis:
srcdir
Contém o diretório onde makepkg extrai, ou
copia, todos os arquivos fonte.
pkgdir
Contém o diretório onde makepkg empacota o
pacote instalado. Este diretório se tornará o diretório
raiz do seu pacote compilado. Esta variável deve ser usada apenas na
função package().
startdir
Contém o caminho absoluto para o diretório
onde o PKGBUILD está localizado, que normalmente é a
saída de $(pwd) quando o makepkg é iniciado. O uso desta
variável foi descontinuado e fortemente desencorajado.
makepkg oferece suporte à compilação de
múltiplos pacotes de um único PKGBUILD. Isso é obtido
atribuindo um array de nomes de pacotes à diretiva pkgname. Cada
pacote dividido usa uma função de empacotamento correspondente
com o nome package_foo(), onde foo é o nome do pacote dividido.
Todas as opções e diretivas para os pacotes
divididos são padronizados para os valores globais fornecidos no
PKGBUILD. No entanto, os seguintes podem ser substituídos dentro da
função de empacotamento de cada pacote dividido: pkgdesc,
arch, url, license, groups, depends, optdepends, provides, conflicts,
replaces, backup, options, install e changelog.
Note que makepkg não considera as dependências de um
pacote dividido específico ao verificar se as dependências
estão instaladas antes da compilação do pacote e com
--syncdeps. Todos os pacotes necessários para compilar o pacote devem
ser especificados nos arrays globais depends e makedepends.
Uma diretiva global opcional está disponível ao
compilar um pacote dividido:
pkgbase
O nome usado para se referir ao grupo de pacotes na
saída do makepkg e na nomenclatura de tarballs apenas com o
código-fonte. Se não for especificado, o primeiro elemento no
array pkgname é usado. Os caracteres válidos para esta
variável são alfanuméricos e qualquer um dos seguintes
caracteres: “@ . _ + -”. Além disso, a variável
não pode começar com hífenes ou pontos.
Pacman tem a capacidade de armazenar e executar um script
específico do pacote ao instalar, remover ou atualizar um pacote.
Isso permite que um pacote se configure após a
instalação e execute uma ação oposta na
remoção.
A hora exata em que o script é executado varia com cada
operação e deve ser autoexplicativa. Observe que durante uma
operação de atualização, nenhuma das
funções de instalação ou remoção
será chamada.
Os scripts são passados por uma ou duas
“strings de versão completa”, onde uma string de
versão completa é pkgver-pkgrel ou
epoch:pkgver-pkgrel, se epoch for diferente de zero.
pre_install
Executa imediatamente antes dos arquivos serem
extraídos. Um argumento é passado: string de versão
completa do pacote novo.
post_install
Executa imediatamente após os arquivos serem
extraídos. Um argumento é passado: string de versão
completa do pacote novo.
pre_upgrade
Executa imediatamente antes dos arquivos serem
extraídos. Dois argumentos são passados nesta
ordem: string da versão completa do pacote novo, string da
versão completa do pacote antigo.
post_upgrade
Executa após os arquivos serem extraídos.
Dois argumentos são passados nesta ordem: string da
versão completa do pacote novo, string da versão completa do
pacote antigo.
pre_remove
Executa imediatamente antes dos arquivos serem removidos.
Um argumento é passado: string de versão completa do pacote
antigo.
post_remove
Executa logo após os arquivos serem removidos. Um
argumento é passado: string de versão completa do pacote
antigo.
Para usar esse recurso, crie um arquivo como
pkgname.install e coloque-o no mesmo diretório do script
PKGBUILD. Em seguida, use a diretiva de instalação:
O script de instalação não precisa ser
especificado no array de fontes. Um arquivo de instalação de
modelo está disponível em /usr/share/pacman como
proto.install para referência com todas as
funções disponíveis definidas.
A compilação de uma versão de desenvolvimento
de um pacote usando fontes de um sistema de controle de versão (VCS)
é habilitada especificando a fonte no formato:
source=('diretório::url#fragmento?consulta')
Atualmente, o makepkg tem suporte aos sistemas de controle de
versão Bazaar, Git, Subversion, Fossil e Mercurial. Para outros
sistemas de controle de versão, a clonagem manual dos
repositórios upstream deve ser feita na função
prepare().
Algumas fontes VCS, como o Git, suportam a fixação
do checkout por uma soma de verificação de seu conteúdo
usando funcionalidade de exportação determinística como
“git archive”.
O URL de fonte é dividido em quatro componentes:
diretório
(opcional) Especifica um nome de diretório
alternativo para makepkg para baixar o código-fonte de VCS.
url
A URL para o repositório VCS. Isso deve incluir o
VCS no protocolo de URL para makepkg para reconhecê-lo como uma fonte
VCS. Se o protocolo não incluir o nome VCS, ele pode ser adicionado
prefixando a URL com vcs+. Por exemplo, usar um repositório Git sobre
HTTPS teria uma URL de fonte no formato: git+https://....
fragmento
(opcional) Permite especificar um número de
revisão ou branch para makepkg para checkout do VCS. Um fragmento tem o
formato tipo=valor.Por exemplo, para fazer o checkout de uma determinada
revisão, a linha de fonte teria o formato source=(url#revision=123). Os
tipos disponíveis dependem do VCS sendo usado:
bzr
revisão (veja 'bzr help revisionspec' para
detalhes)
fossil
branch, commit, tag
git
branch, commit, tag
hg
branch, revisão, tag
svn
revisão
consulta
(opcional) Permite especificar se um checkout VCS deve
ser verificado para revisões assinadas por PGP. A linha de origem deve
ter o formato source=(url#fragmento?assinada) ou
source=(url?assinada#fragmento). Atualmente há suporte apenas para
Git.
A seguir está um exemplo de PKGBUILD para o pacote de
patch. Para mais exemplos, dê uma olhada nos arquivos de
compilação dos pacotes de sua distribuição.
# Maintainer: João Usuário <joao.usuario@example.com>
pkgname=patch
pkgver=2.7.1
pkgrel=1
pkgdesc="A utility to apply patch files to original sources"
arch=('i686' 'x86_64')
url="https://www.gnu.org/software/patch/patch.html"
license=('GPL')
groups=('base-devel')
depends=('glibc')
makedepends=('ed')
optdepends=('ed: for "patch -e" functionality')
source=("ftp://ftp.gnu.org/gnu/$pkgname/$pkgname-$pkgver.tar.xz"{,.sig})
sha256sums=('9124ba46db0abd873d0995c2ca880e81252676bb6c03e0a37dfc5f608a9b0ceb'
'SKIP')
build() {
cd "$srcdir/$pkgname-$pkgver"
./configure --prefix=/usr
make
}
package() {
cd "$srcdir/$pkgname-$pkgver"
make DESTDIR="$pkgdir/" install
}
makepkg(8), pacman(8), makepkg.conf(5)
Consulte o site do pacman em https://archlinux.org/pacman/ para
obter informações atuais sobre o pacman e suas ferramentas
relacionadas.
Bugs? Você deve estar brincando; não há erros
neste software. Mas se por acaso estivermos errados, relate-os no rastreador
problemas em https://gitlab.archlinux.org/pacman/pacman/-/issues com
informações específicas tal como sua linha de comando,
a natureza do erro e até mesmo a base de dados se isso ajudar.
Atuais mantenedores:
•Allan McRae <allan@archlinux.org>
•Andrew Gregory
<andrew.gregory.8@gmail.com>
•Morgan Adamiec
<morganamilo@archlinux.org>
Principais colaboradores anteriores:
•Judd Vinet <jvinet@zeroflux.org>
•Aurelien Foret
<aurelien@archlinux.org>
•Aaron Griffin <aaron@archlinux.org>
•Dan McGee <dan@archlinux.org>
•Xavier Chantry <shiningxc@gmail.com>
•Nagy Gabor <ngaba@bibl.u-szeged.hu>
•Dave Reisner <dreisner@archlinux.org>
•Eli Schwartz
<eschwartz@archlinux.org>
Para outros contribuidores, use git shortlog -s no
repositório pacman.git.
A tradução para português brasileiro desta
página man foi criada por Rafael Fontenelle
<rafaelff@gnome.org>
Esta tradução é uma
documentação livre; leia a
Licença
Pública Geral GNU Versão 3 ou posterior para as
condições de direitos autorais. Nenhuma responsabilidade
é aceita.
Se você encontrar algum erro na tradução
desta página de manual, envie um e-mail para
a lista
de discussão de tradutores.