SCons如何检测SConstruct脚本中的更改?

时间:2018-05-10 00:09:36

标签: scons

我想要根据SConstruct文件中分配的变量构建文件。如下例所示:

import os

env  = Environment(ENV = os.environ)

def text_file_maker(target, source, env):
    with open(str(target[0]), "w") as text_file:
        text_file.write(env['my_text'])
    return 0


env.Append( BUILDERS = {'Make_text' : Builder(action = text_file_maker)})


env.Make_text(target = 'sour.txt', 
    source = None, 
    my_text = 'lemon')


env.Make_text(target = 'sweet.txt', 
    source = None, 
    my_text = 'apple')

运行此脚本会生成两个包含内容' lemon'的文本文件。和' apple'。如果我再次运行脚本,SCons会正确检测到目标存在:

scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: `.' is up to date.
scons: done building targets.

现在,如果我改变一个目标,例如:

env.Make_text(target = 'sweet.txt', 
    source = None, 
    my_text = 'orange')

并运行脚本,我将获得scons: '.' is up to date.内容' orange'不写入sweet.txt。

我可以指定一个依赖项:

Depends(['sweet.txt', 'sour.txt'], 'SConstruct')

但是这会强制重建我的SConstruct脚本中的任何更改。

如何让SCons识别影响目标的SConstruct脚本中的更改?

这可能是一个非常简单的问题,对不起,如果我错过了一些明显的东西。

1 个答案:

答案 0 :(得分:2)

您的示例非常类似于联机帮助页中的答案(搜索"操作对象"):

https://scons.org/doc/production/HTML/scons-man.html

第三个和后续参数(如果存在)可以是构造变量或构造变量列表,其值将在决定是否应该因为操作更改而重建目标时包含在Action的签名中。 变量也可以由varl​​ist = keyword参数指定;如果两者都存在,则将它们合并。只要您希望在特定构造变量更改时重建目标,就必须这样做。字符串操作通常不需要这样做,因为扩展变量通常是命令行的一部分,但是如果Python函数操作在生成命令行时使用构造变量的值,则可能需要这样做。

def build_it(target, source, env):
    # build the target from the 'XXX' construction variable
    open(target[0], 'w').write(env['XXX'])
    return 0

# Use positional arguments.
a = Action(build_it, '$STRINGIT', ['XXX'])

# Alternatively, use a keyword argument.
a = Action(build_it, varlist=['XXX'])

所以在你的情况下改变:

env.Append( BUILDERS = {'Make_text' : Builder(action = text_file_maker)})

tfb_action = Action(text_file_maker, varlist=['my_text'])
env.Append( BUILDERS = {'Make_text' : Builder(action = tfb_action)})