/*========================================================================= Program: CMake - Cross-Platform Makefile Generator Module: $RCSfile$ Language: C++ Date: $Date$ Version: $Revision$ 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 cmComputeTargetDepends_h #define cmComputeTargetDepends_h #include "cmStandardIncludes.h" #include class cmGlobalGenerator; class cmTarget; /** \class cmComputeTargetDepends * \brief Compute global interdependencies among targets. * * Static libraries may form cycles in the target dependency graph. * This class evaluates target dependencies globally and adjusts them * to remove cycles while preserving a safe build order. */ class cmComputeTargetDepends { public: cmComputeTargetDepends(cmGlobalGenerator* gg); ~cmComputeTargetDepends(); bool Compute(); std::vector const& GetTargets() const { return this->Targets; } void GetTargetDirectDepends(cmTarget* t, std::set& deps); private: void CollectTargets(); void CollectDepends(); void CollectTargetDepends(int depender_index); void AddTargetDepend(int depender_index, const char* dependee_name); void ComputeFinalDepends(); cmGlobalGenerator* GlobalGenerator; bool DebugMode; // Collect all targets. std::vector Targets; std::map TargetIndex; // Represent the target dependency graph. The entry at each // top-level index corresponds to a depender whose dependencies are // listed. struct TargetDependList: public std::vector {}; std::vector TargetDependGraph; std::vector FinalDependGraph; void DisplayGraph(std::vector const& graph, const char* name); // Tarjan's algorithm. struct TarjanEntry { int Root; int Component; int VisitIndex; }; int TarjanWalkId; std::vector TarjanVisited; std::vector TarjanEntries; std::stack TarjanStack; int TarjanIndex; void Tarjan(); void TarjanVisit(int i); // Connected components. struct ComponentList: public std::vector {}; std::vector Components; void DisplayComponents(); bool CheckComponents(); void ComplainAboutBadComponent(int c); }; #endif