1 /*============================================================================
2 CMake - Cross Platform Makefile Generator
3 Copyright 2000-2009 Kitware, Inc., Insight Software Consortium
5 Distributed under the OSI-approved BSD License (the "License");
6 see accompanying file Copyright.txt for details.
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
15 #include "cmStandardIncludes.h"
17 #include <cmsys/RegularExpression.hxx>
19 class cmGlobalGenerator;
20 class cmOrderDirectoriesConstraint;
21 class cmOrderDirectoriesConstraintLibrary;
24 /** \class cmOrderDirectories
25 * \brief Compute a safe runtime path order for a set of shared libraries.
27 class cmOrderDirectories
30 cmOrderDirectories(cmGlobalGenerator* gg, cmTarget* target,
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);
41 std::vector<std::string> const& GetOrderedDirectories();
43 cmGlobalGenerator* GlobalGenerator;
49 std::vector<std::string> OrderedDirectories;
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);
67 void FindImplicitConflicts();
68 void OrderDirectories();
69 void VisitDirectory(unsigned int i);
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
80 typedef std::pair<int, int> ConflictPair;
81 struct ConflictList: public std::vector<ConflictPair> {};
82 std::vector<ConflictList> ConflictGraph;
84 friend class cmOrderDirectoriesConstraint;
85 friend class cmOrderDirectoriesConstraintLibrary;