SCons目标的构建时间确定

时间:2012-12-13 23:03:58

标签: scons

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

一个例子:

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

我刚刚在Execute()上运行generate,但现在要生成大量文件并且需要花费大量时间,所以我只想在它或配置文件发生变化时运行它。在Command完成任务后,我如何告诉SCons在构建时向我询问更多目标?

2 个答案:

答案 0 :(得分:2)

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

现在回答你的问题。如果您只想在必要时(generate或配置文件更改时)运行generate,那么在分析阶段中运行generate是不可能的。所以不要使用Execute()。相反,generate必须是自己的构建者。到目前为止一切都很好。

现在你有两个构建器,第一个构建器generate和第二个构建器,我称之为buildObjectbuildObject取决于generate的目标,但正如您所述,generate目标在分析时未知(因为generate未运行,因此仅设置为建设者)。在分析时具有未知目标是SCons的经典挑战,并没有简单的方法来解决它。

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

此致

答案 1 :(得分:0)

我采用的解决方案是创建一个新的SConstruct,它知道如何进行生成阶段,并在我到达需要输出的位之前在我的SConscripts中提前Execute()。它运行良好,因为它只需要在SCons中调用SCons的小额固定开销来构建必要的东西。