1*dbb99499SAndroid Build Coastguard Worker# Require CMake 3.10. If available, use the policies up to CMake 3.22. 2*dbb99499SAndroid Build Coastguard Workercmake_minimum_required (VERSION 3.10...3.22) 3*dbb99499SAndroid Build Coastguard Worker 4*dbb99499SAndroid Build Coastguard Workerproject (benchmark VERSION 1.9.0 LANGUAGES CXX) 5*dbb99499SAndroid Build Coastguard Worker 6*dbb99499SAndroid Build Coastguard Workeroption(BENCHMARK_ENABLE_TESTING "Enable testing of the benchmark library." ON) 7*dbb99499SAndroid Build Coastguard Workeroption(BENCHMARK_ENABLE_EXCEPTIONS "Enable the use of exceptions in the benchmark library." ON) 8*dbb99499SAndroid Build Coastguard Workeroption(BENCHMARK_ENABLE_LTO "Enable link time optimisation of the benchmark library." OFF) 9*dbb99499SAndroid Build Coastguard Workeroption(BENCHMARK_USE_LIBCXX "Build and test using libc++ as the standard library." OFF) 10*dbb99499SAndroid Build Coastguard Workeroption(BENCHMARK_ENABLE_WERROR "Build Release candidates with -Werror." ON) 11*dbb99499SAndroid Build Coastguard Workeroption(BENCHMARK_FORCE_WERROR "Build Release candidates with -Werror regardless of compiler issues." OFF) 12*dbb99499SAndroid Build Coastguard Worker 13*dbb99499SAndroid Build Coastguard Workerif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "PGI") 14*dbb99499SAndroid Build Coastguard Worker # PGC++ maybe reporting false positives. 15*dbb99499SAndroid Build Coastguard Worker set(BENCHMARK_ENABLE_WERROR OFF) 16*dbb99499SAndroid Build Coastguard Workerendif() 17*dbb99499SAndroid Build Coastguard Workerif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "NVHPC") 18*dbb99499SAndroid Build Coastguard Worker set(BENCHMARK_ENABLE_WERROR OFF) 19*dbb99499SAndroid Build Coastguard Workerendif() 20*dbb99499SAndroid Build Coastguard Workerif(BENCHMARK_FORCE_WERROR) 21*dbb99499SAndroid Build Coastguard Worker set(BENCHMARK_ENABLE_WERROR ON) 22*dbb99499SAndroid Build Coastguard Workerendif(BENCHMARK_FORCE_WERROR) 23*dbb99499SAndroid Build Coastguard Worker 24*dbb99499SAndroid Build Coastguard Workerif(NOT (MSVC OR CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC")) 25*dbb99499SAndroid Build Coastguard Worker option(BENCHMARK_BUILD_32_BITS "Build a 32 bit version of the library." OFF) 26*dbb99499SAndroid Build Coastguard Workerelse() 27*dbb99499SAndroid Build Coastguard Worker set(BENCHMARK_BUILD_32_BITS OFF CACHE BOOL "Build a 32 bit version of the library - unsupported when using MSVC)" FORCE) 28*dbb99499SAndroid Build Coastguard Workerendif() 29*dbb99499SAndroid Build Coastguard Workeroption(BENCHMARK_ENABLE_INSTALL "Enable installation of benchmark. (Projects embedding benchmark may want to turn this OFF.)" ON) 30*dbb99499SAndroid Build Coastguard Workeroption(BENCHMARK_ENABLE_DOXYGEN "Build documentation with Doxygen." OFF) 31*dbb99499SAndroid Build Coastguard Workeroption(BENCHMARK_INSTALL_DOCS "Enable installation of documentation." ON) 32*dbb99499SAndroid Build Coastguard Worker 33*dbb99499SAndroid Build Coastguard Worker# Allow unmet dependencies to be met using CMake's ExternalProject mechanics, which 34*dbb99499SAndroid Build Coastguard Worker# may require downloading the source code. 35*dbb99499SAndroid Build Coastguard Workeroption(BENCHMARK_DOWNLOAD_DEPENDENCIES "Allow the downloading and in-tree building of unmet dependencies" OFF) 36*dbb99499SAndroid Build Coastguard Worker 37*dbb99499SAndroid Build Coastguard Worker# This option can be used to disable building and running unit tests which depend on gtest 38*dbb99499SAndroid Build Coastguard Worker# in cases where it is not possible to build or find a valid version of gtest. 39*dbb99499SAndroid Build Coastguard Workeroption(BENCHMARK_ENABLE_GTEST_TESTS "Enable building the unit tests which depend on gtest" ON) 40*dbb99499SAndroid Build Coastguard Workeroption(BENCHMARK_USE_BUNDLED_GTEST "Use bundled GoogleTest. If disabled, the find_package(GTest) will be used." ON) 41*dbb99499SAndroid Build Coastguard Worker 42*dbb99499SAndroid Build Coastguard Workeroption(BENCHMARK_ENABLE_LIBPFM "Enable performance counters provided by libpfm" OFF) 43*dbb99499SAndroid Build Coastguard Worker 44*dbb99499SAndroid Build Coastguard Worker# Export only public symbols 45*dbb99499SAndroid Build Coastguard Workerset(CMAKE_CXX_VISIBILITY_PRESET hidden) 46*dbb99499SAndroid Build Coastguard Workerset(CMAKE_VISIBILITY_INLINES_HIDDEN ON) 47*dbb99499SAndroid Build Coastguard Worker 48*dbb99499SAndroid Build Coastguard Workerif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") 49*dbb99499SAndroid Build Coastguard Worker # As of CMake 3.18, CMAKE_SYSTEM_PROCESSOR is not set properly for MSVC and 50*dbb99499SAndroid Build Coastguard Worker # cross-compilation (e.g. Host=x86_64, target=aarch64) requires using the 51*dbb99499SAndroid Build Coastguard Worker # undocumented, but working variable. 52*dbb99499SAndroid Build Coastguard Worker # See https://gitlab.kitware.com/cmake/cmake/-/issues/15170 53*dbb99499SAndroid Build Coastguard Worker set(CMAKE_SYSTEM_PROCESSOR ${MSVC_CXX_ARCHITECTURE_ID}) 54*dbb99499SAndroid Build Coastguard Worker if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "ARM") 55*dbb99499SAndroid Build Coastguard Worker set(CMAKE_CROSSCOMPILING TRUE) 56*dbb99499SAndroid Build Coastguard Worker endif() 57*dbb99499SAndroid Build Coastguard Workerendif() 58*dbb99499SAndroid Build Coastguard Worker 59*dbb99499SAndroid Build Coastguard Workerset(ENABLE_ASSEMBLY_TESTS_DEFAULT OFF) 60*dbb99499SAndroid Build Coastguard Workerfunction(should_enable_assembly_tests) 61*dbb99499SAndroid Build Coastguard Worker if(CMAKE_BUILD_TYPE) 62*dbb99499SAndroid Build Coastguard Worker string(TOLOWER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_LOWER) 63*dbb99499SAndroid Build Coastguard Worker if (${CMAKE_BUILD_TYPE_LOWER} MATCHES "coverage") 64*dbb99499SAndroid Build Coastguard Worker # FIXME: The --coverage flag needs to be removed when building assembly 65*dbb99499SAndroid Build Coastguard Worker # tests for this to work. 66*dbb99499SAndroid Build Coastguard Worker return() 67*dbb99499SAndroid Build Coastguard Worker endif() 68*dbb99499SAndroid Build Coastguard Worker endif() 69*dbb99499SAndroid Build Coastguard Worker if (MSVC OR CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC") 70*dbb99499SAndroid Build Coastguard Worker return() 71*dbb99499SAndroid Build Coastguard Worker elseif(NOT CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64") 72*dbb99499SAndroid Build Coastguard Worker return() 73*dbb99499SAndroid Build Coastguard Worker elseif(NOT CMAKE_SIZEOF_VOID_P EQUAL 8) 74*dbb99499SAndroid Build Coastguard Worker # FIXME: Make these work on 32 bit builds 75*dbb99499SAndroid Build Coastguard Worker return() 76*dbb99499SAndroid Build Coastguard Worker elseif(BENCHMARK_BUILD_32_BITS) 77*dbb99499SAndroid Build Coastguard Worker # FIXME: Make these work on 32 bit builds 78*dbb99499SAndroid Build Coastguard Worker return() 79*dbb99499SAndroid Build Coastguard Worker endif() 80*dbb99499SAndroid Build Coastguard Worker find_program(LLVM_FILECHECK_EXE FileCheck) 81*dbb99499SAndroid Build Coastguard Worker if (LLVM_FILECHECK_EXE) 82*dbb99499SAndroid Build Coastguard Worker set(LLVM_FILECHECK_EXE "${LLVM_FILECHECK_EXE}" CACHE PATH "llvm filecheck" FORCE) 83*dbb99499SAndroid Build Coastguard Worker message(STATUS "LLVM FileCheck Found: ${LLVM_FILECHECK_EXE}") 84*dbb99499SAndroid Build Coastguard Worker else() 85*dbb99499SAndroid Build Coastguard Worker message(STATUS "Failed to find LLVM FileCheck") 86*dbb99499SAndroid Build Coastguard Worker return() 87*dbb99499SAndroid Build Coastguard Worker endif() 88*dbb99499SAndroid Build Coastguard Worker set(ENABLE_ASSEMBLY_TESTS_DEFAULT ON PARENT_SCOPE) 89*dbb99499SAndroid Build Coastguard Workerendfunction() 90*dbb99499SAndroid Build Coastguard Workershould_enable_assembly_tests() 91*dbb99499SAndroid Build Coastguard Worker 92*dbb99499SAndroid Build Coastguard Worker# This option disables the building and running of the assembly verification tests 93*dbb99499SAndroid Build Coastguard Workeroption(BENCHMARK_ENABLE_ASSEMBLY_TESTS "Enable building and running the assembly tests" 94*dbb99499SAndroid Build Coastguard Worker ${ENABLE_ASSEMBLY_TESTS_DEFAULT}) 95*dbb99499SAndroid Build Coastguard Worker 96*dbb99499SAndroid Build Coastguard Worker# Make sure we can import out CMake functions 97*dbb99499SAndroid Build Coastguard Workerlist(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules") 98*dbb99499SAndroid Build Coastguard Workerlist(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") 99*dbb99499SAndroid Build Coastguard Worker 100*dbb99499SAndroid Build Coastguard Worker 101*dbb99499SAndroid Build Coastguard Worker# Read the git tags to determine the project version 102*dbb99499SAndroid Build Coastguard Workerinclude(GetGitVersion) 103*dbb99499SAndroid Build Coastguard Workerget_git_version(GIT_VERSION) 104*dbb99499SAndroid Build Coastguard Worker 105*dbb99499SAndroid Build Coastguard Worker# If no git version can be determined, use the version 106*dbb99499SAndroid Build Coastguard Worker# from the project() command 107*dbb99499SAndroid Build Coastguard Workerif ("${GIT_VERSION}" STREQUAL "v0.0.0") 108*dbb99499SAndroid Build Coastguard Worker set(VERSION "v${benchmark_VERSION}") 109*dbb99499SAndroid Build Coastguard Workerelse() 110*dbb99499SAndroid Build Coastguard Worker set(VERSION "${GIT_VERSION}") 111*dbb99499SAndroid Build Coastguard Workerendif() 112*dbb99499SAndroid Build Coastguard Worker 113*dbb99499SAndroid Build Coastguard Worker# Normalize version: drop "v" prefix, replace first "-" with ".", 114*dbb99499SAndroid Build Coastguard Worker# drop everything after second "-" (including said "-"). 115*dbb99499SAndroid Build Coastguard Workerstring(STRIP ${VERSION} VERSION) 116*dbb99499SAndroid Build Coastguard Workerif(VERSION MATCHES v[^-]*-) 117*dbb99499SAndroid Build Coastguard Worker string(REGEX REPLACE "v([^-]*)-([0-9]+)-.*" "\\1.\\2" NORMALIZED_VERSION ${VERSION}) 118*dbb99499SAndroid Build Coastguard Workerelse() 119*dbb99499SAndroid Build Coastguard Worker string(REGEX REPLACE "v(.*)" "\\1" NORMALIZED_VERSION ${VERSION}) 120*dbb99499SAndroid Build Coastguard Workerendif() 121*dbb99499SAndroid Build Coastguard Worker 122*dbb99499SAndroid Build Coastguard Worker# Tell the user what versions we are using 123*dbb99499SAndroid Build Coastguard Workermessage(STATUS "Google Benchmark version: ${VERSION}, normalized to ${NORMALIZED_VERSION}") 124*dbb99499SAndroid Build Coastguard Worker 125*dbb99499SAndroid Build Coastguard Worker# The version of the libraries 126*dbb99499SAndroid Build Coastguard Workerset(GENERIC_LIB_VERSION ${NORMALIZED_VERSION}) 127*dbb99499SAndroid Build Coastguard Workerstring(SUBSTRING ${NORMALIZED_VERSION} 0 1 GENERIC_LIB_SOVERSION) 128*dbb99499SAndroid Build Coastguard Worker 129*dbb99499SAndroid Build Coastguard Worker# Import our CMake modules 130*dbb99499SAndroid Build Coastguard Workerinclude(AddCXXCompilerFlag) 131*dbb99499SAndroid Build Coastguard Workerinclude(CheckCXXCompilerFlag) 132*dbb99499SAndroid Build Coastguard Workerinclude(CheckLibraryExists) 133*dbb99499SAndroid Build Coastguard Workerinclude(CXXFeatureCheck) 134*dbb99499SAndroid Build Coastguard Worker 135*dbb99499SAndroid Build Coastguard Workercheck_library_exists(rt shm_open "" HAVE_LIB_RT) 136*dbb99499SAndroid Build Coastguard Worker 137*dbb99499SAndroid Build Coastguard Workerif (BENCHMARK_BUILD_32_BITS) 138*dbb99499SAndroid Build Coastguard Worker add_required_cxx_compiler_flag(-m32) 139*dbb99499SAndroid Build Coastguard Workerendif() 140*dbb99499SAndroid Build Coastguard Worker 141*dbb99499SAndroid Build Coastguard Workerset(BENCHMARK_CXX_STANDARD 14) 142*dbb99499SAndroid Build Coastguard Worker 143*dbb99499SAndroid Build Coastguard Workerset(CMAKE_CXX_STANDARD ${BENCHMARK_CXX_STANDARD}) 144*dbb99499SAndroid Build Coastguard Workerset(CMAKE_CXX_STANDARD_REQUIRED YES) 145*dbb99499SAndroid Build Coastguard Workerset(CMAKE_CXX_EXTENSIONS OFF) 146*dbb99499SAndroid Build Coastguard Worker 147*dbb99499SAndroid Build Coastguard Workerif (MSVC) 148*dbb99499SAndroid Build Coastguard Worker # Turn compiler warnings up to 11 149*dbb99499SAndroid Build Coastguard Worker string(REGEX REPLACE "[-/]W[1-4]" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") 150*dbb99499SAndroid Build Coastguard Worker set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4") 151*dbb99499SAndroid Build Coastguard Worker add_definitions(-D_CRT_SECURE_NO_WARNINGS) 152*dbb99499SAndroid Build Coastguard Worker 153*dbb99499SAndroid Build Coastguard Worker if (NOT BENCHMARK_ENABLE_EXCEPTIONS) 154*dbb99499SAndroid Build Coastguard Worker add_cxx_compiler_flag(-EHs-) 155*dbb99499SAndroid Build Coastguard Worker add_cxx_compiler_flag(-EHa-) 156*dbb99499SAndroid Build Coastguard Worker add_definitions(-D_HAS_EXCEPTIONS=0) 157*dbb99499SAndroid Build Coastguard Worker endif() 158*dbb99499SAndroid Build Coastguard Worker # Link time optimisation 159*dbb99499SAndroid Build Coastguard Worker if (BENCHMARK_ENABLE_LTO) 160*dbb99499SAndroid Build Coastguard Worker set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /GL") 161*dbb99499SAndroid Build Coastguard Worker set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "${CMAKE_STATIC_LINKER_FLAGS_RELEASE} /LTCG") 162*dbb99499SAndroid Build Coastguard Worker set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /LTCG") 163*dbb99499SAndroid Build Coastguard Worker set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG") 164*dbb99499SAndroid Build Coastguard Worker 165*dbb99499SAndroid Build Coastguard Worker set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /GL") 166*dbb99499SAndroid Build Coastguard Worker string(REGEX REPLACE "[-/]INCREMENTAL" "/INCREMENTAL:NO" CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO}") 167*dbb99499SAndroid Build Coastguard Worker set(CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO} /LTCG") 168*dbb99499SAndroid Build Coastguard Worker string(REGEX REPLACE "[-/]INCREMENTAL" "/INCREMENTAL:NO" CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO}") 169*dbb99499SAndroid Build Coastguard Worker set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO} /LTCG") 170*dbb99499SAndroid Build Coastguard Worker string(REGEX REPLACE "[-/]INCREMENTAL" "/INCREMENTAL:NO" CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO}") 171*dbb99499SAndroid Build Coastguard Worker set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO} /LTCG") 172*dbb99499SAndroid Build Coastguard Worker 173*dbb99499SAndroid Build Coastguard Worker set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} /GL") 174*dbb99499SAndroid Build Coastguard Worker set(CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL "${CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL} /LTCG") 175*dbb99499SAndroid Build Coastguard Worker set(CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL "${CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL} /LTCG") 176*dbb99499SAndroid Build Coastguard Worker set(CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "${CMAKE_EXE_LINKER_FLAGS_MINSIZEREL} /LTCG") 177*dbb99499SAndroid Build Coastguard Worker endif() 178*dbb99499SAndroid Build Coastguard Workerelse() 179*dbb99499SAndroid Build Coastguard Worker # Turn on Large-file Support 180*dbb99499SAndroid Build Coastguard Worker add_definitions(-D_FILE_OFFSET_BITS=64) 181*dbb99499SAndroid Build Coastguard Worker add_definitions(-D_LARGEFILE64_SOURCE) 182*dbb99499SAndroid Build Coastguard Worker add_definitions(-D_LARGEFILE_SOURCE) 183*dbb99499SAndroid Build Coastguard Worker # Turn compiler warnings up to 11 184*dbb99499SAndroid Build Coastguard Worker add_cxx_compiler_flag(-Wall) 185*dbb99499SAndroid Build Coastguard Worker add_cxx_compiler_flag(-Wextra) 186*dbb99499SAndroid Build Coastguard Worker add_cxx_compiler_flag(-Wshadow) 187*dbb99499SAndroid Build Coastguard Worker add_cxx_compiler_flag(-Wfloat-equal) 188*dbb99499SAndroid Build Coastguard Worker add_cxx_compiler_flag(-Wold-style-cast) 189*dbb99499SAndroid Build Coastguard Worker add_cxx_compiler_flag(-Wconversion) 190*dbb99499SAndroid Build Coastguard Worker if(BENCHMARK_ENABLE_WERROR) 191*dbb99499SAndroid Build Coastguard Worker add_cxx_compiler_flag(-Werror) 192*dbb99499SAndroid Build Coastguard Worker endif() 193*dbb99499SAndroid Build Coastguard Worker if (NOT BENCHMARK_ENABLE_TESTING) 194*dbb99499SAndroid Build Coastguard Worker # Disable warning when compiling tests as gtest does not use 'override'. 195*dbb99499SAndroid Build Coastguard Worker add_cxx_compiler_flag(-Wsuggest-override) 196*dbb99499SAndroid Build Coastguard Worker endif() 197*dbb99499SAndroid Build Coastguard Worker add_cxx_compiler_flag(-pedantic) 198*dbb99499SAndroid Build Coastguard Worker add_cxx_compiler_flag(-pedantic-errors) 199*dbb99499SAndroid Build Coastguard Worker add_cxx_compiler_flag(-Wshorten-64-to-32) 200*dbb99499SAndroid Build Coastguard Worker add_cxx_compiler_flag(-fstrict-aliasing) 201*dbb99499SAndroid Build Coastguard Worker # Disable warnings regarding deprecated parts of the library while building 202*dbb99499SAndroid Build Coastguard Worker # and testing those parts of the library. 203*dbb99499SAndroid Build Coastguard Worker add_cxx_compiler_flag(-Wno-deprecated-declarations) 204*dbb99499SAndroid Build Coastguard Worker if (CMAKE_CXX_COMPILER_ID STREQUAL "Intel" OR CMAKE_CXX_COMPILER_ID STREQUAL "IntelLLVM") 205*dbb99499SAndroid Build Coastguard Worker # Intel silently ignores '-Wno-deprecated-declarations', 206*dbb99499SAndroid Build Coastguard Worker # warning no. 1786 must be explicitly disabled. 207*dbb99499SAndroid Build Coastguard Worker # See #631 for rationale. 208*dbb99499SAndroid Build Coastguard Worker add_cxx_compiler_flag(-wd1786) 209*dbb99499SAndroid Build Coastguard Worker add_cxx_compiler_flag(-fno-finite-math-only) 210*dbb99499SAndroid Build Coastguard Worker endif() 211*dbb99499SAndroid Build Coastguard Worker # Disable deprecation warnings for release builds (when -Werror is enabled). 212*dbb99499SAndroid Build Coastguard Worker if(BENCHMARK_ENABLE_WERROR) 213*dbb99499SAndroid Build Coastguard Worker add_cxx_compiler_flag(-Wno-deprecated) 214*dbb99499SAndroid Build Coastguard Worker endif() 215*dbb99499SAndroid Build Coastguard Worker if (NOT BENCHMARK_ENABLE_EXCEPTIONS) 216*dbb99499SAndroid Build Coastguard Worker add_cxx_compiler_flag(-fno-exceptions) 217*dbb99499SAndroid Build Coastguard Worker endif() 218*dbb99499SAndroid Build Coastguard Worker 219*dbb99499SAndroid Build Coastguard Worker if (HAVE_CXX_FLAG_FSTRICT_ALIASING) 220*dbb99499SAndroid Build Coastguard Worker if (NOT CMAKE_CXX_COMPILER_ID STREQUAL "Intel" AND NOT CMAKE_CXX_COMPILER_ID STREQUAL "IntelLLVM") #ICC17u2: Many false positives for Wstrict-aliasing 221*dbb99499SAndroid Build Coastguard Worker add_cxx_compiler_flag(-Wstrict-aliasing) 222*dbb99499SAndroid Build Coastguard Worker endif() 223*dbb99499SAndroid Build Coastguard Worker endif() 224*dbb99499SAndroid Build Coastguard Worker # ICC17u2: overloaded virtual function "benchmark::Fixture::SetUp" is only partially overridden 225*dbb99499SAndroid Build Coastguard Worker # (because of deprecated overload) 226*dbb99499SAndroid Build Coastguard Worker add_cxx_compiler_flag(-wd654) 227*dbb99499SAndroid Build Coastguard Worker add_cxx_compiler_flag(-Wthread-safety) 228*dbb99499SAndroid Build Coastguard Worker if (HAVE_CXX_FLAG_WTHREAD_SAFETY) 229*dbb99499SAndroid Build Coastguard Worker cxx_feature_check(THREAD_SAFETY_ATTRIBUTES "-DINCLUDE_DIRECTORIES=${PROJECT_SOURCE_DIR}/include") 230*dbb99499SAndroid Build Coastguard Worker endif() 231*dbb99499SAndroid Build Coastguard Worker 232*dbb99499SAndroid Build Coastguard Worker # On most UNIX like platforms g++ and clang++ define _GNU_SOURCE as a 233*dbb99499SAndroid Build Coastguard Worker # predefined macro, which turns on all of the wonderful libc extensions. 234*dbb99499SAndroid Build Coastguard Worker # However g++ doesn't do this in Cygwin so we have to define it ourselves 235*dbb99499SAndroid Build Coastguard Worker # since we depend on GNU/POSIX/BSD extensions. 236*dbb99499SAndroid Build Coastguard Worker if (CYGWIN) 237*dbb99499SAndroid Build Coastguard Worker add_definitions(-D_GNU_SOURCE=1) 238*dbb99499SAndroid Build Coastguard Worker endif() 239*dbb99499SAndroid Build Coastguard Worker 240*dbb99499SAndroid Build Coastguard Worker if (QNXNTO) 241*dbb99499SAndroid Build Coastguard Worker add_definitions(-D_QNX_SOURCE) 242*dbb99499SAndroid Build Coastguard Worker endif() 243*dbb99499SAndroid Build Coastguard Worker 244*dbb99499SAndroid Build Coastguard Worker # Link time optimisation 245*dbb99499SAndroid Build Coastguard Worker if (BENCHMARK_ENABLE_LTO) 246*dbb99499SAndroid Build Coastguard Worker add_cxx_compiler_flag(-flto) 247*dbb99499SAndroid Build Coastguard Worker add_cxx_compiler_flag(-Wno-lto-type-mismatch) 248*dbb99499SAndroid Build Coastguard Worker if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") 249*dbb99499SAndroid Build Coastguard Worker find_program(GCC_AR gcc-ar) 250*dbb99499SAndroid Build Coastguard Worker if (GCC_AR) 251*dbb99499SAndroid Build Coastguard Worker set(CMAKE_AR ${GCC_AR}) 252*dbb99499SAndroid Build Coastguard Worker endif() 253*dbb99499SAndroid Build Coastguard Worker find_program(GCC_RANLIB gcc-ranlib) 254*dbb99499SAndroid Build Coastguard Worker if (GCC_RANLIB) 255*dbb99499SAndroid Build Coastguard Worker set(CMAKE_RANLIB ${GCC_RANLIB}) 256*dbb99499SAndroid Build Coastguard Worker endif() 257*dbb99499SAndroid Build Coastguard Worker elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") 258*dbb99499SAndroid Build Coastguard Worker include(llvm-toolchain) 259*dbb99499SAndroid Build Coastguard Worker endif() 260*dbb99499SAndroid Build Coastguard Worker endif() 261*dbb99499SAndroid Build Coastguard Worker 262*dbb99499SAndroid Build Coastguard Worker # Coverage build type 263*dbb99499SAndroid Build Coastguard Worker set(BENCHMARK_CXX_FLAGS_COVERAGE "${CMAKE_CXX_FLAGS_DEBUG}" 264*dbb99499SAndroid Build Coastguard Worker CACHE STRING "Flags used by the C++ compiler during coverage builds." 265*dbb99499SAndroid Build Coastguard Worker FORCE) 266*dbb99499SAndroid Build Coastguard Worker set(BENCHMARK_EXE_LINKER_FLAGS_COVERAGE "${CMAKE_EXE_LINKER_FLAGS_DEBUG}" 267*dbb99499SAndroid Build Coastguard Worker CACHE STRING "Flags used for linking binaries during coverage builds." 268*dbb99499SAndroid Build Coastguard Worker FORCE) 269*dbb99499SAndroid Build Coastguard Worker set(BENCHMARK_SHARED_LINKER_FLAGS_COVERAGE "${CMAKE_SHARED_LINKER_FLAGS_DEBUG}" 270*dbb99499SAndroid Build Coastguard Worker CACHE STRING "Flags used by the shared libraries linker during coverage builds." 271*dbb99499SAndroid Build Coastguard Worker FORCE) 272*dbb99499SAndroid Build Coastguard Worker mark_as_advanced( 273*dbb99499SAndroid Build Coastguard Worker BENCHMARK_CXX_FLAGS_COVERAGE 274*dbb99499SAndroid Build Coastguard Worker BENCHMARK_EXE_LINKER_FLAGS_COVERAGE 275*dbb99499SAndroid Build Coastguard Worker BENCHMARK_SHARED_LINKER_FLAGS_COVERAGE) 276*dbb99499SAndroid Build Coastguard Worker set(CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING 277*dbb99499SAndroid Build Coastguard Worker "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel Coverage.") 278*dbb99499SAndroid Build Coastguard Worker add_cxx_compiler_flag(--coverage COVERAGE) 279*dbb99499SAndroid Build Coastguard Workerendif() 280*dbb99499SAndroid Build Coastguard Worker 281*dbb99499SAndroid Build Coastguard Workerif (BENCHMARK_USE_LIBCXX) 282*dbb99499SAndroid Build Coastguard Worker if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") 283*dbb99499SAndroid Build Coastguard Worker add_cxx_compiler_flag(-stdlib=libc++) 284*dbb99499SAndroid Build Coastguard Worker elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR 285*dbb99499SAndroid Build Coastguard Worker "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel" OR 286*dbb99499SAndroid Build Coastguard Worker "${CMAKE_CXX_COMPILER_ID}" STREQUAL "IntelLLVM") 287*dbb99499SAndroid Build Coastguard Worker add_cxx_compiler_flag(-nostdinc++) 288*dbb99499SAndroid Build Coastguard Worker message(WARNING "libc++ header path must be manually specified using CMAKE_CXX_FLAGS") 289*dbb99499SAndroid Build Coastguard Worker # Adding -nodefaultlibs directly to CMAKE_<TYPE>_LINKER_FLAGS will break 290*dbb99499SAndroid Build Coastguard Worker # configuration checks such as 'find_package(Threads)' 291*dbb99499SAndroid Build Coastguard Worker list(APPEND BENCHMARK_CXX_LINKER_FLAGS -nodefaultlibs) 292*dbb99499SAndroid Build Coastguard Worker # -lc++ cannot be added directly to CMAKE_<TYPE>_LINKER_FLAGS because 293*dbb99499SAndroid Build Coastguard Worker # linker flags appear before all linker inputs and -lc++ must appear after. 294*dbb99499SAndroid Build Coastguard Worker list(APPEND BENCHMARK_CXX_LIBRARIES c++) 295*dbb99499SAndroid Build Coastguard Worker else() 296*dbb99499SAndroid Build Coastguard Worker message(FATAL_ERROR "-DBENCHMARK_USE_LIBCXX:BOOL=ON is not supported for compiler") 297*dbb99499SAndroid Build Coastguard Worker endif() 298*dbb99499SAndroid Build Coastguard Workerendif(BENCHMARK_USE_LIBCXX) 299*dbb99499SAndroid Build Coastguard Worker 300*dbb99499SAndroid Build Coastguard Workerset(EXTRA_CXX_FLAGS "") 301*dbb99499SAndroid Build Coastguard Workerif (WIN32 AND "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") 302*dbb99499SAndroid Build Coastguard Worker # Clang on Windows fails to compile the regex feature check under C++11 303*dbb99499SAndroid Build Coastguard Worker set(EXTRA_CXX_FLAGS "-DCMAKE_CXX_STANDARD=14") 304*dbb99499SAndroid Build Coastguard Workerendif() 305*dbb99499SAndroid Build Coastguard Worker 306*dbb99499SAndroid Build Coastguard Worker# C++ feature checks 307*dbb99499SAndroid Build Coastguard Worker# Determine the correct regular expression engine to use 308*dbb99499SAndroid Build Coastguard Workercxx_feature_check(STD_REGEX ${EXTRA_CXX_FLAGS}) 309*dbb99499SAndroid Build Coastguard Workercxx_feature_check(GNU_POSIX_REGEX ${EXTRA_CXX_FLAGS}) 310*dbb99499SAndroid Build Coastguard Workercxx_feature_check(POSIX_REGEX ${EXTRA_CXX_FLAGS}) 311*dbb99499SAndroid Build Coastguard Workerif(NOT HAVE_STD_REGEX AND NOT HAVE_GNU_POSIX_REGEX AND NOT HAVE_POSIX_REGEX) 312*dbb99499SAndroid Build Coastguard Worker message(FATAL_ERROR "Failed to determine the source files for the regular expression backend") 313*dbb99499SAndroid Build Coastguard Workerendif() 314*dbb99499SAndroid Build Coastguard Workerif (NOT BENCHMARK_ENABLE_EXCEPTIONS AND HAVE_STD_REGEX 315*dbb99499SAndroid Build Coastguard Worker AND NOT HAVE_GNU_POSIX_REGEX AND NOT HAVE_POSIX_REGEX) 316*dbb99499SAndroid Build Coastguard Worker message(WARNING "Using std::regex with exceptions disabled is not fully supported") 317*dbb99499SAndroid Build Coastguard Workerendif() 318*dbb99499SAndroid Build Coastguard Worker 319*dbb99499SAndroid Build Coastguard Workercxx_feature_check(STEADY_CLOCK) 320*dbb99499SAndroid Build Coastguard Worker# Ensure we have pthreads 321*dbb99499SAndroid Build Coastguard Workerset(THREADS_PREFER_PTHREAD_FLAG ON) 322*dbb99499SAndroid Build Coastguard Workerfind_package(Threads REQUIRED) 323*dbb99499SAndroid Build Coastguard Workercxx_feature_check(PTHREAD_AFFINITY) 324*dbb99499SAndroid Build Coastguard Worker 325*dbb99499SAndroid Build Coastguard Workerif (BENCHMARK_ENABLE_LIBPFM) 326*dbb99499SAndroid Build Coastguard Worker find_package(PFM REQUIRED) 327*dbb99499SAndroid Build Coastguard Workerendif() 328*dbb99499SAndroid Build Coastguard Worker 329*dbb99499SAndroid Build Coastguard Worker# Set up directories 330*dbb99499SAndroid Build Coastguard Workerinclude_directories(${PROJECT_SOURCE_DIR}/include) 331*dbb99499SAndroid Build Coastguard Worker 332*dbb99499SAndroid Build Coastguard Worker# Build the targets 333*dbb99499SAndroid Build Coastguard Workeradd_subdirectory(src) 334*dbb99499SAndroid Build Coastguard Worker 335*dbb99499SAndroid Build Coastguard Workerif (BENCHMARK_ENABLE_TESTING) 336*dbb99499SAndroid Build Coastguard Worker enable_testing() 337*dbb99499SAndroid Build Coastguard Worker if (BENCHMARK_ENABLE_GTEST_TESTS AND 338*dbb99499SAndroid Build Coastguard Worker NOT (TARGET gtest AND TARGET gtest_main AND 339*dbb99499SAndroid Build Coastguard Worker TARGET gmock AND TARGET gmock_main)) 340*dbb99499SAndroid Build Coastguard Worker if (BENCHMARK_USE_BUNDLED_GTEST) 341*dbb99499SAndroid Build Coastguard Worker include(GoogleTest) 342*dbb99499SAndroid Build Coastguard Worker else() 343*dbb99499SAndroid Build Coastguard Worker find_package(GTest CONFIG REQUIRED) 344*dbb99499SAndroid Build Coastguard Worker add_library(gtest ALIAS GTest::gtest) 345*dbb99499SAndroid Build Coastguard Worker add_library(gtest_main ALIAS GTest::gtest_main) 346*dbb99499SAndroid Build Coastguard Worker add_library(gmock ALIAS GTest::gmock) 347*dbb99499SAndroid Build Coastguard Worker add_library(gmock_main ALIAS GTest::gmock_main) 348*dbb99499SAndroid Build Coastguard Worker endif() 349*dbb99499SAndroid Build Coastguard Worker endif() 350*dbb99499SAndroid Build Coastguard Worker add_subdirectory(test) 351*dbb99499SAndroid Build Coastguard Workerendif() 352