You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bitbake中do_unpack:append执行install命令报语法错误求助

Yocto中do_unpack:append执行shell命令触发语法错误问题

问题场景

在Yocto项目中,尝试通过do_unpack:append函数在源码解压后,将${WORKDIR}下的MNI.LIC许可证文件复制到${S}目录,编写的配方代码如下:

# Add the license file after unpacking the source
do_unpack:append() {
    install -m 644 ${WORKDIR}/MNI.LIC ${S}/MNI.LIC || die "Failed to copy license file"
}

报错信息

执行bitbake -p时出现语法错误,即使将权限参数改为0644也无法解决,具体报错如下:

bitbake -p results in:
....
', 'FILESPATH', 'PRSERV_DUMPDIR', 'PARALLEL_MAKE', 'STAGING_DIR_TARGET', 'BB_WORKERCONTEXT', 'SSTATE_DIR', 'LICENSE_PATH', 'PRSERV_LOCKDOWN', 'PRSERV_DUMPFILE', 'PWD'}, d=<bb.data_smart.DataSmart object at 0x7fcbfaefa050>):
                     parser = bb.codeparser.PythonParser(key, logger)
    >                parser.parse_python(value, filename=varflags.get("filename"), lineno=varflags.get("lineno"))
                     deps = deps | parser.references
  File "/home/mnidev/work/tisdk/sources/bitbake/lib/bb/codeparser.py", line 319, in PythonParser.parse_python(node='\n    bb.build.exec_func(\'base_do_unpack\', d)\n    install -m 644 ${WORKDIR}/MNI.LIC ${S}/MNI.LIC || die "Failed to copy license file"\n', lineno=1, filename='autogenerated'):
             node = "\n" * int(lineno) + node
    >        code = compile(check_indent(str(node)), filename, "exec",
                            ast.PyCF_ONLY_AST)
  File "autogenerated", line 3
    install -m 644 ${WORKDIR}/MNI.LIC ${S}/MNI.LIC || die "Failed to copy license file"
               ^^^
SyntaxError: invalid syntax

ERROR: Parsing halted due to errors, see error messages above
I've also used 0644. Flumoxed.

问题原因与解决方法

原因

Yocto的任务函数(如do_unpack)默认是Python函数,直接在其中写shell命令会被当作Python代码解析,自然触发语法错误。

可行解决方案

由于该许可证文件仅用于Yocto构建,后续将文件复制操作移至do_install阶段即可正常执行,示例代码如下:

do_install() {                                                                                                             
 echo "S is set to: ${S}"                                                                                               
 echo "B is set to: ${D}"                                                                                               
 install -d ${D}/root/MyApp                                                                                               
 install -m 0755 ${S}/bin/MyApp ${D}/root/APP
}

若一定要在do_unpack阶段执行shell命令,需要用Python的bb.build.exec_shell()方法包裹shell命令,示例如下:

do_unpack:append() {
    bb.build.exec_shell('install -m 0644 ${WORKDIR}/MNI.LIC ${S}/MNI.LIC || die "Failed to copy license file"', d)
}

额外需求

希望Yocto官方能提供.bb和.bbappend配方命令的C++参考文档,目前官网搜索install关键词仅能找到环境安装相关内容,无法获取配方中shell命令的详细说明。


内容的提问来源于stack exchange,提问作者R. Gulde

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 05:43:23