cmGeneratorExpressionDAGChecker.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /*============================================================================
  2. CMake - Cross Platform Makefile Generator
  3. Copyright 2012 Stephen Kelly <[email protected]>
  4. Distributed under the OSI-approved BSD License (the "License");
  5. see accompanying file Copyright.txt for details.
  6. This software is distributed WITHOUT ANY WARRANTY; without even the
  7. implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  8. See the License for more information.
  9. ============================================================================*/
  10. #ifndef cmGeneratorExpressionDAGChecker_h
  11. #define cmGeneratorExpressionDAGChecker_h
  12. #include "cmStandardIncludes.h"
  13. #include "cmGeneratorExpressionEvaluator.h"
  14. #define CM_FOR_EACH_TRANSITIVE_PROPERTY_METHOD(F) \
  15. F(EvaluatingIncludeDirectories) \
  16. F(EvaluatingSystemIncludeDirectories) \
  17. F(EvaluatingCompileDefinitions) \
  18. F(EvaluatingCompileOptions) \
  19. F(EvaluatingAutoUicOptions)
  20. #define CM_FOR_EACH_TRANSITIVE_PROPERTY_NAME(F) \
  21. F(INCLUDE_DIRECTORIES) \
  22. F(SYSTEM_INCLUDE_DIRECTORIES) \
  23. F(COMPILE_DEFINITIONS) \
  24. F(COMPILE_OPTIONS) \
  25. F(AUTOUIC_OPTIONS)
  26. //----------------------------------------------------------------------------
  27. struct cmGeneratorExpressionDAGChecker
  28. {
  29. cmGeneratorExpressionDAGChecker(const cmListFileBacktrace &backtrace,
  30. const std::string &target,
  31. const std::string &property,
  32. const GeneratorExpressionContent *content,
  33. cmGeneratorExpressionDAGChecker *parent);
  34. enum Result {
  35. DAG,
  36. SELF_REFERENCE,
  37. CYCLIC_REFERENCE,
  38. ALREADY_SEEN
  39. };
  40. Result check() const;
  41. void reportError(cmGeneratorExpressionContext *context,
  42. const std::string &expr);
  43. bool EvaluatingLinkLibraries(const char *tgt = 0);
  44. #define DECLARE_TRANSITIVE_PROPERTY_METHOD(METHOD) \
  45. bool METHOD () const;
  46. CM_FOR_EACH_TRANSITIVE_PROPERTY_METHOD(DECLARE_TRANSITIVE_PROPERTY_METHOD)
  47. #undef DECLARE_TRANSITIVE_PROPERTY_METHOD
  48. bool GetTransitivePropertiesOnly();
  49. void SetTransitivePropertiesOnly()
  50. { this->TransitivePropertiesOnly = true; }
  51. private:
  52. Result checkGraph() const;
  53. private:
  54. const cmGeneratorExpressionDAGChecker * const Parent;
  55. const std::string Target;
  56. const std::string Property;
  57. std::map<cmStdString, std::set<cmStdString> > Seen;
  58. const GeneratorExpressionContent * const Content;
  59. const cmListFileBacktrace Backtrace;
  60. Result CheckResult;
  61. bool TransitivePropertiesOnly;
  62. };
  63. #endif