mirror of
https://github.com/google/benchmark.git
synced 2025-01-08 19:00:14 +08:00
68e228944e
Older CMake versions, in particular 2.8, don't seem to correctly handle interface include directories. This causes failures when building the tests. Additionally, older CMake versions use a different library install directory than expected (i.e. they use lib/<target-triple>). This caused certain tests to fail to link. This patch fixes both those issues. The first by manually adding the correct include directory when building the tests. The second by specifying the library output directory when configuring the GTest build.
94 lines
3.3 KiB
CMake
94 lines
3.3 KiB
CMake
|
|
macro(split_list listname)
|
|
string(REPLACE ";" " " ${listname} "${${listname}}")
|
|
endmacro()
|
|
|
|
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)
|
|
|
|
add_library(gtest UNKNOWN IMPORTED)
|
|
add_library(gtest_main UNKNOWN IMPORTED)
|
|
|
|
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()
|
|
file(MAKE_DIRECTORY ${install_dir}/include)
|
|
set_target_properties(gtest PROPERTIES
|
|
IMPORTED_LOCATION ${install_dir}/lib/${LIB_PREFIX}gtest${LIB_SUFFIX}
|
|
INTERFACE_INCLUDE_DIRECTORIES ${install_dir}/include
|
|
)
|
|
set_target_properties(gtest_main PROPERTIES
|
|
IMPORTED_LOCATION ${install_dir}/lib/${LIB_PREFIX}gtest_main${LIB_SUFFIX}
|
|
INTERFACE_INCLUDE_DIRECTORIES ${install_dir}/include
|
|
)
|
|
add_dependencies(gtest googletest)
|
|
add_dependencies(gtest_main googletest)
|
|
set(GTEST_BOTH_LIBRARIES gtest gtest_main)
|
|
set(GTEST_INCLUDE_DIRS ${install_dir}/include)
|
|
endmacro(build_external_gtest)
|
|
|
|
if (BENCHMARK_ENABLE_GTEST_TESTS)
|
|
if (IS_DIRECTORY ${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 gtest_main)
|
|
elseif(BENCHMARK_DOWNLOAD_DEPENDENCIES)
|
|
build_external_gtest()
|
|
else()
|
|
find_package(GTest REQUIRED)
|
|
endif()
|
|
endif()
|