【问题标题】:Explicitly Appending Environment State to a SCons Builder Dependency MD5 Fingerprint将环境状态显式附加到 SCons Builder 依赖项 MD5 指纹
【发布时间】:2014-09-04 10:52:26
【问题描述】:

我已将我的 SCons Builder 操作修改为使用 subprocess.Popen() 而不是 env.Execute()。但是我仍然需要在env 的内容中添加一些 md5-sum 依赖检查,以便它重建和缓存新的目标文件。如何附加到 SCons 内部 MD5 哈希?

【问题讨论】:

    标签: caching build builder scons


    【解决方案1】:

    假设您有一个使用环境变量的构建器:

    # 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.Value 添加字符串值的依赖项:

    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.
    

    【讨论】:

    • 感谢您的详尽回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 2013-06-05
    • 1970-01-01
    相关资源
    最近更新 更多