当前位置: 首页 > 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.lryc.cn/news/612464.html

相关文章:

  • InfluxDB 集群部署与高可用方案(二)
  • 【概念学习】深度学习有何不同
  • 敏捷协作平台推荐:Jira、PingCode、Tapd等15款
  • iptables相关知识笔记
  • AI+物理融合新范式:物理信息神经网络(PINN)的深度研究报告
  • Flash Attention与SDPA
  • 深度探索:非静态内部类不能定义 static 成员属性和方法 及 静态内部类的必要性
  • AI Infra与LLM的联系与差异
  • ICCV 2025 | 视频生成迈入“多段一致”新时代!TokensGen用“压缩Token”玩转长视频生成
  • 【java】DDD架构同普通微服务项目的区别
  • 低代码系统的技术深度:超越“可视化操作”的架构与实现挑战
  • MCU编程中的临界资源及临界区
  • 【51单片机2个独立按键2个独立数码管静态显示内容自定】2022-10-22
  • 从 0 到 1 创建 InfluxDB 3 表:标签、字段、命名规范一篇讲透
  • 无人机航拍数据集|第4期 无人机太阳光伏板红外目标检测YOLO数据集10945张yolov11/yolov8/yolov5可训练
  • 无人机图传的得力助手:5G 便携式多卡高清视频融合终端的协同应用
  • ⭐CVPR 文本到 3D 场景生成新突破:Prometheus 框架解析
  • 小实验--继电器定时开闭
  • Pytest项目_day04(Python做接口请求)
  • vector使用模拟实现
  • Linux 学习 之 killer 问题
  • Unity笔记(三)——父子关系、坐标转换、Input、屏幕
  • STM32学习笔记3-GPIO输入部分
  • 【模电笔记】—— 直流稳压电源——稳压电路
  • RK3568笔记九十六:多路实时目标检测
  • Python应用指南:获取风闻评论数据并解读其背后的情感倾向(二)
  • 【补题】CodeTON Round 1 (Div. 1 + Div. 2, Rated, Prizes!) D. K-good
  • 基于单片机GD32E103的HID按键问题分析
  • hive专题面试总结2
  • 一、Envoy基础概念学习