scons:覆盖一个文件的构建选项

时间:2010-01-06 14:41:15

标签: scons

简单的问题,但我不知道答案。

假设我的scons包含CCFLAGS -O1。我有一个文件needsOptimization.cpp,我想用-O1代替-O2。我怎么能在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);
   ...

2 个答案:

答案 0 :(得分:9)

使用Object()构建器对编译进行细粒度控制,然后将这些对象传递给Program()构建器。

E.g。而不是:

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)

如果在Object()调用中提供CCFLAGS =' - O2',则可以避免创建单独的env变量克隆:

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

答案 1 :(得分:6)

避免创建单独的env变量需要(ref:bialix's answer)需要这样的东西。

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

如果你这样做(或像bialix一样在for循环中)

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

然后你丢失了所有的内置标志。