此问题在此处已有答案:
Why does CMake prefixes spaces with backslashes when executing a command?(3个答案)
29天前关闭
我正在尝试编写一个自定义CMake命令,它将执行llvm-cov
作为覆盖率分析的一部分。我有一个字符串变量tests
,它保存了测试可执行文件的列表,定义为:
set(tests "\"path/to/test1\" -object \"path/to/test2\" -object \"path/to/test3\"")
字符串
请注意,-object
说明符位于除第一个测试之外的每个测试之前,因为这是llvm-cov所期望的格式。当我打印这个变量时,我得到:
"path/to/test1" -object "path/to/test2" -object "path/to/test3"
型
这也是我想要达到的
但是,当我创建一个像这样的自定义CMake命令时:
add_custom_command(
TARGET coverage
COMMAND llvm-cov show -instr-profile ${profdata_file} ${tests} -format html -o coverage)
型
命令未正确执行,因为它扩展为:
llvm-cov show -instr-profile path/to/profdata "/path/to/test1"\ -object\ "path/to/test2"\ -object\ "path/to/test3" -format html -o coverage
型
问题是由于某种原因,在空格字符之前添加了反斜杠。我尝试使用add_custom_command
的VERBATIM
和COMMAND_EXPAND_LISTS
选项,但都不起作用。如何解决此格式问题?
1条答案
按热度按时间svdrlsy41#
您所做的就是将所有参数定义在一个字符串中。CMake忠实地将其全部作为单个命令行参数传递(为运行该命令的构建工具的“argc”贡献+1,为“argv”贡献一个元素)。如果编写解析命令的程序来处理这个问题,这可能不是问题,但在这种情况下,特定的程序似乎不是问题。
你所看到的空格前的反斜杠只是空格转义的方式,这样它就不会被用作多个命令行参数之间的分隔符,而是被视为在你的上下文中使用的任何工具中的连续命令行参数的一部分。
我很确定你想要的是将
tests
设置为列表变量。set
的多个值参数被转换为正在设置的列表变量的元素,而未加引号的参数则以与列表相同的方式被划分为元素。字符串
并将
VERBATIM
传递给对add_custom_command
的调用,以便将引用内容正确地传递给构建工具。请注意(我认为)从技术上讲,如果您还将
COMMAND_EXPAND_LISTS
传递给add_custom_command
调用,则可以将tests
作为带引号的参数传递。