Skip to content

Commit 3815328

Browse files
committed
GH-34813: [C++] Improve GoogleTest detection
If incompatible GoogleTest is detected, we can fallback to bundled GoogleTest automatically.
1 parent 6530b01 commit 3815328

12 files changed

Lines changed: 94 additions & 45 deletions

File tree

ci/docker/alpine-linux-3.16-cpp.dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ RUN apk add \
3737
glog-dev \
3838
gmock \
3939
grpc-dev \
40+
gtest-dev \
4041
libxml2-dev \
4142
llvm13-dev \
4243
llvm13-static \
@@ -95,7 +96,6 @@ ENV ARROW_ACERO=ON \
9596
ARROW_WITH_ZSTD=ON \
9697
AWSSDK_SOURCE=BUNDLED \
9798
google_cloud_cpp_storage_SOURCE=BUNDLED \
98-
GTest_SOURCE=BUNDLED \
9999
ORC_SOURCE=BUNDLED \
100100
PATH=/usr/lib/ccache/:$PATH \
101101
xsimd_SOURCE=BUNDLED

cpp/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -839,8 +839,8 @@ if(NOT MSVC_TOOLCHAIN)
839839
list(APPEND ARROW_SHARED_LINK_LIBS ${CMAKE_DL_LIBS})
840840
endif()
841841
842-
set(ARROW_TEST_LINK_TOOLCHAIN arrow::flatbuffers GTest::gtest_main GTest::gtest
843-
GTest::gmock)
842+
set(ARROW_TEST_LINK_TOOLCHAIN arrow::flatbuffers ${ARROW_GTEST_GTEST_MAIN}
843+
${ARROW_GTEST_GTEST} ${ARROW_GTEST_GMOCK})
844844
845845
if(ARROW_BUILD_TESTS)
846846
add_dependencies(arrow_test_dependencies ${ARROW_TEST_LINK_TOOLCHAIN})
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# Licensed to the Apache Software Foundation (ASF) under one
2+
# or more contributor license agreements. See the NOTICE file
3+
# distributed with this work for additional information
4+
# regarding copyright ownership. The ASF licenses this file
5+
# to you under the Apache License, Version 2.0 (the
6+
# "License"); you may not use this file except in compliance
7+
# with the License. You may obtain a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing,
12+
# software distributed under the License is distributed on an
13+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14+
# KIND, either express or implied. See the License for the
15+
# specific language governing permissions and limitations
16+
# under the License.
17+
18+
if(GTestAlt_FOUND)
19+
return()
20+
endif()
21+
22+
set(find_package_args)
23+
if(GTestAlt_FIND_VERSION)
24+
list(APPEND find_package_args ${GTestAlt_FIND_VERSION})
25+
endif()
26+
if(GTestAlt_FIND_QUIETLY)
27+
list(APPEND find_package_args QUIET)
28+
endif()
29+
if(CMAKE_VERSION VERSION_LESS 3.23)
30+
list(APPEND find_package_args CONFIG)
31+
endif()
32+
# We can't find shred library version of GoogleTest on Windows with
33+
# Conda's gtest package because it doesn't provide GTestConfig.cmake
34+
# provided by GoogleTest and CMake's built-in FindGTtest.cmake
35+
# doesn't support gtest_dll.dll.
36+
find_package(GTest ${find_package_args})
37+
38+
set(GTestAlt_FOUND ${GTest_FOUND})
39+
if(GTestAlt_FOUND)
40+
set(KEEP_CMAKE_TRY_COMPILE_TARGET_TYPE ${CMAKE_TRY_COMPILE_TARGET_TYPE})
41+
set(CMAKE_TRY_COMPILE_TARGET_TYPE EXECUTABLE)
42+
set(GTestAlt_CXX_STANDARD_TEST_SOURCE
43+
"${CMAKE_CURRENT_BINARY_DIR}/gtest_cxx_standard_test.cc")
44+
file(WRITE ${GTestAlt_CXX_STANDARD_TEST_SOURCE}
45+
"
46+
#include <string_view>
47+
#include <gtest/gtest.h>
48+
49+
TEST(CXX_STANDARD, MatcherStringView) {
50+
testing::Matcher matcher(std::string_view(\"hello\"));
51+
}
52+
")
53+
try_compile(GTestAlt_CXX_STANDARD_AVAILABLE ${CMAKE_CURRENT_BINARY_DIR}
54+
SOURCES ${GTestAlt_CXX_STANDARD_TEST_SOURCE}
55+
LINK_LIBRARIES GTest::gtest_main)
56+
set(CMAKE_TRY_COMPILE_TARGET_TYPE ${KEEP_CMAKE_TRY_COMPILE_TARGET_TYPE})
57+
if(NOT GTestAlt_CXX_STANDARD_AVAILABLE)
58+
message(STATUS "GTest can't be used with ${CMAKE_CXX_STANDARD}")
59+
set(GTestAlt_FOUND FALSE)
60+
endif()
61+
endif()

cpp/cmake_modules/ThirdpartyToolchain.cmake

Lines changed: 18 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2190,54 +2190,38 @@ macro(build_gtest)
21902190
# The include directory must exist before it is referenced by a target.
21912191
file(MAKE_DIRECTORY "${GTEST_INCLUDE_DIR}")
21922192

2193-
add_library(GTest::gtest SHARED IMPORTED)
2194-
set_target_properties(GTest::gtest
2193+
add_library(arrow::GTest::gtest SHARED IMPORTED)
2194+
set_target_properties(arrow::GTest::gtest
21952195
PROPERTIES ${_GTEST_IMPORTED_TYPE} "${GTEST_SHARED_LIB}"
21962196
INTERFACE_COMPILE_DEFINITIONS
21972197
"GTEST_LINKED_AS_SHARED_LIBRARY=1"
21982198
INTERFACE_INCLUDE_DIRECTORIES "${GTEST_INCLUDE_DIR}")
21992199

2200-
add_library(GTest::gtest_main SHARED IMPORTED)
2201-
set_target_properties(GTest::gtest_main
2200+
add_library(arrow::GTest::gtest_main SHARED IMPORTED)
2201+
set_target_properties(arrow::GTest::gtest_main
22022202
PROPERTIES ${_GTEST_IMPORTED_TYPE} "${GTEST_MAIN_SHARED_LIB}"
22032203
INTERFACE_INCLUDE_DIRECTORIES "${GTEST_INCLUDE_DIR}")
22042204

2205-
add_library(GTest::gmock SHARED IMPORTED)
2206-
set_target_properties(GTest::gmock
2205+
add_library(arrow::GTest::gmock SHARED IMPORTED)
2206+
set_target_properties(arrow::GTest::gmock
22072207
PROPERTIES ${_GTEST_IMPORTED_TYPE} "${GMOCK_SHARED_LIB}"
22082208
INTERFACE_COMPILE_DEFINITIONS
22092209
"GMOCK_LINKED_AS_SHARED_LIBRARY=1"
22102210
INTERFACE_INCLUDE_DIRECTORIES "${GTEST_INCLUDE_DIR}")
22112211
add_dependencies(toolchain-tests googletest_ep)
2212-
add_dependencies(GTest::gtest googletest_ep)
2213-
add_dependencies(GTest::gtest_main googletest_ep)
2214-
add_dependencies(GTest::gmock googletest_ep)
2212+
add_dependencies(arrow::GTest::gtest googletest_ep)
2213+
add_dependencies(arrow::GTest::gtest_main googletest_ep)
2214+
add_dependencies(arrow::GTest::gmock googletest_ep)
22152215
endmacro()
22162216

22172217
if(ARROW_TESTING)
2218-
if(CMAKE_VERSION VERSION_LESS 3.23)
2219-
set(GTEST_USE_CONFIG TRUE)
2220-
else()
2221-
set(GTEST_USE_CONFIG FALSE)
2222-
endif()
2223-
# We can't find shred library version of GoogleTest on Windows with
2224-
# Conda's gtest package because it doesn't provide GTestConfig.cmake
2225-
# provided by GoogleTest and CMake's built-in FindGTtest.cmake
2226-
# doesn't support gtest_dll.dll.
22272218
resolve_dependency(GTest
2219+
HAVE_ALT
2220+
TRUE
22282221
REQUIRED_VERSION
2229-
1.10.0
2230-
USE_CONFIG
2231-
${GTEST_USE_CONFIG})
2222+
1.10.0)
22322223

22332224
if(GTest_SOURCE STREQUAL "SYSTEM")
2234-
get_target_property(gtest_cxx_standard GTest::gtest INTERFACE_COMPILE_FEATURES)
2235-
if((${gtest_cxx_standard} STREQUAL "cxx_std_11") OR (${gtest_cxx_standard} STREQUAL
2236-
"cxx_std_14"))
2237-
message(FATAL_ERROR "System GTest is built with a C++ standard lower than 17. Use bundled GTest via passing in CMake flag
2238-
-DGTest_SOURCE=\"BUNDLED\"")
2239-
endif()
2240-
22412225
find_package(PkgConfig QUIET)
22422226
pkg_check_modules(gtest_PC
22432227
gtest
@@ -2254,10 +2238,16 @@ if(ARROW_TESTING)
22542238

22552239
string(APPEND ARROW_TESTING_PC_LIBS " $<TARGET_FILE:GTest::gtest>")
22562240
endif()
2241+
set(ARROW_GTEST_GMOCK GTest::gmock)
2242+
set(ARROW_GTEST_GTEST GTest::gtest)
2243+
set(ARROW_GTEST_GTEST_MAIN GTest::gtest_main)
22572244
else()
22582245
# TODO: How to solve BUNDLED case? Do we install bundled GoogleTest?
22592246
# string(APPEND ARROW_TESTING_PC_CFLAGS " -I${GTEST_INCLUDE_DIR}")
22602247
# string(APPEND ARROW_TESTING_PC_LIBS " -lgtest")
2248+
set(ARROW_GTEST_GMOCK arrow::GTest::gmock)
2249+
set(ARROW_GTEST_GTEST arrow::GTest::gtest)
2250+
set(ARROW_GTEST_GTEST_MAIN arrow::GTest::gtest_main)
22612251
endif()
22622252
endif()
22632253

cpp/src/arrow/CMakeLists.txt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -717,18 +717,16 @@ if(ARROW_TESTING)
717717
arrow::flatbuffers
718718
rapidjson::rapidjson
719719
arrow_shared
720-
GTest::gtest
720+
${ARROW_GTEST_GTEST}
721721
SHARED_INSTALL_INTERFACE_LIBS
722722
Arrow::arrow_shared
723-
GTest::gtest
724723
STATIC_LINK_LIBS
725724
arrow::flatbuffers
726725
rapidjson::rapidjson
727726
arrow_static
728-
GTest::gtest
727+
${ARROW_GTEST_GTEST}
729728
STATIC_INSTALL_INTERFACE_LIBS
730-
Arrow::arrow_static
731-
GTest::gtest)
729+
Arrow::arrow_static)
732730

733731
add_custom_target(arrow_testing)
734732
add_dependencies(arrow_testing ${ARROW_TESTING_LIBRARIES})

cpp/src/arrow/adapters/orc/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ else()
3333
endif()
3434

3535
set(ORC_STATIC_TEST_LINK_LIBS orc::liborc ${ARROW_LIBRARIES_FOR_STATIC_TESTS}
36-
GTest::gtest_main GTest::gtest)
36+
${ARROW_GTEST_GTEST_MAIN} ${ARROW_GTEST_GTEST})
3737

3838
add_arrow_test(adapter_test
3939
PREFIX

cpp/src/arrow/filesystem/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ if(ARROW_S3)
8181
if(ARROW_BUILD_TESTS)
8282
add_executable(arrow-s3fs-narrative-test s3fs_narrative_test.cc)
8383
target_link_libraries(arrow-s3fs-narrative-test ${ARROW_TEST_LINK_LIBS}
84-
${GFLAGS_LIBRARIES} GTest::gtest)
84+
${GFLAGS_LIBRARIES} ${ARROW_GTEST_GTEST})
8585
add_dependencies(arrow-tests arrow-s3fs-narrative-test)
8686
endif()
8787

cpp/src/arrow/flight/CMakeLists.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ list(APPEND
6767
Boost::headers
6868
Boost::filesystem
6969
Boost::system
70-
GTest::gtest
71-
GTest::gmock)
70+
${ARROW_GTEST_GTEST}
71+
${ARROW_GTEST_GMOCK})
7272
list(APPEND ARROW_FLIGHT_TEST_LINK_LIBS gRPC::grpc++)
7373

7474
# TODO(wesm): Protobuf shared vs static linking
@@ -308,7 +308,7 @@ if(ARROW_TESTING)
308308
test_definitions.cc
309309
test_util.cc
310310
DEPENDENCIES
311-
GTest::gtest
311+
${ARROW_GTEST_GTEST}
312312
flight_grpc_gen
313313
arrow_dependencies
314314
SHARED_LINK_LIBS

cpp/src/arrow/flight/integration_tests/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ list(APPEND
2626
ARROW_FLIGHT_INTEGRATION_TEST_LINK_LIBS
2727
${ARROW_FLIGHT_TEST_LINK_LIBS}
2828
${GFLAGS_LIBRARIES}
29-
GTest::gtest)
29+
${ARROW_GTEST_GTEST})
3030

3131
add_executable(flight-test-integration-server test_integration_server.cc
3232
test_integration.cc)

cpp/src/arrow/gpu/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ endif()
9898
if(ARROW_BUILD_BENCHMARKS)
9999
add_arrow_benchmark(cuda_benchmark PREFIX "arrow-gpu")
100100
target_link_libraries(arrow-gpu-cuda-benchmark
101-
PUBLIC ${ARROW_CUDA_LIBRARY} GTest::gtest
101+
PUBLIC ${ARROW_CUDA_LIBRARY} ${ARROW_GTEST_GTEST}
102102
${ARROW_BENCHMARK_LINK_LIBS})
103103
add_dependencies(arrow_cuda-benchmarks arrow-gpu-cuda-benchmark)
104104
endif()

0 commit comments

Comments
 (0)