在Yocto中如何访问内核Recipe提供的头文件?
问题描述
在STM OpenST-Linux Yocto项目中构建Xenomai4补丁时,遇到内核Recipe打包的kevl-headers头文件无法被TestApp访问的问题:
内核Recipe(linux-stm32mp)关键配置
SUMMARY = "Xenomai4 Patch" SECTION = "kernel" LICENSE = "GPL-v2.0" SRC_URI += "file://evl.patch" KERNEL_DEFCONFIG = "defconfig" KERNEL_CONFIG_FRAGMENTS = ... ... #HERE IS THE MAGIC <<== do_install:append(){ install -d ${D}${includedir}/kevl/evl cd ${S}/include/uapi/evl && find . -type f -name "*.h" -exec install -m 644 ${S}/include/uapi/evl/{} ${D}${includedir}/kevl/evl/{} } PACKAGES =+ " kevl-headers " FILES:kevl-headers += "${includedir}/kevl/evl/*
TestApp Recipe配置
SUMMARY = "Xenomai4 App" LICENSE = "MIT" PR = "r1" DEPENDS = "libevl libgpiod linux-stm32mp" SRC_URI = "file://CMakeLists.txt main.c" S = "${WORKDIR}" inherit cmake FILES:${PN} += ${bindir}/TestApp EXTRA_OECMAKE += "-DSTAGING_INCDIR=${STAGING_INCDIR}"
核心问题
kevl-headers的头文件存储路径:./build/tmp-glibc/work/stm32mp2-ostl-linux/linux-stm32mp/6.1.82-stm32mp-r2-r0/packages-split/kevl-headers/usr/include- TestApp的
STAGING_INCDIR路径:./build/tmp-glibc/work/cortexa35-ostl-linux/testapp/1.0-r1/recipe-sysroot/usr/include - 头文件未被自动同步到TestApp的编译环境,尝试多种方法(依赖内核目录、复制文件)均未解决。
解决方案
1. 修复内核Recipe的语法错误与包定义
首先修正内核Recipe中的两处错误,并完善kevl-headers包的配置:
SUMMARY = "Xenomai4 Patch" SECTION = "kernel" LICENSE = "GPL-v2.0" SRC_URI += "file://evl.patch" KERNEL_DEFCONFIG = "defconfig" KERNEL_CONFIG_FRAGMENTS = ... ... # 修正find命令语法错误,优化复制逻辑 do_install:append(){ install -d ${D}${includedir}/kevl/evl # 用cp简化复制,避免路径拼接错误 cp -r ${S}/include/uapi/evl/*.h ${D}${includedir}/kevl/evl/ # 若坚持用find,需补充闭合符号: # cd ${S}/include/uapi/evl && find . -type f -name "*.h" -exec install -m 644 {} ${D}${includedir}/kevl/evl/{} \; } # 完善包定义,修正引号闭合问题 PACKAGES += "kevl-headers" FILES:kevl-headers = "${includedir}/kevl/evl/*" # 标记为开发包,确保被部署到STAGING目录 DESCRIPTION:kevl-headers = "Xenomai4 EVL kernel user API headers"
2. 调整TestApp的依赖配置
在TestApp的Recipe中,添加kevl-headers作为直接依赖,让Yocto自动将头文件同步到TestApp的编译环境:
SUMMARY = "Xenomai4 App" LICENSE = "MIT" PR = "r1" # 替换原linux-stm32mp依赖为kevl-headers(或添加到依赖列表) DEPENDS = "libevl libgpiod kevl-headers" SRC_URI = "file://CMakeLists.txt main.c" S = "${WORKDIR}" inherit cmake FILES:${PN} += "${bindir}/TestApp" # 无需手动指定STAGING_INCDIR,Yocto会自动处理依赖路径 # EXTRA_OECMAKE += "-DSTAGING_INCDIR=${STAGING_INCDIR}"
3. 确保CMake正确查找头文件
在TestApp的CMakeLists.txt中添加头文件路径配置:
cmake_minimum_required(VERSION 3.10) project(TestApp) # 添加kevl头文件路径 include_directories(${CMAKE_SYSROOT}/usr/include/kevl) add_executable(TestApp main.c) # 链接libevl库 target_link_libraries(TestApp evl) install(TARGETS TestApp DESTINATION bin)
4. 验证与重建
- 清理旧构建产物:
bitbake -c cleanall linux-stm32mp testapp - 重新构建:
bitbake testapp
替代方案:贴合Yocto内核头包标准机制
如果需要更规范的内核头文件管理,可以将EVL头文件合并到内核开发头包中:
# 在linux-stm32mp.bb中添加 do_install:append(){ # 将EVL头文件安装到内核标准uapi路径 install -d ${D}${KERNEL_SRC_PATH}/include/uapi/evl cp -r ${S}/include/uapi/evl/*.h ${D}${KERNEL_SRC_PATH}/include/uapi/evl/ } # 确保头文件被包含在kernel-devsrc包中 FILES:kernel-devsrc += "${KERNEL_SRC_PATH}/include/uapi/evl/*"
此时TestApp只需依赖kernel-devsrc即可访问EVL头文件,但需注意避免与其他内核头文件冲突。
内容的提问来源于stack exchange,提问作者Adrian Maire
相关产品推荐
相关产品推荐

