如何逃避在CMake的荣誉角色 [英] How to escape accolade characters in CMake

查看:141
本文介绍了如何逃避在CMake的荣誉角色的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我手动从CMake生成一个QtCreator项目文件(.pro)。



有时,我需要写 $$ {VAR} 到.pro文件。所以我需要转义 $ 字符和 { }

我发现如何保护 $ 符号,这是我如何处理:

 宏(QMAKE_ADD_LINE_TO_VAR var line)
set($ {var}$ {$ {var}} \\\
$ { line} \\\

endmacro()

set(PRO_CONTENT#由CMake脚本生成!)
#在这里添加许多其他东西....
QMAKE_ADD_LINE_TO_VAR(PRO_CONTENTTARGET = \\ $ \\ $ VAR)
文件(WRITE file.pro $ {PRO_CONTENT})

这会生成file.pro:

 #由CMake脚本生成! 
...
TARGET = $$ VAR

?我找不到如何逃避荣誉:

 #由CMake脚本生成! 
...
TARGET = $$ {VAR}

  QMAKE_ADD_LINE_TO_VAR(PRO_CONTENTTARGET = \\ $ \\ $ \\ {VAR \\ })
QMAKE_ADD_LINE_TO_VAR(PRO_CONTENTTARGET = \\ $ \\ $ \ {VAR \})

没有成功...

解决方案

看起来 macro 调用使用一级转义。已知错误,但是CMake开发人员不想修复它(对于向后兼容性原因)。



最初,在CMake中没有必要转义 {只有 $ {组合有特殊的含义。所以你只需要转义 $ 符号。由于调用,您需要将其转义两次:

  QMAKE_ADD_LINE_TO_VAR (PRO_CONTENTTARGET = \\\ $ \\\ $ {VAR})

您可以实现 QMAKE_ADD_LINE_TO_VAR 作为函数:

  QMAKE_ADD_LINE_TO_VAR var line)
set($ {var}$ {$ {var}} \\\
$ {line} \\\
PARENT_SCOPE)
endfunction()



在这种情况下,转义将被简化:

  QMAKE_ADD_LINE_TO_VAR(PRO_CONTENTTARGET = \ $ \ $ {VAR})


I'm manually generating a QtCreator project file (.pro) from CMake.

At some point, I need to write $${VAR} to the .pro file. So I need to escape both the $ character and the { }.

I found out how to protect the $ sign, here is how I proceed:

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} )

This generates file.pro:

#Generated by CMake scripts!
...
TARGET = $$VAR

But how can I generate? I could not find out how to escape the accolades:

#Generated by CMake scripts!
...
TARGET = $${VAR}

I tried:

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

with no success...

解决方案

It appears that macro call consume one level of escaping. It is known bug, but CMake developers don't want to fix it (for backward compability reason).

Originally, in CMake there is no needs to escape { character; only ${ combination has a special meaning. So you only need to escape $ sign. Because of macro call, you need to escape it twice:

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

You may implement QMAKE_ADD_LINE_TO_VAR as a function:

function( QMAKE_ADD_LINE_TO_VAR var line )
    set( ${var} "${${var}}\n${line}\n" PARENT_SCOPE)
endfunction()

In that case, escaping will be simplified:

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

这篇关于如何逃避在CMake的荣誉角色的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆