7

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

我希望这是默认行为。但是,除了编辑文件以使其不同之外,还有什么方法可以强制它假设特定文件已过时(相当于“触摸”)?

编辑:用例:

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

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

scons {something to specify file foobar.h}

这将迫使 scons 根据 foobar.h 构建所有文件,而只需键入即可scons使用 MD5 哈希进行常规构建以进行依赖性检查。我不介意提前编辑 SConscript/SConstruct 文件以允许这样做(我猜是自定义决策者),如果有办法这样做不会显着增加构建时间。

4

4 回答 4

4

你有没有看过 Scons 的 --interactive 选项,在那里你可以清理和构建特定的目标。

描述这一点的手册页。

于 2009-11-11T17:02:42.233 回答
1

我认为没有办法直接做到这一点。如果有问题的源文件有一个明显的输出,例如test.ocreated from test.c,那么删除test.o将强制重新编译源文件。

相反,如果您想触摸test.h多个不同源文件中包含的内容,则最好清理整个项目以确保重建所有内容。

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

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

于 2009-10-01T05:51:23.517 回答
0

我创建了一个带有完整日期的虚拟目标文件,一直到小时分钟和秒。然后我的其他步骤取决于这个虚拟目标文件。这将在每次构建步骤重新编译时更改 md5 值,并导致后续步骤重新编译。或者,您可以删除虚拟目标,这也将级联重新编译。

就个人而言,我觉得这非常有用,因为我无法预测 EDA 构建流程中每一步的所有输出。由于维护成本,我也不想尝试预测每个构建步骤的所有输出。

正如 Greg 所提到的,我确信 Decider() 函数更像 scons,但我个人喜欢拥有时间戳文件。

于 2009-10-01T17:36:12.310 回答
0

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

于 2009-11-11T15:29:16.353 回答