mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
0f55045526
This patch pulls google/benchmark v1.4.1 into the LLVM tree so that any project could use it for benchmark generation. A dummy benchmark is added to `llvm/benchmarks/DummyYAML.cpp` to validate the correctness of the build process. The current version does not utilize LLVM LNT and LLVM CMake infrastructure, but that might be sufficient for most users. Two introduced CMake variables: * `LLVM_INCLUDE_BENCHMARKS` (`ON` by default) generates benchmark targets * `LLVM_BUILD_BENCHMARKS` (`OFF` by default) adds generated benchmark targets to the list of default LLVM targets (i.e. if `ON` benchmarks will be built upon standard build invocation, e.g. `ninja` or `make` with no specific targets) List of modifications: * `BENCHMARK_ENABLE_TESTING` is disabled * `BENCHMARK_ENABLE_EXCEPTIONS` is disabled * `BENCHMARK_ENABLE_INSTALL` is disabled * `BENCHMARK_ENABLE_GTEST_TESTS` is disabled * `BENCHMARK_DOWNLOAD_DEPENDENCIES` is disabled Original discussion can be found here: http://lists.llvm.org/pipermail/llvm-dev/2018-August/125023.html Reviewed by: dberris, lebedev.ri Subscribers: ilya-biryukov, ioeric, EricWF, lebedev.ri, srhines, dschuff, mgorny, krytarowski, fedor.sergeev, mgrang, jfb, llvm-commits Differential Revision: https://reviews.llvm.org/D50894 llvm-svn: 340809
114 lines
4.4 KiB
CMake
114 lines
4.4 KiB
CMake
|
|
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()
|