summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric NOULARD <eric.noulard@gmail.com>2012-02-02 00:44:21 (GMT)
committerDavid Cole <david.cole@kitware.com>2012-02-14 21:05:23 (GMT)
commit543f1adfa4a8f2f38371512ffcb8c252332acb18 (patch)
tree8cccca965044622c799f5a147356744fb405cb85
parentcdbd1a9e39e79fe2f29dff3c3a7b9cf9c9fae3cc (diff)
downloadCMake-543f1adfa4a8f2f38371512ffcb8c252332acb18.zip
CMake-543f1adfa4a8f2f38371512ffcb8c252332acb18.tar.gz
CMake-543f1adfa4a8f2f38371512ffcb8c252332acb18.tar.bz2
Make the load of script documentation more efficient and dynamic.
CPack help will be searched in any CPack*.cmake file located near to CPack.cmake file. The script files is parsed iff the first line begin with ##section. Moreover the documentation section name is specified on the remaining part of the line minus the space immediately following ##section.
-rw-r--r--Modules/CPack.cmake22
-rw-r--r--Modules/CPackDeb.cmake4
-rw-r--r--Modules/CPackRPM.cmake4
-rw-r--r--Source/CPack/cpack.cxx60
-rw-r--r--Source/cmDocumentation.cxx20
5 files changed, 85 insertions, 25 deletions
diff --git a/Modules/CPack.cmake b/Modules/CPack.cmake
index 1718008..8a44991 100644
--- a/Modules/CPack.cmake
+++ b/Modules/CPack.cmake
@@ -1,3 +1,6 @@
+##section Variables common to all CPack generators
+##end
+##module
# - Build binary and source package installers.
# The CPack module generates binary and source installers in a variety
# of formats using the cpack program. Inclusion of the CPack module
@@ -28,16 +31,16 @@
# on a per-generator basis. It only need contain overrides.
#
# Here's how it works:
-# - cpack runs
-# - it includes CPackConfig.cmake
-# - it iterates over the generators listed in that file's
-# CPACK_GENERATOR list variable (unless told to use just a
-# specific one via -G on the command line...)
+# - cpack runs
+# - it includes CPackConfig.cmake
+# - it iterates over the generators listed in that file's
+# CPACK_GENERATOR list variable (unless told to use just a
+# specific one via -G on the command line...)
#
-# - foreach generator, it then
-# - sets CPACK_GENERATOR to the one currently being iterated
-# - includes the CPACK_PROJECT_CONFIG_FILE
-# - produces the package for that generator
+# - foreach generator, it then
+# - sets CPACK_GENERATOR to the one currently being iterated
+# - includes the CPACK_PROJECT_CONFIG_FILE
+# - produces the package for that generator
#
# This is the key: For each generator listed in CPACK_GENERATOR
# in CPackConfig.cmake, cpack will *reset* CPACK_GENERATOR
@@ -47,6 +50,7 @@
# Before including this CPack module in your CMakeLists.txt file,
# there are a variety of variables that can be set to customize
# the resulting installers. The most commonly-used variables are:
+##end
#
##variable
# CPACK_PACKAGE_NAME - The name of the package (or application). If
diff --git a/Modules/CPackDeb.cmake b/Modules/CPackDeb.cmake
index fc7f992..0916843 100644
--- a/Modules/CPackDeb.cmake
+++ b/Modules/CPackDeb.cmake
@@ -1,3 +1,6 @@
+##section Variables specific to a CPack generator
+##end
+##module
# - The builtin (binary) CPack Deb generator (Unix only)
# CPackDeb may be used to create Deb package using CPack.
# CPackDeb is a CPack generator thus it uses the CPACK_XXX variables
@@ -11,6 +14,7 @@
# the wiki:
# http://www.cmake.org/Wiki/CMake:CPackPackageGenerators#DEB_.28UNIX_only.29
# However as a handy reminder here comes the list of specific variables:
+##end
#
##variable
# CPACK_DEBIAN_PACKAGE_NAME
diff --git a/Modules/CPackRPM.cmake b/Modules/CPackRPM.cmake
index de06fef..f76e91e 100644
--- a/Modules/CPackRPM.cmake
+++ b/Modules/CPackRPM.cmake
@@ -1,5 +1,7 @@
-# - The builtin (binary) CPack RPM generator (Unix only)
+##section Variables specific to a CPack generator
+##end
##module
+# - The builtin (binary) CPack RPM generator (Unix only)
# CPackRPM may be used to create RPM package using CPack.
# CPackRPM is a CPack generator thus it uses the CPACK_XXX variables
# used by CPack : http://www.cmake.org/Wiki/CMake:CPackConfiguration
diff --git a/Source/CPack/cpack.cxx b/Source/CPack/cpack.cxx
index 4117971..25a72fa 100644
--- a/Source/CPack/cpack.cxx
+++ b/Source/CPack/cpack.cxx
@@ -26,6 +26,8 @@
#include "cmCPackLog.h"
#include <cmsys/CommandLineArguments.hxx>
+#include <cmsys/Glob.hxx>
+#include <cmsys/SystemTools.hxx>
#include <memory> // auto_ptr
//----------------------------------------------------------------------------
@@ -527,22 +529,54 @@ int main (int argc, char *argv[])
typedef std::pair<std::string,std::string> docModuleSectionPair_t;
typedef std::list<docModuleSectionPair_t> docedModulesList_t;
- docedModulesList_t docedModList;
+ docedModulesList_t docedModList;
docModuleSectionPair_t docPair;
std::string docedFile;
- // build the list of files to be parsed for documentation
- // extraction
- docPair.first = "CPack.cmake";
- docPair.second = "Variables common to all CPack generators";
- docedModList.push_back(docPair);
- docPair.first = "CPackComponent.cmake";
- docedModList.push_back(docPair);
- docPair.first = "CPackRPM.cmake";
- docPair.second = "Variables specific to a CPack generator";
- docedModList.push_back(docPair);
- docPair.first = "CPackDeb.cmake";
- docedModList.push_back(docPair);
+ cmsys::Glob gl;
+ std::string findExpr;
+ std::vector<std::string> files;
+ std::string line;
+ docedFile = globalMF->GetModulesFile("CPack.cmake");
+ if (docedFile.length()!=0)
+ {
+ findExpr += cmSystemTools::GetFilenamePath(docedFile.c_str());
+ findExpr += "/CPack*.cmake";
+ if (gl.FindFiles(findExpr))
+ {
+ files = gl.GetFiles();
+ for (std::vector<std::string>::iterator itf=files.begin();
+ itf!=files.end();++itf)
+ {
+ std::ifstream fin((*itf).c_str());
+ if (!fin) continue;
+ if (cmSystemTools::GetLineFromStream(fin, line))
+ {
+ if (line.find("##section")!=std::string::npos)
+ {
+ docPair.first = cmSystemTools::GetFilenameName(*itf);
+ // 10 is the size of '##section' + 1
+ docPair.second = line.substr(10,std::string::npos);
+ docedModList.push_back(docPair);
+ }
+ }
+ else
+ {
+ line.clear();
+ }
+ }
+ }
+ else
+ {
+ // build the list of files to be parsed for documentation
+ // extraction
+ docPair.first = "CPack.cmake";
+ docPair.second = "Variables common to all CPack generators";
+ docedModList.push_back(docPair);
+ docPair.first = "CPackComponent.cmake";
+ docedModList.push_back(docPair);
+ }
+ }
// parse the files for documentation.
for (docedModulesList_t::iterator it = docedModList.begin();
diff --git a/Source/cmDocumentation.cxx b/Source/cmDocumentation.cxx
index 80f74a6..ed1e5e1 100644
--- a/Source/cmDocumentation.cxx
+++ b/Source/cmDocumentation.cxx
@@ -768,6 +768,7 @@ int cmDocumentation::GetStructuredDocFromFile(
{
typedef enum sdoce {
SDOC_NONE, SDOC_MODULE, SDOC_MACRO, SDOC_FUNCTION, SDOC_VARIABLE,
+ SDOC_SECTION,
SDOC_UNKNOWN} sdoc_t;
int nbDocItemFound = 0;
int docCtxIdx = 0;
@@ -795,9 +796,13 @@ int cmDocumentation::GetStructuredDocFromFile(
if(line.size() && line[0] == '#')
{
/* handle structured doc context */
- if (line[1]=='#')
+ if ((line.size()>=2) && line[1]=='#')
{
- std::string mkword = line.substr(2,std::string::npos);
+ /* markup word is following '##' stopping at first space
+ * Some markup word like 'section' may have more characters
+ * following but we don't handle those here.
+ */
+ std::string mkword = line.substr(2,line.find(' ',2)-2);
if (mkword=="macro")
{
docCtxIdx++;
@@ -822,6 +827,14 @@ int cmDocumentation::GetStructuredDocFromFile(
docContextStack[docCtxIdx]=SDOC_MODULE;
newCtx = true;
}
+ else if (mkword=="section")
+ {
+ docCtxIdx++;
+ docContextStack[docCtxIdx]=SDOC_SECTION;
+ /* drop the rest of the line */
+ line.clear();
+ newCtx = true;
+ }
else if (mkword.substr(0,3)=="end")
{
switch (docContextStack[docCtxIdx]) {
@@ -841,6 +854,9 @@ int cmDocumentation::GetStructuredDocFromFile(
case SDOC_MODULE:
/* not implemented */
break;
+ case SDOC_SECTION:
+ /* not implemented */
+ break;
default:
/* ignore other cases */
break;