如何在CMake缓存变量中保留单引号?

时间:2016-05-11 07:55:17

标签: cmake cmake-gui

我有一个变量

SET(CODE_COVERAGE_EXCLUSION_LIST
""
CACHE STRING "List of resources to exclude from code coverage analysis")

必须包含表达式列表,例如:'tests/*' '/usr/*'

尝试将默认值设置为上述表达式时,将删除单引号。

如何保存它们?

此外,当我尝试通过这样的排除列表时

cmake -DCODE_COVERAGE_EXCLUSION_LIST="'tests/*' '/usr/*'" ..

初始和最终单引号丢失。如何保存它们?

最后,使用cmake-gui时也适用同样的问题。

编辑:我试图使用反斜杠来逃避引号:

SET(CODE_COVERAGE_EXCLUSION_LIST
    " \'tests/*\' \'/usr/*\'"
    CACHE STRING "List of resources to exclude from code coverage analysis : ")

它给了我以下错误:

 Syntax error in cmake code at
    xxx.cmake:106
  when parsing string
     \'tests/*\' \'/usr/*\'
  Invalid escape sequence \'

EDIT2:add_custom_target的代码(而不是add_custom_command,我的不好)

    ADD_CUSTOM_TARGET(${_targetname}

    # Cleanup lcov
    ${LCOV_PATH} --directory . --zerocounters

    # Run tests
    COMMAND ${_testrunner} ${ARGV3}

    # Capturing lcov counters and generating report
    COMMAND ${LCOV_PATH} --directory . --capture --output-file ${_outputname}.info
    COMMAND ${LCOV_PATH} --remove ${_outputname}.info 'tests/*' '/usr/*'  ${CODE_COVERAGE_EXCLUSION_LIST} --output-file ${_outputname}.info.cleaned
    COMMAND ${GENHTML_PATH} -o ${_outputname} ${_outputname}.info.cleaned
    COMMAND ${CMAKE_COMMAND} -E remove ${_outputname}.info ${_outputname}.info.cleaned

    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
    COMMENT "Resetting code coverage counters to zero.\nProcessing code coverage counters and generating report."
)

1 个答案:

答案 0 :(得分:1)

将我的评论转化为答案

首先 - 提出你为什么需要这些引用的问题 - 我可以重现你的问题并找到几种可能的解决方案:

  1. 在缓存变量的开头和结尾添加空格

    cmake -DCODE_COVERAGE_EXCLUSION_LIST=" 'tests/*' '/usr/*' " ..
    
  2. 使用“转义”双引号而不是单引号

    cmake -DCODE_COVERAGE_EXCLUSION_LIST:STRING="\"tests/*\" \"/usr/\"" ..
    
  3. 通过设置CMake 3.1引入的策略CMP0053开关,使用您的set(... CACHE ...)示例:

    cmake_policy(SET CMP0053 NEW)
    set(CODE_COVERAGE_EXCLUSION_LIST
        "\'tests/*\' \'/usr/*\'"
        CACHE STRING "List of resources to exclude from code coverage analysis : ")
    
  4. 但是在代码中设置它时我也可以这样做

    set(CODE_COVERAGE_EXCLUSION_LIST
        "'tests/*' '/usr/*'"
        CACHE STRING "List of resources to exclude from code coverage analysis : ")
    
  5. 从命令行调用时,引用问题似乎只是一个问题

    然后 - 如果我认为您可能不需要引号 - 您可以将路径作为列表传递:

    1. COMMAND

      中使用时,以分号分隔的CMake列表再次扩展为参数(使用空格作为分隔符)
      cmake -DCODE_COVERAGE_EXCLUSION_LIST:STRING="tests/*;/usr/*" ..
      

      add_custom_target(
          ...
          COMMAND ${LCOV_PATH} --remove ${_outputname}.info ${CODE_COVERAGE_EXCLUSION_LIST} --output-file ${_outputname}.info.cleaned
      )
      

      会给出像

      这样的东西
      .../lcov --remove output.info tests/* /usr/* --output-file output.info.cleaned
      
    2. 我还尝试添加VERBATIM选项,因为“对于构建工具,命令的所有参数都将被正确转义,以便被调用的命令接收每个参数不变”。但在这种情况下,它没有改变任何东西。

    3. <强>参考