1
0
mirror of https://github.com/Kitware/CMake.git synced 2025-10-14 10:47:59 +08:00

cmScanDepFormat: P1689R4: Flatten future-compile members into parent

This commit is contained in:
Ben Boeckel
2021-06-08 11:27:39 -04:00
committed by Brad King
parent 5e26887c35
commit 82c867ad85
2 changed files with 49 additions and 54 deletions

View File

@@ -43,6 +43,7 @@ by the `P1689r3`_ paper, with the following updates:
* Omit the ``outputs``, ``inputs``, and ``depends`` fields from * Omit the ``outputs``, ``inputs``, and ``depends`` fields from
each entry in the ``rules`` array. They are unused. each entry in the ``rules`` array. They are unused.
* Flatten ``future-compile`` members directly into each rule.
Compiler writers may try out their scanning functionality using Compiler writers may try out their scanning functionality using
the `cxx-modules-sandbox`_ test project, modified to set variables the `cxx-modules-sandbox`_ test project, modified to set variables

View File

@@ -117,65 +117,61 @@ bool cmScanDepFormat_P1689_Parse(std::string const& arg_pp,
return false; return false;
} }
if (rule.isMember("future-compile")) { if (rule.isMember("outputs")) {
Json::Value const& future_compile = rule["future-compile"]; Json::Value const& outputs = rule["outputs"];
if (outputs.isArray()) {
if (outputs.empty()) {
cmSystemTools::Error(
cmStrCat("-E cmake_ninja_dyndep failed to parse ", arg_pp,
": expected at least one 1 output"));
return false;
}
if (future_compile.isMember("outputs")) { PARSE_FILENAME(outputs[0], info->PrimaryOutput);
Json::Value const& outputs = future_compile["outputs"]; }
if (outputs.isArray()) { }
if (outputs.empty()) {
cmSystemTools::Error( if (rule.isMember("provides")) {
cmStrCat("-E cmake_ninja_dyndep failed to parse ", arg_pp, Json::Value const& provides = rule["provides"];
": expected at least one 1 output")); if (provides.isArray()) {
return false; for (auto const& provide : provides) {
cmSourceReqInfo provide_info;
Json::Value const& logical_name = provide["logical-name"];
PARSE_BLOB(logical_name, provide_info.LogicalName);
if (provide.isMember("compiled-module-path")) {
Json::Value const& compiled_module_path =
provide["compiled-module-path"];
PARSE_FILENAME(compiled_module_path,
provide_info.CompiledModulePath);
} else {
provide_info.CompiledModulePath =
cmStrCat(provide_info.LogicalName, ".mod");
} }
PARSE_FILENAME(outputs[0], info->PrimaryOutput); info->Provides.push_back(provide_info);
} }
} }
}
if (future_compile.isMember("provides")) { if (rule.isMember("requires")) {
Json::Value const& provides = future_compile["provides"]; Json::Value const& reqs = rule["requires"];
if (provides.isArray()) { if (reqs.isArray()) {
for (auto const& provide : provides) { for (auto const& require : reqs) {
cmSourceReqInfo provide_info; cmSourceReqInfo require_info;
Json::Value const& logical_name = provide["logical-name"]; Json::Value const& logical_name = require["logical-name"];
PARSE_BLOB(logical_name, provide_info.LogicalName); PARSE_BLOB(logical_name, require_info.LogicalName);
if (provide.isMember("compiled-module-path")) { if (require.isMember("compiled-module-path")) {
Json::Value const& compiled_module_path = Json::Value const& compiled_module_path =
provide["compiled-module-path"]; require["compiled-module-path"];
PARSE_FILENAME(compiled_module_path, PARSE_FILENAME(compiled_module_path,
provide_info.CompiledModulePath); require_info.CompiledModulePath);
} else {
provide_info.CompiledModulePath =
cmStrCat(provide_info.LogicalName, ".mod");
}
info->Provides.push_back(provide_info);
} }
}
}
if (future_compile.isMember("requires")) { info->Requires.push_back(require_info);
Json::Value const& reqs = future_compile["requires"];
if (reqs.isArray()) {
for (auto const& require : reqs) {
cmSourceReqInfo require_info;
Json::Value const& logical_name = require["logical-name"];
PARSE_BLOB(logical_name, require_info.LogicalName);
if (require.isMember("compiled-module-path")) {
Json::Value const& compiled_module_path =
require["compiled-module-path"];
PARSE_FILENAME(compiled_module_path,
require_info.CompiledModulePath);
}
info->Requires.push_back(require_info);
}
} }
} }
} }
@@ -196,12 +192,10 @@ bool cmScanDepFormat_P1689_Write(std::string const& path,
Json::Value rule(Json::objectValue); Json::Value rule(Json::objectValue);
Json::Value& future_compile = rule["future-compile"] = Json::objectValue; Json::Value& outputs = rule["outputs"] = Json::arrayValue;
Json::Value& outputs = future_compile["outputs"] = Json::arrayValue;
outputs.append(info.PrimaryOutput); outputs.append(info.PrimaryOutput);
Json::Value& provides = future_compile["provides"] = Json::arrayValue; Json::Value& provides = rule["provides"] = Json::arrayValue;
for (auto const& provide : info.Provides) { for (auto const& provide : info.Provides) {
Json::Value provide_obj(Json::objectValue); Json::Value provide_obj(Json::objectValue);
auto const encoded = EncodeFilename(provide.LogicalName); auto const encoded = EncodeFilename(provide.LogicalName);
@@ -218,7 +212,7 @@ bool cmScanDepFormat_P1689_Write(std::string const& path,
provides.append(provide_obj); provides.append(provide_obj);
} }
Json::Value& reqs = future_compile["requires"] = Json::arrayValue; Json::Value& reqs = rule["requires"] = Json::arrayValue;
for (auto const& require : info.Requires) { for (auto const& require : info.Requires) {
Json::Value require_obj(Json::objectValue); Json::Value require_obj(Json::objectValue);
auto const encoded = EncodeFilename(require.LogicalName); auto const encoded = EncodeFilename(require.LogicalName);