Linux kernel 使用populate_sdk包含内核头
如何将linux内核头作为SDK包的一部分包含在Yocto中 我在一个嵌入式项目中使用Yocto 1.8(fido),希望进行树外内核模块开发。目前,我可以通过在运行make时将我的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
$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构建时自动选择正确的位置)
要手动构建内核模块,请执行以下操作:
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中安装内核源代码