aboutsummaryrefslogtreecommitdiff
path: root/utils/google-benchmark/cmake
diff options
context:
space:
mode:
Diffstat (limited to 'utils/google-benchmark/cmake')
-rw-r--r--utils/google-benchmark/cmake/AddCXXCompilerFlag.cmake12
-rw-r--r--utils/google-benchmark/cmake/CXXFeatureCheck.cmake34
-rw-r--r--utils/google-benchmark/cmake/GetGitVersion.cmake3
-rw-r--r--utils/google-benchmark/cmake/HandleGTest.cmake113
-rw-r--r--utils/google-benchmark/cmake/benchmark.pc.in11
-rw-r--r--utils/google-benchmark/cmake/llvm-toolchain.cmake8
-rw-r--r--utils/google-benchmark/cmake/split_list.cmake3
7 files changed, 176 insertions, 8 deletions
diff --git a/utils/google-benchmark/cmake/AddCXXCompilerFlag.cmake b/utils/google-benchmark/cmake/AddCXXCompilerFlag.cmake
index 0b176ba27f1f..d0d209981440 100644
--- a/utils/google-benchmark/cmake/AddCXXCompilerFlag.cmake
+++ b/utils/google-benchmark/cmake/AddCXXCompilerFlag.cmake
@@ -38,7 +38,7 @@ function(add_cxx_compiler_flag FLAG)
if(ARGV1)
string(TOUPPER "_${VARIANT}" VARIANT)
endif()
- set(CMAKE_CXX_FLAGS${VARIANT} "${CMAKE_CXX_FLAGS${VARIANT}} ${FLAG}" PARENT_SCOPE)
+ set(CMAKE_CXX_FLAGS${VARIANT} "${CMAKE_CXX_FLAGS${VARIANT}} ${BENCHMARK_CXX_FLAGS${VARIANT}} ${FLAG}" PARENT_SCOPE)
endif()
endfunction()
@@ -62,3 +62,13 @@ function(add_required_cxx_compiler_flag FLAG)
message(FATAL_ERROR "Required flag '${FLAG}' is not supported by the compiler")
endif()
endfunction()
+
+function(check_cxx_warning_flag FLAG)
+ mangle_compiler_flag("${FLAG}" MANGLED_FLAG)
+ set(OLD_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
+ # Add -Werror to ensure the compiler generates an error if the warning flag
+ # doesn't exist.
+ set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Werror ${FLAG}")
+ check_cxx_compiler_flag("${FLAG}" ${MANGLED_FLAG})
+ set(CMAKE_REQUIRED_FLAGS "${OLD_CMAKE_REQUIRED_FLAGS}")
+endfunction()
diff --git a/utils/google-benchmark/cmake/CXXFeatureCheck.cmake b/utils/google-benchmark/cmake/CXXFeatureCheck.cmake
index 6efe6a84ee49..c4c4d660f1eb 100644
--- a/utils/google-benchmark/cmake/CXXFeatureCheck.cmake
+++ b/utils/google-benchmark/cmake/CXXFeatureCheck.cmake
@@ -22,16 +22,37 @@ function(cxx_feature_check FILE)
string(TOUPPER ${FILE} VAR)
string(TOUPPER "HAVE_${VAR}" FEATURE)
if (DEFINED HAVE_${VAR})
+ set(HAVE_${VAR} 1 PARENT_SCOPE)
+ add_definitions(-DHAVE_${VAR})
return()
endif()
- message("-- Performing Test ${FEATURE}")
- try_run(RUN_${FEATURE} COMPILE_${FEATURE}
- ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp
- CMAKE_FLAGS ${BENCHMARK_CXX_LINKER_FLAGS}
- LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES})
+
+ if (NOT DEFINED COMPILE_${FEATURE})
+ message("-- Performing Test ${FEATURE}")
+ if(CMAKE_CROSSCOMPILING)
+ try_compile(COMPILE_${FEATURE}
+ ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp
+ CMAKE_FLAGS ${BENCHMARK_CXX_LINKER_FLAGS}
+ LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES})
+ if(COMPILE_${FEATURE})
+ message(WARNING
+ "If you see build failures due to cross compilation, try setting HAVE_${VAR} to 0")
+ set(RUN_${FEATURE} 0)
+ else()
+ set(RUN_${FEATURE} 1)
+ endif()
+ else()
+ message("-- Performing Test ${FEATURE}")
+ try_run(RUN_${FEATURE} COMPILE_${FEATURE}
+ ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp
+ CMAKE_FLAGS ${BENCHMARK_CXX_LINKER_FLAGS}
+ LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES})
+ endif()
+ endif()
+
if(RUN_${FEATURE} EQUAL 0)
message("-- Performing Test ${FEATURE} -- success")
- set(HAVE_${VAR} 1 CACHE INTERNAL "Feature test for ${FILE}" PARENT_SCOPE)
+ set(HAVE_${VAR} 1 PARENT_SCOPE)
add_definitions(-DHAVE_${VAR})
else()
if(NOT COMPILE_${FEATURE})
@@ -41,4 +62,3 @@ function(cxx_feature_check FILE)
endif()
endif()
endfunction()
-
diff --git a/utils/google-benchmark/cmake/GetGitVersion.cmake b/utils/google-benchmark/cmake/GetGitVersion.cmake
index 8dd948004597..88cebe3a1caa 100644
--- a/utils/google-benchmark/cmake/GetGitVersion.cmake
+++ b/utils/google-benchmark/cmake/GetGitVersion.cmake
@@ -21,6 +21,7 @@ set(__get_git_version INCLUDED)
function(get_git_version var)
if(GIT_EXECUTABLE)
execute_process(COMMAND ${GIT_EXECUTABLE} describe --match "v[0-9]*.[0-9]*.[0-9]*" --abbrev=8
+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
RESULT_VARIABLE status
OUTPUT_VARIABLE GIT_VERSION
ERROR_QUIET)
@@ -33,9 +34,11 @@ function(get_git_version var)
# Work out if the repository is dirty
execute_process(COMMAND ${GIT_EXECUTABLE} update-index -q --refresh
+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
OUTPUT_QUIET
ERROR_QUIET)
execute_process(COMMAND ${GIT_EXECUTABLE} diff-index --name-only HEAD --
+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
OUTPUT_VARIABLE GIT_DIFF_INDEX
ERROR_QUIET)
string(COMPARE NOTEQUAL "${GIT_DIFF_INDEX}" "" GIT_DIRTY)
diff --git a/utils/google-benchmark/cmake/HandleGTest.cmake b/utils/google-benchmark/cmake/HandleGTest.cmake
new file mode 100644
index 000000000000..7ce1a633d65a
--- /dev/null
+++ b/utils/google-benchmark/cmake/HandleGTest.cmake
@@ -0,0 +1,113 @@
+
+include(split_list)
+
+macro(build_external_gtest)
+ include(ExternalProject)
+ set(GTEST_FLAGS "")
+ if (BENCHMARK_USE_LIBCXX)
+ if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
+ list(APPEND GTEST_FLAGS -stdlib=libc++)
+ else()
+ message(WARNING "Unsupported compiler (${CMAKE_CXX_COMPILER}) when using libc++")
+ endif()
+ endif()
+ if (BENCHMARK_BUILD_32_BITS)
+ list(APPEND GTEST_FLAGS -m32)
+ endif()
+ if (NOT "${CMAKE_CXX_FLAGS}" STREQUAL "")
+ list(APPEND GTEST_FLAGS ${CMAKE_CXX_FLAGS})
+ endif()
+ string(TOUPPER "${CMAKE_BUILD_TYPE}" GTEST_BUILD_TYPE)
+ if ("${GTEST_BUILD_TYPE}" STREQUAL "COVERAGE")
+ set(GTEST_BUILD_TYPE "DEBUG")
+ endif()
+ # FIXME: Since 10/Feb/2017 the googletest trunk has had a bug where
+ # -Werror=unused-function fires during the build on OS X. This is a temporary
+ # workaround to keep our travis bots from failing. It should be removed
+ # once gtest is fixed.
+ if (NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
+ list(APPEND GTEST_FLAGS "-Wno-unused-function")
+ endif()
+ split_list(GTEST_FLAGS)
+ set(EXCLUDE_FROM_ALL_OPT "")
+ set(EXCLUDE_FROM_ALL_VALUE "")
+ if (${CMAKE_VERSION} VERSION_GREATER "3.0.99")
+ set(EXCLUDE_FROM_ALL_OPT "EXCLUDE_FROM_ALL")
+ set(EXCLUDE_FROM_ALL_VALUE "ON")
+ endif()
+ ExternalProject_Add(googletest
+ ${EXCLUDE_FROM_ALL_OPT} ${EXCLUDE_FROM_ALL_VALUE}
+ GIT_REPOSITORY https://github.com/google/googletest.git
+ GIT_TAG master
+ PREFIX "${CMAKE_BINARY_DIR}/googletest"
+ INSTALL_DIR "${CMAKE_BINARY_DIR}/googletest"
+ CMAKE_CACHE_ARGS
+ -DCMAKE_BUILD_TYPE:STRING=${GTEST_BUILD_TYPE}
+ -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER}
+ -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER}
+ -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
+ -DCMAKE_INSTALL_LIBDIR:PATH=<INSTALL_DIR>/lib
+ -DCMAKE_CXX_FLAGS:STRING=${GTEST_FLAGS}
+ -Dgtest_force_shared_crt:BOOL=ON
+ )
+
+ ExternalProject_Get_Property(googletest install_dir)
+ set(GTEST_INCLUDE_DIRS ${install_dir}/include)
+ file(MAKE_DIRECTORY ${GTEST_INCLUDE_DIRS})
+
+ set(LIB_SUFFIX "${CMAKE_STATIC_LIBRARY_SUFFIX}")
+ set(LIB_PREFIX "${CMAKE_STATIC_LIBRARY_PREFIX}")
+ if("${GTEST_BUILD_TYPE}" STREQUAL "DEBUG")
+ set(LIB_SUFFIX "d${CMAKE_STATIC_LIBRARY_SUFFIX}")
+ endif()
+
+ # Use gmock_main instead of gtest_main because it initializes gtest as well.
+ # Note: The libraries are listed in reverse order of their dependancies.
+ foreach(LIB gtest gmock gmock_main)
+ add_library(${LIB} UNKNOWN IMPORTED)
+ set_target_properties(${LIB} PROPERTIES
+ IMPORTED_LOCATION ${install_dir}/lib/${LIB_PREFIX}${LIB}${LIB_SUFFIX}
+ INTERFACE_INCLUDE_DIRECTORIES ${GTEST_INCLUDE_DIRS}
+ INTERFACE_LINK_LIBRARIES "${GTEST_BOTH_LIBRARIES}"
+ )
+ add_dependencies(${LIB} googletest)
+ list(APPEND GTEST_BOTH_LIBRARIES ${LIB})
+ endforeach()
+endmacro(build_external_gtest)
+
+if (BENCHMARK_ENABLE_GTEST_TESTS)
+ if (IS_DIRECTORY ${CMAKE_SOURCE_DIR}/googletest)
+ set(GTEST_ROOT "${CMAKE_SOURCE_DIR}/googletest")
+ set(INSTALL_GTEST OFF CACHE INTERNAL "")
+ set(INSTALL_GMOCK OFF CACHE INTERNAL "")
+ add_subdirectory(${CMAKE_SOURCE_DIR}/googletest)
+ set(GTEST_BOTH_LIBRARIES gtest gmock gmock_main)
+ foreach(HEADER test mock)
+ # CMake 2.8 and older don't respect INTERFACE_INCLUDE_DIRECTORIES, so we
+ # have to add the paths ourselves.
+ set(HFILE g${HEADER}/g${HEADER}.h)
+ set(HPATH ${GTEST_ROOT}/google${HEADER}/include)
+ find_path(HEADER_PATH_${HEADER} ${HFILE}
+ NO_DEFAULT_PATHS
+ HINTS ${HPATH}
+ )
+ if (NOT HEADER_PATH_${HEADER})
+ message(FATAL_ERROR "Failed to find header ${HFILE} in ${HPATH}")
+ endif()
+ list(APPEND GTEST_INCLUDE_DIRS ${HEADER_PATH_${HEADER}})
+ endforeach()
+ elseif(BENCHMARK_DOWNLOAD_DEPENDENCIES)
+ build_external_gtest()
+ else()
+ find_package(GTest REQUIRED)
+ find_path(GMOCK_INCLUDE_DIRS gmock/gmock.h
+ HINTS ${GTEST_INCLUDE_DIRS})
+ if (NOT GMOCK_INCLUDE_DIRS)
+ message(FATAL_ERROR "Failed to find header gmock/gmock.h with hint ${GTEST_INCLUDE_DIRS}")
+ endif()
+ set(GTEST_INCLUDE_DIRS ${GTEST_INCLUDE_DIRS} ${GMOCK_INCLUDE_DIRS})
+ # FIXME: We don't currently require the gmock library to build the tests,
+ # and it's likely we won't find it, so we don't try. As long as we've
+ # found the gmock/gmock.h header and gtest_main that should be good enough.
+ endif()
+endif()
diff --git a/utils/google-benchmark/cmake/benchmark.pc.in b/utils/google-benchmark/cmake/benchmark.pc.in
new file mode 100644
index 000000000000..1e84bff68d81
--- /dev/null
+++ b/utils/google-benchmark/cmake/benchmark.pc.in
@@ -0,0 +1,11 @@
+prefix=@CMAKE_INSTALL_PREFIX@
+exec_prefix=${prefix}
+libdir=${prefix}/lib
+includedir=${prefix}/include
+
+Name: @PROJECT_NAME@
+Description: Google microbenchmark framework
+Version: @VERSION@
+
+Libs: -L${libdir} -lbenchmark
+Cflags: -I${includedir}
diff --git a/utils/google-benchmark/cmake/llvm-toolchain.cmake b/utils/google-benchmark/cmake/llvm-toolchain.cmake
new file mode 100644
index 000000000000..fc119e52fd26
--- /dev/null
+++ b/utils/google-benchmark/cmake/llvm-toolchain.cmake
@@ -0,0 +1,8 @@
+find_package(LLVMAr REQUIRED)
+set(CMAKE_AR "${LLVMAR_EXECUTABLE}" CACHE FILEPATH "" FORCE)
+
+find_package(LLVMNm REQUIRED)
+set(CMAKE_NM "${LLVMNM_EXECUTABLE}" CACHE FILEPATH "" FORCE)
+
+find_package(LLVMRanLib REQUIRED)
+set(CMAKE_RANLIB "${LLVMRANLIB_EXECUTABLE}" CACHE FILEPATH "" FORCE)
diff --git a/utils/google-benchmark/cmake/split_list.cmake b/utils/google-benchmark/cmake/split_list.cmake
new file mode 100644
index 000000000000..67aed3fdc857
--- /dev/null
+++ b/utils/google-benchmark/cmake/split_list.cmake
@@ -0,0 +1,3 @@
+macro(split_list listname)
+ string(REPLACE ";" " " ${listname} "${${listname}}")
+endmacro()