【问题标题】:Escape "[]" characters in a semicolon-separated list in CMake在 CMake 中以分号分隔的列表中转义“[]”字符
【发布时间】:2014-09-26 10:40:55
【问题描述】:

我发现“[”和“]”在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。感谢您的帮助:)

【问题讨论】:

  • 我找到了这个bug
  • 谢谢 :) 也许我需要用其他字符串替换括号,然后将它们替换回以解决此错误。
  • 我需要从第三方库的一些配置文件中提取字符串,然后为我的 android 项目生成一个 xml 文件。不幸的是,配置文件包含括号并使 CMake 感到困惑。

标签: cmake


【解决方案1】:

根据documentation开方括号肯定有特殊含义:

注意: 3.0 之前的 CMake 版本不支持括号参数。他们将左括号解释为未引用参数的开始。

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

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

【讨论】:

  • 右括号的处理也很奇怪。例如,如果您尝试set(XX "a" "b" "]" "c" "d"),您将得到--> ];c;d,而不是3 个单独的项目。我最终通过用其他东西替换所有括号然后将它们替换回来来解决问题。它很脏,但对我有用。 :)
【解决方案2】:

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

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

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

当有人想要包含方括号的列表值时,它的实现方式有一个不幸的副作用,即造成混乱,因此这个问题是关于 SO。

【讨论】:

  • 不幸的是,转义方括号不起作用。 Invalid escape sequence \[
  • 感谢您的评论。我将编辑我的答案以删除尝试 \[ 转义的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多