92、【OS】【Nuttx】【构建】cmake 支持构建的目标
【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除
背景
接之前 blog
【OS】【Nuttx】【启动】栈溢出保护:配置项解析
【OS】【Nuttx】【启动】栈溢出保护:配置项添加
分析了栈溢出保护配置项的一些内容,其中最后提到了一个问题:工程是用 make 进行配置的,但却是用 cmake 构建的,这里比较尴尬,因为 cmake 构建不能直接使用 make 的配置生成产物,当然有好事者可以尝试人工搭建 make 配置与 cmake 构建的桥梁
之前也分析过用 cmake 构建 Nuttx,可以回顾下
【OS】【Nuttx】【构建】用 cmake 构建工程
为了配置与构建工程的一致性,这里当然要分析 cmake 配置工程的可行性
cmake 支持构建的目标
首先,打开 Nuttx 根目录下的 CMakeLists.txt,可以找到 menuconfig
这里可以观察到几个点:
- 首先,在 cmake 中,include 命令是一个非常重要的功能,主要用于将一个外部的 cmake 脚本文件(一般是 .cmake 文件)的内容读取并插入到当前的 CMakeLists.txt 文件中执行
- 可以把 cmake 中的 include 理解为 C/C++ 中的 #include,或者 Python 中的 import,允许用户将 cmake 代码模块化,提高可读性和复用性
- 有了上面的基础知识,可以了解到两个信息,首先 menuconfig 在 make 工程配置中扮演了重要角色,是一个重要的构建目标,能够打开 Kernel 的配置界面,比如 make menuconfig;其次,Nuttx 项目工程中,一定存在一个 cmake 脚本,叫做 menuconfig.cmake
掌握上述信息后,在项目工程按下 ctrl + p(按名称搜索文件),可以搜索到 menuconfig.cmake 文件的位置,打开它
下面来看 menuconfig 目标构建相关的元素
这里面有几个关键点强调下:
- 每次构建 menuconfig 目标时,都会触发一次重新配置,不过这里有个 TODO 提醒:目前每次都会重新配置,但理想情况是只有当配置改变时才重新配置
- 这里使用 set 命令定义了一个叫做 KCONFIG_ENV 的列表(本质是环境变量集合),在后续调用 menuconfig 工具时会传入这个环境信息,来指导 Kconfig 工具在生成 .config 文件时,知道去哪里找源码,应用,驱动,以及要把配置应用到哪里。
- menuconfig 本质上是 Kconfig 的前端程序,通过传入的这些环境信息,实现 NuttX 的配置系统,属于 NuttX 特有的扩展机制
- 下面简单讲下这里面的环境配置信息:
KCONFIG_CONFIG:指定 .config 文件的路径(输出文件用),menuconfig 等工具读写配置时会用到
APPSDIR:指向 NuttX 应用目录(一般是 nuttx-apps),Kconfig 解析时,会加载 nuttx-apps 目录下的 Kconfig 片段
APPSBINDIR:nuttx-apps 应用程序的编译输出目录
BINDIR:总体构建输出目录
EXTERNALDIR / DRIVERS_PLATFORM_DIR:扩展模块或平台驱动目录(这里设为了 dummy 表示暂时不用),可以用来包含外部 Kconfig 文件 - 下面 34 ~ 38 行,表示根据操作系统选择不同的配置前端,因为 menuconfig 是基于 curses 库的文本图形界面,依赖终端支持,注释里也说了,Windows 的 PowerShell 或 CMD 对这种 终端控制 + 输入输出重定向 的支持很差,导致这种基于 curses 库的文本图形界面无法正常运行或显示错乱
- 基于上面的考虑, NuttX 在 Windows 上提供了一个替代方案:guiconfig,这里不展开分析 guiconfig,只需要知道 guiconfig 是一个在 Windows 上跑的前端程序就行了
接下来就是 menuconfig 目标的构建
关于 menuconfig 目标的构建,下一篇 blog 再讲,今天先到这儿