1 /*============================================================================
2 CMake - Cross Platform Makefile Generator
3 Copyright 2000-2009 Kitware, Inc., Insight Software Consortium
5 Distributed under the OSI-approved BSD License (the "License");
6 see accompanying file Copyright.txt for details.
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
15 #include "cmStandardIncludes.h"
17 #include <cmsys/RegularExpression.hxx>
20 class cmGlobalGenerator;
21 class cmLocalGenerator;
24 class cmOrderDirectories;
26 /** \class cmComputeLinkInformation
27 * \brief Compute link information for a target in one configuration.
29 class cmComputeLinkInformation
32 cmComputeLinkInformation(cmTarget* target, const char* config);
33 ~cmComputeLinkInformation();
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) {}
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();
61 std::string const& GetRPathLinkFlag() const { return this->RPathLinkFlag; }
62 std::string GetRPathLinkString();
64 void AddItem(std::string const& item, cmTarget* tgt);
65 void AddSharedDepItem(std::string const& item, cmTarget* tgt);
67 // Output information.
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;
75 // Context information.
78 cmLocalGenerator* LocalGenerator;
79 cmGlobalGenerator* GlobalGenerator;
82 // Configuration information.
84 const char* LinkLanguage;
86 // Modes for dealing with dependent shared libraries.
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
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;
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;
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;
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);
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);
150 void ComputeFrameworkInfo();
151 void AddFrameworkPath(std::string const& p);
152 std::set<cmStdString> FrameworkPathsEmmitted;
153 cmsys::RegularExpression SplitFramework;
155 // Linker search path computation.
156 cmOrderDirectories* OrderLinkerSearchPath;
157 bool FinishLinkerSearchDirectories();
158 void PrintLinkPolicyDiagnosis(std::ostream&);
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;
167 // Additional paths configured by the runtime linker
168 std::vector<std::string> RuntimeLinkDirs;
170 // Linker search path compatibility mode.
171 std::set<cmStdString> OldLinkDirMask;
172 std::vector<std::string> OldLinkDirItems;
173 std::vector<std::string> OldUserFlagItems;
176 // Runtime path computation.
177 cmOrderDirectories* OrderRuntimeSearchPath;
178 void AddLibraryRuntimeInfo(std::string const& fullPath, cmTarget* target);
179 void AddLibraryRuntimeInfo(std::string const& fullPath);
181 // Dependent library path computation.
182 cmOrderDirectories* OrderDependentRPath;