96、【OS】【Nuttx】【构建】cmake 配置问题定位:gmake 调用

发布于:2025-08-12 ⋅ 阅读:(12) ⋅ 点赞:(0)

【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如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 继续分析这个问题