我正在尝试使用如下命令更新目录中的文件:
env.Command(Dir("./targetdir/"),
["./targetdir/file0", "./targetdir/file1", ...],
"./somescript.sh $TARGET")
Scons一直告诉我./targetdir/
是最新的,即使我已经手动修改./targetdir/file0.
是不是scons应该知道,因为一个源文件已经改变,命令应该运行?目标是目录这一事实是否有特殊性?
我想在./somescript.sh ./targetdir/
中的任何文件发生更改时运行命令./targetdir/
。我该怎么办?
答案 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在那里存储目标。