语法
设置属性
SET_TARGET_PROPERTIES(目标名 PROPERTIES 属性名 属性值)set_property(TARGET 目标名 PROPERTY 属性名 属性值)
在某个域中对零个或多个对象设置一个属性
set_property(<GLOBAL | #该属性设置所在的域DIRECTORY [dir] | #默认为当前目录,但也可以用全路径或相对路径指定其他的目录(前提是该目录已经被CMake处理)TARGET [target1 [target2 ...]] | #零或多个已经存在的目标SOURCE [src1 [src2 ...]] | #零或多个源文件。注意:源文件属性只对在相同目录下的目标是可见的(CMakeLists.txt)TEST [test1 [test2 ...]] | #零或多个已存在的测试CACHE [entry1 [entry2 ...]]> #零或多个已存在条目的cache[APPEND] #如果指定了APPEND选项,则指定的列表将会追加到任何已存在的属性值当中[APPEND_STRING] #将值作为字符串追加到任何已存在的属性值PROPERTY <name>[value1 [value2 ...]]) #要设置的属性的名字
得到属性
get_property(<variable><GLOBAL |DIRECTORY [dir] |TARGET <target> |SOURCE <source> |TEST <test> |CACHE <entry> |VARIABLE>PROPERTY <name> #必选项PROPERTY后面紧跟着要获取的属性的名字[SET | DEFINED |BRIEF_DOCS | FULL_DOCS])#如果指定了SET选项,则变量会被设置为一个布尔值,表明该属性是否已设置#如果指定了DEFINED选项,则变量也会被设置为一个布尔值,表明该属性是否已定义(如通过define_property)#如果定义了BRIEF_DOCS或FULL_DOCS选项,则该变量被设置为一个字符串,包含了对请求的属性的文档
如果该属性没有相关文件,则会返回NOTFOUND
# 获得指定target的include目录 属性get_property(include_dirs TARGET ${TARGET_NAME} PROPERTY INCLUDE_DIRECTORIES)
目标的属性
include目录
#CMake version 2.8.12target_include_directories(LibA PRIVATE DirectoryA)target_include_directories(LibB PRIVATE DirectoryB)#older versions of CMakeset_property(TARGET LibA APPEND PROPERTY INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/DirectoryA)set_property(TARGET LibB APPEND PROPERTY INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/DirectoryB)
高级的include写法:不同阶段,不同的include目录
# 添加include目录target_include_directories(FooPUBLIC#$<>称为生成器表达式$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> #如果当前是build阶段,则加入${CMAKE_CURRENT_SOURCE_DIR}/include目录$<INSTALL_INTERFACE:include> #如果当前是install阶段,则包含<install目录>/include)
link目录
相关文档:
- target_link_directories
```
CMake version 3.13
target_link_directories(LibA PRIVATE DirectoryA)
older versions of CMake
set_property(TARGET LibA APPEND PROPERTY LINK_DIRECTORIES ${CMAKE_SOURCE_DIR}/DirectoryA)
<a name="v1hZL"></a>### 项目分组
set_property(GLOBAL PROPERTY USE_FOLDERS ON) set_property(TARGET project1 APPEND PROPERTY FOLDER “foldername”) #目标project1为foldername组 set_property(TARGET project2 APPEND PROPERTY FOLDER “foldername”) #目标project2为foldername组 ```
附
目标include、lib、compile的可见性
参考文章:cmake:target_** 中的 PUBLIC,PRIVATE,INTERFACE
有三种可见级别PUBLIC,PRIVATE,INTERFACE
- PUBLIC:公开的
- PRIVATE:私有的
- INTERFACE:接口
