我有一個相當簡單的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來使用其中的一個嗎?