cmComputeLinkInformation.h 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  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 cmComputeLinkInformation_h
  11. #define cmComputeLinkInformation_h
  12. #include "cmStandardIncludes.h"
  13. #include <cmsys/RegularExpression.hxx>
  14. class cmake;
  15. class cmGlobalGenerator;
  16. class cmLocalGenerator;
  17. class cmMakefile;
  18. class cmTarget;
  19. class cmOrderDirectories;
  20. /** \class cmComputeLinkInformation
  21. * \brief Compute link information for a target in one configuration.
  22. */
  23. class cmComputeLinkInformation
  24. {
  25. public:
  26. cmComputeLinkInformation(cmTarget const* target, const char* config,
  27. cmTarget const* headTarget);
  28. ~cmComputeLinkInformation();
  29. bool Compute();
  30. struct Item
  31. {
  32. Item(): Value(), IsPath(true), Target(0) {}
  33. Item(Item const& item):
  34. Value(item.Value), IsPath(item.IsPath), Target(item.Target) {}
  35. Item(std::string const& v, bool p, cmTarget* target = 0):
  36. Value(v), IsPath(p), Target(target) {}
  37. std::string Value;
  38. bool IsPath;
  39. cmTarget* Target;
  40. };
  41. typedef std::vector<Item> ItemVector;
  42. ItemVector const& GetItems();
  43. std::vector<std::string> const& GetDirectories();
  44. std::vector<std::string> const& GetDepends();
  45. std::vector<std::string> const& GetFrameworkPaths();
  46. const char* GetLinkLanguage() const { return this->LinkLanguage; }
  47. std::vector<std::string> const& GetRuntimeSearchPath();
  48. std::string const& GetRuntimeFlag() const { return this->RuntimeFlag; }
  49. std::string const& GetRuntimeSep() const { return this->RuntimeSep; }
  50. void GetRPath(std::vector<std::string>& runtimeDirs, bool for_install);
  51. std::string GetRPathString(bool for_install);
  52. std::string GetChrpathString();
  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 const* Target;
  68. cmTarget const* HeadTarget;
  69. cmMakefile* Makefile;
  70. cmLocalGenerator* LocalGenerator;
  71. cmGlobalGenerator* GlobalGenerator;
  72. cmake* CMakeInstance;
  73. // Configuration information.
  74. const char* Config;
  75. const char* LinkLanguage;
  76. bool LinkDependsNoShared;
  77. // Modes for dealing with dependent shared libraries.
  78. enum SharedDepMode
  79. {
  80. SharedDepModeNone, // Drop
  81. SharedDepModeDir, // List dir in -rpath-link flag
  82. SharedDepModeLibDir, // List dir in linker search path
  83. SharedDepModeLink // List file on link line
  84. };
  85. // System info.
  86. bool UseImportLibrary;
  87. const char* LoaderFlag;
  88. std::string LibLinkFlag;
  89. std::string LibLinkFileFlag;
  90. std::string LibLinkSuffix;
  91. std::string RuntimeFlag;
  92. std::string RuntimeSep;
  93. std::string RuntimeAlways;
  94. bool RuntimeUseChrpath;
  95. bool NoSONameUsesPath;
  96. bool LinkWithRuntimePath;
  97. std::string RPathLinkFlag;
  98. SharedDepMode SharedDependencyMode;
  99. // Link type adjustment.
  100. void ComputeLinkTypeInfo();
  101. enum LinkType { LinkUnknown, LinkStatic, LinkShared };
  102. LinkType StartLinkType;
  103. LinkType CurrentLinkType;
  104. std::string StaticLinkTypeFlag;
  105. std::string SharedLinkTypeFlag;
  106. bool LinkTypeEnabled;
  107. void SetCurrentLinkType(LinkType lt);
  108. bool ArchivesMayBeShared;
  109. // Link item parsing.
  110. void ComputeItemParserInfo();
  111. std::vector<std::string> StaticLinkExtensions;
  112. std::vector<std::string> SharedLinkExtensions;
  113. std::vector<std::string> LinkExtensions;
  114. std::set<cmStdString> LinkPrefixes;
  115. cmsys::RegularExpression ExtractStaticLibraryName;
  116. cmsys::RegularExpression ExtractSharedLibraryName;
  117. cmsys::RegularExpression ExtractAnyLibraryName;
  118. std::string SharedRegexString;
  119. bool OpenBSD;
  120. void AddLinkPrefix(const char* p);
  121. void AddLinkExtension(const char* e, LinkType type);
  122. std::string CreateExtensionRegex(std::vector<std::string> const& exts,
  123. LinkType type);
  124. std::string NoCaseExpression(const char* str);
  125. // Handling of link items.
  126. void AddTargetItem(std::string const& item, cmTarget* target);
  127. void AddFullItem(std::string const& item);
  128. bool CheckImplicitDirItem(std::string const& item);
  129. void AddUserItem(std::string const& item, bool pathNotKnown);
  130. void AddDirectoryItem(std::string const& item);
  131. void AddFrameworkItem(std::string const& item);
  132. void DropDirectoryItem(std::string const& item);
  133. bool CheckSharedLibNoSOName(std::string const& item);
  134. void AddSharedLibNoSOName(std::string const& item);
  135. void HandleBadFullItem(std::string const& item, std::string const& file);
  136. // Framework info.
  137. void ComputeFrameworkInfo();
  138. void AddFrameworkPath(std::string const& p);
  139. std::set<cmStdString> FrameworkPathsEmmitted;
  140. cmsys::RegularExpression SplitFramework;
  141. // Linker search path computation.
  142. cmOrderDirectories* OrderLinkerSearchPath;
  143. bool FinishLinkerSearchDirectories();
  144. void PrintLinkPolicyDiagnosis(std::ostream&);
  145. // Implicit link libraries and directories for linker language.
  146. void LoadImplicitLinkInfo();
  147. void AddImplicitLinkInfo();
  148. void AddImplicitLinkInfo(std::string const& lang);
  149. std::set<cmStdString> ImplicitLinkDirs;
  150. std::set<cmStdString> ImplicitLinkLibs;
  151. // Additional paths configured by the runtime linker
  152. std::vector<std::string> RuntimeLinkDirs;
  153. // Linker search path compatibility mode.
  154. std::set<cmStdString> OldLinkDirMask;
  155. std::vector<std::string> OldLinkDirItems;
  156. std::vector<std::string> OldUserFlagItems;
  157. bool OldLinkDirMode;
  158. // Runtime path computation.
  159. cmOrderDirectories* OrderRuntimeSearchPath;
  160. void AddLibraryRuntimeInfo(std::string const& fullPath, cmTarget* target);
  161. void AddLibraryRuntimeInfo(std::string const& fullPath);
  162. // Dependent library path computation.
  163. cmOrderDirectories* OrderDependentRPath;
  164. };
  165. #endif