我的Waf wscript可以调用当前目录中的其他wscripts吗?

时间:2013-04-23 19:50:20

标签: waf

我正在与Waf建立一个项目。它有几个第三方依赖项,我想从我的主wscript构建每个依赖项。我的项目组织如下:

/boost/
/gtest/
/source/
/waf
/wscript
/wscript_boost
/wscript_gtest

每个“依赖关系”wscript_*都定义了命令,就像我的主wscript一样。

def options(opt): pass
def configure(conf): pass
def build(bld): pass

如果我将依赖项wscript文件放在依赖项文件夹中,我可以调用opt.recurse('boost gtest'),但我不想将我的文件与第三方文件混合。

我的wscript有没有办法打电话给wscript_boostwscript_gtest

2 个答案:

答案 0 :(得分:2)

我认为当前的Waf实现不可能(waflib.Context.Context.recurse使用全局WSCRIPT_FILE变量)。

虽然很难看, 可能会在主wscript的开头

import waflib.Context
original_recurse = waflib.Context.Context.recurse

def new_recurse(ctx,*args, **kwargs):
  original_wscript_file = waflib.Context.WSCRIPT_FILE
  try:
    waflib.Context.WSCRIPT_FILE = (original_wscript_file + 
                                   kwargs.pop('suffix', ''))

    original_recurse(ctx, *args, **kwargs)
  finally:
    waflib.Context.WSCRIPT_FILE = original_wscript_file

waflib.Context.Context.recurse = new_recurse

你的主wscript会是这样的:

def configure(cfg):
  cfg.recurse(suffix='_boost')
  cfg.recurse(suffix='_gtest')

请注意,有一些副作用,因为当您在WSCRIPT_FILE文件中时,wscript_boost会加上后缀。

你也可以submit an issue参加waf项目。

答案 1 :(得分:0)

这样做的方法通常是将wscript放入每个子目录并使用recurse:

/boost/
/boost/wscript
/gtest/wscript
/source/
/waf
/wscript

并使用递归:

def build(bld):
     # ...
     bld.recurse("boost")
     bld.recurse("gtest")
     # ...