RT-Thread 学习之 SCons 构建工具(1)

什么是构建工具

其实不知道什么是构建工具也可以继续学习,既然我们想深入学习,那就先了解一下什么是构建工具。

构建工具(software construction tool)是一种软件,它可以根据一定的规则或命令,将源代码编译成可执行的二进制程序。这是构建工具最基本也是最重要的功能。实际上构建工具的功能不止于此,通常这些规则有一定的语法,并组织成文件。这些文件用来控制构建工具的行为,在完成软件构建之外,也可以做其他事情。

看概念很清楚了,我们这可以理解构建工具其实就是一种编译器。

SCons 需要先安装再使用,RT-Thread提供了一个Env配置工具,这个工具里就已经带有SCons和Python,因此在Windows平台使用SCons并不需要安装。

以下介绍的内容都是在Env工具中Scons的使用。

SCons文件结构

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 中定义的宏对应的源代码加入到编译器中来。

SCons的基本功能

1、编译

在Env工具中直接输入 scons 命令直接编译BSP,默认使用ARM GCC编译器。

如果需要自己制定编译器,可以在Env中输入如下两个命令来指定

set RTT_CC = keil

set RTT_EXEC = C:/Keilv5

scons命令

该命令不仅可以完成基本的编译,还可以生成MDK/IAR/VS 工程,在后边增加不同参数可以实现不同效果。

-s 参数,不会打印具体的内部命令。

-c 参数,清除编译目标,清除临时文件和目标文件。

--target=XXX 参数,如果使用mdk/iar来进行项目开发,当修改了rtconfig.h打开或者关闭某些组件时,需要使用该参数来重新生成对应的定制化工程。然后在mdk/iar中进行编译下载。

注意:要生成 MDK 或者 IAR 的工程文件,前提条件是 BSP 目录存在一个工程模版文件,然后 scons 才会根据这份模版文件加入相关的源码,头文件搜索路径,编译参数,链接参数等。而至于这个工程是针对哪颗芯片的,则直接由这份工程模版文件指定。所以大多数情况下,这个模版文件是一份空的工程文件,用于辅助 SCons 生成 project.uvprojx 或者 project.eww。

-jN 参数,多线程编译目标,在多核计算机上可以使用此命令加快编译速度。一般来说一颗 cpu 核心可以支持 2 个线程。双核机器上使用 scons -j4 命令即可。

--dist参数,搭建项目框架,使用此命令会在BSP目录下生成dist目录,这便是开发项目的目录结构,包含了RT-Thread源码及BSP相关工程,不相关的BSP文件夹及libcpu都会被移除,并且可以随意拷贝此工程到任何目录下使用。

--verbose参数,默认情况下,使用 scons 命令编译的输出不会显示编译参数,使用该参数,会显示编译参数。

SCons 内置函数

如果想要将自己的一些源代码加入到 SCons 编译环境中,一般可以创建或修改已有 SConscript 文件。

SConscript 文件可以控制源码文件的加入,并且可以指定文件的 Group(与 MDK/IAR 等 IDE 中的 Group 的概念类似)。

SCons 提供了很多内置函数可以帮助我们快速添加源码程序,利用这些函数,再配合一些简单的 Python 语句我们就能随心所欲向项目中添加或者删除源码。下面将简单介绍一些常用函数。实际上每个SConscript文件就是一个python文件。

GetCurrentDir() 函数,获取当前路径。

Glob('*.c')函数,获取当前目录下所有C文件。修改参数中的后缀,可以匹配当前目录下的所有某类型的文件。

GetDepend(macro)函数,该函数定义在 tools 目录下的脚本文件中,它会从 rtconfig.h 文件读取配置信息,其参数为 rtconfig.h 中的宏名。如果 rtconfig.h 打开了某个宏,则这个方法(函数)返回真,否则返回假。

Split(str)函数,将字符串 str 分割成一个列表 list。

DefineGroup(name, src, depend,**parameters)函数,这是 RT-Thread 基于 SCons 扩展的一个方法(函数)。DefineGroup 用于定义一个组件。组件可以是一个目录(下的文件或子目录),也是后续一些 IDE 工程文件中的一个 Group 或文件夹。

参数说明


parameters参数说明

SConscript(dirs,variant_dir,duplicate)函数,读取新的 SConscript 文件。

参数说明

你可能感兴趣的:(RT-Thread 学习之 SCons 构建工具(1))