Skip to content

Commit 0142f1d

Browse files
authored
[gtest] use proper CMake target and move builtin-build to subdir
1 parent a9cc13f commit 0142f1d

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_jpeg=ON
910
builtin_lz4=ON
1011
builtin_lzma=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
@@ -1449,121 +1449,7 @@ if (testing OR testsupport)
14491449
endif()
14501450

14511451
if (builtin_gtest)
1452-
# Add googletest
1453-
# http://stackoverflow.com/questions/9689183/cmake-googletest
1454-
1455-
set(_gtest_byproduct_binary_dir
1456-
${CMAKE_CURRENT_BINARY_DIR}/googletest-prefix/src/googletest-build)
1457-
set(_gtest_byproducts
1458-
${_gtest_byproduct_binary_dir}/lib/libgtest.a
1459-
${_gtest_byproduct_binary_dir}/lib/libgtest_main.a
1460-
${_gtest_byproduct_binary_dir}/lib/libgmock.a
1461-
${_gtest_byproduct_binary_dir}/lib/libgmock_main.a
1462-
)
1463-
1464-
set(GTEST_CXX_FLAGS "${ROOT_EXTERNAL_CXX_FLAGS}")
1465-
if(MSVC)
1466-
if(winrtdebug)
1467-
set(GTEST_BUILD_TYPE Debug)
1468-
else()
1469-
set(GTEST_BUILD_TYPE Release)
1470-
endif()
1471-
set(_gtest_byproducts
1472-
${_gtest_byproduct_binary_dir}/lib/gtest.lib
1473-
${_gtest_byproduct_binary_dir}/lib/gtest_main.lib
1474-
${_gtest_byproduct_binary_dir}/lib/gmock.lib
1475-
${_gtest_byproduct_binary_dir}/lib/gmock_main.lib
1476-
)
1477-
if(CMAKE_GENERATOR MATCHES Ninja)
1478-
set(GTEST_BUILD_COMMAND "BUILD_COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR>")
1479-
else()
1480-
set(GTEST_BUILD_COMMAND "BUILD_COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --config ${GTEST_BUILD_TYPE}")
1481-
endif()
1482-
if(asan)
1483-
if(NOT winrtdebug)
1484-
set(gtestbuild "RelWithDebInfo")
1485-
endif()
1486-
set(GTEST_CXX_FLAGS "${ROOT_EXTERNAL_CXX_FLAGS} ${ASAN_EXTRA_CXX_FLAGS}")
1487-
endif()
1488-
set(EXTRA_GTEST_OPTS
1489-
-DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}
1490-
-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG:PATH=${_gtest_byproduct_binary_dir}/lib/
1491-
-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_MINSIZEREL:PATH=${_gtest_byproduct_binary_dir}/lib/
1492-
-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE:PATH=${_gtest_byproduct_binary_dir}/lib/
1493-
-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO:PATH=${_gtest_byproduct_binary_dir}/lib/
1494-
-Dgtest_force_shared_crt=ON
1495-
${GTEST_BUILD_COMMAND})
1496-
else()
1497-
set(GTEST_BUILD_TYPE Release)
1498-
endif()
1499-
if(APPLE)
1500-
set(EXTRA_GTEST_OPTS
1501-
-DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT})
1502-
endif()
1503-
set(ROOT_GOOGLETEST_VERSION 1.17.0) # https://github.com/google/googletest/releases/tag/v1.17.0 Date: Apr 30, 2025
1504-
set(ROOT_GOOGLETEST_HASH "65fab701d9829d38cb77c14acdc431d2108bfdbf8979e40eb8ae567edf10b27c")
1505-
ExternalProject_Add(
1506-
googletest
1507-
# GIT_REPOSITORY https://github.com/google/googletest.git
1508-
# GIT_SHALLOW 1
1509-
# GIT_TAG v1.17.0
1510-
URL ${lcgpackages}/googletest-${ROOT_GOOGLETEST_VERSION}.tar.gz
1511-
URL_HASH SHA256=${ROOT_GOOGLETEST_HASH}
1512-
UPDATE_COMMAND ""
1513-
# # Force separate output paths for debug and release builds to allow easy
1514-
# # identification of correct lib in subsequent TARGET_LINK_LIBRARIES commands
1515-
# CMAKE_ARGS -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG:PATH=DebugLibs
1516-
# -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE:PATH=ReleaseLibs
1517-
# -Dgtest_force_shared_crt=ON
1518-
CMAKE_ARGS -G ${CMAKE_GENERATOR}
1519-
-DCMAKE_BUILD_TYPE=${GTEST_BUILD_TYPE}
1520-
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
1521-
-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
1522-
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
1523-
-DCMAKE_CXX_FLAGS=${GTEST_CXX_FLAGS}
1524-
-DCMAKE_AR=${CMAKE_AR}
1525-
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
1526-
${EXTRA_GTEST_OPTS}
1527-
# Disable install step
1528-
INSTALL_COMMAND ""
1529-
BUILD_BYPRODUCTS ${_gtest_byproducts}
1530-
# Wrap download, configure and build steps in a script to log output
1531-
LOG_DOWNLOAD ON LOG_CONFIGURE ON LOG_BUILD ON LOG_OUTPUT_ON_FAILURE ON
1532-
TIMEOUT 600
1533-
)
1534-
1535-
# Specify include dirs for gtest and gmock
1536-
ExternalProject_Get_Property(googletest source_dir)
1537-
set(GTEST_INCLUDE_DIR ${source_dir}/googletest/include)
1538-
set(GMOCK_INCLUDE_DIR ${source_dir}/googlemock/include)
1539-
# Create the directories. Prevents bug https://gitlab.kitware.com/cmake/cmake/issues/15052
1540-
file(MAKE_DIRECTORY ${GTEST_INCLUDE_DIR} ${GMOCK_INCLUDE_DIR})
1541-
1542-
# Libraries
1543-
ExternalProject_Get_Property(googletest binary_dir)
1544-
set(_G_LIBRARY_PATH ${binary_dir}/lib/)
1545-
1546-
# Use gmock_main instead of gtest_main because it initializes gtest as well.
1547-
# Note: The libraries are listed in reverse order of their dependencies.
1548-
foreach(lib gtest gtest_main gmock gmock_main)
1549-
add_library(${lib} IMPORTED STATIC GLOBAL)
1550-
set_target_properties(${lib} PROPERTIES
1551-
IMPORTED_LOCATION "${_G_LIBRARY_PATH}${CMAKE_STATIC_LIBRARY_PREFIX}${lib}${CMAKE_STATIC_LIBRARY_SUFFIX}"
1552-
)
1553-
add_dependencies(${lib} googletest)
1554-
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" AND
1555-
${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER_EQUAL 9)
1556-
target_compile_options(${lib} INTERFACE -Wno-deprecated-copy)
1557-
endif()
1558-
endforeach()
1559-
target_include_directories(gtest INTERFACE ${GTEST_INCLUDE_DIR})
1560-
target_include_directories(gmock INTERFACE ${GMOCK_INCLUDE_DIR})
1561-
1562-
set_property(TARGET gtest PROPERTY IMPORTED_LOCATION ${_G_LIBRARY_PATH}/${CMAKE_STATIC_LIBRARY_PREFIX}gtest${CMAKE_STATIC_LIBRARY_SUFFIX})
1563-
set_property(TARGET gtest_main PROPERTY IMPORTED_LOCATION ${_G_LIBRARY_PATH}/${CMAKE_STATIC_LIBRARY_PREFIX}gtest_main${CMAKE_STATIC_LIBRARY_SUFFIX})
1564-
set_property(TARGET gmock PROPERTY IMPORTED_LOCATION ${_G_LIBRARY_PATH}/${CMAKE_STATIC_LIBRARY_PREFIX}gmock${CMAKE_STATIC_LIBRARY_SUFFIX})
1565-
set_property(TARGET gmock_main PROPERTY IMPORTED_LOCATION ${_G_LIBRARY_PATH}/${CMAKE_STATIC_LIBRARY_PREFIX}gmock_main${CMAKE_STATIC_LIBRARY_SUFFIX})
1566-
1452+
add_subdirectory(builtins/gtest)
15671453
endif()
15681454

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

0 commit comments

Comments
 (0)