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"