變數和全域性變數快取

大多數情況下,你將使用 正常變數

set(VAR TRUE)
set(VAR "main.cpp")
set(VAR1 ${VAR2})

但是 CMake 也知道全域性 快取變數 (持續存在於 CMakeCache.txt 中)。如果當前作用域中存在同名的普通和快取記憶體變數,則普通變數會隱藏快取記憶體的變數:

cmake_minimum_required(VERSION 2.4)
project(VariablesTest)

set(VAR "CACHED-init" CACHE STRING "A test")
message("VAR = ${VAR}")

set(VAR "NORMAL")
message("VAR = ${VAR}")

set(VAR "CACHED" CACHE STRING "A test" FORCE)
message("VAR = ${VAR}")

First Run 的輸出

VAR = CACHED-init
VAR = NORMAL
VAR = CACHED

第二輪的輸出

VAR = CACHED
VAR = NORMAL
VAR = CACHED

注意: FORCE 選項還會取消/從當前範圍中刪除正常變數。

快取變數的用例

通常有兩個用例(請不要將它們用於全域性變數):

  1. 程式碼中的值應該可以從專案的使用者修改,例如使用 cmakeguiccmakecmake -D ... 選項:

    CMakeLists.txt / MyToolchain.cmake

    set(LIB_A_PATH "/some/default/path" CACHE PATH "Path to lib A")
    

    命令列

    $ cmake -D LIB_A_PATH:PATH="/some/other/path" ..
    

    這會在快取中預先設定此值,上面的行不會對其進行修改。

    CMake GUI

    StackOverflow 文件

    在 GUI 中,使用者首先啟動配置過程,然後可以修改任何快取的值,並在啟動構建環境生成時完成。

  2. 此外,CMake 會快取搜尋/測試/編譯器識別結果(因此無需在重新執行配置/生成步驟時再次執行此操作)

    find_path(LIB_A_PATH libA.a PATHS "/some/default/path")
    

    這裡 LIB_A_PATH 被建立為快取變數。