CMake add_custom_command如何向文件写入带双引号的字符串?
CMake add_custom_command 写入带双引号字符串的解决方案
最终实现方案
优先使用CMake自带的-E write命令实现,完全规避echo、重定向带来的多层转义问题,写法如下:
add_custom_command( OUTPUT file # write命令会直接将第二个参数原封不动写入目标文件 COMMAND ${CMAKE_COMMAND} -E write file "\"quoted string\"" DEPENDS something VERBATIM )
如果需要追加内容到文件末尾,CMake 3.18及以上版本可以加--append参数:
COMMAND ${CMAKE_COMMAND} -E write --append file "\"quoted string\""
原写法失效原因
之前的尝试遇到的是CMake多层转义叠加的问题:
- CMake解析配置代码时会做一次转义处理
- 命令执行时,对应平台的shell(bash/cmd等)会做第二次转义处理
- 如果开启了
VERBATIM参数,CMake还会自动对COMMAND中的特殊字符(包括重定向符号>、引号)做转义,直接写的>会被当成普通文本传给echo命令,不会触发重定向逻辑 - 不同平台的echo命令对引号的处理逻辑存在差异,本身兼容性就差
复杂字符串的进阶写法
如果要写入的字符串包含大量引号、反斜杠,转义成本过高,可以使用CMake的括号参数语法,完全不需要手动转义:
add_custom_command( OUTPUT file COMMAND ${CMAKE_COMMAND} -E write file [=[ "带双引号的字符串" 同时包含'单引号'、\反斜杠、$变量符等特殊字符 ]=] DEPENDS something VERBATIM )
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

