2014-09-04 79 views

回答

5

假設你有一個使用環境變量建設者:

# Just an example. The point is that the output of this function 
# depends upon an environment variable 
def bld_func(target, source, env): 
    with open(str(target[0]), 'w') as f: 
     f.write(' '.join(str(t) for t in target) + '\n') 
     f.write(' '.join(str(s) for s in source) + '\n') 
     f.write(env.subst('$MY_VAR') + '\n') 
bld = Builder(action=bld_func) 

和調用SConstruct它:

env = Environment() 
env['BUILDERS']['BLD'] = bld 
env.BLD('output.txt', 'input.txt', MY_VAR=ARGUMENTS['MY_VAR']) 

此構建不會,如果你更改值重新執行MY_VAR的:

$ scons -Q MY_VAR=cc output.txt 
bld_func(["output.txt"], ["input.txt"]) 
$ scons -Q MY_VAR=gcc output.txt 
scons: `output.txt' is up to date. 

但是,你可以添加一個字符串與值的依賴:

env.Depends('output.txt', env.Value(env.subst('$MY_VAR'))) 

邏輯的地方把這樣的關係在一個發射器:

def bld_emitter(target, source, env): 
    env.Depends(target, env.Value(env.subst('$MY_VAR'))) 
    return target, source 
bld = Builder(action=bld_func, emitter=bld_emitter) 

完全SConstruct:

# Create a builder that depends upon an environment variable 
def bld_func(target, source, env): 
    with open(str(target[0]), 'w') as f: 
     f.write(' '.join(str(t) for t in target) + '\n') 
     f.write(' '.join(str(s) for s in source) + '\n') 
     f.write(env.subst('$MY_VAR') + '\n') 
def bld_emitter(target, source, env): 
    env.Depends(target, env.Value(env.subst('$MY_VAR'))) 
    return target, source 
bld = Builder(action=bld_func, emitter=bld_emitter) 

# Attach it to an environment 
env = Environment() 
env['BUILDERS']['BLD'] = bld 

# Invoke the builder 
env.BLD('output.txt', 'input.txt', MY_VAR=ARGUMENTS['MY_VAR']) 

輸出示例:

$ scons -Q MY_VAR=cc output.txt 
bld_func(["output.txt"], ["input.txt"]) 
$ scons -Q MY_VAR=gcc output.txt 
bld_func(["output.txt"], ["input.txt"]) 
$ scons -Q MY_VAR=gcc output.txt 
scons: `output.txt' is up to date. 
+0

感謝你徹底的答案! – 2014-10-05 12:51:58