2023-11-01 06:11:15 +08:00
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
#[=======================================================================[.rst:
C M a k e D e t e r m i n e V S S e r v i c e P a c k
- - - - - - - - - - - - - - - - - - - - - - - - - - -
. . d e p r e c a t e d : : 3 . 0
D o n o t u s e .
T h e f u n c t i o n a l i t y o f t h i s m o d u l e h a s b e e n s u p e r s e d e d b y t h e
: v a r i a b l e : ` C M A K E _ < L A N G > _ C O M P I L E R _ V E R S I O N ` v a r i a b l e t h a t c o n t a i n s
t h e c o m p i l e r v e r s i o n n u m b e r .
D e t e r m i n e t h e V i s u a l S t u d i o s e r v i c e p a c k o f t h e ' c l ' i n u s e .
U s a g e : :
if ( MSVC )
include ( CMakeDetermineVSServicePack )
DetermineVSServicePack ( my_service_pack )
if ( my_service_pack )
message ( STATUS "Detected: ${my_service_pack}" )
endif ( )
endif ( )
F u n c t i o n D e t e r m i n e V S S e r v i c e P a c k s e t s t h e g i v e n v a r i a b l e t o o n e o f t h e
f o l l o w i n g v a l u e s o r a n e m p t y s t r i n g i f u n k n o w n : :
v c 8 0 , v c 8 0 s p 1
v c 9 0 , v c 9 0 s p 1
v c 1 0 0 , v c 1 0 0 s p 1
v c 1 1 0 , v c 1 1 0 s p 1 , v c 1 1 0 s p 2 , v c 1 1 0 s p 3 , v c 1 1 0 s p 4
#]=======================================================================]
if ( NOT CMAKE_MINIMUM_REQUIRED_VERSION VERSION_LESS 2.8.8 )
message ( DEPRECATION
" T h i s m o d u l e i s d e p r e c a t e d a n d s h o u l d n o t b e u s e d . "
" U s e t h e C M A K E _ < L A N G > _ C O M P I L E R _ V E R S I O N v a r i a b l e i n s t e a d . "
)
endif ( )
# [INTERNAL]
# Please do not call this function directly
function ( _DetermineVSServicePackFromCompiler _OUT_VAR _cl_version )
2023-11-01 06:20:22 +08:00
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" )
elseif ( ${ _cl_version } VERSION_EQUAL "17.00.50727.1" )
set ( _version "vc110" )
elseif ( ${ _cl_version } VERSION_EQUAL "17.00.51106.1" )
set ( _version "vc110sp1" )
elseif ( ${ _cl_version } VERSION_EQUAL "17.00.60315.1" )
set ( _version "vc110sp2" )
elseif ( ${ _cl_version } VERSION_EQUAL "17.00.60610.1" )
set ( _version "vc110sp3" )
elseif ( ${ _cl_version } VERSION_EQUAL "17.00.61030" )
set ( _version "vc110sp4" )
else ( )
set ( _version "" )
endif ( )
set ( ${ _OUT_VAR } ${ _version } PARENT_SCOPE )
2023-11-01 06:11:15 +08:00
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
)
if ( _output MATCHES "Compiler Version (([0-9]+)\\.([0-9]+)\\.([0-9]+)(\\.([0-9]+))?)" )
set ( _cl_version ${ CMAKE_MATCH_1 } )
set ( _major ${ CMAKE_MATCH_2 } )
set ( _minor ${ CMAKE_MATCH_3 } )
if ( "${_major}${_minor}" STREQUAL "${MSVC_VERSION}" )
set ( ${ _SUCCESS_VAR } true PARENT_SCOPE )
set ( ${ _VERSION_VAR } ${ _cl_version } PARENT_SCOPE )
endif ( )
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
2023-11-01 08:44:24 +08:00
S O U R C E S " $ { C M A K E _ B I N A R Y _ D I R } / r e t u r n 0 . c c "
2023-11-01 06:11:15 +08:00
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" )
if ( _output MATCHES "Compiler Version (([0-9]+)\\.([0-9]+)\\.([0-9]+)(\\.([0-9]+))?)" )
set ( ${ _SUCCESS_VAR } true PARENT_SCOPE )
set ( ${ _VERSION_VAR } "${CMAKE_MATCH_1}" 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
2023-11-01 08:44:24 +08:00
S O U R C E S " $ { C M A K E _ B I N A R Y _ D I R } / r e t u r n 0 . c c "
2023-11-01 06:11:15 +08:00
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 ( )