1cmake_minimum_required (VERSION 2.8.12) 2 3project (benchmark) 4 5foreach(p 6 CMP0054 # CMake 3.1 7 CMP0056 # export EXE_LINKER_FLAGS to try_run 8 ) 9 if(POLICY ${p}) 10 cmake_policy(SET ${p} NEW) 11 endif() 12endforeach() 13 14option(BENCHMARK_ENABLE_TESTING "Enable testing of the benchmark library." ON) 15option(BENCHMARK_ENABLE_EXCEPTIONS "Enable the use of exceptions in the benchmark library." ON) 16option(BENCHMARK_ENABLE_LTO "Enable link time optimisation of the benchmark library." OFF) 17option(BENCHMARK_USE_LIBCXX "Build and test using libc++ as the standard library." OFF) 18option(BENCHMARK_BUILD_32_BITS "Build a 32 bit version of the library" OFF) 19 20# Make sure we can import out CMake functions 21list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") 22 23# Read the git tags to determine the project version 24include(GetGitVersion) 25get_git_version(GIT_VERSION) 26 27# Tell the user what versions we are using 28string(REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+" VERSION ${GIT_VERSION}) 29message("-- Version: ${VERSION}") 30 31# The version of the libraries 32set(GENERIC_LIB_VERSION ${VERSION}) 33string(SUBSTRING ${VERSION} 0 1 GENERIC_LIB_SOVERSION) 34 35# Import our CMake modules 36include(CheckCXXCompilerFlag) 37include(AddCXXCompilerFlag) 38include(CXXFeatureCheck) 39 40if (BENCHMARK_BUILD_32_BITS) 41 add_required_cxx_compiler_flag(-m32) 42endif() 43 44if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") 45 # Turn compiler warnings up to 11 46 string(REGEX REPLACE "[-/]W[1-4]" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") 47 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4") 48 add_definitions(-D_CRT_SECURE_NO_WARNINGS) 49 50 if (NOT BENCHMARK_ENABLE_EXCEPTIONS) 51 add_cxx_compiler_flag(-EHs-) 52 add_cxx_compiler_flag(-EHa-) 53 endif() 54 # Link time optimisation 55 if (BENCHMARK_ENABLE_LTO) 56 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /GL") 57 set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "${CMAKE_STATIC_LINKER_FLAGS_RELEASE} /LTCG") 58 set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /LTCG") 59 set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG") 60 61 set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /GL") 62 string(REGEX REPLACE "[-/]INCREMENTAL" "/INCREMENTAL:NO" CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO}") 63 set(CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO} /LTCG") 64 string(REGEX REPLACE "[-/]INCREMENTAL" "/INCREMENTAL:NO" CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO}") 65 set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO} /LTCG") 66 string(REGEX REPLACE "[-/]INCREMENTAL" "/INCREMENTAL:NO" CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO}") 67 set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO} /LTCG") 68 69 set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} /GL") 70 set(CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL "${CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL} /LTCG") 71 set(CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL "${CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL} /LTCG") 72 set(CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "${CMAKE_EXE_LINKER_FLAGS_MINSIZEREL} /LTCG") 73 endif() 74else() 75 # Try and enable C++11. Don't use C++14 because it doesn't work in some 76 # configurations. 77 add_cxx_compiler_flag(-std=c++11) 78 if (NOT HAVE_CXX_FLAG_STD_CXX11) 79 add_cxx_compiler_flag(-std=c++0x) 80 endif() 81 82 # Turn compiler warnings up to 11 83 add_cxx_compiler_flag(-Wall) 84 85 add_cxx_compiler_flag(-Wextra) 86 add_cxx_compiler_flag(-Wshadow) 87 add_cxx_compiler_flag(-Werror RELEASE) 88 add_cxx_compiler_flag(-Werror RELWITHDEBINFO) 89 add_cxx_compiler_flag(-Werror MINSIZEREL) 90 add_cxx_compiler_flag(-pedantic) 91 add_cxx_compiler_flag(-pedantic-errors) 92 add_cxx_compiler_flag(-Wshorten-64-to-32) 93 add_cxx_compiler_flag(-Wfloat-equal) 94 add_cxx_compiler_flag(-fstrict-aliasing) 95 if (NOT BENCHMARK_ENABLE_EXCEPTIONS) 96 add_cxx_compiler_flag(-fno-exceptions) 97 endif() 98 if (NOT BENCHMARK_USE_LIBCXX) 99 add_cxx_compiler_flag(-Wzero-as-null-pointer-constant) 100 endif() 101 if (HAVE_CXX_FLAG_FSTRICT_ALIASING) 102 if (NOT CMAKE_CXX_COMPILER_ID STREQUAL "Intel") #ICC17u2: Many false positives for Wstrict-aliasing 103 add_cxx_compiler_flag(-Wstrict-aliasing) 104 endif() 105 endif() 106 # ICC17u2: overloaded virtual function "benchmark::Fixture::SetUp" is only partially overridden 107 # (because of deprecated overload) 108 add_cxx_compiler_flag(-wd654) 109 add_cxx_compiler_flag(-Wthread-safety) 110 if (HAVE_CXX_FLAG_WTHREAD_SAFETY) 111 cxx_feature_check(THREAD_SAFETY_ATTRIBUTES) 112 endif() 113 114 # On most UNIX like platforms g++ and clang++ define _GNU_SOURCE as a 115 # predefined macro, which turns on all of the wonderful libc extensions. 116 # However g++ doesn't do this in Cygwin so we have to define it ourselfs 117 # since we depend on GNU/POSIX/BSD extensions. 118 if (CYGWIN) 119 add_definitions(-D_GNU_SOURCE=1) 120 endif() 121 122 # Link time optimisation 123 if (BENCHMARK_ENABLE_LTO) 124 add_cxx_compiler_flag(-flto) 125 if ("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") 126 find_program(GCC_AR gcc-ar) 127 if (GCC_AR) 128 set(CMAKE_AR ${GCC_AR}) 129 endif() 130 find_program(GCC_RANLIB gcc-ranlib) 131 if (GCC_RANLIB) 132 set(CMAKE_RANLIB ${GCC_RANLIB}) 133 endif() 134 endif() 135 endif() 136 137 # Coverage build type 138 set(CMAKE_CXX_FLAGS_COVERAGE "${CMAKE_CXX_FLAGS_DEBUG}" CACHE STRING 139 "Flags used by the C++ compiler during coverage builds." 140 FORCE) 141 set(CMAKE_EXE_LINKER_FLAGS_COVERAGE 142 "${CMAKE_EXE_LINKER_FLAGS_DEBUG}" CACHE STRING 143 "Flags used for linking binaries during coverage builds." 144 FORCE) 145 set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE 146 "${CMAKE_SHARED_LINKER_FLAGS_DEBUG}" CACHE STRING 147 "Flags used by the shared libraries linker during coverage builds." 148 FORCE) 149 mark_as_advanced( 150 CMAKE_CXX_FLAGS_COVERAGE 151 CMAKE_EXE_LINKER_FLAGS_COVERAGE 152 CMAKE_SHARED_LINKER_FLAGS_COVERAGE) 153 set(CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING 154 "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel Coverage." 155 FORCE) 156 add_cxx_compiler_flag(--coverage COVERAGE) 157endif() 158 159if (BENCHMARK_USE_LIBCXX) 160 if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") 161 add_cxx_compiler_flag(-stdlib=libc++) 162 elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR 163 "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel") 164 add_cxx_compiler_flag(-nostdinc++) 165 message("libc++ header path must be manually specified using CMAKE_CXX_FLAGS") 166 # Adding -nodefaultlibs directly to CMAKE_<TYPE>_LINKER_FLAGS will break 167 # configuration checks such as 'find_package(Threads)' 168 list(APPEND BENCHMARK_CXX_LINKER_FLAGS -nodefaultlibs) 169 # -lc++ cannot be added directly to CMAKE_<TYPE>_LINKER_FLAGS because 170 # linker flags appear before all linker inputs and -lc++ must appear after. 171 list(APPEND BENCHMARK_CXX_LIBRARIES c++) 172 else() 173 message(FATAL "-DBENCHMARK_USE_LIBCXX:BOOL=ON is not supported for compiler") 174 endif() 175endif(BENCHMARK_USE_LIBCXX) 176 177# C++ feature checks 178# Determine the correct regular expression engine to use 179cxx_feature_check(STD_REGEX) 180cxx_feature_check(GNU_POSIX_REGEX) 181cxx_feature_check(POSIX_REGEX) 182if(NOT HAVE_STD_REGEX AND NOT HAVE_GNU_POSIX_REGEX AND NOT HAVE_POSIX_REGEX) 183 message(FATAL_ERROR "Failed to determine the source files for the regular expression backend") 184endif() 185if (NOT BENCHMARK_ENABLE_EXCEPTIONS AND HAVE_STD_REGEX 186 AND NOT HAVE_GNU_POSIX_REGEX AND NOT HAVE_POSIX_REGEX) 187 message(WARNING "Using std::regex with exceptions disabled is not fully supported") 188endif() 189cxx_feature_check(STEADY_CLOCK) 190# Ensure we have pthreads 191find_package(Threads REQUIRED) 192 193# Set up directories 194include_directories(${PROJECT_SOURCE_DIR}/include) 195 196# Build the targets 197add_subdirectory(src) 198 199if (BENCHMARK_ENABLE_TESTING) 200 enable_testing() 201 add_subdirectory(test) 202endif() 203