语法

设置属性

  1. SET_TARGET_PROPERTIES(目标名 PROPERTIES 属性名 属性值)
  2. set_property(TARGET 目标名 PROPERTY 属性名 属性值)

在某个域中对零个或多个对象设置一个属性

  1. set_property(<GLOBAL | #该属性设置所在的域
  2. DIRECTORY [dir] | #默认为当前目录,但也可以用全路径或相对路径指定其他的目录(前提是该目录已经被CMake处理)
  3. TARGET [target1 [target2 ...]] | #零或多个已经存在的目标
  4. SOURCE [src1 [src2 ...]] | #零或多个源文件。注意:源文件属性只对在相同目录下的目标是可见的(CMakeLists.txt)
  5. TEST [test1 [test2 ...]] | #零或多个已存在的测试
  6. CACHE [entry1 [entry2 ...]]> #零或多个已存在条目的cache
  7. [APPEND] #如果指定了APPEND选项,则指定的列表将会追加到任何已存在的属性值当中
  8. [APPEND_STRING] #将值作为字符串追加到任何已存在的属性值
  9. PROPERTY <name>[value1 [value2 ...]]) #要设置的属性的名字

得到属性

  1. get_property(<variable>
  2. <GLOBAL |
  3. DIRECTORY [dir] |
  4. TARGET <target> |
  5. SOURCE <source> |
  6. TEST <test> |
  7. CACHE <entry> |
  8. VARIABLE>
  9. PROPERTY <name> #必选项PROPERTY后面紧跟着要获取的属性的名字
  10. [SET | DEFINED |BRIEF_DOCS | FULL_DOCS])
  11. #如果指定了SET选项,则变量会被设置为一个布尔值,表明该属性是否已设置
  12. #如果指定了DEFINED选项,则变量也会被设置为一个布尔值,表明该属性是否已定义(如通过define_property)
  13. #如果定义了BRIEF_DOCS或FULL_DOCS选项,则该变量被设置为一个字符串,包含了对请求的属性的文档

如果该属性没有相关文件,则会返回NOTFOUND

  1. # 获得指定target的include目录 属性
  2. get_property(include_dirs TARGET ${TARGET_NAME} PROPERTY INCLUDE_DIRECTORIES)

目标的属性

include目录

  1. #CMake version 2.8.12
  2. target_include_directories(LibA PRIVATE DirectoryA)
  3. target_include_directories(LibB PRIVATE DirectoryB)
  4. #older versions of CMake
  5. set_property(TARGET LibA APPEND PROPERTY INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/DirectoryA)
  6. set_property(TARGET LibB APPEND PROPERTY INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/DirectoryB)

高级的include写法:不同阶段,不同的include目录

  1. # 添加include目录
  2. target_include_directories(Foo
  3. PUBLIC
  4. #$<>称为生成器表达式
  5. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> #如果当前是build阶段,则加入${CMAKE_CURRENT_SOURCE_DIR}/include目录
  6. $<INSTALL_INTERFACE:include> #如果当前是install阶段,则包含<install目录>/include
  7. )

link目录

相关文档:

  1. 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)

  1. <a name="v1hZL"></a>
  2. ### 项目分组

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

  1. PUBLIC:公开的
  2. PRIVATE:私有的
  3. INTERFACE:接口