Преглед на файлове

Merge topic 'msvc_cuda_pass_arch_flags_in_additional_options'

e3983168da CUDA: MSVC pass all cuda gencode flags via AdditionalOptions

Acked-by: Kitware Robot <[email protected]>
Merge-request: !7359
Brad King преди 3 години
родител
ревизия
4f7291928b
променени са 3 файла, в които са добавени 22 реда и са изтрити 186 реда
  1. 16 9
      Source/cmVisualStudio10TargetGenerator.cxx
  2. 6 65
      Source/cmVisualStudioGeneratorOptions.cxx
  3. 0 112
      Templates/MSBuild/FlagTables/v10_Cuda.json

+ 16 - 9
Source/cmVisualStudio10TargetGenerator.cxx

@@ -3856,21 +3856,28 @@ bool cmVisualStudio10TargetGenerator::ComputeCudaLinkOptions(
   this->GeneratorTarget->GetLinkOptions(linkOpts, configName, "CUDA");
   // LINK_OPTIONS are escaped.
   this->LocalGenerator->AppendCompileOptions(linkFlags, linkOpts);
+
+  cmComputeLinkInformation* pcli =
+    this->GeneratorTarget->GetLinkInformation(configName);
+  if (doDeviceLinking && pcli) {
+
+    cmLinkLineDeviceComputer computer(
+      this->LocalGenerator,
+      this->LocalGenerator->GetStateSnapshot().GetDirectory());
+    std::string ignored_;
+    this->LocalGenerator->GetDeviceLinkFlags(computer, configName, ignored_,
+                                             linkFlags, ignored_, ignored_,
+                                             this->GeneratorTarget);
+
+    this->LocalGenerator->AddLanguageFlagsForLinking(
+      linkFlags, this->GeneratorTarget, "CUDA", configName);
+  }
   cudaLinkOptions.AppendFlagString("AdditionalOptions", linkFlags);
 
   // For static libraries that have device linking enabled compute
   // the  libraries
   if (this->GeneratorTarget->GetType() == cmStateEnums::STATIC_LIBRARY &&
       doDeviceLinking) {
-    cmComputeLinkInformation* pcli =
-      this->GeneratorTarget->GetLinkInformation(configName);
-    if (!pcli) {
-      cmSystemTools::Error(
-        "CMake can not compute cmComputeLinkInformation for target: " +
-        this->Name);
-      return false;
-    }
-
     cmComputeLinkInformation& cli = *pcli;
     cmLinkLineDeviceComputer computer(
       this->LocalGenerator,

+ 6 - 65
Source/cmVisualStudioGeneratorOptions.cxx

@@ -161,71 +161,12 @@ bool cmVisualStudioGeneratorOptions::UsingSBCS() const
 
 void cmVisualStudioGeneratorOptions::FixCudaCodeGeneration()
 {
-  // Extract temporary values stored by our flag table.
-  FlagValue arch = this->TakeFlag("cmake-temp-arch");
-  FlagValue code = this->TakeFlag("cmake-temp-code");
-  FlagValue gencode = this->TakeFlag("cmake-temp-gencode");
-
-  // No -code allowed without -arch.
-  if (arch.empty()) {
-    code.clear();
-  }
-
-  // Create a CodeGeneration field with [arch],[code] syntax in each entry.
-  // CUDA will convert it to `-gencode=arch=[arch],code="[code],[arch]"`.
-  FlagValue& result = this->FlagMap["CodeGeneration"];
-
-  // If there are no flags, leave the CodeGeneration field empty.
-  if (arch.empty() && gencode.empty()) {
-    return;
-  }
-
-  // First entries for the -arch=<arch> [-code=<code>,...] pair.
-  if (!arch.empty()) {
-    std::string arch_name = arch[0];
-    if (arch_name == "all" || arch_name == "all-major" ||
-        arch_name == "native") {
-      AppendFlagString("AdditionalOptions", "-arch=" + arch_name);
-      return;
-    }
-    std::vector<std::string> codes;
-    if (!code.empty()) {
-      codes = cmTokenize(code[0], ",");
-    }
-    if (codes.empty()) {
-      codes.push_back(arch_name);
-      // nvcc -arch=<arch> has a special case that allows a real
-      // architecture to be specified instead of a virtual arch.
-      // It translates to -arch=<virtual> -code=<real>.
-      cmSystemTools::ReplaceString(arch_name, "sm_", "compute_");
-    }
-    for (std::string const& c : codes) {
-      std::string entry = arch_name + "," + c;
-      result.push_back(entry);
-    }
-  }
-
-  // Now add entries for the following signatures:
-  // -gencode=<arch>,<code>
-  // -gencode=<arch>,[<code1>,<code2>]
-  // -gencode=<arch>,"<code1>,<code2>"
-  for (std::string const& e : gencode) {
-    std::string entry = e;
-    cmSystemTools::ReplaceString(entry, "arch=", "");
-    cmSystemTools::ReplaceString(entry, "code=", "");
-    cmSystemTools::ReplaceString(entry, "[", "");
-    cmSystemTools::ReplaceString(entry, "]", "");
-    cmSystemTools::ReplaceString(entry, "\"", "");
-
-    std::vector<std::string> codes = cmTokenize(entry, ",");
-    if (codes.size() >= 2) {
-      auto gencode_arch = cm::cbegin(codes);
-      for (auto ci = gencode_arch + 1; ci != cm::cend(codes); ++ci) {
-        std::string code_entry = *gencode_arch + "," + *ci;
-        result.push_back(code_entry);
-      }
-    }
-  }
+  // Create an empty CodeGeneration field, and pass the the actual
+  // compile flags via additional options so that we have consistent
+  // behavior and avoid issues with MSBuild extensions injecting
+  // virtual code when we request real only.
+  FlagValue& code_gen_flag = this->FlagMap["CodeGeneration"];
+  code_gen_flag = "";
 }
 
 void cmVisualStudioGeneratorOptions::FixManifestUACFlags()

+ 0 - 112
Templates/MSBuild/FlagTables/v10_Cuda.json

@@ -69,118 +69,6 @@
       "UserFollowing"
     ]
   },
-  {
-    "name":  "cmake-temp-gencode",
-    "switch": "gencode=",
-    "comment": "",
-    "value": "",
-    "flags": [
-      "UserValue",
-      "SemicolonAppendable"
-    ]
-  },
-  {
-    "name":  "cmake-temp-gencode",
-    "switch": "gencode",
-    "comment": "",
-    "value": "",
-    "flags": [
-      "UserFollowing",
-      "SemicolonAppendable"
-    ]
-  },
-  {
-    "name":  "cmake-temp-gencode",
-    "switch": "-generate-code=",
-    "comment": "",
-    "value": "",
-    "flags": [
-      "UserValue",
-      "SemicolonAppendable"
-    ]
-  },
-  {
-    "name":  "cmake-temp-gencode",
-    "switch": "-generate-code",
-    "comment": "",
-    "value": "",
-    "flags": [
-      "UserFollowing",
-      "SemicolonAppendable"
-    ]
-  },
-  {
-    "name":  "cmake-temp-code",
-    "switch": "code=",
-    "comment": "",
-    "value": "",
-    "flags": [
-      "UserValue"
-    ]
-  },
-  {
-    "name":  "cmake-temp-code",
-    "switch": "code",
-    "comment": "",
-    "value": "",
-    "flags": [
-      "UserFollowing"
-    ]
-  },
-  {
-    "name":  "cmake-temp-code",
-    "switch": "-gpu-code=",
-    "comment": "",
-    "value": "",
-    "flags": [
-      "UserValue"
-    ]
-  },
-  {
-    "name":  "cmake-temp-code",
-    "switch": "-gpu-code",
-    "comment": "",
-    "value": "",
-    "flags": [
-      "UserFollowing"
-    ]
-  },
-  {
-    "name":  "cmake-temp-arch",
-    "switch": "arch=",
-    "comment": "",
-    "value": "",
-    "flags": [
-      "UserValue"
-    ]
-  },
-  {
-    "name":  "cmake-temp-arch",
-    "switch": "arch",
-    "comment": "",
-    "value": "",
-    "flags": [
-      "UserFollowing"
-    ]
-  },
-  {
-    "name":  "cmake-temp-arch",
-    "switch": "-gpu-architecture=",
-    "comment": "",
-    "value": "",
-    "flags": [
-      "UserValue"
-    ]
-  },
-  {
-    "name":  "cmake-temp-arch",
-    "switch": "-gpu-architecture",
-    "comment": "",
-    "value": "",
-    "flags": [
-      "UserFollowing"
-    ]
-  },
   {
     "name":  "FastMath",
     "switch": "use_fast_math",