【问题标题】:CMakeLists parse fileCMakeLists 解析文件
【发布时间】:2017-10-12 07:07:10
【问题描述】:

我想在我的 CMakeLists 中解析一个文件(XML、JSON 或类似文件)并相应地设置一些变量。

例如,假设我有以下文件:

<root>
 <Object>
  <name = "my_name"/>
  <url = "my_url"/>
 </Object> 
 <Object>
  <name = "another_name"/>
  <url = "another_url"/>
 </Object> 
</root>

然后在我的 CMakeLists 中,我想设置一个包含所有名称的变量和另一个包含所有 url 的变量。

这可能吗?我没有找到关于这个主题的太多内容。

【问题讨论】:

  • 您的示例不是有效的 XML。您可以将示例更改为 another_name

标签: json xml parsing c++11 cmake


【解决方案1】:

从 CMake 3.19 开始,您可以使用 CMake 通过 string(JSON ...) 命令查询和修改 JSON 字符串。

如果你有这样的 JSON 文件:

[
   {
      "name": "my_name",
      "url": "my_url"
   },
   {
      "name": "another_name",
      "url": "another_url"
   }
]

您可以读取该文件,并创建包含 JSON 文件中的名称和 URL 的 CMake 变量。

# Read the JSON file.
file(READ ${CMAKE_CURRENT_SOURCE_DIR}/myjson.json MY_JSON_STRING)

# Loop through each element of the JSON array (indices 0 though 1).
foreach(IDX RANGE 1)
    # Get the name from the current JSON element.
    string(JSON CUR_NAME GET ${MY_JSON_STRING} ${IDX} name)
    list(APPEND MY_NAMES ${CUR_NAME})
    # Get the URL from the current JSON element.
    string(JSON CUR_URL GET ${MY_JSON_STRING} ${IDX} url)
    list(APPEND MY_URLS ${CUR_URL})
endforeach()

message("MY_NAMES: ${MY_NAMES}")
message("MY_URLS: ${MY_URLS}")

此 CMake 代码打印:

MY_NAMES: my_name;another_name
MY_URLS: my_url;another_url

【讨论】:

    【解决方案2】:

    CMake 本身不提供 json 或 XML 解析器。但是,您可以使用 jq 或 xmlstarlet 之类的工具。 您可以根据需要从 CMake 中使用 execute_process 或 add_custom_command 调用工具。

    jq:https://stedolan.github.io/jq/

    xmlstarlet:http://xmlstar.sourceforge.net/overview.php

    【讨论】:

      猜你喜欢
      • 2023-03-13
      • 1970-01-01
      • 2017-11-14
      • 1970-01-01
      • 2015-06-23
      • 2021-09-24
      • 1970-01-01
      • 2012-04-16
      • 2016-10-21
      相关资源
      最近更新 更多