Files
CMake/Source/cmTargetPropertyEntry.cxx
Marc Chevrier dee8799d16 FileSet management: Introduce dedicated classes for generation
To manage the generation step, introduce cmGeneratorFileSet and
cmGeneratorFileSets classes.
These reorganizations of the code are done in preparation of the
implementation of SOURCES file set type as well as user's file set types.

Issues: #27550, #27383
2026-02-19 17:35:56 +01:00

110 lines
2.9 KiB
C++

/* 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;
}
}