Next: Build Utilities, Previous: Системы сборки, Up: Программный интерфейс [Contents][Index]
Почти все системы сборки пакетов реализуют понятие фазы сборки:
последовательность действий, которые система сборки выполняет при сборке
пакета, что приводит к установке побочных продуктов в store. Заметным
исключением является “bare-bones” trivial-build-system
(see Системы сборки).
As discussed in the previous section, those build systems provide a standard
list of phases. For gnu-build-system
, the main build phases are the
following:
set-paths
Define search path environment variables for all the input packages,
including PATH
(see Search Paths).
unpack
Распаковать архив исходных текстов и измените текущий каталог на извлеченное дерево исходных текстов. Если источник на самом деле является каталогом, скопировать его в дерево сборки и войдите в этот каталог.
patch-source-shebangs
Изменить shebang, встречающиеся в исходных файлах, чтобы они ссылались на
правильные имена файлов хранилища. Например, это изменяет #!/bin/sh
на #!/gnu/store/…-bash-4.3/bin/sh
.
configure
Запустить сценарий configure с несколькими параметрами по умолчанию,
такими как --prefix=/gnu/store/…, а также параметрами,
указанными в #:configure-flags
аргументе.
build
Запустить make
со списком флагов, указанным с помощью
#:make-flags
. Если аргумент #:parallel-build?
истинен (по
умолчанию), выполнить сборку с make -j
.
check
Запустить make check
или другой target, указанный с помощью
#:test-target
, если только #:tests? #f
пройден. Если аргумент
#:parallel-tests?
истинен (по умолчанию), запустить make check
-j
.
установка
Запустить make install
с флагами, перечисленными в
#:make-flags
.
patch-shebangs
Изменить shebangs на установленные исполняемые файлы.
strip
Удалить символы отладки из файлов ELF (если #:strip-binaries?
не
является ложным), скопировав их в выходные данные debug
, если они
доступны (see Установка файлов отладки).
Как обсуждалось в предыдущем разделе, эти системы сборки предоставляют
стандартный список фаз. Для gnu-build-system
стандартные фазы
включают фазу unpack
для распаковки архива исходного кода, фазу
configure
для запуска ./configure
, build
фаза для
запуска make
и (среди прочего) фазу install
для запуска
make install
; see Системы сборки, чтобы получить более
подробное представление об этих фазах. Точно так же
cmake-build-system
наследует эти фазы, но его фаза configure
запускает cmake
вместо ./configure
. Другие системы
сборки, такие как python-build-system
, имеют совершенно другой список
стандартных фаз. Весь этот код выполняется на build side: он
выполняется, когда вы фактически собираете пакет, в отдельном процессе
сборки, порожденном демоном сборки (see Вызов guix-daemon).
Этапы сборки представлены в виде ассоциативных списков или “alists” (see Association Lists in GNU Guile Reference Manual), где каждый ключ является символом имени фазы, а соответствующее значение - процедурой, которая принимает произвольное количество аргументов. По соглашению эти процедуры получают информацию о сборке в виде ключевых параметров, которые они могут использовать или игнорировать.
Например, вот как (guix build gnu-build-system)
определяет
%standard-phase
, переменную, содержащую список фаз сборки
19:
;; The build phases of 'gnu-build-system'. (define* (unpack #:key source #:allow-other-keys) ;; Extract the source tarball. (invoke "tar" "xvf" source)) (define* (configure #:key outputs #:allow-other-keys) ;; Run the 'configure' script. Install to output "out". (let ((out (assoc-ref outputs "out"))) (invoke "./configure" (string-append "--prefix=" out)))) (define* (build #:allow-other-keys) ;; Compile. (invoke "make")) (define* (check #:key (test-target "check") (tests? #true) #:allow-other-keys) ;; Run the test suite. (if tests? (invoke "make" test-target) (display "test suite not run\n"))) (define* (install #:allow-other-keys) ;; Install files to the prefix 'configure' specified. (invoke "make" "install")) (define %standard-phases ;; The list of standard phases (quite a few are omitted ;; for brevity). Each element is a symbol/procedure pair. (list (cons 'unpack unpack) (cons 'configure configure) (cons 'build build) (cons 'check check) (cons 'install install)))
Это показывает, как %standard-phase
определяется как список пар
символ/процедура (see Pairs in GNU Guile Reference Manual).
Первая пара связывает процедуру unpack
с символом
unpack
—именем; вторая пара аналогичным образом определяет фазу
configure
и так далее. При сборке пакета, который использует
gnu-build-system
со списком фаз по умолчанию, эти фазы выполняются
последовательно. Вы можете увидеть название каждой фазы, запущенной и
завершенной, в журнале сборки пакетов, которые вы собираете.
Теперь посмотрим на сами процедуры. Каждая из них определяется с помощью
define*
: #:key
перечисляет параметры ключевого слова, которые
принимает процедура, возможно, со значением по умолчанию, а
#:allow-other-keys
указывает, что другие параметры ключевого слова
являются игнорируется (see Optional Arguments in GNU Guile
Reference Manual).
Процедура unpack
учитывает параметр source
, который система
сборки использует для передачи имени файла исходного архива (или checkout
контроля версий), и игнорирует другие параметры. Фаза configure
касается только параметра output
, списка имен выходных пакетов,
отображающих имена файлов хранилища (see Пакеты со множественным выходом). Она извлекает имя файла для out
, вывода по умолчанию, и
передает его ./configure
в качестве префикса установки, что
означает, что make install
в конечном итоге скопирует все файлы в
этом каталоге (see configuration and makefile
conventions in GNU Coding Standards). build
и
install
игнорируют все свои аргументы. check
учитывает
аргумент test-target
, который указывает имя цели Makefile для запуска
тестов; она печатает сообщение и пропускает тесты, если tests?
ложно.
Список фаз, используемых для конкретного пакета, можно изменить с помощью
параметра #:phase
системы сборки. Изменение набора фаз сборки
сводится к созданию нового списка фаз на основе списка
%standard-phase
, описанного выше. Это можно сделать с помощью
стандартных процедур списков, таких как alist-delete
(see SRFI-1 Association Lists in GNU Guile Reference Manual); однако это удобнее
делать с помощью modify-phase
(see modify-phases
).
Вот пример определения пакета, который удаляет фазу configure
из
%standard-phase
и вставляет новую фазу перед фазой build
,
которая называется set-prefix-in- makefile
:
(define-public example (package (name "example") ;; other fields omitted (build-system gnu-build-system) (arguments '(#:phases (modify-phases %standard-phases (delete 'configure) (add-before 'build 'set-prefix-in-makefile (lambda* (#:key outputs #:allow-other-keys) ;; Modify the makefile so that its ;; 'PREFIX' variable points to "out". (let ((out (assoc-ref outputs "out"))) (substitute* "Makefile" (("PREFIX =.*") (string-append "PREFIX = " out "\n"))) #true))))))))
Новая вставляемая фаза записывается как анонимная процедура, представленная
с помощью lambda*
; она учитывает параметр output
, который мы
видели ранее. See Build Utilities, чтобы узнать больше о помощниках,
используемых в этой фазе, и получить больше примеров modify-phase
.
Имейте в виду, что фазы сборки - это код, выполняемый во время фактической
сборки пакета. Это объясняет, почему приведенное выше выражение
modify-phase
целиком (оно идет после '
или апострофа): это
staged для последующего выполнения. See G-Expressions для
объяснения staging кода и задействованных code strata.
Мы представляем упрощенное представление этих фаз сборки, но
обязательно взгляните на (guix build gnu-build-system)
, чтобы увидеть
все подробности!
Next: Build Utilities, Previous: Системы сборки, Up: Программный интерфейс [Contents][Index]