diff options
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmGlobalVisualStudio10Generator.cxx | 85 | ||||
-rw-r--r-- | Source/cmGlobalVisualStudio10Generator.h | 7 | ||||
-rw-r--r-- | Source/cmGlobalVisualStudio15Generator.cxx | 19 | ||||
-rw-r--r-- | Source/cmGlobalVisualStudio15Generator.h | 2 | ||||
-rw-r--r-- | Source/cmVisualStudio10TargetGenerator.cxx | 5 |
5 files changed, 118 insertions, 0 deletions
diff --git a/Source/cmGlobalVisualStudio10Generator.cxx b/Source/cmGlobalVisualStudio10Generator.cxx index 205e0d0..eafddd6 100644 --- a/Source/cmGlobalVisualStudio10Generator.cxx +++ b/Source/cmGlobalVisualStudio10Generator.cxx @@ -231,9 +231,66 @@ bool cmGlobalVisualStudio10Generator::SetGeneratorToolset( } } + if (!this->GeneratorToolsetVersion.empty() && + this->GeneratorToolsetVersion != "Test Toolset Version") { + // If a specific minor version of the toolset was requested, verify that it + // is compatible to the major version and that is exists on disk. + // If not clear the value. + std::string version = this->GeneratorToolsetVersion; + cmsys::RegularExpression regex("[0-9][0-9]\\.[0-9][0-9]"); + if (regex.find(version)) { + version = "v" + version.erase(2, 1); + } else { + // Version not recognized. Clear it. + version.clear(); + } + + if (version.find(this->GetPlatformToolsetString()) != 0) { + std::ostringstream e; + /* clang-format off */ + e << + "Generator\n" + " " << this->GetName() << "\n" + "given toolset and version specification\n" + " " << this->GetPlatformToolsetString() << ",version=" << + this->GeneratorToolsetVersion << "\n" + "contains an invalid version specification." + ; + /* clang-format on */ + mf->IssueMessage(cmake::FATAL_ERROR, e.str()); + + // Clear the configured tool-set + this->GeneratorToolsetVersion.clear(); + } + + std::string const toolsetPath = this->GetAuxiliaryToolset(); + if (!toolsetPath.empty() && !cmSystemTools::FileExists(toolsetPath)) { + + std::ostringstream e; + /* clang-format off */ + e << + "Generator\n" + " " << this->GetName() << "\n" + "given toolset and version specification\n" + " " << this->GetPlatformToolsetString() << ",version=" << + this->GeneratorToolsetVersion << "\n" + "does not seem to be installed at\n" << + " " << toolsetPath; + ; + /* clang-format on */ + mf->IssueMessage(cmake::FATAL_ERROR, e.str()); + + // Clear the configured tool-set + this->GeneratorToolsetVersion.clear(); + } + } + if (const char* toolset = this->GetPlatformToolset()) { mf->AddDefinition("CMAKE_VS_PLATFORM_TOOLSET", toolset); } + if (const char* version = this->GetPlatformToolsetVersion()) { + mf->AddDefinition("CMAKE_VS_PLATFORM_TOOLSET_VERSION", version); + } if (const char* hostArch = this->GetPlatformToolsetHostArchitecture()) { mf->AddDefinition("CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE", hostArch); } @@ -319,6 +376,10 @@ bool cmGlobalVisualStudio10Generator::ProcessGeneratorToolsetField( this->GeneratorToolsetCuda = value; return true; } + if (key == "version") { + this->GeneratorToolsetVersion = value; + return true; + } return false; } @@ -512,6 +573,25 @@ std::string const& cmGlobalVisualStudio10Generator::GetPlatformToolsetString() return empty; } +const char* cmGlobalVisualStudio10Generator::GetPlatformToolsetVersion() const +{ + std::string const& version = this->GetPlatformToolsetVersionString(); + if (version.empty()) { + return nullptr; + } + return version.c_str(); +} + +std::string const& +cmGlobalVisualStudio10Generator::GetPlatformToolsetVersionString() const +{ + if (!this->GeneratorToolsetVersion.empty()) { + return this->GeneratorToolsetVersion; + } + static std::string const empty; + return empty; +} + const char* cmGlobalVisualStudio10Generator::GetPlatformToolsetHostArchitecture() const { @@ -535,6 +615,11 @@ cmGlobalVisualStudio10Generator::GetPlatformToolsetCudaString() const return this->GeneratorToolsetCuda; } +std::string cmGlobalVisualStudio10Generator::GetAuxiliaryToolset() const +{ + return {}; +} + bool cmGlobalVisualStudio10Generator::FindMakeProgram(cmMakefile* mf) { if (!this->cmGlobalVisualStudio8Generator::FindMakeProgram(mf)) { diff --git a/Source/cmGlobalVisualStudio10Generator.h b/Source/cmGlobalVisualStudio10Generator.h index f2501c2..dcdab09 100644 --- a/Source/cmGlobalVisualStudio10Generator.h +++ b/Source/cmGlobalVisualStudio10Generator.h @@ -54,6 +54,10 @@ public: const char* GetPlatformToolset() const; std::string const& GetPlatformToolsetString() const; + /** The toolset version. */ + const char* GetPlatformToolsetVersion() const; + std::string const& GetPlatformToolsetVersionString() const; + /** The toolset host architecture name (e.g. x64 for 64-bit host tools). */ const char* GetPlatformToolsetHostArchitecture() const; @@ -101,6 +105,8 @@ public: std::string Encoding() override; virtual const char* GetToolsVersion() { return "4.0"; } + virtual std::string GetAuxiliaryToolset() const; + bool FindMakeProgram(cmMakefile* mf) override; static std::string GetInstalledNsightTegraVersion(); @@ -135,6 +141,7 @@ protected: std::string const& GetMSBuildCommand(); std::string GeneratorToolset; + std::string GeneratorToolsetVersion; std::string GeneratorToolsetHostArchitecture; std::string GeneratorToolsetCuda; std::string DefaultPlatformToolset; diff --git a/Source/cmGlobalVisualStudio15Generator.cxx b/Source/cmGlobalVisualStudio15Generator.cxx index 014d93d..6af5793 100644 --- a/Source/cmGlobalVisualStudio15Generator.cxx +++ b/Source/cmGlobalVisualStudio15Generator.cxx @@ -158,6 +158,25 @@ bool cmGlobalVisualStudio15Generator::GetVSInstance(std::string& dir) const return vsSetupAPIHelper.GetVSInstanceInfo(dir); } +std::string cmGlobalVisualStudio15Generator::GetAuxiliaryToolset() const +{ + const char* version = this->GetPlatformToolsetVersion(); + if (version) { + std::string instancePath; + GetVSInstance(instancePath); + std::stringstream path; + path << instancePath; + path << "/VC/Auxiliary/Build/"; + path << version; + path << "/Microsoft.VCToolsVersion." << version << ".props"; + + std::string toolsetPath = path.str(); + cmSystemTools::ConvertToUnixSlashes(toolsetPath); + return toolsetPath; + } + return {}; +} + bool cmGlobalVisualStudio15Generator::InitializeWindows(cmMakefile* mf) { // If the Win 8.1 SDK is installed then we can select a SDK matching diff --git a/Source/cmGlobalVisualStudio15Generator.h b/Source/cmGlobalVisualStudio15Generator.h index 4f4e0b9..3b9cfc7 100644 --- a/Source/cmGlobalVisualStudio15Generator.h +++ b/Source/cmGlobalVisualStudio15Generator.h @@ -32,6 +32,8 @@ public: bool GetVSInstance(std::string& dir) const; + std::string GetAuxiliaryToolset() const override; + protected: bool InitializeWindows(cmMakefile* mf) override; bool SelectWindowsStoreToolset(std::string& toolset) const override; diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx index f3b9c84..f16db76 100644 --- a/Source/cmVisualStudio10TargetGenerator.cxx +++ b/Source/cmVisualStudio10TargetGenerator.cxx @@ -557,6 +557,11 @@ void cmVisualStudio10TargetGenerator::Generate() switch (this->ProjectType) { case vcxproj: + if (this->GlobalGenerator->GetPlatformToolsetVersion()) { + Elem(e0, "Import") + .Attribute("Project", + this->GlobalGenerator->GetAuxiliaryToolset()); + } Elem(e0, "Import").Attribute("Project", VS10_CXX_DEFAULT_PROPS); break; case csproj: |