如何逃避CMake中的荣誉角色

时间:2015-09-15 10:21:30

标签: 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 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\}" )

没有成功......

1 个答案:

答案 0 :(得分:2)

macro调用似乎消耗了一个级别的转义。众所周知bug,但CMake开发人员不想修复它(出于后向兼容性原因)。

最初,在CMake中没有必要逃避{字符;只有${组合才有特殊含义。所以你只需要逃避$标志。由于macro调用,您需要将其转义两次:

QMAKE_ADD_LINE_TO_VAR(PRO_CONTENT "TARGET = \\\$\\\${VAR}" )

您可以将QMAKE_ADD_LINE_TO_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}" )