cmLinkLineDeviceComputer.cxx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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 "cmLinkLineDeviceComputer.h"
  4. #include <set>
  5. #include <sstream>
  6. #include "cmComputeLinkInformation.h"
  7. #include "cmGeneratorTarget.h"
  8. #include "cmGlobalNinjaGenerator.h"
  9. #include "cmStateTypes.h"
  10. class cmOutputConverter;
  11. cmLinkLineDeviceComputer::cmLinkLineDeviceComputer(
  12. cmOutputConverter* outputConverter, cmStateDirectory const& stateDir)
  13. : cmLinkLineComputer(outputConverter, stateDir)
  14. {
  15. }
  16. cmLinkLineDeviceComputer::~cmLinkLineDeviceComputer()
  17. {
  18. }
  19. std::string cmLinkLineDeviceComputer::ComputeLinkLibraries(
  20. cmComputeLinkInformation& cli, std::string const& stdLibString)
  21. {
  22. // Write the library flags to the build rule.
  23. std::ostringstream fout;
  24. typedef cmComputeLinkInformation::ItemVector ItemVector;
  25. ItemVector const& items = cli.GetItems();
  26. std::string config = cli.GetConfig();
  27. for (auto const& item : items) {
  28. if (!item.Target) {
  29. continue;
  30. }
  31. bool skippable = false;
  32. switch (item.Target->GetType()) {
  33. case cmStateEnums::SHARED_LIBRARY:
  34. case cmStateEnums::MODULE_LIBRARY:
  35. case cmStateEnums::INTERFACE_LIBRARY:
  36. skippable = true;
  37. break;
  38. case cmStateEnums::STATIC_LIBRARY:
  39. // If a static library is resolving its device linking, it should
  40. // be removed for other device linking
  41. skippable =
  42. item.Target->GetPropertyAsBool("CUDA_RESOLVE_DEVICE_SYMBOLS");
  43. break;
  44. default:
  45. break;
  46. }
  47. if (skippable) {
  48. continue;
  49. }
  50. std::set<std::string> langs;
  51. item.Target->GetLanguages(langs, config);
  52. if (langs.count("CUDA") == 0) {
  53. continue;
  54. }
  55. if (item.IsPath) {
  56. fout << this->ConvertToOutputFormat(
  57. this->ConvertToLinkReference(item.Value));
  58. } else {
  59. fout << item.Value;
  60. }
  61. fout << " ";
  62. }
  63. if (!stdLibString.empty()) {
  64. fout << stdLibString << " ";
  65. }
  66. return fout.str();
  67. }
  68. std::string cmLinkLineDeviceComputer::GetLinkerLanguage(cmGeneratorTarget*,
  69. std::string const&)
  70. {
  71. return "CUDA";
  72. }
  73. cmNinjaLinkLineDeviceComputer::cmNinjaLinkLineDeviceComputer(
  74. cmOutputConverter* outputConverter, cmStateDirectory const& stateDir,
  75. cmGlobalNinjaGenerator const* gg)
  76. : cmLinkLineDeviceComputer(outputConverter, stateDir)
  77. , GG(gg)
  78. {
  79. }
  80. std::string cmNinjaLinkLineDeviceComputer::ConvertToLinkReference(
  81. std::string const& lib) const
  82. {
  83. return GG->ConvertToNinjaPath(lib);
  84. }