/*========================================================================= Program: CMake - Cross-Platform Makefile Generator Module: $RCSfile: cmComputeLinkDepends.h,v $ Language: C++ Date: $Date: 2008-09-03 13:43:17 $ Version: $Revision: 1.5.2.6 $ Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved. See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ #ifndef cmComputeLinkDepends_h #define cmComputeLinkDepends_h #include "cmStandardIncludes.h" #include "cmTarget.h" #include "cmGraphAdjacencyList.h" #include class cmComputeComponentGraph; class cmGlobalGenerator; class cmLocalGenerator; class cmMakefile; class cmTarget; class cmake; /** \class cmComputeLinkDepends * \brief Compute link dependencies for targets. */ class cmComputeLinkDepends { public: cmComputeLinkDepends(cmTarget* target, const char* config); ~cmComputeLinkDepends(); // Basic information about each link item. struct LinkEntry { std::string Item; cmTarget* Target; bool IsSharedDep; bool IsFlag; LinkEntry(): Item(), Target(0), IsSharedDep(false), IsFlag(false) {} LinkEntry(LinkEntry const& r): Item(r.Item), Target(r.Target), IsSharedDep(r.IsSharedDep), IsFlag(r.IsFlag) {} }; typedef std::vector EntryVector; EntryVector const& Compute(); void SetOldLinkDirMode(bool b); std::set const& GetOldWrongConfigItems() const { return this->OldWrongConfigItems; } private: // Context information. cmTarget* Target; cmMakefile* Makefile; cmLocalGenerator* LocalGenerator; cmGlobalGenerator* GlobalGenerator; cmake* CMakeInstance; bool DebugMode; // Configuration information. const char* Config; // Output information. EntryVector FinalLinkEntries; typedef cmTarget::LinkLibraryVectorType LinkLibraryVectorType; std::map::iterator AllocateLinkEntry(std::string const& item); int AddLinkEntry(std::string const& item); void AddVarLinkEntries(int depender_index, const char* value); void AddTargetLinkEntries(int depender_index, LinkLibraryVectorType const& libs); void AddLinkEntries(int depender_index, std::vector const& libs); std::string CleanItemName(std::string const& item); cmTarget* FindTargetToLink(const char* name); // One entry for each unique item. std::vector EntryList; std::map LinkEntryIndex; // BFS of initial dependencies. struct BFSEntry { int Index; const char* LibDepends; }; std::queue BFSQueue; void FollowLinkEntry(BFSEntry const&); // Shared libraries that are included only because they are // dependencies of other shared libraries, not because they are part // of the interface. struct SharedDepEntry { std::string Item; int DependerIndex; }; std::queue SharedDepQueue; void QueueSharedDependencies(int depender_index, std::vector const& deps); void HandleSharedDependency(SharedDepEntry const& dep); // Dependency inferral for each link item. struct DependSet: public std::set {}; struct DependSetList: public std::vector {}; std::vector InferredDependSets; void InferDependencies(); // Ordering constraint graph adjacency list. typedef cmGraphNodeList NodeList; typedef cmGraphAdjacencyList Graph; Graph EntryConstraintGraph; void CleanConstraintGraph(); void DisplayConstraintGraph(); // Ordering algorithm. void OrderLinkEntires(); std::vector ComponentVisited; std::vector ComponentOrder; int ComponentOrderId; struct PendingComponent { // The real component id. Needed because the map is indexed by // component topological index. int Id; // The number of times the component needs to be seen. This is // always 1 for trivial components and is initially 2 for // non-trivial components. int Count; // The entries yet to be seen to complete the component. std::set Entries; }; std::map PendingComponents; cmComputeComponentGraph* CCG; std::vector FinalLinkOrder; void DisplayComponents(); void VisitComponent(unsigned int c); void VisitEntry(int index); PendingComponent& MakePendingComponent(unsigned int component); void DisplayFinalEntries(); // Record of the original link line. std::vector OriginalEntries; // Compatibility help. bool OldLinkDirMode; void CheckWrongConfigItem(std::string const& item); std::set OldWrongConfigItems; }; #endif