xref: /aosp_15_r20/external/google-benchmark/CMakeLists.txt (revision dbb99499c3810fa1611fa2242a2fc446be01a57c)
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