Imported Upstream version 2.8.10.2
[platform/upstream/cmake.git] / Modules / CMakeDetermineVSServicePack.cmake
1 # - Includes a public function for assisting users in trying to determine the
2 # Visual Studio service pack in use.
3 #
4 # Sets the passed in variable to one of the following values or an empty
5 # string if unknown.
6 #    vc80
7 #    vc80sp1
8 #    vc90
9 #    vc90sp1
10 #    vc100
11 #    vc100sp1
12 #    vc110
13 #
14 # Usage:
15 # ===========================
16 #
17 #    if(MSVC)
18 #       include(CMakeDetermineVSServicePack)
19 #       DetermineVSServicePack( my_service_pack )
20 #
21 #       if( my_service_pack )
22 #           message(STATUS "Detected: ${my_service_pack}")
23 #       endif()
24 #    endif()
25 #
26 # ===========================
27
28 #=============================================================================
29 # Copyright 2009-2011 Kitware, Inc.
30 # Copyright 2009-2010 Philip Lowman <philip@yhbt.com>
31 # Copyright 2010-2011 Aaron C. meadows <cmake@shadowguarddev.com>
32 #
33 # Distributed under the OSI-approved BSD License (the "License");
34 # see accompanying file Copyright.txt for details.
35 #
36 # This software is distributed WITHOUT ANY WARRANTY; without even the
37 # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
38 # See the License for more information.
39 #=============================================================================
40 # (To distribute this file outside of CMake, substitute the full
41 #  License text for the above reference.)
42
43 # [INTERNAL]
44 # Please do not call this function directly
45 function(_DetermineVSServicePackFromCompiler _OUT_VAR _cl_version)
46    if    (${_cl_version} VERSION_EQUAL "14.00.50727.42")
47        set(_version "vc80")
48    elseif(${_cl_version} VERSION_EQUAL "14.00.50727.762")
49        set(_version "vc80sp1")
50    elseif(${_cl_version} VERSION_EQUAL "15.00.21022.08")
51        set(_version "vc90")
52    elseif(${_cl_version} VERSION_EQUAL "15.00.30729.01")
53        set(_version "vc90sp1")
54    elseif(${_cl_version} VERSION_EQUAL "16.00.30319.01")
55        set(_version "vc100")
56    elseif(${_cl_version} VERSION_EQUAL "16.00.40219.01")
57        set(_version "vc100sp1")
58    elseif(${_cl_version} VERSION_EQUAL "17.00.50727.1")
59        set(_version "vc110")
60    else()
61        set(_version "")
62    endif()
63    set(${_OUT_VAR} ${_version} PARENT_SCOPE)
64 endfunction()
65
66
67 ############################################################
68 # [INTERNAL]
69 # Please do not call this function directly
70 function(_DetermineVSServicePack_FastCheckVersionWithCompiler _SUCCESS_VAR  _VERSION_VAR)
71     if(EXISTS ${CMAKE_CXX_COMPILER})
72       execute_process(
73           COMMAND ${CMAKE_CXX_COMPILER} /?
74           ERROR_VARIABLE _output
75           OUTPUT_QUIET
76         )
77
78       string(REGEX MATCH "Compiler Version [0-9]+.[0-9]+.[0-9]+.[0-9]+"
79         _cl_version "${_output}")
80
81       if(_cl_version)
82         string(REGEX MATCHALL "[0-9]+"
83             _cl_version_list "${_cl_version}")
84         list(GET _cl_version_list 0 _major)
85         list(GET _cl_version_list 1 _minor)
86         list(GET _cl_version_list 2 _patch)
87         list(GET _cl_version_list 3 _tweak)
88
89         if("${_major}${_minor}" STREQUAL "${MSVC_VERSION}")
90           set(_cl_version ${_major}.${_minor}.${_patch}.${_tweak})
91         else()
92           unset(_cl_version)
93         endif()
94       endif()
95
96       if(_cl_version)
97           set(${_SUCCESS_VAR} true PARENT_SCOPE)
98           set(${_VERSION_VAR} ${_cl_version} PARENT_SCOPE)
99       endif()
100     endif()
101 endfunction()
102
103 ############################################################
104 # [INTERNAL]
105 # Please do not call this function directly
106 function(_DetermineVSServicePack_CheckVersionWithTryCompile _SUCCESS_VAR  _VERSION_VAR)
107     file(WRITE "${CMAKE_BINARY_DIR}/return0.cc"
108       "int main() { return 0; }\n")
109
110     try_compile(
111       _CompileResult
112       "${CMAKE_BINARY_DIR}"
113       "${CMAKE_BINARY_DIR}/return0.cc"
114       OUTPUT_VARIABLE _output
115       COPY_FILE "${CMAKE_BINARY_DIR}/return0.cc")
116
117     file(REMOVE "${CMAKE_BINARY_DIR}/return0.cc")
118
119     string(REGEX MATCH "Compiler Version [0-9]+.[0-9]+.[0-9]+.[0-9]+"
120       _cl_version "${_output}")
121
122     if(_cl_version)
123       string(REGEX MATCHALL "[0-9]+"
124           _cl_version_list "${_cl_version}")
125
126       list(GET _cl_version_list 0 _major)
127       list(GET _cl_version_list 1 _minor)
128       list(GET _cl_version_list 2 _patch)
129       list(GET _cl_version_list 3 _tweak)
130
131       set(${_SUCCESS_VAR} true PARENT_SCOPE)
132       set(${_VERSION_VAR} ${_major}.${_minor}.${_patch}.${_tweak} PARENT_SCOPE)
133     endif()
134 endfunction()
135
136 ############################################################
137 # [INTERNAL]
138 # Please do not call this function directly
139 function(_DetermineVSServicePack_CheckVersionWithTryRun _SUCCESS_VAR  _VERSION_VAR)
140     file(WRITE "${CMAKE_BINARY_DIR}/return0.cc"
141         "#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")
142
143     try_run(
144         _RunResult
145         _CompileResult
146         "${CMAKE_BINARY_DIR}"
147         "${CMAKE_BINARY_DIR}/return0.cc"
148         RUN_OUTPUT_VARIABLE  _runoutput
149         )
150
151     file(REMOVE "${CMAKE_BINARY_DIR}/return0.cc")
152
153     string(REGEX MATCH "[0-9]+.[0-9]+.[0-9]+.[0-9]+"
154         _cl_version "${_runoutput}")
155
156     if(_cl_version)
157       set(${_SUCCESS_VAR} true PARENT_SCOPE)
158       set(${_VERSION_VAR} ${_cl_version} PARENT_SCOPE)
159     endif()
160 endfunction()
161
162
163 #
164 # A function to call to determine the Visual Studio service pack
165 # in use.  See documentation above.
166 function(DetermineVSServicePack _pack)
167     if(NOT DETERMINED_VS_SERVICE_PACK OR NOT ${_pack})
168
169         _DetermineVSServicePack_FastCheckVersionWithCompiler(DETERMINED_VS_SERVICE_PACK _cl_version)
170         if(NOT DETERMINED_VS_SERVICE_PACK)
171             _DetermineVSServicePack_CheckVersionWithTryCompile(DETERMINED_VS_SERVICE_PACK _cl_version)
172             if(NOT DETERMINED_VS_SERVICE_PACK)
173                 _DetermineVSServicePack_CheckVersionWithTryRun(DETERMINED_VS_SERVICE_PACK _cl_version)
174             endif()
175         endif()
176
177         if(DETERMINED_VS_SERVICE_PACK)
178
179             if(_cl_version)
180                 # Call helper function to determine VS version
181                 _DetermineVSServicePackFromCompiler(_sp "${_cl_version}")
182                 if(_sp)
183                     set(${_pack} ${_sp} CACHE INTERNAL
184                         "The Visual Studio Release with Service Pack")
185                 endif()
186             endif()
187         endif()
188     endif()
189 endfunction()
190