我正在使用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
,然后它仍保留在缓存中的某个位置,即使它被发射器从目标列表中删除。
答案 0 :(得分:0)
修改强>
我检查了消息来源,并且您无法通过 Emitter 实现目标。生成器的指定目标和源将始终在内部首先转换为 SCons Node 。这就是神秘的file.out
(或file
)来自的地方。
只有在此步骤之后,才会调用发射器并使您有机会扩展发射的节点列表。
我目前看到的唯一方法是,在 Builder 调用中将最终目标名称new_file
直接指定为target
。在您的Emitter中,您可以根据需要添加更多目标节点,但第一个目标将始终是隐式依赖,抱歉。
作为参考,以下是我的错误答案:
删除
suffix = ".out",
来自Builder的定义。它强制输出文件必须以.out
后缀结尾,在这种情况下显然不是你想要的。