- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试在使用 SCons 构建项目时添加预处理和后处理操作。
SConstruct 和 SConscript 文件位于项目的顶部。
预处理操作:生成代码(通过调用不同的工具):-> 不知道在此预处理后将生成的确切文件(可以创建用于确定生成哪些文件的附加预处理,以便将它们提供给 SCons)
-> 运行外部脚本(python、pearl 脚本),在编译前执行
后处理操作:
->运行外部工具,运行应该链接后执行的外部脚本
到目前为止我尝试过的:
对于预处理:
AddPreAction(target, action)
函数。不幸的是,这个函数是在编译项目之后执行的,因为 SCons 用户手册指出:“指定的 pre_action 将在 scons 调用实际生成的链接命令之前执行
可执行程序二进制 foo,而不是在将 foo.c 文件编译成目标文件之前。”
对于后处理:
AddPostAction(target, action)
幸运的是,它工作正常。我正在寻找能让 SCons 以某种方式意识到这个前后过程的解决方案。
我的问题如下:
对于上述要求,使用 SCons 的最佳方法是什么?有没有办法使用 SCons 内置函数在编译前执行预处理操作?
最佳答案
您没有详细说明您为使预处理部分正常工作所做的努力。一般来说,您应该尝试为代码生成部分创建真正的构建器……这将使 SCons 更容易检测和处理依赖项(以及作为用户的您;))。您可能想在 https://bitbucket.org/scons/scons/wiki/ToolsForFools 查看我们的 Wiki。 ,我们在其中详细解释了如何编写新的构建器。
如果您需要在每个构建上运行额外的脚本,您应该能够通过 os.system()
或适当的 subprocess
调用来触发这些脚本例如,您的顶级 SConstruct 的开始。但是我从你最近的编辑中得到的,我将主要引用你提出的第一个问题,是你正在尝试对某种“分阶段”构建过程进行建模。您认为您需要一个“预处理”阶段,您可以在其中通过调用脚本 Hook 并创建您可能需要的所有其他 header 和源。我的猜测是,您正在尝试重写类似于原始 make/autotools 设置的内容,并希望尽可能重复使用部件,这当然不是一个坏主意。但是 SCons 不是阶段驱动的,而是依赖驱动的...因此您当前的方法不合适,迟早会导致问题。
你能做的最好的事情就是忘记 Pre- 和 PostActions 并直接获得你的依赖关系。除了编写您自己的构建器来替换您的脚本之外,您还必须为这些构建器中的每一个实现适当的发射器。这个发射器(查看上面提到的工具指南)必须解析进入脚本的输入文件,并返回将在脚本实际运行时生成的文件名列表。像这样,SCons 将先验知道构建脚本运行后会生成哪些文件,并且可以使用这些名称来解决已经存在的依赖关系(即使实际文件尚不存在)。
对于后处理部分:这通常使用标准的 Python atexit 处理程序来处理。参见例如How do I run some code after every build in scons?举个例子。
关于python - 如何为 SCons 构建添加预处理和后处理操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34263389/
我是一名优秀的程序员,十分优秀!