在CMake中if語法比較簡單,if後面括號中的參數隨着CMake版本的推動,在else和endif中也能夠不用寫了。spa
if(address) else() endif()
對於if語法,比較經常使用的就是字符串比較了,這裏我的簡單用到過兩種,一種是這個變量有沒有定義過。有兩種寫法能夠驗證命令行
if(DEFINED address) else() endif()
if(address) else() endif()
兩種均可以驗證這個變量有沒有定義過,注意:是定義過,好比你在CMake命令行中隨便寫了-Daddress=xxx,就表示定義過了,對裏面的值沒有任何要求。code
第二中經常使用的用法就是字符串比較,好比blog
if(${address} STREQUAL "ON") else() endif()
固然去掉大括號也是能夠比較的字符串
if(address STREQUAL "ON") else() endif()
這種就是比較字符串的值了,注意:在這個時候,你的腳本已經假設你對於address已經有了已被定義的默認要求,也就是說此時若是你沒有定義過address變量,在正常處理cmake ..的時候會報錯,會提示沒法識別的參數「STREQUAL」和"ON",這個須要特別注意。還有就是若是真的要加上大括號來取值,適當加上雙引號能夠防止出現一些沒必要要的麻煩。it
有的同窗會問了,若是我就想有個默認值呢?若是我就想,當我本身不去設這個,我但願它存在,被定義過,而且有個本身的默認值,有沒有辦法?io
答案固然是有的,強大的CMake爲咱們準備了--option這個命令,給咱們做爲默認初始值而且做爲定義值的候選。編譯
option(address "This is a option for address" ON)
此時表示,若是用戶沒有定義過address,那我address的默認值就是ON,若是用戶在命令行顯示改變過address的值好比爲OFF,那麼在腳本中address的值就是OFF。class
有一個須要注意,就是對於那些依賴於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一塊兒使用,能夠靈活多變的針對編譯環境作各類定製化處理,包括項目中宏的各類替換和使用等等。這裏我給你們開了個簡單的頭,但願這篇文章可以給你帶來哪怕只有一點點的幫助就夠了 : )