Преглед изворни кода

Merge topic 'cmake-preset-error-reporting'

47929ee98c presets: Add basic error forwarding from cmake preset json parser

Acked-by: Kitware Robot <[email protected]>
Acked-by: buildbot <[email protected]>
Merge-request: !7495
Brad King пре 3 година
родитељ
комит
f05ec53112

+ 6 - 4
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;
       }

+ 3 - 2
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();
 };

+ 15 - 8
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;
       }

+ 6 - 2
Source/cmake.cxx

@@ -1283,9 +1283,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;
     }
 

+ 8 - 1
Tests/RunCMake/CMakePresets/Comment-stderr.txt

@@ -1,2 +1,9 @@
 ^CMake Error: Could not read presets from [^
-]*/Tests/RunCMake/CMakePresets/Comment: JSON parse error$
+]*/Tests/RunCMake/CMakePresets/Comment: JSON parse error
+Errors:
+[^
+]*Comment\/CMakePresets.json:
+\* Line 1, Column 1
+  Syntax error: value, object or array expected\.
+\* Line 2, Column 1
+  Extra non-whitespace after JSON value\.$

+ 4 - 1
Tests/RunCMake/CMakePresets/EmptyPresetName-stderr.txt

@@ -1,2 +1,5 @@
 ^CMake Error: Could not read presets from [^
-]*/Tests/RunCMake/CMakePresets/EmptyPresetName: Invalid preset$
+]*/Tests/RunCMake/CMakePresets/EmptyPresetName: Invalid preset
+Errors:
+[^
+]*/EmptyPresetName/CMakePresets.json$

+ 4 - 1
Tests/RunCMake/CMakePresets/IncludeNotFound-stderr.txt

@@ -1,2 +1,5 @@
 ^CMake Error: Could not read presets from [^
-]*/Tests/RunCMake/CMakePresets/IncludeNotFound: File not found$
+]*/Tests/RunCMake/CMakePresets/IncludeNotFound: File not found
+Errors:
+[^
+]*/IncludeNotFound/NotFound.json: Failed to read file$

+ 8 - 1
Tests/RunCMake/CMakePresets/JSONParseError-stderr.txt

@@ -1,2 +1,9 @@
 ^CMake Error: Could not read presets from [^
-]*/Tests/RunCMake/CMakePresets/JSONParseError: JSON parse error$
+]*/Tests/RunCMake/CMakePresets/JSONParseError: JSON parse error
+Errors:
+[^
+]*JSONParseError/CMakePresets.json:
+\* Line 1, Column 1
+  Syntax error: value, object or array expected\.
+\* Line 1, Column 1
+  A valid JSON document must be either an array or an object value\.$