Files
CMake/Source/cmLinkItem.cxx
Craig Scott 1b764b6816 cmLinkItem: Remove redundant cmLinkImplItem class
The cmLinkImplItem class used to contain some additional members
to support the CMP0027 policy. Since the CMP0027 policy and those
associated members were removed, the cmLinkImplItem class has been
a plain wrapper around cmLinkItem with no additional members.
It is no longer needed and cmLinkItem can be used directly wherever
cmLinkImplItem was used previously.
2025-10-07 10:44:28 -04:00

89 lines
2.2 KiB
C++

/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file LICENSE.rst or https://cmake.org/licensing for details. */
#include "cmLinkItem.h"
#include <utility> // IWYU pragma: keep
#include <cm/optional>
#include <cm/string_view>
#include <cmext/string_view>
#include "cmGeneratorTarget.h"
#include "cmStringAlgorithms.h"
std::string const cmLinkItem::DEFAULT = "DEFAULT";
cmLinkItem::cmLinkItem(std::string n, bool c, cmListFileBacktrace bt,
std::string feature)
: String(std::move(n))
, Feature(std::move(feature))
, Cross(c)
, Backtrace(std::move(bt))
{
}
cmLinkItem::cmLinkItem(cmGeneratorTarget const* t, bool c,
cmListFileBacktrace bt, std::string feature)
: Target(t)
, Feature(std::move(feature))
, Cross(c)
, Backtrace(std::move(bt))
{
}
std::string const& cmLinkItem::AsStr() const
{
return this->Target ? this->Target->GetName() : this->String;
}
bool operator<(cmLinkItem const& l, cmLinkItem const& r)
{
// Order among targets.
if (l.Target && r.Target) {
if (l.Target != r.Target) {
return l.Target < r.Target;
}
// Order identical targets via cross-config.
return l.Cross < r.Cross;
}
// Order targets before strings.
if (l.Target) {
return true;
}
if (r.Target) {
return false;
}
// Order among strings.
if (l.String != r.String) {
return l.String < r.String;
}
// Order identical strings via cross-config.
return l.Cross < r.Cross;
}
bool operator==(cmLinkItem const& l, cmLinkItem const& r)
{
return l.Target == r.Target && l.String == r.String && l.Cross == r.Cross;
}
std::ostream& operator<<(std::ostream& os, cmLinkItem const& item)
{
return os << item.AsStr();
}
namespace {
cm::string_view const LL_BEGIN = "<LINK_LIBRARY:"_s;
cm::string_view const LL_END = "</LINK_LIBRARY:"_s;
}
cm::optional<std::string> ParseLinkFeature(std::string const& item)
{
if (cmHasPrefix(item, LL_BEGIN) && cmHasSuffix(item, '>')) {
return item.substr(LL_BEGIN.length(),
item.find('>', LL_BEGIN.length()) - LL_BEGIN.length());
}
if (cmHasPrefix(item, LL_END) && cmHasSuffix(item, '>')) {
return cmLinkItem::DEFAULT;
}
return cm::nullopt;
}