【问题标题】:CMake quote escape conumdrumCMake 报价转义难题
【发布时间】:2023-12-09 10:14:01
【问题描述】:

我似乎无法理解 CMake 的转义规则。给定:

set(X A B C)
add_custom_target( works COMMAND DUMMY=0 X="${X}" env | grep ^X= COMMENT "This works")
add_custom_target( fails COMMAND X="${X}" env | grep ^X= COMMENT "This fails")

意图是执行命令X="A B C" env。自定义目标 works 正确构造命令,而 fails 错误执行:

X=\"A B C\" env ...

但是为什么呢?

【问题讨论】:

  • cmake: when to quote variables? 可能重复 请尝试set(X "A B C") 并且不要在${X} 周围加上引号。
  • @Florian, set(X "A B C") 结果:"X=\"A B C\"" env,仍然是错误的。
  • 我遇到了完全相同的问题,ExternalProject_Add_Step(COMMAND build --args="my args") 将执行 build --args=\"my args\" 这是不正确的。如果今晚找不到解决方案,我将开始赏金。

标签: cmake escaping double-quotes


【解决方案1】:

其实你遇到了两个问题:

  1. 不要在自定义命令中引用 CMake 变量。 CMake 将为您执行必要的转义序列。
  2. COMMAND 之后的第一个文字被假定为命令名称或文件。因此 CMake 尝试将其作为单个“字符串”处理。

所以我更改了引用和env 调用,以下对我有用:

cmake_minimum_required(VERSION 2.8)

project(QuotedStrings)

set(X "A B C")
add_custom_target( works COMMAND env DUMMY=0 X=${X} | grep ^X= COMMENT "This works")
add_custom_target( fails_no_more COMMAND env X=${X} | grep ^X= COMMENT "This works too")

有关更多详细信息和可能性,请参阅:

【讨论】: