覆盖SCons构建器

5
我想对所有的.o文件进行一些后处理(例如由ObjectStaticObject构建器生成的文件),无论用户使用哪个构建器。
我试图像这样“覆盖”或“挂钩”基本环境的构建器,但我无法想出任何有效的方法:
old = env['BUILDERS']['StaticObject']
env['BUILDERS']['StaticObject'] = something_that_calls(old)

有没有一种规定的方法来挂钩或覆盖类似于StaticObject构建器的东西?

我看到了一个关于嵌套SCons Builder的问题,但它并没有告诉我如何替换现有的构建器,只是补充其行为。

1个回答

9

我不知道是否有一种更好的方法来替换Builder,但我认为你正在正确的轨道上。以下是一个(虽然微不足道的)例子,对我来说起作用:

def wrap_builder(bld):    
    return Builder(action = [bld.action, 'echo $TARGET'],
                   suffix = bld.suffix,
                   src_suffix = bld.src_suffix)

obj_bld = env['BUILDERS']['Object']
env['BUILDERS']['Object'] = wrap_builder(obj_bld)

env.Program('test', ['test.c'])

带有输出:

scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
gcc -o test.o -c -std=c99 test.c
echo test.o
test.o
gcc -o test test.o
scons: done building targets.

正如您所看到的,额外的(echo)操作是在构建对象文件之后执行的。

太棒了 - 我在“复制构造函数”实例化包装器构建器时遇到了困难。我正在想,“我是否有一个Builder.Clone()?”我会尝试一下。 - Jonathon Reinhart
<offtopic>还有,“低功耗无线网络系统” - 802.15.4 是吗?</offtopic> - Jonathon Reinhart
@JonathonReinhart 是的,我在这个网站上工作:http://www.linear.com/products/wireless_sensor_networks_-_dust_networks - Dave Bacher
你的解决方案似乎完美地工作了。我不确定是否必要,但我还将以下成员从原始Builder传递给包装器:prefixensure_suffix(target|source)_(scanner|factory)emittermultienvsrc_buildersingle_source。再次感到非常遗憾它们没有提供Clone()函数。 - Jonathon Reinhart
1
关于Clone()方法:我们(SCons)是一个开源项目,所以您随时欢迎提交拉取请求。 ;) - dirkbaechle

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