cmGeneratorExpressionDAGChecker.h 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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_SELECT_BOTH(F, A1, A2) F(A1, A2)
  15. #define CM_SELECT_FIRST(F, A1, A2) F(A1)
  16. #define CM_SELECT_SECOND(F, A1, A2) F(A2)
  17. #define CM_FOR_EACH_TRANSITIVE_PROPERTY_IMPL(F, SELECT) \
  18. SELECT(F, EvaluatingIncludeDirectories, INCLUDE_DIRECTORIES) \
  19. SELECT(F, EvaluatingSystemIncludeDirectories, SYSTEM_INCLUDE_DIRECTORIES) \
  20. SELECT(F, EvaluatingCompileDefinitions, COMPILE_DEFINITIONS) \
  21. SELECT(F, EvaluatingCompileOptions, COMPILE_OPTIONS) \
  22. SELECT(F, EvaluatingAutoUicOptions, AUTOUIC_OPTIONS) \
  23. SELECT(F, EvaluatingSources, SOURCES) \
  24. SELECT(F, EvaluatingCompileFeatures, COMPILE_FEATURES)
  25. #define CM_FOR_EACH_TRANSITIVE_PROPERTY(F) \
  26. CM_FOR_EACH_TRANSITIVE_PROPERTY_IMPL(F, CM_SELECT_BOTH)
  27. #define CM_FOR_EACH_TRANSITIVE_PROPERTY_METHOD(F) \
  28. CM_FOR_EACH_TRANSITIVE_PROPERTY_IMPL(F, CM_SELECT_FIRST)
  29. #define CM_FOR_EACH_TRANSITIVE_PROPERTY_NAME(F) \
  30. CM_FOR_EACH_TRANSITIVE_PROPERTY_IMPL(F, CM_SELECT_SECOND)
  31. //----------------------------------------------------------------------------
  32. struct cmGeneratorExpressionDAGChecker
  33. {
  34. cmGeneratorExpressionDAGChecker(const cmListFileBacktrace &backtrace,
  35. const std::string &target,
  36. const std::string &property,
  37. const GeneratorExpressionContent *content,
  38. cmGeneratorExpressionDAGChecker *parent);
  39. enum Result {
  40. DAG,
  41. SELF_REFERENCE,
  42. CYCLIC_REFERENCE,
  43. ALREADY_SEEN
  44. };
  45. Result Check() const;
  46. void ReportError(cmGeneratorExpressionContext *context,
  47. const std::string &expr);
  48. bool EvaluatingLinkLibraries(const char *tgt = 0);
  49. #define DECLARE_TRANSITIVE_PROPERTY_METHOD(METHOD) \
  50. bool METHOD () const;
  51. CM_FOR_EACH_TRANSITIVE_PROPERTY_METHOD(DECLARE_TRANSITIVE_PROPERTY_METHOD)
  52. #undef DECLARE_TRANSITIVE_PROPERTY_METHOD
  53. bool GetTransitivePropertiesOnly();
  54. void SetTransitivePropertiesOnly()
  55. { this->TransitivePropertiesOnly = true; }
  56. std::string TopTarget() const;
  57. private:
  58. Result CheckGraph() const;
  59. private:
  60. const cmGeneratorExpressionDAGChecker * const Parent;
  61. const std::string Target;
  62. const std::string Property;
  63. std::map<std::string, std::set<std::string> > Seen;
  64. const GeneratorExpressionContent * const Content;
  65. const cmListFileBacktrace Backtrace;
  66. Result CheckResult;
  67. bool TransitivePropertiesOnly;
  68. };
  69. #endif