1. scons安装:Suse 10 Linux 缺省已经安装,在任何目录下键入scons即可;
2. scons将在当前目录下按以下次序SConstruct / Sconstruct / sconstruct来搜索脚本文件;
3. 最简单的只一行如下,Program是scons的一个方法(method),表示编译链接可执行文件;
Program(‘hello.c’)
4. Object方法表示编译一个.o文件
5. scons还可以编译Java程序,方法名就是Java;
6. 清除已编译的内容:scons -c或 scons --clean;
7. SConstruct文件就是一个Python脚本,可理解为一个Python程序的入口(对应的makefile则更像一个配置文件);
8. 与Python语法一样,注释语句由‘#’带出;
9. scons中的方法(Program / Object / Java等)的执行与其在脚本中的位置无关(order independent),而是由scons根据依赖关系自行决定;我猜测其原因是参照make/makefile机制,先写最终的链接目标,而实际需要先编译.o
10. scons -Q忽略编译链接前后的读文件、编译结束的提示,聚焦编译链接的动作提示;
11. Program(’new_hello’, ’hello.c’),new_hello可执行文件名。
12. 多个源程序的编译链接,可使用Python中的list(类似数组):Program(’program’, [’main.c’, ’file1.c’, ’file2.c’])
13. 以下脚本中,Split是scons的函数,用于生成一个list,target/source是scons的关键字。
list = Split(’main.c file1.c file2.c’)
Program(target = ’program’, source = list)
14. Library,做库的方法,缺省生成.a的静态库;语法和Program一样;Library = StaticLibrary;
15. 与scons无关:linux下ar(archive,归档的意思)命令做库,ranlib为库文件(archive)生成索引(index),即符号表。nm -s / nm --print-armap命令可以打印符号表(nm 大约是name map的意思);
16. SharedLibrary生成.so库,语法和Program一样;
17. LIBS指定库List,LIBPATH指定库所在的路径。LIBS中的文件可以没有扩展名,scons会自动找到合适的文件。如下所示
Program(’prog.c’, LIBS=[’foo’, ’bar’], LIBPATH=’.’)
18. LIBPATH可以是一个Python List也可以是Linux的冒号(:)分割的单个字符串(windows下用分号分割)如下
LIBPATH = ’/usr/lib:/usr/local/lib’ #for Linux OS
LIBPATH = ’C:\\lib;D:\\lib’ #for Windows OS
19. 对照下面两端脚本,可体会交叉编译的技巧
Object(’hello.c’, CCFLAGS=’-DHELLO’)
Object(’goodbye.c’, CCFLAGS=’-DGOODBYE’)
Program([’hello.o’, ’goodbye.o’])
hello_list = Object(’hello.c’, CCFLAGS=’-DHELLO’)
goodbye_list = Object(’goodbye.c’, CCFLAGS=’-DGOODBYE’)
Program(hello_list + goodbye_list)
20. Environment方法输出指定的编译链接环境
env = Environment(CC = ’gcc’,
CCFLAGS = ’-O2’)
env.Program(’foo.c’)
21. 多环境编译举例
opt = Environment(CCFLAGS = ’-O2’)
dbg = Environment(CCFLAGS = ’-g’)
o = opt.Object(’foo-opt’, ’foo.c’)
opt.Program(o)
d = dbg.Object(’foo-dbg’, ’foo.c’)
dbg.Program(d)
22. Clone方法举例
env = Environment(CC = ’gcc’)
opt = env.Clone(CCFLAGS = ’-O2’)
dbg = env.Clone(CCFLAGS = ’-g’)
env.Program(’foo’, ’foo.c’)
o = opt.Object(’foo-opt’, ’foo.c’)
opt.Program(o)
d = dbg.Object(’foo-dbg’, ’foo.c’)
dbg.Program(d)