原创 RT-Thread学习之scons篇--SConsruct脚本文件解析

2015-3-26 22:53 1143 0 1 分类: MCU/ 嵌入式 文集: RT-Thread

       scons的构建文件名称是统一的都称为SConstruct。其是scons所接受的编译脚本主文件。当然为了方便目录的组织,也允许在各个目录下面存放SConscript, 然后最上面SConstruct收集这些SConscript组织成为一个大的构建文件。

      这里以bsp/stm32f10x为例予以介绍,其SConstruct文件为:
      注: 对于RT-Thread的BSP下的SConstruct文件来说,此文件有些共同的部分。共同部分已高亮为红色。
import os
import sys
import rtconfig
 
if os.getenv('RTT_ROOT'):
    RTT_ROOT = os.getenv('RTT_ROOT')
else:
    RTT_ROOT = os.path.normpath(os.getcwd() + '/../..')
 
sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
from building import *
 注释:RTT_ROOT即代表了RT-Thread源码包的路径,以我的系统为例,我将RT-Thread源码解压到D:\rt-thread\下,则上面代码就会设定RTT_ROOT = 'D:\rt-thread\'
 
TARGET = 'rtthread-stm32.' + rtconfig.TARGET_EXT
 注释:这一句用来设定编译生成的可执行文件的名称,比如是hex,bin或者是elf,还是axf(MDK编译器生成的具有调试信息的可执行文件名称,跟gcc下的elf类似,兼容)
rtconfig.TARGET_EXE是指在rtconfig.py中定义的TARGET_EXT,在rtconfig.py中,可以看到有多个TARGET_EXT定义,其含义为目标文件的扩展名。
当TARGET_EXT为'axf'时,最后就会生成的文件为'rtthread-stm32.axf'
 
 
env = Environment(tools = ['mingw'],
AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,
CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS,
AR = rtconfig.AR, ARFLAGS = '-rc',
LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS)
env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
 
if rtconfig.PLATFORM == 'iar':
env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
env.Replace(ARFLAGS = [''])
env.Replace(LINKCOM = ['$LINK $SOURCES $LINKFLAGS -o $TARGET --map project.map'])
 
Export('RTT_ROOT')
Export('rtconfig')
 
# prepare building environment
objs = PrepareBuilding(env, RTT_ROOT)
 注释: PrepareBuilding是一个python函数,它是在tools/目录下的脚本文件中定义的,其作用正如其名所示,用于完成编译前的准备工作。
 
# STM32 firemare library building script
objs = objs + SConscript( GetCurrentDir() + '/Libraries/SConscript', variant_dir='build/bsp/Libraries', duplicate=0)
 注释:能够让一个SConstruct文件再关联一个新的组件(用户自行定义的组件,而不是RT-Thread系统的组件,此处是STM32的固件库)。
这里SConscript函数SCons内置的函数,它可以读入一个新的SConscript文件,并将SConscript文件中所指明的源码加入编译列表中来。
SConscript文件和下节的组件编译文件实际是一样的,因为可以把BSP看成一个组件Group(在工程文件中它也确实是一个Group),所以这个组件所对应的编译脚本就是SConscript。
SConscript函数的参数包括三个:
第一个是SConscript路径,GetCurrentDir()返回当前文件所处的路径,即SConstruct文件所在的目录,可以看到此目录下存在一个Libraries目录,并且其目录下存在一个SConscript文件,我们将子下一节介绍SConscript文件是介绍它。
variant_dir则指定生成的目标文件的存放路径,这里即为'build/bsp/Libraries',用户当然可以根据自己的喜好做修改。
duiplicate 的作用是设定是否拷贝或链接源文件到variant_dir
 
if GetDepend('RT_USING_RTGUI'):
    objs = objs + SConscript(RTT_ROOT + '/examples/gui/SConscript', variant_dir='build/examples/gui', duplicate=0)
 注释:上述代码的意思是,如果在rtconfig.h中定义了宏RT_USING_RTGUI,那么就执行SConscript函数,将rt-thread/examples/gui下的C源码加入编译。
GetDepend函数是python函数,在tools/目录下的脚本文件中定义,它会从rtconfig.h文件读取组件配置信息,其参数为rtconfig.h中的宏名。
 
# build program 
env.Program(TARGET, objs)
 
# end building 
EndBuilding(TARGET)
 
 
全部代码:
import os
import sys
import rtconfig
 
if os.getenv('RTT_ROOT'):
    RTT_ROOT = os.getenv('RTT_ROOT')
else:
    RTT_ROOT = os.path.normpath(os.getcwd() + '/../..')
 
sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
from building import *
 
TARGET = 'rtthread-stm32.' + rtconfig.TARGET_EXT
 
env = Environment(tools = ['mingw'],
AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,
CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS,
AR = rtconfig.AR, ARFLAGS = '-rc',
LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS)
env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
 
if rtconfig.PLATFORM == 'iar':
env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
env.Replace(ARFLAGS = [''])
env.Replace(LINKCOM = ['$LINK $SOURCES $LINKFLAGS -o $TARGET --map project.map'])
 
Export('RTT_ROOT')
Export('rtconfig')
 
# prepare building environment
objs = PrepareBuilding(env, RTT_ROOT)
 
# STM32 firemare library building script
objs = objs + SConscript( GetCurrentDir() + '/Libraries/SConscript', variant_dir='build/bsp/Libraries', duplicate=0)
 
if GetDepend('RT_USING_RTGUI'):
    objs = objs + SConscript(RTT_ROOT + '/examples/gui/SConscript', variant_dir='build/examples/gui', duplicate=0)
 
# build program 
env.Program(TARGET, objs)
 
# end building 
EndBuilding(TARGET)
参考资料来源:http://www.rt-thread.org/
广告

文章评论 1条评论)

登录后参与讨论

shlly 2015-4-2 12:03

我喜欢
相关推荐阅读
潇洒哥 2015-07-08 16:01
位操作符的使用技巧
在C语言编程中,数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作。一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效...
潇洒哥 2015-04-04 17:39
finish shell分析之底层usart
rt_thread的finsh shell系统不愧是调试的一项利器,它可以除了完成一般shell的功能外,甚至还可以自定义命令。这个对功能单一的嵌入式系统来说是十分可贵的。在此我并不想对finsh...
潇洒哥 2015-04-01 21:29
__main() 和 main()
因为我们通常在BOOTLOADER中都已做好了比较细致的初始化工作,包括代码的搬运,所以我们最好别再调用库函数__main(),因为__main()作为ADS集成好的库函数,会对系统进行初始化设置...
潇洒哥 2015-03-26 22:54
RT-Thread学习之scons篇--解析rtconfig.py文件
rtconfig.py文件,主要用于指定编译器以及安装路径。除此之外,该文件中定义了大量的变量,这些变量包括编译选项,汇编选项,链接选项。   import os # toolchain...
潇洒哥 2015-03-26 22:53
RT-Thread学习之scons篇--SConcript文件解析
SConscript文件是用来指定哪些文件会加入编译。先来分析下BSP主目录下的SConscript文件: import rtconfig Import('RTT_ROOT') fro...
广告
我要评论
1
0
广告
关闭 热点推荐上一条 /1 下一条