mirror of
https://github.com/Kitware/CMake.git
synced 2026-05-05 13:50:10 -05:00
CUDA: MSVC pass all cuda gencode flags via AdditionalOptions
Fixes #23491
This commit is contained in:
@@ -3852,21 +3852,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,
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user