2010-01-06 54 views
6

簡單的問題,但我不知道答案。scons:覆蓋一個文件的構建選項

比方說,我有一個scons構建,其中我的CCFLAGS包括-O1。我有一個文件needsOptimization.cpp,我想用-O2代替-O1。我怎麼能在scons中做到這一點?


更新:這是我結束了基於bialix的回答做:

我SConscript文件

Import('env'); 

env2 = env.Clone(); 
env2.Append(CCFLAGS=Split('-O2 --asm_listing')); 

sourceFiles = ['main.cpp','pwm3phase.cpp']; 
sourceFiles2 = ['serialencoder.cpp','uartTestObject.cpp']; 
objectFiles = []; 
objectFiles.append(env.Object(sourceFiles)); 
objectFiles.append(env2.Object(sourceFiles2)); 
    ... 

以前這個文件是:

Import('env'); 

sourceFiles = ['main.cpp','pwm3phase.cpp','serialencoder.cpp','uartTestObject.cpp']; 
objectFiles = env.Object(sourceFiles); 
    ... 

回答

9

使用Object()構建器對編譯進行細粒度控制,然後將這些對象傳遞給Program()構建器。

例如而不是:

env = Environment() 
env.Program(target='foo', source=['foo.cpp', 'bar.cpp', 'needsOptimisation.cpp']) 

您需要使用以下內容:

env = Environment() 
env_o1 = env.Clone() 
env_o1.Append(CCFLAGS = '-O1') 

env_o2 = env.Clone() 
env_o2.Append(CCFLAGS = '-O2') 

# extend these lists if needed 
SRC_O1 = ['foo.cpp', 'bar.cpp'] 
SRC_O2 = ['needsOptimisation.cpp'] 

obj_o1 = [env_o1.Object(i) for i in SRC_O1] 
obj_o2 = [env_o2.Object(i) for i in SRC_O2] 

env.Program(target='foo', source=obj_o1+obj_o2) 

你能避免環境變量的分離克隆的創作,如果你提供CCFLAGS =「 - O2」就在對象()調用:

obj_o2 = [env.Object(i, CCFLAGS=env['CCFLAGS'] + ['-O2']) for i in SRC_O2] 
6

避免創建單獨的env變量需要(ref:bialix's answer)需要這樣的東西。

obj_o2 = env.Object(SRC_O2, CCFLAGS=env['CCFLAGS'] + ['-O2']); 

如果你只是這樣做(或者像bialix循環一樣)

obj_o2 = env.Object(SRC_O2, CCFLAGS='-O2'); 

那麼你失去所有的內置標誌。