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

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

编辑: 用例:

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

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

scons {something to specify file foobar.h}

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

有帮助吗?

解决方案

您是否已看看使用SCons的--interactive选项,也可以清理,并建立具体目标。

手册页描述此。

其他提示

我不认为有一种方法可以直接做到这一点。如果所讨论的源文件有一个明显的输出,诸如从test.o创建test.c,然后除去test.o将迫使源文件的重新编译。

如果不是你想摸摸它从多个不同的源文件包括test.h,你可能会更好做一个干净的整个项目,以确保一切都得到重建。

说了这么多,你可能需要阅读有关的 Decider()功能,它可以让你选择文件的依赖将如何处理。你甚至可以选择在项目中的特定文件的自定义功能决胜局,所以如果你有,你想成为能够一些全局头文件touch和重建,你能做到这一点。

更新:要回答你的问题的最新,只需删除该文件G.使用SCons将由您打造下一次运行X重建它是F

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

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

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

在您的SConstruct文件中提取表示文件的节点。在这之后,你应该能够使用 Node.always_build(真),以确保它是内置的,我认为这将迫使其家属也重建了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top