1 /*=========================================================================
3 Program: CMake - Cross-Platform Makefile Generator
4 Module: $RCSfile: cmComputeLinkInformation.h,v $
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>
25 class cmGlobalGenerator
;
26 class cmLocalGenerator
;
29 class cmOrderDirectories
;
31 /** \class cmComputeLinkInformation
32 * \brief Compute link information for a target in one configuration.
34 class cmComputeLinkInformation
37 cmComputeLinkInformation(cmTarget
* target
, const char* config
);
38 ~cmComputeLinkInformation();
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
) {}
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();
66 void AddItem(std::string
const& item
, cmTarget
* tgt
);
67 void AddSharedDepItem(std::string
const& item
, cmTarget
* tgt
);
69 // Output information.
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.
80 cmLocalGenerator
* LocalGenerator
;
81 cmGlobalGenerator
* GlobalGenerator
;
84 // Configuration information.
86 const char* LinkLanguage
;
88 // Modes for dealing with dependent shared libraries.
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
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
);
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
;
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
;