diff options
Diffstat (limited to 'Source/cmComputeLinkInformation.h')
-rw-r--r-- | Source/cmComputeLinkInformation.h | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/Source/cmComputeLinkInformation.h b/Source/cmComputeLinkInformation.h new file mode 100644 index 0000000..e6ee871 --- /dev/null +++ b/Source/cmComputeLinkInformation.h @@ -0,0 +1,189 @@ +/*============================================================================ + CMake - Cross Platform Makefile Generator + Copyright 2000-2009 Kitware, Inc., Insight Software Consortium + + Distributed under the OSI-approved BSD License (the "License"); + see accompanying file Copyright.txt for details. + + This software is distributed WITHOUT ANY WARRANTY; without even the + implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the License for more information. +============================================================================*/ +#ifndef cmComputeLinkInformation_h +#define cmComputeLinkInformation_h + +#include "cmStandardIncludes.h" + +#include <cmsys/RegularExpression.hxx> + +class cmake; +class cmGlobalGenerator; +class cmLocalGenerator; +class cmMakefile; +class cmTarget; +class cmOrderDirectories; + +/** \class cmComputeLinkInformation + * \brief Compute link information for a target in one configuration. + */ +class cmComputeLinkInformation +{ +public: + cmComputeLinkInformation(cmTarget* target, const char* config, + cmTarget* headTarget); + ~cmComputeLinkInformation(); + bool Compute(); + + struct Item + { + Item(): Value(), IsPath(true), Target(0) {} + Item(Item const& item): + Value(item.Value), IsPath(item.IsPath), Target(item.Target) {} + Item(std::string const& v, bool p, cmTarget* target = 0): + Value(v), IsPath(p), Target(target) {} + std::string Value; + bool IsPath; + cmTarget* Target; + }; + typedef std::vector<Item> ItemVector; + ItemVector const& GetItems(); + std::vector<std::string> const& GetDirectories(); + std::vector<std::string> const& GetDepends(); + std::vector<std::string> const& GetFrameworkPaths(); + const char* GetLinkLanguage() const { return this->LinkLanguage; } + std::vector<std::string> const& GetRuntimeSearchPath(); + std::string const& GetRuntimeFlag() const { return this->RuntimeFlag; } + std::string const& GetRuntimeSep() const { return this->RuntimeSep; } + void GetRPath(std::vector<std::string>& runtimeDirs, bool for_install); + std::string GetRPathString(bool for_install); + std::string GetChrpathString(); + std::set<cmTarget*> const& GetSharedLibrariesLinked(); + + std::string const& GetRPathLinkFlag() const { return this->RPathLinkFlag; } + std::string GetRPathLinkString(); +private: + void AddItem(std::string const& item, cmTarget* tgt); + void AddSharedDepItem(std::string const& item, cmTarget* tgt); + + // Output information. + ItemVector Items; + std::vector<std::string> Directories; + std::vector<std::string> Depends; + std::vector<std::string> FrameworkPaths; + std::vector<std::string> RuntimeSearchPath; + std::set<cmTarget*> SharedLibrariesLinked; + + // Context information. + cmTarget* Target; + cmTarget* HeadTarget; + cmMakefile* Makefile; + cmLocalGenerator* LocalGenerator; + cmGlobalGenerator* GlobalGenerator; + cmake* CMakeInstance; + + // Configuration information. + const char* Config; + const char* LinkLanguage; + bool LinkDependsNoShared; + + // Modes for dealing with dependent shared libraries. + enum SharedDepMode + { + SharedDepModeNone, // Drop + SharedDepModeDir, // List dir in -rpath-link flag + SharedDepModeLibDir, // List dir in linker search path + SharedDepModeLink // List file on link line + }; + + // System info. + bool UseImportLibrary; + const char* LoaderFlag; + std::string LibLinkFlag; + std::string LibLinkFileFlag; + std::string LibLinkSuffix; + std::string RuntimeFlag; + std::string RuntimeSep; + std::string RuntimeAlways; + bool RuntimeUseChrpath; + bool NoSONameUsesPath; + bool LinkWithRuntimePath; + std::string RPathLinkFlag; + SharedDepMode SharedDependencyMode; + + // Link type adjustment. + void ComputeLinkTypeInfo(); + enum LinkType { LinkUnknown, LinkStatic, LinkShared }; + LinkType StartLinkType; + LinkType CurrentLinkType; + std::string StaticLinkTypeFlag; + std::string SharedLinkTypeFlag; + bool LinkTypeEnabled; + void SetCurrentLinkType(LinkType lt); + bool ArchivesMayBeShared; + + // Link item parsing. + void ComputeItemParserInfo(); + std::vector<std::string> StaticLinkExtensions; + std::vector<std::string> SharedLinkExtensions; + std::vector<std::string> LinkExtensions; + std::set<cmStdString> LinkPrefixes; + cmsys::RegularExpression ExtractStaticLibraryName; + cmsys::RegularExpression ExtractSharedLibraryName; + cmsys::RegularExpression ExtractAnyLibraryName; + std::string SharedRegexString; + bool OpenBSD; + void AddLinkPrefix(const char* p); + void AddLinkExtension(const char* e, LinkType type); + std::string CreateExtensionRegex(std::vector<std::string> const& exts, + LinkType type); + std::string NoCaseExpression(const char* str); + + // Handling of link items. + void AddTargetItem(std::string const& item, cmTarget* target); + void AddFullItem(std::string const& item); + bool CheckImplicitDirItem(std::string const& item); + void AddUserItem(std::string const& item, bool pathNotKnown); + void AddDirectoryItem(std::string const& item); + void AddFrameworkItem(std::string const& item); + void DropDirectoryItem(std::string const& item); + bool CheckSharedLibNoSOName(std::string const& item); + void AddSharedLibNoSOName(std::string const& item); + void HandleBadFullItem(std::string const& item, std::string const& file); + + // Framework info. + void ComputeFrameworkInfo(); + void AddFrameworkPath(std::string const& p); + std::set<cmStdString> FrameworkPathsEmmitted; + cmsys::RegularExpression SplitFramework; + + // Linker search path computation. + cmOrderDirectories* OrderLinkerSearchPath; + bool FinishLinkerSearchDirectories(); + void PrintLinkPolicyDiagnosis(std::ostream&); + + // Implicit link libraries and directories for linker language. + void LoadImplicitLinkInfo(); + void AddImplicitLinkInfo(); + void AddImplicitLinkInfo(std::string const& lang); + std::set<cmStdString> ImplicitLinkDirs; + std::set<cmStdString> ImplicitLinkLibs; + + // Additional paths configured by the runtime linker + std::vector<std::string> RuntimeLinkDirs; + + // Linker search path compatibility mode. + std::set<cmStdString> OldLinkDirMask; + std::vector<std::string> OldLinkDirItems; + std::vector<std::string> OldUserFlagItems; + bool OldLinkDirMode; + + // Runtime path computation. + cmOrderDirectories* OrderRuntimeSearchPath; + void AddLibraryRuntimeInfo(std::string const& fullPath, cmTarget* target); + void AddLibraryRuntimeInfo(std::string const& fullPath); + + // Dependent library path computation. + cmOrderDirectories* OrderDependentRPath; +}; + +#endif |