Imported Upstream version 2.8.9
[platform/upstream/cmake.git] / Source / cmComputeLinkInformation.h
1 /*============================================================================
2   CMake - Cross Platform Makefile Generator
3   Copyright 2000-2009 Kitware, Inc., Insight Software Consortium
4
5   Distributed under the OSI-approved BSD License (the "License");
6   see accompanying file Copyright.txt for details.
7
8   This software is distributed WITHOUT ANY WARRANTY; without even the
9   implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
10   See the License for more information.
11 ============================================================================*/
12 #ifndef cmComputeLinkInformation_h
13 #define cmComputeLinkInformation_h
14
15 #include "cmStandardIncludes.h"
16
17 #include <cmsys/RegularExpression.hxx>
18
19 class cmake;
20 class cmGlobalGenerator;
21 class cmLocalGenerator;
22 class cmMakefile;
23 class cmTarget;
24 class cmOrderDirectories;
25
26 /** \class cmComputeLinkInformation
27  * \brief Compute link information for a target in one configuration.
28  */
29 class cmComputeLinkInformation
30 {
31 public:
32   cmComputeLinkInformation(cmTarget* target, const char* config);
33   ~cmComputeLinkInformation();
34   bool Compute();
35
36   struct Item
37   {
38     Item(): Value(), IsPath(true), Target(0) {}
39     Item(Item const& item):
40       Value(item.Value), IsPath(item.IsPath), Target(item.Target) {}
41     Item(std::string const& v, bool p, cmTarget* target = 0):
42       Value(v), IsPath(p), Target(target) {}
43     std::string Value;
44     bool IsPath;
45     cmTarget* Target;
46   };
47   typedef std::vector<Item> ItemVector;
48   ItemVector const& GetItems();
49   std::vector<std::string> const& GetDirectories();
50   std::vector<std::string> const& GetDepends();
51   std::vector<std::string> const& GetFrameworkPaths();
52   const char* GetLinkLanguage() const { return this->LinkLanguage; }
53   std::vector<std::string> const& GetRuntimeSearchPath();
54   std::string const& GetRuntimeFlag() const { return this->RuntimeFlag; }
55   std::string const& GetRuntimeSep() const { return this->RuntimeSep; }
56   void GetRPath(std::vector<std::string>& runtimeDirs, bool for_install);
57   std::string GetRPathString(bool for_install);
58   std::string GetChrpathString();
59   std::set<cmTarget*> const& GetSharedLibrariesLinked();
60
61   std::string const& GetRPathLinkFlag() const { return this->RPathLinkFlag; }
62   std::string GetRPathLinkString();
63 private:
64   void AddItem(std::string const& item, cmTarget* tgt);
65   void AddSharedDepItem(std::string const& item, cmTarget* tgt);
66
67   // Output information.
68   ItemVector Items;
69   std::vector<std::string> Directories;
70   std::vector<std::string> Depends;
71   std::vector<std::string> FrameworkPaths;
72   std::vector<std::string> RuntimeSearchPath;
73   std::set<cmTarget*> SharedLibrariesLinked;
74
75   // Context information.
76   cmTarget* Target;
77   cmMakefile* Makefile;
78   cmLocalGenerator* LocalGenerator;
79   cmGlobalGenerator* GlobalGenerator;
80   cmake* CMakeInstance;
81
82   // Configuration information.
83   const char* Config;
84   const char* LinkLanguage;
85
86   // Modes for dealing with dependent shared libraries.
87   enum SharedDepMode
88   {
89     SharedDepModeNone,   // Drop
90     SharedDepModeDir,    // List dir in -rpath-link flag
91     SharedDepModeLibDir, // List dir in linker search path
92     SharedDepModeLink    // List file on link line
93   };
94
95   // System info.
96   bool UseImportLibrary;
97   const char* LoaderFlag;
98   std::string LibLinkFlag;
99   std::string LibLinkFileFlag;
100   std::string LibLinkSuffix;
101   std::string RuntimeFlag;
102   std::string RuntimeSep;
103   std::string RuntimeAlways;
104   bool RuntimeUseChrpath;
105   bool NoSONameUsesPath;
106   bool LinkWithRuntimePath;
107   std::string RPathLinkFlag;
108   SharedDepMode SharedDependencyMode;
109
110   // Link type adjustment.
111   void ComputeLinkTypeInfo();
112   enum LinkType { LinkUnknown, LinkStatic, LinkShared };
113   LinkType StartLinkType;
114   LinkType CurrentLinkType;
115   std::string StaticLinkTypeFlag;
116   std::string SharedLinkTypeFlag;
117   bool LinkTypeEnabled;
118   void SetCurrentLinkType(LinkType lt);
119   bool ArchivesMayBeShared;
120
121   // Link item parsing.
122   void ComputeItemParserInfo();
123   std::vector<std::string> StaticLinkExtensions;
124   std::vector<std::string> SharedLinkExtensions;
125   std::vector<std::string> LinkExtensions;
126   std::set<cmStdString> LinkPrefixes;
127   cmsys::RegularExpression ExtractStaticLibraryName;
128   cmsys::RegularExpression ExtractSharedLibraryName;
129   cmsys::RegularExpression ExtractAnyLibraryName;
130   std::string SharedRegexString;
131   bool OpenBSD;
132   void AddLinkPrefix(const char* p);
133   void AddLinkExtension(const char* e, LinkType type);
134   std::string CreateExtensionRegex(std::vector<std::string> const& exts);
135   std::string NoCaseExpression(const char* str);
136
137   // Handling of link items.
138   void AddTargetItem(std::string const& item, cmTarget* target);
139   void AddFullItem(std::string const& item);
140   bool CheckImplicitDirItem(std::string const& item);
141   void AddUserItem(std::string const& item, bool pathNotKnown);
142   void AddDirectoryItem(std::string const& item);
143   void AddFrameworkItem(std::string const& item);
144   void DropDirectoryItem(std::string const& item);
145   bool CheckSharedLibNoSOName(std::string const& item);
146   void AddSharedLibNoSOName(std::string const& item);
147   void HandleBadFullItem(std::string const& item, std::string const& file);
148
149   // Framework info.
150   void ComputeFrameworkInfo();
151   void AddFrameworkPath(std::string const& p);
152   std::set<cmStdString> FrameworkPathsEmmitted;
153   cmsys::RegularExpression SplitFramework;
154
155   // Linker search path computation.
156   cmOrderDirectories* OrderLinkerSearchPath;
157   bool FinishLinkerSearchDirectories();
158   void PrintLinkPolicyDiagnosis(std::ostream&);
159
160   // Implicit link libraries and directories for linker language.
161   void LoadImplicitLinkInfo();
162   void AddImplicitLinkInfo();
163   void AddImplicitLinkInfo(std::string const& lang);
164   std::set<cmStdString> ImplicitLinkDirs;
165   std::set<cmStdString> ImplicitLinkLibs;
166
167   // Additional paths configured by the runtime linker
168   std::vector<std::string> RuntimeLinkDirs;
169
170   // Linker search path compatibility mode.
171   std::set<cmStdString> OldLinkDirMask;
172   std::vector<std::string> OldLinkDirItems;
173   std::vector<std::string> OldUserFlagItems;
174   bool OldLinkDirMode;
175
176   // Runtime path computation.
177   cmOrderDirectories* OrderRuntimeSearchPath;
178   void AddLibraryRuntimeInfo(std::string const& fullPath, cmTarget* target);
179   void AddLibraryRuntimeInfo(std::string const& fullPath);
180
181   // Dependent library path computation.
182   cmOrderDirectories* OrderDependentRPath;
183 };
184
185 #endif