waf 使用递归并按顺序保持任务

waf using recurse and keep tasks in order

我正在使用 waf 构建和 运行 gtest。

如果我像下面这样将所有内容都放在我的根 wscript 中,它就可以工作。

def build( bld ):
    # build hello world lib
    bld.recurse("src/cpp/hw")

    # build hello world gtest app
    cppUnitTest = bld.program(
      target = 'test_run',
      source = [ 'test/unit/test_run.cpp' ],
      use = [ 'HW_static', 'GTEST_static' ],
      lib = [ 'pthread' ],
      includes = [ bld.env.LIBGTEST_INCLUDES ],
    )

    # run c++ unit test
    bld(
      dependsOn = [cppUnitTest],
      name = 'c++ unit test',
      rule = './test_run',
      cwd = bld.path.find_dir( 'build' )
    )

它构建了一个名为 HW (Hello World) 的库,它构建了一个名为 test_run 的应用程序,然后它将 运行 该测试应用程序。

但是,如果我希望使用递归构建应用程序 'test_run',我无法让它工作。这是我迄今为止的尝试之一。

def build( bld ):
    global cppUnitTest

    # build hello world lib
    bld.recurse("src/cpp/hw")

    # build hello world gtest app
    bld.recurse("tests/unit")

    # run c++ unit test
    bld(
      dependsOn = [cppUnitTest],
      name = 'c++ unit test',
      rule = './test_run',
      cwd = bld.path.find_dir( 'build' )
    )

子文件夹中的 wscript_build 文件看起来像这样

cppUnitTest = bld.program(
  target = 'test_run',
  source = [ 'test_run.cpp' ],
  use = [ 'HW_static', 'GTEST_static' ],
  lib = [ 'pthread' ],
  includes = [ bld.env.LIBGTEST_INCLUDES ],
)

编辑:正如您在下面看到的,我找到了一个特别适用于测试应用程序的解决方案,它很好。但我会对更通用的解决方案感兴趣,如何确保某些构建步骤 运行 以正确的顺序相互等待。例如如果我有一个要构建的应用程序,我会用它来生成一些用于构建其他应用程序的代码等等。

因此,仅出于 运行 单元测试的目的,我找到了一个非常好用且简单的解决方案。我使用了 waf_unit_test 模块中的构建。只需像这样添加导入 ...

from waflib.Tools import waf_unit_test

...而不是将属性 "features" 的值 "test" 添加到我所有的测试程序中...

bld.program(
  features = 'test'
  target = 'test_run',
  source = [ 'test_run.cpp' ],
  use = [ 'HW_static', 'GTEST_static' ],
  lib = [ 'pthread' ],
  includes = [ bld.env.LIBGTEST_INCLUDES ],
)

... 并删除 dependsOn 和 cppUnitTest 指令。不幸的是,我的测试应用程序的输出被抑制了,但如果测试成功,可以在构建函数中添加以下回调来获得反馈。

bld.add_post_fun(waf_unit_test.summary)

所以这对于 gtest 应用程序来说没问题,但我需要一个更通用的解决方案来保持任务的有序性。请参阅已编辑的问题。