变量和全局变量缓存

大多数情况下,你将使用 正常变量

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 被创建为缓存变量。