93、【OS】【Nuttx】【构建】cmake menuconfig 目标
【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除
背景
接之前 blog
【OS】【Nuttx】【构建】cmake 支持构建的目标
之前分析了怎么查看 cmake 支持构建的目标,里面着重分析了 menuconfig 这个目标,这个也是这篇 blog 的主题,下面就来看 menuconfig 这个目标的细节
menuconfig 目标
上篇 blog 分析的是一些准备环境,接下来分析的,是 cmake 配置工程的关键,menuconfig.cmake 脚本中,menuconfig 目标的构建规则如下
有几个关键点讲下:
- add_custom_target:创建一个自定义构建目标,这里名字叫 menuconfig,执行这个目标并不会编译代码,而是执行一系列命令
- 下面来详细分析这个目标会执行的命令,42 行第一条:启动配置界面。这里简单讲下里面几个关键字:
${CMAKE_COMMAND}:cmake 的可执行文件路径,比如 /usr/bin/cmake
-E:启用 cmake 的命令行模式
env:子命令,设置环境变量并运行程序
${KCONFIG_ENV}:之前定义的环境变量列表,上篇 blog 【OS】【Nuttx】【构建】cmake 支持构建的目标 分析过
${MENUCONFIG}:要运行的命令,比如 menuconfig(Linux),guiconfig(Windows)
所以最后等价于在终端执行如下命令,命令执行完后,会弹出一个菜单界面,和 make menuconfig 一样,可以选择内核功能
/usr/bin/cmake -E env KCONFIG_CONFIG=~/nuttx_pdt/nuttx/build/.config EXTERNALDIR=dummy APPSDIR=~/nuttx_pdt/nuttx-apps DRIVERS_PLATFORM_DIR=dummy APPSBINDIR=~/nuttx_pdt/nuttx/build/nuttx-apps BINDIR=~/nuttx_pdt/nuttx/build ~/nuttx_pdt/nuttx/menuconfig
- 43 ~ 44 行是第二条命令:删除旧的配置头文件。这里有两个关键字:
remove -f:强制删除文件(类似 rm -f)
${CMAKE_BINARY_DIR}/include/nuttx/config.h:由 .config 转换而来的关键头文件,直接参与 Nuttx 编译
config.h 是由 .config 文件自动生成的,包含所有配置宏信息,如果不删除,即使改了 .config,cmake 在构建时也会认为它没变,影响到重新生成,而导致配置没生效;删除是为了强制下一次构建时重新生成 config.h,确保配置生效;这是一种构建时失效缓存的常见策略:主动删除旧结果,强制重新生成 - 46 行是第三条命令:触发 CMake 重新配置,这里也有几个关键点:
touch:更新文件的时间戳(类似 Linux 的 touch 命令,如果文件不存在,就创建一个,如果文件存在,就更新下时间戳)
${CMAKE_PARENT_LIST_FILE}: 包含当前文件的 cmake 文件完整路径,该 menuconfig.cmake 文件是在 Nuttx 项目的根目录 CMakeLists.txt 被展开的,所以其实也就是 Nuttx 根目录下的 CMakeLists.txt 文件,更新下这个文件的时间戳
这里 touch 下 Nuttx 根目录下的 CMakeLists.txt 文件,是因为 cmake 构建依赖文件时间戳,来判断是否需要重新运行配置;当修改 .config 后,源码文件本身没变,cmake 判断没有文件改变,就不会自动重新生成 Makefile,此时通过 touch 关键的 CMakeLists.txt,来欺骗 cmake 说这里有个文件被修改了,要重新运行 cmake 构建,确保修改配置后,整个构建系统能感知到变化,重新生成配置后的构建产物 - 47 行:设置命令执行时的工作目录为 NUTTXDIR,{NUTTX_DIR},NUTTXDIR,{NUTTX_DIR} 是 Nuttx 项目根目录(这里有总构建入口 CMakeLists.txt 和内核配置 Kconfig 文件)
- 48 行:USES_TERMINAL 告诉构建系统(比如 make),这个 menuconfig 目标需要交互式终端,此时构建系统会使用终端资源,来给用户显示 curses 图形界面
ok,先分析到这里,下篇 blog 分析构建目标时遇到的问题