Imported Upstream version 2.8.9
[platform/upstream/cmake.git] / Source / cmOrderDirectories.h
1 /*============================================================================
2   CMake - Cross Platform Makefile Generator
3   Copyright 2000-2009 Kitware, Inc., Insight Software Consortium
4
5   Distributed under the OSI-approved BSD License (the "License");
6   see accompanying file Copyright.txt for details.
7
8   This software is distributed WITHOUT ANY WARRANTY; without even the
9   implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
10   See the License for more information.
11 ============================================================================*/
12 #ifndef cmOrderDirectories_h
13 #define cmOrderDirectories_h
14
15 #include "cmStandardIncludes.h"
16
17 #include <cmsys/RegularExpression.hxx>
18
19 class cmGlobalGenerator;
20 class cmOrderDirectoriesConstraint;
21 class cmOrderDirectoriesConstraintLibrary;
22 class cmTarget;
23
24 /** \class cmOrderDirectories
25  * \brief Compute a safe runtime path order for a set of shared libraries.
26  */
27 class cmOrderDirectories
28 {
29 public:
30   cmOrderDirectories(cmGlobalGenerator* gg, cmTarget* target,
31                      const char* purpose);
32   ~cmOrderDirectories();
33   void AddRuntimeLibrary(std::string const& fullPath, const char* soname = 0);
34   void AddLinkLibrary(std::string const& fullPath);
35   void AddUserDirectories(std::vector<std::string> const& extra);
36   void AddLanguageDirectories(std::vector<std::string> const& dirs);
37   void SetImplicitDirectories(std::set<cmStdString> const& implicitDirs);
38   void SetLinkExtensionInfo(std::vector<std::string> const& linkExtensions,
39                             std::string const& removeExtRegex);
40
41   std::vector<std::string> const& GetOrderedDirectories();
42 private:
43   cmGlobalGenerator* GlobalGenerator;
44   cmTarget* Target;
45   std::string Purpose;
46
47   bool Computed;
48
49   std::vector<std::string> OrderedDirectories;
50
51   std::vector<cmOrderDirectoriesConstraint*> ConstraintEntries;
52   std::vector<cmOrderDirectoriesConstraint*> ImplicitDirEntries;
53   std::vector<std::string> UserDirectories;
54   std::vector<std::string> LanguageDirectories;
55   cmsys::RegularExpression RemoveLibraryExtension;
56   std::vector<std::string> LinkExtensions;
57   std::set<cmStdString> ImplicitDirectories;
58   std::set<cmStdString> EmmittedConstraintSOName;
59   std::set<cmStdString> EmmittedConstraintLibrary;
60   std::vector<std::string> OriginalDirectories;
61   std::map<cmStdString, int> DirectoryIndex;
62   std::vector<int> DirectoryVisited;
63   void CollectOriginalDirectories();
64   int AddOriginalDirectory(std::string const& dir);
65   void AddOriginalDirectories(std::vector<std::string> const& dirs);
66   void FindConflicts();
67   void FindImplicitConflicts();
68   void OrderDirectories();
69   void VisitDirectory(unsigned int i);
70   void DiagnoseCycle();
71   bool CycleDiagnosed;
72   int WalkId;
73
74   // Adjacency-list representation of runtime path ordering graph.
75   // This maps from directory to those that must come *before* it.
76   // Each entry that must come before is a pair.  The first element is
77   // the index of the directory that must come first.  The second
78   // element is the index of the runtime library that added the
79   // constraint.
80   typedef std::pair<int, int> ConflictPair;
81   struct ConflictList: public std::vector<ConflictPair> {};
82   std::vector<ConflictList> ConflictGraph;
83
84   friend class cmOrderDirectoriesConstraint;
85   friend class cmOrderDirectoriesConstraintLibrary;
86 };
87
88 #endif