【问题标题】:How does "bitbake virtual/kernel" work if kernel recipes don't have PROVIDES variable set to virtual/kernel?如果内核配方没有将 PROVIDES 变量设置为虚拟/内核,“bitbake 虚拟/内核”如何工作?
【发布时间】:2021-04-13 17:39:33
【问题描述】:

我正在尝试了解一些与使用 bitbake 编译 linux 映像并生成将用于闪存到处理器上的启动映像相关的部分。

  • bitbake virtual/kernel 怎么真的有效?通读section 2.3,它说recipes 使用PROVIDES 参数添加一个额外的提供程序,这表明可以以多种方式调用recipe(通过其名称以及PROVIDES 设置的任何内容)。但我检查的内核配方 (../poky/meta-bsp/recipes-kernel) 没有 PROVIDES 参数,更不用说将其设置为 virtual/kernel
  • 在运行bitbake virtual/kernel 时,为什么会生成boot.img,而它应该只生成一个Linux 二进制文件,例如vmlinux? 在其中一个内核 .inc 文件中,我看到:
DEPENDS += " mkbootimg-native openssl-native kern-tools-native"
...
FILESPATH =+ "${WORKSPACE}:"
SRC_URI   =  "file://kernel \
              ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'file://systemd.cfg', '', d)} \
              ${@bb.utils.contains('DISTRO_FEATURES', 'virtualization', 'file://virtualization.cfg', '', d)} \
              ${@bb.utils.contains('DISTRO_FEATURES', 'nand-squashfs', 'file://squashfs.cfg', '', d)} \

mkbootimg-native 我认为是指内核配方所依赖的启动映像配方,但不应该反过来,因为启动映像应该包含内核映像本身吗?

  • 最后,有没有办法将调试打印放在不同的配方文件中以查看它是否被调用?我试过echo...无济于事

【问题讨论】:

    标签: linux-kernel embedded-linux yocto bitbake


    【解决方案1】:

    您检查的食谱可能有PROVIDES。大多数(如果不是全部)内核配方 inherit kernel 类(直接或通过其他一些类,例如 kernel-yocto)。 kernel.bbclass 实际上为你指定了PROVIDES,c.f. http://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/meta/classes/kernel.bbclass#n8)。

    boot.img 似乎没有默认为任何机器创建。快速浏览一下代码后,似乎这是由wic 为继承image-live bbclass 的图像创建的,或者通过将live 添加到IMAGE_FSTYPES,c.f. http://docs.yoctoproject.org/ref-manual/classes.html#image-live-bbclass。 从 poky git repo 中的一个简单 git grep 来看,似乎只有 bootimg-efi.py 实际上在使用 boot.img 做某事,当 wic 调用 -b--bootimg-dir 参数时,这是强制的使用wic。因此,boot.img 工件可能是仅为 EFI 机器和图像创建的。

    如果您在任务中使用echoprintf 或类似的shell 函数(或Python 任务中的print),您只能在配方的${WORKDIR}/temp/log.do_<task> 中看到它们。否则,您可以使用bbplainbbnotebbdebugbbwarnbberrorbbfatal。这将打印到日志和控制台(取决于您可以使用-D 配置的日志级别(D 越多,日志级别越高))。

    【讨论】:

    • kernel.bbclass 在哪里?在poky/meta-bsp/classes 和其他一些目录下似乎找不到。关于boot.img,我做了一些挖掘并意识到有一个任务do_make_bootimg位于内核目录下的log.do_listtasks,这意味着每次我运行bitbake virtual/kernel1, do_make_bootimg`都会被调用,最终生成一个启动映像。作为后续,您知道是什么决定了在编译特定图像时需要运行哪些任务吗?
    • 关于打印,${WORKDIR}/temp/log.do_<task> -> task 是什么?我在哪里使用printfecho?另外,我确实使用了bbwarn 和其他人,但它只是给出了我们的语法错误
    • kernel.bbclassopenembedded-core/classespoky/meta/classes 中,正如我粘贴的链接所暗示的那样。 Yocto 为任务创建一个依赖树。当您请求运行任务时,它的所有依赖项都会预先运行。当您运行 bitbake my-recipe 时,Yocto 会触发 build 任务,该任务在其依赖关系树中具有大部分任务。当您将配方添加到DEPENDS 时,将触发所述包的do_populate_sysroot。等等……
    • task 是您在其中添加了echoprintf 语句的任务的名称。如果您尝试使用bbwarn 但没有成功,也许您也可以要求这个?以bbwarn 中的示例为例,在 poky 食谱中使用,如果您仍然找不到问题所在,请创建一个新帖子。
    • docs.yoctoproject.org/bitbake/bitbake-user-manual/… 声明继承指令仅适用于类(/classes/ 目录中以 .bbclass 结尾的文件)。因此,.bbclass 将是多余的。
    猜你喜欢
    • 1970-01-01
    • 2018-02-23
    • 2011-06-17
    • 2012-08-26
    • 2020-05-21
    • 2014-06-17
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    相关资源
    最近更新 更多