You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 06:42:16