CMakeLists 解析文件

Hal*_*rad 3 xml parsing json cmake c++11

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

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

<root>
 <Object>
  <name = "my_name"/>
  <url = "my_url"/>
 </Object> 
 <Object>
  <name = "another_name"/>
  <url = "another_url"/>
 </Object> 
</root>
Run Code Online (Sandbox Code Playgroud)

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

那可能吗?我在这个主题上没有找到太多。

squ*_*les 6

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

如果您有这样的 JSON 文件:

[
   {
      "name": "my_name",
      "url": "my_url"
   },
   {
      "name": "another_name",
      "url": "another_url"
   }
]
Run Code Online (Sandbox Code Playgroud)

您可以读取该文件,并创建包含来自 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}")
Run Code Online (Sandbox Code Playgroud)

此 CMake 代码打印:

MY_NAMES: my_name;another_name
MY_URLS: my_url;another_url
Run Code Online (Sandbox Code Playgroud)


小智 0

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

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

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