【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除
背景
接之前 blog
【OS】【Nuttx】【构建】cmake 配置问题定位:gmake 调用
【OS】【Nuttx】【构建】cmake 配置问题定位:CMakeFiles/menuconfig.dir
【OS】【Nuttx】【构建】cmake 配置问题定位:menuconfig.dir/build.make
之前 blog 已经分析了 gmake 和 gmake[1],gmake[2] 的调用关系,以及 CMakeFiles,menuconfig.dir,定位了问题大部分元素,最后指向了 build.make 中具体执行命令的 70 行(找不到对应文件和目录),下面来分析解决方案
build.make
下面来看出问题的地方
构建 CMakeFiles/menuconfig 目标时,第 70 行出错了,没找到相关的文件或目录
出问题的这句话很长,而且这个 menuconfig 目标执行的是命令,直接拷贝出来在 bash 终端执行,方便查看
这里看起来很长,化繁为简其实很清晰,这是
cmake -E env [--env=NAME=VALUE] [command]
命令行模式的用法,表示设置环境变量并运行 command 命令,很明显,这里的命令是 menuconfig,而在 bash 终端输入 which menuconfig 来查找这个命令的位置,可以看到是没有这个命令的,所以执行出错
首先要明确目的,这里是要用 cmake 进行工程配置,要实现与 make menuconfig 一样的效果,这里就涉及到 menuconfig 这个概念,在 make 构建和 cmake 构建中,它都是一个目标,查看 make 里对它的目标描述:
可以看到其实和 cmake 上面那个命令很像,都是设置环境变量 KCONFIG_ENV,然后执行命令 KCONFIG_MENUCONFIG,那么 make menuconfig 执行的命令 KCONFIG_MENUCONFIG,可以发现和 cmake 执行的并不相同,cmake 执行的是 menuconfig,而 make 执行的是 kconfig-mconf Kconfig
这里就涉及到两个概念:menuconfig 和 kconfig-mconf Kconfig
- menuconfig:表示这是一个基于文本的用户界面,用来浏览和编辑由 Kconfig 文件定义的配置选项
- kconfig-mconf:是实现 menuconfig 的实际工具,mconf 是 kconfig 系统的一部分,负责解析 Kconfig 文件并生成相应的配置界面,换句话讲,当运行 make menuconfig 命令时,实际上是在调用 kconfig-mconf 工具来读取 Kconfig 文件并显示配置界面
这里问题就很清晰了,cmake 执行了 menuconfig 这样一个抽象的,不存在的概念,而 make 执行的是 kconfig-mconf Kconfig 这样一个清晰的命令,所以 cmake 当然执行命令出错,之前 blog 【OS】【Nuttx】【构建】cmake menuconfig 目标 讲过, cmake 执行配置命令在 42 行这里
而 ${MENUCONFIG} 的值在 37 行这里
所以将 cmake 这里的 MENUCONFIG 替换成 kconfig-mconf Kconfig
再重新在 bash 终端执行命令
cmake --build build -t menuconfig
此时 cmake 可以正常打开配置界面,和 make menuconfig 一样,并且这里打开的是 build 目录下的 .config
这和用 make 在 nuttx 项目根路径上进行 menuconfig 还是有区别的,make 上显示的 .config 是相对路径(相对于 nuttx),而 cmake 上显示的是绝对路径,不过不影响用 cmake 进行配置就行
ok,cmake 配置工程结束,下篇 blog 回到主线继续分析