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

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 分析构建目标时遇到的问题

http://www.xdnf.cn/news/1251055.html

相关文章:

  • vxe-table表格编辑单元格,进行正则验证,不符合验证,清空单元格数据。
  • 【“连亏十年” 川机器人,启动科创板IPO辅导】
  • 短剧小程序系统开发:技术驱动下的内容创新之路
  • 后端服务oom
  • [linux] Linux系统中断机制详解及用户空间中断使用方法
  • Java技术栈/面试题合集(19)-架构设计篇
  • Android—服务+通知=>前台服务
  • 简单spring boot项目,之前练习的,现在好像没有达到效果
  • 攻防世界WEB(新手模式)20-unseping
  • Android14的QS面板的加载解析
  • Tesseract + Poppler 实现图片型 PDF 转文字
  • jmm 指令重排 缓存可见性 Volatile 内存屏障
  • Perforce P4 Plan - DevOps实时规划工具
  • Python day36
  • 基于单片机智能浇花/智能灌溉/智慧农业/智能大棚
  • 双馈和永磁风机构网型跟网型联合一次调频并入同步机电网,参与系统一次调频,虚拟惯量下垂,虚拟同步机VSG控制matlab/simulink
  • 【软考系统架构设计师备考笔记5】 - 专业英语
  • 【关于Java的泛型(基础)】
  • 《动手学深度学习》读书笔记—9.3深度循环神经网络
  • 阿里云 Flink
  • 第七章课后综合练习
  • SpringBoot 3.x整合Elasticsearch:从零搭建高性能搜索服务
  • 【网络基础】计算机网络发展背景及传输数据过程介绍
  • vue3 vite 使用vitest 单元测试 组件测试
  • Lesson 31 Success story
  • 【C++详解】STL-set和map的介绍和使用样例、pair类型介绍、序列式容器和关联式容器
  • 蓝桥杯----锁存器、LED、蜂鸣器、继电器、Motor
  • RN项目环境搭建和使用-Mac版本(模拟器启动不起来的排查)
  • 软件定义汽车 --- 电子电气架构的驱动
  • 【pytorch(02)】Tensor(张量)概述、如何创建、常见属性,切换设备