覆盖 SCons 构建器
Override an SCons builder
我想对所有 .o
文件(例如由 Object
或 StaticObject
生成器生成的文件)进行一些 post 处理,无论生成器是什么用户使用。
我正在尝试 "override" 或 "hook" 基础环境的构建器,但我无法想出任何可行的方法:
old = env['BUILDERS']['StaticObject']
env['BUILDERS']['StaticObject'] = something_that_calls(old)
是否有规定的方法来挂钩或覆盖 StaticObject
构建器之类的东西?
我看过关于 Nested SCons Builder 的问题,但它没有告诉我如何替换现有的生成器,只是补充了它的行为。
我不知道是否有替代 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.
如您所见,附加(回显)操作是在构建目标文件后执行的。
我想对所有 .o
文件(例如由 Object
或 StaticObject
生成器生成的文件)进行一些 post 处理,无论生成器是什么用户使用。
我正在尝试 "override" 或 "hook" 基础环境的构建器,但我无法想出任何可行的方法:
old = env['BUILDERS']['StaticObject']
env['BUILDERS']['StaticObject'] = something_that_calls(old)
是否有规定的方法来挂钩或覆盖 StaticObject
构建器之类的东西?
我看过关于 Nested SCons Builder 的问题,但它没有告诉我如何替换现有的生成器,只是补充了它的行为。
我不知道是否有替代 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.
如您所见,附加(回显)操作是在构建目标文件后执行的。