1

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

一个例子:

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

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

4

2 回答 2

2

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

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

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

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

问候

于 2012-12-16T09:19:18.543 回答
0

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

于 2012-12-19T14:31:24.103 回答