【问题标题】:Directory target is always up to date目录目标始终是最新的
【发布时间】:2012-09-12 18:19:12
【问题描述】:

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

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

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

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

每当./targetdir/ 中的任何文件发生更改时,我都想运行命令./somescript.sh ./targetdir/。我该怎么做?

【问题讨论】:

  • 您是否打算将 targetdir/file0 等作为源和目标?
  • 所以,如果列表中的一个文件(在 targetdir 中)发生更改,您希望对每个将更改的文件调用 somescript.sh,是吗?

标签: scons


【解决方案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 中的文件。恕我直言,最好的方法是为其创建特殊的构建器/包装器并使用变体目录将目标存储在那里。

【讨论】:

    【解决方案2】:

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

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

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

    注意我在路径中使用了“#”,表示相对于根 SConstruct。

    【讨论】:

    • 我真的不明白为什么要提供脚本作为源。然后文件(file0 ...)仅在源更改时才会更新。但我也需要他们在他们改变自己时得到更新。
    • @flagadabla,也许我混淆了这种情况。我假设“targetdir/file0”是一个目标文件。实际的源文件和目标文件是什么?
    • @flagadabla,我刚刚测试了将源设置为脚本,它仅在删除 targetdir/file0 时执行,而不是在更新时执行。当目标本身发生变化时构建目标并不常见。
    • 对。我意识到我正在尝试建立一个依赖循环。
    • 我实际上想在每次目录中的文件更改时运行该命令。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多