cmLinkLineDeviceComputer.cxx 2.6 KB

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