如何在 Yocto 中用一个配方覆盖多个文件

如何在 Yocto 中用一个配方覆盖多个文件

我正在为 Yocto 编写一个图层。我想要两种硬件配置。一种是标准的通用配置,一种是特定于用例的配置,我不知道如何做到这一点。

这是我想要的一个例子。假设在通用映像配方中,我希望为 DHCP 配置网络接口。在用例图像配方中,我希望将其配置为静态 IP。

我可以编写一个 bbappend 来覆盖 init-ifupdown 配方的标准文件,但这会更改使用 init-ifupdown 配方的所有实例的文件。我只希望在构建用例图像配方时更改文件,而不是通用图像。

并进一步迈出这一步。我想要在 rootfs 中替换大约十几个文件。我不想为每一个都写一个 bbappend。

知道如何编写一个食谱来替换一些文件,而不会出现“该文件已由包提供”错误吗?并且不必编写十几个 bbappend 文件?

我知道在 buildroot 中这可以通过覆盖轻松完成,不幸的是我被 yocto 困住了。

谢谢

答案1

为了实现您所讨论的目的,您可以在适当的发行版.conf文件中使用 PREFERRED_VERSION ,以根据包版本随您的构建而变化。然后可以创建一个包版本以匹配发行版 .conf 文件中的 PREFERRED_VERSION。这允许同一项目根据正在构建的发行版生成具有不同配置等的不同图像。合并到现有项目中将取决于该项目的结构,但这是您的总体方向。

答案2

解决方案是这不能发生。

我的研究让我发现这被称为构建的“调味”。而 Yocto 的创建方式并不是为了让这种情况在此时发生。据我所知,这在不久的将来不会发生。

已经有一些独立的努力使用单个“.inc”文件来实现此目的,该文件包含在任何受影响的配方中,该文件将允许配方选择完成其包的路径,但该“.inc”文件中的数据需要使用 yocto 系统外部的工具手动操作。

这是我在 yocto 邮件列表中找到的关于该主题的线程: https://lists.yoctoproject.org/pipermail/yocto/2014-June/020249.html

至于一个食谱中的多个文件替换,我还发现这也是不可能的,除非我相信可能禁用了“疯狂检查”,无论哪种方式我都还没有弄清楚这一点并且正在放弃对它的工作。

答案3

我使用的一种方法是在我的层中创建一个新的机器配置文件。这允许我对不同的机器使用 OVERRIDE 语法。

https://docs.yoctoproject.org/next/dev-manual/new-machine.html

  recipe/
    files/
      specific.conf
        -- default gets copied to WORKDIR
      newmachine/
        specific.conf
        -- gets copied to WORKDIR for newmachine only
    recipe.bbappend
      SRC_URI += "file://specfic.conf"

相关内容