Skip to content

Commit 24a98e4

Browse files
committed
ARROW-4599: [C++] Add support for system GFlags
This is needed to build tests with MinGW. Author: Kouhei Sutou <kou@clear-code.com> Author: Wes McKinney <wesm+git@apache.org> Closes #3675 from kou/cpp-system-gflags and squashes the following commits: 38f910f <Wes McKinney> Fix rebase artifact 2caf588 <Kouhei Sutou> Define GFLAGS_IS_A_DLL by target 0f43fc9 <Kouhei Sutou> Don't use vendored GFlags when GFLAGS_HOME is specified ca0f67c <Kouhei Sutou> Remove build directory entirely before new configuration build 9516d2f <Kouhei Sutou> GFLAGS_STATIC isn't defined by CONFIG mode 34cb1a6 <Kouhei Sutou> Add support for system GFlags
1 parent aeb40ed commit 24a98e4

10 files changed

Lines changed: 162 additions & 75 deletions

ci/appveyor-cpp-build.bat

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ if "%JOB%" == "Static_Crt_Build" (
4444
cmake --build . --config Debug || exit /B
4545
ctest --output-on-failure -j2 || exit /B
4646
popd
47+
rmdir /S /Q cpp\build-debug
4748

4849
mkdir cpp\build-release
4950
pushd cpp\build-release

ci/travis_before_script_cpp.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ CMAKE_COMMON_FLAGS="\
5353
-DARROW_NO_DEPRECATED_API=ON \
5454
-DARROW_EXTRA_ERROR_CONTEXT=ON"
5555
CMAKE_LINUX_FLAGS=""
56-
CMAKE_OSX_FLAGS=""
56+
CMAKE_OSX_FLAGS="\
57+
-DARROW_GFLAGS_USE_SHARED=OFF"
5758

5859
if [ "$ARROW_TRAVIS_USE_TOOLCHAIN" == "1" ]; then
5960
CMAKE_COMMON_FLAGS="${CMAKE_COMMON_FLAGS} -DARROW_JEMALLOC=ON"

cpp/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,8 @@ Note that this requires linking Boost statically" OFF)
198198
option(ARROW_PROTOBUF_USE_SHARED
199199
"Rely on Protocol Buffers shared libraries where relevant" OFF)
200200

201+
option(ARROW_GFLAGS_USE_SHARED "Rely on GFlags shared libraries where relevant" ON)
202+
201203
option(ARROW_WITH_BACKTRACE "Build with backtrace support" ON)
202204

203205
option(ARROW_USE_GLOG "Build libraries with glog support for pluggable logging" ON)

cpp/cmake_modules/BuildUtils.cmake

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
function(ADD_THIRDPARTY_LIB LIB_NAME)
1919
set(options)
2020
set(one_value_args SHARED_LIB STATIC_LIB)
21-
set(multi_value_args DEPS)
21+
set(multi_value_args DEPS INCLUDE_DIRECTORIES)
2222
cmake_parse_arguments(ARG "${options}" "${one_value_args}" "${multi_value_args}" ${ARGN})
2323
if(ARG_UNPARSED_ARGUMENTS)
2424
message(SEND_ERROR "Error: unrecognized arguments: ${ARG_UNPARSED_ARGUMENTS}")
@@ -38,6 +38,10 @@ function(ADD_THIRDPARTY_LIB LIB_NAME)
3838
PROPERTIES INTERFACE_LINK_LIBRARIES "${ARG_DEPS}")
3939
endif()
4040
message(STATUS "Added static library dependency ${AUG_LIB_NAME}: ${ARG_STATIC_LIB}")
41+
if(ARG_INCLUDE_DIRECTORIES)
42+
set_target_properties(${AUG_LIB_NAME}
43+
PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${ARG_INCLUDE_DIRECTORIES}")
44+
endif()
4145

4246
SET(AUG_LIB_NAME "${LIB_NAME}_shared")
4347
add_library(${AUG_LIB_NAME} SHARED IMPORTED)
@@ -55,6 +59,10 @@ function(ADD_THIRDPARTY_LIB LIB_NAME)
5559
PROPERTIES INTERFACE_LINK_LIBRARIES "${ARG_DEPS}")
5660
endif()
5761
message(STATUS "Added shared library dependency ${AUG_LIB_NAME}: ${ARG_SHARED_LIB}")
62+
if(ARG_INCLUDE_DIRECTORIES)
63+
set_target_properties(${AUG_LIB_NAME}
64+
PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${ARG_INCLUDE_DIRECTORIES}")
65+
endif()
5866
elseif(ARG_STATIC_LIB)
5967
SET(AUG_LIB_NAME "${LIB_NAME}_static")
6068
add_library(${AUG_LIB_NAME} STATIC IMPORTED)
@@ -65,6 +73,10 @@ function(ADD_THIRDPARTY_LIB LIB_NAME)
6573
PROPERTIES INTERFACE_LINK_LIBRARIES "${ARG_DEPS}")
6674
endif()
6775
message(STATUS "Added static library dependency ${AUG_LIB_NAME}: ${ARG_STATIC_LIB}")
76+
if(ARG_INCLUDE_DIRECTORIES)
77+
set_target_properties(${AUG_LIB_NAME}
78+
PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${ARG_INCLUDE_DIRECTORIES}")
79+
endif()
6880
elseif(ARG_SHARED_LIB)
6981
SET(AUG_LIB_NAME "${LIB_NAME}_shared")
7082
add_library(${AUG_LIB_NAME} SHARED IMPORTED)
@@ -82,6 +94,10 @@ function(ADD_THIRDPARTY_LIB LIB_NAME)
8294
set_target_properties(${AUG_LIB_NAME}
8395
PROPERTIES INTERFACE_LINK_LIBRARIES "${ARG_DEPS}")
8496
endif()
97+
if(ARG_INCLUDE_DIRECTORIES)
98+
set_target_properties(${AUG_LIB_NAME}
99+
PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${ARG_INCLUDE_DIRECTORIES}")
100+
endif()
85101
else()
86102
message(FATAL_ERROR "No static or shared library provided for ${LIB_NAME}")
87103
endif()

cpp/cmake_modules/FindGFlags.cmake

Lines changed: 105 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -22,58 +22,121 @@
2222
# GFLAGS_STATIC_LIB, path to libgflags static library
2323
# GFLAGS_FOUND, whether gflags has been found
2424

25-
if( NOT "${GFLAGS_HOME}" STREQUAL "")
26-
file( TO_CMAKE_PATH "${GFLAGS_HOME}" _native_path )
27-
list( APPEND _gflags_roots ${_native_path} )
28-
elseif ( GFlags_HOME )
29-
list( APPEND _gflags_roots ${GFlags_HOME} )
25+
find_package(gflags CONFIG)
26+
set(GFLAGS_FOUND ${gflags_FOUND})
27+
if(GFLAGS_FOUND)
28+
message(STATUS "GFlags include dir: ${GFLAGS_INCLUDE_DIR}")
29+
string(TOUPPER "${CMAKE_BUILD_TYPE}" _CONFIG)
30+
get_target_property(_GFLAGS_CONFIGURATIONS gflags IMPORTED_CONFIGURATIONS)
31+
foreach(_GFLAGS_CONFIG IN LISTS _GFLAGS_CONFIGURATIONS)
32+
if("${_GFLAGS_CONFIG}" STREQUAL "${_CONFIG}")
33+
set(_GFLAGS_TARGET_CONFIG "${_GFLAGS_CONFIG}")
34+
endif()
35+
endforeach()
36+
if(NOT _GFLAGS_TARGET_CONFIG)
37+
list(GET _GFLAGS_CONFIGURATIONS 0 _GFLAGS_TARGET_CONFIG)
38+
endif()
39+
if(GFLAGS_SHARED)
40+
get_target_property(GFLAGS_SHARED_LIB gflags_shared
41+
IMPORTED_LOCATION_${_GFLAGS_TARGET_CONFIG})
42+
message(STATUS "GFlags shared library: ${GFLAGS_SHARED_LIB}")
43+
endif()
44+
if(TARGET gflags_static)
45+
set(GFLAGS_STATIC TRUE)
46+
get_target_property(GFLAGS_STATIC_LIB gflags_static
47+
IMPORTED_LOCATION_${_GFLAGS_TARGET_CONFIG})
48+
message(STATUS "GFlags static library: ${GFLAGS_STATIC_LIB}")
49+
endif()
50+
unset(_CONFIG)
51+
unset(_GFLAGS_CONFIGURATIONS)
52+
unset(_GFLAGS_CONFIG)
53+
unset(_GFLAGS_TARGET_CONFIG)
54+
return()
3055
endif()
3156

32-
if (MSVC AND NOT DEFINED GFLAGS_MSVC_STATIC_LIB_SUFFIX)
57+
pkg_check_modules(GFLAGS gflags)
58+
if(GFLAGS_FOUND)
59+
set(GFLAGS_INCLUDE_DIR "${GFLAGS_INCLUDEDIR}")
60+
message(STATUS "GFlags include dir: ${GFLAGS_INCLUDE_DIR}")
61+
find_library(GFLAGS_SHARED_LIB
62+
NAMES "${GFLAGS_LIBRARIES}"
63+
PATHS "${GFLAGS_LIBDIR}"
64+
NO_DEFAULT_PATH)
65+
if(GFLAGS_SHARED_LIB)
66+
message(STATUS "GFlags shared library: ${GFLAGS_SHARED_LIB}")
67+
add_thirdparty_lib(gflags
68+
SHARED_LIB
69+
"${GFLAGS_SHARED_LIB}"
70+
INCLUDE_DIRECTORIES
71+
"${GFLAGS_INCLUDE_DIR}")
72+
target_compile_definitions(gflags_shared INTERFACE "GFLAGS_IS_A_DLL=1")
73+
set(GFLAGS_STATIC_LIB FLASE)
74+
return()
75+
else()
76+
set(GFLAGS_FOUND FALSE)
77+
endif()
78+
endif()
79+
80+
if(GFLAGS_HOME)
81+
set(GFlags_ROOT "${GFLAGS_HOME}")
82+
endif()
83+
if(CMAKE_VERSION VERSION_LESS 3.12)
84+
list(INSERT CMAKE_PREFIX_PATH 0 "${GFlags_ROOT}")
85+
endif()
86+
87+
if(MSVC AND NOT DEFINED GFLAGS_MSVC_STATIC_LIB_SUFFIX)
3388
set(GFLAGS_MSVC_STATIC_LIB_SUFFIX "_static")
3489
endif()
3590

3691
set(GFLAGS_STATIC_LIB_SUFFIX
37-
"${GFLAGS_MSVC_STATIC_LIB_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}")
92+
"${GFLAGS_MSVC_STATIC_LIB_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}")
3893

3994
set(GFLAGS_STATIC_LIB_NAME
40-
${CMAKE_STATIC_LIBRARY_PREFIX}gflags${GFLAGS_STATIC_LIB_SUFFIX})
95+
"${CMAKE_STATIC_LIBRARY_PREFIX}gflags${GFLAGS_STATIC_LIB_SUFFIX}")
4196

42-
message(STATUS "GFLAGS_HOME: ${GFLAGS_HOME}")
97+
find_path(GFLAGS_INCLUDE_DIR NAMES gflags/gflags.h)
98+
find_library(GFLAGS_SHARED_LIB NAMES gflags)
99+
find_library(GFLAGS_STATIC_LIB NAMES ${GFLAGS_STATIC_LIB_NAME})
43100

44-
if ( _gflags_roots )
45-
find_path(GFLAGS_INCLUDE_DIR NAMES gflags/gflags.h
46-
PATHS ${_gflags_roots}
47-
NO_DEFAULT_PATH
48-
PATH_SUFFIXES "include" )
49-
find_library(GFLAGS_STATIC_LIB NAMES ${GFLAGS_STATIC_LIB_NAME}
50-
PATHS ${_gflags_roots}
51-
NO_DEFAULT_PATH
52-
PATH_SUFFIXES "lib" )
53-
find_library(GFLAGS_SHARED_LIB NAMES gflags
54-
PATHS ${_gflags_roots}
55-
NO_DEFAULT_PATH
56-
PATH_SUFFIXES "lib" )
101+
if(GFLAGS_INCLUDE_DIR)
102+
message(STATUS "GFlags include dir: ${GFLAGS_INCLUDE_DIR}")
103+
if(GFLAGS_SHARED_LIB)
104+
message(STATUS "GFlags shared library: ${GFLAGS_SHARED_LIB}")
105+
set(GFLAGS_SHARED TRUE)
106+
else()
107+
set(GFLAGS_SHARED FALSE)
108+
endif()
109+
if(GFLAGS_STATIC_LIB)
110+
message(STATUS "GFlags static library: ${GFLAGS_STATIC_LIB}")
111+
set(GFLAGS_STATIC TRUE)
112+
else()
113+
set(GFLAGS_STATIC FALSE)
114+
endif()
115+
if(GFLAGS_SHARED OR GFLAGS_STATIC)
116+
set(GFLAGS_FOUND TRUE)
117+
if(MSVC)
118+
set(GFLAGS_MSVC_DEPS "shlwapi.lib")
119+
endif()
120+
add_thirdparty_lib(gflags
121+
SHARED_LIB
122+
"${GFLAGS_SHARED_LIB}"
123+
STATIC_LIB
124+
"${GFLAGS_STATIC_LIB}"
125+
INCLUDE_DIRECTORIES
126+
"${GFLAGS_INCLUDE_DIR}"
127+
DEPS
128+
"${GFLAGS_MSVC_DEPS}")
129+
if(GFLAGS_SHARED)
130+
target_compile_definitions(gflags_shared INTERFACE "GFLAGS_IS_A_DLL=1")
131+
endif()
132+
if(GFLAGS_STATIC)
133+
target_compile_definitions(gflags_static INTERFACE "GFLAGS_IS_A_DLL=0")
134+
endif()
135+
else()
136+
set(GFLAGS_FOUND FALSE)
137+
endif()
57138
else()
58-
find_path(GFLAGS_INCLUDE_DIR gflags/gflags.h
59-
# make sure we don't accidentally pick up a different version
60-
NO_CMAKE_SYSTEM_PATH
61-
NO_SYSTEM_ENVIRONMENT_PATH)
62-
find_library(GFLAGS_STATIC_LIB ${GFLAGS_STATIC_LIB_NAME}
63-
NO_CMAKE_SYSTEM_PATH
64-
NO_SYSTEM_ENVIRONMENT_PATH)
65-
find_library(GFLAGS_SHARED_LIB gflags
66-
NO_CMAKE_SYSTEM_PATH
67-
NO_SYSTEM_ENVIRONMENT_PATH)
68-
endif()
69-
70-
if (GFLAGS_INCLUDE_DIR AND GFLAGS_STATIC_LIB)
71-
set(GFLAGS_FOUND TRUE)
72-
else ()
73139
set(GFLAGS_FOUND FALSE)
74-
endif ()
140+
endif()
75141

76-
mark_as_advanced(
77-
GFLAGS_INCLUDE_DIR
78-
GFLAGS_STATIC_LIB
79-
)
142+
mark_as_advanced(GFLAGS_INCLUDE_DIR GFLAGS_SHARED_LIB GFLAGS_STATIC_LIB)

cpp/cmake_modules/ThirdpartyToolchain.cmake

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -605,7 +605,19 @@ endif()
605605

606606
if(ARROW_NEED_GFLAGS)
607607
# gflags (formerly Googleflags) command line parsing
608-
if("${GFLAGS_HOME}" STREQUAL "")
608+
find_package(GFlags)
609+
if(GFLAGS_FOUND)
610+
set(GFLAGS_VENDORED FALSE)
611+
get_filename_component(GFLAGS_HOME "${GFLAGS_INCLUDE_DIR}" DIRECTORY)
612+
if(ARROW_GFLAGS_USE_SHARED AND GFLAGS_SHARED)
613+
set(GFLAGS_LIBRARY gflags_shared)
614+
else()
615+
set(GFLAGS_LIBRARY gflags_static)
616+
endif()
617+
elseif(GFLAGS_HOME)
618+
message(FATAL_ERROR "No static or shared library provided for gflags: ${GFLAGS_HOME}")
619+
else()
620+
set(GFLAGS_VENDORED TRUE)
609621
set(GFLAGS_CMAKE_CXX_FLAGS ${EP_CXX_FLAGS})
610622

611623
set(GFLAGS_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/gflags_ep-prefix/src/gflags_ep")
@@ -634,24 +646,20 @@ if(ARROW_NEED_GFLAGS)
634646
CMAKE_ARGS ${GFLAGS_CMAKE_ARGS})
635647

636648
add_dependencies(toolchain gflags_ep)
637-
else()
638-
set(GFLAGS_VENDORED 0)
639-
find_package(GFlags REQUIRED)
640-
endif()
641649

642-
message(STATUS "GFlags include dir: ${GFLAGS_INCLUDE_DIR}")
643-
message(STATUS "GFlags static library: ${GFLAGS_STATIC_LIB}")
644-
include_directories(SYSTEM ${GFLAGS_INCLUDE_DIR})
645-
ADD_THIRDPARTY_LIB(gflags
646-
STATIC_LIB ${GFLAGS_STATIC_LIB})
647-
if(MSVC)
648-
set_target_properties(gflags_static
649-
PROPERTIES
650-
INTERFACE_LINK_LIBRARIES "shlwapi.lib")
651-
endif()
652-
653-
if(GFLAGS_VENDORED)
654-
add_dependencies(gflags_static gflags_ep)
650+
message(STATUS "GFlags include dir: ${GFLAGS_INCLUDE_DIR}")
651+
message(STATUS "GFlags static library: ${GFLAGS_STATIC_LIB}")
652+
include_directories(SYSTEM ${GFLAGS_INCLUDE_DIR})
653+
ADD_THIRDPARTY_LIB(gflags
654+
STATIC_LIB ${GFLAGS_STATIC_LIB})
655+
set(GFLAGS_LIBRARY gflags_static)
656+
target_compile_definitions(${GFLAGS_LIBRARY} INTERFACE "GFLAGS_IS_A_DLL=0")
657+
if(MSVC)
658+
set_target_properties(${GFLAGS_LIBRARY}
659+
PROPERTIES
660+
INTERFACE_LINK_LIBRARIES "shlwapi.lib")
661+
endif()
662+
add_dependencies(${GFLAGS_LIBRARY} gflags_ep)
655663
endif()
656664
endif()
657665

@@ -1757,6 +1765,6 @@ if (ARROW_USE_GLOG)
17571765
else()
17581766
ADD_THIRDPARTY_LIB(glog
17591767
STATIC_LIB ${GLOG_STATIC_LIB}
1760-
DEPS gflags_static)
1768+
DEPS ${GFLAGS_LIBRARY})
17611769
endif()
17621770
endif()

cpp/src/arrow/flight/CMakeLists.txt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -112,16 +112,16 @@ add_arrow_test(flight-test
112112
# Build test server for unit tests or benchmarks
113113
if(ARROW_BUILD_TESTS OR ARROW_BUILD_BENCHMARKS)
114114
add_executable(flight-test-server test-server.cc)
115-
target_link_libraries(flight-test-server ${ARROW_FLIGHT_TEST_LINK_LIBS} gflags_static
116-
${GTEST_LIBRARY})
115+
target_link_libraries(flight-test-server ${ARROW_FLIGHT_TEST_LINK_LIBS}
116+
${GFLAGS_LIBRARY} ${GTEST_LIBRARY})
117117

118118
add_executable(flight-test-integration-server test-integration-server.cc)
119119
target_link_libraries(flight-test-integration-server ${ARROW_FLIGHT_TEST_LINK_LIBS}
120-
gflags_static gtest_static)
120+
${GFLAGS_LIBRARY} ${GTEST_LIBRARY})
121121

122122
add_executable(flight-test-integration-client test-integration-client.cc)
123123
target_link_libraries(flight-test-integration-client ${ARROW_FLIGHT_TEST_LINK_LIBS}
124-
gflags_static gtest_static)
124+
${GFLAGS_LIBRARY} ${GTEST_LIBRARY})
125125

126126
# This is needed for the unit tests
127127
if(ARROW_BUILD_TESTS)
@@ -144,15 +144,15 @@ if(ARROW_BUILD_BENCHMARKS)
144144
arrow_flight_shared
145145
arrow_flight_testing_shared
146146
${ARROW_FLIGHT_TEST_LINK_LIBS}
147-
gflags_static
147+
${GFLAGS_LIBRARY}
148148
${GTEST_LIBRARY})
149149

150150
add_executable(flight-benchmark flight-benchmark.cc perf.pb.cc)
151151
target_link_libraries(flight-benchmark
152152
arrow_flight_static
153153
arrow_testing_static
154154
${ARROW_FLIGHT_TEST_LINK_LIBS}
155-
gflags_static
155+
${GFLAGS_LIBRARY}
156156
${GTEST_LIBRARY})
157157

158158
add_dependencies(flight-benchmark flight-perf-server)

cpp/src/arrow/ipc/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ add_arrow_test(json-simple-test PREFIX "arrow-ipc")
2828
add_arrow_test(json-test PREFIX "arrow-ipc")
2929

3030
if(NOT ARROW_BOOST_HEADER_ONLY)
31-
add_arrow_test(json-integration-test EXTRA_LINK_LIBS gflags_static)
31+
add_arrow_test(json-integration-test EXTRA_LINK_LIBS ${GFLAGS_LIBRARY})
3232

3333
# Test is being built
3434
if(TARGET arrow-json-integration-test)

cpp/src/arrow/ipc/json-integration-test.cc

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,6 @@
1515
// specific language governing permissions and limitations
1616
// under the License.
1717

18-
// ARROW-3837: Depending on how gflags was built, this might be set to
19-
// 1 or 0 by default, making it so that we cannot statically link
20-
// gflags on Windows if it is set to 1
21-
#define GFLAGS_IS_A_DLL 0
22-
2318
#include <cstdint>
2419
#include <cstdio>
2520
#include <cstring>

run-cmake-format.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
patterns = [
2727
'cpp/CMakeLists.txt',
28+
'cpp/cmake_modules/FindGFlags.cmake',
2829
'cpp/src/**/CMakeLists.txt',
2930
'cpp/tools/**/CMakeLists.txt',
3031
'java/gandiva/CMakeLists.txt',

0 commit comments

Comments
 (0)