# - Includes a public function for assisting users in trying to determine the
# Visual Studio service pack in use.
#
# Sets the passed in variable to one of the following values or an empty
# string if unknown.
# vc80
# vc80sp1
# vc90
# vc90sp1
# vc100
# vc100sp1
#
# Usage:
# ===========================
#
# if(MSVC)
# include(CMakeDetermineVSServicePack)
# DetermineVSServicePack( my_service_pack )
#
# if( my_service_pack )
# message(STATUS "Detected: ${my_service_pack}")
# endif()
# endif()
#
# ===========================
#=============================================================================
# Copyright 2009-2011 Kitware, Inc.
# Copyright 2009-2010 Philip Lowman <philip@yhbt.com>
# Copyright 2010-2011 Aaron C. meadows <cmake@shadowguarddev.com>
#
# Distributed under the OSI-approved BSD License (the "License");
# see accompanying file Copyright.txt for details.
#
# This software is distributed WITHOUT ANY WARRANTY; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the License for more information.
#=============================================================================
# (To distribute this file outside of CMake, substitute the full
# License text for the above reference.)
# [INTERNAL]
# Please do not call this function directly
function ( _DetermineVSServicePackFromCompiler _OUT_VAR _cl_version )
if ( ${ _cl_version } VERSION_EQUAL "14.00.50727.42" )
set ( _version "vc80" )
elseif ( ${ _cl_version } VERSION_EQUAL "14.00.50727.762" )
set ( _version "vc80sp1" )
elseif ( ${ _cl_version } VERSION_EQUAL "15.00.21022.08" )
set ( _version "vc90" )
elseif ( ${ _cl_version } VERSION_EQUAL "15.00.30729.01" )
set ( _version "vc90sp1" )
elseif ( ${ _cl_version } VERSION_EQUAL "16.00.30319.01" )
set ( _version "vc100" )
elseif ( ${ _cl_version } VERSION_EQUAL "16.00.40219.01" )
set ( _version "vc100sp1" )
else ( )
set ( _version "" )
endif ( )
set ( ${ _OUT_VAR } ${ _version } PARENT_SCOPE )
endfunction ( )
############################################################
# [INTERNAL]
# Please do not call this function directly
function ( _DetermineVSServicePack_FastCheckVersionWithCompiler _SUCCESS_VAR _VERSION_VAR )
if ( EXISTS ${ CMAKE_CXX_COMPILER } )
execute_process (
C O M M A N D $ { C M A K E _ C X X _ C O M P I L E R } / ?
E R R O R _ V A R I A B L E _ o u t p u t
O U T P U T _ Q U I E T
)
string ( REGEX MATCH "Compiler Version [0-9]+.[0-9]+.[0-9]+.[0-9]+"
_ c l _ v e r s i o n " $ { _ o u t p u t } " )
if ( _cl_version )
string ( REGEX MATCHALL "[0-9]+"
_ c l _ v e r s i o n _ l i s t " $ { _ c l _ v e r s i o n } " )
list ( GET _cl_version_list 0 _major )
list ( GET _cl_version_list 1 _minor )
list ( GET _cl_version_list 2 _patch )
list ( GET _cl_version_list 3 _tweak )
if ( "${_major}${_minor}" STREQUAL "${MSVC_VERSION}" )
set ( _cl_version ${ _major } . ${ _minor } . ${ _patch } . ${ _tweak } )
else ( )
unset ( _cl_version )
endif ( )
endif ( )
if ( _cl_version )
set ( ${ _SUCCESS_VAR } true PARENT_SCOPE )
set ( ${ _VERSION_VAR } ${ _cl_version } PARENT_SCOPE )
endif ( )
endif ( )
endfunction ( )
############################################################
# [INTERNAL]
# Please do not call this function directly
function ( _DetermineVSServicePack_CheckVersionWithTryCompile _SUCCESS_VAR _VERSION_VAR )
file ( WRITE "${CMAKE_BINARY_DIR}/return0.cc"
" i n t main ( ) { r e t u r n 0 ; } \ n " )
try_compile (
_ C o m p i l e R e s u l t
" $ { C M A K E _ B I N A R Y _ D I R } "
" $ { C M A K E _ B I N A R Y _ D I R } / r e t u r n 0 . c c "
O U T P U T _ V A R I A B L E _ o u t p u t
C O P Y _ F I L E " $ { C M A K E _ B I N A R Y _ D I R } / r e t u r n 0 . c c " )
file ( REMOVE "${CMAKE_BINARY_DIR}/return0.cc" )
string ( REGEX MATCH "Compiler Version [0-9]+.[0-9]+.[0-9]+.[0-9]+"
_ c l _ v e r s i o n " $ { _ o u t p u t } " )
if ( _cl_version )
string ( REGEX MATCHALL "[0-9]+"
_ c l _ v e r s i o n _ l i s t " $ { _ c l _ v e r s i o n } " )
list ( GET _cl_version_list 0 _major )
list ( GET _cl_version_list 1 _minor )
list ( GET _cl_version_list 2 _patch )
list ( GET _cl_version_list 3 _tweak )
set ( ${ _SUCCESS_VAR } true PARENT_SCOPE )
set ( ${ _VERSION_VAR } ${ _major } . ${ _minor } . ${ _patch } . ${ _tweak } PARENT_SCOPE )
endif ( )
endfunction ( )
############################################################
# [INTERNAL]
# Please do not call this function directly
function ( _DetermineVSServicePack_CheckVersionWithTryRun _SUCCESS_VAR _VERSION_VAR )
file ( WRITE "${CMAKE_BINARY_DIR}/return0.cc"
" #include <stdio.h>\n\nconst unsigned int CompilerVersion=_MSC_FULL_VER;\n\nint main(int argc, char* argv[])\n{\n int M( CompilerVersion/10000000);\n int m((CompilerVersion%10000000)/100000);\n int b(CompilerVersion%100000);\n\n printf(\"%d.%02d.%05d.01\",M,m,b);\n return 0;\n}\n")
try_run (
_ R u n R e s u l t
_ C o m p i l e R e s u l t
" $ { C M A K E _ B I N A R Y _ D I R } "
" $ { C M A K E _ B I N A R Y _ D I R } / r e t u r n 0 . c c "
R U N _ O U T P U T _ V A R I A B L E _ r u n o u t p u t
)
file ( REMOVE "${CMAKE_BINARY_DIR}/return0.cc" )
string ( REGEX MATCH "[0-9]+.[0-9]+.[0-9]+.[0-9]+"
_ c l _ v e r s i o n " $ { _ r u n o u t p u t } " )
if ( _cl_version )
set ( ${ _SUCCESS_VAR } true PARENT_SCOPE )
set ( ${ _VERSION_VAR } ${ _cl_version } PARENT_SCOPE )
endif ( )
endfunction ( )
#
# A function to call to determine the Visual Studio service pack
# in use. See documentation above.
function ( DetermineVSServicePack _pack )
if ( NOT DETERMINED_VS_SERVICE_PACK OR NOT ${ _pack } )
_DetermineVSServicePack_FastCheckVersionWithCompiler ( DETERMINED_VS_SERVICE_PACK _cl_version )
if ( NOT DETERMINED_VS_SERVICE_PACK )
_DetermineVSServicePack_CheckVersionWithTryCompile ( DETERMINED_VS_SERVICE_PACK _cl_version )
if ( NOT DETERMINED_VS_SERVICE_PACK )
_DetermineVSServicePack_CheckVersionWithTryRun ( DETERMINED_VS_SERVICE_PACK _cl_version )
endif ( )
endif ( )
if ( DETERMINED_VS_SERVICE_PACK )
if ( _cl_version )
# Call helper function to determine VS version
_DetermineVSServicePackFromCompiler ( _sp "${_cl_version}" )
if ( _sp )
set ( ${ _pack } ${ _sp } CACHE INTERNAL
" T h e V i s u a l S t u d i o R e l e a s e w i t h S e r v i c e P a c k " )
endif ( )
endif ( )
endif ( )
endif ( )
endfunction ( )