在Yocto配方中处理失败的任务

时间:2018-11-27 15:40:39

标签: yocto bitbake openembedded

我需要一些有关如何处理配方任务中的错误的建议。考虑以下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失败时,它将退出任务,并且其余任务将不执行。我没看到

  

失败

在我的构建日志中。

我开始研究bitbake事件,因此我下一步要做的是在我的配方中添加一个事件处理程序,首先没有任何事件过滤器即可查看收到的所有事件。

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事件,但从未收到。有人对如何处理有建议吗?

2 个答案:

答案 0 :(得分:2)

为什么不重写die函数,以便它将检查env-var的动作?

die_action ??= "bbfatal_log"
die() {
  ${die_action} "$*"
}

您可以在自己继承的no-die.bb类中进行定义:

INHERIT += "no-die'

在全局配置文件中,或者在配方中

inherit no-die

然后在其他地方,也许在食谱或课堂中:

fixup() {
  bbwarn "Didn't Die: $*"
}

然后

die_action="fixup"

我还没有测试

答案 1 :(得分:1)

您无法出现 MAKE FAILES 日志消息的原因是 oe_runmake 函数的结果。

您可以看到 oe_runmake 的实现(来自 meta / classes / base.bbclass 文件),在其中运行 die()日志记录功能任何失败的情况:

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

最近在 die()函数上使用 bbfatal_log()函数(来自 meta / classes / logging.bbclass 文件),该函数最终以与退出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