Merge pull request #175 from KindDragon/master

Support MSVC on appveyor
This commit is contained in:
Dominic Hamon 2016-02-13 13:04:57 -08:00
commit 1c4df750c4
2 changed files with 158 additions and 68 deletions

View File

@ -1,6 +1,14 @@
cmake_minimum_required (VERSION 2.8.11) cmake_minimum_required (VERSION 2.8.11)
project (benchmark) 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_TESTING "Enable testing of the benchmark library." ON)
option(BENCHMARK_ENABLE_LTO "Enable link time optimisation of the benchmark library." OFF) option(BENCHMARK_ENABLE_LTO "Enable link time optimisation of the benchmark library." OFF)
# Make sure we can import out CMake functions # Make sure we can import out CMake functions
@ -23,73 +31,83 @@ include(CheckCXXCompilerFlag)
include(AddCXXCompilerFlag) include(AddCXXCompilerFlag)
include(CXXFeatureCheck) include(CXXFeatureCheck)
# Try and enable C++11. Don't use C++14 because it doesn't work in some if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
# configurations. # Turn compiler warnings up to 11
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")
add_cxx_compiler_flag(-W4) add_cxx_compiler_flag(-W4)
add_definitions(-D_CRT_SECURE_NO_WARNINGS) 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()
# Link time optimisation # Link time optimisation
if (BENCHMARK_ENABLE_LTO) if (BENCHMARK_ENABLE_LTO)
add_cxx_compiler_flag(-flto) set(CMAKE_CXX_FLAGS_RELEASE "/GL")
if ("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "/LTCG")
find_program(GCC_AR gcc-ar) set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "/LTCG")
if (GCC_AR) set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
set(CMAKE_AR ${GCC_AR}) endif()
endif() else()
find_program(GCC_RANLIB gcc-ranlib) # Try and enable C++11. Don't use C++14 because it doesn't work in some
if (GCC_RANLIB) # configurations.
set(CMAKE_RANLIB ${GCC_RANLIB}) 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() endif()
endif()
# Coverage build type # Coverage build type
set(CMAKE_CXX_FLAGS_COVERAGE "${CMAKE_CXX_FLAGS_DEBUG}" CACHE STRING set(CMAKE_CXX_FLAGS_COVERAGE "${CMAKE_CXX_FLAGS_DEBUG}" CACHE STRING
"Flags used by the C++ compiler during coverage builds." "Flags used by the C++ compiler during coverage builds."
FORCE) FORCE)
set(CMAKE_EXE_LINKER_FLAGS_COVERAGE set(CMAKE_EXE_LINKER_FLAGS_COVERAGE
"${CMAKE_EXE_LINKER_FLAGS_DEBUG}" CACHE STRING "${CMAKE_EXE_LINKER_FLAGS_DEBUG}" CACHE STRING
"Flags used for linking binaries during coverage builds." "Flags used for linking binaries during coverage builds."
FORCE) FORCE)
set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE
"${CMAKE_SHARED_LINKER_FLAGS_DEBUG}" CACHE STRING "${CMAKE_SHARED_LINKER_FLAGS_DEBUG}" CACHE STRING
"Flags used by the shared libraries linker during coverage builds." "Flags used by the shared libraries linker during coverage builds."
FORCE) FORCE)
mark_as_advanced( mark_as_advanced(
CMAKE_CXX_FLAGS_COVERAGE CMAKE_CXX_FLAGS_COVERAGE
CMAKE_EXE_LINKER_FLAGS_COVERAGE CMAKE_EXE_LINKER_FLAGS_COVERAGE
CMAKE_SHARED_LINKER_FLAGS_COVERAGE) CMAKE_SHARED_LINKER_FLAGS_COVERAGE)
set(CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING set(CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING
"Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel Coverage." "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel Coverage."
FORCE) FORCE)
add_cxx_compiler_flag(--coverage COVERAGE) add_cxx_compiler_flag(--coverage COVERAGE)
endif()
# C++ feature checks # C++ feature checks
cxx_feature_check(STD_REGEX) cxx_feature_check(STD_REGEX)

View File

@ -12,9 +12,16 @@ platform:
environment: environment:
matrix: matrix:
- compiler: msvc-12-seh
- compiler: msvc-14-seh
- compiler: gcc-4.9.2-posix - compiler: gcc-4.9.2-posix
# - compiler: gcc-4.8.4-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: install:
# derive some extra information # derive some extra information
@ -35,18 +42,83 @@ before_build:
- if "%compiler_name%"=="gcc" (set "build=mingw32-make -j4") - if "%compiler_name%"=="gcc" (set "build=mingw32-make -j4")
- if "%compiler_name%"=="gcc" (set "test=mingw32-make CTEST_OUTPUT_ON_FAILURE=1 test") - if "%compiler_name%"=="gcc" (set "test=mingw32-make CTEST_OUTPUT_ON_FAILURE=1 test")
# msvc specific commands # 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 # add the compiler path if needed
- if not "%compiler_path%"=="" (set "PATH=%PATH%;%compiler_path%") - if not "%compiler_path%"=="" (set "PATH=%PATH%;%compiler_path%")
# git bash conflicts with MinGW makefiles # 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: build_script:
- cmake -G "%generator%" "-DCMAKE_BUILD_TYPE=%variant%" "-DBUILD_SHARED_LIBS=%shared%" - ps: |
- cmd /c "%build%" 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: 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: matrix:
fast_finish: true fast_finish: true