From 80cb12bb8bc14eb3e56f344d03254777351e5c74 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 14 Jul 2014 14:19:32 -0400 Subject: export_library_dependencies: Use original link libraries internally This command was using the cmTarget::GetLinkLibraries method with a comment explaining how execution order gives it the dependencies before analysis. Just use cmTarget::GetOriginalLinkLibraries instead. --- Source/cmExportLibraryDependenciesCommand.cxx | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Source/cmExportLibraryDependenciesCommand.cxx b/Source/cmExportLibraryDependenciesCommand.cxx index 688d2eb..cb150a7 100644 --- a/Source/cmExportLibraryDependenciesCommand.cxx +++ b/Source/cmExportLibraryDependenciesCommand.cxx @@ -108,14 +108,12 @@ void cmExportLibraryDependenciesCommand::ConstFinalPass() const std::string targetEntry = target.GetName(); targetEntry += "_LIB_DEPENDS"; - // Construct the dependency variable value. It is safe to use - // the target GetLinkLibraries method here because this code is - // called at the end of configure but before generate so library - // dependencies have yet to be analyzed. Therefore the value - // will be the direct link dependencies. + // Construct the dependency variable value with the direct link + // dependencies. std::string valueOld; std::string valueNew; - cmTarget::LinkLibraryVectorType const& libs = target.GetLinkLibraries(); + cmTarget::LinkLibraryVectorType const& libs = + target.GetOriginalLinkLibraries(); for(cmTarget::LinkLibraryVectorType::const_iterator li = libs.begin(); li != libs.end(); ++li) { -- cgit v0.12 From b3b44d138e50b2c5b4a4d327aae9290dba56862d Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 14 Jul 2014 14:21:54 -0400 Subject: cmTarget: Rename old-style link dependencies code as "ForVS6" The old link dependency analysis is now needed only for the VS 6 generator code delimited by CM_USE_OLD_VS6 to support project-provided project templates. Rename the related cmTarget members to be "ForVS6". --- Source/cmLocalVisualStudio6Generator.cxx | 3 +- Source/cmTarget.cxx | 78 ++++++++++++++++---------------- Source/cmTarget.h | 38 ++++++++-------- 3 files changed, 60 insertions(+), 59 deletions(-) diff --git a/Source/cmLocalVisualStudio6Generator.cxx b/Source/cmLocalVisualStudio6Generator.cxx index 5db735f..c14fb2b 100644 --- a/Source/cmLocalVisualStudio6Generator.cxx +++ b/Source/cmLocalVisualStudio6Generator.cxx @@ -1101,7 +1101,8 @@ void cmLocalVisualStudio6Generator } } // find link libraries - const cmTarget::LinkLibraryVectorType& libs = target.GetLinkLibraries(); + const cmTarget::LinkLibraryVectorType& libs = + target.GetLinkLibrariesForVS6(); cmTarget::LinkLibraryVectorType::const_iterator j; for(j = libs.begin(); j != libs.end(); ++j) { diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index a740bc3..c480669 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -258,7 +258,7 @@ cmTarget::cmTarget() #undef INITIALIZE_TARGET_POLICY_MEMBER this->Makefile = 0; - this->LinkLibrariesAnalyzed = false; + this->LinkLibrariesForVS6Analyzed = false; this->HaveInstallRule = false; this->DLLPlatform = false; this->IsApple = false; @@ -518,7 +518,7 @@ void cmTarget::FinishConfigure() this->ClearLinkMaps(); // Do old-style link dependency analysis. - this->AnalyzeLibDependencies(*this->Makefile); + this->AnalyzeLibDependenciesForVS6(*this->Makefile); } //---------------------------------------------------------------------------- @@ -1332,7 +1332,7 @@ void cmTarget::AddLinkLibrary(cmMakefile& mf, cmTarget::LibraryID tmp; tmp.first = lib; tmp.second = llt; - this->LinkLibraries.push_back( tmp ); + this->LinkLibrariesForVS6.push_back( tmp ); this->OriginalLinkLibraries.push_back(tmp); this->ClearLinkMaps(); @@ -1400,7 +1400,7 @@ cmTarget::AddSystemIncludeDirectories(const std::vector &incs) //---------------------------------------------------------------------------- void -cmTarget::AnalyzeLibDependencies( const cmMakefile& mf ) +cmTarget::AnalyzeLibDependenciesForVS6( const cmMakefile& mf ) { // There are two key parts of the dependency analysis: (1) // determining the libraries in the link line, and (2) constructing @@ -1477,8 +1477,8 @@ cmTarget::AnalyzeLibDependencies( const cmMakefile& mf ) // eventually be removed. This code was moved here from the end of // old source list processing code which was called just before this // method. - for(LinkLibraryVectorType::iterator p = this->LinkLibraries.begin(); - p != this->LinkLibraries.end(); ++p) + for(LinkLibraryVectorType::iterator p = this->LinkLibrariesForVS6.begin(); + p != this->LinkLibrariesForVS6.end(); ++p) { this->Makefile->ExpandVariablesInString(p->first, true, true); } @@ -1490,22 +1490,22 @@ cmTarget::AnalyzeLibDependencies( const cmMakefile& mf ) // 1. Build the dependency graph // for(LinkLibraryVectorType::reverse_iterator lib - = this->LinkLibraries.rbegin(); - lib != this->LinkLibraries.rend(); ++lib) + = this->LinkLibrariesForVS6.rbegin(); + lib != this->LinkLibrariesForVS6.rend(); ++lib) { - this->GatherDependencies( mf, *lib, dep_map); + this->GatherDependenciesForVS6( mf, *lib, dep_map); } // 2. Remove any dependencies that are already satisfied in the original // link line. // - for(LinkLibraryVectorType::iterator lib = this->LinkLibraries.begin(); - lib != this->LinkLibraries.end(); ++lib) + for(LinkLibraryVectorType::iterator lib = this->LinkLibrariesForVS6.begin(); + lib != this->LinkLibrariesForVS6.end(); ++lib) { for( LinkLibraryVectorType::iterator lib2 = lib; - lib2 != this->LinkLibraries.end(); ++lib2) + lib2 != this->LinkLibrariesForVS6.end(); ++lib2) { - this->DeleteDependency( dep_map, *lib, *lib2); + this->DeleteDependencyForVS6( dep_map, *lib, *lib2); } } @@ -1514,43 +1514,43 @@ cmTarget::AnalyzeLibDependencies( const cmMakefile& mf ) // missing. Start from the back and keep adding. // std::set done, visited; - std::vector newLinkLibraries; + std::vector newLinkLibrariesForVS6; for(LinkLibraryVectorType::reverse_iterator lib = - this->LinkLibraries.rbegin(); - lib != this->LinkLibraries.rend(); ++lib) + this->LinkLibrariesForVS6.rbegin(); + lib != this->LinkLibrariesForVS6.rend(); ++lib) { // skip zero size library entries, this may happen // if a variable expands to nothing. if (lib->first.size() != 0) { - this->Emit( *lib, dep_map, done, visited, newLinkLibraries ); + this->EmitForVS6( *lib, dep_map, done, visited, newLinkLibrariesForVS6 ); } } // 4. Add the new libraries to the link line. // for( std::vector::reverse_iterator k = - newLinkLibraries.rbegin(); - k != newLinkLibraries.rend(); ++k ) + newLinkLibrariesForVS6.rbegin(); + k != newLinkLibrariesForVS6.rend(); ++k ) { // get the llt from the dep_map - this->LinkLibraries.push_back( std::make_pair(k->first,k->second) ); + this->LinkLibrariesForVS6.push_back( std::make_pair(k->first,k->second) ); } - this->LinkLibrariesAnalyzed = true; + this->LinkLibrariesForVS6Analyzed = true; } //---------------------------------------------------------------------------- -void cmTarget::InsertDependency( DependencyMap& depMap, - const LibraryID& lib, - const LibraryID& dep) +void cmTarget::InsertDependencyForVS6( DependencyMap& depMap, + const LibraryID& lib, + const LibraryID& dep) { depMap[lib].push_back(dep); } //---------------------------------------------------------------------------- -void cmTarget::DeleteDependency( DependencyMap& depMap, - const LibraryID& lib, - const LibraryID& dep) +void cmTarget::DeleteDependencyForVS6( DependencyMap& depMap, + const LibraryID& lib, + const LibraryID& dep) { // Make sure there is an entry in the map for lib. If so, delete all // dependencies to dep. There may be repeated entries because of @@ -1569,11 +1569,11 @@ void cmTarget::DeleteDependency( DependencyMap& depMap, } //---------------------------------------------------------------------------- -void cmTarget::Emit(const LibraryID lib, - const DependencyMap& dep_map, - std::set& emitted, - std::set& visited, - DependencyList& link_line ) +void cmTarget::EmitForVS6(const LibraryID lib, + const DependencyMap& dep_map, + std::set& emitted, + std::set& visited, + DependencyList& link_line ) { // It's already been emitted if( emitted.find(lib) != emitted.end() ) @@ -1619,7 +1619,7 @@ void cmTarget::Emit(const LibraryID lib, if( emitted.find(*i) == emitted.end() ) { // emit dependencies - Emit( *i, dep_map, emitted, visited, link_line ); + this->EmitForVS6( *i, dep_map, emitted, visited, link_line ); // emit self emitted.insert(*i); emitted_here.insert(*i); @@ -1632,9 +1632,9 @@ void cmTarget::Emit(const LibraryID lib, } //---------------------------------------------------------------------------- -void cmTarget::GatherDependencies( const cmMakefile& mf, - const LibraryID& lib, - DependencyMap& dep_map) +void cmTarget::GatherDependenciesForVS6( const cmMakefile& mf, + const LibraryID& lib, + DependencyMap& dep_map) { // If the library is already in the dependency map, then it has // already been fully processed. @@ -1678,8 +1678,8 @@ void cmTarget::GatherDependencies( const cmMakefile& mf, else { LibraryID lib2(l,llt); - this->InsertDependency( dep_map, lib, lib2); - this->GatherDependencies( mf, lib2, dep_map); + this->InsertDependencyForVS6( dep_map, lib, lib2); + this->GatherDependenciesForVS6( mf, lib2, dep_map); llt = cmTarget::GENERAL; } } @@ -1687,7 +1687,7 @@ void cmTarget::GatherDependencies( const cmMakefile& mf, end = depline.find( ";", start ); } // cannot depend on itself - this->DeleteDependency( dep_map, lib, lib); + this->DeleteDependencyForVS6( dep_map, lib, lib); } } diff --git a/Source/cmTarget.h b/Source/cmTarget.h index dc67f1e..bd5417a 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -179,8 +179,8 @@ public: typedef std::pair LibraryID; typedef std::vector LinkLibraryVectorType; - const LinkLibraryVectorType &GetLinkLibraries() const { - return this->LinkLibraries;} + const LinkLibraryVectorType &GetLinkLibrariesForVS6() const { + return this->LinkLibrariesForVS6;} const LinkLibraryVectorType &GetOriginalLinkLibraries() const {return this->OriginalLinkLibraries;} @@ -638,16 +638,16 @@ private: /** * Inserts \a dep at the end of the dependency list of \a lib. */ - void InsertDependency( DependencyMap& depMap, - const LibraryID& lib, - const LibraryID& dep); + void InsertDependencyForVS6( DependencyMap& depMap, + const LibraryID& lib, + const LibraryID& dep); /* * Deletes \a dep from the dependency list of \a lib. */ - void DeleteDependency( DependencyMap& depMap, - const LibraryID& lib, - const LibraryID& dep); + void DeleteDependencyForVS6( DependencyMap& depMap, + const LibraryID& lib, + const LibraryID& dep); /** * Emits the library \a lib and all its dependencies into link_line. @@ -657,21 +657,21 @@ private: * link_line is in reverse order, in that the dependencies of a * library are listed before the library itself. */ - void Emit( const LibraryID lib, - const DependencyMap& dep_map, - std::set& emitted, - std::set& visited, - DependencyList& link_line); + void EmitForVS6( const LibraryID lib, + const DependencyMap& dep_map, + std::set& emitted, + std::set& visited, + DependencyList& link_line); /** * Finds the dependencies for \a lib and inserts them into \a * dep_map. */ - void GatherDependencies( const cmMakefile& mf, - const LibraryID& lib, - DependencyMap& dep_map); + void GatherDependenciesForVS6( const cmMakefile& mf, + const LibraryID& lib, + DependencyMap& dep_map); - void AnalyzeLibDependencies( const cmMakefile& mf ); + void AnalyzeLibDependenciesForVS6( const cmMakefile& mf ); const char* GetSuffixVariableInternal(bool implib) const; const char* GetPrefixVariableInternal(bool implib) const; @@ -720,9 +720,9 @@ private: std::vector PreLinkCommands; std::vector PostBuildCommands; TargetType TargetTypeValue; - LinkLibraryVectorType LinkLibraries; + LinkLibraryVectorType LinkLibrariesForVS6; LinkLibraryVectorType PrevLinkedLibraries; - bool LinkLibrariesAnalyzed; + bool LinkLibrariesForVS6Analyzed; std::vector LinkDirectories; std::set LinkDirectoriesEmmitted; bool HaveInstallRule; -- cgit v0.12 From d57be904ae997e44ec9ac3b44722277f81936577 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 14 Jul 2014 14:38:58 -0400 Subject: cmTarget: Run old-style link dependencies only for VS 6 Invoke it at runtime only with the VS 6 generator. No other generators need it. --- Source/cmGlobalGenerator.h | 3 +++ Source/cmGlobalVisualStudio6Generator.h | 2 ++ Source/cmTarget.cxx | 7 +++++-- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Source/cmGlobalGenerator.h b/Source/cmGlobalGenerator.h index 6403429..160a8fb 100644 --- a/Source/cmGlobalGenerator.h +++ b/Source/cmGlobalGenerator.h @@ -214,6 +214,9 @@ public: */ virtual void FindMakeProgram(cmMakefile*); + /** Is this the Visual Studio 6 generator? */ + virtual bool IsForVS6() const { return false; } + ///! Find a target by name by searching the local generators. cmTarget* FindTarget(const std::string& name, bool excludeAliases = false) const; diff --git a/Source/cmGlobalVisualStudio6Generator.h b/Source/cmGlobalVisualStudio6Generator.h index 2797e11..b2fd28f 100644 --- a/Source/cmGlobalVisualStudio6Generator.h +++ b/Source/cmGlobalVisualStudio6Generator.h @@ -91,6 +91,8 @@ public: virtual void FindMakeProgram(cmMakefile*); + virtual bool IsForVS6() const { return true; } + protected: virtual const char* GetIDEVersion() { return "6.0"; } private: diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index c480669..0d17dc2 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -517,8 +517,11 @@ void cmTarget::FinishConfigure() // invalidation code in this source file is buggy. this->ClearLinkMaps(); - // Do old-style link dependency analysis. - this->AnalyzeLibDependenciesForVS6(*this->Makefile); + // Do old-style link dependency analysis only for CM_USE_OLD_VS6. + if(this->Makefile->GetLocalGenerator()->GetGlobalGenerator()->IsForVS6()) + { + this->AnalyzeLibDependenciesForVS6(*this->Makefile); + } } //---------------------------------------------------------------------------- -- cgit v0.12 From 8a205b980c8dc088aa2c9f91adb90d57a65fa560 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 14 Jul 2014 14:39:20 -0400 Subject: cmTarget: Compile old-style link dependencies only for VS 6 Compile all the "ForVS6" cmTarget members only on Windows. No other platforms support the VS 6 generator. --- Source/cmGlobalGenerator.h | 2 ++ Source/cmTarget.cxx | 8 ++++++++ Source/cmTarget.h | 13 ++++++++++--- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/Source/cmGlobalGenerator.h b/Source/cmGlobalGenerator.h index 160a8fb..5e6c03e 100644 --- a/Source/cmGlobalGenerator.h +++ b/Source/cmGlobalGenerator.h @@ -214,8 +214,10 @@ public: */ virtual void FindMakeProgram(cmMakefile*); +#if defined(_WIN32) && !defined(__CYGWIN__) /** Is this the Visual Studio 6 generator? */ virtual bool IsForVS6() const { return false; } +#endif ///! Find a target by name by searching the local generators. cmTarget* FindTarget(const std::string& name, diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 0d17dc2..aaae457 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -258,7 +258,9 @@ cmTarget::cmTarget() #undef INITIALIZE_TARGET_POLICY_MEMBER this->Makefile = 0; +#if defined(_WIN32) && !defined(__CYGWIN__) this->LinkLibrariesForVS6Analyzed = false; +#endif this->HaveInstallRule = false; this->DLLPlatform = false; this->IsApple = false; @@ -517,11 +519,13 @@ void cmTarget::FinishConfigure() // invalidation code in this source file is buggy. this->ClearLinkMaps(); +#if defined(_WIN32) && !defined(__CYGWIN__) // Do old-style link dependency analysis only for CM_USE_OLD_VS6. if(this->Makefile->GetLocalGenerator()->GetGlobalGenerator()->IsForVS6()) { this->AnalyzeLibDependenciesForVS6(*this->Makefile); } +#endif } //---------------------------------------------------------------------------- @@ -1335,7 +1339,9 @@ void cmTarget::AddLinkLibrary(cmMakefile& mf, cmTarget::LibraryID tmp; tmp.first = lib; tmp.second = llt; +#if defined(_WIN32) && !defined(__CYGWIN__) this->LinkLibrariesForVS6.push_back( tmp ); +#endif this->OriginalLinkLibraries.push_back(tmp); this->ClearLinkMaps(); @@ -1401,6 +1407,7 @@ cmTarget::AddSystemIncludeDirectories(const std::vector &incs) } } +#if defined(_WIN32) && !defined(__CYGWIN__) //---------------------------------------------------------------------------- void cmTarget::AnalyzeLibDependenciesForVS6( const cmMakefile& mf ) @@ -1693,6 +1700,7 @@ void cmTarget::GatherDependenciesForVS6( const cmMakefile& mf, this->DeleteDependencyForVS6( dep_map, lib, lib); } } +#endif //---------------------------------------------------------------------------- static bool whiteListedInterfaceProperty(const std::string& prop) diff --git a/Source/cmTarget.h b/Source/cmTarget.h index bd5417a..c2efb14 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -179,8 +179,6 @@ public: typedef std::pair LibraryID; typedef std::vector LinkLibraryVectorType; - const LinkLibraryVectorType &GetLinkLibrariesForVS6() const { - return this->LinkLibrariesForVS6;} const LinkLibraryVectorType &GetOriginalLinkLibraries() const {return this->OriginalLinkLibraries;} @@ -613,6 +611,11 @@ public: return this->MaxLanguageStandards; } +#if defined(_WIN32) && !defined(__CYGWIN__) + const LinkLibraryVectorType &GetLinkLibrariesForVS6() const { + return this->LinkLibrariesForVS6;} +#endif + private: bool HandleLocationPropertyPolicy(cmMakefile* context) const; @@ -622,6 +625,7 @@ private: std::vector > TLLCommands; +#if defined(_WIN32) && !defined(__CYGWIN__) /** * A list of direct dependencies. Use in conjunction with DependencyMap. */ @@ -672,6 +676,7 @@ private: DependencyMap& dep_map); void AnalyzeLibDependenciesForVS6( const cmMakefile& mf ); +#endif const char* GetSuffixVariableInternal(bool implib) const; const char* GetPrefixVariableInternal(bool implib) const; @@ -720,9 +725,11 @@ private: std::vector PreLinkCommands; std::vector PostBuildCommands; TargetType TargetTypeValue; - LinkLibraryVectorType LinkLibrariesForVS6; LinkLibraryVectorType PrevLinkedLibraries; +#if defined(_WIN32) && !defined(__CYGWIN__) + LinkLibraryVectorType LinkLibrariesForVS6; bool LinkLibrariesForVS6Analyzed; +#endif std::vector LinkDirectories; std::set LinkDirectoriesEmmitted; bool HaveInstallRule; -- cgit v0.12