Skip to content

Commit 8f92175

Browse files
authoredJun 9, 2021
CMake: add option to use Google Test already installed on system (abseil#969)
As of this change, you can use `-DABSL_USE_EXTERNAL_GOOGLETEST=ON -DABSL_FIND_GOOGLETEST=ON` to have Abseil use the standard CMake find_package(GTest) mechanism.
1 parent f729726 commit 8f92175

21 files changed

+295
-225
lines changed
 

‎CMake/AbseilHelpers.cmake

+2-2
Original file line numberDiff line numberDiff line change
@@ -336,8 +336,8 @@ endfunction()
336336
# "awesome_test.cc"
337337
# DEPS
338338
# absl::awesome
339-
# gmock
340-
# gtest_main
339+
# GTest::gmock
340+
# GTest::gtest_main
341341
# )
342342
function(absl_cc_test)
343343
if(NOT BUILD_TESTING)

‎CMake/README.md

+45
Original file line numberDiff line numberDiff line change
@@ -99,3 +99,48 @@ absl::synchronization
9999
absl::time
100100
absl::utility
101101
```
102+
103+
## Traditional CMake Set-Up
104+
105+
For larger projects, it may make sense to use the traditional CMake set-up where you build and install projects separately.
106+
107+
First, you'd need to build and install Google Test:
108+
```
109+
cmake -S /source/googletest -B /build/googletest -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/installation/dir -DBUILD_GMOCK=ON
110+
cmake --build /build/googletest --target install
111+
```
112+
113+
Then you need to configure and build Abseil. Make sure you enable `ABSL_USE_EXTERNAL_GOOGLETEST` and `ABSL_FIND_GOOGLETEST`. You also need to enable `ABSL_ENABLE_INSTALL` so that you can install Abseil itself.
114+
```
115+
cmake -S /source/abseil-cpp -B /build/abseil-cpp -DCMAKE_PREFIX_PATH=/installation/dir -DCMAKE_INSTALL_PREFIX=/installation/dir -DABSL_ENABLE_INSTALL=ON -DABSL_USE_EXTERNAL_GOOGLETEST=ON -DABSL_FIND_GOOGLETEST=ON
116+
cmake --build /temporary/build/abseil-cpp
117+
```
118+
119+
(`CMAKE_PREFIX_PATH` is where you already have Google Test installed; `CMAKE_INSTALL_PREFIX` is where you want to have Abseil installed; they can be different.)
120+
121+
Run the tests:
122+
```
123+
ctest --test-dir /temporary/build/abseil-cpp
124+
```
125+
126+
And finally install:
127+
```
128+
cmake --build /temporary/build/abseil-cpp --target install
129+
```
130+
131+
# CMake Option Synposis
132+
133+
## Enable Standard CMake Installation
134+
135+
`-DABSL_ENABLE_INSTALL=ON`
136+
137+
## Google Test Options
138+
139+
`-DBUILD_TESTING=ON` must be set to enable testing
140+
141+
- Have Abseil download and build Google Test for you: `-DABSL_USE_EXTERNAL_GOOGLETEST=OFF` (default)
142+
- Download and build latest Google Test: `-DABSL_USE_GOOGLETEST_HEAD=ON`
143+
- Download specific Google Test version (ZIP archive): `-DABSL_GOOGLETEST_DOWNLOAD_URL=https://.../version.zip`
144+
- Use Google Test from specific local directory: `-DABSL_LOCAL_GOOGLETEST_DIR=/path/to/googletest`
145+
- Use Google Test included elsewhere in your project: `-DABSL_USE_EXTERNAL_GOOGLETEST=ON`
146+
- Use standard CMake `find_package(CTest)` to find installed Google Test: `-DABSL_USE_EXTERNAL_GOOGLETEST=ON -DABSL_FIND_GOOGLETEST=ON`

‎CMakeLists.txt

+32-7
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,18 @@ endif()
102102
## pthread
103103
find_package(Threads REQUIRED)
104104

105+
include(CMakeDependentOption)
106+
105107
option(ABSL_USE_EXTERNAL_GOOGLETEST
106108
"If ON, Abseil will assume that the targets for GoogleTest are already provided by the including project. This makes sense when Abseil is used with add_subproject." OFF)
107109

110+
cmake_dependent_option(ABSL_FIND_GOOGLETEST
111+
"If ON, Abseil will use find_package(GTest) rather than assuming that GoogleTest is already provided by the including project."
112+
ON
113+
"ABSL_USE_EXTERNAL_GOOGLETEST"
114+
OFF)
115+
116+
108117
option(ABSL_USE_GOOGLETEST_HEAD
109118
"If ON, abseil will download HEAD from GoogleTest at config time." OFF)
110119

@@ -116,7 +125,15 @@ set(ABSL_LOCAL_GOOGLETEST_DIR "/usr/src/googletest" CACHE PATH
116125

117126
if(BUILD_TESTING)
118127
## check targets
119-
if (NOT ABSL_USE_EXTERNAL_GOOGLETEST)
128+
if (ABSL_USE_EXTERNAL_GOOGLETEST)
129+
if (ABSL_FIND_GOOGLETEST)
130+
find_package(GTest REQUIRED)
131+
else()
132+
if (NOT TARGET gtest AND NOT TARGET GTest::gtest)
133+
message(FATAL_ERROR "ABSL_USE_EXTERNAL_GOOGLETEST is ON and ABSL_FIND_GOOGLETEST is OFF, which means that the top-level project must build the Google Test project. However, the target gtest was not found.")
134+
endif()
135+
endif()
136+
else()
120137
set(absl_gtest_build_dir ${CMAKE_BINARY_DIR}/googletest-build)
121138
if(ABSL_USE_GOOGLETEST_HEAD AND ABSL_GOOGLETEST_DOWNLOAD_URL)
122139
message(FATAL_ERROR "Do not set both ABSL_USE_GOOGLETEST_HEAD and ABSL_GOOGLETEST_DOWNLOAD_URL")
@@ -134,14 +151,22 @@ if(BUILD_TESTING)
134151
include(CMake/Googletest/DownloadGTest.cmake)
135152
endif()
136153

137-
check_target(gtest)
138-
check_target(gtest_main)
139-
check_target(gmock)
154+
if (NOT ABSL_FIND_GOOGLETEST)
155+
# When Google Test is included directly rather than through find_package, the aliases are missing.
156+
add_library(GTest::gtest_main ALIAS gtest_main)
157+
add_library(GTest::gtest ALIAS gtest)
158+
add_library(GTest::gmock ALIAS gmock)
159+
endif()
160+
161+
check_target(GTest::gtest)
162+
check_target(GTest::gtest_main)
163+
check_target(GTest::gmock)
164+
check_target(GTest::gmock_main)
140165

141166
list(APPEND ABSL_TEST_COMMON_LIBRARIES
142-
gtest_main
143-
gtest
144-
gmock
167+
GTest::gtest_main
168+
GTest::gtest
169+
GTest::gmock
145170
${CMAKE_THREAD_LIBS_INIT}
146171
)
147172
endif()

‎absl/algorithm/CMakeLists.txt

+2-2
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ absl_cc_test(
3535
${ABSL_TEST_COPTS}
3636
DEPS
3737
absl::algorithm
38-
gmock_main
38+
GTest::gmock_main
3939
)
4040

4141
absl_cc_library(
@@ -65,5 +65,5 @@ absl_cc_test(
6565
absl::core_headers
6666
absl::memory
6767
absl::span
68-
gmock_main
68+
GTest::gmock_main
6969
)

‎absl/base/CMakeLists.txt

+29-29
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ absl_cc_library(
230230
${ABSL_DEFAULT_COPTS}
231231
DEPS
232232
absl::config
233-
gtest
233+
GTest::gtest
234234
TESTONLY
235235
)
236236

@@ -259,7 +259,7 @@ absl_cc_library(
259259
absl::meta
260260
absl::strings
261261
absl::utility
262-
gtest
262+
GTest::gtest
263263
TESTONLY
264264
)
265265

@@ -273,7 +273,7 @@ absl_cc_test(
273273
DEPS
274274
absl::exception_safety_testing
275275
absl::memory
276-
gtest_main
276+
GTest::gtest_main
277277
)
278278

279279
absl_cc_library(
@@ -300,8 +300,8 @@ absl_cc_test(
300300
absl::atomic_hook_test_helper
301301
absl::atomic_hook
302302
absl::core_headers
303-
gmock
304-
gtest_main
303+
GTest::gmock
304+
GTest::gtest_main
305305
)
306306

307307
absl_cc_test(
@@ -314,7 +314,7 @@ absl_cc_test(
314314
DEPS
315315
absl::base
316316
absl::core_headers
317-
gtest_main
317+
GTest::gtest_main
318318
)
319319

320320
absl_cc_test(
@@ -327,8 +327,8 @@ absl_cc_test(
327327
DEPS
328328
absl::errno_saver
329329
absl::strerror
330-
gmock
331-
gtest_main
330+
GTest::gmock
331+
GTest::gtest_main
332332
)
333333

334334
absl_cc_test(
@@ -342,7 +342,7 @@ absl_cc_test(
342342
absl::base
343343
absl::config
344344
absl::throw_delegate
345-
gtest_main
345+
GTest::gtest_main
346346
)
347347

348348
absl_cc_test(
@@ -357,7 +357,7 @@ absl_cc_test(
357357
${ABSL_TEST_COPTS}
358358
DEPS
359359
absl::base_internal
360-
gtest_main
360+
GTest::gtest_main
361361
)
362362

363363
absl_cc_test(
@@ -371,8 +371,8 @@ absl_cc_test(
371371
absl::base_internal
372372
absl::memory
373373
absl::strings
374-
gmock
375-
gtest_main
374+
GTest::gmock
375+
GTest::gtest_main
376376
)
377377

378378
absl_cc_library(
@@ -388,7 +388,7 @@ absl_cc_library(
388388
absl::base_internal
389389
absl::core_headers
390390
absl::synchronization
391-
gtest
391+
GTest::gtest
392392
TESTONLY
393393
)
394394

@@ -406,7 +406,7 @@ absl_cc_test(
406406
absl::config
407407
absl::core_headers
408408
absl::synchronization
409-
gtest_main
409+
GTest::gtest_main
410410
)
411411

412412
absl_cc_library(
@@ -435,7 +435,7 @@ absl_cc_test(
435435
absl::base
436436
absl::config
437437
absl::endian
438-
gtest_main
438+
GTest::gtest_main
439439
)
440440

441441
absl_cc_test(
@@ -448,7 +448,7 @@ absl_cc_test(
448448
DEPS
449449
absl::config
450450
absl::synchronization
451-
gtest_main
451+
GTest::gtest_main
452452
)
453453

454454
absl_cc_test(
@@ -462,7 +462,7 @@ absl_cc_test(
462462
absl::base
463463
absl::core_headers
464464
absl::synchronization
465-
gtest_main
465+
GTest::gtest_main
466466
)
467467

468468
absl_cc_test(
@@ -475,7 +475,7 @@ absl_cc_test(
475475
DEPS
476476
absl::raw_logging_internal
477477
absl::strings
478-
gtest_main
478+
GTest::gtest_main
479479
)
480480

481481
absl_cc_test(
@@ -488,7 +488,7 @@ absl_cc_test(
488488
DEPS
489489
absl::base
490490
absl::synchronization
491-
gtest_main
491+
GTest::gtest_main
492492
)
493493

494494
absl_cc_test(
@@ -516,7 +516,7 @@ absl_cc_test(
516516
absl::core_headers
517517
absl::synchronization
518518
Threads::Threads
519-
gtest_main
519+
GTest::gtest_main
520520
)
521521

522522
absl_cc_library(
@@ -543,7 +543,7 @@ absl_cc_test(
543543
DEPS
544544
absl::exponential_biased
545545
absl::strings
546-
gmock_main
546+
GTest::gmock_main
547547
)
548548

549549
absl_cc_library(
@@ -570,7 +570,7 @@ absl_cc_test(
570570
DEPS
571571
absl::core_headers
572572
absl::periodic_sampler
573-
gmock_main
573+
GTest::gmock_main
574574
)
575575

576576
absl_cc_library(
@@ -596,7 +596,7 @@ absl_cc_test(
596596
${ABSL_TEST_COPTS}
597597
DEPS
598598
absl::scoped_set_env
599-
gtest_main
599+
GTest::gtest_main
600600
)
601601

602602
absl_cc_test(
@@ -620,8 +620,8 @@ absl_cc_test(
620620
absl::flags_marshalling
621621
absl::log_severity
622622
absl::strings
623-
gmock
624-
gtest_main
623+
GTest::gmock
624+
GTest::gtest_main
625625
)
626626

627627
absl_cc_library(
@@ -651,8 +651,8 @@ absl_cc_test(
651651
DEPS
652652
absl::strerror
653653
absl::strings
654-
gmock
655-
gtest_main
654+
GTest::gmock
655+
GTest::gtest_main
656656
)
657657

658658
absl_cc_library(
@@ -677,7 +677,7 @@ absl_cc_test(
677677
${ABSL_TEST_COPTS}
678678
DEPS
679679
absl::fast_type_id
680-
gtest_main
680+
GTest::gtest_main
681681
)
682682

683683
absl_cc_test(
@@ -690,5 +690,5 @@ absl_cc_test(
690690
DEPS
691691
absl::core_headers
692692
absl::optional
693-
gtest_main
693+
GTest::gtest_main
694694
)

‎absl/cleanup/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,5 @@ absl_cc_test(
5151
absl::cleanup
5252
absl::config
5353
absl::utility
54-
gmock_main
54+
GTest::gmock_main
5555
)

0 commit comments

Comments
 (0)