CMake----if與option使用小記

在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一塊兒使用,能夠靈活多變的針對編譯環境作各類定製化處理,包括項目中宏的各類替換和使用等等。這裏我給你們開了個簡單的頭,但願這篇文章可以給你帶來哪怕只有一點點的幫助就夠了  : )

相關文章
相關標籤/搜索