1. 程式人生 > >cmake 學習筆記(四)

cmake 學習筆記(四)

接前面的一二三,學習一下 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

參考