Boost C++ Libraries

PrevUpHomeNext

Boost.Jam 語言

本節將描述 Boost.Jam 語言的基礎知識 — 딱 Jamfile 撰寫所需的程度。如需更多資訊,請參閱 Boost.Jam 文件。

Boost.Jam 是一種直譯式程序語言。在最低層級,Boost.Jam 程式由變數和 規則(Jam 中函式的術語)組成。它們被分組成模組 — 有一個全域模組和許多具名模組。除此之外,Boost.Jam 程式包含類別和類別實例。

從語法上講,Boost.Jam 程式由兩種元素組成 — 關鍵字(對 Boost.Jam 具有特殊含義)和字面值。請參考以下程式碼

a = b ;

它將值 b 指派給變數 a。這裡,=; 是關鍵字,而 ab 是字面值。

警告

所有語法元素,即使是關鍵字,都必須以空格分隔。例如,省略 ; 前的空格字元將導致語法錯誤。

如果要使用與某些關鍵字相同的值,則可以將該值用引號括起來

a = "=" ;

Boost.Jam 中的所有變數都具有相同的類型 — 字串列表。要定義變數,請像上一個範例一樣為其賦值。未定義的變數與值為空的變數相同。可以使用 $(variable) 語法存取變數。例如

a = $(b) $(c) ;

規則的定義方式是指定規則名稱、參數名稱以及每個參數允許的值列表大小。

rule example
 (
     parameter1 :
     parameter2 ? :
     parameter3 + :
     parameter4 *
 )
 {
    # rule body
 }
 

呼叫此規則時,作為第一個參數傳遞的列表必須只有一個值。作為第二個參數傳遞的列表可以有一個值或為空。其餘兩個參數可以任意長,但第三個參數不能為空。

Boost.Jam 語言語句的概覽如下

helper 1 : 2 : 3 ;
x = [ helper 1 : 2 : 3 ] ;

此程式碼使用指定的參數呼叫具名規則。當呼叫的結果必須在某些表達式中使用時,需要在呼叫周圍加上括號,如第二行所示。

if cond { statements } [ else { statements } ]

這是一個常規的 if 語句。條件由以下組成

for var in list { statements }

針對列表中的每個元素執行語句,將變數 var 設定為元素值。

while cond { statements }

重複執行語句,直到 cond 在進入時保持為 true。

return values ;

此語句應該只在規則內使用,並將 values 指派給規則的傳回值。

警告

return 陳述式並不會離開規則。例如:

rule test ( )
{
   if 1 = 1
   {
      return "reasonable" ;
   }
   return "strange" ;
}

會回傳 strange,而不是 reasonable

import module ;
import module : rule ;

第一種形式會匯入指定的模組。該模組中的所有規則都可以使用限定名稱來使用:模組.規則。第二種形式只匯入指定的規則,並且可以使用非限定名稱來呼叫它們。

有時,您需要指定建立目標時要使用的實際命令列。在 Jam 語言中,您可以使用具名動作來執行此操作。例如:

actions create-file-from-another
{
    create-file-from-another $(<) $(>)
}

這指定了一個名為 create-file-from-another 的具名動作。大括號內的文字是要呼叫的命令。變數 $(<) 會展開為產生的檔案列表,而變數 $(>) 會展開為來源檔案列表。

要彈性地調整命令列,您可以定義一個與動作同名的規則,並接受三個參數:目標、來源和屬性。例如:

rule create-file-from-another ( targets * : sources * : properties * )
{
   if <variant>debug in $(properties)
   {
       OPTIONS on $(targets) = --debug ;
   }
}
actions create-file-from-another
{
    create-file-from-another $(OPTIONS) $(<) $(>)
}

在此範例中,規則會檢查是否指定了特定的建置屬性。如果是,它會設定變數 OPTIONS,然後在動作內使用該變數。請注意,在目標上設定的變數只會在建置該目標的動作內可見,而不是全域可見。如果它們是全域設定的,則在兩個不相關的動作中使用名為 OPTIONS 的變數將是不可能的。

更多詳細資訊,請參閱 Jam 參考文件,「規則」一節


PrevUpHomeNext