Легкий вопрос, но я не знаю ответ.
Скажем, у меня есть a scons
создайте где мой CCFLAGS
включает -O1
. У меня есть один файл needsOptimization.cpp
где я хотел бы переопределить -O1
с -O2
вместо этого. Как я мог сделать это на сканированиях?
обновление: это - то, что я закончил тем, что делал на основе ответа 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);
...
Используйте конструктор 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)
Можно избежать создания отдельного клона переменной env, если предоставить CCFLAGS='-O2' прямо при вызове Object():
obj_o2 = [env.Object(i, CCFLAGS=env['CCFLAGS'] + ['-O2']) for i in SRC_O2]
Чтобы избежать создания отдельной переменной env, нужно (ссылка: ответ bialix'а) сделать что-то вроде этого.
obj_o2 = env.Object(SRC_O2, CCFLAGS=env['CCFLAGS'] + ['-O2']);
Если вы просто сделаете это (или в цикле for, как делает bialix)
obj_o2 = env.Object(SRC_O2, CCFLAGS='-O2');
то потеряете все встроенные флаги.