Resync.
[CMakeLuaTailorHgBridge.git] / CMakeLua / Source / cmComputeLinkInformation.h
blob93fae3c2c2b958dc736dda0601143f2939a67b1d
1 /*=========================================================================
3 Program: CMake - Cross-Platform Makefile Generator
4 Module: $RCSfile: cmComputeLinkInformation.h,v $
5 Language: C++
6 Date: $Date: 2008-03-13 20:23:18 $
7 Version: $Revision: 1.16 $
9 Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved.
10 See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
12 This software is distributed WITHOUT ANY WARRANTY; without even
13 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 PURPOSE. See the above copyright notices for more information.
16 =========================================================================*/
17 #ifndef cmComputeLinkInformation_h
18 #define cmComputeLinkInformation_h
20 #include "cmStandardIncludes.h"
22 #include <cmsys/RegularExpression.hxx>
24 class cmake;
25 class cmGlobalGenerator;
26 class cmLocalGenerator;
27 class cmMakefile;
28 class cmTarget;
29 class cmOrderDirectories;
31 /** \class cmComputeLinkInformation
32 * \brief Compute link information for a target in one configuration.
34 class cmComputeLinkInformation
36 public:
37 cmComputeLinkInformation(cmTarget* target, const char* config);
38 ~cmComputeLinkInformation();
39 bool Compute();
41 struct Item
43 Item(): Value(), IsPath(true) {}
44 Item(Item const& item): Value(item.Value), IsPath(item.IsPath) {}
45 Item(std::string const& v, bool p): Value(v), IsPath(p) {}
46 std::string Value;
47 bool IsPath;
49 typedef std::vector<Item> ItemVector;
50 ItemVector const& GetItems();
51 std::vector<std::string> const& GetDirectories();
52 std::vector<std::string> const& GetDepends();
53 std::vector<std::string> const& GetFrameworkPaths();
54 const char* GetLinkLanguage() const { return this->LinkLanguage; }
55 std::vector<std::string> const& GetRuntimeSearchPath();
56 std::string const& GetRuntimeFlag() const { return this->RuntimeFlag; }
57 std::string const& GetRuntimeSep() const { return this->RuntimeSep; }
58 void GetRPath(std::vector<std::string>& runtimeDirs, bool for_install);
59 std::string GetRPathString(bool for_install);
60 std::string GetChrpathString();
61 std::set<cmTarget*> const& GetSharedLibrariesLinked();
63 std::string const& GetRPathLinkFlag() const { return this->RPathLinkFlag; }
64 std::string GetRPathLinkString();
65 private:
66 void AddItem(std::string const& item, cmTarget* tgt);
67 void AddSharedDepItem(std::string const& item, cmTarget* tgt);
69 // Output information.
70 ItemVector Items;
71 std::vector<std::string> Directories;
72 std::vector<std::string> Depends;
73 std::vector<std::string> FrameworkPaths;
74 std::vector<std::string> RuntimeSearchPath;
75 std::set<cmTarget*> SharedLibrariesLinked;
77 // Context information.
78 cmTarget* Target;
79 cmMakefile* Makefile;
80 cmLocalGenerator* LocalGenerator;
81 cmGlobalGenerator* GlobalGenerator;
82 cmake* CMakeInstance;
84 // Configuration information.
85 const char* Config;
86 const char* LinkLanguage;
88 // Modes for dealing with dependent shared libraries.
89 enum SharedDepMode
91 SharedDepModeNone, // Drop
92 SharedDepModeDir, // List dir in -rpath-link flag
93 SharedDepModeLibDir, // List dir in linker search path
94 SharedDepModeLink // List file on link line
97 // System info.
98 bool UseImportLibrary;
99 const char* LoaderFlag;
100 std::string LibLinkFlag;
101 std::string LibLinkFileFlag;
102 std::string LibLinkSuffix;
103 std::string RuntimeFlag;
104 std::string RuntimeSep;
105 std::string RuntimeAlways;
106 bool RuntimeUseChrpath;
107 bool NoSONameUsesPath;
108 bool LinkWithRuntimePath;
109 std::string RPathLinkFlag;
110 SharedDepMode SharedDependencyMode;
112 // Link type adjustment.
113 void ComputeLinkTypeInfo();
114 enum LinkType { LinkUnknown, LinkStatic, LinkShared };
115 LinkType StartLinkType;
116 LinkType CurrentLinkType;
117 std::string StaticLinkTypeFlag;
118 std::string SharedLinkTypeFlag;
119 bool LinkTypeEnabled;
120 void SetCurrentLinkType(LinkType lt);
121 bool ArchivesMayBeShared;
123 // Link item parsing.
124 void ComputeItemParserInfo();
125 std::vector<std::string> StaticLinkExtensions;
126 std::vector<std::string> SharedLinkExtensions;
127 std::vector<std::string> LinkExtensions;
128 std::set<cmStdString> LinkPrefixes;
129 cmsys::RegularExpression ExtractStaticLibraryName;
130 cmsys::RegularExpression ExtractSharedLibraryName;
131 cmsys::RegularExpression ExtractAnyLibraryName;
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);
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);
148 // Framework info.
149 void ComputeFrameworkInfo();
150 void AddFrameworkPath(std::string const& p);
151 std::set<cmStdString> FrameworkPathsEmmitted;
152 cmsys::RegularExpression SplitFramework;
154 // Linker search path computation.
155 cmOrderDirectories* OrderLinkerSearchPath;
156 bool FinishLinkerSearchDirectories();
157 void PrintLinkPolicyDiagnosis(std::ostream&);
158 std::set<cmStdString> ImplicitLinkDirs;
160 // Linker search path compatibility mode.
161 std::set<cmStdString> OldLinkDirMask;
162 std::vector<std::string> OldLinkDirItems;
163 std::vector<std::string> OldUserFlagItems;
164 bool OldLinkDirMode;
166 // Runtime path computation.
167 cmOrderDirectories* OrderRuntimeSearchPath;
168 void AddLibraryRuntimeInfo(std::string const& fullPath, cmTarget* target);
169 void AddLibraryRuntimeInfo(std::string const& fullPath);
171 // Dependent library path computation.
172 cmOrderDirectories* OrderDependentRPath;
175 #endif