![]() |
我們在簡介中做的第一件事是宣告一個新的目標類型
import type ; type.register VERBATIM : verbatim ;
類型是目標最重要的屬性。Boost.Build 能夠自動產生必要的建構動作,僅僅是因為您指定了所需的類型(使用不同的主要目標規則),並且 Boost.Build 可以從其副檔名猜測來源的類型。
type.register
規則的前兩個參數是新類型的名稱以及與其關聯的副檔名列表。具有列表中副檔名的檔案將具有指定的目標類型。如果從其他來源產生已宣告類型的目標,則將使用第一個指定的副檔名。
有時您需要根據建構屬性(例如工具集)更改用於產生目標的後綴。例如,某些編譯器對可執行檔使用 elf
副檔名。您可以使用 type.set-generated-target-suffix
規則
type.set-generated-target-suffix EXE : <toolset>elf : elf ;
新的目標類型可以從現有的類型繼承。
type.register PLUGIN : : SHARED_LIB ;
上面的程式碼定義了一個從 SHARED_LIB
衍生的新類型。最初,新類型繼承基類型的所有屬性 - 尤其是產生器和後綴。通常,您會以某種方式更改新類型。例如,使用 type.set-generated-target-suffix
,您可以設定新類型的後綴。或者您可以為新類型編寫特殊的產生器。例如,它可以為外掛程式產生額外的元資訊。無論哪種方式,只要可以使用 SHARED_LIB
,就可以使用 PLUGIN
類型。例如,您可以直接將外掛程式連結到應用程式。
一個類型可以被定義為「主要」類型,在這種情況下,Boost.Build 將自動宣告一個主要目標規則來建構該類型的目標。更多細節可以在稍後找到。
有時,檔案可以透過某些 include 系統參考其他檔案。為了讓 Boost.Build 追蹤 include 檔案之間的相依性,您需要提供一個掃描器。主要的限制是只能將一個掃描器分配給一個目標類型。
首先,我們需要為掃描器宣告一個新的類別
class verbatim-scanner : common-scanner { rule pattern ( ) { return "//###include[ ]*\"([^\"]*)\"" ; } }
所有複雜的邏輯都在 common-scanner
類別中,您只需要覆寫返回用於掃描的正規表示式的方法。正規表示式中的括號表示字串的哪一部分是 include 檔案的名稱。只有正規表示式中的第一個括號群組會被識別;如果您無法以這種方式表達所有您想要的東西,您可以返回多個正規表示式,每個正規表示式都包含一個要匹配的括號群組。
之後,我們需要註冊我們的掃描器類別
scanner.register verbatim-scanner : include ;
第二個參數的值(在這種情況下為 include
)指定包含應搜尋 include 檔案的路徑列表的屬性。
最後,我們將新的掃描器分配給 VERBATIM
目標類型
type.set-scanner VERBATIM : verbatim-scanner ;
這樣就足以掃描 include 相依性了。