如何在bitbake / yocto中逃避“$”?

问题描述 投票:5回答:5

我在Yocto中的一个食谱需要创建一个包含非常特定的行的文件,例如:

${libdir}/something

为此,我有配方任务:

do_install() {
    echo '${libdir}/something' >/path/to/my/file
}

请记住,我想要完全如图所示的字符串,我无法弄清楚如何逃避它以防止bitbake替换其自己的libdir值。

我原本以为使用单引号的echo命令可以解决问题(就像在bash shell中那样)但bitbake必须在将该行传递给shell之前解释该行。我也尝试用$$\$逃避它无济于事。

我在bitbake doco中找不到关于防止变量扩展的任何内容,只是与即时,延迟和Python扩展有关。

我需要做什么才能将该字符串原样放入文件中?

variables task yocto bitbake recipe
5个回答
5
投票

Bitbake似乎在防止扩张方面存在特殊问题。无论您使用单引号还是双引号,变量都会在传递给shell之前展开。

因此,如果您希望它们不被扩展,您需要有效地将它们从BitBake中隐藏起来,这可以通过以下方式完成:

echo -e '\x24{libdir}/something' >/path/to/my/file

这使用了$的十六进制版本,因此BitBake不会将其识别为要扩展的变量。

但是,您需要确保运行正确的echo命令。在一些发行版(如Ubuntu)下,它可能运行sh-internal echo,它不识别-e选项。为了解决这个问题,您可能必须运行存在于文件系统上的echo变体(并确实识别该选项):

/bin/echo -e '\x24{libdir}/something' >/path/to/my/file

2
投票

默认情况下,此任务将通过/bin/sh作为shell函数执行,但它取决于您的系统将会是什么,因为您可以将一个名为/bin/sh的符号链接指向bash。 BitBake的手册阻止使用bashism语法。

您可以考虑在配方中添加此任务作为python函数:

python do_install () {
    with open('/path/to/your/file', 'a') as file:
        file.write('${libdir}/something')
}

'a'代表追加。

这应该消除变量扩展的问题。


2
投票

没有标准的方法来逃避我所知道的这些类型的表达式,除了试图分解表达式 - 因此这应该工作:

do_install() {
    echo '$''{libdir}/something' >/path/to/my/file
}

1
投票

最好的解决方案就是:

bitbake_function() {
    command $libdir/whatever
}

Bitbake只会扩展${libdir}; $libdir通过逐字传递。

我们不必担心{没有遵循的美元符号,在这种情况下,没有必要将libdir包裹在括号中。

唯一一次我们遇到$foo的问题就是如果我们有类似${foo}bar的东西,其中大括号需要作为分隔符,以便bar不包含在变量名中。在那种情况下,还有其他解决方案,例如生成shell语法"$foo"bar。这比使用\x24更不含神秘。


0
投票

如果你需要在变量赋值中使用$,请记住bitbake不会评估$,因此你必须为底层shell转义它。

例如,我设置gcc / ld Rpath选项以这种方式使用$ ORIGIN关键字:

TARGET_LDFLAGS_append = " -Wl,-rpath-link=\\$$ORIGIN"

https://lists.yoctoproject.org/pipermail/yocto/2017-September/037820.html

© www.soinside.com 2019 - 2024. All rights reserved.