cmGeneratorExpressionDAGChecker.h 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file Copyright.txt or https://cmake.org/licensing for details. */
  3. #pragma once
  4. #include "cmConfigure.h" // IWYU pragma: keep
  5. #include <map>
  6. #include <set>
  7. #include <string>
  8. #include "cmListFileCache.h"
  9. struct GeneratorExpressionContent;
  10. struct cmGeneratorExpressionContext;
  11. class cmGeneratorTarget;
  12. class cmLocalGenerator;
  13. struct cmGeneratorExpressionDAGChecker
  14. {
  15. cmGeneratorExpressionDAGChecker(cmListFileBacktrace backtrace,
  16. cmGeneratorTarget const* target,
  17. std::string property,
  18. const GeneratorExpressionContent* content,
  19. cmGeneratorExpressionDAGChecker* parent,
  20. cmLocalGenerator const* contextLG);
  21. cmGeneratorExpressionDAGChecker(cmGeneratorTarget const* target,
  22. std::string property,
  23. const GeneratorExpressionContent* content,
  24. cmGeneratorExpressionDAGChecker* parent,
  25. cmLocalGenerator const* contextLG);
  26. enum Result
  27. {
  28. DAG,
  29. SELF_REFERENCE,
  30. CYCLIC_REFERENCE,
  31. ALREADY_SEEN
  32. };
  33. Result Check() const;
  34. void ReportError(cmGeneratorExpressionContext* context,
  35. const std::string& expr);
  36. bool EvaluatingTransitiveProperty() const;
  37. bool EvaluatingGenexExpression() const;
  38. bool EvaluatingPICExpression() const;
  39. bool EvaluatingCompileExpression() const;
  40. bool EvaluatingLinkExpression() const;
  41. bool EvaluatingLinkOptionsExpression() const;
  42. bool EvaluatingLinkerLauncher() const;
  43. enum class ForGenex
  44. {
  45. ANY,
  46. LINK_LIBRARY,
  47. LINK_GROUP
  48. };
  49. bool EvaluatingLinkLibraries(cmGeneratorTarget const* tgt = nullptr,
  50. ForGenex genex = ForGenex::ANY) const;
  51. bool EvaluatingSources() const;
  52. bool GetTransitivePropertiesOnly() const;
  53. void SetTransitivePropertiesOnly() { this->TransitivePropertiesOnly = true; }
  54. bool GetTransitivePropertiesOnlyCMP0131() const;
  55. void SetTransitivePropertiesOnlyCMP0131() { this->CMP0131 = true; }
  56. cmGeneratorTarget const* TopTarget() const;
  57. private:
  58. Result CheckGraph() const;
  59. const cmGeneratorExpressionDAGChecker* const Parent;
  60. const cmGeneratorExpressionDAGChecker* const Top;
  61. cmGeneratorTarget const* Target;
  62. const std::string Property;
  63. mutable std::map<cmGeneratorTarget const*, std::set<std::string>> Seen;
  64. const GeneratorExpressionContent* const Content;
  65. const cmListFileBacktrace Backtrace;
  66. Result CheckResult;
  67. bool TransitivePropertiesOnly = false;
  68. bool CMP0131 = false;
  69. bool TopIsTransitiveProperty = false;
  70. };