CMake生成器表达式语法是为了在构建过程中灵活地指定和操作构建目标的属性和参数。生成器表达式通常在CMakeLists.txt文件中的某些指令或命令中使用,常见的场景包括target_link_libraries
、add_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>
:如果expr1
和expr2
都为真,返回1,否则返回0。 -
$<OR:expr1,expr2>
:如果expr1
或expr2
为真,返回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>
)
这些表达式可以帮助你更灵活地配置和管理构建过程,特别是当你需要根据不同的平台、编译器或者配置进行不同处理时,非常有用。