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.StaticLibrary()またはenv.SharedLibrary()のいずれかにパラメーターを渡すだけのenv.Library()の独自のラッパーを宣言することです。

構築変数/sconsオプションに応じて、そのラッパーを2つの間で交互に使用できます。

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インターフェイスを使用して、静的ライブラリと動的ライブラリのどちらを構築するかを制御できます。IMHO、その方法論はそれほど悪くないように見えますが、私自身の SCons スクリプトを除いて多くの SCons スクリプトを見たことがありません。

于 2009-12-23T12:40:06.643 に答える