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 GNU Guix Reference Manual). 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 GNU Guix Reference Manual).
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 Starting download of /tmp/guix-file.03tFfb From https://ftpmirror.gnu.org/gnu/hello/hello-2.10.tar.gz.sig... following redirection to `https://ftp.igh.cnrs.fr/pub/gnu/hello/hello-2.10.tar.gz.sig'... ….tar.gz.sig 819B 1.2MiB/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: Signature made Sun 16 Nov 2014 01:08:37 PM CET gpg: using RSA key A9553245FDE9B739 gpg: Good signature from "Sami Kerola <kerolasa@iki.fi>" [unknown] gpg: aka "Sami Kerola (http://www.iki.fi/kerolasa/) <kerolasa@iki.fi>" [unknown] gpg: WARNING: This key is not certified with a trusted signature! gpg: There is no indication that the signature belongs to the owner. Primary key fingerprint: 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]