cmComputeLinkInformation.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. /*=========================================================================
  2. Program: CMake - Cross-Platform Makefile Generator
  3. Module: $RCSfile$
  4. Language: C++
  5. Date: $Date$
  6. Version: $Revision$
  7. Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved.
  8. See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
  9. This software is distributed WITHOUT ANY WARRANTY; without even
  10. the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
  11. PURPOSE. See the above copyright notices for more information.
  12. =========================================================================*/
  13. #ifndef cmComputeLinkInformation_h
  14. #define cmComputeLinkInformation_h
  15. #include "cmStandardIncludes.h"
  16. #include <cmsys/RegularExpression.hxx>
  17. class cmake;
  18. class cmGlobalGenerator;
  19. class cmLocalGenerator;
  20. class cmMakefile;
  21. class cmTarget;
  22. class cmOrderRuntimeDirectories;
  23. /** \class cmComputeLinkInformation
  24. * \brief Compute link information for a target in one configuration.
  25. */
  26. class cmComputeLinkInformation
  27. {
  28. public:
  29. cmComputeLinkInformation(cmTarget* target, const char* config);
  30. ~cmComputeLinkInformation();
  31. bool Compute();
  32. struct Item
  33. {
  34. Item(): Value(), IsPath(true) {}
  35. Item(Item const& item): Value(item.Value), IsPath(item.IsPath) {}
  36. Item(std::string const& v, bool p): Value(v), IsPath(p) {}
  37. std::string Value;
  38. bool IsPath;
  39. };
  40. typedef std::vector<Item> ItemVector;
  41. ItemVector const& GetItems();
  42. std::vector<std::string> const& GetDirectories();
  43. std::vector<std::string> const& GetDepends();
  44. std::vector<std::string> const& GetFrameworkPaths();
  45. const char* GetLinkLanguage() const { return this->LinkLanguage; }
  46. std::vector<std::string> const& GetRuntimeSearchPath();
  47. std::string const& GetRuntimeFlag() const { return this->RuntimeFlag; }
  48. std::string const& GetRuntimeSep() const { return this->RuntimeSep; }
  49. void GetRPath(std::vector<std::string>& runtimeDirs, bool for_install);
  50. std::string GetRPathString(bool for_install);
  51. std::string GetChrpathString();
  52. std::string GetChrpathTool();
  53. std::set<cmTarget*> const& GetSharedLibrariesLinked();
  54. std::string const& GetRPathLinkFlag() const { return this->RPathLinkFlag; }
  55. std::string GetRPathLinkString();
  56. private:
  57. void AddItem(std::string const& item, cmTarget* tgt);
  58. void AddSharedDepItem(std::string const& item, cmTarget* tgt);
  59. // Output information.
  60. ItemVector Items;
  61. std::vector<std::string> Directories;
  62. std::vector<std::string> Depends;
  63. std::vector<std::string> FrameworkPaths;
  64. std::vector<std::string> RuntimeSearchPath;
  65. std::set<cmTarget*> SharedLibrariesLinked;
  66. // Context information.
  67. cmTarget* Target;
  68. cmMakefile* Makefile;
  69. cmLocalGenerator* LocalGenerator;
  70. cmGlobalGenerator* GlobalGenerator;
  71. cmake* CMakeInstance;
  72. // Configuration information.
  73. const char* Config;
  74. const char* LinkLanguage;
  75. // Modes for dealing with dependent shared libraries.
  76. enum SharedDepMode
  77. {
  78. SharedDepModeNone, // Drop
  79. SharedDepModeDir, // Use in runtime information
  80. SharedDepModeLink // List file on link line
  81. };
  82. // System info.
  83. bool UseImportLibrary;
  84. const char* LoaderFlag;
  85. std::string LibLinkFlag;
  86. std::string LibLinkFileFlag;
  87. std::string LibLinkSuffix;
  88. std::string RuntimeFlag;
  89. std::string RuntimeSep;
  90. std::string RuntimeAlways;
  91. bool RuntimeUseChrpath;
  92. std::string RPathLinkFlag;
  93. SharedDepMode SharedDependencyMode;
  94. // Link type adjustment.
  95. void ComputeLinkTypeInfo();
  96. enum LinkType { LinkUnknown, LinkStatic, LinkShared };
  97. LinkType StartLinkType;
  98. LinkType CurrentLinkType;
  99. std::string StaticLinkTypeFlag;
  100. std::string SharedLinkTypeFlag;
  101. bool LinkTypeEnabled;
  102. void SetCurrentLinkType(LinkType lt);
  103. bool ArchivesMayBeShared;
  104. // Link item parsing.
  105. void ComputeItemParserInfo();
  106. std::vector<std::string> StaticLinkExtensions;
  107. std::vector<std::string> SharedLinkExtensions;
  108. std::vector<std::string> LinkExtensions;
  109. std::set<cmStdString> LinkPrefixes;
  110. cmsys::RegularExpression RemoveLibraryExtension;
  111. cmsys::RegularExpression ExtractStaticLibraryName;
  112. cmsys::RegularExpression ExtractSharedLibraryName;
  113. cmsys::RegularExpression ExtractAnyLibraryName;
  114. void AddLinkPrefix(const char* p);
  115. void AddLinkExtension(const char* e, LinkType type);
  116. std::string CreateExtensionRegex(std::vector<std::string> const& exts);
  117. std::string NoCaseExpression(const char* str);
  118. // Handling of link items that are not targets or full file paths.
  119. void AddTargetItem(std::string const& item, cmTarget* target);
  120. void AddFullItem(std::string const& item);
  121. bool CheckImplicitDirItem(std::string const& item);
  122. void AddUserItem(std::string const& item);
  123. void AddDirectoryItem(std::string const& item);
  124. void AddFrameworkItem(std::string const& item);
  125. void DropDirectoryItem(std::string const& item);
  126. // Framework info.
  127. void ComputeFrameworkInfo();
  128. void AddFrameworkPath(std::string const& p);
  129. std::set<cmStdString> FrameworkPathsEmmitted;
  130. cmsys::RegularExpression SplitFramework;
  131. // Linker search path computation.
  132. void ComputeLinkerSearchDirectories();
  133. void AddLinkerSearchDirectories(std::vector<std::string> const& dirs);
  134. std::set<cmStdString> DirectoriesEmmitted;
  135. std::set<cmStdString> ImplicitLinkDirs;
  136. // Linker search path compatibility mode.
  137. std::vector<std::string> OldLinkDirs;
  138. bool OldLinkDirMode;
  139. bool HaveUserFlagItem;
  140. // Runtime path computation.
  141. cmOrderRuntimeDirectories* OrderRuntimeSearchPath;
  142. void AddLibraryRuntimeInfo(std::string const& fullPath, cmTarget* target);
  143. void AddLibraryRuntimeInfo(std::string const& fullPath);
  144. // Dependent library path computation.
  145. cmOrderRuntimeDirectories* OrderDependentRPath;
  146. };
  147. #endif