Home | History | Annotate | Download | only in 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 #
     11 # Usage:
     12 # ===========================
     13 #
     14 #    if(MSVC)
     15 #       include(CMakeDetermineVSServicePack)
     16 #       DetermineVSServicePack( my_service_pack )
     17 #
     18 #       if( my_service_pack )
     19 #           message(STATUS "Detected: ${my_service_pack}")
     20 #       endif()
     21 #    endif()
     22 #
     23 # ===========================
     24 
     25 #=============================================================================
     26 # Copyright 2009-2010 Kitware, Inc.
     27 # Copyright 2009-2010 Philip Lowman <philip (a] yhbt.com>
     28 #
     29 # Distributed under the OSI-approved BSD License (the "License");
     30 # see accompanying file Copyright.txt for details.
     31 #
     32 # This software is distributed WITHOUT ANY WARRANTY; without even the
     33 # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     34 # See the License for more information.
     35 #=============================================================================
     36 # (To distribute this file outside of CMake, substitute the full
     37 #  License text for the above reference.)
     38 
     39 # [INTERNAL]
     40 # Please do not call this function directly
     41 function(_DetermineVSServicePackFromCompiler _OUT_VAR _cl_version)
     42    if    (${_cl_version} VERSION_EQUAL "14.00.50727.42")
     43        set(_version "vc80")
     44    elseif(${_cl_version} VERSION_EQUAL "14.00.50727.762")
     45        set(_version "vc80sp1")
     46    elseif(${_cl_version} VERSION_EQUAL "15.00.21022.08")
     47        set(_version "vc90")
     48    elseif(${_cl_version} VERSION_EQUAL "15.00.30729.01")
     49        set(_version "vc90sp1")
     50    elseif(${_cl_version} VERSION_EQUAL "16.00.30319.01")
     51        set(_version "vc100")
     52    else()
     53        set(_version "")
     54    endif()
     55    set(${_OUT_VAR} ${_version} PARENT_SCOPE)
     56 endfunction()
     57 
     58 #
     59 # A function to call to determine the Visual Studio service pack
     60 # in use.  See documentation above.
     61 function(DetermineVSServicePack _pack)
     62     if(NOT DETERMINED_VS_SERVICE_PACK OR NOT ${_pack})
     63 		if(${CMAKE_BUILD_TOOL} STREQUAL "nmake")
     64 			EXECUTE_PROCESS(COMMAND ${CMAKE_CXX_COMPILER} "/?"
     65 				ERROR_VARIABLE _output)
     66 			set(DETERMINED_VS_SERVICE_PACK ${_output})
     67 	    else()	
     68 			file(WRITE "${CMAKE_BINARY_DIR}/return0.cc"
     69 				"int main() { return 0; }\n")
     70 
     71 			try_compile(DETERMINED_VS_SERVICE_PACK
     72 				"${CMAKE_BINARY_DIR}"
     73 				"${CMAKE_BINARY_DIR}/return0.cc"
     74 				OUTPUT_VARIABLE _output
     75 				COPY_FILE "${CMAKE_BINARY_DIR}/return0.cc")
     76         
     77 			file(REMOVE "${CMAKE_BINARY_DIR}/return0.cc")
     78 		endif()
     79                 
     80         if(DETERMINED_VS_SERVICE_PACK AND _output)
     81             string(REGEX MATCH "Compiler Version [0-9]+.[0-9]+.[0-9]+.[0-9]+"
     82                 _cl_version "${_output}")
     83             if(_cl_version)
     84                 string(REGEX MATCHALL "[0-9]+"
     85                     _cl_version_list "${_cl_version}")
     86                 list(GET _cl_version_list 0 _major)
     87                 list(GET _cl_version_list 1 _minor)
     88                 list(GET _cl_version_list 2 _patch)
     89                 list(GET _cl_version_list 3 _tweak)
     90 
     91                 set(_cl_version_string ${_major}.${_minor}.${_patch}.${_tweak})
     92                 
     93                 # Call helper function to determine VS version
     94                 _DetermineVSServicePackFromCompiler(_sp "${_cl_version_string}")
     95                 if(_sp)
     96                     #set(${_pack} "${_sp}(${_cl_version_string})" CACHE INTERNAL
     97 					set(${_pack} "${_sp}" CACHE INTERNAL
     98                         "The Visual Studio Release with Service Pack")
     99                 endif()
    100             endif()
    101         endif()
    102     endif()
    103 endfunction()
    104