diff options
author | Brad King <brad.king@kitware.com> | 2008-01-22 14:13:04 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2008-01-22 14:13:04 (GMT) |
commit | 96fd5909d9dd1ffe740230ce652d574cd01c62d5 (patch) | |
tree | e83b3ce2d5066660256a69cacb6caa7d2d95c416 /Source/cmComputeLinkInformation.h | |
parent | 0df9e6904cd2416336a85d6d7972ce84dcbab417 (diff) | |
download | CMake-96fd5909d9dd1ffe740230ce652d574cd01c62d5.zip CMake-96fd5909d9dd1ffe740230ce652d574cd01c62d5.tar.gz CMake-96fd5909d9dd1ffe740230ce652d574cd01c62d5.tar.bz2 |
ENH: Implement linking with paths to library files instead of -L and -l separation. See bug #3832
- This is purely an implementation improvement. No interface has changed.
- Create cmComputeLinkInformation class
- Move and re-implement logic from:
cmLocalGenerator::ComputeLinkInformation
cmOrderLinkDirectories
- Link libraries to targets with their full path (if it is known)
- Dirs specified with link_directories command still added with -L
- Make link type specific to library names without paths
(name libfoo.a without path becomes -Wl,-Bstatic -lfoo)
- Make directory ordering specific to a runtime path computation feature
(look for conflicting SONAMEs instead of library names)
- Implement proper rpath support on HP-UX and AIX.
Diffstat (limited to 'Source/cmComputeLinkInformation.h')
-rw-r--r-- | Source/cmComputeLinkInformation.h | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/Source/cmComputeLinkInformation.h b/Source/cmComputeLinkInformation.h new file mode 100644 index 0000000..d8a1374 --- /dev/null +++ b/Source/cmComputeLinkInformation.h @@ -0,0 +1,165 @@ +/*========================================================================= + + Program: CMake - Cross-Platform Makefile Generator + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + + Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved. + See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ +#ifndef cmComputeLinkInformation_h +#define cmComputeLinkInformation_h + +#include "cmStandardIncludes.h" + +#include <cmsys/RegularExpression.hxx> + +class cmGlobalGenerator; +class cmLocalGenerator; +class cmMakefile; +class cmTarget; + +/** \class cmComputeLinkInformation + * \brief Compute link information for a target in one configuration. + */ +class cmComputeLinkInformation +{ +public: + cmComputeLinkInformation(cmTarget* target, const char* config); + bool Compute(); + + struct Item + { + Item(): Value(), IsPath(true) {} + Item(Item const& item): Value(item.Value), IsPath(item.IsPath) {} + Item(std::string const& v, bool p): Value(v), IsPath(p) {} + std::string Value; + bool IsPath; + }; + 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(); +private: + void AddItem(std::string const& item); + + // Output information. + ItemVector Items; + std::vector<std::string> Directories; + std::vector<std::string> Depends; + std::vector<std::string> FrameworkPaths; + std::vector<std::string> RuntimeSearchPath; + + // Context information. + cmTarget* Target; + cmMakefile* Makefile; + cmLocalGenerator* LocalGenerator; + cmGlobalGenerator* GlobalGenerator; + + // Configuration information. + const char* Config; + const char* LinkLanguage; + + // System info. + bool UseImportLibrary; + const char* LoaderFlag; + std::string LibLinkFlag; + std::string LibLinkSuffix; + + // 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); + + // 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 RemoveLibraryExtension; + cmsys::RegularExpression ExtractStaticLibraryName; + cmsys::RegularExpression ExtractSharedLibraryName; + cmsys::RegularExpression ExtractAnyLibraryName; + void AddLinkPrefix(const char* p); + void AddLinkExtension(const char* e, LinkType type); + std::string CreateExtensionRegex(std::vector<std::string> const& exts); + std::string NoCaseExpression(const char* str); + + // Handling of link items that are not targets or full file paths. + void AddUserItem(std::string const& item); + void AddDirectoryItem(std::string const& item); + void AddFrameworkItem(std::string const& item); + void DropDirectoryItem(std::string const& item); + + // Framework info. + void ComputeFrameworkInfo(); + void AddFrameworkPath(std::string const& p); + std::set<cmStdString> FrameworkPathsEmmitted; + cmsys::RegularExpression SplitFramework; + + // Linker search path computation. + void ComputeLinkerSearchDirectories(); + void AddLinkerSearchDirectories(std::vector<std::string> const& dirs); + std::set<cmStdString> DirectoriesEmmitted; + + // Runtime path computation. + struct LibraryRuntimeEntry + { + // The file name of the library. + std::string FileName; + + // The soname of the shared library if it is known. + std::string SOName; + + // The directory in which the library is supposed to be found. + std::string Directory; + + // The index assigned to the directory. + int DirectoryIndex; + }; + bool RuntimeSearchPathComputed; + std::vector<LibraryRuntimeEntry> LibraryRuntimeInfo; + std::set<cmStdString> LibraryRuntimeInfoEmmitted; + std::vector<std::string> RuntimeDirectories; + std::map<cmStdString, int> RuntimeDirectoryIndex; + std::vector<char> RuntimeDirectoryVisited; + void AddLibraryRuntimeInfo(std::string const& fullPath, cmTarget* target); + void AddLibraryRuntimeInfo(std::string const& fullPath, + const char* soname = 0); + void CollectRuntimeDirectories(); + int AddRuntimeDirectory(std::string const& dir); + void FindConflictingLibraries(); + void FindDirectoriesForLib(unsigned int lri); + void OrderRuntimeSearchPath(); + void VisitRuntimeDirectory(unsigned int i, bool top); + void DiagnoseCycle(); + bool CycleDiagnosed; + + // Adjacency-list representation of runtime path ordering graph. + // This maps from directory to those that must come *before* it. + // Each entry that must come before is a pair. The first element is + // the index of the directory that must come first. The second + // element is the index of the runtime library that added the + // constraint. + typedef std::pair<int, int> RuntimeConflictPair; + struct RuntimeConflictList: public std::vector<RuntimeConflictPair> {}; + std::vector<RuntimeConflictList> RuntimeConflictGraph; +}; + +#endif |