@@ -9,12 +9,136 @@ else()
99 set (REPO ${CMAKE_SOURCE_DIR} )
1010endif ()
1111
12- if (NOT DEFINED standalone_tests)
13- find_package (GTest 1.10 REQUIRED)
14- endif ()
15-
1612enable_testing ()
1713
14+ # Look for gtest. If not found, download it from the web.
15+ # Taken from ROOTs SearchInstalledSoftware.cmake
16+ find_package (GTest 1.10)
17+ if (NOT GTEST_FOUND)
18+ include (ExternalProject)
19+
20+ # Add googletest
21+ # http://stackoverflow.com/questions/9689183/cmake-googletest
22+
23+ set (_gtest_byproduct_binary_dir
24+ ${CMAKE_CURRENT_BINARY_DIR} /googletest-prefix /src/googletest-build )
25+ set (_gtest_byproducts
26+ ${_gtest_byproduct_binary_dir} /lib/libgtest.a
27+ ${_gtest_byproduct_binary_dir} /lib/libgtest_main.a
28+ ${_gtest_byproduct_binary_dir} /lib/libgmock.a
29+ ${_gtest_byproduct_binary_dir} /lib/libgmock_main.a
30+ )
31+
32+ set (GTEST_CXX_FLAGS "${ROOT_EXTERNAL_CXX_FLAGS} " )
33+ if (MSVC )
34+ if (winrtdebug)
35+ set (GTEST_BUILD_TYPE Debug)
36+ else ()
37+ set (GTEST_BUILD_TYPE Release)
38+ endif ()
39+ set (_gtest_byproducts
40+ ${_gtest_byproduct_binary_dir} /lib/gtest.lib
41+ ${_gtest_byproduct_binary_dir} /lib/gtest_main.lib
42+ ${_gtest_byproduct_binary_dir} /lib/gmock.lib
43+ ${_gtest_byproduct_binary_dir} /lib/gmock_main.lib
44+ )
45+ if (CMAKE_GENERATOR MATCHES Ninja)
46+ set (GTEST_BUILD_COMMAND "BUILD_COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR>" )
47+ else ()
48+ set (GTEST_BUILD_COMMAND "BUILD_COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --config ${GTEST_BUILD_TYPE} " )
49+ endif ()
50+ if (asan)
51+ if (NOT winrtdebug)
52+ set (gtestbuild "RelWithDebInfo" )
53+ endif ()
54+ set (GTEST_CXX_FLAGS "${ROOT_EXTERNAL_CXX_FLAGS} ${ASAN_EXTRA_CXX_FLAGS} " )
55+ endif ()
56+ set (EXTRA_GTEST_OPTS
57+ -DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}
58+ -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG:PATH =${_gtest_byproduct_binary_dir} /lib/
59+ -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_MINSIZEREL:PATH =${_gtest_byproduct_binary_dir} /lib/
60+ -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE:PATH =${_gtest_byproduct_binary_dir} /lib/
61+ -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO:PATH =${_gtest_byproduct_binary_dir} /lib/
62+ -Dgtest_force_shared_crt=ON
63+ ${GTEST_BUILD_COMMAND} )
64+ else ()
65+ set (GTEST_BUILD_TYPE Release)
66+ endif ()
67+ if (APPLE )
68+ set (EXTRA_GTEST_OPTS
69+ -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT} )
70+ endif ()
71+
72+ ExternalProject_Add(
73+ googletest
74+ GIT_REPOSITORY https://github.com/google/googletest.git
75+ GIT_SHALLOW 1
76+ GIT_TAG release-1.12.1
77+ UPDATE_COMMAND ""
78+ # # Force separate output paths for debug and release builds to allow easy
79+ # # identification of correct lib in subsequent TARGET_LINK_LIBRARIES commands
80+ # CMAKE_ARGS -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG:PATH=DebugLibs
81+ # -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE:PATH=ReleaseLibs
82+ # -Dgtest_force_shared_crt=ON
83+ CMAKE_ARGS -G ${CMAKE_GENERATOR}
84+ -DCMAKE_BUILD_TYPE=${GTEST_BUILD_TYPE}
85+ # Don't inherit from main project, because it doesn't use C (only C++).
86+ #-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
87+ -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
88+ -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
89+ -DCMAKE_CXX_FLAGS=${GTEST_CXX_FLAGS}
90+ -DCMAKE_AR=${CMAKE_AR}
91+ -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
92+ ${EXTRA_GTEST_OPTS}
93+ # Disable install step
94+ INSTALL_COMMAND ""
95+ BUILD_BYPRODUCTS ${_gtest_byproducts}
96+ # Wrap download, configure and build steps in a script to log output
97+ LOG_DOWNLOAD ON LOG_CONFIGURE ON LOG_BUILD ON LOG_OUTPUT_ON_FAILURE ON
98+ TIMEOUT 600
99+ )
100+
101+ # Specify include dirs for gtest and gmock
102+ ExternalProject_Get_Property(googletest source_dir)
103+ set (GTEST_INCLUDE_DIR ${source_dir} /googletest/include )
104+ set (GMOCK_INCLUDE_DIR ${source_dir} /googlemock/include )
105+ # Create the directories. Prevents bug https://gitlab.kitware.com/cmake/cmake/issues/15052
106+ file (MAKE_DIRECTORY ${GTEST_INCLUDE_DIR} ${GMOCK_INCLUDE_DIR} )
107+
108+ # Libraries
109+ ExternalProject_Get_Property(googletest binary_dir)
110+ set (_G_LIBRARY_PATH ${binary_dir} /lib/)
111+
112+ # Use gmock_main instead of gtest_main because it initializes gtest as well.
113+ # Note: The libraries are listed in reverse order of their dependencies.
114+ foreach (lib gtest gtest_main gmock gmock_main)
115+ add_library (${lib} IMPORTED STATIC GLOBAL )
116+ set_target_properties (${lib} PROPERTIES
117+ IMPORTED_LOCATION "${_G_LIBRARY_PATH}${CMAKE_STATIC_LIBRARY_PREFIX}${lib}${CMAKE_STATIC_LIBRARY_SUFFIX} "
118+ )
119+ add_dependencies (${lib} googletest)
120+ if ("${CMAKE_CXX_COMPILER_ID} " STREQUAL "GNU" AND
121+ ${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER_EQUAL 9)
122+ target_compile_options (${lib} INTERFACE -Wno-deprecated-copy)
123+ endif ()
124+ endforeach ()
125+ target_include_directories (gtest INTERFACE ${GTEST_INCLUDE_DIR} )
126+ target_include_directories (gmock INTERFACE ${GMOCK_INCLUDE_DIR} )
127+
128+ set_property (TARGET gtest PROPERTY IMPORTED_LOCATION ${_G_LIBRARY_PATH} /${CMAKE_STATIC_LIBRARY_PREFIX} gtest${CMAKE_STATIC_LIBRARY_SUFFIX} )
129+ set_property (TARGET gtest_main PROPERTY IMPORTED_LOCATION ${_G_LIBRARY_PATH} /${CMAKE_STATIC_LIBRARY_PREFIX} gtest_main${CMAKE_STATIC_LIBRARY_SUFFIX} )
130+ set_property (TARGET gmock PROPERTY IMPORTED_LOCATION ${_G_LIBRARY_PATH} /${CMAKE_STATIC_LIBRARY_PREFIX} gmock${CMAKE_STATIC_LIBRARY_SUFFIX} )
131+ set_property (TARGET gmock_main PROPERTY IMPORTED_LOCATION ${_G_LIBRARY_PATH} /${CMAKE_STATIC_LIBRARY_PREFIX} gmock_main${CMAKE_STATIC_LIBRARY_SUFFIX} )
132+
133+ # Starting from cmake 3.23, the GTest targets will have stable names.
134+ # ROOT was updated to use those, but for older CMake versions, we have to declare the aliases:
135+ foreach (LIBNAME gtest_main gmock_main gtest gmock)
136+ if (NOT TARGET GTest::${LIBNAME} AND TARGET ${LIBNAME} )
137+ add_library (GTest::${LIBNAME} ALIAS ${LIBNAME} )
138+ endif ()
139+ endforeach ()
140+ endif ()
141+
18142include (CombineTestMacros.cmake)
19143
20144# Set the location of text2workspace.py, assuming installation to a virtual
@@ -107,7 +231,7 @@ COMBINE_ADD_TEST(template_analysis-text2workspace
107231)
108232
109233
110- if (NOT DEFINED standalone_tests)
234+ if (BUILD_TESTS AND NOT DEFINED standalone_tests)
111235 # Build and run the testCreateNLL helper on the generated workspace
112236 COMBINE_ADD_GTEST(template-analysis-testCreateNLL
113237 testCreateNLL.cxx
0 commit comments