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
相关产品推荐
相关产品推荐

