(1)menuconfig 命令通过读取工程的各个Kconfig 文件,生成配置界面供用户配置内核,最后所有配置相关的宏定义都会自动保存到 BSP 目录里的rtconfig.h 文件中,每一个 BSP 都有一个 rtconfig.h 文件,也就是这个 BSP 的配置信息。
(2)SCons 使用 SConscript 和 SConstruct 文件来组织源码结构,通常来说一个项目只有一 SConstruct,但是会有多个 SConscript。一般情况下,每个存放有源代码的子目录下都会放置一个 SConscript。
为了使 RT-Thread 更好的支持多种编译器,以及方便的调整编译参数,RT-Thread 为每个 BSP 单独创建了一个名为 rtconfig.py 的文件。因此每一个 RT-Thread BSP 目录下都会存在下面三个文件:rtconfig.py、SConstruct 和 SConscript,它们控制 BSP 的编译。一个 BSP 中只有一个 SConstruct 文件,但是却会有多个 SConscript 文件,可以说 SConscript 文件是组织源码的主力军。RT-Thread 大部分源码文件夹下也存在 SConscript 文件,这些文件会被 BSP 目录下的 SConscript 文件 “找到” 从而将 rtconfig.h 中定义的宏对应的源代码加入到编译器中来。
(3)rtconfig.py 是一个 RT-Thread 标准的编译器配置文件,控制了大部分编译选项,是一个使用 python语言编写的脚本文件,主要用于完成以下工作:
• 指定编译器(从支持的多个编译器中选择一个你现在使用的编译器)。
• 指定编译器参数,如编译选项、链接选项等。
当我们使用 scons 命令编译工程时,就会按照 rtconfig.py 的编译器配置选项编译工程。
1. 参考
https://zhuanlan.zhihu.com/p/645748713
2 .实际SConscript分析
# for module compiling
import os #导入 Python 系统编程 os 模块,可以调用 os 模块提供的函数用于处理文件和目录
Import('RTT_ROOT')
from building import * #把 building 模块的所有内容全都导入到当前模块,后面用到的 Define Group 定义在这个模块
cwd = GetCurrentDir() #获得当前路径并保存到字符串变量 cwd 中
objs = [] #定义了一个空的 list 型变量 objs
list = os.listdir(cwd) #得到当前目录下的所有子目录,并保存到变量 list 中
for d in list: #for 循环会遍历一遍 BSP 的所有子目录
path = os.path.join(cwd, d) #具体操作是取出一个当前目录的子目录,利用 os.path.join(cwd,d) 拼接成一个完整路径
if os.path.isfile(os.path.join(path, 'SConscript')): #判断这个子目录是否存在一个名为 SConscript 的文件
objs = objs + SConscript(os.path.join(d, 'SConscript')) #使用了 SCons 提供的一个内置函数 SConscript(),它可以读入一个新的 SConscript 文件,并将 SConscript 文件中所指明的源码加入到了源码编译列表 objs 中来
Return('objs') #通过这个 SConscript 文件,BSP 工程所需要的源代码就被加入了编译列表中