2012-09-04 57 views
1

我有一個Jamfile,我正在使用Boost.Python來包裝一些C++類。我有自動的Jamfile運行python腳本和加載擴展的編譯後步驟:使用bjam的pythonpath功能

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

然後:

PROJECT_NAME = example ; 
run-test $(PROJECT_NAME) : $(PROJECT_NAME)_ext test_$(PROJECT_NAME)_ext.py ; 

這將建立example_ext.so,然後運行test_example_ext.py這確實一個簡單的「import example_ext」然後進行一些基本的測試。

問題是我需要test_example_ext.py能夠從其他包中導入一些Python模塊,所以我需要設置PYTHONPATH。從命令行來說,這不是問題,但是bjam似乎並沒有把它貫徹到它產生的Python過程中,即使導出。

在這種情況下,我在尋找等價的:

$ export PYTHONPATH=.. 

即將Python搜索路徑設置在我正在運行bjam的上一級。

我已經成功地get最接近的是制定出這個我想要做什麼:

$ bjam pythonpath=.. 

這實際工作。但我想在Jamfile中設置它,而不是依賴命令行。我讀過bjam手冊,說這是一個屬性,我可以在某處使用<pythonpath>..。但它沒有說明在哪裏。

所以我的問題是,我不能解決如何在Jamfile中指定此屬性。它在哪裏?語法是什麼?它是user-config.jam中的「import python;」還是「using python ...」的一部分,還是run-pyd或python-extension規則的一部分?我已經嘗試了所有這些隨機沒有理解或成功。

boost_1_50_0/tools/build/v2/tools/python.jam我發現:

#的PYTHONPATH功能指定爲PYTHONPATH
#環境變量,通過運行PYD設置附加元件。例如,pythonpath可用於訪問正在構建的產品的Python模塊,但不是
#安裝在開發系統的默認路徑中的Python模塊。
feature.feature pythonpath::free可選路徑;

這似乎是聲明'pythonpath'屬性(aka功能),但爲什麼上下文?在哪裏以及如何使用它?

this頁面演示瞭如何沿這些行定義屬性,但不是真正如何或在何處使用它。

回答

3

我相信我可能已經找到了我自己的問題的答案。

下面的解決方案似乎是project規則,其中requirements關鍵字,儘管我還沒有理解它的工作原理或者指定這個的含義。

這裏是我的Jamfile:

PROJECT_NAME = example ; 

import python ; 

# sets PYTHONPATH when executing run-test 
project : requirements <pythonpath>.. ; 

python-extension $(PROJECT_NAME)_ext : 
    $(PROJECT_NAME).cpp 
    $(PROJECT_NAME)_ext.cpp 
: 
; 

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

爲了完整起見,我居然有這種撿了Jamroot中文件一級目錄,看起來像這樣:

 
import python ; 

# Specify the path to the Boost project. If you move this project, 
# adjust this path to refer to the Boost root directory. 
use-project boost 
    : ./boost ; 

# Set up the project-wide requirements that everything uses the 
# boost_python library from the project whose global ID is 
# /boost/python. 
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) ; 
}