>From 64ee2a7d7e873d6c71aa23bb93c02acde2f2fc83 Mon Sep 17 00:00:00 2001
Message-Id: <64ee2a7d7e873d6c71aa23bb93c02acde2f2fc83.1397142703.git.brad.king@kitware.com>
From: Brad King <brad.king@kitware.com>
Date: Thu, 10 Apr 2014 11:03:32 -0400
Subject: [PATCH] CMakeDetermineVSServicePack: Match versions more robustly

Use the CMAKE_MATCH_* variables to simplify matching logic.  Match
either 3 or 4 version components.  Do not fail when there are only three
components available.
---
 Modules/CMakeDetermineVSServicePack.cmake | 38 ++++++-------------------------
 1 file changed, 7 insertions(+), 31 deletions(-)

diff --git a/Modules/CMakeDetermineVSServicePack.cmake b/Modules/CMakeDetermineVSServicePack.cmake
index 353aed6..69e3cd1 100644
--- a/Modules/CMakeDetermineVSServicePack.cmake
+++ b/Modules/CMakeDetermineVSServicePack.cmake
@@ -86,27 +86,14 @@ function(_DetermineVSServicePack_FastCheckVersionWithCompiler _SUCCESS_VAR  _VER
           OUTPUT_QUIET
         )
 
-      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)
-
+      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(_cl_version ${_major}.${_minor}.${_patch}.${_tweak})
-        else()
-          unset(_cl_version)
-        endif()
-      endif()
-
-      if(_cl_version)
           set(${_SUCCESS_VAR} true PARENT_SCOPE)
           set(${_VERSION_VAR} ${_cl_version} PARENT_SCOPE)
+        endif()
       endif()
     endif()
 endfunction()
@@ -127,20 +114,9 @@ function(_DetermineVSServicePack_CheckVersionWithTryCompile _SUCCESS_VAR  _VERSI
 
     file(REMOVE "${CMAKE_BINARY_DIR}/return0.cc")
 
-    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)
-
+    if(_output MATCHES "Compiler Version (([0-9]+)\\.([0-9]+)\\.([0-9]+)(\\.([0-9]+))?)")
       set(${_SUCCESS_VAR} true PARENT_SCOPE)
-      set(${_VERSION_VAR} ${_major}.${_minor}.${_patch}.${_tweak} PARENT_SCOPE)
+      set(${_VERSION_VAR} "${CMAKE_MATCH_1}" PARENT_SCOPE)
     endif()
 endfunction()
 
-- 
1.8.5.2

