CMake中find_program无法找到其他Recipe提供的工具求助
针对你遇到的问题,核心原因是组件A没有将toolA安装到Yocto构建体系的共享 staging 目录,导致组件B的sysroot无法访问到该工具。以下是两种场景下的规范实现方式:
场景1:B在配置目标机代码时需要查找目标机版本的toolA
(比如B生成的目标机程序依赖toolA,配置阶段需确认目标机环境存在该工具)
修改A.bb,将toolA同步到共享staging目录
在A的安装阶段,除了将toolA安装到目标机镜像目录,还要复制到所有Recipe共享的目标机staging区域:do_install_append() { # 创建staging目录(确保路径存在) install -d ${STAGING_DIR_TARGET}${bindir} # 复制toolA到staging目录,供其他Recipe访问 install -m 0755 ${D}${bindir}/toolA ${STAGING_DIR_TARGET}${bindir}/toolA }配置B的CMake,指定目标机sysroot搜索路径
在B.bb中添加CMake参数,让find_program优先搜索目标机的sysroot:EXTRA_OECMAKE += "-DCMAKE_FIND_ROOT_PATH=${STAGING_DIR_TARGET}"保留依赖顺序配置
你已添加的依赖语句可以保留,确保A的sysroot同步完成后再执行B的配置:do_configure[depends] += "A:do_populate_sysroot"
场景2:B在构建主机端需要运行主机版本的toolA
(比如toolA是构建辅助工具,用于生成代码、预处理文件等)
这种情况需要构建A的native版本(主机可执行的toolA):
创建A-native.bb配方
复制A.bb为A-native.bb,适配native构建逻辑:inherit native cmake # 复用A.bb中的其他配置(如SRC_URI、S等) do_install_append() { # 将toolA安装到主机端的staging目录 install -d ${STAGING_BINDIR_NATIVE} install -m 0755 ${D}${bindir}/toolA ${STAGING_BINDIR_NATIVE}/toolA }修改B的依赖配置
在B.bb中替换依赖为A-native:DEPENDS += "A-native"Yocto会自动将主机端staging目录加入构建环境的
PATH,CMake的find_program可以直接找到toolA,无需额外配置搜索路径。移除手动依赖语句
由于DEPENDS已包含A-native,Yocto会自动处理构建顺序,无需保留do_configure[depends]。
临时方案的问题
你手动复制文件到共享目录的方式绕过了Yocto的staging/sstate缓存机制,会导致:
- 无法利用构建缓存,重复构建效率低下
- 路径依赖强,跨构建环境容易出错
- 不符合Yocto构建规范,后续维护成本高
内容的提问来源于stack exchange,提问作者Tomek The Messenger

