使用populate_sdk包含内核头文件

ben*_*enf 7 linux-kernel yocto

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

我在嵌入式项目中使用Yocto 1.8(fido),并希望进行树外核心模块开发.目前,我可以通过在运行make时指向我$KERNEL_PATHpoky/build/tmp/work-shared/<machine>/kernel-source/目录来构建我的内核模块(除了bitbake).但是,我不想长期这样做,因为其他人需要轻松构建模块而无需安装和构建bitbake的完整图像.

我可以使用生成SDK bitbake myimage -c populate_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
Run Code Online (Sandbox Code Playgroud)

我正在使用的内核是meta-altera层中的linux-altera-ltsi-rt.

And*_*ers 15

fido发布版本开始,内核构建的处理已经发生了变化.在以前的版本中,您通常可以跳到下面的用法示例.

fido任何1.8+中,如果你想在SDK中使用内核src和构建系统,你应该添加

TOOLCHAIN_TARGET_TASK_append = " kernel-devsrc"
Run Code Online (Sandbox Code Playgroud)

到您的图像食谱.这将确保将新的kernel-devsrc软件包安装到您的工具链中.

以下过程只是为了确保完全理解工作流程的其余部分(即使它不是原始问题的严格部分).

用法示例

让我们假设一个模块Makefile如下:

obj-m += hello-1.o
all:
    make -C  $(KERNEL_SRC) M=$(PWD) modules

clean:
    make -C  $(KERNEL_SRC) M=$(PWD) clean
Run Code Online (Sandbox Code Playgroud)

"Linux内核模块编程指南"中的示例(请注意,实际命令需要有缩进的制表符).

然后,你必须sysroots/<mach>/usr/src/kernel/在Makefile或make调用中定义KERNEL_SRC .(使用类似的变量KERNEL_SRC将确保您的模块配方在使用bitbake构建时自动选择正确的位置).

要手动构建内核模块:

  1. 获取SDK的environment-*文件.
  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 silentoldconfig scripts

    如果需要使用sudo运行,请确保在sudo环境中获取环境文件: sudo bash -c "source <sdk-install-path>/environment-setup-<mach> && make silentoldconfig scripts"

  6. 返回模块目录.
  7. KERNEL_SRC=<sdk-install-path>/sysroots/<mach>/usr/src/kernel LDFLAGS="" make

现在应该允许您构建模块.

如果您没有内核源代码ysroots/<mach>/usr/src/kernel/,我们将不得不研究它.