3

我正在用 Waf 构建一个项目。它有几个第三方依赖项,我想从我的 main 构建每个依赖项wscript。我的项目是这样组织的:

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

每个“依赖项”wscript_*都定义了命令,就像我的 main 一样wscript

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

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

有什么方法可以让我wscript调用wscript_boostandwscript_gtest吗?

4

2 回答 2

2

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

虽然丑陋,但可以在 main 的开头破解它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文件中时会加上后缀。

您还可以向waf 项目提交问题。

于 2013-04-25T09:39:43.130 回答
0

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

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

并使用递归:

def build(bld):
     # ...
     bld.recurse("boost")
     bld.recurse("gtest")
     # ...
于 2013-04-25T14:01:06.270 回答