CMake 入門/流程控制
< CMake 入門
流程控制指令 CMake 也支援一般程式語言常用的流程控制和副程式,因此撰寫彈性很大。
條件敘述
编辑CMake的條件敘述為 if、elseif、else、endif。
# 當 expr 值為下列其中之一時,執行 command1: # ON, 1, YES, TRUE, Y # 當 expr 值為下列其中之一時,執行 command2: # OFF, 0, NO, FALSE, N, NOTFOUND, *-NOTFOUND, IGNORE if(expr) command1(arg) else(expr) command2(arg) endif(expr)
版本較早的 CMake 要求在 else(...) 括號內必須填上對應的條件項目,然而很容易造成誤導,例如
if(WIN32) ... else(WIN32) command2(arg) endif(WIN32)
乍看之下會以為 WIN32 為 TRUE 時執行 command2,但原意其實是 WIN32 為 FALSE 才執行 command2 ,因此在較新的版本中已經不強迫了。
# 以下也合法 if(WIN32) ... else() command2(arg) endif()
條件式計算規則
编辑條件式的可以透過運算子組合,請參考運算子一章
if((expr) AND (expr OR (expr)))
在條件式當中即使不加 ${},if 也會先嘗試解釋成變數。
# 下面兩行意義相同 if (foo) if (${foo}) # 下面兩行意義相同 if (foo AND bar) if (${foo} AND ${bar})
這裡用 if 為例,while 亦為同理。
迴圈敘述
编辑CMake 的迴圈有兩種:
- foreach ... endforeach
- while ... endwhile
set(V alpha beta gamma) message(${V}) foreach(i ${V}) message(${i}) endforeach()
Output:
alphabetagamma alpha beta gamma
函數與巨集
编辑CMake 有兩種設計子程序的方式:
- function ... endfunction
- macro ... endmacro
主要的差別在於 function 會建立 local的變數,而 macro 則會影響 global 變數。
# 定義名為 print1 的 macro macro(print1 MESSAGE) set(k ${MESSAGE}) message(${MESSAGE}) endmacro(print1) # 定義名為 print2 的 function function(print2 MESSAGE) set(k ${MESSAGE}) message(${MESSAGE}) endfunction(print2) print1("from print1") print2("from print2") message("k=${k}") 輸出結果為 from print1 from print2 k="from print1"