1. 基本使用
SConstruct文件就功能而言相当于Makefile文件,就内容而言则是Python脚本,scons读入它时,会把脚本的命令都执行一遍,但具体编译过程则有scons自己相机而定。
Program('hello.c')
Program('new_hello','hello_c') 前为目标,后为源文件
Program(['prog.c','file1.c','file2.c']) 多个源文件
Program(‘program',['prog.c','file1.c','file2.c']) 指定目标文件,多个源文件
Program('program‘,Glob('*.c'))
Program('program',Split('main.c file.c file2.c')) 多个原文件更清晰的写法
src_files=Split("""main.c
file1.c
file2.c""")
Program(target='program',source=src_files)
2. 编译多个目标文件就多次调用Program()
3.8 多个程序共享源文件
eg.1
Program(Split('foo.c common1.c common2.c'))
Program('bar', Split('bar1.c bar2.c common1.c common2.c'))
eg.2
common = ['common1.c', 'common2.c']
foo_files = ['foo.c'] + common
bar_files = ['bar1.c', 'bar2.c'] + common
Program('foo', foo_files)
Program('bar', bar_files)
4. 库编译和链接
4.1 库编译
Library('foo', ['f1.c', 'f2.c', 'f3.c'])
4.1.1 你甚至可以在文件List里混用源文件和.o文件
Library('foo', ['f1.c', 'f2.o', 'f3.c', 'f4.o'])
4.1.2 显式编译静态库
StaticLibrary('foo', ['f1.c', 'f2.c', 'f3.c'])
4.1.3 编译动态库
SharedLibrary('foo', ['f1.c', 'f2.c', 'f3.c'])
4.2 库链接
Library('foo', ['f1.c', 'f2.c', 'f3.c'])
Program('prog.c', LIBS=['foo', 'bar'], LIBPATH='.')
不用指明库的前缀和后缀,如lib,.a等。
4.3 找到库:$LIBPATH变量
Program('prog.c', LIBS = 'm',
LIBPATH = ['/usr/lib', '/usr/local/lib'])
Unix上 LIBPATH = '/usr/lib:/usr/local/lib'
Windows上 LIBPATH = 'C:\\lib;D:\\lib'
5. 节点对象(nodes)
SCons把所有知道的文件和目录表示为节点。
5.1 builder方法的返回值都是节点对象List,这一点很重要,在python中List+List还是List,下面可以看到应用。
hello_list = Object('hello.c', CCFLAGS='-DHELLO')
goodbye_list = Object('goodbye.c', CCFLAGS='-DGOODBYE')
Program(hello_list + goodbye_list)
这里如果不使用变量的话,就不能跨平台使用了,因为不同系统object扩展名是不同的
5.2 显示创建文件和目录节点
hello_c = File('hello.c')
Program(hello_c)
classes = Dir('classes')
Java(classes, 'src')
一般,你不用显式调用他们,因为builder方法会自动处理文件名字符串并转换为节点的。
当你不知道目标是文件还是目录时:
xyzzy = Entry('xyzzy')
5.3 打印节点文件名
hello_c = File('hello.c')
Program(hello_c)
classes = Dir('classes')
Java(classes, 'src')
object_list = Object('hello.c')
program_list = Program(object_list)
print "The object file is:", object_list[0]
print "The program file is:", program_list[0]
5.4 把节点文件名当作字符串来使用
imp