Commit 62b30851 authored by Brad King's avatar Brad King 💬
Browse files

VS: Select highest available CUDA toolset by default

If `CMAKE_GENERATOR_TOOLSET` does not have a `cuda=...` field then
find available CUDA toolsets and choose the highest version.
parent 5164e9a6
......@@ -6,5 +6,7 @@ NVIDIA CUDA Toolkit version whose Visual Studio toolset to use.
The :ref:`Visual Studio Generators` for VS 2010 and above support using
a CUDA toolset provided by a CUDA Toolkit. The toolset version number
may be specified by a field in :variable:`CMAKE_GENERATOR_TOOLSET` of
the form ``cuda=8.0``. CMake provides the selected CUDA toolset version
in this variable. The value may be empty if no version was specified.
the form ``cuda=8.0``. If none is specified CMake will choose a default
version. CMake provides the selected CUDA toolset version in this variable.
The value may be empty if no CUDA Toolkit with Visual Studio integration
is installed.
......@@ -22,8 +22,11 @@
#include "cmake.h"
#include <cmsys/FStream.hxx>
#include <cmsys/Glob.hxx>
#include <cmsys/RegularExpression.hxx>
#include <algorithm>
static const char vs10generatorName[] = "Visual Studio 10 2010";
// Map generator name without year to name with year.
......@@ -160,6 +163,13 @@ bool cmGlobalVisualStudio10Generator::SetGeneratorPlatform(
return true;
}
static void cmCudaToolVersion(std::string& s)
{
// "CUDA x.y.props" => "x.y"
s = s.substr(5);
s = s.substr(0, s.size() - 6);
}
bool cmGlobalVisualStudio10Generator::SetGeneratorToolset(
std::string const& ts, cmMakefile* mf)
{
......@@ -180,6 +190,23 @@ bool cmGlobalVisualStudio10Generator::SetGeneratorToolset(
return false;
}
if (this->GeneratorToolsetCuda.empty()) {
// Find the highest available version of the CUDA tools.
std::vector<std::string> cudaTools;
std::string const bcDir = this->VCTargetsPath + "/BuildCustomizations";
cmsys::Glob gl;
gl.SetRelative(bcDir.c_str());
if (gl.FindFiles(bcDir + "/CUDA *.props")) {
cudaTools = gl.GetFiles();
}
if (!cudaTools.empty()) {
std::for_each(cudaTools.begin(), cudaTools.end(), cmCudaToolVersion);
std::sort(cudaTools.begin(), cudaTools.end(),
cmSystemTools::VersionCompareGreater);
this->GeneratorToolsetCuda = cudaTools.at(0);
}
}
if (const char* toolset = this->GetPlatformToolset()) {
mf->AddDefinition("CMAKE_VS_PLATFORM_TOOLSET", toolset);
}
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment