语法
设置属性
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.12
target_include_directories(LibA PRIVATE DirectoryA)
target_include_directories(LibB PRIVATE DirectoryB)
#older versions of CMake
set_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(Foo
PUBLIC
#$<>称为生成器表达式
$<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:接口