Siguiente: Definición de variantes de paquetes, Anterior: Módulos de paquetes, Subir: Interfaz programática [Índice general][Índice]
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 `(("gawk" ,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 (véase Scheme records en 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
(véase 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 (véase 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>
(véase 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
(véase Invocación de guix download) y guix hash
(véase 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 (véase 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. Véase Utilidades de construcción para obtener más información sobre este tema.
arguments
especifica las opciones para el sistema de
construcción (véase 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.
¿Qué son estas comillas simples ('
)? Son sintaxis Scheme para
introducir una lista literal; '
es sinónimo de
quote
. Véase quoting en GNU Guile Reference
Manual, para más detalles. Aquí el valor del campo arguments
es una
lista de parámetros pasada al sistema de construcción, como con apply
(véase apply
en GNU Guile Reference Manual).
La secuencia almohadilla-dos puntos (#:
) define una palabra
clave Scheme (véase Keywords en GNU Guile Reference Manual), y
#:configure-flags
es una palabra clave usada para pasar un parámetro
nominal al sistema de construcción (véase Coding With Keywords en GNU Guile Reference Manual).
inputs
especifica las entradas al proceso de
construcción—es decir, dependencias de tiempo de construcción o ejecución
del paquete. Aquí, definimos una entrada llamada "gawk"
, cuyo valor
es el de la variable gawk
; gawk
en sí apunta a un objeto
<package>
.
De nuevo, `
(un acento grave, sinónimo de quasiquote
) nos
permite introducir una lista literal en el campo inputs
, mientras que
,
(una coma, sinónimo de unquote
) nos permite insertar un
valor en dicha lista (véase unquote en GNU Guile
Reference Manual).
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
(véase 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.
Véase Referencia de package, para una descripción completa de los campos posibles.
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
(véase Invocación de guix build), pudiendo resolver cualquier fallo de
construcción que encuentre (véase Depuración de fallos de construcción). Puede volver
a la definición del paquete fácilmente usando la orden guix edit
(véase Invocación de guix edit). Véase 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, véase 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
(véase 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
(véase El almacén).
Devuelve el objeto <derivation>
del paquete pra el
sistema (véase 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 (véase 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"
(véase Specifying Target Triplets en Autoconf).
Una vez tenga sus definiciones de paquetes puede definir facilmente variantes de dichos paquetes. Véase Definición de variantes de paquetes para obtener más información sobre ello.
• Referencia de package | El tipo de datos de los paquetes. | |
• Referencia de origin | El tipo de datos de orígenes. |
Siguiente: Definición de variantes de paquetes, Anterior: Módulos de paquetes, Subir: Interfaz programática [Índice general][Índice]