cmake/Source/cmGeneratorExpressionDAGChecker.h

104 lines
3.8 KiB
C
Raw Normal View History

2016-10-30 18:24:19 +01:00
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
2013-03-16 19:13:01 +02:00
#ifndef cmGeneratorExpressionDAGChecker_h
#define cmGeneratorExpressionDAGChecker_h
2018-01-26 17:06:56 +01:00
#include "cmConfigure.h" // IWYU pragma: keep
2016-10-30 18:24:19 +01:00
#include <map>
#include <set>
#include <string>
2013-03-16 19:13:01 +02:00
2020-02-01 23:06:01 +01:00
#include "cmListFileCache.h"
2016-10-30 18:24:19 +01:00
struct GeneratorExpressionContent;
struct cmGeneratorExpressionContext;
2018-10-28 12:09:07 +01:00
class cmGeneratorTarget;
2013-03-16 19:13:01 +02:00
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)
2016-07-09 11:21:54 +02:00
#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) \
SELECT(F, EvaluatingAutoUicOptions, AUTOUIC_OPTIONS) \
SELECT(F, EvaluatingSources, SOURCES) \
2018-10-28 12:09:07 +01:00
SELECT(F, EvaluatingCompileFeatures, COMPILE_FEATURES) \
SELECT(F, EvaluatingLinkOptions, LINK_OPTIONS) \
SELECT(F, EvaluatingLinkDirectories, LINK_DIRECTORIES) \
2020-02-01 23:06:01 +01:00
SELECT(F, EvaluatingLinkDepends, LINK_DEPENDS) \
SELECT(F, EvaluatingPrecompileHeaders, PRECOMPILE_HEADERS)
2016-07-09 11:21:54 +02:00
#define CM_FOR_EACH_TRANSITIVE_PROPERTY(F) \
2014-08-03 19:52:23 +02:00
CM_FOR_EACH_TRANSITIVE_PROPERTY_IMPL(F, CM_SELECT_BOTH)
2016-07-09 11:21:54 +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
2016-07-09 11:21:54 +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
{
2019-11-11 23:01:05 +01:00
cmGeneratorExpressionDAGChecker(cmListFileBacktrace backtrace,
2018-10-28 12:09:07 +01:00
cmGeneratorTarget const* target,
2019-11-11 23:01:05 +01:00
std::string property,
2016-07-09 11:21:54 +02:00
const GeneratorExpressionContent* content,
cmGeneratorExpressionDAGChecker* parent);
2018-10-28 12:09:07 +01:00
cmGeneratorExpressionDAGChecker(cmGeneratorTarget const* target,
2019-11-11 23:01:05 +01:00
std::string property,
2016-07-09 11:21:54 +02:00
const GeneratorExpressionContent* content,
cmGeneratorExpressionDAGChecker* parent);
enum Result
{
2013-03-16 19:13:01 +02:00
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
2016-07-09 11:21:54 +02:00
void ReportError(cmGeneratorExpressionContext* context,
const std::string& expr);
2013-03-16 19:13:01 +02:00
2020-08-30 11:54:41 +02:00
bool EvaluatingGenexExpression() const;
bool EvaluatingPICExpression() const;
bool EvaluatingLinkExpression() const;
bool EvaluatingLinkOptionsExpression() const;
bool EvaluatingLinkLibraries(cmGeneratorTarget const* tgt = nullptr) const;
2013-11-03 12:27:13 +02:00
2016-07-09 11:21:54 +02:00
#define DECLARE_TRANSITIVE_PROPERTY_METHOD(METHOD) bool METHOD() const;
2013-11-03 12:27:13 +02:00
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
2020-08-30 11:54:41 +02:00
bool GetTransitivePropertiesOnly() const;
2016-07-09 11:21:54 +02:00
void SetTransitivePropertiesOnly() { this->TransitivePropertiesOnly = true; }
2013-03-16 19:13:01 +02:00
2020-08-30 11:54:41 +02:00
cmGeneratorExpressionDAGChecker const* Top() const;
2018-10-28 12:09:07 +01:00
cmGeneratorTarget const* TopTarget() const;
2015-04-27 22:25:09 +02:00
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:
2016-07-09 11:21:54 +02:00
const cmGeneratorExpressionDAGChecker* const Parent;
2018-10-28 12:09:07 +01:00
cmGeneratorTarget const* Target;
2013-03-16 19:13:01 +02:00
const std::string Property;
2020-02-01 23:06:01 +01:00
mutable std::map<cmGeneratorTarget const*, std::set<std::string>> Seen;
2016-07-09 11:21:54 +02:00
const GeneratorExpressionContent* const Content;
2013-03-16 19:13:01 +02:00
const cmListFileBacktrace Backtrace;
Result CheckResult;
2013-11-03 12:27:13 +02:00
bool TransitivePropertiesOnly;
2013-03-16 19:13:01 +02:00
};
#endif