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

2024-06-01 06:25:47 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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

后处理操作:

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

我一直在努力:

对于预处理:

  • 使用操作系统以运行命令。(效果不错,但我正在寻找“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内置函数执行预处理操作?在


Tags: 文件工具the项目函数脚本targetfoo
1条回答
网友
1楼 · 发布于 2024-06-01 06:25:47

你没有详细说明你试图让你的预处理部分工作。一般来说,您应该尝试为代码生成部分创建真正的生成器…这将使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?。在

相关问题 更多 >