有没有可能在bitbake构建时传入命令行变量?

25
我有一个使用bitbake进行构建的OpenEmbedded环境。我想要让bitbake暂停并询问输入,然后继续构建,但我发现这是不可能的。 既然无法实现这一点,我正在寻找一种向构建中传递额外标志的方法。是否有一种类似于gcc的-D选项的方法可以传递标志给bitbake构建呢? 例如:
bitbake -Dfoo=bar oe-myimage

因此,在构建oe-myimage的过程中,变量foo将被设置为bar

5个回答

33
bitbake -Dfoo=bar oe-myimage

-D标志未被bitbake识别。因此,使用上述方法将无法运行。相反,您可以使用以下步骤从命令行指定标志-

假设您想要导出变量foo并希望它被bitbake识别。

export foo="foobar"

在通过oe-init-build-env命令使环境变量生效后,您需要导出此变量,并通过BB_ENV_EXTRAWHITE变量通知bitbake。这意味着

. oe-init-build-env
export foo="foobar"
export BB_ENV_EXTRAWHITE="$BB_ENV_EXTRAWHITE foo"      

这将在Bitbake中为变量'foo'设置白名单,从而使其在构建过程中对任何配方和子进程可见。

之后,您可以通过像以下表达式一样在Bitbake内使用变量foo来调用任何Bitbake操作 -

${foo}

是否可以将额外的变量永久添加? 在某些配置文件或其他地方吗? 还是每次系统重启后都需要导出BB_ENV_EXTRAWHITE? - GAlexMES
是的。您只需要在方便的地方设置变量。例如,将上述2个导出行添加到oe-init-build-env中。 - fabatera
1
我遇到了一个错误: 变量BB_ENV_EXTRAWHITE已被重命名为BB_ENV_PASSTHROUGH_ADDITIONS。 有什么想法吗? - EzyHoo
1
@EzyHoo 有什么想法吗?真的吗?错误信息直接告诉你该怎么做。只需将“BB_ENV_EXTRAWHITE”替换为“BB_ENV_PASSTHROUGH_ADDITIONS”。 - Max Truxa

13

虽然其他答案也没有问题,但是bitbake确实接受一个--postread参数,如此处所述。这意味着你可以将尽可能多的bitbake变量写入到某个临时配置文件中,并通过在命令行中指定该文件的名称,在bitbake.conf之后读取它。例如:

bitbake --postread=./extra.conf

我个人觉得这比处理环境变量更方便。


似乎 --postread 并不是变量值的最终决定权,也就是说,它也可以被覆盖...我不确定是否有一种类似的方式来给一个变量赋最终值... - bruin

7
此外,还有一种方便的命令行方式可以实现这一点,这在bitbake手册中使用BB_ORIGENV进行了描述:

有时从原始执行环境中获取信息是有用的。 Bitbake将原始环境保存到名为BB_ORIGENV的特殊变量中。

要这样做,您可以按照他们建议的方式(从Python函数中)精确读取变量:

 origenv = d.getVar("BB_ORIGENV", False)
 bar = origenv.getVar("BAR", False)

然后,从命令行传递的方式非常简单:

BAR=somevalue bitbake myimage

一行代码版本:BAR = "${@d.getVar('BB_ORIGENV').getVar('BAR')}" - Vitalii Blagodir
1
这是一个很好的解决方案。但不幸的是,最新的 bitbake 在执行时会抛出 "the basehash value changed" 错误。任务仍将运行,但会出现哈希不匹配错误! - Arnis Juraga

6

以下是您可以做的:

export foo="bar"
export BB_ENV_EXTRAWHITE="$BB_ENV_EXTRAWHITE foo"
bitbake oe-myimage

我遇到了一个错误:变量BB_ENV_EXTRAWHITE已被重命名为BB_ENV_PASSTHROUGH_ADDITIONS。你有什么想法吗? - EzyHoo

2
不,我不相信存在这样的机制。但是你可以做类似于以下的操作:
"echo "foo = \"bar\"" >local.conf

我不确定这是否能解决你的特定问题。此外,有一种本地站点全局变量机制:如果在名为.oe的目录下的个人主目录中有一个site.conf文件,bitbake将会读取并将这些变量应用于每个构建的全局环境中。或许这可以帮上忙?你没有精确说明你要解决什么问题,可能有更好的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接