scons用户指南第三章:编译相关的一些事情

来源:互联网 发布:云计算运维简历 编辑:程序博客网 时间:2024/05/17 20:00
1、指定目标文件的名字
当你调用Program编译方法的的时候,它编译出来的程序名字是和源文件名是一样的。下面的从hello.c源文件编译一个可执行程序的调用将会在POSIX系统里编译出一个名为hello的可执行程序,在windows系统里会编译出一个名为hello.exe的可执行程序。
Program('hello.c')
如果你想编译出来的程序的名字与源文件名字不一样,你只需要在源文件名的左边声明一个目标文件的名字就可以了:
Program('new_hello','hello.c')
现在在POSIX系统里运行scons,将会编译出一个名为new_hello的可执行程序:
% scons -Q
cc -o hello.o -c hello.c
cc -o new_hello hello.o

2、编译多个源文件
通常情况下,你需要使用多个输入源文件编译一个程序。在SCons里,只需要就多个源文件放到一个Python列表中就行了,如下所示:
Program(['prog.c','file1.c','file2.c'])
运行scons编译:
% scons -Q
cc -o file1.o -c file1.c
cc -o file2.o -c file2.c
cc -o prog.o -c prog.c
cc -o prog prog.o file1.o file2.o
注意到SCons根据源文件列表中的第一个源文件来决定输出程序的名字。如果你想指定一个不同的程序名称,你可以在源文件列表的右边指定程序名,如下所示指定输出程序名为program:
Program('program',['prog.c','file1.c','file2.c'])

3、使用Glob指定文件列表
你可以使用Glob函数,定义一个匹配规则来指定源文件列表,比如*,?以及[abc]等标准的shell模式。如下所示:
Program('program', Glob('*.c'))

4、指定单个文件以及文件列表
有两种方式为一个程序指定源文件,一个是文件列表:
Program('hello', ['file1.c', 'file2.c'])
一个是单个文件:
Program('hello', 'hello.c')
也可以把单个文件放到一个列表中,
Program('hello', ['hello.c'])
对于单个文件,SCons函数支持两种方式。实际上,在内部,SCons把所有的输入都是看成列表的,只是在单个文件的时候,允许我们省略方括号。

5、使文件列表更易读
为了更容易处理文件名长列表,SCons提供了一个Split函数,这个Split函数可以将一个用引号引起来,并且以空格或其他空白字符分隔开的字符串分割成一个文件名列表,示例如下:
Program('program', Split('main.c  file1.c  file2.c'))
或者
src_files=Split('main.c  file1.c  file2.c')
Program('program', src_files)
同时,Split允许我们创建一个文件列表跨跃多行,示例如下:
src_files=Split("""main.c
                         file1c
                         file2.c""")
Program('program', src_files)

6、关键字参数
SCons允许使用Python关键字参数来标识输出文件和输入文件。输出文件是target,输入文件是source,示例如下:
src_files=Split('main.c  file1.c  file2.c')
Program(target='program', source=src_files)
或者
src_files=Split('main.c  file1.c  file2.c')
Program(source=src_files, target='program')

7、编译多个程序
如果需要用同一个SConstruct文件编译多个文件,只需要调用Program方法多次:
Program('foo.c')
Program('bar', ['bar1.c', 'bar2.c'])

8、在多个程序之间共享源文件
在多个程序之间共享源文件是很常见的代码重用方法。一种方式就是利用公共的源文件创建一个库文件,然后其他的程序可以链接这个库文件。
另一个更直接,但是不够便利的方式就是在每个程序的源文件列表中包含公共的文件,示例如下:
Program(Split('foo.c  common1.c  common2.c'))
Program('bar', Split('bar1.c  bar2.c  common1.c  common2.c'))
如果程序之间共享的源文件过多,可以简化:
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)
原创粉丝点击