每个工程都有一个唯一一个SConstruct脚本,是python语法,用来管理所有的SConscript脚本的。
开头几个import为导入几个模块。python中就是类似类的对象,可以直接访问这个对象的成员和方法。
os.getenv,是python标准库中os模块提供的方法,用于读取操作系统的环境变量。
os.path.normpath,是python标准库中os.path模块的一个方法,用于规范会路径字符串,消除其中的冗余元素,如.代表当前目录,...代表父目录,这个函数返回一个规范化的路径字符串,使得该路径指向与原路径相同的位置,但表示形式更加简洁。
os.path.join函数,是python标准库提供的一个路径拼接函数,将两个参数值的路径拼接起来形成一个完成的路径,他会根据操作系统的情况自动选择用/还是\等进行自动拼接。
sys.path决定了python再导入模块时的搜索顺序,所以sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]的目的,是为了让RTT+tools这个路径下的东西都可以作为导入python导入模块时使用。
rtconfig.TARGET_EXT指的实际上是rtconfig.py这个python模块中的TARGET_EXT变量值,是根据不同系统不同编译器rtconfig.py文件中复制的scons编译程序后的执行文件的后缀名。
### 1. `DefaultEnvironment(tools=[])`
- **作用**:设置SCons的默认环境。这里使用一个空的工具列表(`tools=[]`)来初始化默认环境。
- **解释**:SCons在构建时会使用一个默认的构造环境(construction environment)。通过调用`DefaultEnvironment`并传入`tools=[]`,我们创建了一个没有任何构建工具的默认环境。这样做可能是为了避免SCons自动检测系统默认的工具链(如gcc、clang等),从而让我们可以完全自定义构建环境。这在跨平台构建或需要精确控制工具链时非常有用。
### 2. 创建自定义环境:`env = Environment(...)`
- **作用**:创建一个新的构造环境(construction environment),并指定构建工具及其参数。
- **参数详解**:
- `tools = ['mingw']`:指定使用名为'mingw'的工具。这个工具是SCons内置的,用于支持MinGW(Minimalist GNU for Windows)工具链。它会根据MinGW的工具设置一些默认的行为。
- `AS = rtconfig.AS`:汇编器(Assembler)的可执行文件名或路径,从`rtconfig`模块中获取(`rtconfig`是RT-Thread的配置模块)。
- `ASFLAGS = rtconfig.AFLAGS`:汇编器的编译选项(flags)。
- `CC = rtconfig.CC`:C编译器的可执行文件名或路径。
- `CFLAGS = rtconfig.CFLAGS`:C编译器的编译选项。
- `AR = rtconfig.AR`:归档工具(Archiver,用于创建静态库)的可执行文件名或路径。
- `ARFLAGS = '-rc'`:归档工具的选项,`-rc`表示替换已存在的文件并创建新的归档(如果不存在)。
- `CXX = rtconfig.CXX`:C++编译器的可执行文件名或路径。
- `CXXFLAGS = rtconfig.CXXFLAGS`:C++编译器的编译选项。
- `LINK = rtconfig.LINK`:链接器的可执行文件名或路径。
- `LINKFLAGS = rtconfig.LFLAGS`:链接器的选项。
### 3. `env.PrependENVPath('PATH', rtconfig.EXEC_PATH)`
- **作用**:将`rtconfig.EXEC_PATH`添加到环境变量`PATH`的最前面。
- **解释**:
- `PrependENVPath`是SCons环境的一个方法,用于修改构造环境中的环境变量。
- 这里修改的是`PATH`环境变量,将`rtconfig.EXEC_PATH`(通常是工具链的路径,比如交叉编译器的路径)添加到`PATH`的最前面。
- 这样做的目的是确保在后续构建过程中,SCons能够优先使用`rtconfig.EXEC_PATH`路径下的工具(如gcc、ar、ld等),而不是系统默认路径下的工具。这对于使用特定的交叉编译工具链非常重要。
同理这些代码就好理解了,是判断rtconfig.py模块中PLATFORM的平台如果是iccarm,则替换env的几个环境变量值。最后导出`RTT_ROOT`(RT-Thread根目录)和`rtconfig`(配置模块)变量,以便在子SConscript脚本中使用。
获取当前目录绝对路径(即SDK_ROOT)
- 如果当前目录下有`libraries`目录,则使用`$SDK_ROOT/libraries`;否则使用上级目录下的`libraries`(这样设计可能是为了支持多级目录结构)。
- 将库路径`SDK_LIB`导出,供子脚本使用