forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			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()
 |