diff options
author | Tobias Hunger <tobias.hunger@qt.io> | 2016-07-20 16:28:39 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2016-08-03 13:43:00 (GMT) |
commit | a354f60ce07cd67bd60161824a4e74bf9068fea4 (patch) | |
tree | 14c272760205567469ddd856a99e98ace6282841 /Source/cmake.cxx | |
parent | fd59f9ad519c1c311c54569133797d9061e90558 (diff) | |
download | CMake-a354f60ce07cd67bd60161824a4e74bf9068fea4.zip CMake-a354f60ce07cd67bd60161824a4e74bf9068fea4.tar.gz CMake-a354f60ce07cd67bd60161824a4e74bf9068fea4.tar.bz2 |
Refactor extra generator registration to use factories
This will allow additional information about the availability
and capabilities of extra generators to be queried without
actually creating them.
Instead of a static NewFactory() method like the main generator
factories have, use a static GetFactory() method to get a pointer to a
statically allocated extra generator factory. This simplifies memory
management.
Diffstat (limited to 'Source/cmake.cxx')
-rw-r--r-- | Source/cmake.cxx | 145 |
1 files changed, 86 insertions, 59 deletions
diff --git a/Source/cmake.cxx b/Source/cmake.cxx index cdc1284..fb77043 100644 --- a/Source/cmake.cxx +++ b/Source/cmake.cxx @@ -793,53 +793,21 @@ int cmake::AddCMakePaths() return 1; } -void cmake::AddExtraGenerator(const std::string& name, - CreateExtraGeneratorFunctionType 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, name); - this->ExtraGenerators[fullName] = newFunction; - } - delete extraGenerator; -} - void cmake::AddDefaultExtraGenerators() { #if defined(CMAKE_BUILD_WITH_CMAKE) -#if defined(_WIN32) && !defined(__CYGWIN__) -// e.g. kdevelop4 ? -#endif - - this->AddExtraGenerator(cmExtraCodeBlocksGenerator::GetActualName(), - &cmExtraCodeBlocksGenerator::New); - this->AddExtraGenerator(cmExtraCodeLiteGenerator::GetActualName(), - &cmExtraCodeLiteGenerator::New); - this->AddExtraGenerator(cmExtraSublimeTextGenerator::GetActualName(), - &cmExtraSublimeTextGenerator::New); - this->AddExtraGenerator(cmExtraKateGenerator::GetActualName(), - &cmExtraKateGenerator::New); + this->ExtraGenerators.push_back(cmExtraCodeBlocksGenerator::GetFactory()); + this->ExtraGenerators.push_back(cmExtraCodeLiteGenerator::GetFactory()); + this->ExtraGenerators.push_back(cmExtraSublimeTextGenerator::GetFactory()); + this->ExtraGenerators.push_back(cmExtraKateGenerator::GetFactory()); #ifdef CMAKE_USE_ECLIPSE - this->AddExtraGenerator(cmExtraEclipseCDT4Generator::GetActualName(), - &cmExtraEclipseCDT4Generator::New); + this->ExtraGenerators.push_back(cmExtraEclipseCDT4Generator::GetFactory()); #endif #ifdef CMAKE_USE_KDEVELOP - this->AddExtraGenerator(cmGlobalKdevelopGenerator::GetActualName(), - &cmGlobalKdevelopGenerator::New); - // for kdevelop also add the generator with just the name of the - // extra generator, since it was this way since cmake 2.2 - this->ExtraGenerators[cmGlobalKdevelopGenerator::GetActualName()] = - &cmGlobalKdevelopGenerator::New; + this->ExtraGenerators.push_back(cmGlobalKdevelopGenerator::GetFactory()); #endif - #endif } @@ -856,32 +824,74 @@ void cmake::GetRegisteredGenerators(std::vector<GeneratorInfo>& generators) info.supportsToolset = (*i)->SupportsToolset(); info.supportsPlatform = (*i)->SupportsPlatform(); info.name = names[j]; + info.isAlias = false; generators.push_back(info); } } - for (RegisteredExtraGeneratorsMap::const_iterator + for (RegisteredExtraGeneratorsVector::const_iterator i = this->ExtraGenerators.begin(), e = this->ExtraGenerators.end(); i != e; ++i) { - GeneratorInfo info; - info.name = i->first; - info.supportsToolset = false; - info.supportsPlatform = false; - generators.push_back(info); + const std::vector<std::string> genList = + (*i)->GetSupportedGlobalGenerators(); + for (std::vector<std::string>::const_iterator gen = genList.begin(); + gen != genList.end(); ++gen) { + GeneratorInfo info; + info.name = cmExternalMakefileProjectGenerator::CreateFullGeneratorName( + (*i)->GetName(), *gen); + info.supportsPlatform = false; + info.supportsToolset = false; + info.isAlias = false; + generators.push_back(info); + } + for (std::vector<std::string>::const_iterator a = (*i)->Aliases.begin(); + a != (*i)->Aliases.end(); ++a) { + GeneratorInfo info; + info.name = *a; + info.supportsPlatform = false; + info.supportsToolset = false; + info.isAlias = true; + generators.push_back(info); + } } } -cmGlobalGenerator* cmake::CreateGlobalGenerator(const std::string& gname) +static std::pair<cmExternalMakefileProjectGenerator*, std::string> +createExtraGenerator( + const std::vector<cmExternalMakefileProjectGeneratorFactory*>& in, + const std::string& name) { - cmExternalMakefileProjectGenerator* extraGenerator = CM_NULLPTR; - std::string name = gname; - RegisteredExtraGeneratorsMap::const_iterator extraGenIt = - this->ExtraGenerators.find(name); - if (extraGenIt != this->ExtraGenerators.end()) { - extraGenerator = (extraGenIt->second)(); - name = extraGenerator->GetGlobalGeneratorName(name); + for (std::vector<cmExternalMakefileProjectGeneratorFactory*>::const_iterator + i = in.begin(); + i != in.end(); ++i) { + const std::vector<std::string> generators = + (*i)->GetSupportedGlobalGenerators(); + if ((*i)->GetName() == name) { // Match aliases + return std::make_pair((*i)->CreateExternalMakefileProjectGenerator(), + generators.at(0)); + } + for (std::vector<std::string>::const_iterator g = generators.begin(); + g != generators.end(); ++g) { + const std::string fullName = + cmExternalMakefileProjectGenerator::CreateFullGeneratorName( + *g, (*i)->GetName()); + if (fullName == name) { + return std::make_pair((*i)->CreateExternalMakefileProjectGenerator(), + *g); + } + } } + return std::make_pair( + static_cast<cmExternalMakefileProjectGenerator*>(CM_NULLPTR), name); +} + +cmGlobalGenerator* cmake::CreateGlobalGenerator(const std::string& gname) +{ + std::pair<cmExternalMakefileProjectGenerator*, std::string> extra = + createExtraGenerator(this->ExtraGenerators, gname); + cmExternalMakefileProjectGenerator* extraGenerator = extra.first; + const std::string name = extra.second; cmGlobalGenerator* generator = CM_NULLPTR; for (RegisteredGeneratorsVector::const_iterator i = this->Generators.begin(); @@ -1651,15 +1661,32 @@ void cmake::GetGeneratorDocumentation(std::vector<cmDocumentationEntry>& v) (*i)->GetDocumentation(e); v.push_back(e); } - for (RegisteredExtraGeneratorsMap::const_iterator i = + for (RegisteredExtraGeneratorsVector::const_iterator i = this->ExtraGenerators.begin(); i != this->ExtraGenerators.end(); ++i) { - cmDocumentationEntry e; - cmExternalMakefileProjectGenerator* generator = (i->second)(); - generator->GetDocumentation(e, i->first); - e.Name = i->first; - delete generator; - v.push_back(e); + const std::string doc = (*i)->GetDocumentation(); + const std::string name = (*i)->GetName(); + + // Aliases: + for (std::vector<std::string>::const_iterator a = (*i)->Aliases.begin(); + a != (*i)->Aliases.end(); ++a) { + cmDocumentationEntry e; + e.Name = *a; + e.Brief = doc; + v.push_back(e); + } + + // Full names: + const std::vector<std::string> generators = + (*i)->GetSupportedGlobalGenerators(); + for (std::vector<std::string>::const_iterator g = generators.begin(); + g != generators.end(); ++g) { + cmDocumentationEntry e; + e.Name = + cmExternalMakefileProjectGenerator::CreateFullGeneratorName(*g, name); + e.Brief = doc; + v.push_back(e); + } } } |