mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-07 22:30:13 -06:00
Merge topic 'vs-cuda-fix-flags'
3b754215VS: Improve workaround for CUDA -Xcompiler placement bugf2059585VS: Fix target_compile_options for CUDA Acked-by: Kitware Robot <kwrobot@kitware.com> Merge-request: !996
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
file Copyright.txt or https://cmake.org/licensing for details. */
|
||||
#include "cmVisualStudio10TargetGenerator.h"
|
||||
|
||||
#include "cmAlgorithms.h"
|
||||
#include "cmComputeLinkInformation.h"
|
||||
#include "cmCustomCommandGenerator.h"
|
||||
#include "cmGeneratedFileStream.h"
|
||||
@@ -2241,10 +2242,27 @@ bool cmVisualStudio10TargetGenerator::ComputeClOptions(
|
||||
this->Name.c_str());
|
||||
return false;
|
||||
}
|
||||
if (linkLanguage == "C" || linkLanguage == "CXX" ||
|
||||
linkLanguage == "Fortran" || linkLanguage == "CSharp") {
|
||||
|
||||
// Choose a language whose flags to use for ClCompile.
|
||||
static const char* clLangs[] = { "CXX", "C", "Fortran", "CSharp" };
|
||||
std::string langForClCompile;
|
||||
if (std::find(cmArrayBegin(clLangs), cmArrayEnd(clLangs), linkLanguage) !=
|
||||
cmArrayEnd(clLangs)) {
|
||||
langForClCompile = linkLanguage;
|
||||
} else {
|
||||
std::set<std::string> languages;
|
||||
this->GeneratorTarget->GetLanguages(languages, configName);
|
||||
for (const char* const* l = cmArrayBegin(clLangs);
|
||||
l != cmArrayEnd(clLangs); ++l) {
|
||||
if (languages.find(*l) != languages.end()) {
|
||||
langForClCompile = *l;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!langForClCompile.empty()) {
|
||||
std::string baseFlagVar = "CMAKE_";
|
||||
baseFlagVar += linkLanguage;
|
||||
baseFlagVar += langForClCompile;
|
||||
baseFlagVar += "_FLAGS";
|
||||
flags =
|
||||
this->GeneratorTarget->Target->GetMakefile()->GetRequiredDefinition(
|
||||
@@ -2255,6 +2273,8 @@ bool cmVisualStudio10TargetGenerator::ComputeClOptions(
|
||||
flags +=
|
||||
this->GeneratorTarget->Target->GetMakefile()->GetRequiredDefinition(
|
||||
flagVar.c_str());
|
||||
this->LocalGenerator->AddCompileOptions(flags, this->GeneratorTarget,
|
||||
langForClCompile, configName);
|
||||
}
|
||||
// set the correct language
|
||||
if (linkLanguage == "C") {
|
||||
@@ -2263,10 +2283,6 @@ bool cmVisualStudio10TargetGenerator::ComputeClOptions(
|
||||
if (linkLanguage == "CXX") {
|
||||
clOptions.AddFlag("CompileAs", "CompileAsCpp");
|
||||
}
|
||||
if (linkLanguage != "CUDA") {
|
||||
this->LocalGenerator->AddCompileOptions(flags, this->GeneratorTarget,
|
||||
linkLanguage, configName.c_str());
|
||||
}
|
||||
|
||||
// Check IPO related warning/error.
|
||||
this->GeneratorTarget->IsIPOEnabled(linkLanguage, configName);
|
||||
@@ -2500,6 +2516,8 @@ bool cmVisualStudio10TargetGenerator::ComputeCudaOptions(
|
||||
std::string(this->Makefile->GetSafeDefinition("CMAKE_CUDA_FLAGS")) +
|
||||
std::string(" ") +
|
||||
std::string(this->Makefile->GetSafeDefinition(configFlagsVar));
|
||||
this->LocalGenerator->AddCompileOptions(flags, this->GeneratorTarget, "CUDA",
|
||||
configName);
|
||||
|
||||
// Get preprocessor definitions for this directory.
|
||||
std::string defineFlags =
|
||||
@@ -2525,9 +2543,16 @@ bool cmVisualStudio10TargetGenerator::ComputeCudaOptions(
|
||||
cudaOptions.AddTable(gg->GetCudaHostFlagTable());
|
||||
cudaOptions.Reparse("AdditionalCompilerOptions");
|
||||
|
||||
// `CUDA 8.0.targets` places these before nvcc! Just drop whatever
|
||||
// did not parse and hope it works.
|
||||
cudaOptions.RemoveFlag("AdditionalCompilerOptions");
|
||||
// `CUDA 8.0.targets` places AdditionalCompilerOptions before nvcc!
|
||||
// Pass them through -Xcompiler in AdditionalOptions instead.
|
||||
if (const char* acoPtr = cudaOptions.GetFlag("AdditionalCompilerOptions")) {
|
||||
std::string aco = acoPtr;
|
||||
cudaOptions.RemoveFlag("AdditionalCompilerOptions");
|
||||
if (!aco.empty()) {
|
||||
aco = this->LocalGenerator->EscapeForShell(aco, false);
|
||||
cudaOptions.AppendFlag("AdditionalOptions", "-Xcompiler=" + aco);
|
||||
}
|
||||
}
|
||||
|
||||
cudaOptions.FixCudaCodeGeneration();
|
||||
|
||||
|
||||
@@ -15,6 +15,10 @@ set(CMAKE_CUDA_STANDARD 11)
|
||||
|
||||
add_library(CUDASeparateLibA STATIC file1.cu file2.cu file3.cu)
|
||||
|
||||
if(CMAKE_CUDA_SIMULATE_ID STREQUAL "MSVC")
|
||||
target_compile_options(CUDASeparateLibA PRIVATE -Xcompiler=-bigobj)
|
||||
endif()
|
||||
|
||||
#Having file4/file5 in a shared library causes serious problems
|
||||
#with the nvcc linker and it will generate bad entries that will
|
||||
#cause a segv when trying to run the executable
|
||||
|
||||
@@ -28,6 +28,7 @@ add_executable(CudaOnlyWithDefs ${main})
|
||||
|
||||
target_compile_options(CudaOnlyWithDefs
|
||||
PRIVATE
|
||||
-Xcompiler=-DHOST_DEFINE
|
||||
$<$<CONFIG:DEBUG>:$<BUILD_INTERFACE:${debug_compile_flags}>>
|
||||
)
|
||||
|
||||
|
||||
@@ -2,6 +2,10 @@
|
||||
#include <cuda_runtime.h>
|
||||
#include <iostream>
|
||||
|
||||
#ifndef HOST_DEFINE
|
||||
#error "HOST_DEFINE not defined!"
|
||||
#endif
|
||||
|
||||
#ifndef PACKED_DEFINE
|
||||
#error "PACKED_DEFINE not defined!"
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user