Skip to content

Commit 1b6ff77

Browse files
committed
cmake: add Find module to detect pre-installed GMock/GTest
1 parent 5e1d24f commit 1b6ff77

File tree

7 files changed

+192
-42
lines changed

7 files changed

+192
-42
lines changed

3rdparty/CMakeLists.txt

Lines changed: 52 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
set(3rdparty_INCLUDES ${3rdparty_INCLUDES})
33
set(3rdparty_DEPENDEND_LIBS ${3rdparty_DEPENDEND_LIBS})
44
set(pfasst_DEPENDEND_TARGETS ${pfasst_DEPENDEND_TARGETS})
5+
set(pfasst_TESTS_DEPENDEND_TARGETS ${pfasst_TESTS_DEPENDEND_TARGETS})
56

67
set(3rdparty_DOWNLOAD_TIMEOUT "60")
78

@@ -196,51 +197,68 @@ if(pfasst_BUILD_TESTS)
196197
set(TESTS_3rdparty_DEPENDEND_LIBS ${TESTS_3rdparty_DEPENDEND_LIBS})
197198

198199
message(STATUS "--------------------------------------------------------------------------------")
199-
set(GMOCK_SOURCE_URL "http://googlemock.googlecode.com/files/gmock-1.7.0.zip")
200-
set(GMOCK_SOURCE_MD5 "073b984d8798ea1594f5e44d85b20d66")
201-
202200
message(STATUS "Google Testing Framework (gtest & gmock)")
203-
message(STATUS " going to download and compile it from sources retrieved from:")
204-
message(STATUS " ${GMOCK_SOURCE_URL}")
205201

206-
# Add gmock
207-
ExternalProject_Add(
208-
googlemock
209-
URL ${GMOCK_SOURCE_URL}
210-
URL_MD5 ${GMOCK_SOURCE_MD5}
211-
TIMEOUT ${3rdparty_DOWNLOAD_TIMEOUT}
212-
UPDATE_COMMAND ""
213-
PATCH_COMMAND ""
214-
CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release
215-
-DCMAKE_C_COMPILE=${CMAKE_C_COMPILER}
216-
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
217-
-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
218-
-DGTEST_USE_OWN_TR1_TUPLE=ON
219-
-Dgtest_force_shared_crt=ON
220-
-Dgmock_build_tests=OFF
221-
# Disable install step
222-
INSTALL_COMMAND ""
223-
# Wrap download, configure and build steps in a script to log output
224-
LOG_DOWNLOAD ON
225-
LOG_CONFIGURE ON
226-
LOG_BUILD ON
202+
find_package(GMock)
203+
set_package_properties(GMock
204+
PROPERTIES
205+
DESCRIPTION "GMock"
206+
URL "https://code.google.com/p/googlemock/"
207+
TYPE OPTIONAL
208+
PURPOSE "Google testing and mocking framework"
227209
)
228210

229-
# Specify include dir
230-
ExternalProject_Get_Property(googlemock source_dir)
231-
list(APPEND TESTS_3rdparty_INCLUDES ${source_dir}/include ${source_dir}/gtest/include)
211+
if(NOT GMOCK_FOUND)
212+
set(GMOCK_SOURCE_URL "http://googlemock.googlecode.com/files/gmock-1.7.0.zip")
213+
set(GMOCK_SOURCE_MD5 "073b984d8798ea1594f5e44d85b20d66")
232214

233-
ExternalProject_Get_Property(googlemock binary_dir)
234-
set(Suffix ".a")
235-
set(Pthread "-pthread")
215+
message(STATUS " going to download and compile it from sources retrieved from:")
216+
message(STATUS " ${GMOCK_SOURCE_URL}")
236217

237-
list(APPEND TESTS_3rdparty_DEPENDEND_LIBS ${binary_dir}/${CMAKE_FIND_LIBRARY_PREFIXES}gmock${Suffix})
238-
list(APPEND TESTS_3rdparty_DEPENDEND_LIBS ${Pthread})
218+
# Add gmock
219+
ExternalProject_Add(
220+
googlemock
221+
URL ${GMOCK_SOURCE_URL}
222+
URL_MD5 ${GMOCK_SOURCE_MD5}
223+
TIMEOUT ${3rdparty_DOWNLOAD_TIMEOUT}
224+
UPDATE_COMMAND ""
225+
PATCH_COMMAND ""
226+
CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release
227+
-DCMAKE_C_COMPILE=${CMAKE_C_COMPILER}
228+
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
229+
-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
230+
-DGTEST_USE_OWN_TR1_TUPLE=ON
231+
-Dgtest_force_shared_crt=ON
232+
-Dgmock_build_tests=OFF
233+
# Disable install step
234+
INSTALL_COMMAND ""
235+
# Wrap download, configure and build steps in a script to log output
236+
LOG_DOWNLOAD ON
237+
LOG_CONFIGURE ON
238+
LOG_BUILD ON
239+
)
240+
241+
# Specify include dir
242+
ExternalProject_Get_Property(googlemock source_dir)
243+
list(APPEND TESTS_3rdparty_INCLUDES ${source_dir}/include ${source_dir}/gtest/include)
244+
245+
ExternalProject_Get_Property(googlemock binary_dir)
246+
set(Suffix ".a")
247+
set(Pthread "-pthread")
248+
list(APPEND TESTS_3rdparty_DEPENDEND_LIBS ${binary_dir}/${CMAKE_FIND_LIBRARY_PREFIXES}gmock${Suffix})
249+
list(APPEND TESTS_3rdparty_DEPENDEND_LIBS ${Pthread})
250+
list(APPEND pfasst_TESTS_DEPENDEND_TARGETS googlemock)
251+
else()
252+
string(REGEX REPLACE "so$" "a" GMOCK_LIBRARIES ${GMOCK_LIBRARIES})
253+
list(APPEND TESTS_3rdparty_DEPENDEND_LIBS ${GMOCK_LIBRARIES} "-pthread")
254+
list(APPEND TESTS_3rdparty_INCLUDES ${GMOCK_INCLUDE_DIRS})
255+
endif(NOT GMOCK_FOUND)
239256
endif()
240257

241258
# propagate include lists to parent directory
242259
set(3rdparty_DEPENDEND_LIBS ${3rdparty_DEPENDEND_LIBS} PARENT_SCOPE)
243260
set(3rdparty_INCLUDES ${3rdparty_INCLUDES} PARENT_SCOPE)
244261
set(pfasst_DEPENDEND_TARGETS ${pfasst_DEPENDEND_TARGETS} PARENT_SCOPE)
262+
set(pfasst_TESTS_DEPENDEND_TARGETS ${pfasst_TESTS_DEPENDEND_TARGETS} PARENT_SCOPE)
245263
set(TESTS_3rdparty_DEPENDEND_LIBS ${TESTS_3rdparty_DEPENDEND_LIBS} PARENT_SCOPE)
246264
set(TESTS_3rdparty_INCLUDES ${TESTS_3rdparty_INCLUDES} PARENT_SCOPE)

cmake/FindGMock.cmake

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
# Locate the Google C++ Mocking Framework.
2+
# (This file is almost an identical copy of the original FindGTest.cmake file,
3+
# feel free to use it as it is or modify it for your own needs.)
4+
#
5+
#
6+
# Defines the following variables:
7+
#
8+
# GMOCK_FOUND - Found the Google Testing framework
9+
# GMOCK_INCLUDE_DIRS - Include directories
10+
#
11+
# Also defines the library variables below as normal
12+
# variables. These contain debug/optimized keywords when
13+
# a debugging library is found.
14+
#
15+
# GMOCK_BOTH_LIBRARIES - Both libgmock & libgmock-main
16+
# GMOCK_LIBRARIES - libgmock
17+
# GMOCK_MAIN_LIBRARIES - libgmock-main
18+
#
19+
# Accepts the following variables as input:
20+
#
21+
# GMOCK_ROOT - (as a CMake or environment variable)
22+
# The root directory of the gmock install prefix
23+
#
24+
# GMOCK_MSVC_SEARCH - If compiling with MSVC, this variable can be set to
25+
# "MD" or "MT" to enable searching a gmock build tree
26+
# (defaults: "MD")
27+
#
28+
#-----------------------
29+
# Example Usage:
30+
#
31+
# find_package(GMock REQUIRED)
32+
# include_directories(${GMOCK_INCLUDE_DIRS})
33+
#
34+
# add_executable(foo foo.cc)
35+
# target_link_libraries(foo ${GMOCK_BOTH_LIBRARIES})
36+
#
37+
#=============================================================================
38+
# This file is released under the MIT licence:
39+
#
40+
# Copyright (c) 2011 Matej Svec
41+
#
42+
# Permission is hereby granted, free of charge, to any person obtaining a copy
43+
# of this software and associated documentation files (the "Software"), to
44+
# deal in the Software without restriction, including without limitation the
45+
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
46+
# sell copies of the Software, and to permit persons to whom the Software is
47+
# furnished to do so, subject to the following conditions:
48+
#
49+
# The above copyright notice and this permission notice shall be included in
50+
# all copies or substantial portions of the Software.
51+
#
52+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
53+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
54+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
55+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
56+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
57+
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
58+
# IN THE SOFTWARE.
59+
#=============================================================================
60+
61+
62+
function(_gmock_append_debugs _endvar _library)
63+
if(${_library} AND ${_library}_DEBUG)
64+
set(_output optimized ${${_library}} debug ${${_library}_DEBUG})
65+
else()
66+
set(_output ${${_library}})
67+
endif()
68+
set(${_endvar} ${_output} PARENT_SCOPE)
69+
endfunction()
70+
71+
function(_gmock_find_library _name)
72+
find_library(${_name}
73+
NAMES ${ARGN}
74+
HINTS
75+
$ENV{GMOCK_ROOT}
76+
${GMOCK_ROOT}
77+
PATH_SUFFIXES ${_gmock_libpath_suffixes}
78+
)
79+
mark_as_advanced(${_name})
80+
endfunction()
81+
82+
83+
if(NOT DEFINED GMOCK_MSVC_SEARCH)
84+
set(GMOCK_MSVC_SEARCH MD)
85+
endif()
86+
87+
set(_gmock_libpath_suffixes lib)
88+
if(MSVC)
89+
if(GMOCK_MSVC_SEARCH STREQUAL "MD")
90+
list(APPEND _gmock_libpath_suffixes
91+
msvc/gmock-md/Debug
92+
msvc/gmock-md/Release)
93+
elseif(GMOCK_MSVC_SEARCH STREQUAL "MT")
94+
list(APPEND _gmock_libpath_suffixes
95+
msvc/gmock/Debug
96+
msvc/gmock/Release)
97+
endif()
98+
endif()
99+
100+
find_path(GMOCK_INCLUDE_DIR gmock/gmock.h
101+
HINTS
102+
$ENV{GMOCK_ROOT}/include
103+
${GMOCK_ROOT}/include
104+
)
105+
mark_as_advanced(GMOCK_INCLUDE_DIR)
106+
107+
if(MSVC AND GMOCK_MSVC_SEARCH STREQUAL "MD")
108+
# The provided /MD project files for Google Mock add -md suffixes to the
109+
# library names.
110+
_gmock_find_library(GMOCK_LIBRARY gmock-md gmock)
111+
_gmock_find_library(GMOCK_LIBRARY_DEBUG gmock-mdd gmockd)
112+
_gmock_find_library(GMOCK_MAIN_LIBRARY gmock_main-md gmock_main)
113+
_gmock_find_library(GMOCK_MAIN_LIBRARY_DEBUG gmock_main-mdd gmock_maind)
114+
else()
115+
_gmock_find_library(GMOCK_LIBRARY gmock)
116+
_gmock_find_library(GMOCK_LIBRARY_DEBUG gmockd)
117+
_gmock_find_library(GMOCK_MAIN_LIBRARY gmock_main)
118+
_gmock_find_library(GMOCK_MAIN_LIBRARY_DEBUG gmock_maind)
119+
endif()
120+
121+
FIND_PACKAGE_HANDLE_STANDARD_ARGS(GMock DEFAULT_MSG GMOCK_LIBRARY GMOCK_INCLUDE_DIR GMOCK_MAIN_LIBRARY)
122+
123+
if(GMOCK_FOUND)
124+
set(GMOCK_INCLUDE_DIRS ${GMOCK_INCLUDE_DIR})
125+
_gmock_append_debugs(GMOCK_LIBRARIES GMOCK_LIBRARY)
126+
_gmock_append_debugs(GMOCK_MAIN_LIBRARIES GMOCK_MAIN_LIBRARY)
127+
128+
set(GMOCK_BOTH_LIBRARIES ${GMOCK_LIBRARIES} ${GMOCK_MAIN_LIBRARIES})
129+
endif()
130+

tests/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ set(TESTS
1414
foreach(test ${TESTS})
1515
message(STATUS " ${test}")
1616
add_executable(${test} ${test}.cpp)
17-
add_dependencies(${test} ${pfasst_DEPENDEND_TARGETS} googlemock)
17+
add_dependencies(${test} ${pfasst_DEPENDEND_TARGETS} ${pfasst_TESTS_DEPENDEND_TARGETS})
1818
target_link_libraries(${test}
1919
${3rdparty_DEPENDEND_LIBS}
2020
${TESTS_3rdparty_DEPENDEND_LIBS}

tests/examples/advection_diffusion/CMakeLists.txt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,10 @@ endif()
1919
foreach(test ${TESTS})
2020
message(STATUS " ${test}")
2121
add_executable(${test} ${test}.cpp)
22-
add_dependencies(${test} googlemock)
2322
if(NOT FFTW_FOUND)
24-
add_dependencies(${test} ${pfasst_DEPENDEND_TARGETS} googlemock fftw3)
23+
add_dependencies(${test} ${pfasst_DEPENDEND_TARGETS} ${pfasst_TESTS_DEPENDEND_TARGETS} fftw3)
24+
else()
25+
add_dependencies(${test} ${pfasst_DEPENDEND_TARGETS} ${pfasst_TESTS_DEPENDEND_TARGETS})
2526
endif()
2627
target_link_libraries(${test}
2728
${3rdparty_DEPENDEND_LIBS}
@@ -45,9 +46,10 @@ if(${pfasst_WITH_MPI})
4546
foreach(test ${MPI_TESTS})
4647
message(STATUS " ${test}")
4748
add_executable(${test} ${test}.cpp)
48-
add_dependencies(${test} googlemock)
4949
if(NOT FFTW_FOUND)
50-
add_dependencies(${test} ${pfasst_DEPENDEND_TARGETS} googlemock fftw3)
50+
add_dependencies(${test} ${pfasst_DEPENDEND_TARGETS} ${pfasst_TESTS_DEPENDEND_TARGETS} fftw3)
51+
else()
52+
add_dependencies(${test} ${pfasst_DEPENDEND_TARGETS} ${pfasst_TESTS_DEPENDEND_TARGETS})
5153
endif()
5254
if(MPI_COMPILE_FLAGS)
5355
if(pfasst_WITH_GCC_PROF AND ${CMAKE_CXX_COMPILER_ID} MATCHES GNU)

tests/examples/boris/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ set(TESTS
1313
foreach(test ${TESTS})
1414
message(STATUS " ${test}")
1515
add_executable(${test} ${test}.cpp)
16-
add_dependencies(${test} googlemock)
16+
add_dependencies(${test} ${pfasst_DEPENDEND_TARGETS} ${pfasst_TESTS_DEPENDEND_TARGETS})
1717
target_link_libraries(${test}
1818
${3rdparty_DEPENDEND_LIBS}
1919
${TESTS_3rdparty_DEPENDEND_LIBS}

tests/examples/scalar/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ set(TESTS
1313
foreach(test ${TESTS})
1414
message(STATUS " ${test}")
1515
add_executable(${test} ${test}.cpp)
16-
add_dependencies(${test} ${pfasst_DEPENDEND_TARGETS} googlemock)
16+
add_dependencies(${test} ${pfasst_DEPENDEND_TARGETS} ${pfasst_TESTS_DEPENDEND_TARGETS})
1717
target_link_libraries(${test}
1818
${3rdparty_DEPENDEND_LIBS}
1919
${TESTS_3rdparty_DEPENDEND_LIBS}

tests/examples/vanderpol/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ set(TESTS
1212
foreach(test ${TESTS})
1313
message(STATUS " ${test}")
1414
add_executable(${test} ${test}.cpp)
15-
add_dependencies(${test} ${pfasst_DEPENDEND_TARGETS} googlemock)
15+
add_dependencies(${test} ${pfasst_DEPENDEND_TARGETS} ${pfasst_TESTS_DEPENDEND_TARGETS})
1616
target_link_libraries(${test}
1717
${3rdparty_DEPENDEND_LIBS}
1818
${TESTS_3rdparty_DEPENDEND_LIBS}

0 commit comments

Comments
 (0)