对于大的
工程来说,使用IDE来管理总是有诸多限制,例如大多少数IDE不能够支持在工程中存在相同
文件名的文件(即使是路径不相同)。而且用IDE来做build,其速度确实要慢了好几拍。
RT-Thread 0.2.x以前都是采用的GNU Make + GNU GCC的方式来
编译,但Makefile的组织太过复杂,特别是要做编译选项,会非常非常麻烦(编译选项不能够在多个Makefile之间自由传递)。GNU还有一种方式,名为automake, autoconfig,不过当自动产生的Makefile比自己的
代码还多的多的时,有时就不得不思考,
程序员是在写代码,还是automake&autoconfig在写程序员。
RT-Thread到0.3.x,主要的编译器切换到RealView
ARM Compiler,所以默认没有发布出带Makefile的版本。当然最大的原因还是,Makefile太难以忍受了!为了达到更好编译的目的,尝试创建了一个小型的分支,这个分支完全采用的是新的scons构建
系统(
http://www.scons.org):先有尝试,然后考察其实用性,最后实施。
现在到了实施的阶段:因为scons构建系统优点值得称赞,值得
应用。scons的优点,英文的,这里就不翻译了:
What makes SCons better?
* Configuration files are Python scripts--use the power of a real prog
ramming language to solve build problems.
* Reliable, automatic dependency analysis built-in for C, C++ and Fortran--no more "make depend" or "make clean" to get all of the dependencies. Dependency analysis is easily extensible through user-defined dependency Scanners for other languages or file types.
* Built-in support for C, C++, D, Java, Fortran, Yacc, Lex, Qt and SWIG, and building TeX and LaTeX documents. Easily extensible through user-defined Builders for other languages or file types.
* Building from central repositories of source code and/or pre-built targets.
* Built-in support for fetching source files from SCCS, RCS, CVS, BitKeeper and Perforce.
* Built-in support for Microsoft Visual Studio .NET and past Visual Studio versions, including generation of .dsp, .dsw, .sln and .vcproj files.
* Reliable detection of build changes using MD5 signatures; optional, configurable support for traditional timestamps.
* Improved support for parallel builds--like make -j but keeps N jobs running simultaneously regardless of directory hierarchy.
* Integrated Autoconf-like support for finding #include files, libraries, functions and typedefs.
* Global view of all dependencies--no more multiple build passes or reordering targets to build everything.
* Ability to share built files in a cache to speed up multiple builds--like ccache but for any type of target file, not just C/C++ compilation.
* Designed from the ground up for cross-platform builds, and known to work on Linux, other POSIX systems (including AIX, *BSD systems, HP/UX, IRIX and Solaris), Windows NT, Mac OS X, and OS/2.
如上所说的,scons是构建在python脚本的基础上的,
功能繁多。依赖于python,可以说在scons的脚本中能够做非常多的事,控制灵活。试用下来,感觉最大的是,其-j选项。因为现在的机器多大是多核的,而-j后,将大大的加快编译的速度,真正有那种在指尖飞的感觉。
进入正题,说说RT-Thread里的命令行编译如何使用
首先,需要安装python,
http://www.python.org,2.5或2.6版本
其次,安装scons,
http://www.scons.org,可以先装个安装版本,以后自己会了只装zip,源代码版本即可。
再次,从google svn中获取RT-Thread的最新代码,因为最近才实施scons构建系统。
因为每个人机器上的编译器不同,安装的目录也不相同,需要根据你的环境设定编译选项
打开RT-Thread代码中bsp\stm3210\
rtconfig.py文件,修改如下选项:
PLATFORM = 'gcc'
EXEC_PATH = 'd:/SourceryGCC/bin'
即把PLATFORM
设置为你使用的编译器,可设置为gcc或armcc (iar过一段时间支持)
EXEC_PATH设置为相应编译器的目录(armcc的请设置到Keil的目录)
修改完成后,请打开命令行窗口,先设置上scons的命令出处:(假设python安装于C:根目录下)
set PATH=c:\Python25\Scripts;%PATH%
进入RT-Thread/
STM3210的目录(假设RT-Thread目录放在h:根目录下)
cd h:\bsp\stm3210
然后执行
scons
-------------------------------------------------------------------------------------------------------------------------
有的时候真是感叹scons的强大,强大到还不知道如何使用其内部的特殊功能。例如,scons本身是携带分析代码的功能的,最具意义的当然是它分析 C/C++头文件预处理的功能。通过这个预处理分析,能够获知哪些宏已经定义了哪些宏未定义。推广到RT-Thread之rtconfig.h,就能够自动获得RT-Thread的组件使能情况了,至于如何在构建脚本中获得,下回待续吧。。。
接上篇。有的时候,几乎可以认为编译是最耗时的一项工作,特别是接触到大型的工程以后,想象一下,当一个系统从头到尾需要编译一个下午时,调试应该如何进行。scons提供了一个非常简洁的选项,-j,就例如GNU Make中的-j一个意思,它能够同时启动多个编译任务,在多核芯片上也就能够并行的同时编译。只是,GNU Make通常不怎么管用,而scons的非常好用。
RT-Thread的构建系统同样也支持ARM RealView Compiler的,和前面相同,只需要修改下rtconfig.py文件,定义下CC和EXEC_PATH即可。不过用命令行的缺点也是*有的*,那就是下载调试并不如IDE中的方便,甚至可以说*没办法做到*。但办法总是依靠人去想的:
1. 在Keil MDK中新建立一个空工程,设备当然选择你对应的设备了,本例中的STM32F103ZE
2. 更改工程选项中,目标文件为rtthread-stm32 (命令行版本默认采用rtthread-stm32.axf/elf),并且生成的位置位于bsp\stm3210目录下。
3. 根据使用的仿真器情况选择工程的调试方式、烧写方式
4. 烧写 & 调试。这步只需要点击Keil MDK的工具栏即可,!!千万不要去点编译!!
好了,一切就绪,可以直接调试代码了。
小提示:
命令行版本生成的目标文件后缀名可以在rtconfig.py中修改TARGET_EXT变量进行更改。而当使用GCC来进行编译时,也能够使用axf做为后缀扩展名。使用axf最大的好处是,能够获得Keil MDK烧写&调试的支持。
----------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------
cmake固然好,实际上使用scons,更看重它的python脚本功能。有了python脚本,能够自定义非常非常多的功能,这个在以后应该会有体现,最重要的一点是根据rtconfig.h自动判断哪些组件不需要,不应该参加编译。