【问题标题】:SCons: modify intermediate builder callsSCons:修改中间构建器调用
【发布时间】:2013-09-25 16:38:15
【问题描述】:

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

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

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)

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

谢谢!

【问题讨论】:

    标签: python scons


    【解决方案1】:

    这可以使用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'])
    

    这将在buildAbuildB 中构建不同版本的source.c。虽然实际的source.c 源文件不在那些构建目录中,但您引用它时就好像它在,所以SCons 知道将输出放在哪里。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这是我的问题的确切答案。但是,正如您所说, VariantDir() 方法更适合一般情况,应该是首选。那我会把布雷迪的回答标记为正确的。还是谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-13
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多