cmEvaluatedTargetProperty.cxx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file LICENSE.rst or https://cmake.org/licensing for details. */
  3. #include "cmEvaluatedTargetProperty.h"
  4. #include <unordered_map>
  5. #include <utility>
  6. #include "cmGenExContext.h"
  7. #include "cmGenExEvaluation.h"
  8. #include "cmGeneratorTarget.h"
  9. #include "cmLinkItem.h"
  10. #include "cmList.h"
  11. struct cmGeneratorExpressionDAGChecker;
  12. EvaluatedTargetPropertyEntry::EvaluatedTargetPropertyEntry(
  13. cmLinkItem const& item, cmListFileBacktrace bt)
  14. : LinkItem(item)
  15. , Backtrace(std::move(bt))
  16. {
  17. }
  18. EvaluatedTargetPropertyEntry EvaluateTargetPropertyEntry(
  19. cmGeneratorTarget const* thisTarget, cm::GenEx::Context const& context,
  20. cmGeneratorExpressionDAGChecker* dagChecker,
  21. cmGeneratorTarget::TargetPropertyEntry& entry)
  22. {
  23. EvaluatedTargetPropertyEntry ee(entry.LinkItem, entry.GetBacktrace());
  24. cmExpandList(entry.Evaluate(context, thisTarget, dagChecker), ee.Values);
  25. if (entry.GetHadContextSensitiveCondition()) {
  26. ee.ContextDependent = true;
  27. }
  28. return ee;
  29. }
  30. EvaluatedTargetPropertyEntries EvaluateTargetPropertyEntries(
  31. cmGeneratorTarget const* thisTarget, cm::GenEx::Context const& context,
  32. cmGeneratorExpressionDAGChecker* dagChecker,
  33. std::vector<std::unique_ptr<cmGeneratorTarget::TargetPropertyEntry>> const&
  34. in)
  35. {
  36. EvaluatedTargetPropertyEntries out;
  37. out.Entries.reserve(in.size());
  38. for (auto const& entry : in) {
  39. out.Entries.emplace_back(
  40. EvaluateTargetPropertyEntry(thisTarget, context, dagChecker, *entry));
  41. }
  42. return out;
  43. }
  44. namespace {
  45. void addInterfaceEntry(cmGeneratorTarget const* headTarget,
  46. std::string const& prop,
  47. cm::GenEx::Context const& context,
  48. cmGeneratorExpressionDAGChecker* dagChecker,
  49. EvaluatedTargetPropertyEntries& entries,
  50. cmGeneratorTarget::UseTo usage,
  51. std::vector<cmLinkItem> const& libraries)
  52. {
  53. for (cmLinkItem const& lib : libraries) {
  54. if (lib.Target) {
  55. EvaluatedTargetPropertyEntry ee(lib, lib.Backtrace);
  56. // Pretend $<TARGET_PROPERTY:lib.Target,prop> appeared in our
  57. // caller's property and hand-evaluate it as if it were compiled.
  58. // Create a context as cmCompiledGeneratorExpression::Evaluate does.
  59. cm::GenEx::Evaluation eval(context, false, headTarget, headTarget, true,
  60. lib.Backtrace);
  61. cmExpandList(
  62. lib.Target->EvaluateInterfaceProperty(prop, &eval, dagChecker, usage),
  63. ee.Values);
  64. ee.ContextDependent = eval.HadContextSensitiveCondition;
  65. entries.Entries.emplace_back(std::move(ee));
  66. }
  67. }
  68. }
  69. }
  70. void AddInterfaceEntries(cmGeneratorTarget const* headTarget,
  71. std::string const& prop,
  72. cm::GenEx::Context const& context,
  73. cmGeneratorExpressionDAGChecker* dagChecker,
  74. EvaluatedTargetPropertyEntries& entries,
  75. IncludeRuntimeInterface searchRuntime,
  76. cmGeneratorTarget::UseTo usage)
  77. {
  78. if (searchRuntime == IncludeRuntimeInterface::Yes) {
  79. if (cmLinkImplementation const* impl =
  80. headTarget->GetLinkImplementation(context.Config, usage)) {
  81. entries.HadContextSensitiveCondition =
  82. impl->HadContextSensitiveCondition;
  83. auto runtimeLibIt =
  84. impl->LanguageRuntimeLibraries.find(context.Language);
  85. if (runtimeLibIt != impl->LanguageRuntimeLibraries.end()) {
  86. addInterfaceEntry(headTarget, prop, context, dagChecker, entries,
  87. usage, runtimeLibIt->second);
  88. }
  89. addInterfaceEntry(headTarget, prop, context, dagChecker, entries, usage,
  90. impl->Libraries);
  91. }
  92. } else {
  93. if (cmLinkImplementationLibraries const* impl =
  94. headTarget->GetLinkImplementationLibraries(context.Config, usage)) {
  95. entries.HadContextSensitiveCondition =
  96. impl->HadContextSensitiveCondition;
  97. addInterfaceEntry(headTarget, prop, context, dagChecker, entries, usage,
  98. impl->Libraries);
  99. }
  100. }
  101. }