SCons
什么是构建工具(系统)
构建工具(software construction tool)是一种软件,它可以**根据一定的规则或指令,将源代码编译成可执行的二进制程序。**这是构建工具最基本也最重要的功能。
实际上构建工具的功能不止于此,通过这些规则有一定的语法,并组织成文件。这些文件用来控制构建工具的行为,在完成软件构建之外,也可以做其它事情。
目前最流行的构建工具是GNU Make。很多知名开源软件,如Linux内核就采用Make构建。
Make通过读取Makefile文件来检测文件的组织结构和依赖关系,并完成Makefile中所指定的命令。
由于历史原因,Makefile的语法比较混乱,不利于初学者学习。此外在Windows平台上使用Make也不方便,需要安装Cygwin环境。为了克服Make的种种缺点,人们开发了其它构建工具,如CMake和SCons等。
RT-Thread构建工具
RT-Thread早期使用Make/Makefile构建。从RT-Thread0.3.0开始,RT-Thread开发团队逐渐引入了SCons构建系统,引入SCons唯一的目的是:使大家从复杂的Makefile配置、IDE配置中脱离出来,把精力集中在RT-Thread功能开发上。
有些读者可能会有些疑惑,这里介绍的构建工具与IDE有什么不同呢?
IDE通过图形化界面的操作来完成构建。大部分IDE会根据用户所添加的源码生成类似Makefile或Sconscript的脚本文件,在底层调用类似Make或SCons的工具来构建源码。
SCons简介
SCons是一套由Python语言编写的开源构建系统,类似于GNU Make。
它采用不同于通常Makefile文件的形式,而是使用SConstruct和SConscript。
这些文件也是Python脚本,能够使用标准的Python语法来编写。所以在Sconstruct和SConscript文件中可以调用Python标准库进行各类复杂的处理,而不局限于Makefile设定的规则。
RT-Thread中Scons的脚本构建
SCons使用SConscript和SConstruct文件来组织源码结构并进行构建,
SConstruct是scons构建的主脚本,SConScript存放在源代码的子目录下,通常放在项目的子目录,以达到分层构建的目的。
一个项目(BSP)只有一个SConstruct,但是会有多个SConscript。
一般情况下,每个存放有源代码的子目录下都会放置一个SConscript。
/-- rtconfig.py ---- 控制SCons构建的配置文件,存放了如工具链,构建参数等配置。-- SConscript-- SConstruct ---- SCons的入口脚本,初始化了SCons构建rt-thread所需的必要环境-- Kconfig ---- 顶层Kconfig文件,menuconfig的入口Kconfig文件-- rt-thread/--- src/---- SConscript ---- 各级源码的scons子脚本,控制当前级别下的源码构建行为---- Kconfig ---- 各级源码的Kconfig子脚本,存放当前级别下的配置项---- **.c
为了方便开发者使用SCons,RT-Thread搭建了如上所示的构建框架,
其中包括了一份SCons的入口脚本(SConstruct),以及分散在各级源码的SCons子脚本(Sconscript),还有一份便于配置构建行为的配置脚本(rtconfig.py)。
同时,RT-Thread也在SCons标准接口的基础上,提供了一组用于组织源码工程的扩展接口。开发者在使用时,可以借助RT-Thread提供的扩展接口,更方便的完成源码的组织与配置。
为了使RT-Thread更好的支持多种编译器,以及方便的调整构建参数,为每个BSP单独创建了一个名为rtconfig.py的配置文件。
因此每一个 RT-Thread BSP 目录下都会存在下面三个文件:rtconfig.py、SConstruct 和 SConscript,它们控制 BSP 的构建。一个 BSP 中只有一个 SConstruct 文件,但是却会有多个 SConscript 文件,可以说 SConscript 文件是组织源码的主力军。
SCons基本命令
RT-Thread构建系统支持多种编译器。
目前支持的编译器包括ARM GCC、MDK、IQR、VisualStudio、Visual DSP。主流的 ARM Cortex M0、M3、M4 平台,基本上 ARM GCC、MDK、IAR 都是支持的。有一些 BSP 可能仅支持一种,读者可以阅读该 BSP 目录下的 rtconfig.py 里的 CROSS_TOOL 选项查看当前支持的编译器。
打开Env工具,如果是ARM平台的芯片,输入scons命令直接编译BSP,这时候默认使用的是ARM GCC编译器。
如果用户要使用其它的BSP已经支持的编译器编译工程,或者BSP为非ARM平台的芯片,那么不能直接使用scons命令编译工程,需要自己安装对应的编译器,并且指定使用的编译器路径。
在编译工程前,可以在Env命令行界面使用下面的2个命令指定编译器为MDK和编译器路径为MDK的安装路径:
set RTT_CC=keil
set RTT_EXEC_PATH=C:/Keilv5
再例如
set RTT_CC=gcc
set RTT_EXEC_PATH=D:\software\RaspberryPi-Pico\gcc\2020-q4-major\bin
scons
在Env命令行窗口进入要编译的BSP工程目录,然后使用此命令可以直接编译工程。
如果执行过 scons 命令后修改了一些源文件,再次执行 scons 命令时,则 SCons 会进行增量编译,仅编译修改过的源文件并链接。
scons --target=XXX
如果使用MDK/IAR来进行项目开发,在生成MDK或者IAR工程前,需要检查rtconfig.py文件中EXEC_PATH变量所保存的对应IDE的安装路径是否正确:
当修改rtconfig.h打开或者关闭某些组件时,需要使用以下命令中的其中一种重新生成对应的定制化的工程,然后在 MDK/IAR 进行编译下载:
scons --target=iar
scons --target=mdk4
scons --target=mdk5
scons --dist
搭建项目框架,使用此命令会在BSP目录下生成dist目录,这便是开发项目的目录结构,包含了RTT源码以及BSP相关工程,不相关的BSP文件夹及libcpu都会被移除,并且可以随意拷贝此工程到任何目录下使用。
相关文章:

SCons
什么是构建工具(系统) 构建工具(software construction tool)是一种软件,它可以**根据一定的规则或指令,将源代码编译成可执行的二进制程序。**这是构建工具最基本也最重要的功能。 实际上构建工具的功能…...

蓝桥杯每日一题2023.11.14
题目描述 题目分析 此题目的最终目标是将字母都填上数使等式符合条件,实际我们发现可以使用搜索将所有符合条件的进行判断(答案:29) 由于小数可能会出现错误故我们将其进行简单变化进行搜索 #include<bits/stdc.h> using…...

力扣labuladong——一刷day33
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣652. 寻找重复的子树 前言 前序位置的代码只能从函数参数中获取父节点传递来的数据,而后序位置的代码不仅可以获取参数数据,还可…...

spring cloud alibaba之nacos
spring cloud nacos 安装和启动nacos # 解压nacos安装包 # tar -zvxf nacos-server-1.4.1.tar.gz# nacos默认是以集群的模式启动,此处先用单机模式 # cd /usr/local/mysoft/nacos/bin # sh startup.sh -m standalone# nacos 日志 # tail -f /usr/local/mysoft/na…...

python自动化第一篇—— 带图文的execl的自动化合并
简述 最近接到一个需求,需要为公司里的一个部门提供一个文件上传自动化合并的系统,以供用户稽核,谈到自动化,肯定是选择python,毕竟python的轮子多。比较了市面上几个用得多的python库,我最终选择了xlwings…...

使用 Redis 实现分布式锁,解决分布式锁原子性、死锁、误删、可重入、自动续期等问题(使用SpringBoot环境实现)
目录 一、前言二、分布式锁具备的特点三、Redis分布式锁的实现核心思路四、分布式锁代码实现(解决分布式锁原子性、死锁、误删、可重入、自动续期等问题)4.1、分布式锁实现工具类4.2、测试分布式锁效果 五、分布式锁常见问题以及解决方法5.1、分布式锁死…...

mysql oracle统计报表每天每月每年SQL
mysql查询当天、昨天、本周、上周、近7天、近30天、本月、上个月、近6个月、本季度、上季度、本年和去年的数据 注意 在 XML 中 < 应该转为 < 当天 SELECT * FROM 表名 WHERE TO_DAYS(时间字段名) TO_DAYS(NOW()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS(NOW()) - TO…...

通过Python设置及读取PDF属性,轻松管理PDF文档
PDF文档属性是嵌入在PDF文档中的一些与文档有关的信息,如作者、制作软件、标题、主题等。PDF属性分为默认属性和自定义属性两种,其中默认属性是一些固定的文档信息,部分信息自动生成(如文件大小、页数、页面大小等信息)…...

10. 深度学习——模型优化
机器学习面试题汇总与解析——模型优化 本章讲解知识点 前言低秩近似剪枝与稀疏约束参数量化二值网络知识蒸馏紧凑的网络结构本专栏适合于Python已经入门的学生或人士,有一定的编程基础。本专栏适合于算法工程师、机器学习、图像处理求职的学生或人士。本专栏针对面试题答案进…...

macos 上彻底卸载 DevEco Studio
1. 退出DevEco Studio: 确保DevEco Studio没有在运行。如果它在Dock中,可以右键点击其图标,然后选择退出。或者使用Command Q快捷键确保应用程序完全退出。 2. 删除DevEco Studio应用程序: 打开“应用程序”文件夹&#x…...

Nginx(五) break,if,return,rewrite和set指令的执行顺序深究
本篇文章主要对break,if,return,rewrite和set这5个指令的执行顺序进行深究,如需了解这5个指令的功能和配置,请参考另一篇文章 Nginx(三) 配置文件详解 由于文章篇幅较长,所以我就先把结论贴出来,…...

八大学习方法(金字塔模型、费曼学习法、布鲁姆学习模型)
在微博上看到博主发的,觉得总结很好,在此摘录:...

K8S的基础知识
K8S的意义与入门 专有名词 容器:包含了运行一个应用程序所需要的所有东西,包括:代码、运行时、各种依赖和配置。pod:K8s调度的最小单元,包含一个或多个容器。一个容器组中的容器具有紧密耦合性,共享资源,存储空间和IP。即同一个容器组中的容器可以通过localhost:xxx访问…...

java:基于jjwt写一个jwt工具类
背景 在Java中,使用JWT(JSON Web Tokens)相关的包通常包括以下内容: jjwt:JJWT是一个非常流行的Java JWT库,它提供了简单易用的API来创建和验证JWT。jose4j:JOSE4J是一个用于处理JSON Web签名…...

AK F.*ing leetcode 流浪计划之半平面求交
欢迎关注更多精彩 关注我,学习常用算法与数据结构,一题多解,降维打击。 本期话题:半平面求交 背景知识 学习资料 视频讲解 https://www.bilibili.com/video/BV1jL411C7Ct/?spm_id_from333.1007.top_right_bar_window_history…...

docker搭建zokeeper集群、kafka集群
三台机器,ip分别为ip1,ip2,ip3 一、安装docker集群 1、三台机器分别拉取镜像 docker pull wurstmeister/zookeeper 2、三台机器分别运行容器 (1)第一台 docker run -d --restartalways --log-driver json-file --log-opt max-size100m --lo…...

【java学习—十四】反射机制调用指定方法、指定属性(5)
文章目录 1. 调用指定方法2. 调用指定属性 1. 调用指定方法 通过反射,调用类中的方法,通过 Method 类完成。步骤: ①通过 Class 类的 getMethod(String name,Class...parameterTypes) 方法取得一个 Method 对象,并设置此…...

PC端微信@所有人逻辑漏洞
(一)过程 这个漏洞是PC端微信,可以越权让非管理员艾特所有人,具体步骤如下 第一步:找一个自己的群(要有艾特所有人的权限)“123”是我随便输入的内容,可以更改,然后按c…...

如何在Windows 10中进行屏幕截图
本文介绍如何在Windows 10中捕获屏幕截图,包括使用键盘组合、使用Snipping Tool、Snipp&Sketch Tool或Windows游戏栏。 使用打印屏幕在Windows 10中捕获屏幕截图 在Windows 10中捕获屏幕截图的最简单方法是按下键盘上的PrtScWindows键盘组合。你将看到屏幕短暂…...

【nlp】2.4 GRU模型
GRU模型 1 GRU介绍2 GRU的内部结构图2.1 GRU结构分析2.2 Bi-GRU介绍2.3 使用Pytorch构建GRU模型2.4 GRU优缺点3 RNN及其变体1 GRU介绍 GRU(Gated Recurrent Unit)也称门控循环单元结构, 它也是传统RNN的变体, 同LSTM一样能够有效捕捉长序列之间的语义关联, 缓解梯度消失或爆…...

国科云:浅谈DNS缓存投毒常见类型和防御策略
为了提升解析效率减轻各级服务器的解析压力,DNS系统中引入了缓存机制,但这同样也带来了较大的安全隐患,为攻击者利用DNS缓存进行投毒攻击创造了条件,对DNS系统的安全造成了巨大破坏。本文国科云将分析缓存投毒的两种主要类型&…...

Linux命令(120)之tcpdump
linux命令之tcpdump 1.tcpdump介绍 linux命令tcpdump是用来将网络中传送的数据包完全截获下来以进行相关分析,常用的分析工具是wireshark 2.tcpdump用法 tcpdump [参数] tcpdump参数 参数说明-i指定端口-n指定协议-t在输出的每一行不打印时间戳-s抓取数据包时&a…...

2311rust对接C
原文 为了与其他语言通信,Rust提供了(FFI)外部函数接口.FFI是Rust和C间的函数调用,与C函数调用有相同性能的零成本抽象. FFI绑定还可利用(如所有权和借用)语言功能来提供强制指针和其他资源协议的安全接口. Rust与C对话 从Rust调用C代码的简单示例开始.如下为C代码: int do…...

MYSQL字符串函数详解和实战(字符串函数大全,内含示例)
MySQL提供了许多字符串函数,用于处理和操作字符串数据。以下是一些常用的MYSQL字符串函数。 建议收藏以备后续用到查阅参考。 目录 一、CONCAT 拼接字符串 二、CONCAT_WS 拼接字符串 三、SUBSTR 取子字符串 四、SUBSTRING 取子字符串 五、SUBSTRING_INDEX 取子…...

从C语言到C++_40(多线程相关)C++线程接口+线程安全问题加锁(shared_ptr+STL+单例)
目录 1. C多线程 1.1 thread库 1.2 mutex库 1.3 RAII锁 1.4 atomicCAS 1.5 condition_variable 1.6 分别打印奇数和偶数 2. shared_ptr线程安全 2.1 库里面的shared_ptr使用 2.2 shared_ptr加锁代码 3. 单例模式线程安全 3.1 懒汉模式线程安全问题 3.2 懒汉模式最…...

Angular 指令介绍及使用(三)
Angular 指令概述 在 Angular 中,指令是一种机制,用于扩展和修改组件的行为和外观。指令可以由开发者自定义,也可以是 Angular 框架自带的一些内置指令。通过使用指令,我们可以在 HTML 模板中通过属性或元素名来操作组件。 Angu…...

小学生加减乘除闯关运算练习流量主微信小程序开发
小学生加减乘除闯关运算练习流量主微信小程序开发 经过本次更新,我们增加了新的功能和特性,以提升用户体验和运算练习的趣味性: 能量石与激励视频:用户可以通过观看激励视频来获取能量石,这些能量石可以用于解锁收费…...

普通测径仪升级的智能测径仪 增添11大实用功能!
普通测径仪能对各种钢材进行非接触式的外径及椭圆度在线检测,测量数据准确且无损,可测、监测、超差提示、系统分析等。在此基础上,为测径仪进行了进一步升级制成智能测径仪,为其增添更多智能化模块,让其使用更加方便。…...

vue做的一个一点就转的转盘(音乐磁盘),点击停止时会在几秒内缓慢停止,再次点击按钮可以再次旋转,
先看效果: 代码:主要部分我会红线画出来 css:部分: 源码: vue部分: <template><div class"song-lyric"><div><div class"type"><div class"right">&l…...

Spring6(一):入门案例
文章目录 1. 概述1.1 Spring简介1.2 Spring 的狭义和广义1.3 Spring Framework特点1.4 Spring模块组成 2 入门2.1 构建模块2.2 程序开发2.2.1 引入依赖2.2.2 创建java类2.2.3 创建配置文件2.2.4 创建测试类测试 2.3 程序分析2.4 启用Log4j2日志框架2.4.1 引入Log4j2依赖2.4.2 加…...