我最近从make转换为SCons。我通常在make中做的一件事是有一个从源文件生成预处理源的配方,所有编译器选项都将应用于正常构建。这对于确定如何包含标题非常有用。
在SCons中做同样事情的最佳方法是什么?我找不到内置的构建器,所以我是不是在编写自己的构建器?
答案 0 :(得分:3)
我会写一个pseudo-builder来调用带有特殊参数的env.Object
,如下所示:
env = Environment()
# Create pseudo-builder and add to enviroment
def pre_process(env, source):
env = env.Clone()
env.Replace(OBJSUFFIX = '.E')
env.AppendUnique(CCFLAGS = '-E')
return env.Object(source)
env.AddMethod(pre_process, 'PreProcess')
# Regular build
source = ['a.c', 'b.c']
env.AppendUnique(CPPDEFINES = 'DO_COMPUTE_PI') # for example
main = env.Program('main', source)
env.Alias('build', 'main')
env.Default('build')
# Preprocessor build
env.Alias('preprocess', env.PreProcess(source))
示例输出。注意-DDO_COMPUTE_PI
如何在常规编译和-E
编译中出现:
$ scons -Q
gcc -o a.o -c -DDO_COMPUTE_PI a.c
gcc -o b.o -c -DDO_COMPUTE_PI b.c
gcc -o main a.o b.o
$ scons -Q preprocess
gcc -o a.E -c -E -DDO_COMPUTE_PI a.c
gcc -o b.E -c -E -DDO_COMPUTE_PI b.c
$
答案 1 :(得分:0)
感谢您提供有关您尝试做的事情的其他信息。我知道你基本上想用" -E" /" / E"来调用编译器。选项并将其输出存储在单独的文件中,对吗? 在这种情况下,最简单的事情就是为这个目的编写一个新的Builder。不要感到绝望,不是那么难...... SCons在设计时考虑到了很大的灵活性。看看http://scons.org/wiki/ToolsForFools,如果您遇到问题,请写信给用户邮件列表scons-users@scons.org ...我们很乐意为您提供帮助,并在那里提供进一步的支持。