/*============================================================================ CMake - Cross Platform Makefile Generator Copyright 2012 Stephen Kelly Distributed under the OSI-approved BSD License (the "License"); see accompanying file Copyright.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the License for more information. ============================================================================*/ #ifndef cmGeneratorExpressionEvaluator_h #define cmGeneratorExpressionEvaluator_h #include #include #include "cmListFileCache.h" class cmTarget; //---------------------------------------------------------------------------- struct cmGeneratorExpressionContext { cmListFileBacktrace Backtrace; std::set DependTargets; std::set AllTargets; std::set SeenTargetProperties; cmMakefile *Makefile; const char *Config; cmTarget *HeadTarget; // The target whose property is being evaluated. cmTarget *CurrentTarget; // The dependent of HeadTarget which appears // directly or indirectly in the property. bool Quiet; bool HadError; bool HadContextSensitiveCondition; }; struct cmGeneratorExpressionDAGChecker; struct cmGeneratorExpressionNode; //---------------------------------------------------------------------------- struct cmGeneratorExpressionEvaluator { cmGeneratorExpressionEvaluator() {} virtual ~cmGeneratorExpressionEvaluator() {} enum Type { Text, Generator }; virtual Type GetType() const = 0; virtual std::string Evaluate(cmGeneratorExpressionContext *context, cmGeneratorExpressionDAGChecker *) const = 0; private: cmGeneratorExpressionEvaluator(const cmGeneratorExpressionEvaluator &); void operator=(const cmGeneratorExpressionEvaluator &); }; struct TextContent : public cmGeneratorExpressionEvaluator { TextContent(const char *start, unsigned int length) : Content(start), Length(length) { } std::string Evaluate(cmGeneratorExpressionContext *, cmGeneratorExpressionDAGChecker *) const { return std::string(this->Content, this->Length); } Type GetType() const { return cmGeneratorExpressionEvaluator::Text; } void Extend(unsigned int length) { this->Length += length; } unsigned int GetLength() { return this->Length; } private: const char *Content; unsigned int Length; }; //---------------------------------------------------------------------------- struct GeneratorExpressionContent : public cmGeneratorExpressionEvaluator { GeneratorExpressionContent(const char *startContent, unsigned int length); void SetIdentifier(std::vector identifier) { this->IdentifierChildren = identifier; } void SetParameters( std::vector > parameters) { this->ParamChildren = parameters; } Type GetType() const { return cmGeneratorExpressionEvaluator::Generator; } std::string Evaluate(cmGeneratorExpressionContext *context, cmGeneratorExpressionDAGChecker *) const; std::string GetOriginalExpression() const; ~GeneratorExpressionContent(); private: std::string EvaluateParameters(const cmGeneratorExpressionNode *node, const std::string &identifier, cmGeneratorExpressionContext *context, cmGeneratorExpressionDAGChecker *dagChecker, std::vector ¶meters) const; private: std::vector IdentifierChildren; std::vector > ParamChildren; const char *StartContent; unsigned int ContentLength; }; #endif