1 /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
2 file Copyright.txt or https://cmake.org/licensing for details. */
5 #include "cmConfigure.h" // IWYU pragma: keep
11 #include "cmListFileCache.h"
13 struct GeneratorExpressionContent;
14 struct cmGeneratorExpressionContext;
15 class cmGeneratorTarget;
17 #define CM_SELECT_BOTH(F, A1, A2) F(A1, A2)
18 #define CM_SELECT_FIRST(F, A1, A2) F(A1)
19 #define CM_SELECT_SECOND(F, A1, A2) F(A2)
21 #define CM_FOR_EACH_TRANSITIVE_PROPERTY_IMPL(F, SELECT) \
22 SELECT(F, EvaluatingIncludeDirectories, INCLUDE_DIRECTORIES) \
23 SELECT(F, EvaluatingSystemIncludeDirectories, SYSTEM_INCLUDE_DIRECTORIES) \
24 SELECT(F, EvaluatingCompileDefinitions, COMPILE_DEFINITIONS) \
25 SELECT(F, EvaluatingCompileOptions, COMPILE_OPTIONS) \
26 SELECT(F, EvaluatingAutoUicOptions, AUTOUIC_OPTIONS) \
27 SELECT(F, EvaluatingSources, SOURCES) \
28 SELECT(F, EvaluatingCompileFeatures, COMPILE_FEATURES) \
29 SELECT(F, EvaluatingLinkOptions, LINK_OPTIONS) \
30 SELECT(F, EvaluatingLinkDirectories, LINK_DIRECTORIES) \
31 SELECT(F, EvaluatingLinkDepends, LINK_DEPENDS) \
32 SELECT(F, EvaluatingPrecompileHeaders, PRECOMPILE_HEADERS)
34 #define CM_FOR_EACH_TRANSITIVE_PROPERTY(F) \
35 CM_FOR_EACH_TRANSITIVE_PROPERTY_IMPL(F, CM_SELECT_BOTH)
37 #define CM_FOR_EACH_TRANSITIVE_PROPERTY_METHOD(F) \
38 CM_FOR_EACH_TRANSITIVE_PROPERTY_IMPL(F, CM_SELECT_FIRST)
40 #define CM_FOR_EACH_TRANSITIVE_PROPERTY_NAME(F) \
41 CM_FOR_EACH_TRANSITIVE_PROPERTY_IMPL(F, CM_SELECT_SECOND)
43 struct cmGeneratorExpressionDAGChecker
45 cmGeneratorExpressionDAGChecker(cmListFileBacktrace backtrace,
46 cmGeneratorTarget const* target,
48 const GeneratorExpressionContent* content,
49 cmGeneratorExpressionDAGChecker* parent);
50 cmGeneratorExpressionDAGChecker(cmGeneratorTarget const* target,
52 const GeneratorExpressionContent* content,
53 cmGeneratorExpressionDAGChecker* parent);
65 void ReportError(cmGeneratorExpressionContext* context,
66 const std::string& expr);
68 bool EvaluatingGenexExpression() const;
69 bool EvaluatingPICExpression() const;
70 bool EvaluatingCompileExpression() const;
71 bool EvaluatingLinkExpression() const;
72 bool EvaluatingLinkOptionsExpression() const;
80 bool EvaluatingLinkLibraries(cmGeneratorTarget const* tgt = nullptr,
81 ForGenex genex = ForGenex::ANY) const;
83 #define DECLARE_TRANSITIVE_PROPERTY_METHOD(METHOD) bool METHOD() const;
85 CM_FOR_EACH_TRANSITIVE_PROPERTY_METHOD(DECLARE_TRANSITIVE_PROPERTY_METHOD)
87 #undef DECLARE_TRANSITIVE_PROPERTY_METHOD
89 bool GetTransitivePropertiesOnly() const;
90 void SetTransitivePropertiesOnly() { this->TransitivePropertiesOnly = true; }
92 cmGeneratorExpressionDAGChecker const* Top() const;
93 cmGeneratorTarget const* TopTarget() const;
96 Result CheckGraph() const;
99 const cmGeneratorExpressionDAGChecker* const Parent;
100 cmGeneratorTarget const* Target;
101 const std::string Property;
102 mutable std::map<cmGeneratorTarget const*, std::set<std::string>> Seen;
103 const GeneratorExpressionContent* const Content;
104 const cmListFileBacktrace Backtrace;
106 bool TransitivePropertiesOnly;