在CMake中if語法比較簡單,if后面括號中的參數隨着CMake版本的推進,在else和endif中也可以不用寫了。
if(address) else() endif()
對於if語法,比較常用的就是字符串比較了,這里個人簡單用到過兩種,一種是這個變量有沒有定義過。有兩種寫法可以驗證
if(DEFINED address) else() endif()
if(address) else() endif()
兩種都可以驗證這個變量有沒有定義過,注意:是定義過,比如你在CMake命令行中隨便寫了-Daddress=xxx,就表示定義過了,對里面的值沒有任何要求。
第二中常用的用法就是字符串比較,比如
if(${address} STREQUAL "ON") else() endif()
當然去掉大括號也是可以比較的
if(address STREQUAL "ON") else() endif()
這種就是比較字符串的值了,注意:在這個時候,你的腳本已經假設你對於address已經有了已被定義的默認要求,也就是說此時如果你沒有定義過address變量,在正常處理cmake ..的時候會報錯,會提示無法識別的參數“STREQUAL”和"ON",這個需要特別注意。還有就是如果真的要加上大括號來取值,適當加上雙引號可以防止出現一些不必要的麻煩。
有的同學會問了,如果我就想有個默認值呢?如果我就想,當我自己不去設這個,我希望它存在,被定義過,並且有個自己的默認值,有沒有辦法?
答案當然是有的,強大的CMake為我們准備了--option這個命令,給我們作為默認初始值並且作為定義值的候選。
option(address "This is a option for address" ON)
此時表示,如果用戶沒有定義過address,那我address的默認值就是ON,如果用戶在命令行顯示改變過address的值比如為OFF,那么在腳本中address的值就是OFF。
有一個需要注意,就是對於那些依賴於address有沒有定義過的時候,如果你用了option你要特別注意,就是在腳本處理過程中,如果你沒有在命令行中顯示定義過address,那么在option之前的語句對於address都是沒有定義過,直到到達了option,此時才真正定義了address.說起來不好理解,給個例子
if(address) message("defined address!!!!!!!!!!") else() message("NOT defined address!!!!!!!!!") endif() option(address "hello world" ON) message("option is ${address}") if(address) message("defined address!!!!!!!!!!") else() message("NOT defined address!!!!!!!!!") endif()
輸出結果為
NOT defined address!!!!!!!!!! option is a defined address!!!!!!!!!!
這樣就比較好理解了。
配合option和if一起使用,可以靈活多變的針對編譯環境做各種定制化處理,包括項目中宏的各種替換和使用等等。這里我給大家開了個簡單的頭,希望這篇文章能夠給你帶來哪怕只有一點點的幫助就夠了 : )