06 节点对象
1.基础语法
所有编译方法返回的是节点对象列表,来表示目标文件将被编译。
返回的节点可以作为其它编译方法的参数。
举个例子来说明,假如有两个要编译的文件,他们的编译参数不一样,但是他们的编译目标文件,需要最终链接在一起编译成可执行程序。
import os.path
#1.编译方法返回目标节点列表
#下面使用跨平台做法,将Object方法返回的节点列表定义为变量传入到Program参数中,这样的好处是我
#不需要知道返回的节点属性是.o还是.obj,这样就可以跨平台使用了
#两次调用Object方法编译不同文件,使用不同的CCFLAGS
hello_list = Object('hello.c' , CCFLAGS='-DHELLO')
goodbye_list = Object('goodbye.c' , CCFLAGS='-DGOODBYE')
# 将Object返回节点列表作为Program的参数
program_list = Program(hello_list + goodbye_list)
#打印出节点文件的名称,这里返回的是将被编译成的目标文件.o或.obj
print("the hello file is:%s"%hello_list[0])
print("the goodbye file is:%s"%goodbye_list[0])
# 打印可执行程序的名称
print("the program file is:%s "%program_list[0])
#将节点名字转换为String类型,使用python内置方法str()
program_name = str(program_list[0])
#使用python内置方法os.path.exists()判断文件是否存在
if not os.path.exists(program_name):
print("%s does not exist!"%program_name)
#2.显示的创建文件和文件夹
#使用File方法创建文件,使用Dir方法创建文件夹
hello_c = File('hello.c')
Program(hello_c)
#这种方式和上面方式是等价的,当我们需要显示的指示我们的输入文件类型时,就使用上面方法
Program('hello.c')
#还有一种情况就是输入的文件类型我们不知道是文件还是文件夹,这时使用Entry方法
xyz = Entry('xyz')
#3.从节点或字符串获取编译路径方法GetBuildPath,这里要注意的是编译路径不是绝对路径!
#创建环境env,并设置一个环境变量VAR="value"
env = Environment(VAR="value")
#创建文件,并返回文件节点
n = File("foo.c")
# 获取文件节点编译路径和字符串路径(字符串路径中引用了环境变量VAR)
# 这里传入的参数是有2个参数的列表,所以返回编译路径也是列表长度也是2个元素
# foo.c 和SConstruct文件在同一个目录,编译路径根路径是.,所以foo.c的编译路径就是foo.c
print(env.GetBuildPath([n , "sub/dir/$VAR"]))
# windoes 打印结果:['foo.c', 'sub\\dir\\value']