在 Yocto shell 代码中出现“错误替换”错误

Posted

技术标签:

【中文标题】在 Yocto shell 代码中出现“错误替换”错误【英文标题】:Getting 'bad substitution' error in Yocto shell code 【发布时间】:2022-01-14 10:51:03 【问题描述】:

我的食谱中有以下 shell 代码

VARIABLE_dev = "dev value"
VARIABLE_prod = "prod value"

do_compile() 
    variant="dev"
    echo $VARIABLE_$variant

因此,我总是收到“错误替换”错误

/home/dev/testproj/tmp/work/machine-poky-linux-gnueabi/test-app/1.0-raspberrypi-r0/temp/run.do_compile.253: 121: Bad substitution

如果 'variant' 变量被定义为数据存储变量(在 shell 代码范围之外),那么它可以正常工作。但是在我粘贴的代码中,我总是出错。 知道这里有什么解决方案吗?

【问题讨论】:

【参考方案1】:

您使用的条件变量扩展语法需要OVERRIDES变量,您可以查看详细信息here。

但是你提供的例子不正确,不能使用。

OVERRIDES 的原理就是当你想根据某个键有条件地覆盖一个变量时。

但是,我会建议更适合您的情况,即Variable Flags

这是一个例子:

VARIABLE[dev] = "dev value"
VARIABLE[prod] = "prod value"

现在,如果您使用基于 Shell 的任务,则可以使用 Python 扩展:

do_compile()
   bbwarn $@d.getVarFlags("VARIABLE").get('dev')

这应该显示值为“dev value”的警告

然后您可以使用另一个变量使其更具条件性,例如:

PROJECT_TYPE = "dev"

do_compile()
   bbwarn $@d.getVarFlags("VARIABLE").get(d.getVar('PROJECT_TYPE'))

您可以直接使用 python 任务以获得更灵活的 python 语法。

建议:使用logging.bbclass 实用程序制作日志:

Shell:bbinfo、bbwarn、bberror、...

Python:bb.info、bb.warn、bb.error、...

更新: 使用 shell for 循环遍历标志:

flags="$@''.join(' ' + flag for flag, _ in d.getVarFlags('PACKAGECONFIG').items())"
for flag in $flags; do
   bbwarn "$flag"
done

【讨论】:

我喜欢你提出的方法,但它仍然不符合我的需要。我想将 PROJECT_TYPE 条件变量引用为 shell 变量而不是数据存储,例如:for project_type in "dev prod"; do bbwarn $@d.getVarFlags("VARIABLE").get($project_type) done 如何使这个示例正常工作? 我确实设法使用 shell for 循环遍历了标志,但我没有设法使用 shell 变量从 python 调用中获取标志的值。查看我的更新。

以上是关于在 Yocto shell 代码中出现“错误替换”错误的主要内容,如果未能解决你的问题,请参考以下文章

如何更改Yocto dora bitbake系统中的root密码?

迅为IMX8MM开发板Yocto系统设置开机自启动

Yocto:使用 Bitbake 构建图像时出错

了解 Yocto 项目 sstate-cache 的功能

Yocto,从(userspace)包构建过程中删除autotools

Yocto:关于在 Yocto 构建中添加 bluez-alsa 的问题