"Scons中的touch相当于什么?"

7

scons使用MD5哈希值而不是文件修改时间来确定依赖项是否需要构建。

我希望这是默认行为。但是,除了编辑文件使其不同之外,是否有任何方法强制它假定特定文件已过期(相当于“touch”)?

编辑:用例:

二进制文件F用于使用工具X创建另一个文件G。由于某种原因,文件G已更改(损坏或我对其进行了编辑),或者工具X已更改,我想重新创建文件G和其下游的所有内容。

编辑:这仅用于偶尔使用。我不希望这总是发生,只有在我要求时才会发生。此外,我可能事先不知道特定的文件。出于这个原因,我不想修改SConscript / SConstruct文件来构建特定文件。我想在命令提示符下执行以下操作:

scons {something to specify file foobar.h}

这样会强制scons构建所有依赖于foobar.h的文件,而仅输入scons将使用MD5哈希进行依赖项检查的常规构建。 如果有办法在不显著增加构建时间的情况下允许此操作(自定义Decider,我猜),我不介意提前编辑SConscript / SConstruct文件。

4个回答

4

哦,我从来不知道有--interactive这个选项,这将为我在重复构建时节省一些时间。谢谢!我认为我也可以用它来做我想要的事情。 - Jason S
请注意,如果您真的想触发新的编译调用,您需要执行scons --interactive --no-cache,否则交互命令build将只从缓存中选择,并不会使用您的编译器。 - Nordlöw

1

我认为没有直接实现这个的方法。如果所涉及的源文件有一个明显的输出,例如从test.c创建的test.o,那么删除test.o将强制重新编译源文件。

如果您想要触摸包含在多个不同源文件中的test.h,则最好对整个项目进行清理以确保所有内容都得到重建。

话虽如此,您可能需要阅读关于Decider()函数的内容,该函数允许您选择如何处理文件依赖项。您甚至可以为项目中特定的文件选择自定义决策器函数,因此如果您有一些全局头文件希望能够touch并重新构建,则可以这样做。

更新:回答您的最新问题,只需删除文件G。 Scons将通过运行X在下次构建时从F重新创建它。


0
在您的SConstruct文件中提取代表您文件的节点。之后,您应该能够使用Node.always_build(true)来确保它被构建,我认为这将强制重建其依赖项。

谢谢,但我不想总是这样做(这是一个罕见但非常必要的任务),而且我也不想修改SConstruct/SConscript文件,我只想找到一种方法进行一次重建,以强制重新构建特定的文件及其依赖项。 - Jason S

0

我创建了一个带有完整日期,包括小时、分钟和秒的虚拟目标文件。然后,我让其他步骤依赖于这个虚拟目标文件。这样每次构建步骤重新编译时都会更改md5值,并导致随后的步骤重新编译。或者,您可以删除虚拟目标文件,这也会级联重新编译。

就我个人而言,我发现这非常有用,因为我无法预测我的EDA构建流程中每个单独步骤的所有输出。也不想尝试预测每个构建步骤的所有输出,因为这会增加维护成本。

我相信像Greg提到的Decider()函数更符合scons的风格,但我个人喜欢时间戳文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接