scons builder / emitter生成隐含的不需要的依赖

时间:2018-02-22 12:57:34

标签: dependencies builder implicit scons emitter

我正在使用scons 2.5.1。我想创建一个带有更改目标名称的发射器的构建器,例如:

def modify_targets(target, source, env):
    target[0] = 'new_target'
    return target, source
bld = Builder(action = 'echo $TARGETS - $SOURCES',
       suffix = ".out",
       src_suffix = '.input',
       emitter = modify_targets)
env = Environment(BUILDERS = {'Foo' : bld})
env.Foo('file')

依赖树然后如下所示:

$ scons -Q --tree=all,status
echo new_target - file.input
new_target - file.input
 E         = exists
  R        = exists in repository only
   b       = implicit builder
   B       = explicit builder
    S      = side effect
     P     = precious
      A    = always build
       C   = current
        N  = no clean
         H = no cache

[E b      ]+-.
[E     C  ]  +-SConstruct
[E     C  ]  +-file.input
[         ]  +-file.out
[  B      ]  +-new_target
[E     C  ]    +-file.input
[E     C  ]    +-/bin/echo

这个隐含的file.out应该由发射器删除。当我需要在目录上创建依赖项(例如,目录是源)时,这会导致问题。然后Scons抱怨Implicit dependency 'somedir/file.out' not found, needed by target 'xyz'。该文件永远不会存在。如何强制Builder不要创建隐式依赖?

更新:似乎构建器首先创建一个SCons.Node.FS.Entry,然后它仍保留在缓存中的某个位置,即使它被发射器从目标列表中删除。

1 个答案:

答案 0 :(得分:0)

修改

我检查了消息来源,并且您无法通过 Emitter 实现目标。生成器的指定目标和源将始终在内部首先转换为 SCons Node 。这就是神秘的file.out(或file)来自的地方。

只有在此步骤之后,才会调用发射器并使您有机会扩展发射的节点列表

我目前看到的唯一方法是,在 Builder 调用中将最终目标名称new_file直接指定为target。在您的Emitter中,您可以根据需要添加更多目标节点,但第一个目标将始终是隐式依赖,抱歉。

作为参考,以下是我的错误答案:

删除

suffix = ".out",

来自Builder的定义。它强制输出文件必须以.out后缀结尾,在这种情况下显然不是你想要的。