在CMake中以分号分隔的列表中转义“[]”字符

时间:2014-09-26 10:40:56

标签: cmake

我找到了" ["和"]"可能在CMake中以分号分隔的列表中具有特殊含义。当我在CMakeLists.txt中尝试此代码时:

set(XX "a" "b" "[" "]")
message("${XX}")

foreach(x ${XX})
        message("--> ${x}")
endforeach()

我期待结果:

a;b;[;]
--> a
--> b
--> [
--> ]

然而我得到了这个:

a;b;[;]
--> a
--> b
--> [;]

我没有找到关于" ["和"]"。是否可以逃避这些角色,以便获得预期的结果?我正在使用CMake 2.8.12.2。感谢您的帮助:))

2 个答案:

答案 0 :(得分:2)

根据documentation开口方括号,肯定有一个特殊含义:

  

注意: 3.0之前的CMake版本不支持括号参数。他们将开头括号解释为不带引号的论据的开头。

所以问题是混合Quoted和Unquoted参数。在您的情况下可能的解决方法是在初始化中将开放方括号替换为其他内容,然后将其替换回来,如下所示:

CMAKE_MINIMUM_REQUIRED (VERSION 2.8.11)
PROJECT (HELLO NONE)

SET(XX a b BRACKET ])

MESSAGE("${XX}")

FOREACH(x ${XX})
    STRING(REGEX REPLACE "BRACKET" "[" x ${x})
    MESSAGE("--> ${x}")
ENDFOREACH()

答案 1 :(得分:1)

如另一个答案所述,方括号现在用于分隔"long form" argumentslong form comments,以及CMake 3.0及更高版本中的记录。

一对方括号;内部也长期用于在Windows上指定注册表[key; value]对。 CMake文件InstallRequiredSystemLibraries.cmake中显示了此行为的一个示例:

get_filename_component(msvc_install_dir
  "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\8.0;InstallDir]" ABSOLUTE)

当有人想要包含方括号的列表值时,它实现的方式会产生混淆的不幸副作用,因此这个问题就此而言。