scons hierarchycal build:传播构建器

kol*_*usa 0 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)
Run Code Online (Sandbox Code Playgroud)

在较低级别的SConstructs中,我按名称调用它们:

env['ObjectBuilder']('foo.c')
env['LibraryBuilder']('lib', objects)
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

Ben*_*enG 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)
Run Code Online (Sandbox Code Playgroud)

在解析任何SConscript之前,请确保该代码段是您的SConstruct.为了使其更加干净,请在site_scons/site_tools中创建一个工具并使用env.Tool()加载它.