目录目标始终是最新的

时间:2012-09-07 09:37:36

标签: scons

我正在尝试使用如下命令更新目录中的文件:

env.Command(Dir("./targetdir/"),
            ["./targetdir/file0", "./targetdir/file1", ...],
            "./somescript.sh $TARGET")

Scons一直告诉我./targetdir/是最新的,即使我已经手动修改./targetdir/file0.

是不是scons应该知道,因为一个源文件已经改变,命令应该运行?目标是目录这一事实是否有特殊性?

我想在./somescript.sh ./targetdir/中的任何文件发生更改时运行命令./targetdir/。我该怎么办?

2 个答案:

答案 0 :(得分:1)

我不相信SCons喜欢将目标作为目录。您应该将单个文件指定为目标。

作为旁注,您是否打算让目标和源包含相同的文件?如果这是因为缺少“somescript.sh”的输入文件,通常只需提供脚本作为源。这样,SCons会将目标与脚本进行比较,而不是将目标与自身进行比较。

env.Command(target = "#targetdir/file0",
            source = "#somescript.sh",
            action = "#somescript.sh $TARGET")

注意我在路径中使用“#”,这意味着相对于根SConsctruct。

答案 1 :(得分:1)

这里的问题是你没有目标。 Scons无法存储有关依赖性的信息而无需具有目标和来源。 因此,其中一个解决方案使用明确的目标。

mycmd = Command('some_target', [], ['script.sh targetdir', Touch('$TARGET')])
or 
mycmd = Command('some_target', [], 'script.sh targetdir > $TARGET')
Depends(mycmd, Glob('targetdir/*'))

现在,scons的目标名为some_target,并且知道它取决于targetdir中的文件。恕我直言,最好的方法是为它创建特殊的构建器/包装器,并使用变体dirs在那里存储目标。