如何避开CMake中的荣誉角色
我正在从CMake手动生成QtCreator项目文件(.pro) 在某个时候,我需要将如何避开CMake中的荣誉角色,cmake,escaping,Cmake,Escaping,我正在从CMake手动生成QtCreator项目文件(.pro) 在某个时候,我需要将$${VAR}写入.pro文件。所以我需要转义$字符和{} 我发现了如何保护$标志,下面是我的操作步骤: macro( QMAKE_ADD_LINE_TO_VAR var line ) set( ${var} "${${var}}\n${line}\n" ) endmacro() set(PRO_CONTENT "#Generated by CMake scripts!") # Adding many
$${VAR}
写入.pro文件。所以我需要转义$
字符和{
}
我发现了如何保护$
标志,下面是我的操作步骤:
macro( QMAKE_ADD_LINE_TO_VAR var line )
set( ${var} "${${var}}\n${line}\n" )
endmacro()
set(PRO_CONTENT "#Generated by CMake scripts!")
# Adding many other stuff here....
QMAKE_ADD_LINE_TO_VAR(PRO_CONTENT "TARGET = \\$\\$VAR" )
file(WRITE file.pro ${PRO_CONTENT} )
这将生成file.pro:
#Generated by CMake scripts!
...
TARGET = $$VAR
但我如何才能生成?我不知道如何逃避这些荣誉:
#Generated by CMake scripts!
...
TARGET = $${VAR}
我试过:
QMAKE_ADD_LINE_TO_VAR(PRO_CONTENT "TARGET = \\$\\$\\{VAR\\}" )
QMAKE_ADD_LINE_TO_VAR(PRO_CONTENT "TARGET = \\$\\$\{VAR\}" )
没有成功…看来,
宏
调用消耗了一级转义。这是众所周知的,但CMake开发人员不想修复它(出于向后兼容的原因)
最初,在CMake中,不需要转义{
字符;只有${
组合具有特殊含义。因此,您只需要转义$
符号。由于宏
调用,您需要转义两次:
QMAKE_ADD_LINE_TO_VAR(PRO_CONTENT "TARGET = \\\$\\\${VAR}" )
您可以将QMAKE\u ADD\u LINE\u TO\u VAR
作为一个函数来实现:
function( QMAKE_ADD_LINE_TO_VAR var line )
set( ${var} "${${var}}\n${line}\n" PARENT_SCOPE)
endfunction()
在这种情况下,逃逸将被简化:
QMAKE_ADD_LINE_TO_VAR(PRO_CONTENT "TARGET = \$\${VAR}" )
您实际测试过吗?因为当我这样做时,生成的输出文件是
TARGET=$
whenTARGET=$${VAR}
是预期的。肯定需要\\$
并且它可以工作,我的问题是逃避荣誉。抱歉,检查了除宏
用法之外的所有内容。我编辑了该案例的答案。太好了!这解决了它。谢谢