【问题标题】:Image-specific layers图像特定层
【发布时间】:2021-09-10 23:42:32
【问题描述】:

我正在为不同的项目构建多个基于 poky 的图像,但使用相同的构建目录(因为为每个项目创建一个新的 yocto 克隆似乎有点矫枉过正)。

但由于他们定义的.bbappend,我碰巧有我的图像相互冲突。例如,我有两个图像,每个图像都扩展了 hostapd 配方,以便定义自己的配置文件。

让我用一个例子来说明。我有两个层,每个层都定义了一个图像:第一个项目和第二个项目。每个都有自己的层,因为它们属于不同的存储库:meta-first-projectmeta-second-project。两者都使用hostapd。所以他们的项目看起来像这样:

元优先项目:

.
├── conf
│   └── layer.conf
├── recipes-connectivity
│   └── hostapd
│       ├── hostapd
│       │   └── hostapd.conf
│       └── hostapd_%.bbappend
└── recipes-first-project
    └── images
        └── first-project-image.bb

元秒项目:

.
├── conf
│   └── layer.conf
├── recipes-connectivity
│   └── hostapd
│       ├── hostapd
│       │   └── hostapd.conf
│       └── hostapd_%.bbappend
└── recipes-second-project
    └── images
        └── second-project-image.bb

每个都有不同的hostapd.conf

conf/bblayers.conf 文件如下所示,包括两个层:

conf/bblayers.conf:

BBLAYERS ?= " \
  /home/user/Documents/yocto/poky/meta \
  /home/user/Documents/yocto/poky/meta-poky \
  /home/user/Documents/yocto/poky/meta-yocto-bsp \
  /home/user/Documents/yocto/meta-first-project \
  /home/user/Documents/yocto/meta-second-project \

当我运行bitbake first-project-image 时,我希望它使用meta-first-project 中的hostapd_%.bbappend 而不是meta-second-project 中的那个。但我的理解是两者都会被评估,这意味着meta-second-project/hostapd_%.bbappend 会对我的first-project-image 产生影响,这是我不想要的。

有没有办法解决这个问题,或者我应该有两个构建文件夹(并在那里下载、构建和复制所有内容)?

例如,我考虑在meta-first-project(伪代码)中的hostapd 的bbappend 中检查类似的内容:

if (${IMAGE_BASENAME} == "first-project-image") {
  // write the whole bbappend here
}

这样这个 bbappend 只在构建图像first-project-image 时被考虑。但是,${IMAGE_BASENAME} 似乎没有在 hostapd 配方中设置...

另一个类似于COMPATIBLE_HOSTCOMPATIBLE_MACHINE 的想法是定义一个COMPATIBLE_IMAGE 变量,但它不存在。

【问题讨论】:

    标签: yocto openembedded


    【解决方案1】:

    您无法根据图像更改单个食谱的内容,这是系统构建方式的简单且不可避免的限制。原因是软件包是在构建 rootfs/image 之前很久就从配方构建的,因此它对其没有影响。所有图像都使用相同的包集。您可以重复使用相同的下载、构建目录和树,只需将 bblayers.conf 更改为使用一层或另一层,一切都会正常工作,但没有办法让两个图像在相同的配置下工作。

    还有其他选择。您可以将 hostapd 更改分成两个不同的配方,然后通过包含正确的配方让每个图像都包含正确的内容。您还可以在构建时调整图像(请参阅 rootfs-postcommands.bbclass)。您可以指定两个不同的 DISTRO 设置并在它们之间切换,或者可能根据 MA​​CHINE 设置在配置之间切换(使 hostapd 配方机器特定于机器),但这两个确实需要在映像之间进行配置更改。 Multiconfig 可能有帮助,也可能没有帮助,从这里的信息很难说。

    没有 COMPATIBLE_IMAGE 选项,因为配方对所有图像都是通用的,这正是系统设计和工作的方式,它不会为每个图像构建新的配方集。

    【讨论】:

    • 感谢您的解释!所以 DISTRO 设置类似于上面@BelHadjSalem TALEL 的答案,但在 DISTRO 级别而不是在图像中定义?
    • With@BelHadjSalem TALEL 的回答你会从 COMPATIBLE_MACHINE 中得到一些“向后”的东西,你可以将它写在配置文件中,它会导致 hostap 重建。您无法从图像配方中进行设置。一旦您开始这样做,OE 中自然适合的就是 DISTRO 配置。如果您正确设置配置,您也可以从命令行更改 DISTRO(例如 DISTRO=A bitbake X)。
    【解决方案2】:

    您可以创建自己的 COMPATIBLE_IMAGE 变量并使用它有条件地附加 conf 文件。

    例如,在您的meta-first-project/recipes-connectivity/hostapd/hostapd_%.bbappend:

    SRC_URI_append = " ${@bb.utils.contains('COMPATIBLE_IMAGE', 'first-project-image', 'file://hostapd.conf', '', d)}"
    

    对于您的第二张图片以及

    meta-second-project/recipes-connectivity/hostapd/hostapd_%.bbappend:

    SRC_URI_append = " ${@bb.utils.contains('COMPATIBLE_IMAGE', 'second-project-image', 'file://hostapd.conf', '', d)}"
    

    现在,只有当COMPATIBLE_IMAGE 包含first-project-image 时,第一个conf 文件才会附加到SRC_URI。

    您现在可以在任何您想要的地方定义COMPATIBLE_IMAGE,您可以在 local.conf 中设置它以用于测试目的或在您的图像配方中:

    COMPATIBLE_MACHINE = "first-project-image"
    

    您现在可以在任何地方使用COMPATIBLE_MACHINE 变量,原理相同。

    现在,如果您要附加到一些 hostapd 任务并使用 conf 文件,请确保在使用之前对变量进行测试,并且如果 hostapd 直接理解 conf 文件并在没有覆盖某些任务的情况下使用您不需要测试在变量上。

    【讨论】:

      【解决方案3】:

      您好,您的用例似乎与 BBMASK 兼容。

      “防止 BitBake 处理配方和配方附加文件。”

      取自documentation

      使用此变量,您可以隐藏不想与图层交互的 bbappend。从您的示例开始,您将在 meta-first-project 的 conf 文件中包含以下行:

      BBMASK += "meta-second-project/recipes-connectivity/hostapd"
      

      但是,如果你的两个层不相互依赖,那么在它们各自的 bblayers.conf 中不引用它们会更简单。如果 meta-second-project 不需要构建 meta-first-project 提供的镜像,只需从 bblayers.conf 中删除 meta-second-project。

      【讨论】:

      • 谢谢!我不是 BBMASK 想法的忠实拥护者,因为每次我添加一个新层时,我都需要将它添加到每个人的 BBMASK 中。这就是我想要相反的原因(这个COMPATIBLE_IMAGE 想法)。关于 bblayers.conf,我只能有一个这样的文件,对吧?所以当我从一个图像切换到另一个图像时,我需要去编辑 bblayers.conf。对吗?
      • 是的,只有一个 bblayers.conf,但您可能有不同的构建目录设置脚本(将从您想要的层中选择一个示例 bblayer)为每个图像:yoctoproject.org/docs/2.1/ref-manual/…
      【解决方案4】:

      我从您的帖子中猜测这两个项目使用的是同一台机器? 如果它们是不同的机器,你会有更多的工具......

      我可能会用require hostapd.bb 创建一个hostapd-foo.bb。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-29
        • 1970-01-01
        • 2019-06-22
        • 2015-12-06
        • 1970-01-01
        • 2016-12-21
        • 2013-08-28
        • 2017-12-28
        相关资源
        最近更新 更多