2

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

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

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)

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

谢谢!

4

2 回答 2

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.cinbuildAbuildB. 尽管实际的source.c源文件不在那些构建目录中,但您可以像在那样引用它,因此SCons知道将输出放在哪里。

SCons 手册页中对 VariantDir() 函数有更好的描述。

于 2013-09-25T17:42:30.660 回答
3

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

env.Library('libraryA', 'source.c', CCFLAGS=['-DCONFIG_X'], OBJPREFIX='libA-')
于 2013-10-08T20:23:06.453 回答