什么是构建工具(系统)
构建工具(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都会被移除,并且可以随意拷贝此工程到任何目录下使用。