2012-08-17 30 views
3

我有一個相當簡單的Boost.Python擴展,我用bjam構建。問題是事情發生的順序對我來說沒有意義,我看不到如何解決它。Boost's bjam在構建完成之前運行測試

我的項目包含一個根目錄,一個Jamroot以及一個包含Jamfile,C++文件,頭文件和Python腳本的單個項目子目錄。

在根中,我有一個看起來像這樣的Jamroot文件,很大程度上來自示例和文檔。它與項目的Jamfile是分開的,因爲我真的想在其他子目錄中存在的幾個項目中共享它。

import python ; 

if ! [ python.configured ] 
{ 
    ECHO "notice: no Python configured in user-config.jam" ; 
    ECHO "notice: will use default configuration" ; 
    using python ; 
} 

use-project boost 
    : ./boost ; 

project 
    : requirements <library>/boost/python//boost_python ; 

# A little "rule" (function) to clean up the syntax of declaring tests 
# of these extension modules. 
rule run-test (test-name : sources +) 
{ 
    import testing ; 
    testing.make-test run-pyd : $(sources) : : $(test-name) ; 
} 

build-project hello_world ; 
# build-project [[other projects]]... ; 

然後,我有一個包含我的「程序hello_world」項目(名稱更改爲保護無辜者),其中包含一個Jamfile中的子目錄:

PROJECT_NAME = hello_world ; 

import python ; 

python-extension interpolation_ext : 
    $(PROJECT_NAME).cpp 
: 
    <define>FOO 
; 

# Put the extension and Boost.Python DLL in the current directory, so that running script by hand works. 
install convenient_copy 
    : $(PROJECT_NAME)_ext 
    : <install-dependencies>on <install-type>SHARED_LIB <install-type>PYTHON_EXTENSION 
    <location>. 
    ; 

# Declare test targets 
run-test $(PROJECT_NAME) : $(PROJECT_NAME)_ext test_$(PROJECT_NAME)_ext.py ; 

這convenient_copy「肯定是方便,但我避風港不幸的是,他沒有發現很多文件。

無論如何,我的想法是,當我在「hello_world」項目目錄中時,我會定期更改代碼並鍵入'bjam'。這具有構建Python擴展並運行test_hello_world_ext.py文件的效果,該文件會執行「導入hello_world_ext」來測試擴展已正確構建,然後執行一系列相當平凡的單元測試。如果全部通過,那麼bjam報告成功。

問題似乎是,有時的bjam運行的Python測試它已經運行了「convenient_copy」規則之前,這意味着它將對以前版本的擴展的測試,然後將其覆蓋新版本。這意味着我經常需要兩次運行bjam。事實上,第二次bjam知道某些東西已經過時,因爲它實際上做了一些事情。第三次和以後的時間它不做任何事情,直到我進一步改變源代碼。這就像一個依賴不正確的經典雙重製造問題。

這樣做的主要問題是它通常失敗了一個成功的構建(因爲現有的擴展是壞的),並且有時它顯示一個錯誤的構建成功。它實際上花了我幾個星期才注意到這種行爲,大約在同一時間,我認爲我瘋了,也許不是巧合...

它似乎在Linux上比OS X更經常這樣做,但我不完全確定。雖然感覺如此,但我在兩種環境之間平均分配時間。

另外,我是唯一一個發現bjam的'jamfile'語法完全混淆的人嗎?引擎蓋下有很多我只是不明白,或可以找到適當的文件。我很樂意使用make或SCons,但是由於這裏和那裏的例子都不完整,我無法使這些工作正常工作。真讓我困惑的是,在bjam寫入我的文件之前,bjam如何構建許多其他目標,這會使我寫一個非常複雜的makefile文件?由於我對GNU Make和SCons非常熟悉,值得我放棄bjam來使用其中的一個嗎?

回答

2

在jamfile中聲明目標的順序並不決定構建目標的順序。使用依賴關係來控制構建順序。

更改run-test規則接受要求的說法:

rule run-test (test-name : sources + : requirements *) 
{ 
    import testing ; 
    testing.make-test run-pyd : $(sources) : $(requirements) : $(test-name) ; 
} 

修改$(PROJECT_NAME)目標宣言上convenient_copy添加依賴要求:

run-test $(PROJECT_NAME) : $(PROJECT_NAME)_ext test_$(PROJECT_NAME)_ext.py : <dependency>convenient_copy ; 

關於 它會像這樣在這裏做部分jamfile語法等:

如果你用Boost.Build做任何事情,除了非常微不足道的事情,你一定要閱讀它的User Manual。我個人的經驗是,從開始到結束閱讀之後,我會選擇Boost.Build而不是其他版本系統。 YMMV

相關問題