Boost C++ Libraries

PrevUpHomeNext

第三章 簡介

目錄

概念
Boost.Jam 語言
設定
呼叫
宣告目標
專案
建置流程

本節將提供使用 Boost.Build 建立專案所需的資訊。這裡提供的資訊屬於較高層級,而低階文件則需參考第五章「參考」以及線上說明系統(請參閱 --help)。

Boost.Build 分為兩部分:一個具有自定義直譯語言的建置引擎,以及以該語言實作的 Boost.Build 本身。當您在命令列輸入 b2 時,事件的順序如下:

  1. Boost.Build 可執行檔會嘗試尋找 Boost.Build 模組並載入頂層模組。確切的流程在 「初始化」章節 中有詳細說明。

  2. 頂層模組會載入使用者定義的設定檔,user-config.jamsite-config.jam,這些檔案定義了可用的工具集。

  3. 接著會讀取目前目錄中的 Jamfile。這可能會導致讀取更多 Jamfile。最終會建立一個包含目標的專案樹狀結構。

  4. 最後,Boost.Build 會根據命令列指定的建置請求,決定要建置哪些目標以及如何建置。這些資訊會傳回 Boost.Jam,由它負責實際執行排定的建置動作命令。

因此,要成功使用 Boost.Build,您只需要知道四件事:

概念

Boost.Build 有一些獨特的概念,將在本節介紹。解釋這些概念的最佳方式是與較傳統的建置工具進行比較。

使用任何 make 的變體時,您會直接指定目標和用於從其他目標建立它們的命令。以下範例使用硬編碼的編譯器呼叫命令,從 a.c 建立 a.o

a.o: a.c
    g++ -o a.o -g a.c

這是一種相當低階的描述機制,而且難以根據所使用的編譯器和作業系統調整命令、選項和建立的目標集。

為了提高可攜性,大多數現代建置系統都提供了一組可在建置描述檔案中使用的高階函式。請參考以下範例:

add_program ("a", "a.c")

這是一個函式呼叫,它建立了從原始檔 a.c 建立可執行檔所需的目標。根據設定的屬性,可能會使用不同的命令列。然而,add_program 雖然是高階的,但層級仍然相當淺。所有目標都是在解析建置描述時立即建立的,這使得執行多變量建置變得不可能。通常,任何建置屬性的變更都需要重新設定整個建置樹狀結構。

為了支援真正的多變量建置,Boost.Build 引入了 元目標 的概念——這是一個在解析建置描述時建立的物件,稍後可以使用特定的建置屬性呼叫它來產生實際的目標。

請參考以下範例:

exe a : a.cpp ;

當 Boost.Build 解析此宣告時,它會建立一個 metatarget(元目標),但尚未決定必須建立哪些檔案或使用哪些指令。在解析所有建構檔案後,Boost.Build 會考量命令列中要求的屬性。假設您使用以下指令呼叫 Boost.Build:

b2 toolset=gcc toolset=msvc

在這種情況下,metatarget 將會被呼叫兩次,一次使用 toolset=gcc,另一次使用 toolset=msvc。兩次呼叫都會產生具體目標,這些目標將具有不同的副檔名並使用不同的命令列。

另一個關鍵概念是 建構屬性。建構屬性是一個影響建構過程的變數。它可以在命令列中指定,並在呼叫 metatarget 時傳遞。雖然所有建構工具都有類似的機制,但 Boost.Build 的不同之處在於它要求所有建構屬性都必須事先宣告,並且提供了一組具有可移植語義的大量屬性。

最後一個概念是 屬性傳播。Boost.Build 並不要求每個 metatarget 都使用相同的屬性來呼叫。相反地,「頂層」metatarget 使用命令列中指定的屬性來呼叫。每個 metatarget 可以選擇擴充或覆寫某些屬性(特別是使用需求機制,請參閱 「需求」一節)。然後,依賴項 metatarget 會使用修改後的屬性來呼叫,並產生具體目標,這些目標隨後會在建構過程中使用。當然,依賴項 metatarget 也可能會修改建構屬性並擁有自己的依賴項。

如需有關需求和概念的更深入說明,您可以參考 SYRCoSE 2009 Boost.Build 文章


PrevUpHomeNext