【问题标题】:scons builder/emitter generates implicit unwanted dependencyscons builder/emitter 生成隐式不需要的依赖项
【发布时间】:2018-02-22 12:57:33
【问题描述】:

我正在使用 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,即使它被发射器从目标列表中删除,它也会保留在缓存中的某个位置。

【问题讨论】:

    标签: dependencies builder implicit scons emitter


    【解决方案1】:

    编辑:

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

    只有在这一步之后,发射器才会被调用,并让您有机会扩展发射的节点列表。

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


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

    删除

    suffix = ".out",
    

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

    【讨论】:

    • 这仍然会创建一个不需要的节点file(没有前缀)。
    猜你喜欢
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多