我正在尝试在使用 SCons 构建项目时添加预处理和后处理操作。
SConstruct 和 SConscript 文件位于项目的顶部。
预处理动作:
生成代码(通过调用不同的工具):
-> 不知道在此预处理之后将生成的确切文件(可以创建用于决定生成哪些文件的附加预处理,以便将它们提供给 SCons)
-> 运行外部脚本(python、pearl 脚本),编译前执行
后处理动作:
->运行外部工具,运行应该是的外部脚本链接后执行
到目前为止我尝试过的:
对于预处理:
- 使用 python 中的 os.system 来运行 cmd。 (工作正常,但我正在寻找“SCons 解决方案”)
- To use
AddPreAction(target, action)
来自 SCons 的函数。不幸的是,这个函数是在编译项目后执行的,如 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."
对于后处理:
- To use
AddPostAction(target, action)
幸运的是,这工作得很好。
我正在寻找能够使 SCons 以某种方式了解此前后过程的解决方案。
我的问题如下:
对于上述要求,使用 SCons 的最佳方法是什么?有没有办法使用 SCons 内置函数在编译之前执行预处理操作?
您没有提供有关如何使预处理部分正常工作的详细信息。一般来说,您应该尝试为代码生成部分创建真正的构建器...这将使 SCons(以及作为用户的您)更容易检测和处理依赖项。您可能想查看我们的 Wiki:https://github.com/SCons/scons/wiki/ToolsForFools https://github.com/SCons/scons/wiki/ToolsForFools,我们在其中详细解释了如何编写新的构建器。
如果您需要在每个构建上运行额外的脚本,您应该能够使用以下命令触发这些脚本:os.system()
或适当的subprocess
例如,在顶级 SConstruct 的开始处调用。但是我从您最新的编辑中得到的信息(我将主要参考您提出的第一个问题)是,您正在尝试对某种“分阶段”构建过程进行建模。您认为您需要一个“预处理”阶段,您可以通过调用脚本来连接并创建您可能需要的所有其他标头和源。我的猜测是,您正在尝试重写诸如原始 make/autotools 设置之类的内容,并且希望尽可能重用部件,这当然不是一个坏主意。但 SCons 不是阶段驱动的,它是依赖驱动的......所以你当前的方法不适合,迟早会导致问题。
您能做的最好的事情就是忘记 Pre-Actions 和 PostActions,并直接了解您的依赖关系。除了编写自己的构建器来替换脚本之外,您还必须为每个构建器实现适当的发射器。这个发射器(检查上面提到的工具指南)必须解析进入脚本的输入文件,并返回脚本实际运行时将生成的文件名列表。这样,SCons 就会知道a priori运行构建脚本后会生成哪些文件,并且可以使用这些名称来解决依赖关系(即使实际文件尚不存在)。
对于后处理部分:这通常通过使用标准 Python atexit 处理程序来处理。参见例如如何在 scons 中每次构建后运行一些代码? https://stackoverflow.com/questions/8901296/how-do-i-run-some-code-after-every-build-in-scons举个例子。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)