Boost C++ Libraries

PrevUpHomeNext

建置流程

建置請求
建置主要目標
建置專案

當您描述完目標後,您希望 Boost.Build 執行正確的工具並建立所需的目標。本節將說明兩件事:如何指定要建置的內容,以及如何實際建構主要目標。

需要注意的最重要一點是,在 Boost.Build 中,與其他建置工具不同,您宣告的目標並非對應於特定檔案。您在 Jamfile 中宣告的更像是「元目標」。根據您在命令列上指定的屬性,每個元目標將產生一組對應於所請求屬性的實際目標。同一個元目標很可能以不同的屬性建置多次,產生不同的檔案。

提示

這表示對於 Boost.Build,您無法直接從 Jamfile 取得建置變體。使用者可能會請求多個變體,並且每個目標都可以使用不同的屬性進行建置。

建置請求

命令列指定要建置哪些目標以及使用哪些屬性。例如

b2 app1 lib1//lib1 toolset=gcc variant=debug optimization=full

將使用指定的屬性建置兩個目標:「app1」和「lib1//lib1」。您可以使用目標識別碼參考任何目標,並指定任意屬性。有些屬性非常常見,因此可以省略屬性的名稱。例如,以上內容可以寫成

b2 app1 lib1//lib1 gcc debug optimization=full

完整的語法,其中包含一些額外的捷徑,在「呼叫」一節中描述。

建置主要目標

當您直接或間接請求使用特定需求建置主要目標時,將執行以下步驟。提供了一些簡要說明,更多詳細資訊請參閱「建置流程」一節

  1. 套用預設建置。如果目標的 default-build 屬性指定了建置請求中不存在的特性值,則會新增該值。

  2. 選擇要使用的主要目標方案。對於每個方案,我們會查看方案的需求和建置請求中同時存在的屬性數量。選擇具有大量匹配屬性的方案。

  3. 決定「通用」屬性。建置請求會使用目標的需求進行精煉。需求中的條件屬性也會被處理。最後,會新增特性的預設值。

  4. 建置 sources 清單和 dependency 屬性所參考的目標。sources 清單和屬性可以使用目標參考參考其他目標。對於每個參考,我們會取得所有傳播的屬性,透過目標參考中指定的顯式屬性對其進行精煉,並將結果屬性作為建置請求傳遞給其他目標。

  5. 將建構依賴項時產生的使用需求添加到「common」屬性中。在前一個步驟中建構依賴項時,它們會返回已建立的「實際」目標集合以及使用需求。使用需求會添加到 common 屬性中,產生的屬性集將用於建構目前的目標。

  6. 使用產生器建構目標。為了將來源轉換為所需的類型,Boost.Build 使用「產生器」—— 對應於編譯器和連結器等工具的物件。每個產生器都會宣告它可以產生哪種類型的目標以及它需要哪種類型的來源。利用這些資訊,Boost.Build 可以判斷必須執行哪些產生器才能從特定來源產生特定目標。執行產生器時,它們會返回「實際」目標。

  7. 計算要返回的使用需求。使用需求中的條件屬性會被展開,並返回結果。

建構專案

使用者通常會建構整個專案,而不只是一個主要目標。事實上,在沒有引數的情況下呼叫 b2 會建構在目前目錄中定義的專案。

建構專案時,建構請求會不做任何修改地傳遞給該專案中的所有主要目標。可以使用 explicit 規則來防止專案中目標的隱式建構

explicit hello_test ;

會導致 hello_test 目標只有在使用者或其他目標明確請求時才會被建構。

專案的 Jamfile 可以包含許多 build-project 規則呼叫,這些呼叫指定要建構的其他專案。


PrevUpHomeNext