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


    在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一起使用,可以靈活多變的針對編譯環境做各種定制化處理,包括項目中宏的各種替換和使用等等。這里我給大家開了個簡單的頭,希望這篇文章能夠給你帶來哪怕只有一點點的幫助就夠了  : )


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM