初识rt-thread与scons

rtconfig.py

用于定义工具链的路径,以及全局的编译参数。

  • 必须包含变量PLATFROM(编译平台) EXEC_PATH(工具链路径) PREFIX(工具链程序的前缀) ARCH(CPU架构) CPU(CPU型号) CC(C编译器) POST_ACTION(编译完成后需执行的动作)。以上变量会被rt-thread的辅助编译脚本(比如building.py)使用。 ARCH CPU会被用于寻找libcpu的路径。POST_ACTION定义的命令串,以换行符\n分割,最后通过命令行执行。
  • CXX(C++编译器) AS(汇编器) AR(打包工具) LINK(链接器) CFLAGS LFLAGS CXXFLAGS AFLAGS 只会在SConstuct中使用,可以使用自定义名称。
  • SIZE(计算目标文件大小) OBJDUMP(反汇编工具) OBJCOPY(bin/hex文件生成工具) STRIP(删除目标文件中符号的工具)仅在POST_ACTION使用。
  • TARGET(目标文件名称) TARGET_EXT(目标文件后缀),这个仅给SConstuct使用,可以在rtconfig.py中定义TARGET_FILE = ‘build/’ + TARGET + '.elf',然后给SConstuct使用。
  • CROSS_TOOL RTT_ROOT BUILD DEVICE自用,可以不定义。
  • BSP_LIBRARY_TYPE 可以不定义。
  • dist_handle()函数可以不定义。
  • 推荐增加DEFINES变量,该变量应该定义为列表型,也即使用[]进行赋值。

SConstruct

scons默认读取的文件,主要初始化一个编译环境,并启动编译。

  • RTT_ROOT(rt-thread顶层目录)通常系统中不存在这个环境变量,手动定义时注意相对路径的关系。
  • env = Environment(...)中增加CPPDEFINES = rtconfig.DEFINES。也即将rtcofig.py中的全局宏定义传给编译环境。
  • 若工程依赖的库文件在其他地方,需要在objs = PrepareBuilding(...)DoBuilding(...)之间加一段内容,如下。其中variant_dir是设置编译的中间文件存放的路径。
LIBRARIES_PATH = os.path.asbpath('../../libraries')
objs.extend(SConscript(os.path.join(LIBRARIES_PATH, 'SConscript'), variant_dir='build/libraries', duplicate=0))

生成Qt工程文件

日常喜欢使用Qtcreator编辑程序,因而需要使用scons导出Qt工程文件。Qt的pro文件格式十分简单,类似于对INCLUDEPATH(头文件路径列表) DEFINES(全局宏定义) HEADER(头文件列表) SOURCE(源文件列表)四个变量赋值,文件路径统一使用绝对路径即可。

  • 拷贝rt-thread/tools/makefile.pyrt-thread/tools/qt.py因为makefile也主要是生成文件列表,和pro文件相像。
  • project['FILES'](源文件列表) project['HEADERS'](头文件列表) project['CPPDEFINES'](全局宏定义) project['CPPPATH'](头文件路径列表)分别对应输出即可。
  • pro文件名可以通过rtconfig.TARGET获取。
  • 修改rt-thread/tools/building.py,搜索makefile关键字,对比进行修改即可,共有两处需要修改。之后就可以使用scons --target=qt来生成Qtcreator的工程文件了。

rt-thread源码编译警告

rt-thread源码编译时会有警告,我们可以针对rt-thread的源码屏蔽这些警告。
rt-thread/src/SConscript中修改如下。这样修改可以使得新添加的cfags仅作用于rt-thread的源码,不作用于自己写的代码。

LOCAL_CCFLAGS  = ' -Wno-unused-parameter'
LOCAL_CCFLAGS  = ' -Wno-sign-compare'
LOCAL_CCFLAGS  = ' -Wno-old-style-declaration'
group = DefineGroup('Kernel', src, depend = [''], CPPPATH = CPPPATH, LOCAL_CCFLAGS  = LOCAL_CCFLAGS)

使用4.0.1的scons编译有个b ''的打印

修改rt-thread/tools/gcc.py约116行,if stderr != ''if stderr != b''即可。

你可能感兴趣的:(rt-thread,scons,python,rtos)