scons hierarchycal build:传播构建器

时间:2009-12-23 08:00:57

标签: scons

我需要能够调整构造环境,以便我可以在较低级别构建静态或共享对象。目前,我想出了以下方法:

顶级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)

但是,我不确定这个解决方案有多健全。是否有更简单/正确的方法来实现相同的功能?

提前致谢。

2 个答案:

答案 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)

如果这是用户可控制的选项,您可能希望使用AddOptionGetOption接口来控制是构建静态库还是动态库。恕我直言,这种方法似乎并不太糟糕,但除了我自己以外,我没有看过很多SCons脚本。