CMake自定义命令格式问题[重复]

2fjabf4q  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(110)

此问题在此处已有答案

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_commandVERBATIMCOMMAND_EXPAND_LISTS选项,但都不起作用。如何解决此格式问题?

svdrlsy4

svdrlsy41#

您所做的就是将所有参数定义在一个字符串中。CMake忠实地将其全部作为单个命令行参数传递(为运行该命令的构建工具的“argc”贡献+1,为“argv”贡献一个元素)。如果编写解析命令的程序来处理这个问题,这可能不是问题,但在这种情况下,特定的程序似乎不是问题。
你所看到的空格前的反斜杠只是空格转义的方式,这样它就不会被用作多个命令行参数之间的分隔符,而是被视为在你的上下文中使用的任何工具中的连续命令行参数的一部分。
我很确定你想要的是将tests设置为列表变量。set的多个值参数被转换为正在设置的列表变量的元素,而未加引号的参数则以与列表相同的方式被划分为元素。

set(tests "path/to/test1" -object "path/to/test2" -object "path/to/test3")

字符串
并将VERBATIM传递给对add_custom_command的调用,以便将引用内容正确地传递给构建工具。
请注意(我认为)从技术上讲,如果您还将COMMAND_EXPAND_LISTS传递给add_custom_command调用,则可以将tests作为带引号的参数传递。

相关问题