使用scons生成预处理源?

时间:2014-08-08 03:28:03

标签: scons

我最近从make转换为SCons。我通常在make中做的一件事是有一个从源文件生成预处理源的配方,所有编译器选项都将应用于正常构建。这对于确定如何包含标题非常有用。

在SCons中做同样事情的最佳方法是什么?我找不到内置的构建器,所以我是不是在编写自己的构建器?

2 个答案:

答案 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 ...我们很乐意为您提供帮助,并在那里提供进一步的支持。