Próximo: Configuração, Acima: Tutorial sobre empacotamento [Conteúdo][Índice]
A seção “Definindo Pacotes” do manual apresenta os fundamentos do empacotamento Guix (veja Definindo pacotes em Manual de Referência do GNU Guix). Na seção seguinte, revisaremos parcialmente esses princípios básicos novamente.
GNU Hello é um projeto fictício que serve como exemplo idiomático para
empacotamento. Ele usa o sistema de compilação GNU (./configure &&
make && make install
). Guix já fornece uma definição de pacote que é um
exemplo perfeito para começar. Você pode consultar sua declaração com
guix edit hello
na linha de comando. Vamos ver como fica:
(define-public hello
(package
(name "hello")
(version "2.10")
(source (origin
(method url-fetch)
(uri (string-append "mirror://gnu/hello/hello-" version
".tar.gz"))
(sha256
(base32
"0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i"))))
(build-system gnu-build-system)
(synopsis "Hello, GNU world: An example GNU package")
(description
"GNU Hello prints the message \"Hello, world!\" and then exits. It
serves as an example of standard GNU coding practices. As such, it supports
command-line arguments, multiple languages, and so on.")
(home-page "https://www.gnu.org/software/hello/")
(license gpl3+)))
Como você pode ver, a maior parte é bastante simples. Mas vamos revisar os campos juntos:
O nome do projeto. Usando as convenções do Scheme, preferimos mantê-lo em minúsculas, sem sublinhado e usando palavras separadas por traços.
Este campo contém uma descrição da origem do código-fonte. O registro
origin
contém estes campos:
url-fetch
para download via HTTP/FTP, mas outros métodos
existem, como git-fetch
para repositórios Git.
https://
localização para url-fetch
. Aqui
o especial ‘mirror://gnu‘ refere-se a um conjunto de locais bem conhecidos,
todos os quais podem ser usados pelo Guix para buscar a fonte, caso alguns
deles falhem.
sha256
do arquivo solicitado. Isto é essencial para garantir
que a fonte não está corrompida. Observe que o Guix funciona com strings
base32, daí a chamada para a função base32
.
É aqui que o poder de abstração fornecido pela linguagem Scheme realmente
brilha: neste caso, o gnu-build-system
abstrai as famosas invocações
de shell ./configure && make && make install
. Outros sistemas de
compilação incluem o trivial-build-system
que não faz nada e exige
que o empacotador programe todas as etapas de compilação, o
python-build-system
, o emacs-build- system
e muito mais
(veja Sistemas de compilação em Manual de Referência do GNU
Guix).
Deve ser um resumo conciso do que o pacote faz. Para muitos pacotes, uma etiqueta da página inicial do projeto pode ser usado como sinopse.
Assim como na sinopse, não há problema em reutilizar a descrição do projeto na página inicial. Observe que o Guix usa a sintaxe de Texinfo.
Use HTTPS, se disponível.
Consulte guix/licenses.scm
na fonte do projeto para obter uma lista
completa de licenças disponíveis.
É hora de construir nosso primeiro pacote! Nada sofisticado aqui por
enquanto: vamos nos ater a um my-hello
fictício, uma cópia da
declaração acima.
Tal como acontece com o ritualístico “Hello World” ensinado com a maioria das linguagens de programação, esta será possivelmente a abordagem mais “manual”. Trabalharemos em uma configuração ideal mais tarde; por enquanto seguiremos o caminho mais simples.
Salve o seguinte em um arquivo my-hello.scm.
(use-modules (guix packages) (guix download) (guix build-system gnu) (guix licenses)) (package (name "my-hello") (version "2.10") (source (origin (method url-fetch) (uri (string-append "mirror://gnu/hello/hello-" version ".tar.gz")) (sha256 (base32 "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i")))) (build-system gnu-build-system) (synopsis "Hello, Guix world: An example custom Guix package") (description "GNU Hello prints the message \"Hello, world!\" and then exits. It serves as an example of standard GNU coding practices. As such, it supports command-line arguments, multiple languages, and so on.") (home-page "https://www.gnu.org/software/hello/") (license gpl3+))
Explicaremos o código extra em um momento.
Sinta-se à vontade para brincar com os diferentes valores dos vários campos. Se você alterar a fonte, precisará atualizar a soma de verificação. Na verdade, Guix se recusa a construir qualquer coisa se a soma de verificação fornecida não corresponder à soma de verificação calculada do código-fonte. Para obter a soma de verificação correta da declaração do pacote, precisamos baixar o código-fonte, calcular a soma de verificação sha256 e convertê-la para base32.
Felizmente, o Guix pode automatizar essa tarefa para nós; tudo o que precisamos é fornecer o URI:
$ guix download mirror://gnu/hello/hello-2.10.tar.gz Starting download of /tmp/guix-file.JLYgL7 From https://ftpmirror.gnu.org/gnu/hello/hello-2.10.tar.gz... following redirection to `https://mirror.ibcp.fr/pub/gnu/hello/hello-2.10.tar.gz'... …10.tar.gz 709KiB 2.5MiB/s 00:00 [##################] 100.0% /gnu/store/hbdalsf5lpf01x4dcknwx6xbn6n5km6k-hello-2.10.tar.gz 0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i
Neste caso específico a saída nos informa qual espelho foi escolhido. Se o
resultado do comando acima não for o mesmo do trecho acima, atualize sua
declaração my-hello
de acordo.
Observe que os tarballs do pacote GNU vêm com uma assinatura OpenPGP, então você definitivamente deve verificar a assinatura deste tarball com ‘gpg‘ para autenticá-lo antes de prosseguir:
$ guix download mirror://gnu/hello/hello-2.10.tar.gz.sig Iniciando download de /tmp/guix-file.03tFfb De https://ftpmirror.gnu.org/gnu/hello/hello-2.10.tar.gz.sig... seguindo redirecionamento para `https://ftp.igh.cnrs.fr/pub/gnu/hello/hello-2.10.tar.gz.sig'... ….tar.gz.sig 819B 1,2 MiB/s 00:00 [#################] 100,0% /gnu/store/rzs8wba9ka7grrmgcpfyxvs58mly0sx6-hello-2.10.tar.gz.sig 0q0v86n3y38z17rl146gdakw9xc4mcscpk8dscs412j22glrv9jf $ gpg --verify /gnu/store/rzs8wba9ka7grrmgcpfyxvs58mly0sx6-hello-2.10.tar.gz.sig /gnu/store/hbdalsf5lpf01x4dcknwx6xbn6n5km6k-hello-2.10.tar.gz gpg: Assinatura feita em dom 16 nov 2014 01:08:37 PM CET gpg: usando RSA chave A9553245FDE9B739 gpg: Boa assinatura de "Sami Kerola <kerolasa@iki.fi>" [desconhecido] gpg: também conhecido como "Sami Kerola (http://www.iki.fi/kerolasa/) <kerolasa@iki.fi>" [desconhecido] gpg: AVISO: Esta chave não é certificada com uma assinatura confiável! gpg: Não há indicação de que a assinatura pertença ao proprietário. Impressão digital da chave primária: 8ED3 96E3 7E38 D471 A005 30D3 A955 3245 FDE9 B739
Você pode então correr alegremente
$ guix package --install-from-file=my-hello.scm
Agora você deve ter my-hello
em seu perfil!
$ guix package --list-installed=my-hello my-hello 2.10 out /gnu/store/f1db2mfm8syb8qvc357c53slbvf1g9m9-my-hello-2.10
Fomos o mais longe que pudemos sem qualquer conhecimento do Scheme. Antes de passar para pacotes mais complexos, agora é o momento certo para aprimorar seus conhecimentos sobre o Scheme. Veja Um curso intensivo de Scheme para se atualizar.
Próximo: Configuração, Acima: Tutorial sobre empacotamento [Conteúdo][Índice]