2012-12-13 36 views
1

我有一些目标需要构建才能确定我的其他目标是什么。我如何告诉SCons?SCons目标的构建时间确定

一个例子:

脚本,generate是在一些配置文件运行。该脚本根据配置文件中的信息生成包含路径和构建标志。为了构建SCons Object,我需要读取生成的文件。

我刚刚在generate上运行Execute(),但它现在有很多文件需要生成,并且需要很长时间,所以我只想在它或配置文件更改时运行它。一旦Command完成了它需要做的任何事情,我该如何告诉SCons在制造时问我一些更多的目标?

回答

2

好的,一些SCons先澄清。 Scons在构建过程中有两个阶段。首先,在分析阶段全部 Scons脚本被执行并且结果是静态依赖关系树描述脚本中定义的所有构建者的源文件和目标文件。接下来,基于该树,来自上次构建的构建数据库和光盘上的文件的签名,具有过期目标的所有构建者都将被重建。

现在你的问题。如果您只想在必要时运行generate(当generate或配置文件发生更改时),则作为分析阶段的一部分运行generate是不可行的。所以不要使用Execute()。相反,generate必须是它自己的建造者。到现在为止还挺好。

现在你有两个建造者,第一个建造者generate和第二个建造者,我叫它buildObjectbuildObject取决于generate的目标,但正如您声明的那样,generate目标在分析时未知(因为generate未运行,因此只设置为生成器)。分析时未知的目标是SCons的一个经典挑战,并且没有简单的方法来解决它。

我通常使用我称之为SCons.pleaser的文件解决它。 在你的情况下,它将是generate生成的包含高分辨率时间戳的已知目标。然后buildObject构建器将此文件作为源文件。 现在,如果您的配置文件未更改,generate将不会运行,SCons.pleaser不会更改,并且buildObject将不会运行。如果您更改了配置文件,生成将会运行,SCons.pleaser将会更改,并且buildObject也会运行。

问候

0

我去解决的办法是使该知道怎么做的产生阶段新SConstruct,和早期Execute()它在我的SConscripts之前,我到需要它的输出位。它工作得很好,因为它只需要在SCons中调用SCons的小固定开销就可以构建必要的东西。