我有一些需要构建的目标,以确定我的其他一些目标是什么。我如何告诉 SCons?
一个例子:
一个脚本,generate
在一些配置文件上运行。此脚本根据配置文件中的信息生成包含路径和构建标志。为了构建 SCons Object
,我需要读取生成的文件。
我只是在运行Execute()
,generate
但现在要生成很多文件并且需要很长时间,所以我只想在它或配置文件更改时运行它。Command
一旦完成了它需要做的任何事情,我如何告诉 SCons 在构建时向我询问更多目标?
我有一些需要构建的目标,以确定我的其他一些目标是什么。我如何告诉 SCons?
一个例子:
一个脚本,generate
在一些配置文件上运行。此脚本根据配置文件中的信息生成包含路径和构建标志。为了构建 SCons Object
,我需要读取生成的文件。
我只是在运行Execute()
,generate
但现在要生成很多文件并且需要很长时间,所以我只想在它或配置文件更改时运行它。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
也不会运行。如果您更改配置文件,generate 将运行,SCons.pleaser 将更改,并且buildObject
也会运行。
问候
我采用的解决方案是创建一个新的 SConstruct,它知道如何进行生成阶段,并且Execute()
在我到达需要其输出的位之前,它在我的 SConscripts 的早期阶段。它运行良好,因为它只是通过从 SCons 内部调用 SCons 的少量固定开销来构建必要的东西。