waf使用recurse并保持任务有序

时间:2017-07-10 22:48:38

标签: task googletest waf

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

如果我将所有内容都放在我的root 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)的lib,它构建了一个名为test_run的应用程序,而不是运行该测试应用程序。

但如果我想要应用程序' test_run'使用recurse建立我不能让它工作。这是我到目前为止的一次尝试。

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 ],
)
编辑:正如您在下面所见,我找到了一个特别适用于测试应用程序的解决方案。但我会对更通用的解决方案感兴趣,如何确保某些构建步骤以正确的顺序运行,等待彼此。例如如果我有一个构建应用程序,我用它来生成一些用于构建其他应用程序的代码等等。

1 个答案:

答案 0 :(得分:0)

因此,为了运行单元测试,我找到了一个非常好的简单解决方案。我在waf_unit_test模块中使用了build。只需添加这样的导入......

from waflib.Tools import waf_unit_test

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

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应用程序来说没问题,但我需要一个更通用的解决方案来保持任务的顺序。见编辑问题。