cmake生成器表达式

时间:2024-11-18 07:51:19

CMake生成器表达式语法是为了在构建过程中灵活地指定和操作构建目标的属性和参数。生成器表达式通常在CMakeLists.txt文件中的某些指令或命令中使用,常见的场景包括target_link_librariesadd_custom_command等。以下是CMake生成器表达式语法的一些规则和常用表达式:

1. 语法规则

  • 生成器表达式$<...> 的形式出现,其中 ... 是具体的表达式内容。
  • 表达式内部可以嵌套使用,例如 $<IF:$<CONFIG:Debug>,debug,release>
  • 表达式支持逻辑运算和条件判断,可以根据不同的构建配置进行不同的处理。

2. 常用表达式

  • $<CONFIG:cfg>:如果当前构建配置是 cfg,则返回1,否则返回0。
  • $<PLATFORM_ID:platform>:如果目标平台是 platform,则返回1,否则返回0。
  • $<TARGET_FILE:tgt>:返回构建目标 tgt 的完整路径。
  • $<TARGET_FILE_DIR:tgt>:返回构建目标 tgt 所在目录的路径。
  • $<TARGET_LINKER_FILE:tgt>:返回链接目标 tgt 的路径。
  • $<BOOL:expr>:返回表达式 expr 的布尔值,0 或 1。
  • $<JOIN:list,sep>:将列表 list 中的所有元素用分隔符 sep 连接起来,生成一个新的字符串。

3. 例子

add_library(myLib STATIC ${source_files})
target_link_libraries(myApp PRIVATE $<TARGET_FILE:myLib>)

这段代码中,$<TARGET_FILE:myLib> 表达式在构建 myApp 时会被替换为 myLib 库的实际路径。


当然可以!CMake生成器表达式提供了许多功能强大且灵活的工具,这里再列举一些常用的表达式:

常用生成器表达式

  • $<COMPILE_LANGUAGE:lang>:如果编译语言是 lang,则返回1,否则返回0。
  • $<TARGET_PROPERTY:tgt,prop>:返回构建目标 tgt 的属性 prop 的值。
  • $<INSTALL_INTERFACE:content>:在安装规则中生成指定的 content
  • $<BUILD_INTERFACE:content>:在构建规则中生成指定的 content
  • $<STREQUAL:string1,string2>:如果字符串 string1 等于 string2,则返回1,否则返回0。
  • $<AND:expr1,expr2>:如果 expr1expr2 都为真,返回1,否则返回0。
  • $<OR:expr1,expr2>:如果 expr1expr2 为真,返回1,否则返回0。
  • $<NOT:expr>:如果 expr 为假,返回1,否则返回0。
  • $<IF:cond,true_expr,false_expr>:如果 cond 为真,返回 true_expr,否则返回 false_expr
  • $<REMOVE_DUPLICATES:list>:移除列表 list 中的重复项。
  • $<TARGET_PROPERTY:tgt,prop>:获取目标 tgt 的属性 prop 的值。
  • $<TARGET_EXISTS:tgt>:如果目标 tgt 存在,则返回1,否则返回0。
  • $<TARGET_NAME_IF_EXISTS:tgt>:如果目标 tgt 存在,则返回目标的名称,否则返回空字符串。
  • $<FILTER:list,regex>:返回匹配正则表达式 regex 的列表 list 元素。
  • $<GENEX_EVAL:expr>:评估生成器表达式 expr 并返回结果。

示例

# 设置不同构建配置的编译定义
target_compile_definitions(myApp PRIVATE $<$<CONFIG:Debug>:DEBUG> $<$<CONFIG:Release>:NDEBUG>)

# 只在安装时包含某些目录
target_include_directories(myApp
  PRIVATE
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
    $<INSTALL_INTERFACE:include>
)

这些表达式可以帮助你更灵活地配置和管理构建过程,特别是当你需要根据不同的平台、编译器或者配置进行不同处理时,非常有用。