Задачи: Играем с задачами

В процессе сборки рецепта bitbake выполняет серию задач. Иногда бывает необходимо явно определить, что класс делает, например определив функцию do_install, реализующую задачу install в рецепте, а иногда эти функции предоставляются общими классами, такими как autotools, обеспечивающим реализации по умолчанию для задач configure, compile и install.

Есть несколько способов модификации задач:

Переопределение реализации по умолчанию

Определяя вашу собственную реализацию задачи, вы перезаписываете любую реализацию, предоставленную по умолчанию либо каким-то классом.

Например, вы можете определить собственную реализацию задачи compile, которая перезапишет функцию по умолчанию::

do_compile() {
      oe_runmake DESTDIR=${D}
}

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

do_configure() {
    :
}
Добавление команд до или после задачи

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

Следующий пример из рецепта units показывает пример установки дополнительного файла, который по каким-то причинам не устанавливается стандартной задачей install из класса autotools:

do_install_append() {
       install -d ${D}${datadir}
       install -m 0655 units.dat ${D}${datadir}
}

Еще один пример из рецепта cherokee показывает добавление команд до стандартной задачи install. В этом случае он компилирует программу, использующуюся хостом в процессе установки. Без этого стандартная задача install из autotools завершилась бы неудачно, так как попыталась бы запускать программу, предназначенную для цели, на хосте:

do_install_prepend () {
        # It only needs this app during the install, so compile it natively
        $BUILD_CC -DHAVE_SYS_STAT_H -o cherokee_replace cherokee_replace.c
}
Определение новой задачи

Еще одним способом является определить новую задачу и зарегистрировать так, чтобы bitbake выполнял ее между двумя существующими.

Следующий пример показывает ситуацию, когда cvs дерево должно быть скопировано поверх извлеченного tar.gz архива, и это должно быть сделано до применения патчей. В примере определяется новая задача для выполнения этого действия, затем она регистрируется для запуска между существующими задачами unpack и patch:

do_unpack_extra(){
    cp -pPR ${WORKDIR}/linux/* ${S}
}
addtask unpack_extra after do_unpack before do_patch

Замечание

При добавлении новая задача не должна начинаться с do_, однако существующие задачи до и после нее должны. Если это условие не будет выполнено, ошибок не появится, но дополнительная задача просто не будет запущена.

Использование overrides

Overrides (описанная подробно где-то еще) позволяет добавлять различную функциональность в зависимости от целевой машины, дистрибутива, архитектуры и т.д.

Пока overrides не очень часто используется для определения задач. Следующий пример из udev показывает установку дополнительного файла только для определенной машины посредством добавления команд к задаче install для h2200:

do_install_append_h2200() {
    install -m 0644 ${WORKDIR}/50-hostap_cs.rules         ${D}${sysconfdir}/udev/rules.d/50-hostap_cs.rules
}