cmake/Source/cmGeneratorExpressionDAGChecker.h

97 lines
3.4 KiB
C
Raw Normal View History

2013-03-16 19:13:01 +02:00
/*============================================================================
CMake - Cross Platform Makefile Generator
Copyright 2012 Stephen Kelly <steveire@gmail.com>
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 cmGeneratorExpressionDAGChecker_h
#define cmGeneratorExpressionDAGChecker_h
#include "cmStandardIncludes.h"
#include "cmGeneratorExpressionEvaluator.h"
2014-08-03 19:52:23 +02:00
#define CM_SELECT_BOTH(F, A1, A2) F(A1, A2)
#define CM_SELECT_FIRST(F, A1, A2) F(A1)
#define CM_SELECT_SECOND(F, A1, A2) F(A2)
#define CM_FOR_EACH_TRANSITIVE_PROPERTY_IMPL(F, SELECT) \
SELECT(F, EvaluatingIncludeDirectories, INCLUDE_DIRECTORIES) \
SELECT(F, EvaluatingSystemIncludeDirectories, SYSTEM_INCLUDE_DIRECTORIES) \
SELECT(F, EvaluatingCompileDefinitions, COMPILE_DEFINITIONS) \
SELECT(F, EvaluatingCompileOptions, COMPILE_OPTIONS) \
2015-04-27 22:25:09 +02:00
SELECT(F, EvaluatingAutoUicOptions, AUTOUIC_OPTIONS) \
SELECT(F, EvaluatingSources, SOURCES) \
SELECT(F, EvaluatingCompileFeatures, COMPILE_FEATURES)
2014-08-03 19:52:23 +02:00
#define CM_FOR_EACH_TRANSITIVE_PROPERTY(F) \
CM_FOR_EACH_TRANSITIVE_PROPERTY_IMPL(F, CM_SELECT_BOTH)
2013-11-03 12:27:13 +02:00
#define CM_FOR_EACH_TRANSITIVE_PROPERTY_METHOD(F) \
2014-08-03 19:52:23 +02:00
CM_FOR_EACH_TRANSITIVE_PROPERTY_IMPL(F, CM_SELECT_FIRST)
2013-11-03 12:27:13 +02:00
#define CM_FOR_EACH_TRANSITIVE_PROPERTY_NAME(F) \
2014-08-03 19:52:23 +02:00
CM_FOR_EACH_TRANSITIVE_PROPERTY_IMPL(F, CM_SELECT_SECOND)
2013-11-03 12:27:13 +02:00
2013-03-16 19:13:01 +02:00
//----------------------------------------------------------------------------
struct cmGeneratorExpressionDAGChecker
{
cmGeneratorExpressionDAGChecker(const cmListFileBacktrace &backtrace,
const std::string &target,
const std::string &property,
const GeneratorExpressionContent *content,
cmGeneratorExpressionDAGChecker *parent);
2015-04-27 22:25:09 +02:00
cmGeneratorExpressionDAGChecker(const std::string &target,
const std::string &property,
const GeneratorExpressionContent *content,
cmGeneratorExpressionDAGChecker *parent);
2013-03-16 19:13:01 +02:00
enum Result {
DAG,
SELF_REFERENCE,
CYCLIC_REFERENCE,
ALREADY_SEEN
};
2014-08-03 19:52:23 +02:00
Result Check() const;
2013-03-16 19:13:01 +02:00
2014-08-03 19:52:23 +02:00
void ReportError(cmGeneratorExpressionContext *context,
2013-03-16 19:13:01 +02:00
const std::string &expr);
2013-11-03 12:27:13 +02:00
bool EvaluatingLinkLibraries(const char *tgt = 0);
#define DECLARE_TRANSITIVE_PROPERTY_METHOD(METHOD) \
bool METHOD () const;
2014-08-03 19:52:23 +02:00
CM_FOR_EACH_TRANSITIVE_PROPERTY_METHOD(DECLARE_TRANSITIVE_PROPERTY_METHOD)
#undef DECLARE_TRANSITIVE_PROPERTY_METHOD
2013-11-03 12:27:13 +02:00
bool GetTransitivePropertiesOnly();
void SetTransitivePropertiesOnly()
{ this->TransitivePropertiesOnly = true; }
2013-03-16 19:13:01 +02:00
2015-04-27 22:25:09 +02:00
std::string TopTarget() const;
2013-03-16 19:13:01 +02:00
private:
2014-08-03 19:52:23 +02:00
Result CheckGraph() const;
2015-04-27 22:25:09 +02:00
void Initialize();
2013-03-16 19:13:01 +02:00
private:
const cmGeneratorExpressionDAGChecker * const Parent;
const std::string Target;
const std::string Property;
2015-04-27 22:25:09 +02:00
std::map<std::string, std::set<std::string> > Seen;
2013-03-16 19:13:01 +02:00
const GeneratorExpressionContent * const Content;
const cmListFileBacktrace Backtrace;
Result CheckResult;
2013-11-03 12:27:13 +02:00
bool TransitivePropertiesOnly;
2013-03-16 19:13:01 +02:00
};
#endif