From a6bce55aefd332f148a2753d5be0ec4383534473 Mon Sep 17 00:00:00 2001
From: Eric NOULARD <eric.noulard@gmail.com>
Date: Sat, 18 Feb 2012 22:07:39 +0100
Subject: Dynamically add documentation section specified in documented script.

Modify CPackDeb and CPackRPM as an example
---
 Modules/CPackDeb.cmake     |  2 +-
 Modules/CPackRPM.cmake     |  2 +-
 Source/CPack/cpack.cxx     |  3 +--
 Source/cmDocumentation.cxx | 21 ++++++++++++++++++---
 Source/cmDocumentation.h   |  6 ++++--
 5 files changed, 25 insertions(+), 9 deletions(-)

diff --git a/Modules/CPackDeb.cmake b/Modules/CPackDeb.cmake
index 0916843..fe81dc9 100644
--- a/Modules/CPackDeb.cmake
+++ b/Modules/CPackDeb.cmake
@@ -1,4 +1,4 @@
-##section Variables specific to a CPack generator
+##section Variables specific to CPack Debian (DEB) generator
 ##end
 ##module
 # - The builtin (binary) CPack Deb generator (Unix only)
diff --git a/Modules/CPackRPM.cmake b/Modules/CPackRPM.cmake
index f76e91e..ae81ab7 100644
--- a/Modules/CPackRPM.cmake
+++ b/Modules/CPackRPM.cmake
@@ -1,4 +1,4 @@
-##section Variables specific to a CPack generator
+##section Variables specific to CPack RPM generator
 ##end
 ##module
 # - The builtin (binary) CPack RPM generator (Unix only)
diff --git a/Source/CPack/cpack.cxx b/Source/CPack/cpack.cxx
index c541610..6f5055c 100644
--- a/Source/CPack/cpack.cxx
+++ b/Source/CPack/cpack.cxx
@@ -514,7 +514,6 @@ int main (int argc, char *argv[])
   if ( help )
     {
     // Construct and print requested documentation.
-    std::vector<cmDocumentationEntry> variables;
 
     doc.SetName("cpack");
     doc.SetSection("Name",cmDocumentationName);
@@ -545,7 +544,7 @@ int main (int argc, char *argv[])
       {
           doc.GetStructuredDocFromFile(
               (docedIt->first).c_str(),
-              commands,&cminst,(docedIt->second).c_str());
+              commands,&cminst);
       }
 
     std::map<std::string,cmDocumentationSection *> propDocs;
diff --git a/Source/cmDocumentation.cxx b/Source/cmDocumentation.cxx
index 02f69f1..17e35d8 100644
--- a/Source/cmDocumentation.cxx
+++ b/Source/cmDocumentation.cxx
@@ -745,6 +745,18 @@ void cmDocumentation::addCPackStandardDocSections()
             "Variables specific to a CPack generator");
 }
 
+void cmDocumentation::addAutomaticVariableSections(const std::string& section)
+{
+  std::vector<std::string>::iterator it;
+  it = find(this->VariableSections.begin(),
+            this->VariableSections.end(),
+            section);
+  /* if the section does not exist then add it */
+  if (it==this->VariableSections.end())
+    {
+    this->VariableSections.push_back(section);
+    }
+}
 //----------------------------------------------------------------------------
 int cmDocumentation::getDocumentedModulesListInDir(
           std::string path,
@@ -818,8 +830,7 @@ static void trim(std::string& s)
 int cmDocumentation::GetStructuredDocFromFile(
         const char* fname,
         std::vector<cmDocumentationEntry>& commands,
-        cmake* cm,
-        const char *docSection)
+        cmake* cm)
 {
     typedef enum sdoce {
         SDOC_NONE, SDOC_MODULE, SDOC_MACRO, SDOC_FUNCTION, SDOC_VARIABLE,
@@ -835,6 +846,7 @@ int cmDocumentation::GetStructuredDocFromFile(
       {
       return nbDocItemFound;
       }
+    std::string section;
     std::string name;
     std::string full;
     std::string brief;
@@ -886,6 +898,8 @@ int cmDocumentation::GetStructuredDocFromFile(
             {
                docCtxIdx++;
                docContextStack[docCtxIdx]=SDOC_SECTION;
+               // 10 is the size of '##section' + 1
+               section = line.substr(10,std::string::npos);
                /* drop the rest of the line */
                line = "";
                newCtx = true;
@@ -900,11 +914,12 @@ int cmDocumentation::GetStructuredDocFromFile(
                            brief.c_str(),full.c_str()));
                    break;
                case SDOC_VARIABLE:
+                   this->addAutomaticVariableSections(section);
                    cm->DefineProperty
                        (name.c_str(), cmProperty::VARIABLE,
                         brief.c_str(),
                         full.c_str(),false,
-                        docSection);
+                        section.c_str());
                    break;
                case SDOC_MODULE:
                    /*  not implemented */
diff --git a/Source/cmDocumentation.h b/Source/cmDocumentation.h
index 00dba1a..11bef16 100644
--- a/Source/cmDocumentation.h
+++ b/Source/cmDocumentation.h
@@ -147,6 +147,9 @@ public:
   /** Add the CPack standard documentation section(s) */
   void addCPackStandardDocSections();
 
+  /** Add automatic variables sections */
+  void addAutomaticVariableSections(const std::string& section);
+
   /**
    * Retrieve the list of documented module located in
    * path which match the globing expression globExpr.
@@ -185,8 +188,7 @@ public:
    */
   int GetStructuredDocFromFile(const char* fname,
                                std::vector<cmDocumentationEntry>& commands,
-                               cmake* cm,
-                               const char *docSection);
+                               cmake* cm);
 private:
   void SetForm(Form f);
   void SetDocName(const char* docname);
-- 
cgit v0.12