"Staging": Делаем заголовочные файлы и библиотеки доступными для сборки

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

Если посмотреть в качестве примера bzip2, то можно увидеть, что он размещает в "staging" директории заголовочный файл и библиотеки:

do_stage () {
    install -m 0644 bzlib.h ${STAGING_INCDIR}/
    oe_libinstall -a -so libbz2 ${STAGING_LIBDIR}
}

Метод oe_libinstall, использованный в bzip2 и описанный в разделе methods, занимается установкой библиотек (в "staging" директории в нашем случае). "Staging" переменные автоматически устанавливаются, в нашем случае были использованы основные "staging" переменные:

STAGING_INCDIR

Директория, в которой размещаются заголовочные файлы. Эквивалент стандартной /usr/include директории.

STAGING_LIBDIR

Директория, в которой размещаются библиотечные файлы. Эквивалент стандартной /usr/lib директории.

Дополнительные "staging" переменные описаны в разделе Staging directories главы Глава 9, Справочник.

Посмотрев "staging" области в tmp/ можно увидеть результат выполнения stage задачи рецепта bzip2:

%> find tmp/staging -name '*bzlib*'
tmp/staging/sh4-linux/include/bzlib.h
%> find tmp/staging -name '*libbz*'
tmp/staging/sh4-linux/lib/libbz2.so
tmp/staging/sh4-linux/lib/libbz2.so.1.0
tmp/staging/sh4-linux/lib/libbz2.so.1
tmp/staging/sh4-linux/lib/libbz2.so.1.0.2
tmp/staging/sh4-linux/lib/libbz2.a

"Staging" переменные используются как при выполнении задачи stage, так и при сборке других пакетов. Если посмотреть на рецепт gnupg, то можно увидеть следующие моменты, относящиеся к bzip2:

DEPENDS = "zlib bzip2"
...
EXTRA_OECONF = "--disable-ldap \
        --with-zlib=${STAGING_LIBDIR}/.. \
        --with-bzip2=${STAGING_LIBDIR}/.. \
        --disable-selinux-support"

Bzip2 упоминается в двух переменных рецепта:

DEPENDS

Если вы не забыли, переменная DEPENDS определяет список зависимостей сборки. В этом случае для сборки необходимы заголовочные файлы и библиотеки из пакета bzip2, и поэтому необходимо убедиться что рецепт bzip2 был запущен и что он установил нужные файлы. Добавление bzip2 в DEPENDS обеспечивает такую проверку.

EXTRA_OECONF

Эта переменная используется классом autotools class для передачи опций configure скрипту пакета. В случае gnupg необходимо указать, где расположены заголовочные файлы и библиотеки bzip2, это делается через параметр --with-bzip2 и в нашем случае он должен указывать на директорию, в которой расположены поддиректории lib и include. Поскольку OE не определяет переменную на один уровень выше чем include и lib директории, .. используется для ее обозначения. Без указания этого параметра gnupg искал бы системные заголовочные файлы и библиотеки хоста вместо предназначенных для цели и расположенных в "staging" области.

Напомним, что "staging" делает заголовочные файлы и библиотеки доступными для использования другими рецептами. Хотя заголовочные файлы и файлы и библиотеки чаще всего требуются при сборке рецептов, другие файлы (файлы pkgconfig и бинарные файлы для native рецептов) тоже устанавливаются в ходе stage задачи.