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"