Bootstrap

5. cmake(cache)

目录

1. 目录结构

 2. 相关语法

2.1 通过FORCE修改缓存变量

2.2  父目录与子目录之间变量的关系

2.3 使用optional替代BOOL类型的cache变量

2.4 覆盖策略

2.5  通过命令行-D传递缓存变量

3. 代码段


1. 目录结构

sub1中CMakeLists.txt的内容如下:

cmake_minimum_required(VERSION 3.21)
project(sub1)

#测试:子目录可以获取父目录中定义的普通变量
message("var_main in sub1 = ${var_main}")

#测试:父目录不能获取子目录中定义的普通变量
set(var_sub1 "var_sub1")

#测试:父级目录可以获取子目录中的cache变量
set(var_cache_sub1 "var cache sub1" CACHE STRING "cache sub1 docstring")

sub2中CMakeLists.txt的内容如下: 

cmake_minimum_required(VERSION 3.21)
project(sub2)

#测试:子目录可以获取父目录中定义的普通变量
message("var_main in sub2 = ${var_main}")

#测试:父目录不能获取子目录中定义的普通变量
set(var_sub2 "var_sub2")

#测试:父级目录可以获取子目录中的cache变量
set(var_cache_sub2 "var cache sub2" CACHE STRING "cache sub2 docstring")

 2. 相关语法

2.1 通过FORCE修改缓存变量

#cache: 缓存变量,会缓存起来,全局性质
#普通变量的作用域在于自身和子模块
#BOOL FILEPATH PATH STRING INTERNAL(不会开放给用户) docstring(鼠标提示说明) FORCE

set(cache_var1 "cache_var1" CACHE STRING "cache docstring")
message("cache_var1 = ${cache_var1}")
#一般修改无法修改cache变量
set(cache_var1 "cache_var2" CACHE STRING "cache docstring")
message("cache_var1 = ${cache_var1}")
#强制修改缓存变量FORCE
set(cache_var1 "cache_force" CACHE STRING "cache docstring" FORCE)
message("cache_var1 = ${cache_var1}")

 

2.2  父目录与子目录之间变量的关系

#子目录可以获取父目录中定义的普通变量
set(var_main "var main")
add_subdirectory(sub1)
add_subdirectory(sub2)

#父目录不能获取子目录中定义的普通变量
message("var_sub1 in main = ${var_sub1}")
message("var_sub2 in main = ${var_sub2}")

#父级目录可以获取子目录中的cache变量
message("var_cache_sub1 in main = ${var_cache_sub1}")
message("var_cache_sub2 in main = ${var_cache_sub2}")

 

2.3 使用optional替代BOOL类型的cache变量

#set(var_cache_bool TRUE CACHE BOOL "var cache bool") 等同于下面的语句
option(var_cache_bool "var cache bool" ON)
message("var_cache_bool = ${var_cache_bool}")

 

2.4 覆盖策略

#CMP0126(3.21版本才支持)
#cmake_policy(SET CMP0126 NEW) NEW不会删除同名普通变量,OLD会删除普通变量
#$CACHE(var_)直接查找缓存变量
set(var_ "var normal")
cmake_policy(SET CMP0126 OLD) #默认是new
set(var_ "var cache" CACHE STRING "var docstring")
message("var_ = ${var_}")
message("var_ = $CACHE{var_}")

 

2.5  通过命令行-D传递缓存变量

camke -S . -B out -D PARA1=para1_value

3. 代码段

CSDN/cmake/5.cache at main · kdvictor/CSDN · GitHub

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;