cmEvaluatedTargetProperty.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file LICENSE.rst or https://cmake.org/licensing for details. */
  3. #pragma once
  4. #include <memory>
  5. #include <string>
  6. #include <vector>
  7. #include "cmGeneratorTarget.h"
  8. #include "cmListFileCache.h"
  9. namespace cm {
  10. namespace GenEx {
  11. struct Context;
  12. }
  13. }
  14. class cmLinkItem;
  15. struct cmGeneratorExpressionDAGChecker;
  16. // Represent a target property entry after evaluating generator expressions
  17. // and splitting up lists.
  18. struct EvaluatedTargetPropertyEntry
  19. {
  20. EvaluatedTargetPropertyEntry(cmLinkItem const& item, cmListFileBacktrace bt);
  21. // Move-only.
  22. EvaluatedTargetPropertyEntry(EvaluatedTargetPropertyEntry&&) = default;
  23. EvaluatedTargetPropertyEntry(EvaluatedTargetPropertyEntry const&) = delete;
  24. EvaluatedTargetPropertyEntry& operator=(EvaluatedTargetPropertyEntry&&) =
  25. delete;
  26. EvaluatedTargetPropertyEntry& operator=(
  27. EvaluatedTargetPropertyEntry const&) = delete;
  28. cmLinkItem const& LinkItem;
  29. cmListFileBacktrace Backtrace;
  30. std::vector<std::string> Values;
  31. bool ContextDependent = false;
  32. };
  33. EvaluatedTargetPropertyEntry EvaluateTargetPropertyEntry(
  34. cmGeneratorTarget const* thisTarget, cm::GenEx::Context const& context,
  35. cmGeneratorExpressionDAGChecker* dagChecker,
  36. cmGeneratorTarget::TargetPropertyEntry& entry);
  37. struct EvaluatedTargetPropertyEntries
  38. {
  39. std::vector<EvaluatedTargetPropertyEntry> Entries;
  40. bool HadContextSensitiveCondition = false;
  41. };
  42. EvaluatedTargetPropertyEntries EvaluateTargetPropertyEntries(
  43. cmGeneratorTarget const* thisTarget, cm::GenEx::Context const& context,
  44. cmGeneratorExpressionDAGChecker* dagChecker,
  45. std::vector<std::unique_ptr<cmGeneratorTarget::TargetPropertyEntry>> const&
  46. in);
  47. // IncludeRuntimeInterface is used to break the cycle in computing
  48. // the necessary transitive dependencies of targets that can occur
  49. // now that we have implicit language runtime targets.
  50. //
  51. // To determine the set of languages that a target has we need to iterate
  52. // all the sources which includes transitive INTERFACE sources.
  53. // Therefore we can't determine what language runtimes are needed
  54. // for a target until after all sources are computed.
  55. //
  56. // Therefore while computing the applicable INTERFACE_SOURCES we
  57. // must ignore anything in LanguageRuntimeLibraries or we would
  58. // create a cycle ( INTERFACE_SOURCES requires LanguageRuntimeLibraries,
  59. // LanguageRuntimeLibraries requires INTERFACE_SOURCES).
  60. //
  61. enum class IncludeRuntimeInterface
  62. {
  63. Yes,
  64. No
  65. };
  66. void AddInterfaceEntries(
  67. cmGeneratorTarget const* headTarget, std::string const& prop,
  68. cm::GenEx::Context const& context,
  69. cmGeneratorExpressionDAGChecker* dagChecker,
  70. EvaluatedTargetPropertyEntries& entries,
  71. IncludeRuntimeInterface searchRuntime,
  72. cmGeneratorTarget::UseTo usage = cmGeneratorTarget::UseTo::Compile);