Синтаксис рецептов

Основные составляющие bitbake рецепта:

функции

Функции обеспечивают выполнение набора действий. Функции обычно используются для перезаписи стандартной реализации целевой функции или для добавления кода до или после вызовы стандартной. Стандартные функции используют синтаксис оболочки sh и в то же время возможен доступ к внутренним переменным и методам OpenEmbedded.

Вот пример функции из sed рецепта:

do_install () {
    autotools_do_install
    install -d ${D}${base_bindir}
    mv ${D}${bindir}/sed ${D}${base_bindir}/sed.${PN}
}

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

присвоение и управление переменными

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

Ниже приведен пример того, как переменные могут быть использованы в рецептах:

S = "${WORKDIR}/postfix-${PV}"
PR = "r4"
CFLAGS += "-DNO_ASM"
SRC_URI_append = "file://fixup.patch;patch=1"
ключевые слова

В bitbake рецептах используется совсем немного ключевых слов. Существующие слова используются для включения функционала (inherit), загрузки частей рецептов из других файлов (include и require), а также для экспортирования переменных в окружение (export).

Пример использования ключевых слов:

export POSTCONF = "${STAGING_BINDIR}/postconf"
inherit autoconf
require otherfile.inc
комментарии

Любые строки, начинающиеся с # считаются комментарием и игнорируются.

# This is a comment

Далее приведен список наиболее важных (и часто используемых) составляющих синтаксиса рецептов:

Продолжение строки: \

Для разделения строки между несколькими линиями нужно поместить \ в конце строки, которую нужно разделить.

VAR = "A really long \
       line"

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

Комментарии: #

Любые строки, начинающиеся с # считаются комментарием и игнорируются.

# This is a comment
Использование переменных: ${...}

Для доступа к содержимому переменных используется синтаксис вида ${<varname>}:

SRC_URI = "${SOURCEFORGE_MIRROR}/libpng/zlib-${PV}.tar.gz"
          
Заключайте в кавычки все присваивания

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

VAR1 = "${OTHERVAR}"
VAR2 = "The version is ${PV}"
Условное присваивание

Условное присваивание используется для присваивания значения переменной только в том случае, когда эта переменная еще не установлена. Обычно это используется для установки значения по умолчанию в том случае, когда в конфигурационных файлах machine, distro или local.conf переменная не определена.

Следующий код:

VAR1 ?= "New value"

will установит VAR1 в значение "New value" если в данный момент переменная пуста. Если переменная уже была установлена, то ее значение останется без изменений. После выполнения следующего примера VAR1 сохраняет значение "Original value":

VAR1 = "Original value"
VAR1 ?= "New value"
Добавление значения "после": +=

Вы можете добавлять текст после содержимого существующих переменных используя += оператор. Обратите внимание, что этот оператор добавляет пробел между содержимым переменной и новым текстом.

SRC_URI += "file://fix-makefile.patch;patch=1"
Добавление значения "до": =+

Вы можете добавлять текст до содержимого существующих переменных используя =+ оператор. Обратите внимание, что этот оператор добавляет пробел между новым текстом и содержимым переменной.

VAR =+ "Starts"
Добавление значения "после": _append

Вы можете добавлять текст после содержимого существующих переменных используя метод _append. Обратите внимание, что этот оператор не добавляет дополнительных пробелов, и применяется после того, как выполнены все операторы += и =+.

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

SRC_URI_append = " file://fix-makefile.patch;patch=1"
          

Метод _append также может быть использован в сочетании с overrides, чтобы получить действия, выполняемые только для определенной цели либо машины: [TODO: Link to section on overrides]

SRC_URI_append_sh4 = " file://fix-makefile.patch;patch=1"
          

Обратите внимание, что добавляемое значение само по себе является значением, поэтому допустимо использование += или =+ для присвоения _append:

SRC_URI_append = 
          " file://fix-makefile.patch;patch=1"
SRC_URI_append += "file://fix-install.patch;patch=1"
Добавление значения "до": _prepend

Вы можете добавлять текст после содержимого существующих переменных используя метод _prepend. Обратите внимание, что этот оператор не добавляет дополнительных пробелов, и применяется после того, как выполнены все операторы += и =+.

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

CFLAGS_prepend = "-I${S}/myincludes "

Метод _prepend также может быть использован в сочетании с overrides, чтобы получить действия, выполняемые только для определенной цели либо машины: [TODO: Link to section on overrides]

CFLAGS_prepend_sh4 = " file://fix-makefile.patch;patch=1"
          

Обратите внимание, что добавляемое значение само по себе является значением, поэтому допустимо использование += или =+ для присвоения _prepend:

CFLAGS_prepend = "-I${S}/myincludes "
          CFLAGS_prepend += "-I${S}/myincludes2 "

Также обратите внимание на отсутствие пробела при использовании += для добавления значение - помните, что += автоматически добавляет его.

Пробелы и табуляции

Для отступов должны быть использованы пробелы, не табуляции. Оба способа работают в данный момент, однако по принятому в OE стилю всегда должны использоваться пробелы.

Стиль: oe-stylize.py

Для того, чтобы помочь в использовании написании рецептов был создан скрипт oe-stylize.py, который может быть использован для переформатирования ваших рецептов в соответствии с правильным стилем. Вывод будет содержать список предупреждений (чтобы показать, что именно было сделано не верно), который должен быть отредактирован перед тем как использовать его в качестве рецепта.

contrib/oe-stylize.py myrecipe.bb > fixed-recipe.bb
vi fixed-recipe.bb
mv fixed.recipe.bb myrecipe.bb
Использование python для сложных операций: ${@...}

Для более продвинутой обработки возможно использование python кода в присваивании переменных для осуществления поиска и, например, замены значения.

Python код обозначается добавлением символа @ в присваивании.

          CXXFLAGS := "${@'${CXXFLAGS}'.replace('-frename-registers', '')}"
          

Больше информации об использовании python в доступно в разделе advanced python.

Shell синтаксис

При описании списка действий используется синтаксис оболочки (тот же что при написании обычных sh скриптов). Вы должны убедиться, что ваш скрипт будет работать в общем случае и не использует никаких особенностей bash или других оболочек. Это же требование относится к разным системным утилитам (sed, grep, awk и т.д.), которые вы можете захотеть использовать. В случае сомнений лучше проверить скрипт на нескольких версиях - включая busybox.

Более подробное описание синтаксиса bitbake рецептов находится в руководстве пользователя по bitbake.