【问题标题】:How can SCons detect changes in SConstruct script?SCons 如何检测 SConstruct 脚本的变化?
【发布时间】:2018-10-20 04:23:00
【问题描述】:

我想要基于在 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 脚本中影响目标的更改?

这可能是一个非常简单的问题,如果我错过了一些明显的问题,请见谅。

【问题讨论】:

    标签: scons


    【解决方案1】:

    您的示例非常类似于手册页中的答案(搜索“Action Objects”):

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

    第三个和随后的参数(如果存在)可以是构造变量或构造变量列表,在决定是否应重建目标时,其值将包含在操作的签名中,因为操作已更改。 变量也可以通过 varlist= 关键字参数指定;如果两者都存在,则将它们合并。每当您希望在特定构造变量更改时重建目标时,这是必要的。这对于字符串操作通常不需要,因为扩展变量通常是命令行的一部分,但如果 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)})
    

    【讨论】:

    • 非常感谢!行动变量接缝是解决方案。我会仔细阅读的。
    • 又卡住了……如果变量不是字符串,而是字典呢?
    • 所以如果你改变字典它不会重建?
    猜你喜欢
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 2020-07-20
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    相关资源
    最近更新 更多