cmLinkItem.cxx 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file Copyright.txt or https://cmake.org/licensing for details. */
  3. #include "cmLinkItem.h"
  4. #include <utility> // IWYU pragma: keep
  5. #include <cm/optional>
  6. #include <cm/string_view>
  7. #include <cmext/string_view>
  8. #include "cmGeneratorTarget.h"
  9. #include "cmStringAlgorithms.h"
  10. const std::string cmLinkItem::DEFAULT = "DEFAULT";
  11. cmLinkItem::cmLinkItem(std::string n, bool c, cmListFileBacktrace bt,
  12. std::string feature)
  13. : String(std::move(n))
  14. , Feature(std::move(feature))
  15. , Cross(c)
  16. , Backtrace(std::move(bt))
  17. {
  18. }
  19. cmLinkItem::cmLinkItem(cmGeneratorTarget const* t, bool c,
  20. cmListFileBacktrace bt, std::string feature)
  21. : Target(t)
  22. , Feature(std::move(feature))
  23. , Cross(c)
  24. , Backtrace(std::move(bt))
  25. {
  26. }
  27. std::string const& cmLinkItem::AsStr() const
  28. {
  29. return this->Target ? this->Target->GetName() : this->String;
  30. }
  31. bool operator<(cmLinkItem const& l, cmLinkItem const& r)
  32. {
  33. // Order among targets.
  34. if (l.Target && r.Target) {
  35. if (l.Target != r.Target) {
  36. return l.Target < r.Target;
  37. }
  38. // Order identical targets via cross-config.
  39. return l.Cross < r.Cross;
  40. }
  41. // Order targets before strings.
  42. if (l.Target) {
  43. return true;
  44. }
  45. if (r.Target) {
  46. return false;
  47. }
  48. // Order among strings.
  49. if (l.String != r.String) {
  50. return l.String < r.String;
  51. }
  52. // Order identical strings via cross-config.
  53. return l.Cross < r.Cross;
  54. }
  55. bool operator==(cmLinkItem const& l, cmLinkItem const& r)
  56. {
  57. return l.Target == r.Target && l.String == r.String && l.Cross == r.Cross;
  58. }
  59. std::ostream& operator<<(std::ostream& os, cmLinkItem const& item)
  60. {
  61. return os << item.AsStr();
  62. }
  63. cmLinkImplItem::cmLinkImplItem(cmLinkItem item, bool checkCMP0027)
  64. : cmLinkItem(std::move(item))
  65. , CheckCMP0027(checkCMP0027)
  66. {
  67. }
  68. namespace {
  69. const cm::string_view LL_BEGIN = "<LINK_LIBRARY:"_s;
  70. const cm::string_view LL_END = "</LINK_LIBRARY:"_s;
  71. }
  72. cm::optional<std::string> ParseLinkFeature(std::string const& item)
  73. {
  74. if (cmHasPrefix(item, LL_BEGIN) && cmHasSuffix(item, '>')) {
  75. return item.substr(LL_BEGIN.length(),
  76. item.find('>', LL_BEGIN.length()) - LL_BEGIN.length());
  77. }
  78. if (cmHasPrefix(item, LL_END) && cmHasSuffix(item, '>')) {
  79. return cmLinkItem::DEFAULT;
  80. }
  81. return cm::nullopt;
  82. }