2014-06-19 22 views
1

我需要使用scons爲大型項目生成發佈和調試版本。對於發行版和調試版,它都會生成共享庫和靜態庫。在構建目錄結構應該看起來如下:SCons:單個SConscript文件中的不同variant_dir

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文件夾執行它可以生成共享和靜態庫,並與對象相關文件,有沒有什麼辦法,我可以使用variant dir,其方式是爲SharedLibrary使用目標目錄作爲{dll/lib_rel,dll/lib_dbg},對於StaticLibrary方法,它使用variant_dir作爲{lib/lib_rel,lib/lib_dbg}

一種可能的方法是爲SharedLibrary和StaticLibrary分別提供SConscript。但這是非常典型的,每個庫生成器方法都需要兩個不同的文件。

請提出適當的解決方案。

+0

庫名稱不應ç更改,而不同的庫所在的目錄名稱應該不同。 – Brady

+0

@Brady,是的,這裏我的問題不是關於更改庫名稱,我正在尋求解決方案來在'lib'目錄內創建lib_rel/libfoo.a和lib_dbg/libfoo.a並且類似地lib_rel/libfoo.so和lib_dbg/libfoo.so在'dll'目錄內。我需要爲此做些什麼改變? –

回答

0

SConstruct

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) 

應該工作。沒有嘗試過。

1

我想對待靜態性和調試岬作爲兩個維度,並調用SConscript四次,就像這樣:

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) 

的SConscript需要導入Library,當然:

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) 
相關問題