我尝试在使用scon构建项目时添加预处理和后处理操作。在
SConstruct和SConscript文件位于项目的顶部。在
预处理操作: 生成代码(通过调用不同的工具): ->;不知道此预处理后将生成的确切文件(可以创建用于确定生成哪些文件的附加预处理,以便向SCON提供这些文件)
->运行外部脚本(python、pearl脚本),在编译前执行
后处理操作:
->运行外部工具,运行链接后应执行的外部脚本
我一直在努力:
对于预处理:
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内置函数执行预处理操作?在
你没有详细说明你试图让你的预处理部分工作。一般来说,您应该尝试为代码生成部分创建真正的生成器…这将使scon(以及作为用户的您)更容易检测和处理依赖项。你可能想看看我们的Wiki,在https://bitbucket.org/scons/scons/wiki/ToolsForFools上,我们详细解释了如何编写新的构建器。在
如果您需要在每个构建上运行额外的脚本,您应该能够在顶层scostruct的开始处使用
os.system()
或适当的subprocess
调用来触发这些fine。但是我从你最新的编辑中得到的,我将主要提到你所问的第一个问题,那就是你在试图建立某种“阶段性”构建过程的模型。您认为您需要一个“预处理”阶段,在这个阶段中,您可以通过调用脚本来钩住并创建所有可能需要的附加头和源。我的猜测是,你试图重写一些东西,比如一个原始的make/autotools设置,并希望尽可能重用部件,这当然不是个坏主意。但是SCons不是阶段驱动的,而是依赖关系驱动的……所以你当前的方法并不适合,迟早会导致问题。在你能做的最好的事情,就是忘掉前和后处理,把你的依赖关系弄清楚。除了编写自己的构建器来替换脚本之外,还必须为每个构建器实现一个适当的发射器。这个发射器(查看上面提到的工具指南)必须解析进入脚本的输入文件,并返回脚本实际运行时生成的文件名列表。这样,SCons就可以预先知道构建脚本运行后生成了哪些文件,并且可以使用这些名称来解析依赖关系(即使实际文件还不存在)。在
对于后处理部分:这通常通过使用标准的pythonatexit处理程序来处理。示例见How do I run some code after every build in scons?。在
相关问题 更多 >
编程相关推荐