Próximo: , Acima: Tutorial sobre empacotamento   [Conteúdo][Índice]


2.1.1 Um pacote “Hello World”

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:

name

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.

source

Este campo contém uma descrição da origem do código-fonte. O registro origin contém estes campos:

  1. O método, aqui url-fetch para download via HTTP/FTP, mas outros métodos existem, como git-fetch para repositórios Git.
  2. O URI, que normalmente é alguma 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.
  3. A soma de verificação 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.
build-system

É 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).

synopsis

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.

description

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.

home-page

Use HTTPS, se disponível.

license

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]