Содержание

Предыдущий раздел

5.2. Скрипт b-<ПРОЕКТ>

Следующий раздел

5.4. Структура пакета

5.3. Ступени сборки пакета

Типичный пакет имеет архив исходных текстов, расположенный на публичном сайте интернета, скрипт конфигурации GNU autoconf, Makefile для сборки и установки.

Соответственно, система сборки имеет следующие ступени, обозначенные целями make, связанные в цепочку зависимостей:

fetch -> extract -> patch -> link -> pre-configure -> configure -> build -> install -> pack

Каждая последующая ступень (цель) зависит от предыдущей. Стрелка -> означает направление прохождения ступеней, зависимости же направлены в обратную сторону.

Почти каждая цель имеет свою противоположность - цель с префиксом ‘un’, с обратной цепью зависимостей:

unfetch <- unextract <- unpatch <- unlink <- uninstall <- unpack

Каждая обратная цель отменяет итоги достижения как соответствующей прямой цели, так и всей цепи последующих прямых целей.

Прямая и обратная цепи целей позволяют разработчику пакета отлаживать сборку пакета, двигаясь вперёд и назад по цепи до любой нужной ступени.

Краткое описание целей прямой цепи (сборки):

fetch

Получение архива исходных текстов из интернета или местного хранилища

extract

Извлечение исходных текстов из архива (распаковка)

patch

Наложение заплат
Создание копии дерева исходных текстов с заплатами в каталоге сборки пакета

pre-configure

Запуск скриптов типа autoconf из GNU autoconf

configure

Запуск скрипта configure из GNU autoconf

build

Сборка пакета, обычно через “make all”

install

Установка пакета, обычно через “make install”

pack

Упаковка установленных файлов пакета в пакеты opkg. Необзательно

Краткое описание цепи обратных целей:

unfetch

Удаление архива исходных текстов из первого уровня хранения

unextract

Удаление каталога распакованных исходных текстов

unpatch

Удаление каталога исходных текстов с наложенными заплатами
Удаление каталога сборки пакета

uninstall

Удаление файлов - итогов установки пакета.

unpack

Удаление пакетов opkg.

5.3.1. Вязка исходников

Поскольку проекты могут быть многоплатформенными, то есть, из одних и тех же исходных текстов собираются образы для разных целевых платформ одновременно (хотя и не параллельно), а многие пакеты не поддерживают раздельную сборку (каталоги сборки и исходных текстов разделены), то необходимо иметь копии исходных текстов в каталогах сборки, разных для разных платформ.

Кроме того, бывают заплаты (patches), вносящие изменения в исходные тексты, подходящие только для одной платформы, а для других платформ необходим другой набор заплат. Таким образом, необходимо иметь копии исходных текстов отдельно для каждого набора заплат.

Применяемое в других системах сборки копирование (разворачивание из архивов) исходных текстов порождает по одной копии исходных текстов на каждую платформу.

При всём этом изменения, как правило, затрагивает небольшую долю исходных файлов, копирование которых оправдано, а вот копирование всех остальных неизменных файлов является избыточным потреблением существенных ресурсов.

Лучшим и простейшим решением проблемы было бы применение техники copy-on-write , однако на широко распространённых сейчас не экзотических файловых системах, она невозможна.

Промежуточным решением является создание связанных файловых деревьев, при котором вместо копирования файла в каталоге-копии создаётся ссылка на файл в исходном каталоге. Copy-on-write при этом осуществляется явным образом, перевязывая подлежащие изменению файлы.

Файловая ссылка (link), часто неправильно называемая hard link, для большого числа файлов является более экономным решением, как по используемому объёму, так и по времени доступа, чем символическая ссылка (symbolic link), часто неправильно называемая “soft link”.

При создании связанных деревьев-“копий” исходных текстов для разных платформ, исходные файлы помечаются атрибутом “только чтение”. Это позволяет избежать непреднамеренного изменения содержимого исходного файла, отображаемого сразу для всех платформ, а также выявить некачественные пакеты, пытающиеся изменить файлы исходных текстов в процессе сборки.

Преднамеренное же изменение файлов-“копий” исходных текстов делается явным образом, отвязывая файл-ссылку от исходного файла и копируя исходный файл в каталог назначения на место удалённого файла-ссылки. Скопированный файл получает атрибут “чтение/запись”, позволяя изменять содержимое, не влияя на отображение исходного файла для других платформ.

Перевязка файла делается утилитой “xwmake/script/relink-file”.

Перевязка файлов для их последующего изменения делается для ступеней сборки пакетов “patch” (автоматически по списку изменяемых заплатами файлов) и, для некоторых пакетов по необходимости, как правило, на ступенях “pre-configue”, “configure”, “build”.