Next: Definición de variantes de paquetes, Previous: Módulos de paquetes, Up: Interfaz programática [Contents][Index]
La interfaz de alto nivel de las definiciones de paquetes está implementada
en los módulos (guix packages)
y (guix build-system)
. Como un
ejemplo, la definición de paquete, o receta, para el paquete GNU Hello
es como sigue:
(define-module (gnu packages hello) #:use-module (guix packages) #:use-module (guix download) #:use-module (guix build-system gnu) #:use-module (guix licenses) #:use-module (gnu packages gawk)) (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) (arguments '(#:configure-flags '("--enable-silent-rules"))) (inputs (list gawk)) (synopsis "Hello, GNU world: An example GNU package") (description "Guess what GNU Hello prints!") (home-page "https://www.gnu.org/software/hello/") (license gpl3+)))
Sin ser una experta en Scheme—pero conociendo un poco de inglés—, la
lectora puede haber supuesto el significado de varios campos aquí. Esta
expresión asocia la variable hello
al objeto <package>
, que
esencialmente es un registro (see Scheme records in GNU
Guile Reference Manual). Este objeto de paquete puede ser inspeccionado
usando los procedimientos encontrados en el módulo (guix packages)
;
por ejemplo, (package-name hello)
devuelve—¡sorpresa!—"hello"
.
Con suerte, puede que sea capaz de importar parte o toda la definición del
paquete de su interés de otro repositorio, usando la orden guix
import
(see Invocación de guix import
).
En el ejemplo previo, hello
se define en un módulo para ella,
(gnu packages hello)
. Técnicamente, esto no es estrictamente
necesario, pero es conveniente hacerlo: todos los paquetes definidos en
módulos bajo (gnu packages …)
se reconocen automáticamente en
las herramientas de línea de órdenes (see Módulos de paquetes).
Hay unos pocos puntos que merece la pena destacar de la definición de paquete previa:
source
del paquete es un objeto <origin>
(see Referencia de origin
, para la referencia completa). Aquí se usa el
método url-fetch
de (guix download)
, lo que significa que la
fuente es un archivo a descargar por FTP o HTTP.
El prefijo mirror://gnu
instruye a url-fetch
para usar uno de
los espejos GNU definidos en (guix download)
.
El campo sha256
especifica el hash SHA256 esperado del archivo
descargado. Es obligatorio, y permite a Guix comprobar la integridad del
archivo. La forma (base32 …)
introduce la representación base32
del hash. Puede obtener esta información con guix download
(see Invocación de guix download
) y guix hash
(see Invocación de guix hash
).
Cuando sea necesario, la forma origin
también puede tener un campo
patches
con la lista de parches a ser aplicados, y un campo
snippet
con una expresión Scheme para modificar el código fuente.
build-system
especifica el procedimiento de construcción del
paquete (see Sistemas de construcción). Aquí, gnu-build-system
representa el
familiar sistema de construcción GNU, donde los paquetes pueden
configurarse, construirse e instalarse con la secuencia de ordenes habitual
./configure && make && make check && make install
.
Cuando comience a empaquetar software no trivial puede que necesite herramientas para manipular estas fases de construcción, manipular archivos, etcétera. See Utilidades de construcción para obtener más información sobre este tema.
arguments
especifica las opciones para el sistema de
construcción (see Sistemas de construcción). Aquí son interpretadas por
gnu-build-system
como una petición de ejecutar configure con
la opción --enable-silent-rules.
What about these quote ('
) characters? They are Scheme syntax to
introduce a literal list; '
is synonymous with quote
.
Sometimes you’ll also see `
(a backquote, synonymous with
quasiquote
) and ,
(a comma, synonymous with unquote
).
See quoting in GNU Guile Reference Manual, for
details. Here the value of the arguments
field is a list of
arguments passed to the build system down the road, as with apply
(see apply
in GNU Guile Reference Manual).
La secuencia almohadilla-dos puntos (#:
) define una palabra
clave Scheme (see Keywords in GNU Guile Reference Manual), y
#:configure-flags
es una palabra clave usada para pasar un parámetro
nominal al sistema de construcción (see Coding With Keywords in GNU Guile Reference Manual).
inputs
field specifies inputs to the build process—i.e.,
build-time or run-time dependencies of the package. Here, we add an input,
a reference to the gawk
variable; gawk
is itself bound to a
<package>
object.
Fíjese que no hace falta que GCC, Coreutils, Bash y otras herramientas
esenciales se especifiquen como entradas aquí. En vez de eso,
gnu-build-system
se hace cargo de asegurar que están presentes
(see Sistemas de construcción).
No obstante, cualquier otra dependencia debe ser especificada en el campo
inputs
. Las dependencias no especificadas aquí simplemente no estarán
disponibles para el proceso de construcción, provocando posiblemente un
fallo de construcción.
See Referencia de package
, para una descripción completa de los campos
posibles.
Más allá: Intimidated by the Scheme language or curious about it? The Cookbook has a short section to get started that recaps some of the things shown above and explains the fundamentals. See A Scheme Crash Course in GNU Guix Cookbook, for more information.
Una vez la definición de paquete esté en su lugar, el paquete puede ser
construido realmente usando la herramienta de línea de órdenes guix
build
(see Invocación de guix build
), pudiendo resolver cualquier fallo de
construcción que encuentre (see Depuración de fallos de construcción). Puede volver
a la definición del paquete fácilmente usando la orden guix edit
(see Invocación de guix edit
). See Pautas de empaquetamiento, para más
información sobre cómo probar definiciones de paquetes, y Invocación de guix lint
, para información sobre cómo comprobar la consistencia del estilo de
una definición.
Por último, see Canales, para información sobre cómo extender la
distribución añadiendo sus propias definiciones de paquetes en un “canal”.
Finalmente, la actualización de la definición con una nueva versión oficial
puede ser automatizada parcialmente por la orden guix refresh
(see Invocación de guix refresh
).
Tras el telón, una derivación correspondiente al objeto <package>
se
calcula primero mediante el procedimiento package-derivation
. Esta
derivación se almacena en un archivo .drv
bajo /gnu/store. Las
acciones de construcción que prescribe pueden entonces llevarse a cabo
usando el procedimiento build-derivations
(see El almacén).
Devuelve el objeto <derivation>
del paquete pra el
sistema (see Derivaciones).
paquete debe ser un objeto <package>
válido, y sistema
debe ser una cadena que denote el tipo de sistema objetivo—por ejemplo,
"x86_64-linux"
para un sistema GNU x86_64 basado en
Linux. almacén debe ser una conexión al daemon, que opera en el
almacén (see El almacén).
De manera similar, es posible calcular una derivación que construye de forma cruzada un paquete para otro sistema:
Devuelve el objeto <derivation>
de paquete compilado de forma
cruzada desde sistema a plataforma.
plataforma debe ser una tripleta GNU válida que identifique al
hardware y el sistema operativo deseado, como por ejemplo
"aarch64-linux-gnu"
(see Specifying Target Triplets in Autoconf).
Una vez tenga sus definiciones de paquetes puede definir facilmente variantes de dichos paquetes. See Definición de variantes de paquetes para obtener más información sobre ello.
Next: Definición de variantes de paquetes, Previous: Módulos de paquetes, Up: Interfaz programática [Contents][Index]