Hi,
the appended patch extends cmake so that it is able to search cmake
modules based on the current root dir (subdirectory cmake/Modules) and
if in the current directory is a CMakeCache.txt also in the related
source root.
There may be additional usefull features in cmake like extending the
help-module-list command to list all available modules or extending the
help-command[list]} command with project specific macros, but those are
not covered by this patch.
Regards
Ralf
Index: Source/cmDocumentation.cxx
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/cmDocumentation.cxx,v
retrieving revision 1.49
diff -u -r1.49 cmDocumentation.cxx
--- Source/cmDocumentation.cxx 9 Aug 2007 12:48:56 -0000 1.49
+++ Source/cmDocumentation.cxx 18 Sep 2007 16:19:53 -0000
@@ -303,6 +303,21 @@
{
delete [] *i;
}
+
+ for(std::vector< char* >::iterator i = this->RootPaths.begin();
+ i != this->RootPaths.end(); ++i)
+ {
+ delete [] *i;
+ }
+}
+
+//----------------------------------------------------------------------------
+void cmDocumentation::AddRootPath(const char* _root)
+{
+ std::cerr << __FUNCTION__ << " " << _root << "\n" << std::endl;
+
+ char* proot = strcpy(new char[strlen(_root)+1], _root);
+ this->RootPaths.push_back(proot);
}
//----------------------------------------------------------------------------
@@ -407,30 +422,34 @@
//----------------------------------------------------------------------------
bool cmDocumentation::CreateModulesSection()
{
- std::string cmakeModules = this->CMakeRoot;
- cmakeModules += "/Modules";
- cmsys::Directory dir;
- dir.Load(cmakeModules.c_str());
- if (dir.GetNumberOfFiles() > 0)
+ for(std::vector< char* >::iterator i = RootPaths.begin();
+ i != RootPaths.end(); ++i)
{
- this->ModulesSection.Append(cmDocumentationModulesHeader[0]);
- for(unsigned int i = 0; i < dir.GetNumberOfFiles(); ++i)
- {
- std::string fname = dir.GetFile(i);
- if(fname.length() > 6)
+ std::string cmakeModules = *i;
+ cmakeModules += "/Modules";
+ cmsys::Directory dir;
+ dir.Load(cmakeModules.c_str());
+ if (dir.GetNumberOfFiles() > 0)
{
- if(fname.substr(fname.length()-6, 6) == ".cmake")
+ this->ModulesSection.Append(cmDocumentationModulesHeader[0]);
+ for(unsigned int i = 0; i < dir.GetNumberOfFiles(); ++i)
{
- std::string moduleName = fname.substr(0, fname.length()-6);
- std::string path = cmakeModules;
- path += "/";
- path += fname;
- this->CreateSingleModule(path.c_str(), moduleName.c_str());
- }
+ std::string fname = dir.GetFile(i);
+ if(fname.length() > 6)
+ {
+ if(fname.substr(fname.length()-6, 6) == ".cmake")
+ {
+ std::string moduleName = fname.substr(0, fname.length()-6);
+ std::string path = cmakeModules;
+ path += "/";
+ path += fname;
+ this->CreateSingleModule(path.c_str(), moduleName.c_str());
+ }
+ }
+ }
+ cmDocumentationEntry e = { 0, 0, 0, 0 };
+ this->ModulesSection.Append(e);
}
- }
- cmDocumentationEntry e = { 0, 0, 0 };
- this->ModulesSection.Append(e);
}
return true;
}
@@ -508,11 +527,13 @@
}
char* pname = strcpy(new char[strlen(moduleName)+1], moduleName);
char* ptext = strcpy(new char[text.length()+1], text.c_str());
+ char* ppath = strcpy(new char[strlen(fname)+1], fname);
this->ModuleStrings.push_back(pname);
this->ModuleStrings.push_back(ptext);
char* pbrief = strcpy(new char[brief.length()+1], brief.c_str());
this->ModuleStrings.push_back(pbrief);
- cmDocumentationEntry e = { pname, pbrief, ptext };
+ this->ModuleStrings.push_back(ppath);
+ cmDocumentationEntry e = { pname, pbrief, ptext , ppath};
this->ModulesSection.Append(e);
return true;
}
@@ -1391,23 +1412,32 @@
os << "Argument --help-module needs a module name.\n";
return false;
}
- std::string cmakeModules = this->CMakeRoot;
- cmakeModules += "/Modules/";
- cmakeModules += this->CurrentArgument;
- cmakeModules += ".cmake";
- if(cmSystemTools::FileExists(cmakeModules.c_str())
- && this->CreateSingleModule(cmakeModules.c_str(),
- this->CurrentArgument.c_str()))
- {
- this->PrintDocumentationCommand(os, this->ModulesSection.GetEntries());
- os << "\n Defined in: ";
- os << cmakeModules << "\n";
- return true;
+ bool found = false;
+ for(std::vector< char* >::iterator i = RootPaths.begin();
+ i != RootPaths.end(); ++i)
+ {
+ std::string cmakeModules = *i;
+ cmakeModules += "/Modules/";
+ cmakeModules += this->CurrentArgument;
+ cmakeModules += ".cmake";
+ if(cmSystemTools::FileExists(cmakeModules.c_str())
+ && this->CreateSingleModule(cmakeModules.c_str(),
+ this->CurrentArgument.c_str()))
+ {
+ this->PrintDocumentationCommand(os,
this->ModulesSection.GetEntries());
+ os << "\n Defined in: ";
+ os << cmakeModules << "\n";
+ found = true;
+ }
+ }
+ if (!found)
+ {
+ // Argument was not a module. Complain.
+ os << "Argument \"" << this->CurrentArgument.c_str()
+ << "\" to --help-module is not a CMake module.";
+ return false;
}
- // Argument was not a module. Complain.
- os << "Argument \"" << this->CurrentArgument.c_str()
- << "\" to --help-module is not a CMake module.";
- return false;
+ return true;
}
//----------------------------------------------------------------------------
@@ -1527,7 +1557,9 @@
{
if(entry->name)
{
- os << entry->name << std::endl;
+ char buf[1024];
+ sprintf(buf,"%-20s %s",entry->name,entry->path);
+ os << buf << std::endl;
}
}
return true;
Index: Source/cmDocumentation.h
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/cmDocumentation.h,v
retrieving revision 1.26
diff -u -r1.26 cmDocumentation.h
--- Source/cmDocumentation.h 11 Jul 2007 19:53:58 -0000 1.26
+++ Source/cmDocumentation.h 6 Aug 2007 19:28:05 -0000
@@ -170,8 +170,8 @@
/** Clear all previously added sections of help. */
void ClearSections();
- /** Set cmake root so we can find installed files */
- void SetCMakeRoot(const char* root) { this->CMakeRoot = root;}
+ /** add root path so we can find installed files */
+ void AddRootPath(const char* root);
static Form GetFormFromFilename(const std::string& filename);
@@ -260,7 +260,7 @@
std::map<cmProperty::ScopeType, cmSection*> PropertySections;
std::string SeeAlsoString;
- std::string CMakeRoot;
+ std::vector< char* > RootPaths;
std::vector< char* > ModuleStrings;
std::vector< const char* > Names;
std::vector< const cmDocumentationEntry* > Sections;
Index: Source/cmStandardIncludes.h
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/cmStandardIncludes.h,v
retrieving revision 1.67
diff -u -r1.67 cmStandardIncludes.h
--- Source/cmStandardIncludes.h 29 Aug 2006 14:27:50 -0000 1.67
+++ Source/cmStandardIncludes.h 18 Sep 2007 16:27:47 -0000
@@ -319,6 +319,7 @@
const char* name;
const char* brief;
const char* full;
+ const char* path;
};
/** Data structure to represent a single command line. */
Index: Source/cmakemain.cxx
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/cmakemain.cxx,v
retrieving revision 1.66
diff -u -r1.66 cmakemain.cxx
--- Source/cmakemain.cxx 19 Jul 2007 15:13:01 -0000 1.66
+++ Source/cmakemain.cxx 18 Sep 2007 16:09:04 -0000
@@ -276,7 +276,34 @@
// Construct and print requested documentation.
cmake hcm;
hcm.AddCMakePaths(av[0]);
- doc.SetCMakeRoot(hcm.GetCacheDefinition("CMAKE_ROOT"));
+
+ std::string rootPath;
+ rootPath = cmSystemTools::GetCurrentWorkingDirectory();
+ doc.AddRootPath(rootPath.c_str());
+ rootPath += "/cmake";
+ doc.AddRootPath(rootPath.c_str());
+
+ std::string cachePath;
+ cachePath = cmSystemTools::GetCurrentWorkingDirectory();
+ std::string path = cmSystemTools::CollapseFullPath(cachePath.c_str());
+ cmSystemTools::ConvertToUnixSlashes(path);
+ std::string cacheFile = path;
+ cacheFile += "/CMakeCache.txt";
+ if(cmSystemTools::FileExists(cacheFile.c_str()))
+ {
+ cmCacheManager cachem;
+ cmCacheManager::CacheIterator it = cachem.NewIterator();
+ if(cachem.LoadCache(cachePath.c_str()) &&
+ it.Find("CMAKE_HOME_DIRECTORY"))
+ {
+ rootPath = it.GetValue();
+ doc.AddRootPath(rootPath.c_str());
+ rootPath += "/cmake";
+ doc.AddRootPath(rootPath.c_str());
+ }
+ }
+ doc.AddRootPath(hcm.GetCacheDefinition("CMAKE_ROOT"));
+
std::vector<cmDocumentationEntry> commands;
std::vector<cmDocumentationEntry> compatCommands;
std::vector<cmDocumentationEntry> globalProperties;
_______________________________________________
Kde-buildsystem mailing list
Kde-buildsystem@kde.org
https://mail.kde.org/mailman/listinfo/kde-buildsystem