如何向CMake的add_compiler_options()传递含尖括号的编译选项?
解决CMake中Squish Coco编译选项因尖括号被自动加引号的问题
场景说明
在Windows系统下使用CMake 3.24.2构建项目,需要为Squish Coco代码覆盖率工具添加全局编译选项,要求不使用CMAKE_C_FLAGS_COVERAGE全局变量,目标选项为:
--cs-on --cs-output=P:\%F.<TEST_NAME>.${HOST_NAME}.%p.%t
但由于选项中包含尖括号<>,CMake会自动为第二个选项添加双引号,导致Coco工具忽略该选项。
之前的尝试及问题
尝试1:
add_compile_options("$<$<CONFIG:COVERAGE>:--cs-on;--cs-output=P:\%F.<TEST_NAME$<ANGLE-R>.${HOST_NAME}.%p.%t>")生成的
compile_commands.json中出现多余引号:--cs-on \"--cs-output=P:\\coverage/%F.<TEST_NAME>.ca-pc39.%p.%t\"尝试2:手动添加引号
add_compile_options("$<$<CONFIG:COVERAGE>:--cs-on;--cs-output=\"P:\%F.<TEST_NAME$<ANGLE-R>.${HOST_NAME}.%p.%t\">")结果出现多层转义引号:
--cs-on \"--cs-output=\\\"P:\\coverage/%F.<TEST_NAME>.ca-pc39.%p.%t\\\"\"尝试3:移除所有尖括号
得到无引号的正常格式,但丢失了<TEST_NAME>的必要结构:--cs-on --cs-output=P:\\coverage/%F.TEST_NAME.ca-pc39.%p.%t
解决方法
使用CMake的SHELL:生成器表达式前缀,强制跳过自动引号处理,直接传递带尖括号的选项。修改后的代码如下:
add_compile_options( "$<$<CONFIG:COVERAGE>:--cs-on>" "$<$<CONFIG:COVERAGE>:SHELL:--cs-output=P:\\%F.<TEST_NAME>.${HOST_NAME}.%p.%t>" )
说明
SHELL:前缀会告诉CMake将后续内容直接作为编译器参数传递,不进行额外的引号转义或包裹,保留尖括号的原始结构。- 注意路径中的反斜杠需要转义为
\\,避免CMake将其解析为转义字符。
修改后,compile_commands.json中会生成符合要求的无引号选项:
--cs-on --cs-output=P:\\coverage/%F.<TEST_NAME>.ca-pc39.%p.%t
内容的提问来源于stack exchange,提问作者Janbur
相关产品推荐
相关产品推荐

