cmComputeLinkInformation.h 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  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* target, const char* config);
  27. ~cmComputeLinkInformation();
  28. bool Compute();
  29. struct Item
  30. {
  31. Item(): Value(), IsPath(true), Target(0) {}
  32. Item(Item const& item):
  33. Value(item.Value), IsPath(item.IsPath), Target(item.Target) {}
  34. Item(std::string const& v, bool p, cmTarget* target = 0):
  35. Value(v), IsPath(p), Target(target) {}
  36. std::string Value;
  37. bool IsPath;
  38. cmTarget* Target;
  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::set<cmTarget*> const& GetSharedLibrariesLinked();
  53. std::string const& GetRPathLinkFlag() const { return this->RPathLinkFlag; }
  54. std::string GetRPathLinkString();
  55. private:
  56. void AddItem(std::string const& item, cmTarget* tgt);
  57. void AddSharedDepItem(std::string const& item, cmTarget* tgt);
  58. // Output information.
  59. ItemVector Items;
  60. std::vector<std::string> Directories;
  61. std::vector<std::string> Depends;
  62. std::vector<std::string> FrameworkPaths;
  63. std::vector<std::string> RuntimeSearchPath;
  64. std::set<cmTarget*> SharedLibrariesLinked;
  65. // Context information.
  66. cmTarget* Target;
  67. cmMakefile* Makefile;
  68. cmLocalGenerator* LocalGenerator;
  69. cmGlobalGenerator* GlobalGenerator;
  70. cmake* CMakeInstance;
  71. // Configuration information.
  72. const char* Config;
  73. const char* LinkLanguage;
  74. // Modes for dealing with dependent shared libraries.
  75. enum SharedDepMode
  76. {
  77. SharedDepModeNone, // Drop
  78. SharedDepModeDir, // List dir in -rpath-link flag
  79. SharedDepModeLibDir, // List dir in linker search path
  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. bool NoSONameUsesPath;
  93. bool LinkWithRuntimePath;
  94. std::string RPathLinkFlag;
  95. SharedDepMode SharedDependencyMode;
  96. // Link type adjustment.
  97. void ComputeLinkTypeInfo();
  98. enum LinkType { LinkUnknown, LinkStatic, LinkShared };
  99. LinkType StartLinkType;
  100. LinkType CurrentLinkType;
  101. std::string StaticLinkTypeFlag;
  102. std::string SharedLinkTypeFlag;
  103. bool LinkTypeEnabled;
  104. void SetCurrentLinkType(LinkType lt);
  105. bool ArchivesMayBeShared;
  106. // Link item parsing.
  107. void ComputeItemParserInfo();
  108. std::vector<std::string> StaticLinkExtensions;
  109. std::vector<std::string> SharedLinkExtensions;
  110. std::vector<std::string> LinkExtensions;
  111. std::set<cmStdString> LinkPrefixes;
  112. cmsys::RegularExpression ExtractStaticLibraryName;
  113. cmsys::RegularExpression ExtractSharedLibraryName;
  114. cmsys::RegularExpression ExtractAnyLibraryName;
  115. std::string SharedRegexString;
  116. void AddLinkPrefix(const char* p);
  117. void AddLinkExtension(const char* e, LinkType type);
  118. std::string CreateExtensionRegex(std::vector<std::string> const& exts);
  119. std::string NoCaseExpression(const char* str);
  120. // Handling of link items.
  121. void AddTargetItem(std::string const& item, cmTarget* target);
  122. void AddFullItem(std::string const& item);
  123. bool CheckImplicitDirItem(std::string const& item);
  124. void AddUserItem(std::string const& item, bool pathNotKnown);
  125. void AddDirectoryItem(std::string const& item);
  126. void AddFrameworkItem(std::string const& item);
  127. void DropDirectoryItem(std::string const& item);
  128. bool CheckSharedLibNoSOName(std::string const& item);
  129. void AddSharedLibNoSOName(std::string const& item);
  130. void HandleBadFullItem(std::string const& item, std::string const& file);
  131. // Framework info.
  132. void ComputeFrameworkInfo();
  133. void AddFrameworkPath(std::string const& p);
  134. std::set<cmStdString> FrameworkPathsEmmitted;
  135. cmsys::RegularExpression SplitFramework;
  136. // Linker search path computation.
  137. cmOrderDirectories* OrderLinkerSearchPath;
  138. bool FinishLinkerSearchDirectories();
  139. void PrintLinkPolicyDiagnosis(std::ostream&);
  140. // Implicit link libraries and directories for linker language.
  141. void LoadImplicitLinkInfo();
  142. void AddImplicitLinkInfo();
  143. void AddImplicitLinkInfo(std::string const& lang);
  144. std::set<cmStdString> ImplicitLinkDirs;
  145. std::set<cmStdString> ImplicitLinkLibs;
  146. // Linker search path compatibility mode.
  147. std::set<cmStdString> OldLinkDirMask;
  148. std::vector<std::string> OldLinkDirItems;
  149. std::vector<std::string> OldUserFlagItems;
  150. bool OldLinkDirMode;
  151. // Runtime path computation.
  152. cmOrderDirectories* OrderRuntimeSearchPath;
  153. void AddLibraryRuntimeInfo(std::string const& fullPath, cmTarget* target);
  154. void AddLibraryRuntimeInfo(std::string const& fullPath);
  155. // Dependent library path computation.
  156. cmOrderDirectories* OrderDependentRPath;
  157. };
  158. #endif