cmake 學習筆記(四)
阿新 • • 發佈:2019-01-22
接前面的一二三,學習一下 CMakeCache.txt 相關的東西。
CMakeCache.txt
可以將其想象成一個配置檔案(在Unix環境下,我們可以認為它等價於傳遞給configure的引數)。
- CMakeLists.txt 中通過 set(... CACHE ...) 設定的變數
- CMakeLists.txt 中的 option() 提供的選項
- CMakeLists.txt 中find_package() 等find命令引入變數
-
命令列cmake . -D <var>:<type>=<value>定義變數
cmake 第一次執行時將生成 CMakeCache.txt 檔案,我們可以通過ccmake或cmake-gui或make edit_cache對其進行編輯。
對應於命令列 -D 定義變數,-U 用來刪除變數(支援globbing_expr),比如cmake -U/*QT/*將刪除所有名字中帶有QT的cache項。
變數與Cache
cmake 的變數系統遠比第一眼看上去複雜:
- 有些變數被cache,有些則不被cache
- 被cache的變數
- 有的不能通過ccmake等進行編輯(internal)
- 有的(帶有描述和型別)可以被編輯(external)
- 有的只在ccmake的 advanced 模式出現
看個例子:
- SET(var1 13)
- 變數 var1 被設定成 13
- 如果 var1 在cache中已經存在,該命令不會overwrite cache中的值
- SET(var1 13 ... CACHE ...)
- 如果cache存在該變數,使用cache中變數
- 如果cache中不存在,將該值寫入cache
- SET(var1 13 ... CACHE ... FORCE)
- 不論cache中是否存在,始終使用該值
要習慣用幫助
cmake --help-command SET
find_xxx
為了避免每次執行都要進行標頭檔案和庫檔案的探測,以及考慮到允許使用者通過ccmake設定標頭檔案路徑和庫檔案的重要性,這些東西必須進行cache。
- find_path 和 find_library 會自動cache他們的變數,如果變數已經存在且是一個有效值(即不是 -NOTFOUND 或 undefined),他們將什麼都不做。
-
另一方面,模組查詢時輸出的變數(<name>_FOUND,<name>_INCLUDE_DIRS,<name>_LIBRARIES)不應該被cache