diff --git a/Modules/FindGTest.cmake b/Modules/FindGTest.cmake index 106d2034f..4960b389c 100644 --- a/Modules/FindGTest.cmake +++ b/Modules/FindGTest.cmake @@ -4,17 +4,57 @@ # # GTEST_FOUND - Found the Google Testing framework # GTEST_INCLUDE_DIRS - Include directories -# GTEST_LIBRARIES - The GTest library -# GTEST_MAIN_LIBRARIES - The GTest library for automatic main() # -# Accepts the following CMake/Environment variables as input: +# Also defines the library variables below as normal +# variables. These contain debug/optimized keywords when +# a debugging library is found. # -# GTEST_ROOT - The root directory of the gtest install prefix +# GTEST_BOTH_LIBRARIES - Both libgtest & libgtest-main +# GTEST_LIBRARIES - libgtest +# GTEST_MAIN_LIBRARIES - libgtest-main # +# Accepts the following variables as input: +# +# GTEST_ROOT - (as CMake or env. variable) +# The root directory of the gtest install prefix +# +# GTEST_MSVC_SEARCH - If on MSVC, enables searching the build tree of +# GTest if set to MD or MT (defaults: MD) +# +#----------------------- +# Example Usage: +# +# enable_testing(true) +# find_package(GTest REQUIRED) +# include_directories(${GTEST_INCLUDE_DIRS}) +# +# add_executable(foo foo.cc) +# target_link_libraries(foo ${GTEST_BOTH_LIBRARIES}) +# +# add_test(AllTestsInFoo foo) +# +#----------------------- +# +# If you would like each Google test to show up in CTest as +# a test you may use the following macro. NOTE: It WILL slow +# down your tests, so be warned. +# +# GTEST_ADD_TESTS(executable extra_args ARGN) +# executable = The path to the test executable +# extra_args = Pass a list of extra arguments to be passed to +# executable enclosed in quotes (or "" for none) +# ARGN = A list of source files to search for tests & test +# fixtures. +# +# Example: +# set(FooTestArgs --foo 1 --bar 2) +# add_executable(FooTest FooUnitTest.cc) +# GTEST_ADD_TESTS(FooTest "${FooTestArgs}" FooUnitTest.cc) #============================================================================= # Copyright 2009 Kitware, Inc. # Copyright 2009 Philip Lowman +# Copyright 2009 Daniel Blezek # # Distributed under the OSI-approved BSD License (the "License"); # see accompanying file Copyright.txt for details. @@ -25,53 +65,91 @@ #============================================================================= # (To distributed this file outside of CMake, substitute the full # License text for the above reference.) +# +# Thanks to Daniel Blezek for the GTEST_ADD_TESTS code + +function(GTEST_ADD_TESTS executable extra_args) + if(NOT ARGN) + message(FATAL_ERROR "Missing ARGN: Read the documentation for GTEST_ADD_TESTS") + endif() + foreach(source ${ARGN}) + file(READ "${source}" contents) + string(REGEX MATCHALL "TEST_?F?\\(([A-Za-z_0-9 ,]+)\\)" found_tests ${contents}) + foreach(hit ${found_tests}) + string(REGEX REPLACE ".*\\(([A-Za-z_0-9]+)[, ]*([A-Za-z_0-9]+)\\).*" "\\1.\\2" test_name ${hit}) + add_test(${test_name} ${executable} --gtest_filter=${test_name} ${extra_args}) + endforeach() + endforeach() +endfunction() + +function(_gtest_append_debugs _endvar _library) + if(${_library} AND ${_library}_DEBUG) + set(_output optimized ${${_library}} debug ${${_library}_DEBUG}) + else() + set(_output ${${_library}}) + endif() + set(${_endvar} ${_output} PARENT_SCOPE) +endfunction() + +function(_gtest_find_library _name) + find_library(${_name} + NAMES ${ARGN} + HINTS + $ENV{GTEST_ROOT} + ${GTEST_ROOT} + PATH_SUFFIXES ${_gtest_libpath_suffixes} + ) + mark_as_advanced(${_name}) +endfunction() + +# + +if(NOT DEFINED GTEST_MSVC_SEARCH) + set(GTEST_MSVC_SEARCH MD) +endif() + +set(_gtest_libpath_suffixes lib) +if(MSVC) + if(GTEST_MSVC_SEARCH STREQUAL "MD") + list(APPEND _gtest_libpath_suffixes + msvc/gtest-md/Debug + msvc/gtest-md/Release) + elseif(GTEST_MSVC_SEARCH STREQUAL "MT") + list(APPEND _gtest_libpath_suffixes + msvc/gtest/Debug + msvc/gtest/Release) + endif() +endif() + find_path(GTEST_INCLUDE_DIR gtest/gtest.h HINTS $ENV{GTEST_ROOT}/include ${GTEST_ROOT}/include ) - -function(_gtest_find_library _name _library) - find_library(${_name} ${_library} - HINTS - $ENV{GTEST_ROOT} - ${GTEST_ROOT} - PATH_SUFFIXES lib64 lib - ) -endfunction() - -_gtest_find_library(GTEST_LIBRARY gtest) -_gtest_find_library(GTEST_LIBRARY_DEBUG gtestd) -_gtest_find_library(GTEST_MAIN_LIBRARY gtest_main) -_gtest_find_library(GTEST_MAIN_LIBRARY_DEBUG gtest_maind) - mark_as_advanced(GTEST_INCLUDE_DIR) -mark_as_advanced(GTEST_LIBRARY) -mark_as_advanced(GTEST_LIBRARY_DEBUG) -mark_as_advanced(GTEST_MAIN_LIBRARY) -mark_as_advanced(GTEST_MAIN_LIBRARY_DEBUG) + +if(MSVC AND GTEST_MSVC_SEARCH STREQUAL "MD") + # The provided /MD project files for Google Test add -md suffixes to the + # library names. + _gtest_find_library(GTEST_LIBRARY gtest-md gtest) + _gtest_find_library(GTEST_LIBRARY_DEBUG gtest-mdd gtestd) + _gtest_find_library(GTEST_MAIN_LIBRARY gtest_main-md gtest_main) + _gtest_find_library(GTEST_MAIN_LIBRARY_DEBUG gtest_main-mdd gtest_maind) +else() + _gtest_find_library(GTEST_LIBRARY gtest) + _gtest_find_library(GTEST_LIBRARY_DEBUG gtestd) + _gtest_find_library(GTEST_MAIN_LIBRARY gtest_main) + _gtest_find_library(GTEST_MAIN_LIBRARY_DEBUG gtest_maind) +endif() include(FindPackageHandleStandardArgs) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTEST DEFAULT_MSG GTEST_INCLUDE_DIR GTEST_LIBRARY GTEST_MAIN_LIBRARY) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTest DEFAULT_MSG GTEST_LIBRARY GTEST_INCLUDE_DIR GTEST_MAIN_LIBRARY) -set(GTEST_INCLUDE_DIRS ${GTEST_INCLUDE_DIR}) - -# Have *_LIBRARIES contain debug/release keywords if DEBUG library is available - -if(GTEST_LIBRARY AND GTEST_LIBRARY_DEBUG) - set(GTEST_LIBRARIES - optimized ${GTEST_LIBRARY} - debug ${GTEST_LIBRARY_DEBUG}) -else() - set(GTEST_LIBRARIES ${GTEST_LIBRARY}) -endif() - -if(GTEST_MAIN_LIBRARY AND GTEST_MAIN_LIBRARY_DEBUG) - set(GTEST_MAIN_LIBRARIES - optimized ${GTEST_MAIN_LIBRARY} - debug ${GTEST_MAIN_LIBRARY_DEBUG}) -else() - set(GTEST_MAIN_LIBRARIES ${GTEST_MAIN_LIBRARY}) +if(GTEST_FOUND) + set(GTEST_INCLUDE_DIRS ${GTEST_INCLUDE_DIR}) + _gtest_append_debugs(GTEST_LIBRARIES GTEST_LIBRARY) + _gtest_append_debugs(GTEST_MAIN_LIBRARIES GTEST_MAIN_LIBRARY) + set(GTEST_BOTH_LIBRARIES ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES}) endif()