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 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:

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 GNU Guix Reference Manual).

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.

página inicial

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

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]