diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx index 2615e4c636..9115eb7381 100644 --- a/Source/cmVisualStudio10TargetGenerator.cxx +++ b/Source/cmVisualStudio10TargetGenerator.cxx @@ -2078,9 +2078,15 @@ bool cmVisualStudio10TargetGenerator::OutputSourceSpecificFlags( (*this->BuildFileStream) << firstString; firstString = ""; hasFlags = true; - this->WriteString("", 3); - (*this->BuildFileStream) << "$(IntDir)/" << objectName - << "\n"; + if (lang == "CUDA") { + this->WriteString("", 3); + (*this->BuildFileStream) << "$(IntDir)/" << objectName + << "\n"; + } else { + this->WriteString("", 3); + (*this->BuildFileStream) << "$(IntDir)/" << objectName + << "\n"; + } } for (std::string const& config : this->Configurations) { std::string configUpper = cmSystemTools::UpperCase(config); @@ -2688,6 +2694,11 @@ bool cmVisualStudio10TargetGenerator::ComputeCudaOptions( cudaOptions.AddFlag("GPUDebugInfo", "false"); } + // The extension on object libraries the CUDA gives isn't + // consistent with how MSVC generates object libraries for C+, so set + // the default to not have any extension + cudaOptions.AddFlag("CompileOut", "$(IntDir)%(Filename).obj"); + bool notPtx = true; if (this->GeneratorTarget->GetPropertyAsBool("CUDA_SEPARABLE_COMPILATION")) { cudaOptions.AddFlag("GenerateRelocatableDeviceCode", "true"); diff --git a/Tests/Cuda/ObjectLibrary/CMakeLists.txt b/Tests/Cuda/ObjectLibrary/CMakeLists.txt index 276dc92255..da5fb876ee 100644 --- a/Tests/Cuda/ObjectLibrary/CMakeLists.txt +++ b/Tests/Cuda/ObjectLibrary/CMakeLists.txt @@ -1,15 +1,18 @@ cmake_minimum_required(VERSION 3.7) project (CudaObjectLibrary CUDA CXX) #Goal for this example: - -#build a object files some with cuda and some without than -#embed these into an executable +# +#Build C++ and CUDA object files and than use them to make an executable +#Make sure that CMake logic to handle object output when multiple files +#with the same name works +add_subdirectory(Conflicts) add_library(CudaMixedObjectLib OBJECT static.cu static.cpp) add_executable(CudaObjectLibrary main.cpp - $) + $ + $) if(APPLE) # Help the static cuda runtime find the driver (libcuda.dyllib) at runtime. diff --git a/Tests/Cuda/ObjectLibrary/Conflicts/CMakeLists.txt b/Tests/Cuda/ObjectLibrary/Conflicts/CMakeLists.txt new file mode 100644 index 0000000000..1602f8a2a0 --- /dev/null +++ b/Tests/Cuda/ObjectLibrary/Conflicts/CMakeLists.txt @@ -0,0 +1,2 @@ + +add_library(CudaConflicts OBJECT static.cu) diff --git a/Tests/Cuda/ObjectLibrary/Conflicts/static.cu b/Tests/Cuda/ObjectLibrary/Conflicts/static.cu new file mode 100644 index 0000000000..586e8c62b7 --- /dev/null +++ b/Tests/Cuda/ObjectLibrary/Conflicts/static.cu @@ -0,0 +1,17 @@ + +#include +#include +#include + +int __host__ cu2_sq_func(int x) +{ + cudaError_t err; + int nDevices = 0; + err = cudaGetDeviceCount(&nDevices); + if (err != cudaSuccess) { + std::cerr << "nDevices: " << nDevices << std::endl; + std::cerr << "err: " << err << std::endl; + return 1; + } + return x * x; +} diff --git a/Tests/Cuda/ObjectLibrary/main.cpp b/Tests/Cuda/ObjectLibrary/main.cpp index 4d2f890289..e28f088510 100644 --- a/Tests/Cuda/ObjectLibrary/main.cpp +++ b/Tests/Cuda/ObjectLibrary/main.cpp @@ -1,22 +1,18 @@ #include -int static_func(int); -int file1_sq_func(int); +int cpp_sq_func(int); +int cu1_sq_func(int); +int cu2_sq_func(int); -int test_functions() +bool test_functions() { - return file1_sq_func(static_func(42)); + return (cu1_sq_func(42) == cpp_sq_func(42)) && + (cu2_sq_func(42) == cpp_sq_func(42)); } int main(int argc, char** argv) { - if (test_functions() == 1) { - return 1; - } - std::cout - << "this executable doesn't use cuda code, just call methods defined" - << std::endl; - std::cout << "in object files that have cuda code" << std::endl; - return 0; + int result = test_functions() ? 0 : 1; + return result; } diff --git a/Tests/Cuda/ObjectLibrary/static.cpp b/Tests/Cuda/ObjectLibrary/static.cpp index 6db1f914fc..527f7f554f 100644 --- a/Tests/Cuda/ObjectLibrary/static.cpp +++ b/Tests/Cuda/ObjectLibrary/static.cpp @@ -1,6 +1,6 @@ int file1_sq_func(int); -int static_func(int x) +int cpp_sq_func(int x) { - return file1_sq_func(x); + return x * x; } diff --git a/Tests/Cuda/ObjectLibrary/static.cu b/Tests/Cuda/ObjectLibrary/static.cu index aa357295a7..37bb8391e7 100644 --- a/Tests/Cuda/ObjectLibrary/static.cu +++ b/Tests/Cuda/ObjectLibrary/static.cu @@ -3,7 +3,7 @@ #include #include -int __host__ file1_sq_func(int x) +int __host__ cu1_sq_func(int x) { cudaError_t err; int nDevices = 0; @@ -13,9 +13,5 @@ int __host__ file1_sq_func(int x) std::cerr << "err: " << err << std::endl; return 1; } - std::cout << "this library uses cuda code" << std::endl; - std::cout << "you have " << nDevices << " devices that support cuda" - << std::endl; - return x * x; }