aboutsummaryrefslogtreecommitdiff
path: root/cmake/CMakeDetermineVSServicePack.cmake
blob: b8946230811dd09a6ab68edf4f85b87a8daaae49 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# - 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
#
# Usage:
# ===========================
#
#    if(MSVC)
#       include(CMakeDetermineVSServicePack)
#       DetermineVSServicePack( my_service_pack )
#
#       if( my_service_pack )
#           message(STATUS "Detected: ${my_service_pack}")
#       endif()
#    endif()
#
# ===========================

#=============================================================================
# Copyright 2009-2010 Kitware, Inc.
# Copyright 2009-2010 Philip Lowman <philip@yhbt.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")
   else()
       set(_version "")
   endif()
   set(${_OUT_VAR} ${_version} PARENT_SCOPE)
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})
		if(${CMAKE_BUILD_TOOL} STREQUAL "nmake")
			EXECUTE_PROCESS(COMMAND ${CMAKE_CXX_COMPILER} "/?"
				ERROR_VARIABLE _output)
			set(DETERMINED_VS_SERVICE_PACK ${_output})
	    else()	
			file(WRITE "${CMAKE_BINARY_DIR}/return0.cc"
				"int main() { return 0; }\n")

			try_compile(DETERMINED_VS_SERVICE_PACK
				"${CMAKE_BINARY_DIR}"
				"${CMAKE_BINARY_DIR}/return0.cc"
				OUTPUT_VARIABLE _output
				COPY_FILE "${CMAKE_BINARY_DIR}/return0.cc")
        
			file(REMOVE "${CMAKE_BINARY_DIR}/return0.cc")
		endif()
                
        if(DETERMINED_VS_SERVICE_PACK AND _output)
            string(REGEX MATCH "Compiler Version [0-9]+.[0-9]+.[0-9]+.[0-9]+"
                _cl_version "${_output}")
            if(_cl_version)
                string(REGEX MATCHALL "[0-9]+"
                    _cl_version_list "${_cl_version}")
                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(_cl_version_string ${_major}.${_minor}.${_patch}.${_tweak})
                
                # Call helper function to determine VS version
                _DetermineVSServicePackFromCompiler(_sp "${_cl_version_string}")
                if(_sp)
                    #set(${_pack} "${_sp}(${_cl_version_string})" CACHE INTERNAL
					set(${_pack} "${_sp}" CACHE INTERNAL
                        "The Visual Studio Release with Service Pack")
                endif()
            endif()
        endif()
    endif()
endfunction()