我想在我的CMakeLists中解析一个文件(XML,JSON或类似文件)并相应地设置一些变量。
例如,假设我有以下文件:
<root>
<Object>
<name = "my_name"/>
<url = "my_url"/>
</Object>
<Object>
<name = "another_name"/>
<url = "another_url"/>
</Object>
</root>
然后在我的CMakeLists中,我想设置一个包含所有名称的变量和另一个包含所有网址的变量。
这可能吗?我在这个话题上找不到多少。
谢谢
卡尔。
答案 0 :(得分:1)
CMake本身不提供json或XML解析器。但是,您可以使用jq或xmlstarlet之类的工具。 您可以根据需要使用CMake中的execute_process或add_custom_command调用这些工具。
jq:https://stedolan.github.io/jq/
xmlstarlet:http://xmlstar.sourceforge.net/overview.php
答案 1 :(得分:1)
从CMake 3.19开始,您可以使用string(JSON ...)
命令使用CMake查询和修改JSON字符串。
如果您有这样的JSON文件:
[
{
"name": "my_name",
"url": "my_url"
},
{
"name": "another_name",
"url": "another_url"
}
]
您可以读取文件,并创建CMake变量,其中包含JSON文件中的名称和URL。
# 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