SCons:修改中间构建器调用

时间:2013-09-25 16:38:16

标签: python scons

是否可以更改对中间构建器的调用,例如通过传递目标前缀,以避免环境冲突?

例如,假设您要使用不同的编译器宏为两个不同的库使用源文件,如下所示:

env.Library('libraryA', 'source.c', CCFLAGS=['-DCONFIG_X'])
env.Library('libraryB', 'source.c', CCFLAGS=['-DCONFIG_Y'])

SCons检测到冲突,因为Library-Builder调用Object-Builder来首先使用不同的CCFlags编译源文件。

显而易见的解决方案是从链接中拆分编译,如下所示:

objectA = env.Object('objectA', 'source.c', CCFLAGS=['-DCONFIG_X'])
objectB = env.Object('objectB', 'source.c', CCFLAGS=['-DCONFIG_y'])
env.Library('libraryA', objectA)
env.Library('libraryB', objectB)

我想知道是否有更优雅的方式,如果有多个文件用作来源,这将特别有用。

谢谢!

2 个答案:

答案 0 :(得分:5)

这可以使用SCons VariantDir()函数来实现,该函数将构建目标放在子目录中。

以下是一个例子:

VariantDir('buildA', '.', duplicate=0)
VariantDir('buildB', '.', duplicate=0)

env.Library('libraryA', 'buildA/source.c', CCFLAGS=['-DCONFIG_X'])
env.Library('libraryB', 'buildB/source.c', CCFLAGS=['-DCONFIG_Y'])

这将在source.cbuildA中构建不同版本的buildB。虽然实际的source.c源文件不在这些构建目录中,但您可以将其称为,因此SCons知道将输出放在何处。

SCons man pages中的VariantDir()函数有更好的描述。

答案 1 :(得分:3)

VariantDir()是正确的一般答案,但对于简单的情况,您可以使用OBJPREFIX将给定目标的obj放在子目录中,或者只是使它们唯一。

env.Library('libraryA', 'source.c', CCFLAGS=['-DCONFIG_X'], OBJPREFIX='libA-')