Meson package guidelines (Português)
32-bit – CLR – CMake – Cross – DKMS – Eclipse – Electron – Fonte – Free Pascal – GNOME – Go – Haskell – Java – KDE – Kernel – Lisp – Meson – MinGW – Node.js – Nonfree – OCaml – Perl – PHP – Python – R – Ruby – Rust – Shell – VCS – Web – Wine
- O Meson é um sistema de compilação, de código aberto, destinado a ser extremamente rápido e, ainda mais importante, o mais amigável possível.
Escrito em Python, o Meson oferece suporte a várias plataformas, suporta várias linguagens de programação, compilação cruzada e muito mais.
Meson não compila softwares diretamente, mas configura um sistema de compilação de back-end. Embora seja comumente usado com o ninja, outros sistemas de compilação podem ser usados. É comumente usado para substituir Sistema de Compilação do GNU.
Este documento cobre padrões e diretrizes para escrever PKGBUILDs para softwares eu usam Meson.
Uso
Requisitos
meson deve ser incluído ao vetor makedepends do PKGBUILD.
prepare()
O Meson inclui uma utilidade para gerir subprojects, permitindo fazer download dos subprojects antes da configuração. Correr esta utilidade em prepare() permite que build() e as etapas seguintes possam correr inteiramente offline.
Exemplo:
prepare() { meson subprojects download --sourcedir=source }
build()
A configuração e compilação é normalmente feita usando o binário meson, mas também pode ser feita usando o script wrapper arch-meson do Arch Linux.
Os comandos meson e arch-meson incluem na sintaxe de uso opções, diretório de fontes e diretório de compilação:
- opções: deve incluir pelo menos
--prefix /usr
, mas certifique-se de verificar outras opções commeson configure --help
; também verifique opções de compilação específicas do software. - diretório de fontes (ou "sourcedir"): onde o código-fonte do projeto está armazenado como, por exemplo, em
.
,$pkgname
ou$pkgname-$pkgver
. - diretório de compilação (ou "builddir"): onde os arquivos de compilação serão armazenados pelo Meson; comumente chamado de
build
ou_build
, mas é discricionário.
Usando o binário meson diretamente
Observe que --prefix=/usr
sempre precisa ser passado para o binário meson porque os pacotes do Arch Linux não devem instalar arquivos em /usr/local
, de acordo com Diretrizes de pacotes do Arch#Etiqueta de pacotes. A opção embutida --buildtype=plain
pode ser definida com outro valor, se você sabe o que está fazendo.
Exemplo:
build() { meson --prefix=/usr --buildtype=plain source build meson compile -C build }
meson compile
é um wrapper para os sistemas de compilação de back-end suportados, o que geralmente tem como padrão o ninja[1]
ninja -C build
poderia ser usado no lugar do comando acima.Usando o script wrapper arch-meson
arch-meson é um script wrapper incluído no pacote meson que fornece a vantagem de definir algumas as opções embutidas do Meson que provavelmente seriam usadas em um pacote do Arch, economizando em código no PKGBUILD e tempo de empacotamento. Parafraseando a descrição escrita no arch-meson, ele é um "Wrapper altamente opinativo para empacotamento do Arch Linux" (traduzido).
Exemplo:
build() { arch-meson source build meson compile -C build }
Definindo opções de compilação específicas do software
Enquanto o Meson tem algumas opções de compilação embutidas (por exemplo, --prefix
), o software sendo empacotado pode ter outras opções de compilação que o empacotador deve considerar. As opções de compilação válidas para o software são normalmente encontradas em um arquivo chamado meson_options.txt
(se houver) e no meson.build
. Procure por option(configurações)
nestes arquivos, e leia as configurações
.
Para usar uma opção de compilação específica do software, use a notação -D chave=valor
, sendo chave
o nome da opção de compilação definida no projeto e valor
um valor válido, como, por exemplo, true
.
Por exemplo, o gtranslator tem as seguintes opções de compilação:
meson_options.txt
option('gtk_doc', type: 'boolean', value: false, description: 'use gtk-doc to build documentation')
Então, para compilar sua documentação, deve-se executar o Meson anexando a opção de compilação -D gtk_doc=true
, resultando em uma linha de comando como, por exemplo:
arch-meson $pkgname-$pkgver build -Dgtk_doc=true
check()
Se o software que está sendo empacotado possui conjunto de testes, considere executá-lo na função check() do PKGBUILD. Isso pode ser realizado com o comando meson test
.
Exemplo:
check() { meson test -C build }
sendo build
o mesmo nome de diretório de compilação usado na etapa #build() acima.
ninja test -C build
poderia ser usado diretamente.- O parâmetro
--print-errorlogs
pode ser adicionado aomeson test
para relatar a saída produzida pelos testes que falharam junto com outras informações úteis como as variáveis de ambiente.
Consulte meson test --help
e "Unit tests" na documentação do Meson para mais informações.
package()
O empacotamento normalmente requer a execução apenas de meson install
, mas verifique se é necessário outro comando de instalação (por exemplo, uma licença incomum). Use o mesmo diretório de compilação acima e configure o sinalizador --destdir
:
package() { meson install -C build --destdir "$pkgdir" }
ninja install -C build
poderia ser usado diretamente.Solução de programas
ERROR: Function does not take positional arguments
Exemplo de saíde de erro:
data/meson.build:21:5: ERROR: Function does not take positional arguments.
Erro presente desde o Meson 0.60, que promoveu de aviso para erro o uso de argumentos posicionais. Um exemplo muito comum desse erro é adicionar argumentos inválidos a i18n.merge_file(). Por exemplo, aisleriot tinha:
i18n.merge_file( 'sol.metainfo.xml', input: desktop_in, output: '@BASENAME@', type: 'desktop', po_dir: po_dir, install: true, install_dir: desktopdatadir, )
sendo 'sol.metainfo.xml'
agora um argumento inválido que deve ser removido. Para a correção aplicada no upstream, veja este commit.
Medidas a serem tomadas neste caso:
- Aplique um patch no meson.build relatado no erro para corrigir a compilação e publique o PKGBUILD atualizado (se for o caso)
- Contribua para o repositório upstream com seu patch, para corrigir para todo mundo e evitar ter patches no array de fontes nas próximas versões.
Modelo
Para resumir as instruções acima e fornecer um único ponto de "copiar e colar", consulte o modelo abaixo:
makedepends=(meson) build() { arch-meson $pkgname-$pkgver build meson compile -C build } check() { meson test -C build --print-errorlogs } package() { meson install -C build --destdir "$pkgdir" }
Exemplos de pacotes
Esta é uma pequena lista de pacotes que usam o Meson. Veja outros pacotes na lista "Required by" na página do pacote meson.