我需要能够调整构造环境,以便我可以在较低级别构建静态或共享对象。目前,我想出了以下方法:
顶级SConstruct:
if build_shared:
env.Replace(ObjectBuilder = env.SharedObject)
env.Replace(LibraryBuilder = env.SharedLibrary)
else:
env.Replace(ObjectBuilder = env.StaticObject)
env.Replace(LibraryBuilder = env.StaticLibrary)
在较低级别的SConstructs中,我按名称调用它们:
env['ObjectBuilder']('foo.c')
env['LibraryBuilder']('lib', objects)
但是,我不确定这个解决方案有多健全。是否有更简单/正确的方法来实现相同的功能?
提前致谢。
答案 0 :(得分:5)
最简单的方法是为env.Library()声明自己的包装器,只需将其参数传递给env.StaticLibrary()或env.SharedLibrary()。
根据任何构造变量/ scons选项,您可以让这个包装器在两者之间交替。
def MyLibraryWrapper(self, *args, **kwargs):
if self['BUILD_SHARED']:
return self.SharedLibrary(*args, **kwargs)
else:
return self.StaticLibrary(*args, **kwargs)
env.SetDefault(BUILD_SHARED = False)
env.AddMethod(MyLibraryWrapper)
在解析任何SConscript之前,请确保该代码段是您的SConstruct。为了使其更加干净,请在site_scons / site_tools中创建一个工具并使用env.Tool()加载它。
答案 1 :(得分:0)