在配方脚本中有条件地包含补丁文件

Conditional inclusion of patch file in recipe script

我有食谱文件,我的 SRC_URI 部分如下所示:

SRC_URI += "file://file1.patch \
            file://file2.patch \
            file://file4.patch \
           "

只有在设置了某个环境变量的情况下,我才想在 SRC_URI 下包含一个 file5.patch。有没有办法用 SRC_URI 插入一个 if 条件,看起来像这样:

SRC_URI += "file://file1.patch \
            file://file2.patch \
            file://file4.patch \
            **if $ENVIRONMENT_VARIABLE:
               file://file5.patch**
           "

有没有其他方法可以达到同样的效果?

好吧,简短的回答是:是的,你可以这样做,但它很混乱,可能有更好的方法 (TM)。所以我们先回答问题。如果您真的想使用环境变量更改配方的行为,第一个挑战是设置环境变量,然后让 bitbake 知道您的新环境变量是安全和允许的。当您使用 oe-init-build-env 脚本来设置您的项目或随后设置您的新 shell 以继续处理该项目时,它会设置一个名为 BB_ENV_EXTRAWHITE 的环境变量。您必须像这样在此列表中包含新的环境变量:

$ export MYENV_VAR=file5.patch
$ export BB_ENV_EXTRAWHITE="$BB_ENV_EXTRAWHITE MYENV_VAR"

完成后,bitbake 将不会清除新环境变量的环境。

在您的配方中,使用 python 片段有条件地添加您的补丁,如下所示:

SRC_URI += "${@os.getenv('MYENV_VAR', '')}"

如您所见,有点乱。当然,您可以变得更复杂一些,并在您的配方中测试变量的值,而不是将补丁文件的名称放入您的环境变量中,但此示例是演示该概念的最简单方法。

也许更好的方法是使用覆盖,而不是依赖环境变量。如果您正在构建具有多个变体的 bsp,您可以使用您的 bsp 名称作为覆盖,类似这样。

SRC_URI_append_mybsp = "file://file5.patch"

这是完成相同任务的更简洁的方法。当然,我在猜测您的用例。 yocto 项目参考手册解释了覆盖。还有一个建议,加入#yocto 或 yocto 项目邮件列表,你将有机会接触到许多聪明人来帮助你。

希望这对您有所帮助。 ;)

完成此操作的正确方法如下,

1。 local.conf

# comment the following line to remove file5.patch
ENV_VAR = "1"

注意:不要忘记包含双引号,否则 Yocto 会抛出错误。

2。 recipe.bbappend

SRC_URI += "${@bb.utils.contains('ENV_VAR', '1', 'file://file5.patch', '', d)}"

您可以自由使用任何 .conf 文件,而不是 local.conf。它取自 Yocto mailing list