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

时间:2015-07-07 22:48:28

标签: embedded-linux yocto

我有食谱文件,我的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**
           "

还有其他方法可以达到同样的目的吗?

2 个答案:

答案 0 :(得分:2)

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

$ 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 :(得分:0)

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

1.本地.conf

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

2. recipe.bbappend

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

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