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.pswp.cn/diannao/94554.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/94554.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React 表单处理:移动端输入场景下的卡顿问题与防抖优化方案

文章目录每日一句正能量前言一、问题场景与表现二、技术攻坚过程三、优化效果与经验沉淀每日一句正能量 山再高,往上攀,总能登顶;路再长,走下去,终将到达。每日一励,勇往直前。 前言 在移动端 React 项目开…

数据安全防护所需要的关键要素

数据安全防护是一个覆盖数据全生命周期(采集、存储、传输、处理、销毁)、融合技术、管理、流程与人员的系统性工程。其核心目标是保障数据的​​保密性(Confidentiality)、完整性(Integrity)、可用性&#…

【JavaEE】(8) 网络原理 HTTP/HTTPS

一、什么是 HTTP 协议 上节说到,应用层的协议需要约定通信的内容和数据格式。我们可以自定义应用层协议,也可以基于现成的应用层协议进行开发。协议的种类很多,最常见的之一就是 HTTP,广泛用于网站和手机 App。准确来说&#xff0…

C语言的数组与字符串练习题4

C语言的数组与字符串练习题4 16. 数组元素去重 题目描述: 编写一个C程序,输入一组整数存储在数组中,去除数组中的重复元素,并输出去重后的数组。 解题思路: 遍历数组,对于每个元素,检查它之前是否已经存在相同的元素。如果不存在,则将其保留;否则,跳过。可以使用一…

Transformers简单介绍 - 来源于huggingface

Transformers介绍 - 来源于huggingface 文章目录Transformers介绍 - 来源于huggingfaceTransformers能做什么pipeline()函数零样本分类推理API完形填空命名实体识别问答摘要提取翻译transformers是如何工作的transformers的具体组成注意力层机制transformers原始结构architectu…

template<typename R = void> 意义

在 C 中&#xff0c;template<typename R void> 表示定义一个模板参数 R&#xff0c;其默认类型为 void。这意味着&#xff1a;如果用户没有显式指定 R&#xff0c;则 R 默认为 void。如果用户显式指定了 R&#xff08;如 template<typename R void> 后面跟着 &l…

国产3D大型装配设计新突破①:图纸打开设计双加速 | 中望3D 2026

本文为CAD芯智库整理&#xff0c;未经允许请勿复制、转载&#xff01;在中望3D 2026的新版中&#xff0c;不仅在设计效率上进行了重大优化&#xff0c;更是在装配方面实现了突破性的改进&#xff0c;让每一个项目都能快速、精确地从概念变为现实。 中望3D2026亮点速递装配篇将…

游戏开发状态机与行为树的优缺点

在游戏开发中&#xff0c;状态机&#xff08;Finite State Machine, FSM&#xff09; 和行为树&#xff08;Behavior Tree, BT&#xff09; 是两种常用的 AI 逻辑控制框架&#xff0c;分别适用于不同场景&#xff0c;其优缺点对比可从灵活性、维护成本、适用场景等多个维度分析…

Linux下ELF文件的介绍

目录 1.温故知新 2.ELF文件介绍 3.ELF文件组成 4.ELF文件形成到加载 5.连接过程 1.温故知新 上一篇博客&#xff0c;我们介绍了我们的动静态&#xff0c;知道了我们的库其实也是文件&#xff0c;如果我们想写一个库也是可以的&#xff0c;我们的把我们的库文件编译成.o文件…

人工智能领域、图欧科技、IMYAI智能助手2025年6月更新月报

2025年6月AI领域重要模型更新与平台优化汇总 摘要&#xff1a; 本文汇总了2025年6月期间AI领域发布的多项重要模型更新及平台功能优化信息&#xff0c;涵盖Google Gemini、阿里通义万相、字节豆包、百度文心一言、MiniMax海螺02、Google Veo3、快手可灵2.1、FLUX Kontext等模型…

从零开始学Express,理解服务器,路由于中间件

当我们初学前端时&#xff0c;常常只关注页面效果和交互&#xff0c;但随着项目复杂度提升&#xff0c;我们迟早会遇到“服务端”的问题&#xff1a;如何让一个页面的数据是从数据库来的&#xff1f;怎么让不同的用户看到不同的内容&#xff1f;这时候&#xff0c;我们就需要一…

Codeforces Round 987 (Div. 2)

ABC 略D预处理出每个位置的前缀最大和后缀最小。从后向前枚举&#xff0c;如果一个数无法后移&#xff0c;那么答案就是最大前缀&#xff0c;否则答案要不是前缀最大&#xff0c;要不就是这个数先移到前缀最大位置再移到能移到的最大的位置此处的答案。用线段树维护#include<…

Javascript/ES6+/Typescript重点内容篇——手撕(待总结)

前端核心知识点梳理与面试题详解 1. Promise 核心知识点 Promise 是异步编程的解决方案&#xff0c;用于处理异步操作三种状态&#xff1a;pending&#xff08;进行中&#xff09;、fulfilled&#xff08;已成功&#xff09;、rejected&#xff08;已失败&#xff09;状态一旦改…

[自动化Adapt] 父子事件| 冗余过滤 | SQLite | SQLAlchemy | 会话工厂 | Alembic

第五章&#xff1a;事件处理与融合 欢迎回到OpenAdapt探索之旅~ 在第四章&#xff1a;系统配置中&#xff0c;我们掌握了如何定制化系统参数。更早的第一章&#xff1a;录制引擎则展示了系统如何捕获海量原始操作数据。 假设我们需要训练机器人输入"hello"一词。原…

组合期权:跨式策略

文章目录0.简介1.买入跨式组合&#xff08;Long Straddle&#xff09;1.1 适用场景​1.2 合约选择1.3 损益分析1.4 案例示范2.卖出跨式组合&#xff08;Short Straddle&#xff09;2.1 适用场景​2.2 合约选择2.3 损益分析2.4 案例示范3.小结参考文献0.简介 跨式策略是一种交易…

Vue计算属性详解2

可写计算属性 计算属性默认是只读的,但在特殊场景下,我们可以创建"可写"的计算属性,通过同时提供getter和setter实现: <script setup>import { ref, computed } from vueconst firstName = ref(John)const lastName = ref(Doe)const fullName = computed(…

UniStorm 5.3.0 + Unity2022 + URP配置说明

一、前言 以前我用的是UniStorm3.0&#xff0c;主要用在内置管线里面&#xff0c;最近想在URP管线里面使用UniStorm天气系统&#xff0c;于是弄了UniStorm5.3.0的包&#xff0c;在Unity2022.3的URP模式下配置&#xff0c;直接导入package&#xff0c;两次宣告失败。最后看了官方…

力扣经典算法篇-44-组合总和(回溯问题)

1、题干 给你一个无重复元素的整数数组candidates和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复被选取 。…

矩阵与高斯消元:数学算法在计算机领域的应用

一、概述和基本概念 矩阵&#xff0c;类似于在 C 中我们看到的二维数组。它有两个维度&#xff0c;行和列。下面是一个典型的矩阵&#xff1a; M[12342345445610111213] M \begin{bmatrix} 1 & 2 & 3 & 4 \\ 2 & 3 & 4 & 5 \\ 4 & 4 & 5 &…

【补题】CodeTON Round 1 (Div. 1 + Div. 2, Rated, Prizes!) D. K-good

题意&#xff1a;给一个n&#xff0c;如果能被k个数整除&#xff0c;要求这k个数%k后不相同&#xff0c;问如果可以&#xff0c;任意k是多少&#xff0c;如果不可以输出-1 思路&#xff1a; D. K-good_牛客博客 从来没见过&#xff0c;太诡异了&#xff0c;做题做少了 1.…