【问题标题】:Using populate_sdk to include kernel headers使用 populate_sdk 包含内核头文件
【发布时间】:2015-07-06 22:30:39
【问题描述】:

如何在 Yocto 中将 linux 内核头文件作为 SDK 包的一部分包含在内?

我在一个嵌入式项目中使用 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。

【问题讨论】:

    标签: linux-kernel yocto


    【解决方案1】:

    从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 构建时自动选择正确的位置。

    手动构建内核模块:

    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 modules_prepare

      如果这需要sudo运行,一定要在sudo环境下source环境文件:sudo bash -c "source <sdk-install-path>/environment-setup-<mach> && make modules_prepare"

    6. 回到你的模块目录。

    7. KERNEL_SRC=<sdk-install-path>/sysroots/<mach>/usr/src/kernel LDFLAGS="" make

    现在应该允许您构建模块了。

    如果您在sysroots/<mach>/usr/src/kernel/ 下没有内核源代码,我们将不得不对其进行调查。

    【讨论】:

    • 我不是在问如何为树外模块设置配方,我是在问如何让 yocto 在它构建的 SDK 中包含内核头文件。在我的 SDK 中没有<sdk>/sysroots/<mach>usr/src/kernel。我想知道的是让 yocto 将它包含在 SDK 中。
    • 好的,那么您的设置中涉及哪些图层和图像?我明天必须仔细检查第二个版本。
    • 我正在使用带有 meta-linaro (GCC 4.9) 和 meta-altera 层的股票 Yocto 1.8。我也在使用我们自己的应用程序层,但其中唯一(我认为)相关的项目是图像配方,我已将其编辑到问题中。
    • 感谢更新信息!我已经更新了我的答案,添加了有关如何将内核源代码添加到 fido 版本的 SDK 中的信息,因为内核处理已更改。我已经验证了我的答案中 Usage Example 部分的工作流程确实有效(至少在纯粹的 Poky 结帐上,为 qemux86 构建)。
    • 是的,成功了; TOOLCHAIN_TARGET_TASK!非常感谢。另外,我在您的回答中编辑了第 5 步,以阐明如果使用 sudo 运行 make 需要发生什么。
    【解决方案2】:

    andersanswer很不错,但是在最近的yocto版本中添加kernel-devsrc的方式好像是

    IMAGE_INSTALL += "kernel-devsrc"

    我在这里找到的:https://www.mail-archive.com/yocto@yoctoproject.org/msg36448.html

    【讨论】:

    • 这也会在rootfs中安装内核源代码
    【解决方案3】:

    使用 Yocto Zeus (3.0.x) 将其添加到您的图像配方中:

        TOOLCHAIN_TARGET_TASK += "kernel-devsrc"
    

    【讨论】:

      猜你喜欢
      • 2014-12-02
      • 1970-01-01
      • 2017-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多