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 应用程序来说没问题,但我需要一个更通用的解决方案来保持任务的有序性。请参阅已编辑的问题。
我正在使用 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 应用程序来说没问题,但我需要一个更通用的解决方案来保持任务的有序性。请参阅已编辑的问题。