2

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

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

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

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

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

4

2 回答 2

1

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

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

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

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

于 2012-09-07T09:44:37.390 回答
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 中的文件。恕我直言,最好的方法是为其创建特殊的构建器/包装器,并使用变体目录将目标存储在那里。

于 2012-09-12T10:19:12.243 回答