![]() |
為了以可攜式的方式表示目標設定的各個方面,例如偵錯和發行變體,或單執行緒和多執行緒建置,Boost.Build 使用具有相關值的特性。例如,debug-symbols
特性可以具有 on
或 off
的值。屬性只是一個 (特性, 值) 對。當使用者啟動建置時,Boost.Build 會自動將請求的屬性轉換為適當的命令列標記,以叫用工具集組件,例如編譯器和連結器。
有許多內建特性可以組合以產生任意建置組態。以下命令使用停用內嵌並啟用偵錯符號來建置專案的 release
變體:
b2 release inlining=off debug-symbols=on
命令列上的屬性使用以下語法指定:
feature-name
=feature-value
我們在 b2 叫用中看到的 release
和 debug
只是指定 variant
特性值的簡寫方式。例如,上面的命令也可以這樣寫:
b2 variant=release inlining=off debug-symbols=on
variant
非常常用,因此它被賦予隱含特性的特殊狀態 — Boost.Build 只會從其值的其中一個名稱推斷其身分。
完整的特性描述可以在「特性與屬性」一節中找到。
命令列上指定的屬性集構成一個建置請求— 對建置請求目標(或者,如果沒有明確請求目標,則為目前目錄中的專案)所需屬性的描述。用於建置目標的實際屬性通常是建置請求和從專案的 Jamroot
(及其其他 Jamfile,如「專案階層」一節中所述)衍生的屬性的組合。例如,#include
d 標頭檔的位置通常不在命令列上指定,而是在 Jamfile 中描述為目標需求,並自動與這些目標的建置請求組合。啟用多執行緒的編譯是典型目標需求的另一個範例。下面的 Jamfile 片段說明了如何指定這些需求。
exe hello : hello.cpp : <include>boost <threading>multi ;
當建置 hello
時,上面指定的兩個需求將始終存在。如果在 b2 命令列上給出的建置請求明確與目標的需求相矛盾,則目標需求通常會覆蓋(或者,在「自由」特性(例如 <include>
)的情況下,[1] 增強)建置請求。
<include>
特性的值是相對於使用它的 Jamroot
的位置。
如果我們希望其他目標 hello2
具有相同的要求,我們可以簡單地複製它們。但是,隨著專案的增長,這種方法會導致 Jamfile 中出現大量重複的樣板程式碼。幸運的是,有更好的方法。每個專案都可以指定一組屬性,包括需求。
project : requirements <include>/home/ghost/Work/boost <threading>multi ; exe hello : hello.cpp ; exe hello2 : hello.cpp ;
效果如同我們對 hello
和 hello2
指定了相同的需求。