diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx index 753221de7..396d76ee4 100644 --- a/Source/cmGlobalGenerator.cxx +++ b/Source/cmGlobalGenerator.cxx @@ -554,6 +554,9 @@ void cmGlobalGenerator::Configure() "Please set the following variables:\n", notFoundVars.c_str()); } + // at this point m_LocalGenerators has been filled, + // so create the map from project name to vector of local generators + this->FillProjectMap(); if ( !m_CMakeInstance->GetScriptMode() ) { m_CMakeInstance->UpdateProgress("Configuring done", -1); @@ -774,3 +777,24 @@ const char* cmGlobalGenerator::GetLinkerPreference(const char* lang) } return "None"; } + + +void cmGlobalGenerator::FillProjectMap() +{ + unsigned int i; + for(i = 0; i < m_LocalGenerators.size(); ++i) + { + std::string name = m_LocalGenerators[i]->GetMakefile()->GetProjectName(); + // for each local generator add the local generator to the project that + // it is in + m_ProjectMap[name].push_back(m_LocalGenerators[i]); + // now add the local generator to any parent project it is part of + std::vector const& pprojects + = m_LocalGenerators[i]->GetMakefile()->GetParentProjects(); + for(unsigned int k =0; k < pprojects.size(); ++k) + { + m_ProjectMap[pprojects[k]].push_back(m_LocalGenerators[i]); + } + } + +} diff --git a/Source/cmGlobalGenerator.h b/Source/cmGlobalGenerator.h index 89441dcbb..e1ebe2066 100644 --- a/Source/cmGlobalGenerator.h +++ b/Source/cmGlobalGenerator.h @@ -116,6 +116,8 @@ public: ///! What is the output extension for a given source file extension. const char* GetLanguageOutputExtensionFromExtension(const char* lang); protected: + // Fill the m_ProjectMap, this must be called after m_LocalGenerators has been populated. + void FillProjectMap(); bool IsExcluded(cmLocalGenerator* root, cmLocalGenerator* gen); void FindMakeProgram(cmMakefile*); @@ -124,6 +126,8 @@ protected: cmStdString m_ConfiguredFilesPath; cmake *m_CMakeInstance; std::vector m_LocalGenerators; + // map from project name to vector of local generators in that project + std::map > m_ProjectMap; ///! used by Configure() void RecursiveConfigure(cmLocalGenerator *lg, float start, float end); @@ -136,7 +140,7 @@ private: std::map m_OutputExtensions; std::map m_LanguageToOutputExtension; std::map m_ExtensionToLanguage; - std::map m_LanguageToLinkerPreference; + std::map m_LanguageToLinkerPreference; }; #endif diff --git a/Source/cmGlobalVisualStudio6Generator.cxx b/Source/cmGlobalVisualStudio6Generator.cxx index 8a017e131..aa17ed9ff 100644 --- a/Source/cmGlobalVisualStudio6Generator.cxx +++ b/Source/cmGlobalVisualStudio6Generator.cxx @@ -159,14 +159,11 @@ cmLocalGenerator *cmGlobalVisualStudio6Generator::CreateLocalGenerator() void cmGlobalVisualStudio6Generator::Generate() { - // collect sub-projects - this->CollectSubprojects(); - // add a special target that depends on ALL projects for easy build // of one configuration only. std::vector srcs; std::map >::iterator it; - for(it = m_SubProjectMap.begin(); it!= m_SubProjectMap.end(); ++it) + for(it = m_ProjectMap.begin(); it!= m_ProjectMap.end(); ++it) { std::vector& gen = it->second; // add the ALL_BUILD to the first local generator of each project @@ -192,24 +189,6 @@ void cmGlobalVisualStudio6Generator::Generate() this->OutputDSWFile(); } -// populate the m_SubProjectMap -void cmGlobalVisualStudio6Generator::CollectSubprojects() -{ - unsigned int i; - for(i = 0; i < m_LocalGenerators.size(); ++i) - { - std::string name = m_LocalGenerators[i]->GetMakefile()->GetProjectName(); - m_SubProjectMap[name].push_back(m_LocalGenerators[i]); - std::vector const& pprojects - = m_LocalGenerators[i]->GetMakefile()->GetParentProjects(); - for(unsigned int k =0; k < pprojects.size(); ++k) - { - m_SubProjectMap[pprojects[k]].push_back(m_LocalGenerators[i]); - } - } -} - - // Write a DSW file to the stream void cmGlobalVisualStudio6Generator::WriteDSWFile(std::ostream& fout, cmLocalGenerator* root, @@ -373,7 +352,7 @@ void cmGlobalVisualStudio6Generator::OutputDSWFile(cmLocalGenerator* root, void cmGlobalVisualStudio6Generator::OutputDSWFile() { std::map >::iterator it; - for(it = m_SubProjectMap.begin(); it!= m_SubProjectMap.end(); ++it) + for(it = m_ProjectMap.begin(); it!= m_ProjectMap.end(); ++it) { this->OutputDSWFile(it->second[0], it->second); } @@ -431,7 +410,7 @@ void cmGlobalVisualStudio6Generator::SetupTests() { std::vector srcs; std::map >::iterator it; - for(it = m_SubProjectMap.begin(); it!= m_SubProjectMap.end(); ++it) + for(it = m_ProjectMap.begin(); it!= m_ProjectMap.end(); ++it) { std::vector& gen = it->second; // add the ALL_BUILD to the first local generator of each project diff --git a/Source/cmGlobalVisualStudio6Generator.h b/Source/cmGlobalVisualStudio6Generator.h index d1dec8312..79b934a08 100644 --- a/Source/cmGlobalVisualStudio6Generator.h +++ b/Source/cmGlobalVisualStudio6Generator.h @@ -73,7 +73,6 @@ public: cmLocalGenerator* root, std::vector& generators); private: - void CollectSubprojects(); void GenerateConfigurations(cmMakefile* mf); void SetupTests(); void WriteDSWFile(std::ostream& fout); @@ -85,7 +84,6 @@ private: const char* name, const char* path, const std::vector& dependencies); void WriteDSWFooter(std::ostream& fout); - std::map > m_SubProjectMap; }; #endif diff --git a/Source/cmGlobalVisualStudio7Generator.cxx b/Source/cmGlobalVisualStudio7Generator.cxx index e85a80c08..7f240c989 100644 --- a/Source/cmGlobalVisualStudio7Generator.cxx +++ b/Source/cmGlobalVisualStudio7Generator.cxx @@ -162,7 +162,7 @@ void cmGlobalVisualStudio7Generator::SetupTests() { std::vector srcs; std::map >::iterator it; - for(it = m_SubProjectMap.begin(); it!= m_SubProjectMap.end(); ++it) + for(it = m_ProjectMap.begin(); it!= m_ProjectMap.end(); ++it) { std::vector& gen = it->second; // add the ALL_BUILD to the first local generator of each project @@ -246,13 +246,11 @@ void cmGlobalVisualStudio7Generator::GenerateConfigurations(cmMakefile* mf) void cmGlobalVisualStudio7Generator::Generate() { - // collect sub-projects - this->CollectSubprojects(); // add a special target that depends on ALL projects for easy build // of Debug only std::vector srcs; std::map >::iterator it; - for(it = m_SubProjectMap.begin(); it!= m_SubProjectMap.end(); ++it) + for(it = m_ProjectMap.begin(); it!= m_ProjectMap.end(); ++it) { std::vector& gen = it->second; // add the ALL_BUILD to the first local generator of each project @@ -302,7 +300,7 @@ void cmGlobalVisualStudio7Generator::OutputSLNFile(cmLocalGenerator* root, void cmGlobalVisualStudio7Generator::OutputSLNFile() { std::map >::iterator it; - for(it = m_SubProjectMap.begin(); it!= m_SubProjectMap.end(); ++it) + for(it = m_ProjectMap.begin(); it!= m_ProjectMap.end(); ++it) { this->OutputSLNFile(it->second[0], it->second); } @@ -724,23 +722,6 @@ void cmGlobalVisualStudio7Generator::GetDocumentation(cmDocumentationEntry& entr entry.full = ""; } -// populate the m_SubProjectMap -void cmGlobalVisualStudio7Generator::CollectSubprojects() -{ - unsigned int i; - for(i = 0; i < m_LocalGenerators.size(); ++i) - { - std::string name = m_LocalGenerators[i]->GetMakefile()->GetProjectName(); - m_SubProjectMap[name].push_back(m_LocalGenerators[i]); - std::vector const& pprojects - = m_LocalGenerators[i]->GetMakefile()->GetParentProjects(); - for(unsigned int k =0; k < pprojects.size(); ++k) - { - m_SubProjectMap[pprojects[k]].push_back(m_LocalGenerators[i]); - } - } -} - // make sure "special" targets have GUID's void cmGlobalVisualStudio7Generator::Configure() { diff --git a/Source/cmGlobalVisualStudio7Generator.h b/Source/cmGlobalVisualStudio7Generator.h index 0f9e81437..4d81c5c1b 100644 --- a/Source/cmGlobalVisualStudio7Generator.h +++ b/Source/cmGlobalVisualStudio7Generator.h @@ -88,7 +88,6 @@ public: virtual void Configure(); protected: std::string GetGUID(const char* name); - void CollectSubprojects(); virtual void OutputSLNFile(cmLocalGenerator* root, std::vector& generators); virtual void WriteSLNFile(std::ostream& fout, cmLocalGenerator* root, @@ -112,7 +111,6 @@ protected: std::vector m_Configurations; std::map m_GUIDMap; - std::map > m_SubProjectMap; }; #endif