[cmake-developers] [PATCH] Have -G print a list of generators

Gerald Combs gerald at wireshark.org
Fri Apr 10 12:30:10 EDT 2015


Hi,

The attached patch prints a list of generators if an empty or invalid
'-G' option is supplied.

-------------- next part --------------
From 6b01514b9293445c2e2efd299b4421c3ded4aa10 Mon Sep 17 00:00:00 2001
From: Gerald Combs <gerald at wireshark.org>
Date: Sun, 29 Mar 2015 11:28:30 -0700
Subject: [PATCH] Help: Provide guidance on generators.

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

Signed-off-by: Gerald Combs <gerald at wireshark.org>
---
 Source/cmDocumentation.cxx        | 15 +++++++++++++++
 Source/cmDocumentation.h          |  1 +
 Source/cmDocumentationFormatter.h |  4 ++--
 Source/cmake.cxx                  | 16 ++++++++++++++++
 Source/cmake.h                    |  3 +++
 5 files changed, 37 insertions(+), 2 deletions(-)

diff --git a/Source/cmDocumentation.cxx b/Source/cmDocumentation.cxx
index 8c17536..4f34755 100644
--- a/Source/cmDocumentation.cxx
+++ b/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:
@@ -817,6 +819,19 @@ bool cmDocumentation::PrintHelpListPolicies(std::ostream& os)
 }
 
 //----------------------------------------------------------------------------
+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)
 {
   std::string vname = cmSystemTools::HelpFileName(this->CurrentArgument);
diff --git a/Source/cmDocumentation.h b/Source/cmDocumentation.h
index b72b5fe..8854c36 100644
--- a/Source/cmDocumentation.h
+++ b/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;
diff --git a/Source/cmDocumentationFormatter.h b/Source/cmDocumentationFormatter.h
index 59513cc..6e19b7d 100644
--- a/Source/cmDocumentationFormatter.h
+++ b/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
   };
diff --git a/Source/cmake.cxx b/Source/cmake.cxx
index 51df7f2..5971e1f 100644
--- a/Source/cmake.cxx
+++ b/Source/cmake.cxx
@@ -816,6 +816,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];
@@ -824,8 +825,10 @@ void cmake::SetArgs(const std::vector<std::string>& args,
         this->CreateGlobalGenerator(value);
       if(!gen)
         {
+        cmDocumentation doc;
         cmSystemTools::Error("Could not create named generator ",
                              value.c_str());
+        this->PrintGeneratorList();
         }
       else
         {
@@ -1923,6 +1926,17 @@ void cmake::GetGeneratorDocumentation(std::vector<cmDocumentationEntry>& v)
     }
 }
 
+void cmake::PrintGeneratorList()
+{
+  cmDocumentation doc;
+  std::vector<cmDocumentationEntry> generators;
+  this->GetGeneratorDocumentation(generators);
+  doc.AppendSection("Generators",generators);
+  std::cerr << "\n";
+  doc.PrintDocumentation(cmDocumentation::ListGenerators, std::cerr);
+}
+
+
 void cmake::UpdateConversionPathTable()
 {
   // Update the path conversion table with any specified file:
@@ -2408,6 +2422,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];
@@ -2418,6 +2433,7 @@ int cmake::GetSystemInformation(std::vector<std::string>& args)
         {
         cmSystemTools::Error("Could not create named generator ",
                              value.c_str());
+        this->PrintGeneratorList();
         }
       else
         {
diff --git a/Source/cmake.h b/Source/cmake.h
index 60ffcd4..9064122 100644
--- a/Source/cmake.h
+++ b/Source/cmake.h
@@ -468,6 +468,9 @@ private:
   InstalledFilesMap InstalledFiles;
 
   void UpdateConversionPathTable();
+
+  // Print a list of valid generators to stderr.
+  void PrintGeneratorList();
 };
 
 #define CMAKE_STANDARD_OPTIONS_TABLE \
-- 
1.9.5 (Apple Git-50.3)



More information about the cmake-developers mailing list