cmake 变量和全局变量缓存

示例

通常,您将使用“普通变量”:

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" 缓存字符串 "A test")
message("VAR = ${VAR}")

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

set(VAR "CACHED" 缓存字符串 "A test" FORCE)
message("VAR = ${VAR}")

首次运行的输出

VAR = CACHED-init
VAR = NORMAL
VAR = CACHED

第二次运行的输出

VAR = CACHED
VAR = NORMAL
VAR = CACHED

注意:该FORCE选项还会从当前作用域中取消设置/删除普通变量。

缓存变量的用例

通常有两个用例(请不要将它们误用于全局变量):

  1. 您代码中的值应该可以通过您的项目用户进行修改,例如cmakegui,使用ccmake或cmake -D ...选项:

    CMakeLists.txt / MyToolchain.cmake

    set(LIB_A_PATH "/some/default/path" 缓存路径 "Path to lib A")

    命令行

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

    这确实在缓存中预设了该值,并且上面的行不会修改它。

    CMake GUI

    在GUI中,用户首先启动配置过程,然后可以修改任何缓存的值,并以开始生成构建环境结束。

  1. 另外,CMake确实会缓存搜索/测试/编译器标识结果(因此,只要重新运行配置/生成步骤,就无需再次执行此操作)

    find_path(LIB_A_PATHlibA.aPATHS "/some/default/path")

    在此处LIB_A_PATH创建为缓存变量。