![]() |
本節將描述 Boost.Jam 語言的基礎知識 — 딱 Jamfile 撰寫所需的程度。如需更多資訊,請參閱 Boost.Jam 文件。
Boost.Jam 是一種直譯式程序語言。在最低層級,Boost.Jam 程式由變數和 規則(Jam 中函式的術語)組成。它們被分組成模組 — 有一個全域模組和許多具名模組。除此之外,Boost.Jam 程式包含類別和類別實例。
從語法上講,Boost.Jam 程式由兩種元素組成 — 關鍵字(對 Boost.Jam 具有特殊含義)和字面值。請參考以下程式碼
a = b ;
它將值 b
指派給變數 a
。這裡,=
和 ;
是關鍵字,而 a
和 b
是字面值。
所有語法元素,即使是關鍵字,都必須以空格分隔。例如,省略 ;
前的空格字元將導致語法錯誤。
如果要使用與某些關鍵字相同的值,則可以將該值用引號括起來
a = "=" ;
Boost.Jam 中的所有變數都具有相同的類型 — 字串列表。要定義變數,請像上一個範例一樣為其賦值。未定義的變數與值為空的變數相同。可以使用 $(
語法存取變數。例如variable
)
a = $(b) $(c) ;
規則的定義方式是指定規則名稱、參數名稱以及每個參數允許的值列表大小。
ruleexample
(parameter1
:parameter2 ?
:parameter3 +
:parameter4 *
) { # rule body }
呼叫此規則時,作為第一個參數傳遞的列表必須只有一個值。作為第二個參數傳遞的列表可以有一個值或為空。其餘兩個參數可以任意長,但第三個參數不能為空。
Boost.Jam 語言語句的概覽如下
helper 1 : 2 : 3 ; x = [ helper 1 : 2 : 3 ] ;
此程式碼使用指定的參數呼叫具名規則。當呼叫的結果必須在某些表達式中使用時,需要在呼叫周圍加上括號,如第二行所示。
if cond { statements } [ else { statements } ]
這是一個常規的 if 語句。條件由以下組成
字面值(如果至少一個字串不為空,則為 true)
比較:a
,其中 operator
boperator
是 =
、!=
、<
、>
、<=
或 >=
之一。比較是在左參數和右參數中的每個字串之間成對進行的。
邏輯運算:! a
、a && b
、a || b
分組:( cond )
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
。
importmodule
; importmodule
: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 參考文件,「規則」一節。