您的位置:首页 > 移动开发 > Objective-C

scons用户指南第五章:节点对象

2011-12-19 15:02 169 查看
1、编译方法返回目标节点列表
所有编译方法会返回一个节点对象列表,这些节点对象标识了那些将要被编译的目标文件。这些返回出来的节点可以作为参数传递给其他的编译方法。
例如,假设我们想编译两个目标文件,这两个目标有不同的编译选项,并且最终组成一个完整的程序。这意味着对每一个目标文件调用Object编译方法,如下所示:
Object('hello.c', CCFLAGS='-DHELLO')
Object('goodbye.c', CCFLAGS='-DGOODBYE')
Program(['hello.o', 'goodbye.o'])
这样指定字符串名字的问题就是我们的SConstruct文件不再是跨平台的了。因为在Windows里,目标文件成为了hello.obj和goodbye.obj。
一个更好的解决方案就是将Object编译方法返回的目标列表赋值给变量,这些变量然后传递给Program编译方法:
hello_list = Object('hello.c', CCFLAGS='-DHELLO')
goodbye_list = Object('goodbye.c', CCFLAGS='-DGOODBYE')
Program(hello_list + goodbye_list)
这样就使得SConstruct文件是跨平台的了。

2、显示创建文件和目录节点
在SCons里,表示文件的节点和表示目录的节点是有清晰区分的。SCons的File和Dir函数分别返回一个文件和目录节点:
hello_c=File('hello.c')
Program(hello_c)
classes=Dir('classes')
Java(classes, 'src')
通常情况下,你不需要直接调用File或Dir,因为调用一个编译方法的时候,SCons会自动将字符串作为文件或目录的名字,以及将它们转换为节点对象。只有当你需要显示构造节点类型传递给编译方法或其他函数的时候,你才需要手动调用File和Dir函数。
有时候,你需要引用文件系统中一个条目,同时你又不知道它是一个文件或一个目录,你可以调用Entry函数,它返回一个节点可以表示一个文件或一个目录:
xyzzy=Entry('xyzzy')

3、打印节点文件名
你可能需要经常做的就是使用一个节点来打印输出这个节点表示的文件名。因为一个编译方法调用返回的对象是一个节点列表,你必须使用Python脚本从列表中获得单个节点。例如,如下的SConstruct文件:
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]

4、将一个节点的文件名当作一个字符串
如果你不是想打印文件名,而是做一些其他的事情,你可以使用内置的Python的str函数。例如,你想使用Python的os.path.exists判断一个文件是否存在:
import os.path
program_list=Program('hello.c')
program_name=str(program_list[0])
if not os.path.exists(program_name):
     print program_name, "does not exist!"
在POSIX系统里执行scons:
% scons -Q
hello does not exist!
cc -o hello.o -c hello.c
cc -o hello hello.o

5、GetBuildPath:从一个节点或字符串中获得路径
env.GetBuildPath(file_or_list)返回一个节点或一个字符串表示的路径。它也可以接受一个节点或字符串列表,返回路径列表。如果传递单个节点,结果就和调用str(node)一样。路径可以是文件或目录,不需要一定存在:
env=Environment(VAR="value")
n=File("foo.c")
print env.GetBuildPath([n, "sub/dir/$VAR"])
将会打印输出如下:
% scons -Q
['foo.c', 'sub/dir/value']
scons: . is up to date.
有一个函数版本的GetBuildPath,不需要被一个Environment调用,它是基于SCons默认的Environment来使用的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息