Next: Defining Package Variants, Previous: Пакетные модули, Up: Программный интерфейс [Contents][Index]
Интерфейс высокого уровня к определениям пакетов реализован в модулях
(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 Пакетные модули).
В приведенном выше определении пакета стоит отметить несколько моментов:
source
пакета представляет собой объект <origin>
(see origin
Справка, for the complete reference). Здесь используется
метод url-fetch
из (guix download)
, что означает, что
источником является файл, который нужно загрузить через FTP или HTTP.
Префикс mirror://gnu
указывает url-fetch
использовать одно из
зеркал GNU, определенных в (guix download)
.
Поле sha256
указывает ожидаемый хэш SHA256 загружаемого файла. Это
обязательно и позволяет Guix проверять целостность файла. Форма
(base32 …)
указывает представление хеша в формате base32. Вы
можете получить эту информацию с помощью guix download
(see Вызов guix download
) guix hash
(see Вызов guix hash
).
При необходимости форма origin
может также иметь поле patches
со списком исправлений, которые необходимо применить, и поле snippet
,
содержащее Scheme выражение для изменения исходного кода.
build-system
указывает процедуру сборки пакета (see Системы сборки). Здесь gnu-build-system
представляет знакомую систему
сборки GNU, в которой пакеты могут быть настроены, собраны и установлены с
помощью обычной последовательности команд ./configure && make && make
check && make install
.
Когда вы начинаете упаковывать нетривиальное программное обеспечение, вам могут потребоваться инструменты для управления этими этапами сборки, управления файлами и т.д. See Build Utilities, чтобы узнать об этом подробнее.
arguments
определяет параметры для системы сборки (see Системы сборки). В примере это интерпретируется gnu-build-system
как
запуск запроса configure с флагом --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).
Последовательность хэш-двоеточие (#:
) определяет Scheme ключевое
слово (see Keywords in GNU Guile Reference Manual), а
#:configure-flags
- это ключевое слово, используемое для передачи
аргумента ключевого слова системе сборки (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.
Обратите внимание, что GCC, Coreutils, Bash и другие важные инструменты не
нужно указывать здесь в качестве inputs. Вместо этого
gnu-build-system
позаботится об их наличии (see Системы сборки).
Однако любые другие зависимости необходимо указать в поле inputs
.
Любая не указанная здесь зависимость будет просто недоступна для процесса
сборки, что может привести к сбою сборки.
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 Хранилище).
Возвращает the <derivation>
объект package для system
(see Деривации).
package должен быть допустимым объектом <package>
, а
system должен быть строкой, обозначающей тип системы—например,
"x86_64-linux"
для системы GNU на базе x86_64 Linux. store
должен быть подключен к демону, который работает с хранилищем (see Хранилище).
Точно так же можно вычислить derivation, которая cross собирает пакет для некоторой другой системы:
<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]