Skip to content

Commit b06e4ab

Browse files
committed
[gtest] use proper CMake target and move builtin-build to subdir
1 parent 02156d3 commit b06e4ab

3 files changed

Lines changed: 119 additions & 115 deletions

File tree

.github/workflows/root-ci-config/buildconfig/alma10-clang_ninja.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ builtin_freetype=ON
55
builtin_ftgl=ON
66
builtin_gif=ON
77
builtin_gl2ps=ON
8+
builtin_googletest=ON
89
builtin_gsl=ON
910
builtin_jpeg=ON
1011
builtin_lz4=ON

builtins/gtest/CMakeLists.txt

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
# Add googletest
2+
# http://stackoverflow.com/questions/9689183/cmake-googletest
3+
4+
set(_gtest_byproduct_binary_dir
5+
${CMAKE_CURRENT_BINARY_DIR}/googletest-prefix/src/googletest-build)
6+
set(_gtest_byproducts
7+
${_gtest_byproduct_binary_dir}/lib/libgtest.a
8+
${_gtest_byproduct_binary_dir}/lib/libgtest_main.a
9+
${_gtest_byproduct_binary_dir}/lib/libgmock.a
10+
${_gtest_byproduct_binary_dir}/lib/libgmock_main.a
11+
)
12+
13+
set(GTEST_CXX_FLAGS "${ROOT_EXTERNAL_CXX_FLAGS}")
14+
if(MSVC)
15+
if(winrtdebug)
16+
set(GTEST_BUILD_TYPE Debug)
17+
else()
18+
set(GTEST_BUILD_TYPE Release)
19+
endif()
20+
set(_gtest_byproducts
21+
${_gtest_byproduct_binary_dir}/lib/gtest.lib
22+
${_gtest_byproduct_binary_dir}/lib/gtest_main.lib
23+
${_gtest_byproduct_binary_dir}/lib/gmock.lib
24+
${_gtest_byproduct_binary_dir}/lib/gmock_main.lib
25+
)
26+
if(CMAKE_GENERATOR MATCHES Ninja)
27+
set(GTEST_BUILD_COMMAND "BUILD_COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR>")
28+
else()
29+
set(GTEST_BUILD_COMMAND "BUILD_COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --config ${GTEST_BUILD_TYPE}")
30+
endif()
31+
if(asan)
32+
if(NOT winrtdebug)
33+
set(gtestbuild "RelWithDebInfo")
34+
endif()
35+
set(GTEST_CXX_FLAGS "${ROOT_EXTERNAL_CXX_FLAGS} ${ASAN_EXTRA_CXX_FLAGS}")
36+
endif()
37+
set(EXTRA_GTEST_OPTS
38+
-DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}
39+
-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG:PATH=${_gtest_byproduct_binary_dir}/lib/
40+
-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_MINSIZEREL:PATH=${_gtest_byproduct_binary_dir}/lib/
41+
-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE:PATH=${_gtest_byproduct_binary_dir}/lib/
42+
-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO:PATH=${_gtest_byproduct_binary_dir}/lib/
43+
-Dgtest_force_shared_crt=ON
44+
${GTEST_BUILD_COMMAND})
45+
else()
46+
set(GTEST_BUILD_TYPE Release)
47+
endif()
48+
if(APPLE)
49+
set(EXTRA_GTEST_OPTS
50+
-DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT})
51+
endif()
52+
53+
set(ROOT_GOOGLETEST_VERSION 1.17.0) # https://github.com/google/googletest/releases/tag/v1.17.0 Date: Apr 30, 2025
54+
set(ROOT_GOOGLETEST_HASH "65fab701d9829d38cb77c14acdc431d2108bfdbf8979e40eb8ae567edf10b27c")
55+
ExternalProject_Add(
56+
googletest
57+
# GIT_REPOSITORY https://github.com/google/googletest.git
58+
# GIT_SHALLOW 1
59+
# GIT_TAG v1.17.0
60+
URL ${lcgpackages}/googletest-${ROOT_GOOGLETEST_VERSION}.tar.gz
61+
URL_HASH SHA256=${ROOT_GOOGLETEST_HASH}
62+
INSTALL_DIR ${CMAKE_BINARY_DIR}/builtins/gtest
63+
UPDATE_COMMAND ""
64+
# # Force separate output paths for debug and release builds to allow easy
65+
# # identification of correct lib in subsequent TARGET_LINK_LIBRARIES commands
66+
# CMAKE_ARGS -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG:PATH=DebugLibs
67+
# -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE:PATH=ReleaseLibs
68+
# -Dgtest_force_shared_crt=ON
69+
CMAKE_ARGS -G ${CMAKE_GENERATOR}
70+
-DCMAKE_BUILD_TYPE=${GTEST_BUILD_TYPE}
71+
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
72+
-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
73+
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
74+
-DCMAKE_CXX_FLAGS=${GTEST_CXX_FLAGS}
75+
-DCMAKE_AR=${CMAKE_AR}
76+
-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
77+
${EXTRA_GTEST_OPTS}
78+
# Disable install step
79+
INSTALL_COMMAND ""
80+
BUILD_BYPRODUCTS ${_gtest_byproducts}
81+
# Wrap download, configure and build steps in a script to log output
82+
LOG_DOWNLOAD ON LOG_CONFIGURE ON LOG_BUILD ON LOG_OUTPUT_ON_FAILURE ON
83+
TIMEOUT 600
84+
)
85+
86+
# Specify include dirs for gtest and gmock
87+
ExternalProject_Get_Property(googletest source_dir)
88+
set(GTEST_INCLUDE_DIR ${source_dir}/googletest/include)
89+
set(GMOCK_INCLUDE_DIR ${source_dir}/googlemock/include)
90+
# Create the directories. Prevents bug https://gitlab.kitware.com/cmake/cmake/issues/15052
91+
file(MAKE_DIRECTORY ${GTEST_INCLUDE_DIR} ${GMOCK_INCLUDE_DIR})
92+
93+
# Libraries
94+
ExternalProject_Get_Property(googletest binary_dir)
95+
set(_G_LIBRARY_PATH ${binary_dir}/lib/)
96+
97+
# Use gmock_main instead of gtest_main because it initializes gtest as well.
98+
# Note: The libraries are listed in reverse order of their dependencies.
99+
foreach(lib gtest gtest_main gmock gmock_main)
100+
add_library(${lib} IMPORTED STATIC GLOBAL)
101+
set_target_properties(${lib} PROPERTIES
102+
IMPORTED_LOCATION "${_G_LIBRARY_PATH}${CMAKE_STATIC_LIBRARY_PREFIX}${lib}${CMAKE_STATIC_LIBRARY_SUFFIX}"
103+
)
104+
add_dependencies(${lib} googletest)
105+
add_library(GTest::${lib} ALIAS ${lib})
106+
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" AND
107+
${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER_EQUAL 9)
108+
target_compile_options(${lib} INTERFACE -Wno-deprecated-copy)
109+
endif()
110+
endforeach()
111+
target_include_directories(gtest INTERFACE ${GTEST_INCLUDE_DIR})
112+
target_include_directories(gmock INTERFACE ${GMOCK_INCLUDE_DIR})
113+
114+
set_property(TARGET gtest PROPERTY IMPORTED_LOCATION ${_G_LIBRARY_PATH}/${CMAKE_STATIC_LIBRARY_PREFIX}gtest${CMAKE_STATIC_LIBRARY_SUFFIX})
115+
set_property(TARGET gtest_main PROPERTY IMPORTED_LOCATION ${_G_LIBRARY_PATH}/${CMAKE_STATIC_LIBRARY_PREFIX}gtest_main${CMAKE_STATIC_LIBRARY_SUFFIX})
116+
set_property(TARGET gmock PROPERTY IMPORTED_LOCATION ${_G_LIBRARY_PATH}/${CMAKE_STATIC_LIBRARY_PREFIX}gmock${CMAKE_STATIC_LIBRARY_SUFFIX})
117+
set_property(TARGET gmock_main PROPERTY IMPORTED_LOCATION ${_G_LIBRARY_PATH}/${CMAKE_STATIC_LIBRARY_PREFIX}gmock_main${CMAKE_STATIC_LIBRARY_SUFFIX})

cmake/modules/SearchInstalledSoftware.cmake

Lines changed: 1 addition & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -1312,121 +1312,7 @@ if (testing OR testsupport)
13121312
endif()
13131313

13141314
if (builtin_gtest)
1315-
# Add googletest
1316-
# http://stackoverflow.com/questions/9689183/cmake-googletest
1317-
1318-
set(_gtest_byproduct_binary_dir
1319-
${CMAKE_CURRENT_BINARY_DIR}/googletest-prefix/src/googletest-build)
1320-
set(_gtest_byproducts
1321-
${_gtest_byproduct_binary_dir}/lib/libgtest.a
1322-
${_gtest_byproduct_binary_dir}/lib/libgtest_main.a
1323-
${_gtest_byproduct_binary_dir}/lib/libgmock.a
1324-
${_gtest_byproduct_binary_dir}/lib/libgmock_main.a
1325-
)
1326-
1327-
set(GTEST_CXX_FLAGS "${ROOT_EXTERNAL_CXX_FLAGS}")
1328-
if(MSVC)
1329-
if(winrtdebug)
1330-
set(GTEST_BUILD_TYPE Debug)
1331-
else()
1332-
set(GTEST_BUILD_TYPE Release)
1333-
endif()
1334-
set(_gtest_byproducts
1335-
${_gtest_byproduct_binary_dir}/lib/gtest.lib
1336-
${_gtest_byproduct_binary_dir}/lib/gtest_main.lib
1337-
${_gtest_byproduct_binary_dir}/lib/gmock.lib
1338-
${_gtest_byproduct_binary_dir}/lib/gmock_main.lib
1339-
)
1340-
if(CMAKE_GENERATOR MATCHES Ninja)
1341-
set(GTEST_BUILD_COMMAND "BUILD_COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR>")
1342-
else()
1343-
set(GTEST_BUILD_COMMAND "BUILD_COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --config ${GTEST_BUILD_TYPE}")
1344-
endif()
1345-
if(asan)
1346-
if(NOT winrtdebug)
1347-
set(gtestbuild "RelWithDebInfo")
1348-
endif()
1349-
set(GTEST_CXX_FLAGS "${ROOT_EXTERNAL_CXX_FLAGS} ${ASAN_EXTRA_CXX_FLAGS}")
1350-
endif()
1351-
set(EXTRA_GTEST_OPTS
1352-
-DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}
1353-
-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG:PATH=${_gtest_byproduct_binary_dir}/lib/
1354-
-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_MINSIZEREL:PATH=${_gtest_byproduct_binary_dir}/lib/
1355-
-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE:PATH=${_gtest_byproduct_binary_dir}/lib/
1356-
-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO:PATH=${_gtest_byproduct_binary_dir}/lib/
1357-
-Dgtest_force_shared_crt=ON
1358-
${GTEST_BUILD_COMMAND})
1359-
else()
1360-
set(GTEST_BUILD_TYPE Release)
1361-
endif()
1362-
if(APPLE)
1363-
set(EXTRA_GTEST_OPTS
1364-
-DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT})
1365-
endif()
1366-
set(ROOT_GOOGLETEST_VERSION 1.17.0) # https://github.com/google/googletest/releases/tag/v1.17.0 Date: Apr 30, 2025
1367-
set(ROOT_GOOGLETEST_HASH "65fab701d9829d38cb77c14acdc431d2108bfdbf8979e40eb8ae567edf10b27c")
1368-
ExternalProject_Add(
1369-
googletest
1370-
# GIT_REPOSITORY https://github.com/google/googletest.git
1371-
# GIT_SHALLOW 1
1372-
# GIT_TAG v1.17.0
1373-
URL ${lcgpackages}/googletest-${ROOT_GOOGLETEST_VERSION}.tar.gz
1374-
URL_HASH SHA256=${ROOT_GOOGLETEST_HASH}
1375-
UPDATE_COMMAND ""
1376-
# # Force separate output paths for debug and release builds to allow easy
1377-
# # identification of correct lib in subsequent TARGET_LINK_LIBRARIES commands
1378-
# CMAKE_ARGS -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG:PATH=DebugLibs
1379-
# -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE:PATH=ReleaseLibs
1380-
# -Dgtest_force_shared_crt=ON
1381-
CMAKE_ARGS -G ${CMAKE_GENERATOR}
1382-
-DCMAKE_BUILD_TYPE=${GTEST_BUILD_TYPE}
1383-
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
1384-
-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
1385-
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
1386-
-DCMAKE_CXX_FLAGS=${GTEST_CXX_FLAGS}
1387-
-DCMAKE_AR=${CMAKE_AR}
1388-
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
1389-
${EXTRA_GTEST_OPTS}
1390-
# Disable install step
1391-
INSTALL_COMMAND ""
1392-
BUILD_BYPRODUCTS ${_gtest_byproducts}
1393-
# Wrap download, configure and build steps in a script to log output
1394-
LOG_DOWNLOAD ON LOG_CONFIGURE ON LOG_BUILD ON LOG_OUTPUT_ON_FAILURE ON
1395-
TIMEOUT 600
1396-
)
1397-
1398-
# Specify include dirs for gtest and gmock
1399-
ExternalProject_Get_Property(googletest source_dir)
1400-
set(GTEST_INCLUDE_DIR ${source_dir}/googletest/include)
1401-
set(GMOCK_INCLUDE_DIR ${source_dir}/googlemock/include)
1402-
# Create the directories. Prevents bug https://gitlab.kitware.com/cmake/cmake/issues/15052
1403-
file(MAKE_DIRECTORY ${GTEST_INCLUDE_DIR} ${GMOCK_INCLUDE_DIR})
1404-
1405-
# Libraries
1406-
ExternalProject_Get_Property(googletest binary_dir)
1407-
set(_G_LIBRARY_PATH ${binary_dir}/lib/)
1408-
1409-
# Use gmock_main instead of gtest_main because it initializes gtest as well.
1410-
# Note: The libraries are listed in reverse order of their dependencies.
1411-
foreach(lib gtest gtest_main gmock gmock_main)
1412-
add_library(${lib} IMPORTED STATIC GLOBAL)
1413-
set_target_properties(${lib} PROPERTIES
1414-
IMPORTED_LOCATION "${_G_LIBRARY_PATH}${CMAKE_STATIC_LIBRARY_PREFIX}${lib}${CMAKE_STATIC_LIBRARY_SUFFIX}"
1415-
)
1416-
add_dependencies(${lib} googletest)
1417-
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" AND
1418-
${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER_EQUAL 9)
1419-
target_compile_options(${lib} INTERFACE -Wno-deprecated-copy)
1420-
endif()
1421-
endforeach()
1422-
target_include_directories(gtest INTERFACE ${GTEST_INCLUDE_DIR})
1423-
target_include_directories(gmock INTERFACE ${GMOCK_INCLUDE_DIR})
1424-
1425-
set_property(TARGET gtest PROPERTY IMPORTED_LOCATION ${_G_LIBRARY_PATH}/${CMAKE_STATIC_LIBRARY_PREFIX}gtest${CMAKE_STATIC_LIBRARY_SUFFIX})
1426-
set_property(TARGET gtest_main PROPERTY IMPORTED_LOCATION ${_G_LIBRARY_PATH}/${CMAKE_STATIC_LIBRARY_PREFIX}gtest_main${CMAKE_STATIC_LIBRARY_SUFFIX})
1427-
set_property(TARGET gmock PROPERTY IMPORTED_LOCATION ${_G_LIBRARY_PATH}/${CMAKE_STATIC_LIBRARY_PREFIX}gmock${CMAKE_STATIC_LIBRARY_SUFFIX})
1428-
set_property(TARGET gmock_main PROPERTY IMPORTED_LOCATION ${_G_LIBRARY_PATH}/${CMAKE_STATIC_LIBRARY_PREFIX}gmock_main${CMAKE_STATIC_LIBRARY_SUFFIX})
1429-
1315+
add_subdirectory(builtins/gtest)
14301316
endif()
14311317

14321318
# Starting from cmake 3.23, the GTest targets will have stable names.

0 commit comments

Comments
 (0)