好的,一些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
也会运行。
问候