summaryrefslogtreecommitdiffstats
path: root/Source/cmake.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'Source/cmake.cxx')
-rw-r--r--Source/cmake.cxx93
1 files changed, 78 insertions, 15 deletions
diff --git a/Source/cmake.cxx b/Source/cmake.cxx
index d6d56d0..a040b55 100644
--- a/Source/cmake.cxx
+++ b/Source/cmake.cxx
@@ -169,6 +169,7 @@ cmake::cmake()
#endif
this->AddDefaultGenerators();
+ this->AddDefaultExtraGenerators();
this->AddDefaultCommands();
// Make sure we can capture the build tool output.
@@ -1405,6 +1406,40 @@ int cmake::ExecuteCMakeCommand(std::vector<std::string>& args)
return 1;
}
+void cmake::AddExtraGenerator(const char* name,
+ CreateExtraGeneratorFunctionType newFunction)
+{
+ this->ExtraGenerators[name] = newFunction;
+ cmExternalMakefileProjectGenerator* extraGenerator = newFunction();
+ const std::vector<std::string>& supportedGlobalGenerators =
+ extraGenerator->GetSupportedGlobalGenerators();
+
+ for(std::vector<std::string>::const_iterator
+ it = supportedGlobalGenerators.begin();
+ it != supportedGlobalGenerators.end();
+ ++it )
+ {
+ std::string fullName = cmExternalMakefileProjectGenerator::
+ CreateFullGeneratorName(it->c_str(), name);
+ this->ExtraGenerators[fullName.c_str()] = newFunction;
+ }
+ delete extraGenerator;
+}
+
+void cmake::AddDefaultExtraGenerators()
+{
+#if defined(_WIN32) && !defined(__CYGWIN__)
+# if !defined(CMAKE_BOOT_MINGW)
+ // e.g. codeblocks, kdevelop4 ?
+# endif
+#endif
+// e.g. eclipse ?
+#ifdef CMAKE_USE_KDEVELOP
+ this->AddExtraGenerator(cmGlobalKdevelopGenerator::GetActualName(), &cmGlobalKdevelopGenerator::New);
+#endif
+}
+
+
//----------------------------------------------------------------------------
void cmake::GetRegisteredGenerators(std::vector<std::string>& names)
{
@@ -1417,17 +1452,30 @@ void cmake::GetRegisteredGenerators(std::vector<std::string>& names)
cmGlobalGenerator* cmake::CreateGlobalGenerator(const char* name)
{
- RegisteredGeneratorsMap::const_iterator i = this->Generators.find(name);
- if(i != this->Generators.end())
+ cmGlobalGenerator* generator = 0;
+ cmExternalMakefileProjectGenerator* extraGenerator = 0;
+ RegisteredGeneratorsMap::const_iterator genIt = this->Generators.find(name);
+ if(genIt == this->Generators.end())
{
- cmGlobalGenerator* generator = (i->second)();
- generator->SetCMakeInstance(this);
- return generator;
- }
- else
- {
- return 0;
- }
+ RegisteredExtraGeneratorsMap::const_iterator extraGenIt =
+ this->ExtraGenerators.find(name);
+ if (extraGenIt == this->ExtraGenerators.end())
+ {
+ return 0;
+ }
+ extraGenerator = (extraGenIt->second)();
+ genIt=this->Generators.find(extraGenerator->GetGlobalGeneratorName(name));
+ if(genIt == this->Generators.end())
+ {
+ delete extraGenerator;
+ return 0;
+ }
+ }
+
+ generator = (genIt->second)();
+ generator->SetCMakeInstance(this);
+ generator->SetExternalMakefileProjectGenerator(extraGenerator);
+ return generator;
}
void cmake::SetHomeDirectory(const char* dir)
@@ -1599,9 +1647,13 @@ int cmake::Configure()
{
const char* genName =
this->CacheManager->GetCacheValue("CMAKE_GENERATOR");
+ const char* extraGenName =
+ this->CacheManager->GetCacheValue("CMAKE_EXTRA_GENERATOR");
if(genName)
{
- this->GlobalGenerator = this->CreateGlobalGenerator(genName);
+ std::string fullName = cmExternalMakefileProjectGenerator::
+ CreateFullGeneratorName(genName, extraGenName);
+ this->GlobalGenerator = this->CreateGlobalGenerator(fullName.c_str());
}
if(this->GlobalGenerator)
{
@@ -1688,6 +1740,10 @@ int cmake::Configure()
this->GlobalGenerator->GetName(),
"Name of generator.",
cmCacheManager::INTERNAL);
+ this->CacheManager->AddCacheEntry("CMAKE_EXTRA_GENERATOR",
+ this->GlobalGenerator->GetExtraGeneratorName(),
+ "Name of external makefile project generator.",
+ cmCacheManager::INTERNAL);
}
// reset any system configuration information, except for when we are
@@ -1750,6 +1806,7 @@ int cmake::Configure()
// We must have a bad generator selection. Wipe the cache entry so the
// user can select another.
this->CacheManager->RemoveCacheEntry("CMAKE_GENERATOR");
+ this->CacheManager->RemoveCacheEntry("CMAKE_EMP_GENERATOR");
}
// only save the cache if there were no fatal errors
if ( !this->ScriptMode )
@@ -2001,10 +2058,6 @@ void cmake::AddDefaultGenerators()
this->Generators[cmGlobalXCodeGenerator::GetActualName()] =
&cmGlobalXCodeGenerator::New;
#endif
-#ifdef CMAKE_USE_KDEVELOP
- this->Generators[cmGlobalKdevelopGenerator::GetActualName()] =
- &cmGlobalKdevelopGenerator::New;
-#endif
}
int cmake::LoadCache()
@@ -2121,6 +2174,16 @@ void cmake::GetGeneratorDocumentation(std::vector<cmDocumentationEntry>& v)
delete generator;
v.push_back(e);
}
+ for(RegisteredExtraGeneratorsMap::const_iterator
+ i = this->ExtraGenerators.begin(); i != this->ExtraGenerators.end(); ++i)
+ {
+ cmDocumentationEntry e;
+ cmExternalMakefileProjectGenerator* generator = (i->second)();
+ generator->GetDocumentation(e, i->first.c_str());
+ e.name = i->first.c_str();
+ delete generator;
+ v.push_back(e);
+ }
cmDocumentationEntry empty = {0,0,0};
v.push_back(empty);
}