初识rt-thread与scons

    科技2022-08-17  158

    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.py为rt-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''即可。

    Processed: 0.017, SQL: 9