在多级cmake目录里,父级的set变量是可以在子cmake里获取的,但是如果是同级的就无法获取。最近在写cmake时,子目录生成链接库后,同级的目录添加连接库后,还要添加链接库头文件位置,虽然可以直接给路径,但是当时在想链接库的cmake能不能设置自己的库路径,然后供其他cmake使用,所以就查找到了cmake变量共享。
cmake变量共享有三种方式。
set缓存变量
set可以设置缓存变量,存在在cmakecache里的变量就可以被其他的cmake访问。
语法格式:
set(<variable> <value>... CACHE <type> <docstring> [FORCE])
- variable:变量名称
- value:变量值列表
- CACHE:cache变量的标志
- type:变量类型,取决于变量的值。类型分为:BOOL、FILEPATH、PATH、STRING、INTERNAL
- docstring:必须是字符串,作为变量概要说明
- FORCE:强制选项,强制修改变量值
缓存变量相当于全局变量,
示例
set(LIB_INCLUDE ${PROJECT_SOURCE_DIR} CACHE PATH "lib include path" FORCE)
set向上传递变量
set在设置变量的时候最后带上PARENT_SCOPE可以向上传递变量,传递到父作用域,那在父作用域下的字cmake就可以获取到。
示例
set(LIB_INCLUDE ${PROJECT_SOURCE_DIR} PARENT_SCOPE)
set_property/get_property
用set_property来设置变量,设置后的变量可以用get_property来获取并且存到一个新的变量中。
设置变量
set_property(GLOBAL PROPERTY LIB_INCLUDE_DIR ${PROJECT_SOURCE_DIR})
获取变量
get_property(MYLIB_INCLUDE_DIR GLOBAL PROPERTY "LIB_INCLUDE_DIR")
message(${MYLIB_INCLUDE_DIR})
上面获取变量LIB_INCLUDE_DIR并且存到MYLIB_INCLUDE_DIR中。
|