如何向SCons构建添加前置和后置处理操作?

4
我正在尝试在使用SCons构建项目时添加预处理和后处理操作。
SConstruct和SConscript文件位于项目顶部。
预处理操作: 通过调用不同的工具生成代码:->不知道这个预处理后将生成哪些文件(可以创建另一个预处理来决定生成了哪些文件,以便将其提供给SCons);->运行外部脚本(python、pearl脚本),在编译之前执行。
后处理操作:
->运行外部工具、运行外部脚本,应在链接之后执行。
我到目前为止尝试过的:
对于预处理:
- 使用Python中的os.system运行cmd。(正常工作,但我正在寻找“SCons解决方案”) - 使用SCons的AddPreAction(target, action)函数。不幸的是,该函数按照SCons用户手册所述在编译项目后执行:"The specified pre_action would be executed before scons calls the link command that actually generates the executable program binary foo, not before compiling the foo.c file into an object file." 对于后处理:
-使用AddPostAction(target, action)。这很好地完成了任务。
我正在寻找能使SCons意识到这些预处理和后处理的解决方案。
我的问题是:
对于上述要求,使用SCons最佳方法是什么?有没有办法使用SCons内置功能在编译之前执行预处理操作?

额外问题:您在上面提到了两个脚本,用于在构建过程中生成其他源文件。这些脚本生成的结果文件名列表是否固定,即您总是会得到相同的输出文件集合(*不一定具有相同的内容!)...还是这个“目标”列表取决于脚本的输入? - dirkbaechle
我可以获得不同的输出文件,脚本调用了一个具有自己配置文件的工具。我不知道生成了哪些文件。还有一个问题是,脚本2依赖于脚本1生成的文件。 - John Smith
请更新您的问题和描述。请注意,我不是为自己或仅为您编写答案。我尝试为查看和阅读此页面的每个人回答,因此我希望两个部分(问题和答案)尽可能简洁。 - dirkbaechle
我已经更新了问题,并提供了所有必要的细节! - John Smith
你需要预处理在特定文件编译之前运行吗?还是在编译所有文件之前运行? - bdbaddog
显示剩余2条评论
1个回答

1

您没有提供太多关于如何让预处理部分工作的细节。一般来说,您应该尝试为代码生成部分创建真正的构建器...这将使SCons(以及您作为用户)更容易检测和处理依赖项。您可能想查看我们在https://github.com/SCons/scons/wiki/ToolsForFools上的Wiki页面,在那里我们详细解释了如何编写新的构建器。

如果您需要在每次构建时运行其他脚本,您应该可以使用os.system()或适当的subprocess调用,在顶层SConstruct的开头触发这些脚本。但是根据您最新的编辑内容,我主要参考您提出的第一个问题,您似乎正在尝试模拟某种“分阶段”构建过程。您认为您需要一个“预处理”阶段,可以通过调用您的脚本来创建您可能需要的所有附加标头和源代码。我猜测,您正在尝试重写类似于原始的make/autotools设置,并希望尽可能地重用部分内容,这当然不是一个坏主意。但是,SCons并不是基于阶段的,它是基于依赖关系的...因此,您当前的方法不适合并可能会在早期或晚期导致问题。

你能做的最好的事情,就是忘记Pre-和PostActions,并且把你的依赖关系搞清楚。除了编写自己的Builder来替换脚本之外,您还需要为每个这些Builders实现正确的Emitter。该Emitter(请参阅上面提到的“工具指南”)必须解析进入脚本的输入文件,并返回在实际运行脚本时将生成的文件名列表。这样,一旦构建脚本运行,SCons将会先知道哪些文件被生成,并且可以使用这些名称来解决依赖项(即使实际文件尚不存在)。

对于后处理部分:通常使用标准的Python atexit处理程序来处理。例如,请参见How do I run some code after every build in scons?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接