如何向 SCons 构建添加预处理和 post 处理操作?

How to add pre and post-process actions to SCons build?

我正在尝试在使用 SCons 构建项目时添加预处理和 post 处理操作。

SConstruct 和 SConscript 文件位于项目的顶部。

预处理操作: 生成代码(通过调用不同的工具): -> 不知道在此预处理后将生成的确切文件(可以创建用于确定生成哪些文件的附加预处理,以便将它们提供给 SCons)

-> 运行ning 外部脚本(python, pearl 脚本), 编译前执行

Post-处理操作:

->运行ning 外部工具,运行ning 应该在链接后执行的外部脚本

到目前为止我尝试了什么:

预处理:

对于post-进程:

我正在寻找能让 SCons 以某种方式意识到这个预和 post 进程的解决方案。

我的问题如下:

对于上述要求,使用 SCons 的最佳方法是什么?有没有办法使用 SCons 内置函数在编译前执行预处理操作?

您没有详细说明您为使 pre-processing 部分工作所做的努力。一般来说,您应该尝试为代码生成部分创建真正的构建器……这将使 SCons 更容易检测和处理依赖项(以及作为用户的您;))。您可能想在 https://bitbucket.org/scons/scons/wiki/ToolsForFools 查看我们的 Wiki,我们在那里详细解释了如何编写新的构建器。

如果您需要在每个构建中 运行 额外的脚本,您应该能够在构建开始时使用 os.system() 或适当的 subprocess 调用来触发这些脚本top-level 以 SConstruct 为例。但是我从你最近的编辑中得到的,我将主要参考你提出的第一个问题,是你正在尝试对某种 "staged" 构建过程进行建模。您认为您需要一个 "preprocess" 阶段,您可以在其中通过调用脚本挂钩并创建您可能需要的所有其他 headers 和源。我的猜测是,您正在尝试重写类似于原始 make/autotools 设置的内容,并希望尽可能重复使用部分内容,这当然不是一个坏主意。但是 SCons 不是 stage-driven,它是 dependency-driven...所以您当前的方法不合适,迟早会导致问题。

你能做的最好的事情就是忘记 Pre- 和 PostActions 并直接获得你的依赖关系。除了编写您自己的构建器来替换您的脚本之外,您还必须为这些构建器中的每一个实现适当的发射器。这个发射器(查看上面提到的工具指南)必须解析进入脚本的输入文件,以及 return 脚本实际获取时将生成的文件名列表 运行。像这样,一旦构建脚本是 运行,SCons 就会知道 a priori 生成哪些文件,并且可以使用这些名称来解决依赖关系(即使实际文件不尚不存在)。

对于 post-processing 部分:这通常使用标准的 Python atexit 处理程序来处理。参见例如How do I run some code after every build in scons? 举个例子。