Commit 0fd742a6 authored by Brad King's avatar Brad King

VS: Teach VS 2019 generator to select host tools matching host arch

This generator is new so we can introduce the long-desired behavior
of selecting ``host=x64`` tools by default on x64 hosts.
parent 17cef380
......@@ -47,6 +47,7 @@ default. The :variable:`CMAKE_GENERATOR_TOOLSET` option may be set, perhaps
via the :manual:`cmake(1)` ``-T`` option, to specify another toolset.
.. |VS_TOOLSET_HOST_ARCH_DEFAULT| replace::
By default this generator uses the 32-bit variant even on a 64-bit host.
By default this generator uses the 64-bit variant on x64 hosts and
the 32-bit variant otherwise.
.. include:: VS_TOOLSET_HOST_ARCH.txt
......@@ -10,4 +10,5 @@ vs2019
in the generator name. Instead :variable:`CMAKE_GENERATOR_PLATFORM`
must be used, e.g. through the ``-A`` command-line option. Furthermore,
the default target platform (architecture) is now based on the *host*
platform.
platform. The VS host toolset selection is now based on the host
architecture as well.
......@@ -606,11 +606,27 @@ cmGlobalVisualStudio10Generator::GetPlatformToolsetVersionString() const
const char*
cmGlobalVisualStudio10Generator::GetPlatformToolsetHostArchitecture() const
{
std::string const& hostArch =
this->GetPlatformToolsetHostArchitectureString();
if (hostArch.empty()) {
return nullptr;
}
return hostArch.c_str();
}
std::string const&
cmGlobalVisualStudio10Generator::GetPlatformToolsetHostArchitectureString()
const
{
if (!this->GeneratorToolsetHostArchitecture.empty()) {
return this->GeneratorToolsetHostArchitecture.c_str();
return this->GeneratorToolsetHostArchitecture;
}
return nullptr;
if (!this->DefaultPlatformToolsetHostArchitecture.empty()) {
return this->DefaultPlatformToolsetHostArchitecture;
}
static std::string const empty;
return empty;
}
const char* cmGlobalVisualStudio10Generator::GetPlatformToolsetCuda() const
......
......@@ -58,6 +58,7 @@ public:
/** The toolset host architecture name (e.g. x64 for 64-bit host tools). */
const char* GetPlatformToolsetHostArchitecture() const;
std::string const& GetPlatformToolsetHostArchitectureString() const;
/** The cuda toolset version. */
const char* GetPlatformToolsetCuda() const;
......@@ -152,6 +153,7 @@ protected:
std::string GeneratorToolsetHostArchitecture;
std::string GeneratorToolsetCuda;
std::string DefaultPlatformToolset;
std::string DefaultPlatformToolsetHostArchitecture;
std::string WindowsTargetPlatformVersion;
std::string SystemName;
std::string SystemVersion;
......
......@@ -11,10 +11,13 @@
#if defined(_M_ARM64)
# define HOST_PLATFORM_NAME "ARM64"
# define HOST_TOOLS_ARCH ""
#elif defined(_M_ARM)
# define HOST_PLATFORM_NAME "ARM"
# define HOST_TOOLS_ARCH ""
#elif defined(_M_IA64)
# define HOST_PLATFORM_NAME "Itanium"
# define HOST_TOOLS_ARCH ""
#else
# include "cmsys/SystemInformation.hxx"
#endif
......@@ -33,6 +36,20 @@ static std::string VSHostPlatformName()
#endif
}
static std::string VSHostArchitecture()
{
#ifdef HOST_TOOLS_ARCH
return HOST_TOOLS_ARCH;
#else
cmsys::SystemInformation info;
if (info.Is64Bits()) {
return "x64";
} else {
return "x86";
}
#endif
}
static unsigned int VSVersionToMajor(
cmGlobalVisualStudioGenerator::VSVersion v)
{
......@@ -262,6 +279,7 @@ cmGlobalVisualStudioVersionedGenerator::cmGlobalVisualStudioVersionedGenerator(
this->DefaultLinkFlagTableName = VSVersionToToolset(this->Version);
if (this->Version >= cmGlobalVisualStudioGenerator::VS16) {
this->DefaultPlatformName = VSHostPlatformName();
this->DefaultPlatformToolsetHostArchitecture = VSHostArchitecture();
}
}
......
-- CMAKE_VS_PLATFORM_TOOLSET='Test Toolset'
-- CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE=''
-- CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE='.*'
message(STATUS "CMAKE_VS_PLATFORM_TOOLSET='${CMAKE_VS_PLATFORM_TOOLSET}'")
message(STATUS "CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE='${CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE}'")
if(CMAKE_GENERATOR MATCHES "Visual Studio 1[6]")
cmake_host_system_information(RESULT is_64_bit QUERY IS_64BIT)
if(is_64_bit)
if(NOT "${CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE}" STREQUAL "x64")
message(FATAL_ERROR "CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE is not 'x64' as expected.")
endif()
endif()
else()
if(NOT "${CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE}" STREQUAL "")
message(FATAL_ERROR "CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE is not empty as expected.")
endif()
endif()
Markdown is supported
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