使用 populate_sdk 包含内核 headers
Using populate_sdk to include kernel headers
如何将 linux 内核 headers 作为 SDK 包的一部分包含在 Yocto 中?
我在嵌入式项目中使用 Yocto 1.8 (fido) 并想进行 out-of-tree 内核模块开发。目前,我可以通过在 运行 make 时将 $KERNEL_PATH
指向 poky/build/tmp/work-shared/<machine>/kernel-source/
目录来构建我的内核模块(除了 bitbake)。但是,从长远来看,我不想这样做,因为其他人需要轻松构建模块,而无需从 bitbake 安装和构建完整图像。
我可以使用 bitbake myimage -c populate_sdk
生成 SDK。但是,这不包括内核 headers(我只看到 sysroots/<mach>/usr/include/linux
)。如何使内核 headers 包含在 SDK 包中?另外,我不希望内核 headers 作为目标图像的一部分出现。
[编辑]
我的图片配方如下:
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
示例取自 Linux 内核模块编程指南(请注意,实际命令需要使用制表符进行缩进)。
然后您必须将 KERNEL_SRC 定义为 sysroots/<mach>/usr/src/kernel/
,或者在 Makefile 中,或者从您的 make 调用中。 (使用像 KERNEL_SRC
这样的变量将确保您的模块配方在使用 bitbake 构建时自动选择正确的位置)。
手动构建内核模块:
为您的 SDK 获取环境-* 文件。
转到模块目录。
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
如果这需要运行 with sudo,请务必在sudo环境中获取环境文件: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/
下的内核源代码,我们将不得不进行调查。
anders 很好,但是最近版本的yocto中添加kernel-devsrc的方式好像是
IMAGE_INSTALL += "kernel-devsrc"
我在这里找到的:https://www.mail-archive.com/yocto@yoctoproject.org/msg36448.html
使用 Yocto Zeus (3.0.x) 将此添加到您的图像配方中:
TOOLCHAIN_TARGET_TASK += "kernel-devsrc"
编辑:与 Gatesgarth (3.2.x) 相同,但 make scripts
命令对 libyaml-dev
具有新的主机依赖性
如何将 linux 内核 headers 作为 SDK 包的一部分包含在 Yocto 中?
我在嵌入式项目中使用 Yocto 1.8 (fido) 并想进行 out-of-tree 内核模块开发。目前,我可以通过在 运行 make 时将 $KERNEL_PATH
指向 poky/build/tmp/work-shared/<machine>/kernel-source/
目录来构建我的内核模块(除了 bitbake)。但是,从长远来看,我不想这样做,因为其他人需要轻松构建模块,而无需从 bitbake 安装和构建完整图像。
我可以使用 bitbake myimage -c populate_sdk
生成 SDK。但是,这不包括内核 headers(我只看到 sysroots/<mach>/usr/include/linux
)。如何使内核 headers 包含在 SDK 包中?另外,我不希望内核 headers 作为目标图像的一部分出现。
[编辑] 我的图片配方如下:
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
示例取自 Linux 内核模块编程指南(请注意,实际命令需要使用制表符进行缩进)。
然后您必须将 KERNEL_SRC 定义为 sysroots/<mach>/usr/src/kernel/
,或者在 Makefile 中,或者从您的 make 调用中。 (使用像 KERNEL_SRC
这样的变量将确保您的模块配方在使用 bitbake 构建时自动选择正确的位置)。
手动构建内核模块:
为您的 SDK 获取环境-* 文件。
转到模块目录。
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
如果这需要运行 with sudo,请务必在sudo环境中获取环境文件:
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/
下的内核源代码,我们将不得不进行调查。
anders
IMAGE_INSTALL += "kernel-devsrc"
我在这里找到的:https://www.mail-archive.com/yocto@yoctoproject.org/msg36448.html
使用 Yocto Zeus (3.0.x) 将此添加到您的图像配方中:
TOOLCHAIN_TARGET_TASK += "kernel-devsrc"
编辑:与 Gatesgarth (3.2.x) 相同,但 make scripts
命令对 libyaml-dev