Boost C++ Libraries

PrevUpHomeNext

目標類型

掃描器

我們在簡介中做的第一件事是宣告一個新的目標類型

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 相依性了。


PrevUpHomeNext