You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 04:06:05