CMake中的set用於給一般變量,緩存變量,環境變量賦值。
set(<variable> <value> [[CACHE <type> <docstring> [FORCE]] | PARENT_SCOPE])
-
Set賦值給一般變量(normal variables)
什么是一般變量,一般變量和代碼中變量相似,僅在自身所在作用域起作用,除非后面使用PARENT_SCOPE。
每一個新的目錄或者函數都會創建新的作用域,當在新的作用域創建一般變量且后面加上PARENT_SCOPE,該變量可以在父目錄或者調用新函數的函數上起作用。
有些亂,舉個栗子:
set(FOO “x”)。 //FOO作用域為當前作用域。 set(FOO "x" PARENT_SCOPE) //FOO作用域跳上一級(懂點編程的都懂哈)。
-
Set賦值給緩存變量(cache variables)
什么是緩存變量,緩存變量可以理解為當第一次運行cmake時,這些變量緩存到一份文件中(即編譯目錄下的CMakeCache.txt)。當再次運行cmake時,這些變量會直接使用緩存值,可以利用ccmake或者cmake-gui等工具來重新賦值。緩存變量在整個cmake運行過程中都可以起作用。
當使用CACHE時,且緩存(cache)中沒有該變量時,變量被創建並存入緩存(cache)中,如果原緩存(cache)中有該變量,也不會改變原緩存中該變量的值,除非后面使用FORCE。
有點亂,舉個栗子:
set(FOO, "x" CACHE <type>)
//原緩存中沒有FOO則將FOO賦值為x且存入cache中。 //原緩存中有FOO則不做任何改變,即便原cache中FOO存的不是x。
set(FOO, "x" CACHE <type><docstring> FORCE) //即便原cache中存在FOO也會創建另一個FOO,官方文檔原話(If FORCE is specified, the value of the cache variable
//is set, even if the variable is already in the cache.This should normally be avoided, as it will
//remove any changes to the cache variable’s value by the user.),小弟笨拙沒有搞懂。
使用CACHE的同時,要設定<type>和<docstring>,<type>可以理解為所存入變量類型,<docstring>為變量的描述。
<type>分為以下幾種類型:
FILEPATH = File chooser dialog. PATH = Directory chooser dialog. STRING = Arbitrary string. BOOL = Boolean ON/OFF checkbox. INTERNAL = No GUI entry (used for persistent variables).
其中INTERNAL將變量為內部變量,即cmake-gui不會向用戶顯示這類變量,而其它類型的緩存變量用戶都可以通cmake-gui按照特定的類型改變。
-
注意:
1.CACHE與PARENT_SCOPE不能一起使用。
2.同一名稱(例FOO)的一般變量和緩存變量可以同時存在,但在調用該變量時(${FOO})會在先取一般變量的值,一般變量中沒有再取緩存變量的值。
一些栗子:
set(FOO “x”) //設置一般變量FOO,不會觸及cache,但是會隱藏cache中的FOO。 set(FOO “x” CACHE ...) //忽視相同名稱的一般變量,在cache中檢查FOO是否存在,
//如果不存在則存入cache中,存在也不會對cache中FOO重新賦值。
3.當改變cache中的變量時,同名的一般變量會被刪除。一般不建議使用相同名稱的一般變量和緩存變量。
然而在有些工程中可以很好的借助這一交互例如:
一個工程利用ADD_SUBDIRECTOTY()添加子工程,子工程有它自己的CMakeList.txt。如果在父工程和子工程中都對同一緩存變量賦值,cmake時父工程率先將變量存入cache中,子工程直接在cache中調用該值,保證了父子工程的一致性。當父工程需要改變該變量,而子程序需要利用原值時,可以直接在父工程中設置同名稱的一般變量即可。
