cmOrderDirectories.h 3.3 KB

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