sconsに基づくビルドシステムのリファクタリングで少し問題が発生しています。いくつかの異なる出力オブジェクト(dll、実行可能ファイル、テスト実行可能ファイル)を含むC / C ++ソースツリーがあり、ソースファイルのレイアウトはやや異質です(ただし、そのほとんどはとディレクトリの「モジュール」ディレクトリにsrc/
ありますinc/
)。
現在のセットアップに関する私の最大の問題の1つは、これらすべてのビルド製品をデフォルトで一貫したコンパイラオプションを使用してビルドすることを本当に望んでいることです。現在のレイアウトには、サブディレクトリ内の多くのサブSConscriptファイルを呼び出すマスターSConstructファイルがあり、これらのファイルは、より大きなビルド製品(.a
たとえば、)の一部をビルドします。デフォルトでは、sconsのSConscript()
関数は、呼び出されたSConstructファイルに現在の構築環境オブジェクトを渡したり継承したりしません。つまり、現在、これらのサブSConstriptファイルはすべて、独自の異なる構築環境を使用しています。
私がまとめようとしている新しいレイアウトでは、マスター構築環境がソースツリールートにまとめられ、必要なすべてのCFLAGSとビルドが必要な定義を備えています。この構築環境をサブSConscriptファイルに渡して.c
、.cpp
ビルドツリー内のすべてのファイルが同じコマンドラインでビルドされていることを確認したいと思います。
ただし、これをsconsで行う方法はわかりません。Import()
および関数がありExport()
ますが、これらは基本的に醜いグローバル変数です。呼び出し元のSConstructファイルは、サブSConstructファイルが編集されたグローバル変数で何を行うかをあまり制御できませんExport()
。サブSConscriptファイルを、必ずしも変更させずに、現在の構築環境をパラメーターとして本質的に渡すクリーンな方法はありますか?多分次のようなもの:
master_env = Environment()
master_env.Append( CXXFLAGS=['-Wall', '-Werror', '-g', '-fPIC', ... ] )
### add other stuff that we want everything to use
SConscript( 'somelibrary/SConstruct', inherited_environment=master_env.Clone() )
### master_env has now been used to build a
### .dll in somelibrary/, but any variations
### made to somelibrary/SConstruct's inherited
### env haven't contaminated master_env
私は次のような不器用で粗雑なことをすることができることを知っています:
clobber_env = Environment()
master_env = Environment()
master_env.Append( CXXFLAGS=['-Wall', '-Werror', '-g', '-fPIC', ... ] )
call_somelibrary_sconstruct( master_env )
def call_somelibrary_sconstruct(env):
param_env = env.Clone()
Export( 'param_env' )
SConstript( 'somelibrary/SConstruct' )
# because we don't want any contamination of our global variable
# between SConscript calls. I'm not even sure if this is necessary
# or does what I think it does because I'm not sure how this ugly
# Export()'d global variable environment works with locals like
# param_env here.
param_env = clobber_env
Export( 'param_env' )
これを行うためのエレガントな方法はありますか?
アップデート:
だから私はこれをもう少し試してみました、そして私がマスターSConstructファイルでこれをしている限りそれは次のように見えます:
def build_somelib( env ):
Export( env=env.Clone() )
somelib = SConscript( 'somelib/SConscript' )
return somelib
master_env = Environment()
master_env.Append( CXXFLAGS=['-Wall', '-Werror', '-g', '-fPIC', ... ] )
build_somelib( master_env )
そしてsomelib/SConscript
Import( 'env' )
env.Append( CXXFLAGS=['-weirdoption1', ... ] )
lib = env.StaticLibrary( 'somelib', source=['source1.cpp', 'source2.cpp', ...] )
Return( "lib" )
その後、master_env
メインのSConstruct内は汚染されないままになります。すべてのサブSConscriptsExport( env=env.Clone() )
に依存して安全性(Clone()'ing)を実行する必要がなかったため、このポリシーは親SConscript/SConstructファイルである必要があります。
それでも、env
ポリシーによってパラメーター名として持つ必要があるのは少し醜いです。