1

大規模なプロジェクトのリリースおよびデバッグ ビルドを生成するには、scons を使用する必要があります。リリース ビルドとデバッグ ビルドの両方で、共有ライブラリと静的ライブラリが生成されます。ビルド後のディレクトリ構造は次のようになります。

project_dir/
   |_ src
   |_ include
   |_ lib
      |_ lib_rel
      |_ lib_dbg
   |_ dll
      |_ dll_rel
      |_ dll_dbg

SConstruct と SConscript を上記の要件に従って実装するにはどうすればよいですか?

SConstruct の実装:

env = Environment()
relEnv = env.clone(CCFLAGS = ['-O3', '-pthread')]
dbgEnv = env.clone(CCFLAGS = ['-O0', '-g', '-pthread')]
SConscript(dirs = 'src', name = 'SConscript',  exports = {'env' : relEnv}, variant_dir = 'lib_rel', duplicate = 0)
SConscript(dirs = 'src', name = 'SConscript',  exports = {'env' : dbgEnv}, variant_dir = 'lib_dbg', duplicate = 0)

src/SConscript の実装:

Import('env')
src_list = Glob('*.cpp')
inc_list = ['dir_1/include', 'dir_2/include', 'common/include']
env.SharedLibrary(target = 'foo', source = src_list, CPP_PATH=inc_list)
env.StaticLibrary(target = 'foo', source = src_list, CPP_PATH=inc_list)

上記の実装を使用すると、lib_rel フォルダーと関連するオブジェクト ファイルに共有ライブラリと静的ライブラリを生成できます。SharedLibrary でターゲット ディレクトリを {dll/lib_rel , dll/lib_dbg} として使用するようにバリアント ディレクトリを使用する方法はありますか? StaticLibrary メソッドの場合、 variant_dir を {lib/lib_rel, lib/lib_dbg} として使用します

可能なアプローチの 1 つは、SharedLibrary と StaticLibrary に個別の SConscript を使用することです。しかし、これは、各ライブラリ ビルダー メソッドに 2 つの異なるファイルが必要であるという非常に典型的なものです。

これに対する適切な解決策を親切に提案してください。

4

2 に答える 2

1

Static-ness と Debug-ness を 2 つの次元として扱い、次のように SConscript を 4 回呼び出します。

env = Environment()
relEnv = env.Clone(CCFLAGS = ['-O3', '-pthread'])
dbgEnv = env.Clone(CCFLAGS = ['-O0', '-g', '-pthread'])
SConscript(dirs = 'src', name = 'SConscript',  exports = {'env' : relEnv, 'Library' : relEnv.StaticLibrary}, variant_dir = 'lib/lib_rel', duplicate = 0)
SConscript(dirs = 'src', name = 'SConscript',  exports = {'env' : dbgEnv, 'Library' : dbgEnv.StaticLibrary}, variant_dir = 'lib/lib_dbg', duplicate = 0)
SConscript(dirs = 'src', name = 'SConscript',  exports = {'env' : relEnv, 'Library' : relEnv.SharedLibrary}, variant_dir = 'dll/dll_rel', duplicate = 0)
SConscript(dirs = 'src', name = 'SConscript',  exports = {'env' : dbgEnv, 'Library' : dbgEnv.SharedLibrary}, variant_dir = 'dll/dll_dbg', duplicate = 0)

もちろん、それは醜いので、実際にはループを使用します。

env = Environment()
relEnv = env.Clone(CCFLAGS = ['-O3', '-pthread'])
dbgEnv = env.Clone(CCFLAGS = ['-O0', '-g', '-pthread'])

for env, envPath in ((relEnv, 'rel'), (dbgEnv, 'dbg')):
  for lib, libPath in ((env.StaticLibrary, 'lib'), (env.SharedLibrary, 'dll')):
    SConscript(dirs = 'src', 
               name = 'SConscript',
               exports = {'env' : env, 'Library' : lib},
               variant_dir = '{libPath}/{libPath}_{envPath}'.format(**locals()),
               duplicate = 0)

Libraryもちろん、SConscript は import する必要があります。

Import('env', 'Library')
src_list = Glob('*.cpp')
inc_list = ['dir_1/include', 'dir_2/include', 'common/include']
Library(target = 'foo', source = src_list, CPP_PATH=inc_list)
于 2014-10-31T03:19:15.997 に答える
0

Sコンストラクト

env = Environment()
relEnv = env.clone(CCFLAGS = ['-O3', '-pthread')]
dbgEnv = env.clone(CCFLAGS = ['-O0', '-g', '-pthread')]
SConscript(dirs = 'src', name = 'SConscript',  exports = {'env' : relEnv, 'BUILD_TYPE'='rel'}, variant_dir = 'lib_rel', duplicate = 0)
SConscript(dirs = 'src', name = 'SConscript',  exports = {'env' : dbgEnv, 'BUILD_TYPE'='dbg'}, variant_dir = 'lib_dbg', duplicate = 0)

SConscript

Import('env')
src_list = Glob('*.cpp')
inc_list = ['dir_1/include', 'dir_2/include', 'common/include']
env.SharedLibrary(target = '#/lib/lib_${BUILD_TYPE}/foo', source = src_list, CPP_PATH=inc_list)
env.StaticLibrary(target = '#/lib/lib_${BUILD_TYPE}/foo', source = src_list, CPP_PATH=inc_list)

動作するはずです。試していません。

于 2014-06-26T23:03:33.370 に答える