使用populate_sdk来包含内核头文件

13

如何在Yocto中将Linux内核头文件包含在SDK包中?

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

我可以使用bitbake myimage -c populate_sdk生成SDK。然而,这不包括内核头文件(我只看到sysroots/<mach>/usr/include/linux)。如何使内核头文件包含在SDK包中?另外,我不希望内核头文件出现在我的目标映像中。

[编辑] 我的映像配方如下:

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

3个回答

24

fido版本开始,内核构建的处理方式已经改变。在之前的版本中,通常可以直接跳到下面的用法示例。

fido或任何1.8+版本中,如果您想要在SDK中使用内核源代码和构建系统,您应该添加:

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

    如果需要以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/下找到内核源码,则需要查找该问题。


我并不是在问如何为一个外部模块设置食谱,而是在询问如何让Yocto在构建SDK时包含内核头文件。在我的SDK中,没有 <sdk>/sysroots/<mach>usr/src/kernel。我想知道的是如何让Yocto将其包含在SDK中。 - benf
好的,那么在你的设置中涉及哪些层和图像?我明天必须与第二构建进行双重检查。 - Anders
我正在使用带有meta-linaro(GCC 4.9)和meta-altera层的原始Yocto 1.8。我还在使用我们自己的应用程序层,但其中唯一(我认为)相关的项目是图像配方,我已将其编辑到问题中。 - benf
感谢提供更新的信息!我已经更新了我的答案,增加了关于如何将内核源代码添加到fido版本的SDK中的信息,因为内核处理方式已经改变。我已经验证了我的答案中“使用示例”部分的工作流确实有效(至少在纯“Poky”检查中,构建qemux86)。 - Anders
是的,那就是诀窍;TOOLCHAIN_TARGET_TASK!非常感谢。另外,我编辑了你回答中的第5步,以澄清在使用sudo运行make时需要发生什么。 - benf
很高兴听到这个消息!感谢您的编辑!大多数情况下,我已经确保我直接拥有安装位置的写入访问权限,因此我很容易忘记sudo的要求! - Anders

1

2
这将在rootfs中安装内核源代码。 - md.jamal

0

使用 Yocto Zeus (3.0.x),将以下内容添加到您的镜像配方中:

    TOOLCHAIN_TARGET_TASK += "kernel-devsrc"

编辑:对于Gatesgarth(3.2.x)也是一样的,但make scripts命令有一个新的主机依赖项libyaml-dev


+= 等同于 _append。 - woodz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接