| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- /*=========================================================================
- 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();
- 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::string GetChrpathTool();
- std::set<cmTarget*> const& GetSharedLibrariesLinked();
- private:
- void AddItem(std::string const& item, cmTarget* tgt, bool isSharedDep);
- // 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;
- cmMakefile* Makefile;
- cmLocalGenerator* LocalGenerator;
- cmGlobalGenerator* GlobalGenerator;
- // Configuration information.
- const char* Config;
- const char* LinkLanguage;
- // Modes for dealing with dependent shared libraries.
- enum SharedDepMode
- {
- SharedDepModeNone, // Drop
- SharedDepModeDir, // Use in runtime information
- 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;
- 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);
- // 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 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);
- 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;
- std::set<cmStdString> ImplicitLinkDirs;
- std::vector<std::string> SharedDependencyDirectories;
- // Linker search path compatibility mode.
- std::vector<std::string> OldLinkDirs;
- bool OldLinkDirMode;
- bool HaveUserFlagItem;
- // 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<int> 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);
- void DiagnoseCycle();
- bool CycleDiagnosed;
- int WalkId;
- // 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
|