cmLinkLineDeviceComputer.cxx 2.6 KB

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