98、【OS】【Nuttx】【构建】cmake 配置问题定位:menuconfig.dir/build.make
【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除
背景
接之前 blog
【OS】【Nuttx】【构建】cmake 配置问题定位:gmake 调用
【OS】【Nuttx】【构建】cmake 配置问题定位:CMakeFiles/menuconfig.dir
之前 blog 已经分析了 gmake 和 gmake[1],gmake[2] 的调用关系,以及 CMakeFiles,menuconfig.dir,下面继续来分析剩下的内容以及解决方案
menuconfig.dir
之前 blog 已经分析过,menuconfig.dir 是啥,下面来分析 menuconfig.dir 这个目录里面有啥,打开文件目录可以看到,里面大概有这么些东西
下面来逐一分析里面各文件的作用:
-
build.make:最核心的文件,定义了如何构建 menuconfig 目标,其本质上是一个 Makefile 片段,包含了执行 menuconfig 时要运行的命令以及依赖关系等,也是问题所在文件
-
cmake_clean.cmake:定义清理目标时需要删除哪些文件,里面会列出目标生成时所有的中间件,当运行 make clean 时,CMake 会读取并删除 menuconfig 产生的临时配置和中间件,下面简单看下里面内容
1、file(REMOVE_RECURSE …):递归删除这里指定的文件或目录
2、CMakeFiles/menuconfig:要删除的目标,不过在当前这个场景下,menuconfig 目标只负责执行命令,并不会生成这个目标文件,所以这句话不会删除任何东西
3、注释提示下面是根据依赖扫描生成的对应语言的清理规则,其中 foreach(lang ) 表示遍历所有编程语言(比如 C、CXX、ASM 等),但注意这里 lang 后面是空的,说明 这个目标没有关联任何编程语言(因为这个目标只执行命令)
4、include(…cmake_clean_${lang}.cmake OPTIONAL):引用语言相关的清理文件,比如 cmake_clean_C.cmake,cmake_clean_CXX.cmake 等等,这里 OPTIONAL 表示如果文件不存在,也不要报错 -
compiler_depend.make:依赖信息文件,在 CMake 的 configure 阶段,CMake 本身不执行编译器,无法获取真实依赖,只能创建个空的占位文件,确保生成的 Makefile/Ninja 文件结构完整,从注释可以看出其用途,且未来可能会被覆盖
-
compiler_depend.ts:时间戳文件,用于依赖检查,记录最后一次依赖分析的时间,CMake 可以用来判断是否需要重新扫描依赖
-
DependInfo.cmake:依赖信息数据库,记录该目标的所有源文件,输出文件以及依赖信息文件的位置,是 CMake 用来管理依赖关系更新的清单,同样,由于 menuconfig 是个非编译目标,这里的依赖项都是空的
-
progress.make:用于构建进度显示,记录当前目标在整体构建中的进度编号,当然由于是非编译目标,这里也是空的
build.make
下面来看出问题的地方,build.make 是最核心的文件,定义了如何构建 menuconfig 目标,而在构建 CMakeFiles/menuconfig 目标时,第 70 行出错了,提示没找到相关的文件或目录
怎么解决这个问题,下篇 blog 分析