blob: 86c2dd2e7e3860e4017b0663c4ed3740b11826d9 [file] [log] [blame] [edit]
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file LICENSE.rst or https://cmake.org/licensing for details. */
#include "cmTargetPropertyEntry.h"
#include <string>
#include <utility>
#include <cm/memory>
#include "cmGeneratorExpression.h"
#include "cmLinkItem.h"
#include "cmListFileCache.h"
class cmake;
namespace cm {
cmLinkItem TargetPropertyEntry::NoLinkItem;
class TargetPropertyEntryString : public TargetPropertyEntry
{
public:
TargetPropertyEntryString(BT<std::string> propertyValue,
cmLinkItem const& item = NoLinkItem)
: TargetPropertyEntry(item)
, PropertyValue(std::move(propertyValue))
{
}
std::string const& Evaluate(cm::GenEx::Context const&,
cmGeneratorTarget const*,
cmGeneratorExpressionDAGChecker*) const override
{
return this->PropertyValue.Value;
}
cmListFileBacktrace GetBacktrace() const override
{
return this->PropertyValue.Backtrace;
}
std::string const& GetInput() const override
{
return this->PropertyValue.Value;
}
private:
BT<std::string> PropertyValue;
};
class TargetPropertyEntryGenex : public TargetPropertyEntry
{
public:
TargetPropertyEntryGenex(std::unique_ptr<cmCompiledGeneratorExpression> cge,
cmLinkItem const& item = NoLinkItem)
: TargetPropertyEntry(item)
, ge(std::move(cge))
{
}
std::string const& Evaluate(
cm::GenEx::Context const& context, cmGeneratorTarget const* headTarget,
cmGeneratorExpressionDAGChecker* dagChecker) const override
{
return this->ge->Evaluate(context, dagChecker, headTarget);
}
cmListFileBacktrace GetBacktrace() const override
{
return this->ge->GetBacktrace();
}
std::string const& GetInput() const override { return this->ge->GetInput(); }
bool GetHadContextSensitiveCondition() const override
{
return this->ge->GetHadContextSensitiveCondition();
}
private:
std::unique_ptr<cmCompiledGeneratorExpression> const ge;
};
std::unique_ptr<TargetPropertyEntry> TargetPropertyEntry::Create(
cmake& cmakeInstance, const BT<std::string>& propertyValue,
bool evaluateForBuildsystem)
{
if (cmGeneratorExpression::Find(propertyValue.Value) != std::string::npos) {
cmGeneratorExpression ge(cmakeInstance, propertyValue.Backtrace);
std::unique_ptr<cmCompiledGeneratorExpression> cge =
ge.Parse(propertyValue.Value);
cge->SetEvaluateForBuildsystem(evaluateForBuildsystem);
return std::unique_ptr<TargetPropertyEntry>(
cm::make_unique<TargetPropertyEntryGenex>(std::move(cge)));
}
return std::unique_ptr<TargetPropertyEntry>(
cm::make_unique<TargetPropertyEntryString>(propertyValue));
}
TargetPropertyEntry::TargetPropertyEntry(cmLinkItem const& item)
: LinkItem(item)
{
}
bool TargetPropertyEntry::GetHadContextSensitiveCondition() const
{
return false;
}
}