Обработка неудачной задачи в рецепте Yocto - PullRequest
0 голосов
/ 27 ноября 2018

Мне нужен совет о том, как обрабатывать ошибки в заданиях на рецепт.Рассмотрим следующий фрагмент для рецепта рецепта Yocto:

do_compile_custom() {
    oe_runmake  // oe_runmake command fails 
}
addtask compile_custom after do_compile before do_install

Когда oe_runmake не удается, я хочу выполнить некоторую пользовательскую команду и продолжить сборку, поэтому я подумал, что это должно работать.

do_compile_custom() {
    oe_runmake || true // oe_runmake command fails 
    if [ $? -ne 0 ]; then
        bberror "MAKE FAILED"
    fi
}
addtask compile_custom after do_compile before do_install

Но когда oe_runmake не удается, он выходит из задачи, а остальная часть задачи не выполняется.Я не вижу

MAKE FAILED

в моем журнале сборки.

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

do_compile_custom() {
    oe_runmake  // oe_runmake command fails 
}
addtask compile_custom after do_compile before do_install

addhandler failure_eventhandler
python failure_eventhandler() {
    from bb.event import getName
    print("strtogrep The name of the Event is %s" % getName(e))
}

С этой реализацией рецепта из обработчика я могу видеть только 3 напечатанных события:

| The name of the Event is RecipePreFinalise
| The name of the Event is RecipeTaskPreProcess
| The name of the Event is RecipeParsed

Из всех событий, определенных в bitbake, я ожидал получить TaskFailed Событие после сбоя задачино это никогда не получено.У кого-нибудь есть предложения, как с этим справиться?

1 Ответ

0 голосов
/ 28 ноября 2018

Причина, по которой Вы не можете появиться MAKE FAILES Сообщение журнала является следствием функции oe_runmake .

Как вы можете видеть реализацию oe_runmake (из meta / classes / base.bbclass file), запускает die () функция регистрации в случае любых сбоев:

58 oe_runmake() {                                     
59     oe_runmake_call "$@" || die "oe_runmake failed"
60 }

В последнее время включен die () функция использует bbfatal_log () функция (из файла meta / classes / logging.bbclass ), которая в конце заканчивается exit 1 :

66 bbfatal_log() {
67     if [ -p ${LOGFIFO} ] ; then
68         printf "%b\0" "bbfatal_log $*" > ${LOGFIFO}
69     else
70         echo "ERROR: $*"
71     fi
72     exit 1
73 }

Я думаю, что самый простой способ для Вас заархивировать Вашу цель - отказаться от использования задачи по умолчанию do_compile для выполнения пользовательской задачи компиляции с обработкой ошибок.:

# disable do_compile task
do_compile[noexec] = "1"

do_compile_custom() {
    oe_runmake_custom_call() {                    
        bbnote ${MAKE} ${EXTRA_OEMAKE} "$@"
        ${MAKE} ${EXTRA_OEMAKE} "$@"       
    }                                      

    oe_runmake_custom_call || bbwarn "oe_runmake_custom failed"
    if [ $? -ne 0 ]; then
        bberror "MAKE FAILED"
    fi
}
addtask compile_custom before do_install
...