CMake如何可靠检测变量中是否存在合法generator expression生成器表达式
CMake 生成器表达式检测实现方案
CMake 生成器表达式有固定的语法特征:所有合法的生成器表达式都以$<开头、>结尾,且配置阶段不会被解析展开,因此可以通过正则匹配完成可靠检测,再根据检测结果分支处理即可。
具体实现逻辑
- 检测输入参数是否匹配正则
\\$<.*>,匹配则说明包含生成器表达式,跳过get_filename_component处理 - 未匹配则说明为普通路径,正常执行绝对路径转换逻辑
修改后完整示例代码
function(foo) cmake_parse_arguments(FOO "" "POSSIBLY_RELATIVE_POSSIBLY_GENEX_PATH" "" ${ARGN}) set(ABSOLUTE_PATH "${FOO_POSSIBLY_RELATIVE_POSSIBLY_GENEX_PATH}") # 仅当不存在生成器表达式时执行路径转换 if(NOT FOO_POSSIBLY_RELATIVE_POSSIBLY_GENEX_PATH MATCHES "\\$<.*>") get_filename_component( ABSOLUTE_PATH "${FOO_POSSIBLY_RELATIVE_POSSIBLY_GENEX_PATH}" REALPATH BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}" ) endif() add_custom_command( OUTPUT ${MY_OUTPUT} COMMAND ${MY_TOOL} ${ABSOLUTE_PATH} ) endfunction()
注意事项
- 该检测逻辑完全对齐CMake官方语法规范,不会出现漏判合法生成器表达式的情况
- 若存在路径本身包含
$<字符的极端场景,要求用户使用CMake内置转义生成器表达式$<DOLLAR>和$<ANGLE-R>表示对应字符即可避免误判
内容的提问来源于stack exchange,提问作者Ext3h
相关产品推荐
相关产品推荐

