如何避开CMake中的荣誉角色

如何避开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

我正在从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 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=$
when
TARGET=$${VAR}
是预期的。肯定需要
\\$
并且它可以工作,我的问题是逃避荣誉。抱歉,检查了除
用法之外的所有内容。我编辑了该案例的答案。太好了!这解决了它。谢谢