linux-kernel - 使用 populate_sdk 包含内核头文件

标签 linux-kernel yocto

如何在 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 构建时自动选择正确的位置)。
要手动构建内核模块:
  • 为您的 SDK 获取 environment-* 文件。
  • 转到您的模块目录。
  • 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/

    相关文章:

    autotools - 构建环境如何将新的 LDFLAGS 引入自动配置构建

    makefile - 是否可以将 CFLAGS 设置为 Linux 内核模块 Makefile?

    c - 为什么 builtin_expect 取的是 long 而不是 bool?

    c - 结构数组末尾的空大括号 '{ }' 需要什么?

    linux - 如何知道 Linux 中终端的确切名称?

    linux - 使用SDK编译模块抛出警告消息: libelf-dev not found

    linux-kernel - 识别创建 sysfs 条目的内核模块

    linux - 如何从 .hddimg 文件启动?

    linux - Yocto 与 Jethro 2.0 和 meta-altera

    ffmpeg - 硬件加速 RPI4 FFmpeg