1

我有一个变量

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."
)
4

1 回答 1

1

将我的评论变成答案

首先 - 把你为什么需要这些引号的问题放在一边 - 我可以重现你的问题并找到几个可能的解决方案:

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

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

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

    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 : ")
    

引用问题似乎只是从命令行调用时的问题


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

  1. 分号分隔的 CMake 列表在用于COMMAND

    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选项,因为“命令的所有参数都将为构建工具正确转义,以便调用的命令接收每个参数不变”。但在这种情况下,它并没有改变任何东西。

参考

于 2016-05-11T19:20:32.063 回答