code style

2016年10月21日 星期五

CMake筆記(3) - 流程控制

條件敘述:
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) 

else中的expr可不填,這樣比較不會有語意上的誤會,例如:
if(WIN32)
    command1(arg)
else(WIN32)
    command2(arg)
endif(expr) 
以為WIN32為真時執行command2...

在條件式當中變數即使不加 ${},if 也會先嘗試解釋成變數。
# 下面兩行意義相同
if (foo)
if (${foo})
實務上個人覺得還是加比較好,可從語法上就得知這個是變數,不會誤以為是個字串。

 迴圈:
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"

沒有留言:

張貼留言