# - 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()
