使用 populate_sdk 包含内核 headers

Using populate_sdk to include kernel headers

如何将 linux 内核 headers 作为 SDK 包的一部分包含在 Yocto 中?

我在嵌入式项目中使用 Yocto 1.8 (fido) 并想进行 out-of-tree 内核模块开发。目前,我可以通过在 运行 make 时将 $KERNEL_PATH 指向 poky/build/tmp/work-shared/<machine>/kernel-source/ 目录来构建我的内核模块(除了 bitbake)。但是,从长远来看,我不想这样做,因为其他人需要轻松构建模块,而无需从 bitbake 安装和构建完整图像。

我可以使用 bitbake myimage -c populate_sdk 生成 SDK。但是,这不包括内核 headers(我只看到 sysroots/<mach>/usr/include/linux)。如何使内核 headers 包含在 SDK 包中?另外,我不希望内核 headers 作为目标图像的一部分出现。

[编辑] 我的图片配方如下:

EXTRA_IMAGE_FEATURES_append = " eclipse-debug debug-tweaks"
TOOLCHAIN_HOST_TASK_append = " nativesdk-cmake"
IMAGE_INSTALL = "packagegroup-core-boot  ${CORE_IMAGE_EXTRA_INSTALL} util-linux kernel-modules netbase busybox base-passwd base-files sysvinit initscripts bash gdbserver strace sysfsutils dtc gawk ethtool grep sed wget  iptables oprofile net-tools dropbear rsync stress-ng rt-tests i2c-tools"
inherit core-image

我用的内核是linux-altera-ltsi-rt在meta-altera层

fido 版本开始,内核构建的处理方式发生了变化。在以前的版本中,您通常可以直接跳到下面的用法示例。

fido 或任何 1.8+ 中,如果您想要 SDK 中可用的内核 src 和构建系统,您应该添加

TOOLCHAIN_TARGET_TASK_append = " kernel-devsrc"

到你的图像配方。这将确保新的 kernel-devsrc 包安装到您的工具链中。

下面的过程只是为了确保完全理解工作流程的其余部分(即使严格来说它不是原始问题的一部分)。

使用示例

让我们假设模块 Makefile 如下:

obj-m += hello-1.o
all:
    make -C  $(KERNEL_SRC) M=$(PWD) modules

clean:
    make -C  $(KERNEL_SRC) M=$(PWD) clean

示例取自 Linux 内核模块编程指南(请注意,实际命令需要使用制表符进行缩进)。

然后您必须将 KERNEL_SRC 定义为 sysroots/<mach>/usr/src/kernel/,或者在 Makefile 中,或者从您的 make 调用中。 (使用像 KERNEL_SRC 这样的变量将确保您的模块配方在使用 bitbake 构建时自动选择正确的位置)。

手动构建内核模块:

  1. 为您的 SDK 获取环境-* 文件。

  2. 转到模块目录。

  3. KERNEL_SRC=<sdk-install-path>/sysroots/<mach>/usr/src/kernel LDFLAGS="" make 但是,这会失败,因为找不到 fixdep。我们将手动修复此问题。

  4. cd <sdk-install-path>/sysroots/<mach>/usr/src/kernel

  5. make modules_prepare

    如果这需要运行 with sudo,请务必在sudo环境中获取环境文件:sudo bash -c "source <sdk-install-path>/environment-setup-<mach> && make modules_prepare"

  6. 返回模块目录。

  7. KERNEL_SRC=<sdk-install-path>/sysroots/<mach>/usr/src/kernel LDFLAGS="" make

现在您应该可以构建自己的模块了。

如果您没有 sysroots/<mach>/usr/src/kernel/ 下的内核源代码,我们将不得不进行调查。

anders 很好,但是最近版本的yocto中添加kernel-devsrc的方式好像是

IMAGE_INSTALL += "kernel-devsrc"

我在这里找到的:https://www.mail-archive.com/yocto@yoctoproject.org/msg36448.html

使用 Yocto Zeus (3.0.x) 将此添加到您的图像配方中:

    TOOLCHAIN_TARGET_TASK += "kernel-devsrc"

编辑:与 Gatesgarth (3.2.x) 相同,但 make scripts 命令对 libyaml-dev

具有新的主机依赖性