0

我正在使用 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 不创建隐式依赖项?

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

4

1 回答 1

0

编辑:

我检查了来源,而您试图通过Emitter实现的目标是不可能的。Builder 的指定目标和源将始终在内部首先转换为SCons 节点。这就是神秘file.out(或file)的来源。

只有在这一步之后,才会调用 Emitter 并让您有机会扩展发出的Nodes列表。

我目前看到的唯一方法是直接指定最终目标名称(new_file),就像target在您的Builder调用中一样。如果需要,您可以在您的发射器中添加更多目标节点,但第一个目标将始终是隐式依赖,抱歉。


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

去除

suffix = ".out",

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

于 2018-02-22T15:26:35.033 回答