【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除
背景
接之前 blog
【OS】【Nuttx】【构建】cmake 配置实操
上篇 blog 提到,在构建目标 menuconfig 的时候报错了,找不到指定文件
下面来分析报错原因与解决方法
gmake
首先是这个报错原因
这里涉及到 gmake,有几个细节说下:
- gmake 是 GNU Make 的简称,一般在 Unix 和类 Unix 系统(比如 Linux 和 macOS)中使用
- 而 GNU Make 是一个构建自动化工具,用来管理项目构建过程中的依赖关系,或者执行相应的命令,当然,构建过程需要被描述出来,而描述文件就是众所周知的 Makefile 或 makefile 文件,这些描述文件会定义该怎么编译和链接程序
- 在大多数 Linux 发行版本中,比如 Ubuntu,GNU Make 通常就是默认的 make,可以直接使用 make 命令而无需使用 gmake,比如在 bash 终端输入 make --version 或者 gmake --version,可以发现两者是一样的,都是 gmake
- 而 CMake 是一个跨平台的构建系统生成器,本质上是个生成器,它可以生成不同构建工具的配置文件(比如 GNU Makefiles),但 CMake 本身并不执行构建任务,实际的构建工作还是由像 GNU Make 这样的底层构建工具完成的
- 回到问题本身,这里错误信息中的 gmake[1],gmake[2],gmake[3] 代表 make 的递归调用层级,其中
gmake[1] :最外层,尝试构建 menuconfig.dir/rule 目标
gmake[2] :中间层,尝试构建 menuconfig.dir/all 目标
gmake[3] :最内层,执行 menuconfig 具体命令时失败
gmake[1]
首先来看最外层的 make 调用
这里只讲两个点,其他不多讲:
- 首先定义一个 Make 目标 CMakeFiles/menuconfig.dir/rule,这个目标依赖于另外一个目标 cmake_check_build_system(这个目标就不展开讲了)
- 这里最重要,最核心的一行是 12121 行,也是调用出错行:
$(MAKE):调用 make 命令
$(MAKESILENT):控制是否静默输出
-f CMakeFiles/Makefile2:指定使用 CMakeFiles/Makefile2 作为输入 Makefile,也就是当前的 Makefile 文件
CMakeFiles/menuconfig.dir/all:要执行的目标,也在这个文件内
gmake[2]
接下来是中间层的 make 调用
也是只讲两个点:
- 定义一个 Make 目标 CMakeFiles/menuconfig.dir/all,这个目标没有依赖项
- 最核心的 12121 行,出问题的地方:
-f CMakeFiles/menuconfig.dir/build.make:指定使用 CMakeFiles/menuconfig.dir/build.make 作为输入 Makefile,这里跳转到另一个 Makefile 文件了
CMakeFiles/menuconfig.dir/build:要执行的目标,在另一个 Makefile 文件里
好吧,今天先到这里,下篇 blog 继续分析这个问题