cmComputeLinkInformation.h 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file Copyright.txt or https://cmake.org/licensing for details. */
  3. #ifndef cmComputeLinkInformation_h
  4. #define cmComputeLinkInformation_h
  5. #include "cmConfigure.h" // IWYU pragma: keep
  6. #include "cmsys/RegularExpression.hxx"
  7. #include <iosfwd>
  8. #include <set>
  9. #include <string>
  10. #include <utility>
  11. #include <vector>
  12. class cmGeneratorTarget;
  13. class cmGlobalGenerator;
  14. class cmMakefile;
  15. class cmOrderDirectories;
  16. class cmake;
  17. /** \class cmComputeLinkInformation
  18. * \brief Compute link information for a target in one configuration.
  19. */
  20. class cmComputeLinkInformation
  21. {
  22. public:
  23. cmComputeLinkInformation(cmGeneratorTarget const* target,
  24. const std::string& config);
  25. ~cmComputeLinkInformation();
  26. bool Compute();
  27. struct Item
  28. {
  29. Item() {}
  30. Item(std::string v, bool p, cmGeneratorTarget const* target = nullptr)
  31. : Value(std::move(v))
  32. , IsPath(p)
  33. , Target(target)
  34. {
  35. }
  36. std::string Value;
  37. bool IsPath = true;
  38. cmGeneratorTarget const* Target = nullptr;
  39. };
  40. typedef std::vector<Item> ItemVector;
  41. ItemVector const& GetItems() const;
  42. std::vector<std::string> const& GetDirectories() const;
  43. std::vector<std::string> const& GetDepends() const;
  44. std::vector<std::string> const& GetFrameworkPaths() const;
  45. std::string GetLinkLanguage() const { return this->LinkLanguage; }
  46. std::vector<std::string> const& GetRuntimeSearchPath() const;
  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) const;
  50. std::string GetRPathString(bool for_install) const;
  51. std::string GetChrpathString() const;
  52. std::set<cmGeneratorTarget const*> const& GetSharedLibrariesLinked() const;
  53. std::string const& GetRPathLinkFlag() const { return this->RPathLinkFlag; }
  54. std::string GetRPathLinkString() const;
  55. std::string GetConfig() const { return this->Config; }
  56. private:
  57. void AddItem(std::string const& item, const cmGeneratorTarget* tgt);
  58. void AddSharedDepItem(std::string const& item, cmGeneratorTarget const* 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<cmGeneratorTarget const*> SharedLibrariesLinked;
  66. // Context information.
  67. cmGeneratorTarget const* const Target;
  68. cmMakefile* const Makefile;
  69. cmGlobalGenerator* const GlobalGenerator;
  70. cmake* const CMakeInstance;
  71. // Configuration information.
  72. std::string const Config;
  73. std::string 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. const char* LoaderFlag;
  83. std::string LibLinkFlag;
  84. std::string LibLinkFileFlag;
  85. std::string LibLinkSuffix;
  86. std::string RuntimeFlag;
  87. std::string RuntimeSep;
  88. std::string RuntimeAlways;
  89. std::string RPathLinkFlag;
  90. SharedDepMode SharedDependencyMode;
  91. enum LinkType
  92. {
  93. LinkUnknown,
  94. LinkStatic,
  95. LinkShared
  96. };
  97. void SetCurrentLinkType(LinkType lt);
  98. // Link type adjustment.
  99. void ComputeLinkTypeInfo();
  100. LinkType StartLinkType;
  101. LinkType CurrentLinkType;
  102. std::string StaticLinkTypeFlag;
  103. std::string SharedLinkTypeFlag;
  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<std::string> LinkPrefixes;
  110. cmsys::RegularExpression ExtractStaticLibraryName;
  111. cmsys::RegularExpression ExtractSharedLibraryName;
  112. cmsys::RegularExpression ExtractAnyLibraryName;
  113. std::string SharedRegexString;
  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. LinkType type);
  118. std::string NoCaseExpression(const char* str);
  119. // Handling of link items.
  120. void AddTargetItem(std::string const& item, const cmGeneratorTarget* target);
  121. void AddFullItem(std::string const& item);
  122. bool CheckImplicitDirItem(std::string const& item);
  123. void AddUserItem(std::string const& item, bool pathNotKnown);
  124. void AddDirectoryItem(std::string const& item);
  125. void AddFrameworkItem(std::string const& item);
  126. void DropDirectoryItem(std::string const& item);
  127. bool CheckSharedLibNoSOName(std::string const& item);
  128. void AddSharedLibNoSOName(std::string const& item);
  129. void HandleBadFullItem(std::string const& item, std::string const& file);
  130. // Framework info.
  131. void ComputeFrameworkInfo();
  132. void AddFrameworkPath(std::string const& p);
  133. std::set<std::string> FrameworkPathsEmmitted;
  134. cmsys::RegularExpression SplitFramework;
  135. // Linker search path computation.
  136. cmOrderDirectories* OrderLinkerSearchPath;
  137. bool FinishLinkerSearchDirectories();
  138. void PrintLinkPolicyDiagnosis(std::ostream&);
  139. // Implicit link libraries and directories for linker language.
  140. void LoadImplicitLinkInfo();
  141. void AddImplicitLinkInfo();
  142. void AddImplicitLinkInfo(std::string const& lang);
  143. std::set<std::string> ImplicitLinkDirs;
  144. std::set<std::string> ImplicitLinkLibs;
  145. // Additional paths configured by the runtime linker
  146. std::vector<std::string> RuntimeLinkDirs;
  147. // Linker search path compatibility mode.
  148. std::set<std::string> OldLinkDirMask;
  149. std::vector<std::string> OldLinkDirItems;
  150. std::vector<std::string> OldUserFlagItems;
  151. std::set<std::string> CMP0060WarnItems;
  152. // Dependent library path computation.
  153. cmOrderDirectories* OrderDependentRPath;
  154. // Runtime path computation.
  155. cmOrderDirectories* OrderRuntimeSearchPath;
  156. bool OldLinkDirMode;
  157. bool OpenBSD;
  158. bool LinkDependsNoShared;
  159. bool UseImportLibrary;
  160. bool RuntimeUseChrpath;
  161. bool NoSONameUsesPath;
  162. bool LinkWithRuntimePath;
  163. bool LinkTypeEnabled;
  164. bool ArchivesMayBeShared;
  165. bool CMP0060Warn;
  166. void AddLibraryRuntimeInfo(std::string const& fullPath,
  167. const cmGeneratorTarget* target);
  168. void AddLibraryRuntimeInfo(std::string const& fullPath);
  169. };
  170. #endif