我在嵌入式项目中使用Yocto 1.8(fido),并希望进行树外核心模块开发.目前,我可以通过在运行make时将$KERNEL_PATH指向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
我正在使用的内核是Meta-altera层中的linux-altera-ltsi-rt.
解决方法
在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内核模块编程指南”中的示例(请注意,实际命令需要有缩进的制表符).
然后,你必须在Makefile或make调用中将KERNEL_SRC定义为sysroots /< mach> /usr/src / kernel /. (使用像KERNEL_SRC这样的变量将确保您的模块配方在使用bitbake构建时自动选择正确的位置).
要手动构建内核模块:
>获取SDK的environment- *文件.
>转到模块目录.
> KERNEL_SRC =< sdk-install-path> / sysroots /< mach> /usr/src / kernel LDFLAGS =“”make然而,这将失败,因为无法找到fixdep.我们将手动修复此问题.
> cd< sdk-install-path> / sysroots /< mach> /usr/src / kernel
>制作silentoldconfig脚本
如果需要使用sudo运行,请确保在sudo环境中获取环境文件:sudo bash -c“source< sdk-install-path> / environment-setup-< mach>&& make silentoldconfig脚本”
>返回模块目录.
> KERNEL_SRC =< sdk-install-path> / sysroots /< mach> /usr/src / kernel LDFLAGS =“”make
现在应该允许您构建模块.
如果您没有ysroots /< mach> /usr/src / kernel /下的内核源代码,我们将不得不研究它.