Python SCON:修改中间生成器调用

Python SCON:修改中间生成器调用,python,scons,Python,Scons,是否可以更改对中间构建器的调用(例如通过传递目标前缀),以避免环境冲突 例如,假设您希望使用不同的编译器宏为两个不同的库使用源文件,如下所示: env.Library('libraryA','source.c',CCFLAGS=['-DCONFIG\u X'])) 环境库('libraryB','source.c',CCFLAGS=['-DCONFIG_Y'])) SCons检测到冲突,因为库生成器调用对象生成器以首先使用不同的CCFLAG编译源文件 显而易见的解决方案是将编译与链接分开,如下

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

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

env.Library('libraryA','source.c',CCFLAGS=['-DCONFIG\u X']))
环境库('libraryB','source.c',CCFLAGS=['-DCONFIG_Y']))
SCons检测到冲突,因为库生成器调用对象生成器以首先使用不同的CCFLAG编译源文件

显而易见的解决方案是将编译与链接分开,如下所示:

objectA=env.Object('objectA','source.c',CCFLAGS=['-DCONFIG\u X']))
objectB=env.Object('objectB','source.c',CCFLAGS=['-DCONFIG_y']))
环境库('libraryA',objectA)
环境库('libraryB',objectB)
我想知道是否有一种更优雅的方法,如果有多个文件用作源文件,这种方法会特别有用


谢谢

这可以使用函数来实现,该函数将把构建目标放在一个子目录中

下面是一个例子:

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'])
这将在
buildA
buildB
中生成不同版本的
source.c
。尽管实际的
source.c
源文件不在那些构建目录中,但您可以像引用它一样引用它,因此
SCons
知道将输出放在哪里

在中对VariantDir()函数有更好的描述。

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

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

这就是我问题的确切答案。但是,正如您所说,VariantDir()方法更适合于一般情况,应该是首选方法。那我就认为布雷迪的回答是正确的。无论如何谢谢你!