1.include(FeatureSummary)-特性概述

include(FeatureSummary) 是引入CMake的一个模块,该模块允许开发者追踪项目的可选特性和组件,并在配置时输出一个简洁的特性概览。

2.add_feature_info-特性和组件

add_feature_info是CMake中的一个函数,主要用在需要展示项目特性(features)或组件(components)的概要信息时。在现代CMake中,尤其是大型项目中,经常会有多种可选特性或者组件供用户选择编译,add_feature_info可以帮助清晰地列出这些特性以及它们的作用。

其基本语法结构如下:

add_feature_info(NAME FEATURE_NAME DESCRIPTION)
  • NAME: 为这个特性指定一个内部标识名,方便后续引用。
  • FEATURE_NAME: 这是将在特性概览中显示的实际特性名称,用于告知用户这是什么特性。
  • DESCRIPTION: 对这个特性的简短描述,解释启用或禁用此特性会对项目产生何种影响。

例如:

include(FeatureSummary)
option(ENABLE_FOO "Enable FOO feature" ON)
add_feature_info("Foo Feature" ENABLE_FOO "This enables the FOO functionality.")

上述代码首先引入了FeatureSummary模块,然后定义了一个名为ENABLE_FOO的选项,并给出了描述。接着使用add_feature_info将这个选项作为一项特性列出来,当用户查看构建配置时,可以看到“Foo Feature”的启用状态及其详细描述。

3.configure_file-生成配置文件

configure_file(config-safe-asserts.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-safe-asserts.h)

option(USE_LOCK_FREE_HASH_TABLE "Use lock free hash table instead of blocking." ON)
configure_file(config-hash-table-implementation.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-hash-table-implementation.h)
add_feature_info("Lock free hash table" USE_LOCK_FREE_HASH_TABLE "Use lock free hash table instead of blocking.")

这段CMake脚本展示了如何使用configure_file命令来处理和生成配置头文件:

  1. 第一行:

    configure_file(config-safe-asserts.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-safe-asserts.h)
    

    这里,CMake会读取名为config-safe-asserts.h.cmake的模板文件,并将其内容根据CMake当前的状态(包括所有定义的变量和选项)进行配置。然后,它会把配置后的内容写入到当前构建目录(CMAKE_CURRENT_BINARY_DIR)下的config-safe-asserts.h文件中。这个过程可能涉及到对CMake变量的替换,使得生成的头文件包含适合当前构建配置的宏或者预处理器指令。

  2. 第二部分:

    option(USE_LOCK_FREE_HASH_TABLE "Use lock free hash table instead of blocking." ON)
    

    定义了一个CMake选项USE_LOCK_FREE_HASH_TABLE,并将其默认值设为ON。这个选项可以被用户通过命令行或者CMake GUI界面来开启或关闭,其描述文字为"Use lock free hash table instead of blocking.",说明这个选项影响了程序是否采用无锁哈希表实现。

  3. 第三行:

    configure_file(config-hash-table-implementation.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-hash-table-implementation.h)
    

    类似于第一行,这里同样使用configure_file命令处理另一个模板文件config-hash-table-implementation.h.cmake,生成的输出文件为config-hash-table-implementation.h。在这个过程中,CMake可能会基于之前定义的USE_LOCK_FREE_HASH_TABLE选项状态,决定最终生成的头文件中关于哈希表实现的选择。

  4. 最后一行:

    add_feature_info("Lock free hash table" USE_LOCK_FREE_HASH_TABLE "Use lock free hash table instead of blocking.")
    

    添加了一个特性信息条目,这个命令用来记录项目的某个功能或特性,并在生成的配置报告或其他文档中展示。在这里,添加的是关于无锁哈希表特性的信息,标题为"Lock free hash table",关联的选项是前面定义的USE_LOCK_FREE_HASH_TABLE,描述为"Use lock free hash table instead of blocking."。这意味着当用户查看项目配置时,可以看到关于无锁哈希表是否启用的详细信息。

4.cmakedefine-控制C++/C条件编译指令

#cmakedefine 是在CMake的configure_file命令处理模板文件时使用的预处理器指令。这个指令是用来根据CMake中的变量状态生成对应的C或C++代码的条件编译指令。

例如,在一个配置文件模板中,你可以这样使用#cmakedefine:

// config.h.in (模板文件)
#cmakedefine ENABLE_FEATURE_A "@ENABLE_FEATURE_A@"

#if defined(ENABLE_FEATURE_A)
// 如果ENABLE_FEATURE_A在CMake中被设置为ON,则这里的代码会被包含
void useFeatureA() {
    // ...
}
#endif

在CMakeLists.txt中,你可能会有如下的设置:

set(ENABLE_FEATURE_A ON)
configure_file(config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)

当CMake执行configure_file命令时,如果ENABLE_FEATURE_A变量被设置为ON,则生成的config.h文件将会是这样的:

#define ENABLE_FEATURE_A

void useFeatureA() {
    // ...
}

反之,如果ENABLE_FEATURE_A被设置为OFF或未定义,生成的config.h文件将不会有相应的宏定义,且相关代码块将不会被包含在最终编译的目标中。这种方式允许CMake灵活地控制源代码中特定功能的启用与禁用。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐