Support MSVC on appveyor
diff --git a/CMakeLists.txt b/CMakeLists.txt
index b799a62..2c72252 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,14 @@
 cmake_minimum_required (VERSION 2.8.11)
 project (benchmark)
 
+foreach(p
+    CMP0054 # CMake 3.1
+    )
+  if(POLICY ${p})
+    cmake_policy(SET ${p} NEW)
+  endif()
+endforeach()
+
 option(BENCHMARK_ENABLE_TESTING "Enable testing of the benchmark library." ON)
 option(BENCHMARK_ENABLE_LTO "Enable link time optimisation of the benchmark library." OFF)
 # Make sure we can import out CMake functions
@@ -23,73 +31,83 @@
 include(AddCXXCompilerFlag)
 include(CXXFeatureCheck)
 
-# Try and enable C++11. Don't use C++14 because it doesn't work in some
-# configurations.
-add_cxx_compiler_flag(-std=c++11)
-if (NOT HAVE_CXX_FLAG_STD_CXX11)
-  add_cxx_compiler_flag(-std=c++0x)
-endif()
-
-# Turn compiler warnings up to 11
-if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")

+if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
+  # Turn compiler warnings up to 11
   add_cxx_compiler_flag(-W4)
-  add_definitions(-D_CRT_SECURE_NO_WARNINGS)

-else()

-  add_cxx_compiler_flag(-Wall)

-endif()
-add_cxx_compiler_flag(-Wextra)
-add_cxx_compiler_flag(-Wshadow)
-add_cxx_compiler_flag(-Werror RELEASE)
-add_cxx_compiler_flag(-pedantic)
-add_cxx_compiler_flag(-pedantic-errors)
-add_cxx_compiler_flag(-Wshorten-64-to-32)
-add_cxx_compiler_flag(-Wfloat-equal)
-add_cxx_compiler_flag(-Wzero-as-null-pointer-constant)
-add_cxx_compiler_flag(-fstrict-aliasing)
-if (HAVE_CXX_FLAG_FSTRICT_ALIASING)
-  add_cxx_compiler_flag(-Wstrict-aliasing)
-endif()
-add_cxx_compiler_flag(-Wthread-safety)
-if (HAVE_WTHREAD_SAFETY)
-  add_definitions(-DHAVE_WTHREAD_SAFETY)
-  cxx_feature_check(THREAD_SAFETY_ATTRIBUTES)
-endif()
+  add_definitions(-D_CRT_SECURE_NO_WARNINGS)
 
-# Link time optimisation
-if (BENCHMARK_ENABLE_LTO)
-  add_cxx_compiler_flag(-flto)
-  if ("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU")
-    find_program(GCC_AR gcc-ar)
-    if (GCC_AR)
-      set(CMAKE_AR ${GCC_AR})
-    endif()
-    find_program(GCC_RANLIB gcc-ranlib)
-    if (GCC_RANLIB)
-      set(CMAKE_RANLIB ${GCC_RANLIB})
+  # Link time optimisation
+  if (BENCHMARK_ENABLE_LTO)
+    set(CMAKE_CXX_FLAGS_RELEASE "/GL")
+    set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "/LTCG")
+    set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "/LTCG")
+    set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
+  endif()
+else()
+  # Try and enable C++11. Don't use C++14 because it doesn't work in some
+  # configurations.
+  add_cxx_compiler_flag(-std=c++11)
+  if (NOT HAVE_CXX_FLAG_STD_CXX11)
+    add_cxx_compiler_flag(-std=c++0x)
+  endif()
+
+  # Turn compiler warnings up to 11
+  add_cxx_compiler_flag(-Wall)
+
+  add_cxx_compiler_flag(-Wextra)
+  add_cxx_compiler_flag(-Wshadow)
+  add_cxx_compiler_flag(-Werror RELEASE)
+  add_cxx_compiler_flag(-pedantic)
+  add_cxx_compiler_flag(-pedantic-errors)
+  add_cxx_compiler_flag(-Wshorten-64-to-32)
+  add_cxx_compiler_flag(-Wfloat-equal)
+  add_cxx_compiler_flag(-Wzero-as-null-pointer-constant)
+  add_cxx_compiler_flag(-fstrict-aliasing)
+  if (HAVE_CXX_FLAG_FSTRICT_ALIASING)
+    add_cxx_compiler_flag(-Wstrict-aliasing)
+  endif()
+  add_cxx_compiler_flag(-Wthread-safety)
+  if (HAVE_WTHREAD_SAFETY)
+    add_definitions(-DHAVE_WTHREAD_SAFETY)
+    cxx_feature_check(THREAD_SAFETY_ATTRIBUTES)
+  endif()
+
+  # Link time optimisation
+  if (BENCHMARK_ENABLE_LTO)
+    add_cxx_compiler_flag(-flto)
+    if ("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU")
+      find_program(GCC_AR gcc-ar)
+      if (GCC_AR)
+        set(CMAKE_AR ${GCC_AR})
+      endif()
+      find_program(GCC_RANLIB gcc-ranlib)
+      if (GCC_RANLIB)
+        set(CMAKE_RANLIB ${GCC_RANLIB})
+      endif()
     endif()
   endif()
-endif()
 
-# Coverage build type
-set(CMAKE_CXX_FLAGS_COVERAGE "${CMAKE_CXX_FLAGS_DEBUG}" CACHE STRING
-  "Flags used by the C++ compiler during coverage builds."
-  FORCE)
-set(CMAKE_EXE_LINKER_FLAGS_COVERAGE
-  "${CMAKE_EXE_LINKER_FLAGS_DEBUG}" CACHE STRING
-  "Flags used for linking binaries during coverage builds."
-  FORCE)
-set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE
-  "${CMAKE_SHARED_LINKER_FLAGS_DEBUG}" CACHE STRING
-  "Flags used by the shared libraries linker during coverage builds."
-  FORCE)
-mark_as_advanced(
-  CMAKE_CXX_FLAGS_COVERAGE
-  CMAKE_EXE_LINKER_FLAGS_COVERAGE
-  CMAKE_SHARED_LINKER_FLAGS_COVERAGE)
-set(CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING
-  "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel Coverage."
-  FORCE)
-add_cxx_compiler_flag(--coverage COVERAGE)
+  # Coverage build type
+  set(CMAKE_CXX_FLAGS_COVERAGE "${CMAKE_CXX_FLAGS_DEBUG}" CACHE STRING
+    "Flags used by the C++ compiler during coverage builds."
+    FORCE)
+  set(CMAKE_EXE_LINKER_FLAGS_COVERAGE
+    "${CMAKE_EXE_LINKER_FLAGS_DEBUG}" CACHE STRING
+    "Flags used for linking binaries during coverage builds."
+    FORCE)
+  set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE
+    "${CMAKE_SHARED_LINKER_FLAGS_DEBUG}" CACHE STRING
+    "Flags used by the shared libraries linker during coverage builds."
+    FORCE)
+  mark_as_advanced(
+    CMAKE_CXX_FLAGS_COVERAGE
+    CMAKE_EXE_LINKER_FLAGS_COVERAGE
+    CMAKE_SHARED_LINKER_FLAGS_COVERAGE)
+  set(CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING
+    "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel Coverage."
+    FORCE)
+  add_cxx_compiler_flag(--coverage COVERAGE)
+endif()
 
 # C++ feature checks
 cxx_feature_check(STD_REGEX)
diff --git a/appveyor.yml b/appveyor.yml
index 5368a4a..13be7fa 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -12,9 +12,16 @@
 
 environment:
   matrix:
+    - compiler: msvc-12-seh
+    - compiler: msvc-14-seh
     - compiler: gcc-4.9.2-posix
 #    - compiler: gcc-4.8.4-posix
-#    - compiler: msvc-12-seh
+
+artifacts:
+  - path: '_build/CMakeFiles/*.log'
+    name: logs
+  - path: '_build/Testing/**/*.xml'
+    name: test_results
 
 install:
   # derive some extra information
@@ -35,18 +42,83 @@
   - if "%compiler_name%"=="gcc" (set "build=mingw32-make -j4")
   - if "%compiler_name%"=="gcc" (set "test=mingw32-make CTEST_OUTPUT_ON_FAILURE=1 test")
   # msvc specific commands
-  # TODO :)
+  - if "%compiler_name%"=="msvc" if "%compiler_version%"=="12" if "%platform%"=="x86" (set "generator=Visual Studio 12 2013")
+  - if "%compiler_name%"=="msvc" if "%compiler_version%"=="12" if "%platform%"=="x64" (set "generator=Visual Studio 12 2013 Win64")
+  - if "%compiler_name%"=="msvc" if "%compiler_version%"=="14" if "%platform%"=="x86" (set "generator=Visual Studio 14 2015")
+  - if "%compiler_name%"=="msvc" if "%compiler_version%"=="14" if "%platform%"=="x64" (set "generator=Visual Studio 14 2015 Win64")
+  - if "%compiler_name%"=="msvc" (set "build=cmake --build . --config %variant%")
+  - if "%compiler_name%"=="msvc" (set "test=ctest -c Release -D CTEST_OUTPUT_ON_FAILURE:STRING=1")
   # add the compiler path if needed
   - if not "%compiler_path%"=="" (set "PATH=%PATH%;%compiler_path%")
   # git bash conflicts with MinGW makefiles
-  - if "%generator%"=="MinGW Makefiles" (set "PATH=%PATH:C:\Program Files (x86)\Git\bin=%")
+  - if "%generator%"=="MinGW Makefiles" (set "PATH=%PATH:C:\Program Files\Git\usr\bin;=%")
 
 build_script:
-  - cmake -G "%generator%" "-DCMAKE_BUILD_TYPE=%variant%" "-DBUILD_SHARED_LIBS=%shared%"
-  - cmd /c "%build%"
+- ps: |
+    md _build -Force
+    cd _build
+    & cmake -G "$env:generator" "-DCMAKE_BUILD_TYPE=$env:variant" "-DBUILD_SHARED_LIBS=$env:shared" ..
+    if ($LastExitCode -ne 0) {
+        throw "Exec: $ErrorMessage"
+    }
+    iex "& $env:build"
+    if ($LastExitCode -ne 0) {
+        throw "Exec: $ErrorMessage"
+    }
 
 test_script:
-  - cmd /c "%test%"
+- ps: |
+    iex "& $env:test"
+    if ($LastExitCode -ne 0) {
+        throw "Exec: $ErrorMessage"
+    }
+
+    function Add-CTest-Result($testResult)
+    {
+        $tests = ([xml](get-content $testResult)).Site.Testing
+        $testsCount = 0
+        $anyFailures = $FALSE
+
+        foreach ($test in $tests.test) {
+            $testsCount++
+            $testName = $test.Name
+            $testpath = $test.Path
+            $timeNode = $test.SelectSingleNode('Results/NamedMeasurement[@name="Execution Time"]/Value')
+            if ($test.status -eq "failure") {
+                $time = ([double]$timeNode.InnerText * 1000)
+                Add-AppveyorTest $testName -Outcome Failed -FileName $testpath -Duration $time -ErrorMessage $($test.results.measurement.value)
+                Add-AppveyorMessage `"$testName failed`" -Category Error
+                $anyFailures = $TRUE
+            }
+            elseif ($test.status -eq "skipped") {
+                Add-AppveyorTest $testName -Outcome Ignored -Filename $testpath
+            }
+            else {
+                $time = ([double]$timeNode.InnerText * 1000)
+                Add-AppveyorTest $testName -Outcome Passed -FileName $testpath -Duration $time -StdOut $($test.results.measurement.value)
+            }
+        }
+        return $testsCount, $anyFailures
+    }
+
+    $testsCount = 0
+    $anyFailures = $FALSE
+
+    # Run tests and upload results to AppVeyor one by one
+    Get-ChildItem ".\Testing\*.xml" -Recurse | foreach {
+        $testfile = $_.fullname
+        $count, $testsResult = Add-CTest-Result $testfile
+        Write-Host "Found $testfile with $count tests"
+        $testsCount = $testsCount + $count
+        $anyFailures = $anyFailures -or $testsResult
+    }
+
+    Write-Host "There are $testsCount tests found"
+
+    if ($anyFailures -eq $TRUE){
+        Write-Host "Failing build as there are broken tests"
+        $host.SetShouldExit(1)
+    }
 
 matrix:
   fast_finish: true