Linux kernel 使用populate_sdk包含内核头

Linux kernel 使用populate_sdk包含内核头,linux-kernel,yocto,Linux Kernel,Yocto,如何将linux内核头作为SDK包的一部分包含在Yocto中 我在一个嵌入式项目中使用Yocto 1.8(fido),希望进行树外内核模块开发。目前,我可以通过在运行make时将我的$kernel\u路径指向poky/build/tmp/work shared//kernel source/目录来构建我的内核模块(除了bitbake)。但是,从长远来看,我不想这样做,因为其他人需要轻松构建模块,而无需从bitbake安装和构建完整映像 我可以使用bitbake myimage-c populat

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

我在一个嵌入式项目中使用Yocto 1.8(fido),希望进行树外内核模块开发。目前,我可以通过在运行make时将我的
$kernel\u路径
指向
poky/build/tmp/work shared//kernel source/
目录来构建我的内核模块(除了bitbake)。但是,从长远来看,我不想这样做,因为其他人需要轻松构建模块,而无需从bitbake安装和构建完整映像

我可以使用
bitbake myimage-c populate\u SDK
生成SDK。但是,这并不包括内核头(我所看到的只是
sysroot//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
obj-m += hello-1.o
all:
    make -C  $(KERNEL_SRC) M=$(PWD) modules

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

我正在使用的内核位于meta altera层。

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

fido
或任何1.8+中,如果希望SDK中提供内核src和构建系统,则应添加

TOOLCHAIN_TARGET_TASK_append = " kernel-devsrc"
你的形象食谱。这将确保新的
内核devsrc
包安装到您的工具链中

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

用法示例 假设模块
Makefile
,如下所示:

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
obj-m += hello-1.o
all:
    make -C  $(KERNEL_SRC) M=$(PWD) modules

clean:
    make -C  $(KERNEL_SRC) M=$(PWD) clean
示例摘自《Linux内核模块编程指南》(注意,实际命令需要有一个用于缩进的制表符)

然后,您必须在Makefile中或通过make调用将KERNEL\u SRC定义为
sysroot//usr/SRC/KERNEL/
。(使用像
KERNEL\u SRC
这样的变量将确保您的模块配方在使用bitbake构建时自动选择正确的位置)

要手动构建内核模块,请执行以下操作:

  • 源环境-*文件为您的SDK

  • 转到你的模块目录

  • KERNEL\u SRC=/sysroot//usr/SRC/KERNEL LDFLAGS=”“make
    但是,这将失败,因为找不到fixdep。我们将手动修复此问题

  • cd/sysroot//usr/src/kernel

  • 生成silentoldconfig脚本

    如果需要在sudo环境中运行此操作,请确保在sudo环境中为环境文件提供源代码:
    sudobash-c“源代码/环境设置-&&makesilentoldconfig脚本”

  • 返回模块目录

  • KERNEL\u SRC=/sysroot//usr/SRC/KERNEL LDFLAGS=”“make

  • 这将允许您构建模块

    如果您没有
    ysroots//usr/src/kernel/
    下的内核源代码,我们必须对此进行研究。

    非常好,但在最新版本的yocto中,添加内核devsrc的方法似乎是

    IMAGE\u INSTALL+=“kernel devsrc”

    我在这里找到了:

    与约克托·宙斯(3.0.x)一起将此添加到您的图像配方中:

        TOOLCHAIN_TARGET_TASK += "kernel-devsrc"
    

    我不是问如何为一个树外模块设置一个配方,我是问如何让yocto在它构建的SDK中包含内核头。在我的SDK中没有
    /sysroot/usr/src/kernel
    。我想知道的是让yocto将其包含在SDK中。好的,那么您的设置涉及哪些层和图像?明天我将不得不再次检查第二次构建。我将使用带有meta linaro(GCC 4.9)和meta altera层的库存Yocto 1.8。我也在使用我们自己的应用层,但唯一(我认为)相关的项目是图像配方,我已将其编辑到问题中。感谢更新信息!我已经更新了我的答案,添加了关于如何将内核源代码添加到fido发行版的SDK中的信息,因为内核处理已经更改。我已经验证了我的答案中
    使用示例
    部分的工作流是否真的有效(至少在为qemux86构建的纯
    Poky
    签出上有效);工具链\目标\任务!非常感谢你。另外,我在您的回答中编辑了步骤5,以澄清如果使用sudo运行make,需要发生什么。这也将在rootfs中安装内核源代码