好久没记笔记了,又是虎头蛇尾,惭愧!scons是下一代构建工具,学习RT-Thread OS时接触到的,小试一下感觉还是挺好用的,便打算细细学习一番,以用在以后的开发中,工欲善其事,必先利其器嘛,不要急,慢慢来。
假设已安装Python环境(必须),scons官网下载安装包,解压,然后以命令行进入解压缩后的目录,执行python setup.py install即可,注意这里需要root权限,如果安装在其它目录则使用python setup.py install --prefix=$HOME这样的命令,当然$HOME可以换成其它路径,不过要注意权限。其它安装事项,见解压目录下的README.txt。
第一个例子,hello world的交叉编译:
> mkdir hello_world
> cd hello_world
> vim main.c
#include <stdio.h>
int main(void)
{
printf("hello,world!\n");
return 0;
}
> vim SConstruct
EXE_PATH = '/opt/arm-2007q1/bin'
PREFIX = 'arm-none-linux-gnueabi-'
ARMCC = PREFIX + 'gcc'
ARMAS = PREFIX + 'gcc'
ARMAR = PREFIX + 'ar'
ARMLINK = PREFIX + 'gcc'
ARMSIZE = PREFIX + 'size'
ARMOBJDUMP = PREFIX + 'objdump'
ARMOBJCPY = PREFIX + 'objcpy'
src = Glob('*.c')
env = Environment (AS = ARMAS,
CC = ARMCC,
AR = ARMAR,
LINK = ARMLINK)
env.PrependENVPath ('PATH',EXE_PATH)
env.Program(source = src, target = 'hello_world')
> ls
main.c SConstruct
> scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
arm-none-linux-gnueabi-gcc -o main.o -c main.c
arm-none-linux-gnueabi-gcc -o hello_world main.o
scons: done building targets.
> ls
main.c main.o hello_world SConstruct
src = Glob("*.c")是参与编译的文件的定义,是当前目录下的所有以.c结尾的源文件,在这里只有一个main.c;再接下来的两句env = Environment(...)和env.PreendENVPath(...)指定所使用的编译器和具体路径(这里稍微复杂),若缺省则默认使用GCC;最后一句,指定参与编译文件和最终生成的可执行文件的名称(即hello_world)。
将可执行文件hello_world以某种方式传输到arm平台下即可执行
> scons -c
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Cleaning targets ...
Removed main.o
Removed hello_world
scons: done cleaning targets.
> ls
main.c SConstruct
scon 相当于make,而scons -c 相当于 make clean
几点说明:
(1)默认的编译器是gcc,如果想要用到其它交叉编译器,则需要额外设置一些东西了。
(2)觉得scons 与 make最大 的不同,在于不需要指定依赖关系,也不需要指定每个命令的具体动作,这些完全是由scons自动完成的,比如:不必像makefile那样需要指定make和make clean时要执行的具体动作。这习惯了make的我对这有点不适应,总觉得有点不太放心。好在可以手动干预这个过程,以达到我们想要的目的。
(3)scons 是基于python开发,在使用scons的同时可以使python脚本,这就允许自己借助python的力量写出各种各样的工具来满足各种需求,这才是真正比make强大的地方。
(4)现在才发现,最好的scons学习资料就是官网的scons 用户手册,不要再到处找资料了。