0

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

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

但是,我不确定这个解决方案有多合理。是否有更直接/正确的方法来实现相同的功能?

提前致谢。

4

2 回答 2

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() 加载它。

于 2010-01-24T08:36:28.830 回答
0

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

于 2009-12-23T12:40:06.643 回答