时间确定SCons目标
我有一些目标需要建立,以确定我的其他一些目标是什么。 我如何告诉SCons?
一个例子:
脚本, generate
在一些配置文件上运行。 该脚本根据配置文件中的信息生成包含路径和构建标志。 为了构建SCons Object
,我需要读取生成的文件。
我只是在generate
运行Execute()
,但它现在有很多文件需要生成,并且需要很长时间,所以我只想在它或配置文件更改时运行它。 一旦这个Command
完成了它需要做的任何事情,我该如何告诉SCons在构建时问我一些更多的目标?
好的,首先是一些SCons的澄清。 Scons在构建过程中有两个阶段。 首先,在分析阶段执行所有Scons脚本,结果是一个静态依赖树,描述脚本中定义的所有构建器的源文件和目标文件。 接下来,基于该树,来自上次构建的构建数据库和光盘上的文件的签名,具有过期目标的所有构建者都将被重建。
现在你的问题。 如果您只想在必要时运行generate
( generate
或配置文件发生更改时),那么作为分析阶段的一部分运行generate
是不成问题的。 所以不要使用Execute()
。 相反, generate
必须是它自己的建造者。 到现在为止还挺好。
现在你有两个构建器,第一个构建器generate
和第二个构建器,我称它为buildObject
。 buildObject
依赖于generate
的目标,但正如您所述, generate
目标在分析时未知(因为generate
未运行,只能作为生成器进行设置)。 分析时未知的目标是SCons的一个经典挑战,并且没有简单的方法来解决它。
我通常使用我称之为SCons.pleaser
文件来解决它。 在您的情况下,将是公知的目标generate
生成包含高分辨率时间戳。 buildObject
构建器然后将此文件作为源。 现在,如果你的配置文件没有改变, generate
将不会运行,SCons.pleaser不会改变,并且buildObject
不会运行。 如果你改变你的配置文件,生成将会运行,SCons.pleaser会改变,并且buildObject
也会运行。
问候
我使用的解决方案是创建一个知道如何执行生成阶段的新SConstruct,并在我的SConscript中提前Execute()
它,然后再到达需要其输出的位。 它工作得很好,因为它只是在SCons中调用SCons的固定开销很小的情况下根据需要构建。