diff options
author | Sankhesh Jhaveri <sankhesh.jhaveri@kitware.com> | 2022-07-21 13:50:25 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2022-08-03 14:20:04 (GMT) |
commit | 47929ee98c44d84d9e86e23cc93093f857e11780 (patch) | |
tree | ad5d32a956df67ba902d18220663e7ddecd2df48 /Source | |
parent | 2be09731e0a441b5303344a91c2ba162e9fdf031 (diff) | |
download | CMake-47929ee98c44d84d9e86e23cc93093f857e11780.zip CMake-47929ee98c44d84d9e86e23cc93093f857e11780.tar.gz CMake-47929ee98c44d84d9e86e23cc93093f857e11780.tar.bz2 |
presets: Add basic error forwarding from cmake preset json parser
Print errors only if there are errors. Add filename for better
introspection, particularly for FileNotFound errors with presets.
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmCMakePresetsGraph.cxx | 10 | ||||
-rw-r--r-- | Source/cmCMakePresetsGraph.h | 5 | ||||
-rw-r--r-- | Source/cmCMakePresetsGraphReadJSON.cxx | 23 | ||||
-rw-r--r-- | Source/cmake.cxx | 8 |
4 files changed, 30 insertions, 16 deletions
diff --git a/Source/cmCMakePresetsGraph.cxx b/Source/cmCMakePresetsGraph.cxx index b737c1f..dba79d5 100644 --- a/Source/cmCMakePresetsGraph.cxx +++ b/Source/cmCMakePresetsGraph.cxx @@ -901,8 +901,9 @@ cmCMakePresetsGraph::ReadProjectPresetsInternal(bool allowNoFiles) std::string filename = GetUserFilename(this->SourceDir); std::vector<File*> inProgressFiles; if (cmSystemTools::FileExists(filename)) { - auto result = this->ReadJSONFile(filename, RootType::User, - ReadReason::Root, inProgressFiles, file); + auto result = + this->ReadJSONFile(filename, RootType::User, ReadReason::Root, + inProgressFiles, file, this->errors); if (result != ReadFileResult::READ_OK) { return result; } @@ -910,8 +911,9 @@ cmCMakePresetsGraph::ReadProjectPresetsInternal(bool allowNoFiles) } else { filename = GetFilename(this->SourceDir); if (cmSystemTools::FileExists(filename)) { - auto result = this->ReadJSONFile( - filename, RootType::Project, ReadReason::Root, inProgressFiles, file); + auto result = + this->ReadJSONFile(filename, RootType::Project, ReadReason::Root, + inProgressFiles, file, this->errors); if (result != ReadFileResult::READ_OK) { return result; } diff --git a/Source/cmCMakePresetsGraph.h b/Source/cmCMakePresetsGraph.h index f1f8662..4f3e108 100644 --- a/Source/cmCMakePresetsGraph.h +++ b/Source/cmCMakePresetsGraph.h @@ -52,6 +52,7 @@ public: TEST_OUTPUT_TRUNCATION_UNSUPPORTED, }; + std::string errors; enum class ArchToolsetStrategy { Set, @@ -407,7 +408,7 @@ private: ReadFileResult ReadProjectPresetsInternal(bool allowNoFiles); ReadFileResult ReadJSONFile(const std::string& filename, RootType rootType, ReadReason readReason, - std::vector<File*>& inProgressFiles, - File*& file); + std::vector<File*>& inProgressFiles, File*& file, + std::string& errMsg); void ClearPresets(); }; diff --git a/Source/cmCMakePresetsGraphReadJSON.cxx b/Source/cmCMakePresetsGraphReadJSON.cxx index d11e839..d68af22 100644 --- a/Source/cmCMakePresetsGraphReadJSON.cxx +++ b/Source/cmCMakePresetsGraphReadJSON.cxx @@ -411,7 +411,7 @@ cmCMakePresetsGraph::ReadFileResult EnvironmentMapHelper( cmCMakePresetsGraph::ReadFileResult cmCMakePresetsGraph::ReadJSONFile( const std::string& filename, RootType rootType, ReadReason readReason, - std::vector<File*>& inProgressFiles, File*& file) + std::vector<File*>& inProgressFiles, File*& file, std::string& errMsg) { ReadFileResult result; @@ -430,6 +430,7 @@ cmCMakePresetsGraph::ReadFileResult cmCMakePresetsGraph::ReadJSONFile( cmsys::ifstream fin(filename.c_str()); if (!fin) { + errMsg = cmStrCat(filename, ": Failed to read file\n", errMsg); return ReadFileResult::FILE_NOT_FOUND; } // If there's a BOM, toss it. @@ -438,7 +439,8 @@ cmCMakePresetsGraph::ReadFileResult cmCMakePresetsGraph::ReadJSONFile( Json::Value root; Json::CharReaderBuilder builder; Json::CharReaderBuilder::strictMode(&builder.settings_); - if (!Json::parseFromStream(builder, fin, &root, nullptr)) { + if (!Json::parseFromStream(builder, fin, &root, &errMsg)) { + errMsg = cmStrCat(filename, ":\n", errMsg); return ReadFileResult::JSON_PARSE_ERROR; } @@ -490,6 +492,8 @@ cmCMakePresetsGraph::ReadFileResult cmCMakePresetsGraph::ReadJSONFile( for (auto& preset : presets.ConfigurePresets) { preset.OriginFile = file; if (preset.Name.empty()) { + errMsg += R"(\n\t)"; + errMsg += filename; return ReadFileResult::INVALID_PRESET; } @@ -523,6 +527,8 @@ cmCMakePresetsGraph::ReadFileResult cmCMakePresetsGraph::ReadJSONFile( for (auto& preset : presets.BuildPresets) { preset.OriginFile = file; if (preset.Name.empty()) { + errMsg += R"(\n\t)"; + errMsg += filename; return ReadFileResult::INVALID_PRESET; } @@ -569,12 +575,13 @@ cmCMakePresetsGraph::ReadFileResult cmCMakePresetsGraph::ReadJSONFile( auto const includeFile = [this, &inProgressFiles, file]( const std::string& include, RootType rootType2, - ReadReason readReason2) -> ReadFileResult { + ReadReason readReason2, + std::string& FailureMessage) -> ReadFileResult { ReadFileResult r; File* includedFile; if ((r = this->ReadJSONFile(include, rootType2, readReason2, - inProgressFiles, includedFile)) != - ReadFileResult::READ_OK) { + inProgressFiles, includedFile, + FailureMessage)) != ReadFileResult::READ_OK) { return r; } @@ -589,8 +596,8 @@ cmCMakePresetsGraph::ReadFileResult cmCMakePresetsGraph::ReadJSONFile( include = cmStrCat(directory, '/', include); } - if ((result = includeFile(include, rootType, ReadReason::Included)) != - ReadFileResult::READ_OK) { + if ((result = includeFile(include, rootType, ReadReason::Included, + errMsg)) != ReadFileResult::READ_OK) { return result; } } @@ -599,7 +606,7 @@ cmCMakePresetsGraph::ReadFileResult cmCMakePresetsGraph::ReadJSONFile( auto cmakePresetsFilename = GetFilename(this->SourceDir); if (cmSystemTools::FileExists(cmakePresetsFilename)) { if ((result = includeFile(cmakePresetsFilename, RootType::Project, - ReadReason::Root)) != + ReadReason::Root, errMsg)) != ReadFileResult::READ_OK) { return result; } diff --git a/Source/cmake.cxx b/Source/cmake.cxx index e6fa219..d5aae86 100644 --- a/Source/cmake.cxx +++ b/Source/cmake.cxx @@ -1286,9 +1286,13 @@ void cmake::SetArgs(const std::vector<std::string>& args) cmCMakePresetsGraph presetsGraph; auto result = presetsGraph.ReadProjectPresets(this->GetHomeDirectory()); if (result != cmCMakePresetsGraph::ReadFileResult::READ_OK) { - cmSystemTools::Error( + std::string errorMsg = cmStrCat("Could not read presets from ", this->GetHomeDirectory(), - ": ", cmCMakePresetsGraph::ResultToString(result))); + ": ", cmCMakePresetsGraph::ResultToString(result)); + if (!presetsGraph.errors.empty()) { + errorMsg = cmStrCat(errorMsg, "\nErrors:\n", presetsGraph.errors); + } + cmSystemTools::Error(errorMsg); return; } |