2017-07-10 74 views
1

我使用waf來構建並運行gtest。waf使用遞歸併保持任務順序

如果我把所有東西都放在我的根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(你好世界)的lib,它構建的應用程序調用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 ], 
) 

編輯:正如你可以看到下面我找到了解決方法特別適用於測試的應用,這是好的。但我會對更一般的解決方案感興趣,如何確保某些構建步驟以正確的順序運行,以便彼此等待。例如如果我有一個應用程序來構建我用來生成一些用於構建其他應用程序等的代碼。

回答

0

因此,爲了運行單元測試的唯一目的,我找到了一個非常好的簡單解決方案。我在waf_unit_test模塊中使用了構建。簡單地增加這樣的進口...

from waflib.Tools import waf_unit_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應用程序來說是好的,但我需要一個更一般的解決方案來保持任務的順序。查看編輯的問題。