cmake/Source/cmComputeLinkInformation.h

214 lines
6.9 KiB
C
Raw Normal View History

2016-10-30 18:24:19 +01:00
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
#ifndef cmComputeLinkInformation_h
#define cmComputeLinkInformation_h
2017-07-20 19:35:53 +02:00
#include "cmConfigure.h" // IWYU pragma: keep
2016-10-30 18:24:19 +01:00
#include <iosfwd>
2020-08-30 11:54:41 +02:00
#include <memory>
2016-10-30 18:24:19 +01:00
#include <set>
#include <string>
2019-11-11 23:01:05 +01:00
#include <utility>
2016-10-30 18:24:19 +01:00
#include <vector>
2020-02-01 23:06:01 +01:00
#include "cmsys/RegularExpression.hxx"
2020-08-30 11:54:41 +02:00
#include "cmListFileCache.h"
2016-10-30 18:24:19 +01:00
class cmGeneratorTarget;
class cmGlobalGenerator;
class cmMakefile;
class cmOrderDirectories;
2016-10-30 18:24:19 +01:00
class cmake;
/** \class cmComputeLinkInformation
* \brief Compute link information for a target in one configuration.
*/
class cmComputeLinkInformation
{
public:
2015-11-17 17:22:37 +01:00
cmComputeLinkInformation(cmGeneratorTarget const* target,
const std::string& config);
2020-08-30 11:54:41 +02:00
cmComputeLinkInformation(const cmComputeLinkInformation&) = delete;
cmComputeLinkInformation& operator=(const cmComputeLinkInformation&) =
delete;
~cmComputeLinkInformation();
bool Compute();
struct Item
{
2019-11-11 23:01:05 +01:00
Item() = default;
2020-08-30 11:54:41 +02:00
Item(BT<std::string> v, bool p, cmGeneratorTarget const* target = nullptr)
2019-11-11 23:01:05 +01:00
: Value(std::move(v))
2016-07-09 11:21:54 +02:00
, IsPath(p)
, Target(target)
{
}
2020-08-30 11:54:41 +02:00
BT<std::string> Value;
2019-11-11 23:01:05 +01:00
bool IsPath = true;
cmGeneratorTarget const* Target = nullptr;
};
2020-02-01 23:06:01 +01:00
using ItemVector = std::vector<Item>;
void AppendValues(std::string& result, std::vector<BT<std::string>>& values);
2018-08-09 18:06:22 +02:00
ItemVector const& GetItems() const;
std::vector<std::string> const& GetDirectories() const;
2020-02-01 23:06:01 +01:00
std::vector<BT<std::string>> GetDirectoriesWithBacktraces();
2018-08-09 18:06:22 +02:00
std::vector<std::string> const& GetDepends() const;
std::vector<std::string> const& GetFrameworkPaths() const;
2015-04-27 22:25:09 +02:00
std::string GetLinkLanguage() const { return this->LinkLanguage; }
2018-08-09 18:06:22 +02:00
std::vector<std::string> const& GetRuntimeSearchPath() const;
std::string const& GetRuntimeFlag() const { return this->RuntimeFlag; }
std::string const& GetRuntimeSep() const { return this->RuntimeSep; }
2018-08-09 18:06:22 +02:00
void GetRPath(std::vector<std::string>& runtimeDirs, bool for_install) const;
std::string GetRPathString(bool for_install) const;
std::string GetChrpathString() const;
std::set<cmGeneratorTarget const*> const& GetSharedLibrariesLinked() const;
2020-02-01 23:06:01 +01:00
std::string const& GetLibLinkFileFlag() const
{
return this->LibLinkFileFlag;
}
std::string const& GetRPathLinkFlag() const { return this->RPathLinkFlag; }
2018-08-09 18:06:22 +02:00
std::string GetRPathLinkString() const;
2016-07-09 11:21:54 +02:00
2017-04-14 19:02:05 +02:00
std::string GetConfig() const { return this->Config; }
2018-08-09 18:06:22 +02:00
2020-02-01 23:06:01 +01:00
const cmGeneratorTarget* GetTarget() { return this->Target; }
private:
2020-08-30 11:54:41 +02:00
void AddItem(BT<std::string> const& item, const cmGeneratorTarget* tgt);
void AddSharedDepItem(BT<std::string> const& item,
cmGeneratorTarget const* 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;
2016-03-13 13:35:51 +01:00
std::set<cmGeneratorTarget const*> SharedLibrariesLinked;
// Context information.
2018-08-09 18:06:22 +02:00
cmGeneratorTarget const* const Target;
cmMakefile* const Makefile;
cmGlobalGenerator* const GlobalGenerator;
cmake* const CMakeInstance;
// Configuration information.
2018-08-09 18:06:22 +02:00
std::string const Config;
2015-04-27 22:25:09 +02:00
std::string LinkLanguage;
// 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
};
const char* LoaderFlag;
std::string LibLinkFlag;
std::string LibLinkFileFlag;
std::string LibLinkSuffix;
std::string RuntimeFlag;
std::string RuntimeSep;
std::string RuntimeAlways;
std::string RPathLinkFlag;
SharedDepMode SharedDependencyMode;
2016-07-09 11:21:54 +02:00
enum LinkType
{
LinkUnknown,
LinkStatic,
LinkShared
};
2015-11-17 17:22:37 +01:00
void SetCurrentLinkType(LinkType lt);
// Link type adjustment.
void ComputeLinkTypeInfo();
LinkType StartLinkType;
LinkType CurrentLinkType;
std::string StaticLinkTypeFlag;
std::string SharedLinkTypeFlag;
// Link item parsing.
void ComputeItemParserInfo();
std::vector<std::string> StaticLinkExtensions;
std::vector<std::string> SharedLinkExtensions;
std::vector<std::string> LinkExtensions;
2015-04-27 22:25:09 +02:00
std::set<std::string> LinkPrefixes;
cmsys::RegularExpression ExtractStaticLibraryName;
cmsys::RegularExpression ExtractSharedLibraryName;
cmsys::RegularExpression ExtractAnyLibraryName;
std::string SharedRegexString;
void AddLinkPrefix(const char* p);
void AddLinkExtension(const char* e, LinkType type);
2013-11-03 12:27:13 +02:00
std::string CreateExtensionRegex(std::vector<std::string> const& exts,
LinkType type);
std::string NoCaseExpression(const char* str);
// Handling of link items.
2020-08-30 11:54:41 +02:00
void AddTargetItem(BT<std::string> const& item,
const cmGeneratorTarget* target);
void AddFullItem(BT<std::string> const& item);
bool CheckImplicitDirItem(std::string const& item);
2020-08-30 11:54:41 +02:00
void AddUserItem(BT<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);
2015-04-27 22:25:09 +02:00
std::set<std::string> FrameworkPathsEmmitted;
cmsys::RegularExpression SplitFramework;
// Linker search path computation.
2020-08-30 11:54:41 +02:00
std::unique_ptr<cmOrderDirectories> OrderLinkerSearchPath;
bool FinishLinkerSearchDirectories();
void PrintLinkPolicyDiagnosis(std::ostream&);
2009-10-04 10:30:41 +03:00
// Implicit link libraries and directories for linker language.
void LoadImplicitLinkInfo();
void AddImplicitLinkInfo();
void AddImplicitLinkInfo(std::string const& lang);
2020-08-30 11:54:41 +02:00
void AddRuntimeLinkLibrary(std::string const& lang);
2015-04-27 22:25:09 +02:00
std::set<std::string> ImplicitLinkDirs;
std::set<std::string> ImplicitLinkLibs;
2010-06-23 01:18:35 +03:00
// Additional paths configured by the runtime linker
std::vector<std::string> RuntimeLinkDirs;
// Linker search path compatibility mode.
2015-04-27 22:25:09 +02:00
std::set<std::string> OldLinkDirMask;
std::vector<std::string> OldLinkDirItems;
std::vector<std::string> OldUserFlagItems;
2015-08-17 11:37:30 +02:00
std::set<std::string> CMP0060WarnItems;
2015-11-17 17:22:37 +01:00
// Dependent library path computation.
2020-08-30 11:54:41 +02:00
std::unique_ptr<cmOrderDirectories> OrderDependentRPath;
// Runtime path computation.
2020-08-30 11:54:41 +02:00
std::unique_ptr<cmOrderDirectories> OrderRuntimeSearchPath;
2015-11-17 17:22:37 +01:00
bool OldLinkDirMode;
bool OpenBSD;
bool LinkDependsNoShared;
bool RuntimeUseChrpath;
bool NoSONameUsesPath;
bool LinkWithRuntimePath;
bool LinkTypeEnabled;
bool ArchivesMayBeShared;
bool CMP0060Warn;
2014-08-03 19:52:23 +02:00
void AddLibraryRuntimeInfo(std::string const& fullPath,
2016-03-13 13:35:51 +01:00
const cmGeneratorTarget* target);
void AddLibraryRuntimeInfo(std::string const& fullPath);
};
#endif