RT-Thread 多级目录 scons 构建

前言

  • RT-Thread 默认使用 scons 进行工程的构建,虽然 RT-Thread BSP 中的 hello world 例程比较简单,实际项目开发,可能源码的工程会由多级目录,如何让多级的目录参与构建?

  • scons 构建时,除了依赖工程的根目录 rtconfig.pySConstructSConscript,也会依赖 Kconfig 进行配置,哪些 代码文件参与构建,哪些文件不参与构建

多级目录

  • 工程根目录下的 SConscript 内容如下
# RT-Thread scons bridge
import os
from building import *cwd = GetCurrentDir()
objs = []
list = os.listdir(cwd)for d in list:path = os.path.join(cwd, d)if os.path.isfile(os.path.join(path, 'SConscript')):objs = objs + SConscript(os.path.join(d, 'SConscript'))Return('objs')
  • 其实发现,这个 SConscript 文件就是个 python 脚本文件, scons 构建其实是基于 python 脚本的,只是最终编译依旧是额外的编译工具链,如 gcc armcc

  • 顶层目录的 SConscript 其实是变量当前所有目录 list = os.listdir(cwd),然后 确认各个目录下是否包含
    SConscript 文件,如果包含,就参与构建。

  • 因此,如果是多级目录,只需要每级目录下提供 SConscript 文件,就可以让本级目录与下级各个目录参与构建

SConscript 包含多级目录的写法

  • 比如 SConscript
from building import *
import oscwd     = GetCurrentDir()
CPPPATH = [cwd]
src     = ['main.c']if GetDepend(['PKG_USING_RTDUINO']) and not GetDepend(['RTDUINO_NO_SETUP_LOOP']):src += ['arduino_main.cpp']group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH)list = os.listdir(cwd)
for item in list:if os.path.isfile(os.path.join(cwd, item, 'SConscript')):group = group + SConscript(os.path.join(item, 'SConscript'))Return('group')
  • 这个 SConscript 文件中, group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) 定义了 本级目录下参与构建的文件。

  • 条件 构建:通过配置选择是否参与构建

if GetDepend(['PKG_USING_RTDUINO']) and not GetDepend(['RTDUINO_NO_SETUP_LOOP']):src += ['arduino_main.cpp']
  • 各个子目录下的 SConscript 搜索
list = os.listdir(cwd)
for item in list:if os.path.isfile(os.path.join(cwd, item, 'SConscript')):group = group + SConscript(os.path.join(item, 'SConscript'))
  • 最终返回最终的构建目标:Return('group')

  • 注意事项:如果没有下级目录,这个带层级目录构建的 SConscript 脚本依旧适用,原因就是 list = os.listdir(cwd) 这里为空,因此 直接返回了 Return('group')

  • 因此多级目录下的构建,只需要每级目录下,均创建 SConscript 脚本即可,如果一个目录下,只有子目录,没有需要构建的文件, SConscript 脚本 可以简单的写为:

# for module compiling
import os
from building import *cwd = GetCurrentDir()
objs = []
list = os.listdir(cwd)for d in list:path = os.path.join(cwd, d)if os.path.isfile(os.path.join(path, 'SConscript')):objs = objs + SConscript(os.path.join(d, 'SConscript'))Return('objs')
  • 这说明本目录下没有参与构建的文件 objs = [],只需要遍历下级目录即可。

构建目录

  • 使用 DefineGroup 创建 构建的目标,这里的 src 其实是个构建文件的列表,而构建文件的列表,是个 python 的列表,可以为空,可以为多个构建文件,由于 SConscript 脚本是 Python 脚本,可以打一下参与构建的文件列表

group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH)

在这里插入图片描述

小结

  • 灵活的设计 SConscript 脚本,就像是设计 Makefile 文件,可以实现大工程的构建

  • 由于 scons 只是构建工具,编译链接还是需要额外的编译工具链,如 gcc armcc armclang

  • windows 下或者 Linux 环境下,需要配置一些环境变量,这些可以在 Kconfig 与 rtconfig.py 中进行配置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/816866.shtml

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

相关文章

基于R语言实现的beta二项回归模型【理解与实现】

本实验,创建一组使用二项分布模拟的数据(不带额外的随机性),和另一组使用Beta二项分布模拟的数据(引入了随机成功概率 p,从而增加了数据的离散性。 现在假设我们站在上帝视角,有两组不知道分布…

Qt 中默认代码

目录 主函数 widget的声明 widget的定义 form file .pro 文件 主函数 #include "widget.h" ​ #include <QApplication> ​ int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 上面就是 Qt 刚创建的一…

机器学习-随机森林温度预测模型优化

文章目录 前言旧模型训练新模型训练参数查看组合参数训练学习模型评估 前言 在机器学习-随机森林算法预测温度一文中&#xff0c;通过增大模型训练数据集和训练特征的方式去优化模型的性能&#xff0c;本文将记录第三方种优化方式&#xff0c;通过调整随机森林创建模型参数的方…

【高阶数据结构】哈希表 {哈希函数和哈希冲突;哈希冲突的解决方案:闭散列,开散列;红黑树结构 VS 哈希结构}

一、哈希表的概念 顺序结构以及平衡树 顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置之间没有对应的关系。因此在查找一个元素时&#xff0c;必须要经过关键码的多次比较。顺序查找时间复杂度为O(N)&#xff1b;平衡树中为树的高度&#xff0c;即O(log_2 N)&#xf…

区间比较指令

1&#xff0c;比较值和和区间值比较 2&#xff0c;指令 ZCP K2 K5 C0 Y000 3&#xff0c;当比较值小于 区间返回 软元件灯亮 当比较直在区间内软元件1 接通 > 第一个 < 第二个 大于第二个值 软元件2接通 如果区间中第二个值大于第一个值那个只比较第一个值 直接比较 参数…

【HTML】制作一个简单的实时字体时钟

目录 前言 HTML部分 CSS部分 JS部分 效果图 总结 前言 无需多言&#xff0c;本文将详细介绍一段HTML代码&#xff0c;具体内容如下&#xff1a; 开始 首先新建文件夹&#xff0c;创建一个文本文档&#xff0c;两个文件夹&#xff0c;其中HTML的文件名改为[index.html]&am…

202209青少年软件编程(scratch图形化) 等级考试试卷(四级)

第1题&#xff1a;【 单选题】 运行下列程序&#xff0c;说法正确的是&#xff1f;&#xff08;&#xff09; A:列表中的数字全部小于11 B:列表的长度为 10 C:变量i最终值为 20 D:列表中有大于 10 的数字 【正确答案】: D 【试题解析】 : 程序运行后&#xff0c;变量i最…

Spark 应用程序优化和调优总结

文章目录 前言调整 Spark 默认配置查看和设置 Spark 配置信息动态扩展集群负载 数据的缓存和持久化DataFrame.cache()DataFrame.persist()何时缓存和持久化何时不缓存和持久化 Spark 中的 JOINs广播连接排序合并连接 总结 前言 本文总结了 Spark 中比较重要和常用的调优手段&a…

【探讨】光场空间结构全维度非线性调控理论及应用

摘要&#xff1a;得益于数字全息与几何相位平面光学技术的逐渐成熟&#xff0c;空间结构光场调控及应用研究已在线性光学领域取得蓬勃发展。与之相比&#xff0c;以非线性光学为物理途径的相关研究虽能实现许多关键功能(如光场间信息交互)却仍处于起步阶段。笔者课题组在国家自…

MoonBit 最新动态:MoonBit 引入实验性的测试覆盖率统计工具

MoonBit更新 支持 array.iter intrinsic 并且已经对标准库中的函数进行标注&#xff0c;从而可以在特定情况下将循环进行内联&#xff0c;以提升运行效率 /// intrinsic %array.iter pub fn iter[T](self : Array[T], f : (T) -> Unit) -> Unit {for i 0; i < self…

C语言100道练习题打卡(1)

1 有1&#xff0c;2&#xff0c;3&#xff0c;4四个数字&#xff0c;能组成多少个互不相同且不重复的三位数&#xff0c;都是多少 #include<stdio.h> //有1&#xff0c;2&#xff0c;3&#xff0c;4四个数字&#xff0c;能组成多少个互不相同且不重复的三位数&#xff…

Spring Batch

Spring是一个开放源代码的J2EE应用程序框架&#xff0c;由Rod Johnson发起&#xff0c;是针对bean的生命周期进行管理的轻量级容器&#xff08;lightweight container&#xff09;。 Spring解决了开发者在J2EE开发中遇到的许多常见的问题&#xff0c;提供了功能强大IOC、AOP及W…

物联网数据集CIC IoT Dataset 2023和(TON_IoT)数据集以及网络数据集UNSW-NB15 Dataset:可单卖(si聊有优惠)

数据集描述如下&#xff1a; CIC IoT Dataset 2023是由加拿大网络安全研究所提供的一个数据集&#xff0c;旨在促进物联网&#xff08;IoT&#xff09;环境中大规模攻击的安全分析应用程序的开发。该数据集包含33种攻击&#xff0c;分为7类&#xff0c;包括DDoS、DoS、侦察、基…

mysql报错-mysql服务启动停止后,某些服务在未由其他服务或程序使用时将自动停止和数据恢复

启动mysql服务时出现该错误: 本地计算机上的mysql服务启动停止后,某些服务在未由其他服务或程序使用时将自动停止。 我的mysql版本是8.0.18 系统&#xff1a;win10 如何安装mysql&#xff0c;可以看我这一篇文章&#xff1a;mysql的安装 ---必会 - bigbigbrid - 博客园 (cn…

常见分类算法详解

在机器学习和数据科学的广阔领域中&#xff0c;分类算法是至关重要的一环。它广泛应用于各种场景&#xff0c;如垃圾邮件检测、图像识别、情感分析等。本文将深入剖析几种常见的分类算法&#xff0c;帮助读者理解其原理、优缺点以及应用场景。 一、K近邻算法&#xff08;K-Nea…

Android ParcelFileDescriptor实现进程间通信

需求 一个通信通道&#xff0c;实现跨进程的的Socket网络通信。 具体的通信通道的图如下。 需求分析 我们需要一个进程一直做通信通道的事情&#xff0c;业务进程把数据通过进程间通信交给通信进程。通信进程通过Socket通道将数据发给网络另外一端的通信进程。接收端的通信进…

对常见FTP客户端/服务器的调查与分析

前言 主要是想看看常见的服务器和客户端是如何实现协议中要求的功能的&#xff0c;。 比如RF959要求的记录结构&#xff08;Record Structure&#xff09;、页结构&#xff08;Page Structure&#xff09;、Block Mode、Compress Mode&#xff0c;看起来就很抽象。 实测发现…

vue 上传csv文件

index---------主页面&#xff08;图1&#xff09; form-----------子页面&#xff08;图2&#xff09; index.vue /** 重点&#xff01;&#xff01;&#xff01;&#xff01; * 获取表单组件传递的信息&#xff0c;传给后端接口 * param {从form表单传递的数据} datas * Fi…

【进阶六】Python实现SDVRPTW常见求解算法——离散粒子群算法(DPSO)

基于python语言&#xff0c;采用经典离散粒子群算法&#xff08;DPSO&#xff09;对 带硬时间窗的需求拆分车辆路径规划问题&#xff08;SDVRPTW&#xff09; 进行求解。 目录 往期优质资源1. 适用场景2. 代码调整2.1 需求拆分2.2 需求拆分后的服务时长取值问题 3. 求解结果4. …

关于运行阿里云直播Demo报的错

flutter --version dart --version 如何使用Flutter框架推流_音视频终端 SDK(Apsara Video SDK)-阿里云帮助中心MediaBox音视频SDK下载指南_音视频终端 SDK(Apsara Video SDK)-阿里云帮助中心 终端输入 dart pub --trace get --no-precompile 打印详细报错信息 详细咨询…