2010-10-26 80 views
6

我有一個C++項目與Scons搭建。起初我只有優化的版本來編譯,它工作正常。然後我還需要一個調試版本,然後爲它添加另一個環境。下面是使用SCons代碼:如何使用Scons在Glob的不同環境下編譯相同的對象?

env = Environment() 

opt = env.Clone(CCFLAGS=['-pthread', '-O3', '-Wall']) 
opt_objs = opt.Glob('src/*.cpp') 
prog = opt.Program('prog', opt_objs) 

dbg = env.Clone(CCFLAGS=['-pthread', '-Wall', '-g', '-O0']) 
dbg_objs = dbg.Glob('src/*.cpp') 
dbg_prog = dbg.Program('dbg_prog', dbg_objs) 

有了這個代碼,我遇到了錯誤:

scons: *** Two environments with different actions were specified for the same target: 
src/CometReadService.o 

正如你所看到的,通過opt.Glob創建的那些.o文件目標(「SRC/。 cpp')和dbg.Glob('src/ .cpp')完全相同的名稱。通過閱讀文檔Multiple Construction Environments我知道我可以重命名對象,如「opt.Object('xxx-opt','xxx.c')」,但是,它是Glob not Object。我怎麼解決這個問題?

回答

7

scons manual描述如何使用VariantDir函數(或添加SConscript時的參數)來設置不同的生成目錄。最簡單的是,VariantDir將構建輸出從源文件中分離出來,但它也可以用來分隔不同環境的構建輸出。

env = Environment() 

opt = env.Clone(CCFLAGS=['-pthread', '-O3', '-Wall']) 
opt.VariantDir('gen-opt', 'src', duplicate=0) 
opt_objs = opt.Glob('gen-opt/*.cpp') 
prog = opt.Program('prog', opt_objs) 

dbg = env.Clone(CCFLAGS=['-pthread', '-Wall', '-g', '-O0']) 
dbg.VariantDir('gen-dbg', 'src', duplicate=0) 
dbg_objs = dbg.Glob('gen-dbg/*.cpp') 
dbg_prog = dbg.Program('dbg_prog', dbg_objs) 

使用VariantDir可以進行一些實驗。例如,請注意Glob參數已更改 - 沒有duplicate=0參數,默認行爲是用於VariantDir複製構建目錄中的源文件。

+1

難以理解的概念,如那個,給定的名稱,你永遠不會有想法谷歌爲減少很多scons的力量...個人,我希望只是調用env.TemporaryObjectDir和所有我的.os將被存儲在那裏...而不是這個奇怪的解決方法...但無論如何,非常感謝你,我搜索了年齡:-) – 2014-11-03 11:21:12

+1

這是完全推遲的Scons,Globbing的想法在一個地方的文件不存在(特別是在複製= 0時)非常不直觀。出售我的老闆使用scons而不是我們可怕的makefile,但現在我後悔了。 – 2016-07-13 12:41:10

相關問題