VS: Simplify MSVC version reporting

Teach Windows-cl.cmake to use CMAKE_(C|CXX)_COMPILER_VERSION to set the
"MSVC##" and MSVC_VERSION variables.  It no longer needs the IDE generator
to dictate the version or to detect the version by running the
command-line tool for NMake and Ninja generators.  Drop configuration of
CMakeCPlatform.cmake and CMakeCXXPlatform.cmake from Windows-cl.cmake.in
because all the results it saved are now cheap to compute every time.
This commit is contained in:
Brad King 2012-08-23 11:20:48 -04:00
parent 32db033b27
commit 485a940e4c
14 changed files with 42 additions and 124 deletions

View File

@ -44,11 +44,6 @@ if(NOT CMAKE_C_COMPILER_WORKS)
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
"Determining if the C compiler works failed with " "Determining if the C compiler works failed with "
"the following output:\n${__CMAKE_C_COMPILER_OUTPUT}\n\n") "the following output:\n${__CMAKE_C_COMPILER_OUTPUT}\n\n")
# if the compiler is broken make sure to remove the platform file
# since Windows-cl configures both c/cxx files both need to be removed
# when c or c++ fails
file(REMOVE ${CMAKE_PLATFORM_ROOT_BIN}/CMakeCPlatform.cmake )
file(REMOVE ${CMAKE_PLATFORM_ROOT_BIN}/CMakeCXXPlatform.cmake )
message(FATAL_ERROR "The C compiler \"${CMAKE_C_COMPILER}\" " message(FATAL_ERROR "The C compiler \"${CMAKE_C_COMPILER}\" "
"is not able to compile a simple test program.\nIt fails " "is not able to compile a simple test program.\nIt fails "
"with the following output:\n ${__CMAKE_C_COMPILER_OUTPUT}\n\n" "with the following output:\n ${__CMAKE_C_COMPILER_OUTPUT}\n\n"

View File

@ -34,11 +34,6 @@ endif()
if(NOT CMAKE_CXX_COMPILER_WORKS) if(NOT CMAKE_CXX_COMPILER_WORKS)
PrintTestCompilerStatus("CXX" " -- broken") PrintTestCompilerStatus("CXX" " -- broken")
# if the compiler is broken make sure to remove the platform file
# since Windows-cl configures both c/cxx files both need to be removed
# when c or c++ fails
file(REMOVE ${CMAKE_PLATFORM_ROOT_BIN}/CMakeCPlatform.cmake )
file(REMOVE ${CMAKE_PLATFORM_ROOT_BIN}/CMakeCXXPlatform.cmake )
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
"Determining if the CXX compiler works failed with " "Determining if the CXX compiler works failed with "
"the following output:\n${__CMAKE_CXX_COMPILER_OUTPUT}\n\n") "the following output:\n${__CMAKE_CXX_COMPILER_OUTPUT}\n\n")

View File

@ -1,2 +0,0 @@
VERSION=_MSC_VER

View File

@ -1,8 +1,3 @@
# try to load any previously computed information for C on this platform
include( ${CMAKE_PLATFORM_ROOT_BIN}/CMakeCPlatform.cmake OPTIONAL)
# try to load any previously computed information for CXX on this platform
include( ${CMAKE_PLATFORM_ROOT_BIN}/CMakeCXXPlatform.cmake OPTIONAL)
set(WIN32 1) set(WIN32 1)
include(Platform/cl) include(Platform/cl)
@ -19,81 +14,54 @@ if(NOT CMAKE_NO_BUILD_TYPE AND CMAKE_GENERATOR MATCHES "Visual Studio")
"Semicolon separated list of supported configuration types, only supports Debug, Release, MinSizeRel, and RelWithDebInfo, anything else will be ignored.") "Semicolon separated list of supported configuration types, only supports Debug, Release, MinSizeRel, and RelWithDebInfo, anything else will be ignored.")
mark_as_advanced(CMAKE_CONFIGURATION_TYPES) mark_as_advanced(CMAKE_CONFIGURATION_TYPES)
endif() endif()
# does the compiler support pdbtype and is it the newer compiler
if(CMAKE_GENERATOR MATCHES "Visual Studio 8")
set(CMAKE_COMPILER_2005 1)
endif()
# make sure to enable languages after setting configuration types # make sure to enable languages after setting configuration types
enable_language(RC) enable_language(RC)
set(CMAKE_COMPILE_RESOURCE "rc <FLAGS> /fo<OBJECT> <SOURCE>") set(CMAKE_COMPILE_RESOURCE "rc <FLAGS> /fo<OBJECT> <SOURCE>")
# for nmake we need to compute some information about the compiler if("${CMAKE_GENERATOR}" MATCHES "Visual Studio")
# that is being used.
# to avoid running these tests with each cmake run, the
# test results are saved in CMakeCPlatform.cmake, a file
# that is automatically copied into try_compile directories
# by the global generator.
set(MSVC_IDE 1)
if(CMAKE_GENERATOR MATCHES "Makefiles" OR CMAKE_GENERATOR MATCHES "Ninja")
set(MSVC_IDE 0) set(MSVC_IDE 0)
if(NOT CMAKE_VC_COMPILER_TESTS_RUN) else()
set(CMAKE_VC_COMPILER_TESTS 1) set(MSVC_IDE 1)
set(testNmakeCLVersionFile endif()
"${CMAKE_ROOT}/Modules/CMakeTestNMakeCLVersion.c")
string(REGEX REPLACE "/" "\\\\" testNmakeCLVersionFile "${testNmakeCLVersionFile}") if(NOT MSVC_VERSION)
message(STATUS "Check for CL compiler version") if(CMAKE_C_COMPILER_VERSION)
set(CMAKE_TEST_COMPILER ${CMAKE_C_COMPILER}) set(_compiler_version ${CMAKE_C_COMPILER_VERSION})
if (NOT CMAKE_C_COMPILER) else()
set(CMAKE_TEST_COMPILER ${CMAKE_CXX_COMPILER}) set(_compiler_version ${CMAKE_CXX_COMPILER_VERSION})
endif() endif()
exec_program(${CMAKE_TEST_COMPILER} if("${_compiler_version}" MATCHES "^([0-9]+)\\.([0-9]+)")
ARGS /nologo -EP \"${testNmakeCLVersionFile}\" math(EXPR MSVC_VERSION "${CMAKE_MATCH_1}*100 + ${CMAKE_MATCH_2}")
OUTPUT_VARIABLE CMAKE_COMPILER_OUTPUT else()
RETURN_VALUE CMAKE_COMPILER_RETURN message(FATAL_ERROR "MSVC compiler version not detected properly: ${_compiler_version}")
) endif()
if(NOT CMAKE_COMPILER_RETURN)
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log set(MSVC10)
"Determining the version of compiler passed with the following output:\n" set(MSVC11)
"${CMAKE_COMPILER_OUTPUT}\n\n") set(MSVC60)
string(REGEX REPLACE "\n" " " compilerVersion "${CMAKE_COMPILER_OUTPUT}") set(MSVC70)
string(REGEX REPLACE ".*VERSION=(.*)" "\\1" set(MSVC71)
compilerVersion "${compilerVersion}") set(MSVC80)
message(STATUS "Check for CL compiler version - ${compilerVersion}") set(MSVC90)
set(MSVC60) set(CMAKE_COMPILER_2005)
set(MSVC70) set(CMAKE_COMPILER_SUPPORTS_PDBTYPE)
set(MSVC71) if(NOT "${_compiler_version}" VERSION_LESS 17)
set(MSVC80) set(MSVC11 1)
set(CMAKE_COMPILER_2005) elseif(NOT "${_compiler_version}" VERSION_LESS 16)
if("${compilerVersion}" LESS 1300) set(MSVC10 1)
set(MSVC60 1) elseif(NOT "${_compiler_version}" VERSION_LESS 15)
set(CMAKE_COMPILER_SUPPORTS_PDBTYPE 1) set(MSVC90 1)
endif() elseif(NOT "${_compiler_version}" VERSION_LESS 14)
if("${compilerVersion}" EQUAL 1300) set(MSVC80 1)
set(MSVC70 1) set(CMAKE_COMPILER_2005 1)
set(CMAKE_COMPILER_SUPPORTS_PDBTYPE 0) elseif(NOT "${_compiler_version}" VERSION_LESS 13.10)
endif() set(MSVC71 1)
if("${compilerVersion}" EQUAL 1310) elseif(NOT "${_compiler_version}" VERSION_LESS 13)
set(MSVC71 1) set(MSVC70 1)
set(CMAKE_COMPILER_SUPPORTS_PDBTYPE 0) else()
endif() set(MSVC60 1)
if("${compilerVersion}" EQUAL 1400) set(CMAKE_COMPILER_SUPPORTS_PDBTYPE 1)
set(MSVC80 1)
set(CMAKE_COMPILER_2005 1)
endif()
if("${compilerVersion}" EQUAL 1500)
set(MSVC90 1)
endif()
if("${compilerVersion}" EQUAL 1600)
set(MSVC10 1)
endif()
set(MSVC_VERSION "${compilerVersion}")
else()
message(STATUS "Check for CL compiler version - failed")
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
"Determining the version of compiler failed with the following output:\n"
"${CMAKE_COMPILER_OUTPUT}\n\n")
endif()
endif() endif()
endif() endif()
@ -195,14 +163,3 @@ set (CMAKE_MODULE_LINKER_FLAGS_DEBUG_INIT ${CMAKE_SHARED_LINKER_FLAGS_DEBUG_INIT
set (CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO_INIT ${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO_INIT}) set (CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO_INIT ${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO_INIT})
set (CMAKE_MODULE_LINKER_FLAGS_RELEASE_INIT ${CMAKE_EXE_LINKER_FLAGS_RELEASE_INIT}) set (CMAKE_MODULE_LINKER_FLAGS_RELEASE_INIT ${CMAKE_EXE_LINKER_FLAGS_RELEASE_INIT})
set (CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL_INIT ${CMAKE_EXE_LINKER_FLAGS_MINSIZEREL_INIT}) set (CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL_INIT ${CMAKE_EXE_LINKER_FLAGS_MINSIZEREL_INIT})
# save computed information for this platform
if(NOT EXISTS "${CMAKE_PLATFORM_ROOT_BIN}/CMakeCPlatform.cmake")
configure_file(${CMAKE_ROOT}/Modules/Platform/Windows-cl.cmake.in
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeCPlatform.cmake IMMEDIATE)
endif()
if(NOT EXISTS "${CMAKE_PLATFORM_ROOT_BIN}/CMakeCXXPlatform.cmake")
configure_file(${CMAKE_ROOT}/Modules/Platform/Windows-cl.cmake.in
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeCXXPlatform.cmake IMMEDIATE)
endif()

View File

@ -1,13 +0,0 @@
set(CMAKE_VC_COMPILER_TESTS_RUN 1)
set(CMAKE_COMPILER_SUPPORTS_PDBTYPE @CMAKE_COMPILER_SUPPORTS_PDBTYPE@)
set(CMAKE_COMPILER_2005 @CMAKE_COMPILER_2005@)
set(CMAKE_CL_64 @CMAKE_CL_64@)
set(MSVC60 @MSVC60@)
set(MSVC70 @MSVC70@)
set(MSVC71 @MSVC71@)
set(MSVC80 @MSVC80@)
set(MSVC90 @MSVC90@)
set(MSVC10 @MSVC10@)
set(MSVC_IDE @MSVC_IDE@)
set(MSVC_VERSION @MSVC_VERSION@)
set(WIN32 1)

View File

@ -19,7 +19,6 @@
cmGlobalVisualStudio10Generator::cmGlobalVisualStudio10Generator() cmGlobalVisualStudio10Generator::cmGlobalVisualStudio10Generator()
{ {
this->VersionId = "MSVC10";
this->FindMakeProgramFile = "CMakeVS10FindMake.cmake"; this->FindMakeProgramFile = "CMakeVS10FindMake.cmake";
std::string vc10Express; std::string vc10Express;
this->ExpressEdition = cmSystemTools::ReadRegistryValue( this->ExpressEdition = cmSystemTools::ReadRegistryValue(

View File

@ -16,7 +16,6 @@
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
cmGlobalVisualStudio11Generator::cmGlobalVisualStudio11Generator() cmGlobalVisualStudio11Generator::cmGlobalVisualStudio11Generator()
{ {
this->VersionId = "MSVC11";
this->FindMakeProgramFile = "CMakeVS11FindMake.cmake"; this->FindMakeProgramFile = "CMakeVS11FindMake.cmake";
this->ExpressEdition = false; // TODO: VS 11 Express support this->ExpressEdition = false; // TODO: VS 11 Express support
this->PlatformToolset = "v110"; this->PlatformToolset = "v110";

View File

@ -32,7 +32,6 @@ std::string GetVS6TargetName(const std::string& targetName)
cmGlobalVisualStudio6Generator::cmGlobalVisualStudio6Generator() cmGlobalVisualStudio6Generator::cmGlobalVisualStudio6Generator()
{ {
this->VersionId = "MSVC60";
this->FindMakeProgramFile = "CMakeVS6FindMake.cmake"; this->FindMakeProgramFile = "CMakeVS6FindMake.cmake";
} }

View File

@ -18,7 +18,6 @@
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
cmGlobalVisualStudio71Generator::cmGlobalVisualStudio71Generator() cmGlobalVisualStudio71Generator::cmGlobalVisualStudio71Generator()
{ {
this->VersionId = "MSVC71";
this->FindMakeProgramFile = "CMakeVS71FindMake.cmake"; this->FindMakeProgramFile = "CMakeVS71FindMake.cmake";
this->ProjectConfigurationSectionName = "ProjectConfiguration"; this->ProjectConfigurationSectionName = "ProjectConfiguration";
} }

View File

@ -18,7 +18,6 @@
cmGlobalVisualStudio7Generator::cmGlobalVisualStudio7Generator() cmGlobalVisualStudio7Generator::cmGlobalVisualStudio7Generator()
{ {
this->VersionId = "MSVC70";
this->FindMakeProgramFile = "CMakeVS7FindMake.cmake"; this->FindMakeProgramFile = "CMakeVS7FindMake.cmake";
} }

View File

@ -19,7 +19,6 @@
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
cmGlobalVisualStudio8Generator::cmGlobalVisualStudio8Generator() cmGlobalVisualStudio8Generator::cmGlobalVisualStudio8Generator()
{ {
this->VersionId = "MSVC80";
this->FindMakeProgramFile = "CMakeVS8FindMake.cmake"; this->FindMakeProgramFile = "CMakeVS8FindMake.cmake";
this->ProjectConfigurationSectionName = "ProjectConfigurationPlatforms"; this->ProjectConfigurationSectionName = "ProjectConfigurationPlatforms";
} }

View File

@ -19,7 +19,6 @@
cmGlobalVisualStudio9Generator::cmGlobalVisualStudio9Generator() cmGlobalVisualStudio9Generator::cmGlobalVisualStudio9Generator()
{ {
this->VersionId = "MSVC90";
this->FindMakeProgramFile = "CMakeVS9FindMake.cmake"; this->FindMakeProgramFile = "CMakeVS9FindMake.cmake";
} }

View File

@ -22,7 +22,6 @@
cmGlobalVisualStudioGenerator::cmGlobalVisualStudioGenerator() cmGlobalVisualStudioGenerator::cmGlobalVisualStudioGenerator()
{ {
this->ArchitectureId = "X86"; this->ArchitectureId = "X86";
this->VersionId = 0;
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@ -495,11 +494,6 @@ void cmGlobalVisualStudioGenerator::AddPlatformDefinitions(cmMakefile* mf)
{ {
mf->AddDefinition("MSVC_C_ARCHITECTURE_ID", this->ArchitectureId); mf->AddDefinition("MSVC_C_ARCHITECTURE_ID", this->ArchitectureId);
mf->AddDefinition("MSVC_CXX_ARCHITECTURE_ID", this->ArchitectureId); mf->AddDefinition("MSVC_CXX_ARCHITECTURE_ID", this->ArchitectureId);
if (this->VersionId)
{
mf->AddDefinition(this->VersionId, "1");
}
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------

View File

@ -99,7 +99,6 @@ protected:
typedef std::map<cmTarget*, cmStdString> UtilityDependsMap; typedef std::map<cmTarget*, cmStdString> UtilityDependsMap;
UtilityDependsMap UtilityDepends; UtilityDependsMap UtilityDepends;
const char* ArchitectureId; const char* ArchitectureId;
const char* VersionId;
private: private:
void ComputeTargetObjects(cmGeneratorTarget* gt) const; void ComputeTargetObjects(cmGeneratorTarget* gt) const;