Browse Source

cmake: Provide guidance when an invalid -G option is given

Print a list of generators if no generator or an invalid one is
supplied.

Signed-off-by: Gerald Combs <[email protected]>
Gerald Combs 10 years ago
parent
commit
588dcb33b7

+ 15 - 0
Source/cmDocumentation.cxx

@@ -138,6 +138,8 @@ bool cmDocumentation::PrintDocumentation(Type ht, std::ostream& os)
       return this->PrintHelpListVariables(os);
     case cmDocumentation::ListPolicies:
       return this->PrintHelpListPolicies(os);
+    case cmDocumentation::ListGenerators:
+      return this->PrintHelpListGenerators(os);
     case cmDocumentation::Version:
       return this->PrintVersion(os);
     case cmDocumentation::OldCustomModules:
@@ -816,6 +818,19 @@ bool cmDocumentation::PrintHelpListPolicies(std::ostream& os)
   return true;
 }
 
+//----------------------------------------------------------------------------
+bool cmDocumentation::PrintHelpListGenerators(std::ostream& os)
+{
+  std::map<std::string,cmDocumentationSection*>::iterator si;
+  si = this->AllSections.find("Generators");
+  if(si != this->AllSections.end())
+    {
+    this->Formatter.SetIndent("  ");
+    this->Formatter.PrintSection(os, *si->second);
+    }
+  return true;
+}
+
 //----------------------------------------------------------------------------
 bool cmDocumentation::PrintHelpOneVariable(std::ostream& os)
 {

+ 1 - 0
Source/cmDocumentation.h

@@ -117,6 +117,7 @@ private:
   bool PrintHelpListProperties(std::ostream& os);
   bool PrintHelpListVariables(std::ostream& os);
   bool PrintHelpListPolicies(std::ostream& os);
+  bool PrintHelpListGenerators(std::ostream& os);
   bool PrintOldCustomModules(std::ostream& os);
 
   const char* GetNameString() const;

+ 2 - 2
Source/cmDocumentationFormatter.h

@@ -26,8 +26,8 @@ public:
   /** Types of help provided.  */
   enum Type
   {
-    None, Version, Usage, Help, Full, ListManuals,
-    ListCommands, ListModules, ListProperties, ListVariables, ListPolicies,
+    None, Version, Usage, Help, Full, ListManuals, ListCommands,
+    ListModules, ListProperties, ListVariables, ListPolicies, ListGenerators,
     OneManual, OneCommand, OneModule, OneProperty, OneVariable, OnePolicy,
     OldCustomModules
   };

+ 16 - 0
Source/cmake.cxx

@@ -818,6 +818,7 @@ void cmake::SetArgs(const std::vector<std::string>& args,
         if(i >= args.size())
           {
           cmSystemTools::Error("No generator specified for -G");
+          this->PrintGeneratorList();
           return;
           }
         value = args[i];
@@ -828,6 +829,7 @@ void cmake::SetArgs(const std::vector<std::string>& args,
         {
         cmSystemTools::Error("Could not create named generator ",
                              value.c_str());
+        this->PrintGeneratorList();
         }
       else
         {
@@ -1961,6 +1963,18 @@ void cmake::GetGeneratorDocumentation(std::vector<cmDocumentationEntry>& v)
     }
 }
 
+void cmake::PrintGeneratorList()
+{
+#ifdef CMAKE_BUILD_WITH_CMAKE
+  cmDocumentation doc;
+  std::vector<cmDocumentationEntry> generators;
+  this->GetGeneratorDocumentation(generators);
+  doc.AppendSection("Generators",generators);
+  std::cerr << "\n";
+  doc.PrintDocumentation(cmDocumentation::ListGenerators, std::cerr);
+#endif
+}
+
 void cmake::UpdateConversionPathTable()
 {
   // Update the path conversion table with any specified file:
@@ -2438,6 +2452,7 @@ int cmake::GetSystemInformation(std::vector<std::string>& args)
         if(i >= args.size())
           {
           cmSystemTools::Error("No generator specified for -G");
+          this->PrintGeneratorList();
           return -1;
           }
         value = args[i];
@@ -2448,6 +2463,7 @@ int cmake::GetSystemInformation(std::vector<std::string>& args)
         {
         cmSystemTools::Error("Could not create named generator ",
                              value.c_str());
+        this->PrintGeneratorList();
         }
       else
         {

+ 3 - 0
Source/cmake.h

@@ -476,6 +476,9 @@ private:
   InstalledFilesMap InstalledFiles;
 
   void UpdateConversionPathTable();
+
+  // Print a list of valid generators to stderr.
+  void PrintGeneratorList();
 };
 
 #define CMAKE_STANDARD_OPTIONS_TABLE \

+ 3 - 1
Tests/RunCMake/CommandLine/G_bad-arg-stderr.txt

@@ -1 +1,3 @@
-^CMake Error: Could not create named generator NoSuchGenerator$
+^CMake Error: Could not create named generator NoSuchGenerator
+
+Generators

+ 3 - 1
Tests/RunCMake/CommandLine/G_no-arg-stderr.txt

@@ -1 +1,3 @@
-^CMake Error: No generator specified for -G$
+^CMake Error: No generator specified for -G
+
+Generators