| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- /*============================================================================
- CMake - Cross Platform Makefile Generator
- Copyright 2012 Stephen Kelly <[email protected]>
- 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.
- ============================================================================*/
- #include "cmGeneratorExpressionDAGChecker.h"
- #include "cmMakefile.h"
- //----------------------------------------------------------------------------
- cmGeneratorExpressionDAGChecker::cmGeneratorExpressionDAGChecker(
- const cmListFileBacktrace &backtrace,
- const std::string &target,
- const std::string &property,
- const GeneratorExpressionContent *content,
- cmGeneratorExpressionDAGChecker *parent)
- : Parent(parent), Target(target), Property(property),
- Content(content), Backtrace(backtrace)
- {
- this->CheckResult = this->checkGraph();
- }
- //----------------------------------------------------------------------------
- cmGeneratorExpressionDAGChecker::Result
- cmGeneratorExpressionDAGChecker::check() const
- {
- return this->CheckResult;
- }
- //----------------------------------------------------------------------------
- void cmGeneratorExpressionDAGChecker::reportError(
- cmGeneratorExpressionContext *context,
- const std::string &expr)
- {
- if (this->CheckResult == DAG)
- {
- return;
- }
- context->HadError = true;
- if (context->Quiet)
- {
- return;
- }
- const cmGeneratorExpressionDAGChecker *parent = this->Parent;
- if (parent && !parent->Parent)
- {
- cmOStringStream e;
- e << "Error evaluating generator expression:\n"
- << " " << expr << "\n"
- << "Self reference on target \""
- << context->HeadTarget->GetName() << "\".\n";
- context->Makefile->GetCMakeInstance()
- ->IssueMessage(cmake::FATAL_ERROR, e.str().c_str(),
- parent->Backtrace);
- return;
- }
- {
- cmOStringStream e;
- e << "Error evaluating generator expression:\n"
- << " " << expr << "\n"
- << "Dependency loop found.";
- context->Makefile->GetCMakeInstance()
- ->IssueMessage(cmake::FATAL_ERROR, e.str().c_str(),
- context->Backtrace);
- }
- int loopStep = 1;
- while (parent)
- {
- cmOStringStream e;
- e << "Loop step " << loopStep << "\n"
- << " "
- << (parent->Content ? parent->Content->GetOriginalExpression() : expr)
- << "\n";
- context->Makefile->GetCMakeInstance()
- ->IssueMessage(cmake::FATAL_ERROR, e.str().c_str(),
- parent->Backtrace);
- parent = parent->Parent;
- ++loopStep;
- }
- }
- //----------------------------------------------------------------------------
- cmGeneratorExpressionDAGChecker::Result
- cmGeneratorExpressionDAGChecker::checkGraph() const
- {
- const cmGeneratorExpressionDAGChecker *parent = this->Parent;
- while (parent)
- {
- if (this->Target == parent->Target && this->Property == parent->Property)
- {
- return parent->Parent ? CYCLIC_REFERENCE : SELF_REFERENCE;
- }
- parent = parent->Parent;
- }
- return DAG;
- }
|