当前位置: 首页 > news >正文

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 再讲,今天先到这儿

http://www.dtcms.com/a/318491.html

相关文章:

  • SOD-YOLO:增强基于YOLO的无人机影像小目标检测
  • Product Hunt 每日热榜 | 2025-08-06
  • GoogLeNet训练
  • FastDeploy2.0:Error reading file: SafeTensorError::MetadataIncompleteBuffer
  • chdir系统调用及示例
  • 【C/C++】形参、实参相关内容整理
  • 零基础-动手学深度学习-8.7. 通过时间反向传播
  • Spring_事务
  • 国产3D大型装配设计新突破①:图纸打开设计双加速 | 中望3D 2026
  • C语言的数组与字符串练习题2
  • 如何快速翻译PPT中的文字(或简繁体转换)
  • 【51单片机2个独立按键2个独立数码管静态显示内容自定】2022-10-22
  • Perforce P4 Plan - DevOps实时规划工具
  • 指挥中心自动化的演变
  • 无人机遥控器波特率技术解析
  • 前端开发_怎么禁止用户复制内容
  • 计算机网络:如何判断B或者C类IP地址是否划分了子网
  • 设备 AI 知识库如何提升管理效率?实测分享
  • 【STM32U385RG 测评】基于VSCode的STM32开发环境搭建
  • 认识河豚毒素!剧毒神经毒素详解!
  • 向量数据库基础夯实:相关概念的详细介绍
  • 淘宝/天猫商品详情API详解(tb.item_get)
  • 一文读懂:什么是CLIP
  • 分布式存储 Ceph 的演进经验 · SOSP 2019
  • 【Web安全】csrf、ssrf和xxe的区别
  • GPT-OSS-20B vs Qwen3-14B 全面对比测试
  • 【大模型系列】gpt-oss系列模型初探
  • ACL 2025 Oral|Evaluation Agent:面向视觉生成模型的高效可提示的评估框架
  • 服务器重启后mysql5.7启动失败问题
  • MySql_忘记了root密码怎么办