代码之家  ›  专栏  ›  技术社区  ›  OK.

scons:如何对程序的多个变体(发布/调试)使用相同的生成器

  •  5
  • OK.  · 技术社区  · 16 年前

    scons用户指南介绍了 Multiple Construction Environments 要构建单个程序的多个版本,并给出以下示例:

    opt = Environment(CCFLAGS = '-O2')
    dbg = Environment(CCFLAGS = '-g')
    
    o = opt.Object('foo-opt', 'foo.c')
    opt.Program(o)
    
    d = dbg.Object('foo-dbg', 'foo.c')
    dbg.Program(d)
    

    不是手动为使用不同环境编译的对象分配不同的名称, VariantDir() / variant_dir 听起来是个更好的解决方案…

    但是如果我把 Program() sconscript内的生成器:

    Import('env')
    env.Program('foo.c')
    

    如何将不同的环境导出到同一sconscript文件?

    opt = Environment(CCFLAGS = '-O2')
    dbg = Environment(CCFLAGS = '-g')
    
    SConscript('SConscript', 'opt', variant_dir='release') #'opt' --> 'env'???
    SConscript('SConscript', 'dbg', variant_dir='debug')   #'dbg' --> 'env'???
    

    不幸的是,在 SCons Wiki 不会给这个话题带来更多的见解。

    谢谢你的意见!

    2 回复  |  直到 16 年前
        1
  •  4
  •   BenG    16 年前

    sconscript是在环境本身上定义的方法:

    for dir, env in (('release', opt), ('debug', dbg)):
        env.SConscript('SConscript', 'env', variant_dir=dir)
    

    然后从sconscript中可以:

    Import('env')
    
        2
  •  2
  •   GaryO    16 年前

    或者,可以将字典作为exports参数传递给sconscript。键是sconscript将用于导入它的名称,值是sconstruct中的对象。所以:

    SConscript('SConscript', exports={'env': dbg}, variant_dir='debug')
    SConscript('SConscript', exports={'env': opt}, variant_dir='release')
    

    然后在sconscript中 Import('env') 会得到 dbg 第一次和 opt 第二次。这也适用于导出/导入任何您喜欢的东西,而不仅仅是env。

    有关详细信息,请参见手册页中的export()和sconscript()。