如何在 Yocto 中包含 linux 内核头文件作为 SDK 包的一部分?
我在嵌入式项目中使用 Yocto 1.8 (fido) 并想做树外内核模块开发。目前,我可以通过指向我的 $KERNEL_PATH
来构建我的内核模块(除了 bitbake)。到poky/build/tmp/work-shared/<machine>/kernel-source/
运行make时的目录。但是,我不想长期这样做,因为其他人需要轻松构建模块,而无需安装和构建来自 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在 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
取自 The Linux Kernel Module Programming Guide 的示例(请注意,实际命令需要有一个制表符用于缩进)。然后您必须将 KERNEL_SRC 定义为
sysroots/<mach>/usr/src/kernel/
,无论是在 Makefile 中,还是来自您的 make 调用。 (使用像 KERNEL_SRC
这样的变量将确保您的模块配方在使用 bitbake 构建时自动选择正确的位置)。要手动构建内核模块:
KERNEL_SRC=<sdk-install-path>/sysroots/<mach>/usr/src/kernel LDFLAGS="" make
但是,这将失败,因为无法找到 fixdep。我们将手动解决此问题。cd <sdk-install-path>/sysroots/<mach>/usr/src/kernel
make modules_prepare
如果需要使用 sudo 运行,请务必在 sudo 环境中 source 环境文件:sudo bash -c "source <sdk-install-path>/environment-setup-<mach> && make modules_prepare"
KERNEL_SRC=<sdk-install-path>/sysroots/<mach>/usr/src/kernel LDFLAGS="" make
这现在应该允许您构建您的模块。
如果您在
sysroots/<mach>/usr/src/kernel/
下没有内核源,我们将不得不对此进行调查。
关于linux-kernel - 使用 populate_sdk 包含内核头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31256770/