使用CMake/Ninja的add_custom_command时如何转义$符号
CMake + Ninja 下自定义命令中$符号的正确转义方法
在使用CMake的add_custom_command配合Ninja构建系统时,$符号会被Ninja识别为特殊字符(用于伪规则或变量引用),同时CMake本身也会解析$(用于变量替换),所以需要做双层转义:
正确转义方式:使用四个美元符号 $$$$
原理是:
- CMake处理阶段:每两个连续的
$会被替换成一个$,因此$$$$会被CMake解析为$$ - Ninja处理阶段:Ninja同样会把连续两个
$替换成一个普通的$,最终传递给执行命令的就是单个$
修改后的代码示例:
add_custom_target(target1) add_custom_command(TARGET target1 COMMAND echo $$$$1222 )
执行后,实际运行的命令是echo $1222,会正确输出$1222,不会触发Ninja的伪规则解析。
为什么之前的写法不行?
- 直接写
$1222:CMake会把$1当作变量(未定义则为空),最终传给Ninja的是1222,完全丢失了$ - 写
$$1222:CMake解析后变成$1222传给Ninja,但Ninja会把$1视为伪规则/变量,依然会出现解析问题
内容的提问来源于stack exchange,提问作者VerySimple
相关产品推荐
相关产品推荐

