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()方法更适合于一般情况,应该是首选方法。那我就认为布雷迪的回答是正确的。无论如何谢谢你!