CMake入门教程【核心篇】属性管理set_property和get_property

发布时间:2024年01月04日

在这里插入图片描述

😈「CSDN主页」传送门
😈「Bilibil首页」传送门
😈「本文的内容」:CMake入门教程
😈「动动你的小手」点赞👍收藏??评论📝


1.概述

在CMake中,属性管理是构建系统的核心部分。通过使用set_propertyget_property命令,开发者可以为目标、测试、源文件、目录及全局设置和获取属性。这些属性控制着构建过程和逻辑。

set_property
get_property
Apply
Retrieve
CMakeLists.txt
Set Property
Get Property
Build Target
Build Information

2.设置属性 - set_property

set_property命令用于设置指定范围内的属性值。

2.1基本语法

set_property(<SCOPE> <NAME> <PROPERTY> <VALUE1> [VALUE2 ...])
  • <SCOPE>:定义属性的作用域。这可以是 GLOBAL(全局范围)、DIRECTORY(目录范围)、TARGET(目标范围)、SOURCE(源文件范围)、TEST(测试范围)或 CACHE(缓存条目范围)。
  • <NAME>:指定属性所属的实体名称。例如,目标的名称或源文件的路径。
  • <PROPERTY>:要设置的属性名称。
  • <VALUE1> [VALUE2 ...]:要设置的属性值。

2.2示例

  • 设置全局属性
set_property(GLOBAL PROPERTY GLOBAL_PROP "Some Value")
  • 设置目标属性
add_executable(my_target main.cpp)
set_property(TARGET my_target PROPERTY CXX_STANDARD 17)
  • 设置目录属性
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY MY_DIR_PROP "Directory Value")
  • 设置源文件属性
set_property(SOURCE src/main.cpp PROPERTY HEADER_FILE_ONLY TRUE)
  • 设置测试属性
add_test(NAME my_test COMMAND my_executable)
set_property(TEST my_test PROPERTY LABELS "MyTestLabel")
  • 设置缓存属性
set_property(CACHE MY_CACHE_VAR PROPERTY TYPE STRING)

3.获取属性 - get_property

get_property 命令在 CMake 中用于获取已定义属性的值。这个命令可以用来查询各种类型的属性,包括目标属性、测试属性、源文件属性等

3.1基本语法

get_property(<variable> <SCOPE> <ITEM_NAME> PROPERTY <PROPERTY_NAME>)
  • <variable>:一个变量,用于存储获取到的属性值。
  • <SCOPE>:定义属性的作用域。这可以是 GLOBAL(全局范围)、DIRECTORY(目录范围)、TARGET(目标范围)、SOURCE(源文件范围)、TEST(测试范围)或 CACHE(缓存条目范围)。
  • <NAME>:指定属性所属的实体名称。例如,目标的名称或源文件的路径。
  • PROPERTY <PROPERTY_NAME>:要获取的属性名称。
  • [SET]:可选参数,如果指定,只有当属性被显式设置时,命令才会成功。

3.2示例

  • 获取全局属性
get_property(my_global_value GLOBAL PROPERTY GLOBAL_PROP)
  • 获取目标属性
get_property(my_target_std TARGET my_target PROPERTY CXX_STANDARD)
  • 获取目录属性
get_property(my_dir_prop DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY MY_DIR_PROP)
  • 获取源文件属性
get_property(header_only SOURCE src/main.cpp PROPERTY HEADER_FILE_ONLY)
  • 获取测试属性
get_property(test_labels TEST my_test PROPERTY LABELS)
  • 获取缓存属性
get_property(cache_type CACHE MY_CACHE_VAR PROPERTY TYPE)

4.实例

4.1 demo1设定编译参数

为一个可执行文件目标设置自定义的编译选项,并获取这些选项

  • CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyExecutableProject)

# 添加一个可执行文件
add_executable(MyExecutable main.cpp)

# 为目标设置编译选项
set_property(TARGET MyExecutable PROPERTY COMPILE_OPTIONS "-Wall" "-O3")

# 获取刚刚设置的属性
get_property(compiler_options TARGET MyExecutable PROPERTY COMPILE_OPTIONS)
message(STATUS "Compiler options for MyExecutable: ${compiler_options}")

4.2 demo2定义C++标准

设置全局属性以定义整个项目的C++标准,并获取该属性。

  • CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(GlobalPropertyProject)

# 设置全局属性
set_property(GLOBAL PROPERTY CMAKE_CXX_STANDARD 17)

# 添加一个可执行文件
add_executable(MyExecutable main.cpp)

# 获取全局属性
get_property(cxx_standard GLOBAL PROPERTY CMAKE_CXX_STANDARD)
message(STATUS "Global C++ standard: ${cxx_standard}")

4.3 demo3-设置编译器定义

为当前目录设置编译器定义,并获取这些定义

  • CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(DirectoryPropertyProject)

# 添加一个可执行文件
add_executable(MyExecutable main.cpp)

# 为当前目录设置编译器定义
set_property(DIRECTORY PROPERTY COMPILE_DEFINITIONS "MY_CUSTOM_DEFINITION")

# 获取目录属性
get_property(dir_compile_defs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY COMPILE_DEFINITIONS)
message(STATUS "Compile definitions for current directory: ${dir_compile_defs}")

5.实战使用技巧与注意事项

  1. 合理组织属性:为不同的构建目标和文件设置合适的属性,以便更好地管理和维护项目。
  2. 全局属性管理:利用全局属性进行跨项目的配置共享。
  3. 缓存属性:使用CACHE选项来持久化跨多次构建的配置。
  4. 属性检查:在获取属性前,先检查属性是否已被定义。
  5. 属性名称大小写敏感:确保在设置和获取属性时使用正确的大小写。
  6. 避免名称冲突:选择独特的属性名称,以免与CMake内置属性或其他项目属性冲突。
  7. 了解属性继承机制:目录属性可以被其子目录继承。
文章来源:https://blog.csdn.net/hiwoshixiaoyu/article/details/135397195
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。