cmake/Source/cmComputeLinkInformation.h

314 lines
10 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. */
2021-09-14 00:13:48 +02:00
#pragma once
2017-07-20 19:35:53 +02:00
#include "cmConfigure.h" // IWYU pragma: keep
2016-10-30 18:24:19 +01:00
#include <iosfwd>
2022-08-04 22:12:04 +02:00
#include <map>
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"
2022-08-04 22:12:04 +02:00
#include "cmComputeLinkDepends.h"
2020-08-30 11:54:41 +02:00
#include "cmListFileCache.h"
2021-11-20 13:41:27 +01:00
#include "cmValue.h"
2020-08-30 11:54:41 +02:00
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
{
2022-08-04 22:12:04 +02:00
private:
class FeatureDescriptor;
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();
2021-09-14 00:13:48 +02:00
enum class ItemIsPath
{
No,
Yes,
};
struct Item
{
2021-09-14 00:13:48 +02:00
Item(BT<std::string> v, ItemIsPath isPath,
2022-08-04 22:12:04 +02:00
cmGeneratorTarget const* target = nullptr,
FeatureDescriptor const* feature = nullptr)
2019-11-11 23:01:05 +01:00
: Value(std::move(v))
2021-09-14 00:13:48 +02:00
, IsPath(isPath)
2016-07-09 11:21:54 +02:00
, Target(target)
2022-08-04 22:12:04 +02:00
, Feature(feature)
2016-07-09 11:21:54 +02:00
{
}
2020-08-30 11:54:41 +02:00
BT<std::string> Value;
2022-08-04 22:12:04 +02:00
ItemIsPath IsPath = ItemIsPath::No;
2019-11-11 23:01:05 +01:00
cmGeneratorTarget const* Target = nullptr;
2022-08-04 22:12:04 +02:00
bool HasFeature() const { return this->Feature != nullptr; }
const std::string& GetFeatureName() const
{
return HasFeature() ? this->Feature->Name
: cmComputeLinkDepends::LinkEntry::DEFAULT;
}
BT<std::string> GetFormattedItem(std::string const& path) const
{
return { (this->Feature != nullptr)
? this->Feature->GetDecoratedItem(path, this->IsPath)
: path,
Value.Backtrace };
}
private:
FeatureDescriptor const* Feature = 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;
2021-09-14 00:13:48 +02:00
std::set<std::string> const& GetFrameworkPathsEmitted() 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;
2023-07-26 10:08:00 +02:00
std::vector<cmGeneratorTarget const*> const& GetObjectLibrariesLinked()
const;
2021-09-14 00:13:48 +02:00
std::vector<cmGeneratorTarget const*> const& GetRuntimeDLLs() const
{
return this->RuntimeDLLs;
}
2020-02-01 23:06:01 +01:00
std::string const& GetLibLinkFileFlag() const
{
return this->LibLinkFileFlag;
}
2021-09-14 00:13:48 +02:00
std::string const& GetObjLinkFileFlag() const
{
return this->ObjLinkFileFlag;
}
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:
2022-08-04 22:12:04 +02:00
using LinkEntry = cmComputeLinkDepends::LinkEntry;
void AddItem(LinkEntry const& entry);
void AddSharedDepItem(LinkEntry const& entry);
2021-09-14 00:13:48 +02:00
void AddRuntimeDLL(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;
2023-07-26 10:08:00 +02:00
std::vector<cmGeneratorTarget const*> ObjectLibrariesLinked;
2021-09-14 00:13:48 +02:00
std::vector<cmGeneratorTarget const*> RuntimeDLLs;
// 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
};
2021-11-20 13:41:27 +01:00
cmValue LoaderFlag;
std::string LibLinkFlag;
std::string LibLinkFileFlag;
2021-09-14 00:13:48 +02:00
std::string ObjLinkFileFlag;
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;
2021-09-14 00:13:48 +02:00
void AddLinkPrefix(std::string const& p);
void AddLinkExtension(std::string const& e, LinkType type);
2013-11-03 12:27:13 +02:00
std::string CreateExtensionRegex(std::vector<std::string> const& exts,
LinkType type);
2021-09-14 00:13:48 +02:00
std::string NoCaseExpression(std::string const& str);
// Handling of link items.
2022-08-04 22:12:04 +02:00
void AddTargetItem(LinkEntry const& entry);
void AddFullItem(LinkEntry const& entry);
bool CheckImplicitDirItem(LinkEntry const& entry);
void AddUserItem(LinkEntry const& entry, bool pathNotKnown);
void AddFrameworkItem(LinkEntry const& entry);
2022-03-29 21:10:50 +02:00
void DropDirectoryItem(BT<std::string> const& item);
2022-08-04 22:12:04 +02:00
bool CheckSharedLibNoSOName(LinkEntry const& entry);
void AddSharedLibNoSOName(LinkEntry const& entry);
void HandleBadFullItem(LinkEntry const& entry, std::string const& file);
// Framework info.
void ComputeFrameworkInfo();
void AddFrameworkPath(std::string const& p);
2021-09-14 00:13:48 +02:00
std::set<std::string> FrameworkPathsEmitted;
// 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);
2022-08-04 22:12:04 +02:00
class FeatureDescriptor
{
public:
FeatureDescriptor() = default;
const std::string Name;
const bool Supported = false;
const std::string Prefix;
const std::string Suffix;
std::string GetDecoratedItem(std::string const& library,
ItemIsPath isPath) const;
std::string GetDecoratedItem(std::string const& library,
std::string const& linkItem,
std::string const& defaultValue,
ItemIsPath isPath) const;
protected:
FeatureDescriptor(std::string name, std::string itemFormat);
FeatureDescriptor(std::string name, std::string itemPathFormat,
std::string itemNameFormat);
FeatureDescriptor(std::string name, std::string prefix,
std::string itemPathFormat, std::string itemNameFormat,
std::string suffix);
FeatureDescriptor(std::string name, std::string prefix, std::string suffix,
bool isGroup);
private:
std::string ItemPathFormat;
std::string ItemNameFormat;
};
class LibraryFeatureDescriptor : public FeatureDescriptor
{
public:
LibraryFeatureDescriptor(std::string name, std::string itemFormat);
LibraryFeatureDescriptor(std::string name, std::string itemPathFormat,
std::string itemNameFormat);
LibraryFeatureDescriptor(std::string name, std::string prefix,
std::string itemPathFormat,
std::string itemNameFormat, std::string suffix);
};
std::map<std::string, FeatureDescriptor> LibraryFeatureDescriptors;
bool AddLibraryFeature(std::string const& feature);
FeatureDescriptor const& GetLibraryFeature(std::string const& feature) const;
FeatureDescriptor const* FindLibraryFeature(
std::string const& feature) const;
class GroupFeatureDescriptor : public FeatureDescriptor
{
public:
GroupFeatureDescriptor(std::string name, std::string prefix,
std::string suffix);
};
std::map<std::string, FeatureDescriptor> GroupFeatureDescriptors;
FeatureDescriptor const& GetGroupFeature(std::string const& feature);
};