scons使用MD5哈希而不是文件mod时间来确定是否需要构建依赖项。
我希望这是默认行为。但有没有办法强制它假设一个特定的文件已经过时(相当于“触摸”),除了编辑文件以使其不同?
编辑用例:
二进制文件F用于使用工具X创建另一个文件G.由于某种原因,文件G已更改(它已损坏,或者我已编辑)或工具X已更改,我想重新创建文件G和所有内容它的下游。
编辑:这仅供偶尔使用。我不希望这种情况一直发生,只有那几次我要求它。此外,我可能不会提前知道特定文件。出于这个原因,我不想修改SConscript / SConstruct文件来构建特定文件。我想要的是在命令提示符下执行此操作:
scons {something to specify file foobar.h}
这会强制scons根据foobar.h构建所有文件,而只需键入scons
就可以使用MD5哈希进行常规构建以进行依赖性检查。我不介意提前编辑SConscript / SConstruct文件以允许这个(自定义Decider,我猜),如果有办法这样做不会显着增加构建时间。
答案 0 :(得分:4)
您是否看过Scons的--interactive选项,在那里您可以清理并构建特定目标。
答案 1 :(得分:1)
我认为没有办法直接这样做。如果有问题的源文件有一个明显的输出,例如test.o
创建的test.c
,则删除test.o
会强制重新编译源文件。
如果您想要触摸多个不同源文件中包含的test.h
,那么最好还是清理整个项目,以确保一切都得到重建。
话虽如此,您可能希望了解Decider()
function,它可以让您选择如何处理文件依赖性。您甚至可以为项目中的特定文件选择自定义决策函数,因此如果您有一些全局头文件,您希望能够touch
并重建,那么您可以这样做。
更新:要回答您的最新问题,只需删除文件G. Scons将在下次构建时通过运行X从F重新创建它。
答案 2 :(得分:0)
我创建了一个虚拟目标文件,其中包含完整日期,一直到小时分钟和秒。然后我有其他步骤依赖于这个虚拟目标文件。每次构建步骤重新编译时,这将更改md5值,并导致后续步骤重新编译。或者,您可以删除虚拟目标,这也将级联重新编译。
就个人而言,我发现这非常有用,因为我无法预测EDA构建流程中每一步的所有输出。由于维护成本,我也不想尝试预测每个构建步骤的所有输出。
我确信像Greg所提到的,Decider()函数更像scons,但我个人更喜欢使用时间戳文件。
答案 3 :(得分:0)
在SConstruct文件中,提取代表您文件的节点。在此之后你应该能够使用 Node.always_build(true)来确保它是构建的,我认为这将迫使它的家属重建。