Next: , Previous: , Up: Программный интерфейс   [Contents][Index]


9.2 Описание пакетов

Интерфейс высокого уровня к определениям пакетов реализован в модулях (guix packages) и (guix build-system). Например, определение пакета или рецепта для пакета GNU Hello выглядит так:

(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+)))

Не будучи Scheme экспертом, вы можете догадаться о значении различных полей. Это выражение связывает переменную hello с объектом <package>, который по сути является record (see Scheme records in GNU Guile Reference Manual). Этот объект пакета можно проверить с помощью процедур из модуля (guix packages); например, (package-name hello) возвращает—сюрприз!—"hello".

Если повезет, вы сможете импортировать часть или все определение интересующего вас пакета из другого репозитория с помощью команды guix import (see Вызов guix import).

В приведенном выше примере hello определен в собственном модуле (gnu packages hello). Технически в этом нет строгой необходимости, но это удобно: все пакеты, определенные в модулях под (gnu packages …), автоматически становятся известны инструментам командной строки (see Пакетные модули).

В приведенном выше определении пакета стоит отметить несколько моментов:

See package Ссылка, для полного описания возможных полей.

Больше информации: 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.

После того, как определение пакета введено, пакет может быть фактически собран с помощью инструмента командной строки guix build (see Запуск guix build), устраняя любые возникающие ошибки сборки (see Отладка ошибок сборки). Вы можете легко вернуться к определению пакета с помощью команды guix edit (see Вызов guix edit). See Принципы опакечивания для получения дополнительной информации о том, как тестировать определения пакетов, и Вызов guix lint для получения информации о том, как проверить определение на соответствие стилю. Наконец, see Каналы, чтобы узнать, как расширить дистрибутив, добавив собственные определения пакетов в “канал”.

Наконец, обновление определения пакета до новой исходной версии можно частично автоматизировать с помощью команды guix refresh (see Вызов guix refresh).

За кулисами derivation, соответствующая объекту <package>, сначала вычисляется с помощью процедуры package-diveration. Этот вывод хранится в файле .drv в каталоге /gnu/store. Действия сборки, которые он предписывает, затем могут быть реализованы с помощью процедуры build-derivations (see Хранилище).

Процедура Scheme: package-derivation store package [system]

Возвращает the <derivation> объект package для system (see Деривации).

package должен быть допустимым объектом <package>, а system должен быть строкой, обозначающей тип системы—например, "x86_64-linux" для системы GNU на базе x86_64 Linux. store должен быть подключен к демону, который работает с хранилищем (see Хранилище).

Точно так же можно вычислить derivation, которая cross собирает пакет для некоторой другой системы:

Процедура Scheme: package-cross-derivation store package target [system] Возвращает <derivation>

объект package cross-собранный из system в target.

target должен быть допустимым GNU triplet’ом, обозначающим желамое оборудование и операционную систему, например "aarch64-linux-gnu" (see Specifying Target Triplets in Autoconf).

Когда у вас есть определения пакетов, вы можете легко определить варианты этих пакетов. См. See Defining Package Variants, чтобы узнать об этом подробнее.


Next: Defining Package Variants, Previous: Пакетные модули, Up: Программный интерфейс   [Contents][Index]