Глава 2. Метаданные

Содержание

Описание
Операция присвоения
Использование ссылок на переменные
Операция присвоения значения по умолчанию (?=)
Операция присвоения значения по умолчанию (??=)
Присвоение с заменой (:=)
Постфиксная операция добавления (+=) и префиксная операция добавления (=+)
Постфиксная операция добавления (.=) и префиксная операция добавления (=.) без включения пробелов
Операция условного присвоения
Условное добавление
Включение
Необходимое включение
Присвоение переменных при помощи Python
Определение исполняемых задач в метаданных
Определение функций на python в глобальной области Python
Флаги переменных
Наследование
Задачи
События
Вариативности
Поддержка зависимостей
Зависимости внутри .bb файла
DEPENDS
RDEPENDS
Рекурсивный DEPENDS
Рекурсивный RDEPENDS
Зависимости между задачами
Разбор метаданых
Файлы настройки
Классы
.bb Files

Описание

Метаданные BitBake делятся на 3 класса:

  • Файлы настройки

  • .bb файлы

  • Классы

Далее описывается синтаксис операций поддерживаемых в метаданных Bitbake с указанием области действия (если она ограничена) и приводятся примеры использования операций в метаданных BitBake.

Операция присвоения

VARIABLE = "value"

В этом примере, после выполнения операции переменная VARIABLE будет иметь значение value.

Использование ссылок на переменные

BitBake поддерживает использование в значениях ссылок на другие переменные, через синтаксис аналогичный в скриптах shell

A = "aval"
B = "pre${A}post"

В результате выполнения операций переменная A будет иметь значение aval, а B будет иметь значение preavalpost.

Операция присвоения значения по умолчанию (?=)

A ?= "aval"

Если переменная A до вызова этой операции уже имела значение, то ее значение не изменится. Если же переменная A не имела значения до вызова этой операции, то переменная A будет иметь значение aval. Заметим что, если имеется множественое использование операции, сработает только первая из них.

Операция присвоения значения по умолчанию (??=)

A ??= "somevalue"
A ??= "someothervalue"

Если переменная A до вызова этой операции уже имела значение, то ее значение не изменится. Если переменная A не имела значения до вызова этой операции, то переменная A будет иметь значение someothervalue. Это "ленивая" версия операции ?=, в случае множественного использования операции, срабатывает последняя из них.

Присвоение с заменой (:=)

:= в результате выполнения операции, значение переменной, заменяется.

T = "123"
A := "${B} ${A} test ${T}"
T = "456"
B = "${T} bval"

C = "cval"
C := "${C}append"

В примере, в результате выполнения операций перменнаяA будет иметь значение test 123, переменная B будет иметь значение 456 bval, а переменная C будет иметь значение cvalappend.

Постфиксная операция добавления (+=) и префиксная операция добавления (=+)

B = "bval"
B += "additionaldata"
C = "cval"
C =+ "test"

В результате выполнения, B будет иметь значение bval additionaldata, а C будет иметь значение test cval.

Постфиксная операция добавления (.=) и префиксная операция добавления (=.) без включения пробелов

B = "bval"
B .= "additionaldata"
C = "cval"
C =. "test"

В результате выполнения, B будет иметь значение bvaladditionaldata, а C будет иметь значение testcval. В отличии от постфиксной (+=) и префиксной (=+) операций добавления, эти операции не добавляют пробел.

Операция условного присвоения

OVERRIDES это список разделенный :, где каждый элемент указывает на условия которые будут проверяться. К примеру если у вас есть переменная обусловлена arm, и arm присутствует в OVERRIDES, то более обусловленная версия переменной arm будет использована вместо менее необусловленной. К примеру:

OVERRIDES = "architecture:os:machine"
TEST = "defaultvalue"
TEST_os = "osspecificvalue"
TEST_condnotinoverrides = "othercondvalue"
				

В результате переменная TEST будет содержать osspecificvalue, так как условие os присутствует в списке OVERRIDES.

Условное добавление

BitBake так же поддерживает условные постфиксные и префиксные операции над переменными с использованием списка OVERRIDES. К примеру:

DEPENDS = "glibc ncurses"
OVERRIDES = "machine:local"
DEPENDS_append_machine = " libmad"
					

В результате выполнения переменная DEPENDS будет иметь значение glibc ncurses libmad.

Включение

Деректива include, указывает BitBake обработать указанный вами файл и вставить его в необходимом месте, она похожа на такую же дерективу в make. Но однако, если в директиве include указан относительный путь, BitBake будет искать первое вхождение в BBPATH.

Необходимое включение

В отличии от директивы include, require вызывает ошибку ParseError если файл для включения не найден. Во всем остальном она точно такая же как деректива include.

Присвоение переменных при помощи Python

DATE = "${@time.strftime('%Y%m%d',time.gmtime())}"

В результате DATE будет содержать текущую дату.

Определение исполняемых задач в метаданных

Примечание: Эта возможность поддерживается только в .bb и .bbclass файлах.

do_mytask () {
    echo "Hello, world!"
}

Определение аналогично установке переменной, только в результате вызова задачи будет исполнен shell сценарий.

python do_printdate () {
    import time
    print time.strftime('%Y%m%d', time.gmtime())
}

Аналогично выше приведенному определению задачи, но добавление флага python указывает BitBake, для запуска надо воспользоваться интерпретатором python.

Определение функций на python в глобальной области Python

Примечание: Эта возможность поддерижвается только для .bb и .bbclass файлов.

def get_depends(bb, d):
    if bb.data.getVar('SOMECONDITION', d, True):
        return "dependencywithcond"
    else:
        return "dependency"

SOMECONDITION = "1"
DEPENDS = "${@get_depends(bb, d)}"

В результате DEPENDS будет содержать dependencywithcond.

Флаги переменных

Переменные могут быть ассоциированы с флагами для сохранения дополнительной информации о переменной. Некоторые флаги используются самим bitbake, но они их можно использовать и помимо этого, если вам это необходимо. Операции описанные выше работают с флагами как с обычными переменными. К примеру:

VARIABLE[SOMEFLAG] = "value"

В результате, к пермеенной VARIABLE добавляется флаг SOMEFLAG со значением value.

Наследование

Примечание: Эта возможность поддерживается только в .bb и .bbclass файлах.

Деректива inherit указывает функционал каких классов будет использоваться в .bb файле. Это позволяет организовать простейшую форму наследования. К примеру вы легко можете отделить задачи использующие при сборке пакета autoconf и automake в отдельный bbclass, при подключении которого пакеты смогут использовать их. Указанный bbclass ищется по маске classes/filename.bbclass, в списке путей BBPATH, где filename это имя класса который наследуется.

Задачи

Примечание: Эта возможность поддерживается только в .bb и .bbclass файлах.

В BitBake, каждый шаг который может быть запущен в файле .bb является задачей. Команда addtask добавляет новые задачи (должны быть определены как python исполняемые метаданные и должны начинаться с do_) доступные для исполенния и описывает зависимости между задачами.

python do_printdate () {
    import time
    print time.strftime('%Y%m%d', time.gmtime())
}

addtask printdate before do_build

В этом примере определяется задача на python и определяется зависимость от задачи do_build (задача по умолчанию). Если кто-нибудь вызовет задачу do_build, то в результате сначала выполнится задача do_printdate, а затем do_build.

События

Примечание: Эта возможность доступна только в .bb и .bbclass файлах.

BitBake позволяет устанавливать обработчки событий. События могут возникать во время различных операций, таких как начало обработки .bb файла, старта указаной задачи, неудачного завершения задачи, удачного завершения задачи и во многих других случаях. Это позволяет легко реализовывать такие вещи как email уведомения при ошибках сборки.

addhandler myclass_eventhandler
python myclass_eventhandler() {
    from bb.event import NotHandled, getName
    from bb import data

    print "The name of the Event is %s" % getName(e)
    print "The file we run for is %s" % data.getVar('FILE', e.data, True)

    return NotHandled
}

Этот обработчик событий вызывается каждый раз как просходит событие. Для обращения к событию определена глобальная переменная e. e.data содержит копию bb.data. При помощи функции getName(e) можно узнать имя возникшего события.

Таким образом выше приведенный обработчик выводит имя события и значение переменной FILE.

Вариативности

Для поддержки возможности создания множества вариантов сборки пакета используя один файл рецепт, в Bitbake имеются два специальных расширения.

Первое это BBCLASSEXTEND. Эта переменная содержит список разделенных пробелами классов, для наследования в каждом из вариантов сборки рецепта. К пример, если присвоить:

BBCLASSEXTEND = "native"

то в результате станет доступен еще один вариант сборки. Этот вариант сборки будет дополнительно наследовать класс "native".

Второе расширение это BBVERSIONS. Это расширение позволяет при помощи одного рецепта собирать множество версий пакета при помощи одного файла-рецепта, а так же позволяет указывать использовать условные операции (через OVERRIDES) для одной из версий или же для заданого дапазона версий:

BBVERSIONS = "1.0 2.0 git"
SRC_URI_git = "git://someurl/somepath.git"
BBVERSIONS = "1.0.[0-6]:1.0.0+ \
              1.0.[7-9]:1.0.7+"
SRC_URI_append_1.0.7+ = "file://some_patch_which_the_new_versions_need.patch;patch=1"

Так же стоит отметить, что имя диапазона по умолчанию совпадает с оригинальным именем рецепта, полученным от OE. К примеру файл рецепт foo_1.0.0+.bb будет иметь имя диапазона версий будет 1.0.0+ Это позволяет использовать имя диапазона не только через условные операции, но и делает доступным использование его в путях поиска file:// (FILESPATH) через переменную BPV .