]> git.proxmox.com Git - ceph.git/blame - ceph/src/arrow/cpp/cmake_modules/ThirdpartyToolchain.cmake
import quincy 17.2.0
[ceph.git] / ceph / src / arrow / cpp / cmake_modules / ThirdpartyToolchain.cmake
CommitLineData
1d09f67e
TL
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
18include(ProcessorCount)
19processorcount(NPROC)
20
21add_custom_target(rapidjson)
22add_custom_target(toolchain)
23add_custom_target(toolchain-benchmarks)
24add_custom_target(toolchain-tests)
25
26# Accumulate all bundled targets and we will splice them together later as
27# libarrow_dependencies.a so that third party libraries have something usable
28# to create statically-linked builds with some BUNDLED dependencies, including
29# allocators like jemalloc and mimalloc
30set(ARROW_BUNDLED_STATIC_LIBS)
31
32# Accumulate all system dependencies to provide suitable static link
33# parameters to the third party libraries.
34set(ARROW_SYSTEM_DEPENDENCIES)
35
36# ----------------------------------------------------------------------
37# Toolchain linkage options
38
39set(ARROW_RE2_LINKAGE
40 "static"
41 CACHE STRING "How to link the re2 library. static|shared (default static)")
42
43if(ARROW_PROTOBUF_USE_SHARED)
44 set(Protobuf_USE_STATIC_LIBS OFF)
45else()
46 set(Protobuf_USE_STATIC_LIBS ON)
47endif()
48
49# ----------------------------------------------------------------------
50# Resolve the dependencies
51
52set(ARROW_THIRDPARTY_DEPENDENCIES
53 AWSSDK
54 benchmark
55 Boost
56 Brotli
57 BZip2
58 c-ares
59 gflags
60 GLOG
61 google_cloud_cpp_storage
62 gRPC
63 GTest
64 LLVM
65 Lz4
66 ORC
67 re2
68 Protobuf
69 RapidJSON
70 Snappy
71 Thrift
72 utf8proc
73 xsimd
74 ZLIB
75 zstd)
76
77# TODO(wesm): External GTest shared libraries are not currently
78# supported when building with MSVC because of the way that
79# conda-forge packages have 4 variants of the libraries packaged
80# together
81if(MSVC AND "${GTest_SOURCE}" STREQUAL "")
82 set(GTest_SOURCE "BUNDLED")
83endif()
84
85# For backward compatibility. We use "BOOST_SOURCE" if "Boost_SOURCE"
86# isn't specified and "BOOST_SOURCE" is specified.
87# We renamed "BOOST" dependency name to "Boost" in 3.0.0 because
88# upstreams (CMake and Boost) use "Boost" not "BOOST" as package name.
89if("${Boost_SOURCE}" STREQUAL "" AND NOT "${BOOST_SOURCE}" STREQUAL "")
90 set(Boost_SOURCE ${BOOST_SOURCE})
91endif()
92
93# For backward compatibility. We use "RE2_SOURCE" if "re2_SOURCE"
94# isn't specified and "RE2_SOURCE" is specified.
95# We renamed "RE2" dependency name to "re2" in 3.0.0 because
96# upstream uses "re2" not "RE2" as package name.
97if("${re2_SOURCE}" STREQUAL "" AND NOT "${RE2_SOURCE}" STREQUAL "")
98 set(re2_SOURCE ${RE2_SOURCE})
99endif()
100
101message(STATUS "Using ${ARROW_DEPENDENCY_SOURCE} approach to find dependencies")
102
103if(ARROW_DEPENDENCY_SOURCE STREQUAL "CONDA")
104 if(MSVC)
105 set(ARROW_PACKAGE_PREFIX "$ENV{CONDA_PREFIX}/Library")
106 else()
107 set(ARROW_PACKAGE_PREFIX $ENV{CONDA_PREFIX})
108 endif()
109 set(ARROW_ACTUAL_DEPENDENCY_SOURCE "SYSTEM")
110 message(STATUS "Using CONDA_PREFIX for ARROW_PACKAGE_PREFIX: ${ARROW_PACKAGE_PREFIX}")
111else()
112 set(ARROW_ACTUAL_DEPENDENCY_SOURCE "${ARROW_DEPENDENCY_SOURCE}")
113endif()
114
115if(ARROW_PACKAGE_PREFIX)
116 message(STATUS "Setting (unset) dependency *_ROOT variables: ${ARROW_PACKAGE_PREFIX}")
117 set(ENV{PKG_CONFIG_PATH} "${ARROW_PACKAGE_PREFIX}/lib/pkgconfig/")
118
119 if(NOT ENV{BOOST_ROOT})
120 set(ENV{BOOST_ROOT} ${ARROW_PACKAGE_PREFIX})
121 endif()
122 if(NOT ENV{Boost_ROOT})
123 set(ENV{Boost_ROOT} ${ARROW_PACKAGE_PREFIX})
124 endif()
125endif()
126
127# For each dependency, set dependency source to global default, if unset
128foreach(DEPENDENCY ${ARROW_THIRDPARTY_DEPENDENCIES})
129 if("${${DEPENDENCY}_SOURCE}" STREQUAL "")
130 set(${DEPENDENCY}_SOURCE ${ARROW_ACTUAL_DEPENDENCY_SOURCE})
131 # If no ROOT was supplied and we have a global prefix, use it
132 if(NOT ${DEPENDENCY}_ROOT AND ARROW_PACKAGE_PREFIX)
133 set(${DEPENDENCY}_ROOT ${ARROW_PACKAGE_PREFIX})
134 endif()
135 endif()
136endforeach()
137
138macro(build_dependency DEPENDENCY_NAME)
139 if("${DEPENDENCY_NAME}" STREQUAL "AWSSDK")
140 build_awssdk()
141 elseif("${DEPENDENCY_NAME}" STREQUAL "benchmark")
142 build_benchmark()
143 elseif("${DEPENDENCY_NAME}" STREQUAL "Boost")
144 build_boost()
145 elseif("${DEPENDENCY_NAME}" STREQUAL "Brotli")
146 build_brotli()
147 elseif("${DEPENDENCY_NAME}" STREQUAL "BZip2")
148 build_bzip2()
149 elseif("${DEPENDENCY_NAME}" STREQUAL "c-ares")
150 build_cares()
151 elseif("${DEPENDENCY_NAME}" STREQUAL "gflags")
152 build_gflags()
153 elseif("${DEPENDENCY_NAME}" STREQUAL "GLOG")
154 build_glog()
155 elseif("${DEPENDENCY_NAME}" STREQUAL "google_cloud_cpp_storage")
156 build_google_cloud_cpp_storage()
157 elseif("${DEPENDENCY_NAME}" STREQUAL "gRPC")
158 build_grpc()
159 elseif("${DEPENDENCY_NAME}" STREQUAL "GTest")
160 build_gtest()
161 elseif("${DEPENDENCY_NAME}" STREQUAL "Lz4")
162 build_lz4()
163 elseif("${DEPENDENCY_NAME}" STREQUAL "ORC")
164 build_orc()
165 elseif("${DEPENDENCY_NAME}" STREQUAL "Protobuf")
166 build_protobuf()
167 elseif("${DEPENDENCY_NAME}" STREQUAL "RapidJSON")
168 build_rapidjson()
169 elseif("${DEPENDENCY_NAME}" STREQUAL "re2")
170 build_re2()
171 elseif("${DEPENDENCY_NAME}" STREQUAL "Snappy")
172 build_snappy()
173 elseif("${DEPENDENCY_NAME}" STREQUAL "Thrift")
174 build_thrift()
175 elseif("${DEPENDENCY_NAME}" STREQUAL "utf8proc")
176 build_utf8proc()
177 elseif("${DEPENDENCY_NAME}" STREQUAL "xsimd")
178 build_xsimd()
179 elseif("${DEPENDENCY_NAME}" STREQUAL "ZLIB")
180 build_zlib()
181 elseif("${DEPENDENCY_NAME}" STREQUAL "zstd")
182 build_zstd()
183 else()
184 message(FATAL_ERROR "Unknown thirdparty dependency to build: ${DEPENDENCY_NAME}")
185 endif()
186endmacro()
187
188# Find modules are needed by the consumer in case of a static build, or if the
189# linkage is PUBLIC or INTERFACE.
190macro(provide_find_module PACKAGE_NAME)
191 set(module_ "${CMAKE_SOURCE_DIR}/cmake_modules/Find${PACKAGE_NAME}.cmake")
192 if(EXISTS "${module_}")
193 message(STATUS "Providing CMake module for ${PACKAGE_NAME}")
194 install(FILES "${module_}" DESTINATION "${ARROW_CMAKE_INSTALL_DIR}")
195 endif()
196 unset(module_)
197endmacro()
198
199macro(resolve_dependency DEPENDENCY_NAME)
200 set(options)
201 set(one_value_args HAVE_ALT IS_RUNTIME_DEPENDENCY REQUIRED_VERSION USE_CONFIG)
202 set(multi_value_args PC_PACKAGE_NAMES)
203 cmake_parse_arguments(ARG
204 "${options}"
205 "${one_value_args}"
206 "${multi_value_args}"
207 ${ARGN})
208 if(ARG_UNPARSED_ARGUMENTS)
209 message(SEND_ERROR "Error: unrecognized arguments: ${ARG_UNPARSED_ARGUMENTS}")
210 endif()
211 if("${ARG_IS_RUNTIME_DEPENDENCY}" STREQUAL "")
212 set(ARG_IS_RUNTIME_DEPENDENCY TRUE)
213 endif()
214
215 if(ARG_HAVE_ALT)
216 set(PACKAGE_NAME "${DEPENDENCY_NAME}Alt")
217 else()
218 set(PACKAGE_NAME ${DEPENDENCY_NAME})
219 endif()
220 set(FIND_PACKAGE_ARGUMENTS ${PACKAGE_NAME})
221 if(ARG_REQUIRED_VERSION)
222 list(APPEND FIND_PACKAGE_ARGUMENTS ${ARG_REQUIRED_VERSION})
223 endif()
224 if(ARG_USE_CONFIG)
225 list(APPEND FIND_PACKAGE_ARGUMENTS CONFIG)
226 endif()
227 if(${DEPENDENCY_NAME}_SOURCE STREQUAL "AUTO")
228 find_package(${FIND_PACKAGE_ARGUMENTS})
229 if(${${PACKAGE_NAME}_FOUND})
230 set(${DEPENDENCY_NAME}_SOURCE "SYSTEM")
231 else()
232 build_dependency(${DEPENDENCY_NAME})
233 set(${DEPENDENCY_NAME}_SOURCE "BUNDLED")
234 endif()
235 elseif(${DEPENDENCY_NAME}_SOURCE STREQUAL "BUNDLED")
236 build_dependency(${DEPENDENCY_NAME})
237 elseif(${DEPENDENCY_NAME}_SOURCE STREQUAL "SYSTEM")
238 find_package(${FIND_PACKAGE_ARGUMENTS} REQUIRED)
239 endif()
240 if(${DEPENDENCY_NAME}_SOURCE STREQUAL "SYSTEM" AND ARG_IS_RUNTIME_DEPENDENCY)
241 provide_find_module(${PACKAGE_NAME})
242 list(APPEND ARROW_SYSTEM_DEPENDENCIES ${PACKAGE_NAME})
243 find_package(PkgConfig QUIET)
244 foreach(ARG_PC_PACKAGE_NAME ${ARG_PC_PACKAGE_NAMES})
245 pkg_check_modules(${ARG_PC_PACKAGE_NAME}_PC
246 ${ARG_PC_PACKAGE_NAME}
247 NO_CMAKE_PATH
248 NO_CMAKE_ENVIRONMENT_PATH
249 QUIET)
250 if(${${ARG_PC_PACKAGE_NAME}_PC_FOUND})
251 string(APPEND ARROW_PC_REQUIRES_PRIVATE " ${ARG_PC_PACKAGE_NAME}")
252 endif()
253 endforeach()
254 endif()
255endmacro()
256
257# ----------------------------------------------------------------------
258# Thirdparty versions, environment variables, source URLs
259
260set(THIRDPARTY_DIR "${arrow_SOURCE_DIR}/thirdparty")
261
262# Include vendored Flatbuffers
263include_directories(SYSTEM "${THIRDPARTY_DIR}/flatbuffers/include")
264
265# ----------------------------------------------------------------------
266# Some EP's require other EP's
267
268if(PARQUET_REQUIRE_ENCRYPTION)
269 set(ARROW_JSON ON)
270endif()
271
272if(ARROW_THRIFT)
273 set(ARROW_WITH_ZLIB ON)
274endif()
275
276if(ARROW_HIVESERVER2 OR ARROW_PARQUET)
277 set(ARROW_WITH_THRIFT ON)
278 if(ARROW_HIVESERVER2)
279 set(ARROW_THRIFT_REQUIRED_COMPONENTS COMPILER)
280 else()
281 set(ARROW_THRIFT_REQUIRED_COMPONENTS)
282 endif()
283else()
284 set(ARROW_WITH_THRIFT OFF)
285endif()
286
287if(ARROW_FLIGHT)
288 set(ARROW_WITH_GRPC ON)
289 # gRPC requires zlib
290 set(ARROW_WITH_ZLIB ON)
291endif()
292
293if(ARROW_GCS)
294 set(ARROW_WITH_GOOGLE_CLOUD_CPP ON)
295endif()
296
297if(ARROW_JSON)
298 set(ARROW_WITH_RAPIDJSON ON)
299endif()
300
301if(ARROW_ORC
302 OR ARROW_FLIGHT
303 OR ARROW_GANDIVA)
304 set(ARROW_WITH_PROTOBUF ON)
305endif()
306
307if(ARROW_S3)
308 set(ARROW_WITH_ZLIB ON)
309endif()
310
311if((NOT ARROW_COMPUTE) AND (NOT ARROW_GANDIVA))
312 set(ARROW_WITH_UTF8PROC OFF)
313endif()
314
315if((NOT ARROW_COMPUTE)
316 AND (NOT ARROW_GANDIVA)
317 AND (NOT ARROW_WITH_GRPC))
318 set(ARROW_WITH_RE2 OFF)
319endif()
320
321# ----------------------------------------------------------------------
322# Versions and URLs for toolchain builds, which also can be used to configure
323# offline builds
324# Note: We should not use the Apache dist server for build dependencies
325
326macro(set_urls URLS)
327 set(${URLS} ${ARGN})
328 if(CMAKE_VERSION VERSION_LESS 3.7)
329 # ExternalProject doesn't support backup URLs;
330 # Feature only available starting in 3.7
331 list(GET ${URLS} 0 ${URLS})
332 endif()
333endmacro()
334
335# Read toolchain versions from cpp/thirdparty/versions.txt
336file(STRINGS "${THIRDPARTY_DIR}/versions.txt" TOOLCHAIN_VERSIONS_TXT)
337foreach(_VERSION_ENTRY ${TOOLCHAIN_VERSIONS_TXT})
338 # Exclude comments
339 if(NOT ((_VERSION_ENTRY MATCHES "^[^#][A-Za-z0-9-_]+_VERSION=")
340 OR (_VERSION_ENTRY MATCHES "^[^#][A-Za-z0-9-_]+_CHECKSUM=")))
341 continue()
342 endif()
343
344 string(REGEX MATCH "^[^=]*" _VARIABLE_NAME ${_VERSION_ENTRY})
345 string(REPLACE "${_VARIABLE_NAME}=" "" _VARIABLE_VALUE ${_VERSION_ENTRY})
346
347 # Skip blank or malformed lines
348 if(_VARIABLE_VALUE STREQUAL "")
349 continue()
350 endif()
351
352 # For debugging
353 message(STATUS "${_VARIABLE_NAME}: ${_VARIABLE_VALUE}")
354
355 set(${_VARIABLE_NAME} ${_VARIABLE_VALUE})
356endforeach()
357
358if(DEFINED ENV{ARROW_ABSL_URL})
359 set(ABSL_SOURCE_URL "$ENV{ARROW_ABSL_URL}")
360else()
361 set_urls(ABSL_SOURCE_URL
362 "https://github.com/abseil/abseil-cpp/archive/${ARROW_ABSL_BUILD_VERSION}.tar.gz"
363 )
364endif()
365
366if(DEFINED ENV{ARROW_AWS_C_COMMON_URL})
367 set(AWS_C_COMMON_SOURCE_URL "$ENV{ARROW_AWS_C_COMMON_URL}")
368else()
369 set_urls(AWS_C_COMMON_SOURCE_URL
370 "https://github.com/awslabs/aws-c-common/archive/${ARROW_AWS_C_COMMON_BUILD_VERSION}.tar.gz"
371 )
372endif()
373
374if(DEFINED ENV{ARROW_AWS_CHECKSUMS_URL})
375 set(AWS_CHECKSUMS_SOURCE_URL "$ENV{ARROW_AWS_CHECKSUMS_URL}")
376else()
377 set_urls(AWS_CHECKSUMS_SOURCE_URL
378 "https://github.com/awslabs/aws-checksums/archive/${ARROW_AWS_CHECKSUMS_BUILD_VERSION}.tar.gz"
379 )
380endif()
381
382if(DEFINED ENV{ARROW_AWS_C_EVENT_STREAM_URL})
383 set(AWS_C_EVENT_STREAM_SOURCE_URL "$ENV{ARROW_AWS_C_EVENT_STREAM_URL}")
384else()
385 set_urls(AWS_C_EVENT_STREAM_SOURCE_URL
386 "https://github.com/awslabs/aws-c-event-stream/archive/${ARROW_AWS_C_EVENT_STREAM_BUILD_VERSION}.tar.gz"
387 )
388endif()
389
390if(DEFINED ENV{ARROW_AWSSDK_URL})
391 set(AWSSDK_SOURCE_URL "$ENV{ARROW_AWSSDK_URL}")
392else()
393 set_urls(AWSSDK_SOURCE_URL
394 "https://github.com/aws/aws-sdk-cpp/archive/${ARROW_AWSSDK_BUILD_VERSION}.tar.gz"
395 "https://github.com/ursa-labs/thirdparty/releases/download/latest/aws-sdk-cpp-${ARROW_AWSSDK_BUILD_VERSION}.tar.gz"
396 )
397endif()
398
399if(DEFINED ENV{ARROW_BOOST_URL})
400 set(BOOST_SOURCE_URL "$ENV{ARROW_BOOST_URL}")
401else()
402 string(REPLACE "." "_" ARROW_BOOST_BUILD_VERSION_UNDERSCORES
403 ${ARROW_BOOST_BUILD_VERSION})
404 set_urls(BOOST_SOURCE_URL
405 # These are trimmed boost bundles we maintain.
406 # See cpp/build-support/trim-boost.sh
407 # FIXME(ARROW-6407) automate uploading this archive to ensure it reflects
408 # our currently used packages and doesn't fall out of sync with
409 # ${ARROW_BOOST_BUILD_VERSION_UNDERSCORES}
410 "https://github.com/ursa-labs/thirdparty/releases/download/latest/boost_${ARROW_BOOST_BUILD_VERSION_UNDERSCORES}.tar.gz"
411 "https://boostorg.jfrog.io/artifactory/main/release/${ARROW_BOOST_BUILD_VERSION}/source/boost_${ARROW_BOOST_BUILD_VERSION_UNDERSCORES}.tar.gz"
412 "https://sourceforge.net/projects/boost/files/boost/${ARROW_BOOST_BUILD_VERSION}/boost_${ARROW_BOOST_BUILD_VERSION_UNDERSCORES}.tar.gz"
413 )
414endif()
415
416if(DEFINED ENV{ARROW_BROTLI_URL})
417 set(BROTLI_SOURCE_URL "$ENV{ARROW_BROTLI_URL}")
418else()
419 set_urls(BROTLI_SOURCE_URL
420 "https://github.com/google/brotli/archive/${ARROW_BROTLI_BUILD_VERSION}.tar.gz"
421 "https://github.com/ursa-labs/thirdparty/releases/download/latest/brotli-${ARROW_BROTLI_BUILD_VERSION}.tar.gz"
422 )
423endif()
424
425if(DEFINED ENV{ARROW_BZIP2_URL})
426 set(ARROW_BZIP2_SOURCE_URL "$ENV{ARROW_BZIP2_URL}")
427else()
428 set_urls(ARROW_BZIP2_SOURCE_URL
429 "https://sourceware.org/pub/bzip2/bzip2-${ARROW_BZIP2_BUILD_VERSION}.tar.gz"
430 "https://github.com/ursa-labs/thirdparty/releases/download/latest/bzip2-${ARROW_BZIP2_BUILD_VERSION}.tar.gz"
431 )
432endif()
433
434if(DEFINED ENV{ARROW_CARES_URL})
435 set(CARES_SOURCE_URL "$ENV{ARROW_CARES_URL}")
436else()
437 set_urls(CARES_SOURCE_URL
438 "https://c-ares.haxx.se/download/c-ares-${ARROW_CARES_BUILD_VERSION}.tar.gz"
439 "https://github.com/ursa-labs/thirdparty/releases/download/latest/cares-${ARROW_CARES_BUILD_VERSION}.tar.gz"
440 )
441endif()
442
443if(DEFINED ENV{ARROW_CRC32C_URL})
444 set(CRC32C_URL "$ENV{ARROW_CRC32C_URL}")
445else()
446 set_urls(CRC32C_SOURCE_URL
447 "https://github.com/google/crc32c/archive/${ARROW_CRC32C_BUILD_VERSION}.tar.gz"
448 )
449endif()
450
451if(DEFINED ENV{ARROW_GBENCHMARK_URL})
452 set(GBENCHMARK_SOURCE_URL "$ENV{ARROW_GBENCHMARK_URL}")
453else()
454 set_urls(GBENCHMARK_SOURCE_URL
455 "https://github.com/google/benchmark/archive/${ARROW_GBENCHMARK_BUILD_VERSION}.tar.gz"
456 "https://github.com/ursa-labs/thirdparty/releases/download/latest/gbenchmark-${ARROW_GBENCHMARK_BUILD_VERSION}.tar.gz"
457 )
458endif()
459
460if(DEFINED ENV{ARROW_GFLAGS_URL})
461 set(GFLAGS_SOURCE_URL "$ENV{ARROW_GFLAGS_URL}")
462else()
463 set_urls(GFLAGS_SOURCE_URL
464 "https://github.com/gflags/gflags/archive/${ARROW_GFLAGS_BUILD_VERSION}.tar.gz"
465 "https://github.com/ursa-labs/thirdparty/releases/download/latest/gflags-${ARROW_GFLAGS_BUILD_VERSION}.tar.gz"
466 )
467endif()
468
469if(DEFINED ENV{ARROW_GLOG_URL})
470 set(GLOG_SOURCE_URL "$ENV{ARROW_GLOG_URL}")
471else()
472 set_urls(GLOG_SOURCE_URL
473 "https://github.com/google/glog/archive/${ARROW_GLOG_BUILD_VERSION}.tar.gz"
474 "https://github.com/ursa-labs/thirdparty/releases/download/latest/glog-${ARROW_GLOG_BUILD_VERSION}.tar.gz"
475 )
476endif()
477
478if(DEFINED ENV{ARROW_GOOGLE_CLOUD_CPP_URL})
479 set(google_cloud_cpp_storage_SOURCE_URL "$ENV{ARROW_GOOGLE_CLOUD_CPP_URL}")
480else()
481 set_urls(google_cloud_cpp_storage_SOURCE_URL
482 "https://github.com/googleapis/google-cloud-cpp/archive/${ARROW_GOOGLE_CLOUD_CPP_BUILD_VERSION}.tar.gz"
483 )
484endif()
485
486if(DEFINED ENV{ARROW_GRPC_URL})
487 set(GRPC_SOURCE_URL "$ENV{ARROW_GRPC_URL}")
488else()
489 set_urls(GRPC_SOURCE_URL
490 "https://github.com/grpc/grpc/archive/${ARROW_GRPC_BUILD_VERSION}.tar.gz"
491 "https://github.com/ursa-labs/thirdparty/releases/download/latest/grpc-${ARROW_GRPC_BUILD_VERSION}.tar.gz"
492 )
493endif()
494
495if(DEFINED ENV{ARROW_GTEST_URL})
496 set(GTEST_SOURCE_URL "$ENV{ARROW_GTEST_URL}")
497else()
498 set_urls(GTEST_SOURCE_URL
499 "https://github.com/google/googletest/archive/release-${ARROW_GTEST_BUILD_VERSION}.tar.gz"
500 "https://chromium.googlesource.com/external/github.com/google/googletest/+archive/release-${ARROW_GTEST_BUILD_VERSION}.tar.gz"
501 "https://github.com/ursa-labs/thirdparty/releases/download/latest/gtest-${ARROW_GTEST_BUILD_VERSION}.tar.gz"
502 )
503endif()
504
505if(DEFINED ENV{ARROW_JEMALLOC_URL})
506 set(JEMALLOC_SOURCE_URL "$ENV{ARROW_JEMALLOC_URL}")
507else()
508 set_urls(JEMALLOC_SOURCE_URL
509 "https://github.com/jemalloc/jemalloc/releases/download/${ARROW_JEMALLOC_BUILD_VERSION}/jemalloc-${ARROW_JEMALLOC_BUILD_VERSION}.tar.bz2"
510 "https://github.com/ursa-labs/thirdparty/releases/download/latest/jemalloc-${ARROW_JEMALLOC_BUILD_VERSION}.tar.bz2"
511 )
512endif()
513
514if(DEFINED ENV{ARROW_MIMALLOC_URL})
515 set(MIMALLOC_SOURCE_URL "$ENV{ARROW_MIMALLOC_URL}")
516else()
517 set_urls(MIMALLOC_SOURCE_URL
518 "https://github.com/microsoft/mimalloc/archive/${ARROW_MIMALLOC_BUILD_VERSION}.tar.gz"
519 "https://github.com/ursa-labs/thirdparty/releases/download/latest/mimalloc-${ARROW_MIMALLOC_BUILD_VERSION}.tar.gz"
520 )
521endif()
522
523if(DEFINED ENV{ARROW_NLOHMANN_JSON_URL})
524 set(NLOHMANN_JSON_SOURCE_URL "$ENV{ARROW_NLOHMANN_JSON_URL}")
525else()
526 set_urls(NLOHMANN_JSON_SOURCE_URL
527 "https://github.com/nlohmann/json/archive/${ARROW_NLOHMANN_JSON_BUILD_VERSION}.tar.gz"
528 )
529endif()
530
531if(DEFINED ENV{ARROW_LZ4_URL})
532 set(LZ4_SOURCE_URL "$ENV{ARROW_LZ4_URL}")
533else()
534 set_urls(LZ4_SOURCE_URL
535 "https://github.com/lz4/lz4/archive/${ARROW_LZ4_BUILD_VERSION}.tar.gz"
536 "https://github.com/ursa-labs/thirdparty/releases/download/latest/lz4-${ARROW_LZ4_BUILD_VERSION}.tar.gz"
537 )
538endif()
539
540if(DEFINED ENV{ARROW_ORC_URL})
541 set(ORC_SOURCE_URL "$ENV{ARROW_ORC_URL}")
542else()
543 set_urls(ORC_SOURCE_URL
544 "https://github.com/apache/orc/archive/rel/release-${ARROW_ORC_BUILD_VERSION}.tar.gz"
545 "https://github.com/ursa-labs/thirdparty/releases/download/latest/orc-${ARROW_ORC_BUILD_VERSION}.tar.gz"
546 )
547endif()
548
549if(DEFINED ENV{ARROW_PROTOBUF_URL})
550 set(PROTOBUF_SOURCE_URL "$ENV{ARROW_PROTOBUF_URL}")
551else()
552 string(SUBSTRING ${ARROW_PROTOBUF_BUILD_VERSION} 1 -1
553 ARROW_PROTOBUF_STRIPPED_BUILD_VERSION)
554 # strip the leading `v`
555 set_urls(PROTOBUF_SOURCE_URL
556 "https://github.com/protocolbuffers/protobuf/releases/download/${ARROW_PROTOBUF_BUILD_VERSION}/protobuf-all-${ARROW_PROTOBUF_STRIPPED_BUILD_VERSION}.tar.gz"
557 "https://github.com/ursa-labs/thirdparty/releases/download/latest/protobuf-${ARROW_PROTOBUF_BUILD_VERSION}.tar.gz"
558 )
559endif()
560
561if(DEFINED ENV{ARROW_RE2_URL})
562 set(RE2_SOURCE_URL "$ENV{ARROW_RE2_URL}")
563else()
564 set_urls(RE2_SOURCE_URL
565 "https://github.com/google/re2/archive/${ARROW_RE2_BUILD_VERSION}.tar.gz"
566 "https://github.com/ursa-labs/thirdparty/releases/download/latest/re2-${ARROW_RE2_BUILD_VERSION}.tar.gz"
567 )
568endif()
569
570if(DEFINED ENV{ARROW_RAPIDJSON_URL})
571 set(RAPIDJSON_SOURCE_URL "$ENV{ARROW_RAPIDJSON_URL}")
572else()
573 set_urls(RAPIDJSON_SOURCE_URL
574 "https://github.com/miloyip/rapidjson/archive/${ARROW_RAPIDJSON_BUILD_VERSION}.tar.gz"
575 "https://github.com/ursa-labs/thirdparty/releases/download/latest/rapidjson-${ARROW_RAPIDJSON_BUILD_VERSION}.tar.gz"
576 )
577endif()
578
579if(DEFINED ENV{ARROW_SNAPPY_URL})
580 set(SNAPPY_SOURCE_URL "$ENV{ARROW_SNAPPY_URL}")
581else()
582 set_urls(SNAPPY_SOURCE_URL
583 "https://github.com/google/snappy/archive/${ARROW_SNAPPY_BUILD_VERSION}.tar.gz"
584 "https://github.com/ursa-labs/thirdparty/releases/download/latest/snappy-${ARROW_SNAPPY_BUILD_VERSION}.tar.gz"
585 )
586endif()
587
588if(DEFINED ENV{ARROW_THRIFT_URL})
589 set(THRIFT_SOURCE_URL "$ENV{ARROW_THRIFT_URL}")
590else()
591 set_urls(THRIFT_SOURCE_URL
592 "https://www.apache.org/dyn/closer.cgi?action=download&filename=/thrift/${ARROW_THRIFT_BUILD_VERSION}/thrift-${ARROW_THRIFT_BUILD_VERSION}.tar.gz"
593 "https://downloads.apache.org/thrift/${ARROW_THRIFT_BUILD_VERSION}/thrift-${ARROW_THRIFT_BUILD_VERSION}.tar.gz"
594 "https://github.com/apache/thrift/archive/v${ARROW_THRIFT_BUILD_VERSION}.tar.gz"
595 "https://apache.claz.org/thrift/${ARROW_THRIFT_BUILD_VERSION}/thrift-${ARROW_THRIFT_BUILD_VERSION}.tar.gz"
596 "https://apache.cs.utah.edu/thrift/${ARROW_THRIFT_BUILD_VERSION}/thrift-${ARROW_THRIFT_BUILD_VERSION}.tar.gz"
597 "https://apache.mirrors.lucidnetworks.net/thrift/${ARROW_THRIFT_BUILD_VERSION}/thrift-${ARROW_THRIFT_BUILD_VERSION}.tar.gz"
598 "https://apache.osuosl.org/thrift/${ARROW_THRIFT_BUILD_VERSION}/thrift-${ARROW_THRIFT_BUILD_VERSION}.tar.gz"
599 "https://ftp.wayne.edu/apache/thrift/${ARROW_THRIFT_BUILD_VERSION}/thrift-${ARROW_THRIFT_BUILD_VERSION}.tar.gz"
600 "https://mirror.olnevhost.net/pub/apache/thrift/${ARROW_THRIFT_BUILD_VERSION}/thrift-${ARROW_THRIFT_BUILD_VERSION}.tar.gz"
601 "https://mirrors.gigenet.com/apache/thrift/${ARROW_THRIFT_BUILD_VERSION}/thrift-${ARROW_THRIFT_BUILD_VERSION}.tar.gz"
602 "https://mirrors.koehn.com/apache/thrift/${ARROW_THRIFT_BUILD_VERSION}/thrift-${ARROW_THRIFT_BUILD_VERSION}.tar.gz"
603 "https://mirrors.ocf.berkeley.edu/apache/thrift/${ARROW_THRIFT_BUILD_VERSION}/thrift-${ARROW_THRIFT_BUILD_VERSION}.tar.gz"
604 "https://mirrors.sonic.net/apache/thrift/${ARROW_THRIFT_BUILD_VERSION}/thrift-${ARROW_THRIFT_BUILD_VERSION}.tar.gz"
605 "https://us.mirrors.quenda.co/apache/thrift/${ARROW_THRIFT_BUILD_VERSION}/thrift-${ARROW_THRIFT_BUILD_VERSION}.tar.gz"
606 "https://github.com/ursa-labs/thirdparty/releases/download/latest/thrift-${ARROW_THRIFT_BUILD_VERSION}.tar.gz"
607 )
608endif()
609
610if(DEFINED ENV{ARROW_UTF8PROC_URL})
611 set(ARROW_UTF8PROC_SOURCE_URL "$ENV{ARROW_UTF8PROC_URL}")
612else()
613 set_urls(ARROW_UTF8PROC_SOURCE_URL
614 "https://github.com/JuliaStrings/utf8proc/archive/${ARROW_UTF8PROC_BUILD_VERSION}.tar.gz"
615 )
616endif()
617
618if(DEFINED ENV{ARROW_XSIMD_URL})
619 set(XSIMD_SOURCE_URL "$ENV{ARROW_XSIMD_URL}")
620else()
621 set_urls(XSIMD_SOURCE_URL
622 "https://github.com/xtensor-stack/xsimd/archive/${ARROW_XSIMD_BUILD_VERSION}.tar.gz"
623 )
624endif()
625
626if(DEFINED ENV{ARROW_ZLIB_URL})
627 set(ZLIB_SOURCE_URL "$ENV{ARROW_ZLIB_URL}")
628else()
629 set_urls(ZLIB_SOURCE_URL
630 "https://zlib.net/fossils/zlib-${ARROW_ZLIB_BUILD_VERSION}.tar.gz"
631 "https://github.com/ursa-labs/thirdparty/releases/download/latest/zlib-${ARROW_ZLIB_BUILD_VERSION}.tar.gz"
632 )
633endif()
634
635if(DEFINED ENV{ARROW_ZSTD_URL})
636 set(ZSTD_SOURCE_URL "$ENV{ARROW_ZSTD_URL}")
637else()
638 set_urls(ZSTD_SOURCE_URL
639 "https://github.com/facebook/zstd/archive/${ARROW_ZSTD_BUILD_VERSION}.tar.gz"
640 "https://github.com/ursa-labs/thirdparty/releases/download/latest/zstd-${ARROW_ZSTD_BUILD_VERSION}.tar.gz"
641 )
642endif()
643
644# ----------------------------------------------------------------------
645# ExternalProject options
646
647set(EP_CXX_FLAGS
648 "${CMAKE_CXX_COMPILER_ARG1} ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${UPPERCASE_BUILD_TYPE}}"
649)
650set(EP_C_FLAGS
651 "${CMAKE_C_COMPILER_ARG1} ${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${UPPERCASE_BUILD_TYPE}}")
652
653if(NOT MSVC_TOOLCHAIN)
654 # Set -fPIC on all external projects
655 set(EP_CXX_FLAGS "${EP_CXX_FLAGS} -fPIC")
656 set(EP_C_FLAGS "${EP_C_FLAGS} -fPIC")
657endif()
658
659# CC/CXX environment variables are captured on the first invocation of the
660# builder (e.g make or ninja) instead of when CMake is invoked into to build
661# directory. This leads to issues if the variables are exported in a subshell
662# and the invocation of make/ninja is in distinct subshell without the same
663# environment (CC/CXX).
664set(EP_COMMON_TOOLCHAIN -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
665 -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER})
666
667if(CMAKE_AR)
668 set(EP_COMMON_TOOLCHAIN ${EP_COMMON_TOOLCHAIN} -DCMAKE_AR=${CMAKE_AR})
669endif()
670
671if(CMAKE_RANLIB)
672 set(EP_COMMON_TOOLCHAIN ${EP_COMMON_TOOLCHAIN} -DCMAKE_RANLIB=${CMAKE_RANLIB})
673endif()
674
675# External projects are still able to override the following declarations.
676# cmake command line will favor the last defined variable when a duplicate is
677# encountered. This requires that `EP_COMMON_CMAKE_ARGS` is always the first
678# argument.
679set(EP_COMMON_CMAKE_ARGS
680 ${EP_COMMON_TOOLCHAIN}
681 ${EP_COMMON_CMAKE_ARGS}
682 -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
683 -DCMAKE_C_FLAGS=${EP_C_FLAGS}
684 -DCMAKE_C_FLAGS_${UPPERCASE_BUILD_TYPE}=${EP_C_FLAGS}
685 -DCMAKE_CXX_FLAGS=${EP_CXX_FLAGS}
686 -DCMAKE_CXX_FLAGS_${UPPERCASE_BUILD_TYPE}=${EP_CXX_FLAGS}
687 -DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}
688 -DCMAKE_EXPORT_NO_PACKAGE_REGISTRY=${CMAKE_EXPORT_NO_PACKAGE_REGISTRY}
689 -DCMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY=${CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY})
690
691if(NOT ARROW_VERBOSE_THIRDPARTY_BUILD)
692 set(EP_LOG_OPTIONS
693 LOG_CONFIGURE
694 1
695 LOG_BUILD
696 1
697 LOG_INSTALL
698 1
699 LOG_DOWNLOAD
700 1
701 LOG_OUTPUT_ON_FAILURE
702 1)
703 set(Boost_DEBUG FALSE)
704else()
705 set(EP_LOG_OPTIONS)
706 set(Boost_DEBUG TRUE)
707endif()
708
709# Ensure that a default make is set
710if("${MAKE}" STREQUAL "")
711 if(NOT MSVC)
712 find_program(MAKE make)
713 endif()
714endif()
715
716# Using make -j in sub-make is fragile
717# see discussion https://github.com/apache/arrow/pull/2779
718if(${CMAKE_GENERATOR} MATCHES "Makefiles")
719 set(MAKE_BUILD_ARGS "")
720else()
721 # limit the maximum number of jobs for ninja
722 set(MAKE_BUILD_ARGS "-j${NPROC}")
723endif()
724
725# ----------------------------------------------------------------------
726# Find pthreads
727
728set(THREADS_PREFER_PTHREAD_FLAG ON)
729find_package(Threads REQUIRED)
730
731# ----------------------------------------------------------------------
732# Add Boost dependencies (code adapted from Apache Kudu)
733
734macro(build_boost)
735 set(BOOST_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/boost_ep-prefix/src/boost_ep")
736
737 # This is needed by the thrift_ep build
738 set(BOOST_ROOT ${BOOST_PREFIX})
739
740 if(ARROW_BOOST_REQUIRE_LIBRARY)
741 set(BOOST_LIB_DIR "${BOOST_PREFIX}/stage/lib")
742 set(BOOST_BUILD_LINK "static")
743 if("${CMAKE_BUILD_TYPE}" STREQUAL "DEBUG")
744 set(BOOST_BUILD_VARIANT "debug")
745 else()
746 set(BOOST_BUILD_VARIANT "release")
747 endif()
748 if(MSVC)
749 set(BOOST_CONFIGURE_COMMAND ".\\\\bootstrap.bat")
750 else()
751 set(BOOST_CONFIGURE_COMMAND "./bootstrap.sh")
752 endif()
753
754 set(BOOST_BUILD_WITH_LIBRARIES "filesystem" "system")
755 string(REPLACE ";" "," BOOST_CONFIGURE_LIBRARIES "${BOOST_BUILD_WITH_LIBRARIES}")
756 list(APPEND BOOST_CONFIGURE_COMMAND "--prefix=${BOOST_PREFIX}"
757 "--with-libraries=${BOOST_CONFIGURE_LIBRARIES}")
758 set(BOOST_BUILD_COMMAND "./b2" "-j${NPROC}" "link=${BOOST_BUILD_LINK}"
759 "variant=${BOOST_BUILD_VARIANT}")
760 if(MSVC)
761 string(REGEX REPLACE "([0-9])$" ".\\1" BOOST_TOOLSET_MSVC_VERSION
762 ${MSVC_TOOLSET_VERSION})
763 list(APPEND BOOST_BUILD_COMMAND "toolset=msvc-${BOOST_TOOLSET_MSVC_VERSION}")
764 set(BOOST_BUILD_WITH_LIBRARIES_MSVC)
765 foreach(_BOOST_LIB ${BOOST_BUILD_WITH_LIBRARIES})
766 list(APPEND BOOST_BUILD_WITH_LIBRARIES_MSVC "--with-${_BOOST_LIB}")
767 endforeach()
768 list(APPEND BOOST_BUILD_COMMAND ${BOOST_BUILD_WITH_LIBRARIES_MSVC})
769 else()
770 list(APPEND BOOST_BUILD_COMMAND "cxxflags=-fPIC")
771 endif()
772
773 if(MSVC)
774 string(REGEX
775 REPLACE "^([0-9]+)\\.([0-9]+)\\.[0-9]+$" "\\1_\\2"
776 ARROW_BOOST_BUILD_VERSION_NO_MICRO_UNDERSCORE
777 ${ARROW_BOOST_BUILD_VERSION})
778 set(BOOST_LIBRARY_SUFFIX "-vc${MSVC_TOOLSET_VERSION}-mt")
779 if(BOOST_BUILD_VARIANT STREQUAL "debug")
780 set(BOOST_LIBRARY_SUFFIX "${BOOST_LIBRARY_SUFFIX}-gd")
781 endif()
782 set(BOOST_LIBRARY_SUFFIX
783 "${BOOST_LIBRARY_SUFFIX}-x64-${ARROW_BOOST_BUILD_VERSION_NO_MICRO_UNDERSCORE}")
784 else()
785 set(BOOST_LIBRARY_SUFFIX "")
786 endif()
787 set(BOOST_STATIC_SYSTEM_LIBRARY
788 "${BOOST_LIB_DIR}/libboost_system${BOOST_LIBRARY_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}"
789 )
790 set(BOOST_STATIC_FILESYSTEM_LIBRARY
791 "${BOOST_LIB_DIR}/libboost_filesystem${BOOST_LIBRARY_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}"
792 )
793 set(BOOST_SYSTEM_LIBRARY boost_system_static)
794 set(BOOST_FILESYSTEM_LIBRARY boost_filesystem_static)
795 set(BOOST_BUILD_PRODUCTS ${BOOST_STATIC_SYSTEM_LIBRARY}
796 ${BOOST_STATIC_FILESYSTEM_LIBRARY})
797
798 add_thirdparty_lib(boost_system STATIC_LIB "${BOOST_STATIC_SYSTEM_LIBRARY}")
799
800 add_thirdparty_lib(boost_filesystem STATIC_LIB "${BOOST_STATIC_FILESYSTEM_LIBRARY}")
801
802 externalproject_add(boost_ep
803 URL ${BOOST_SOURCE_URL}
804 URL_HASH "SHA256=${ARROW_BOOST_BUILD_SHA256_CHECKSUM}"
805 BUILD_BYPRODUCTS ${BOOST_BUILD_PRODUCTS}
806 BUILD_IN_SOURCE 1
807 CONFIGURE_COMMAND ${BOOST_CONFIGURE_COMMAND}
808 BUILD_COMMAND ${BOOST_BUILD_COMMAND}
809 INSTALL_COMMAND "" ${EP_LOG_OPTIONS})
810 add_dependencies(boost_system_static boost_ep)
811 add_dependencies(boost_filesystem_static boost_ep)
812 else()
813 externalproject_add(boost_ep
814 ${EP_LOG_OPTIONS}
815 BUILD_COMMAND ""
816 CONFIGURE_COMMAND ""
817 INSTALL_COMMAND ""
818 URL ${BOOST_SOURCE_URL}
819 URL_HASH "SHA256=${ARROW_BOOST_BUILD_SHA256_CHECKSUM}")
820 endif()
821 set(Boost_INCLUDE_DIR "${BOOST_PREFIX}")
822 set(Boost_INCLUDE_DIRS "${Boost_INCLUDE_DIR}")
823 add_dependencies(toolchain boost_ep)
824 set(BOOST_VENDORED TRUE)
825endmacro()
826
827if(ARROW_FLIGHT AND ARROW_BUILD_TESTS)
828 set(ARROW_BOOST_REQUIRED_VERSION "1.64")
829else()
830 set(ARROW_BOOST_REQUIRED_VERSION "1.58")
831endif()
832
833set(Boost_USE_MULTITHREADED ON)
834if(MSVC AND ARROW_USE_STATIC_CRT)
835 set(Boost_USE_STATIC_RUNTIME ON)
836endif()
837set(Boost_ADDITIONAL_VERSIONS
838 "1.75.0"
839 "1.75"
840 "1.74.0"
841 "1.74"
842 "1.73.0"
843 "1.73"
844 "1.72.0"
845 "1.72"
846 "1.71.0"
847 "1.71"
848 "1.70.0"
849 "1.70"
850 "1.69.0"
851 "1.69"
852 "1.68.0"
853 "1.68"
854 "1.67.0"
855 "1.67"
856 "1.66.0"
857 "1.66"
858 "1.65.0"
859 "1.65"
860 "1.64.0"
861 "1.64"
862 "1.63.0"
863 "1.63"
864 "1.62.0"
865 "1.61"
866 "1.61.0"
867 "1.62"
868 "1.60.0"
869 "1.60")
870
871# Thrift needs Boost if we're building the bundled version with version < 0.13,
872# so we first need to determine whether we're building it
873if(ARROW_WITH_THRIFT AND Thrift_SOURCE STREQUAL "AUTO")
874 find_package(Thrift 0.11.0 MODULE COMPONENTS ${ARROW_THRIFT_REQUIRED_COMPONENTS})
875 if(Thrift_FOUND)
876 find_package(PkgConfig QUIET)
877 pkg_check_modules(THRIFT_PC
878 thrift
879 NO_CMAKE_PATH
880 NO_CMAKE_ENVIRONMENT_PATH
881 QUIET)
882 if(THRIFT_PC_FOUND)
883 string(APPEND ARROW_PC_REQUIRES_PRIVATE " thrift")
884 endif()
885 else()
886 set(Thrift_SOURCE "BUNDLED")
887 endif()
888endif()
889
890# Thrift < 0.13 has a compile-time header dependency on boost
891if(Thrift_SOURCE STREQUAL "BUNDLED" AND ARROW_THRIFT_BUILD_VERSION VERSION_LESS "0.13")
892 set(THRIFT_REQUIRES_BOOST TRUE)
893elseif(THRIFT_VERSION VERSION_LESS "0.13")
894 set(THRIFT_REQUIRES_BOOST TRUE)
895else()
896 set(THRIFT_REQUIRES_BOOST FALSE)
897endif()
898
899# Compilers that don't support int128_t have a compile-time
900# (header-only) dependency on Boost for int128_t.
901if(ARROW_USE_UBSAN)
902 # NOTE: Avoid native int128_t on clang with UBSan as it produces linker errors
903 # (such as "undefined reference to '__muloti4'")
904 set(ARROW_USE_NATIVE_INT128 FALSE)
905else()
906 include(CheckCXXSymbolExists)
907 check_cxx_symbol_exists("__SIZEOF_INT128__" "" ARROW_USE_NATIVE_INT128)
908endif()
909
910# - Gandiva has a compile-time (header-only) dependency on Boost, not runtime.
911# - Tests need Boost at runtime.
912# - S3FS and Flight benchmarks need Boost at runtime.
913if(ARROW_BUILD_INTEGRATION
914 OR ARROW_BUILD_TESTS
915 OR (ARROW_FLIGHT AND ARROW_BUILD_BENCHMARKS)
916 OR (ARROW_S3 AND ARROW_BUILD_BENCHMARKS))
917 set(ARROW_BOOST_REQUIRED TRUE)
918 set(ARROW_BOOST_REQUIRE_LIBRARY TRUE)
919elseif(ARROW_GANDIVA
920 OR (ARROW_WITH_THRIFT AND THRIFT_REQUIRES_BOOST)
921 OR (NOT ARROW_USE_NATIVE_INT128))
922 set(ARROW_BOOST_REQUIRED TRUE)
923 set(ARROW_BOOST_REQUIRE_LIBRARY FALSE)
924else()
925 set(ARROW_BOOST_REQUIRED FALSE)
926endif()
927
928if(ARROW_BOOST_REQUIRED)
929 resolve_dependency(Boost
930 HAVE_ALT
931 TRUE
932 REQUIRED_VERSION
933 ${ARROW_BOOST_REQUIRED_VERSION}
934 IS_RUNTIME_DEPENDENCY
935 # libarrow.so doesn't depend on libboost*.
936 FALSE)
937
938 if(TARGET Boost::system)
939 set(BOOST_SYSTEM_LIBRARY Boost::system)
940 set(BOOST_FILESYSTEM_LIBRARY Boost::filesystem)
941 elseif(BoostAlt_FOUND)
942 set(BOOST_SYSTEM_LIBRARY ${Boost_SYSTEM_LIBRARY})
943 set(BOOST_FILESYSTEM_LIBRARY ${Boost_FILESYSTEM_LIBRARY})
944 else()
945 set(BOOST_SYSTEM_LIBRARY boost_system_static)
946 set(BOOST_FILESYSTEM_LIBRARY boost_filesystem_static)
947 endif()
948 set(ARROW_BOOST_LIBS ${BOOST_SYSTEM_LIBRARY} ${BOOST_FILESYSTEM_LIBRARY})
949
950 message(STATUS "Boost include dir: ${Boost_INCLUDE_DIR}")
951 message(STATUS "Boost libraries: ${ARROW_BOOST_LIBS}")
952
953 include_directories(SYSTEM ${Boost_INCLUDE_DIR})
954endif()
955
956# ----------------------------------------------------------------------
957# Snappy
958
959macro(build_snappy)
960 message(STATUS "Building snappy from source")
961 set(SNAPPY_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/snappy_ep/src/snappy_ep-install")
962 set(SNAPPY_STATIC_LIB_NAME snappy)
963 set(SNAPPY_STATIC_LIB
964 "${SNAPPY_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}${SNAPPY_STATIC_LIB_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX}"
965 )
966
967 set(SNAPPY_CMAKE_ARGS
968 ${EP_COMMON_CMAKE_ARGS} -DCMAKE_INSTALL_LIBDIR=lib -DSNAPPY_BUILD_TESTS=OFF
969 "-DCMAKE_INSTALL_PREFIX=${SNAPPY_PREFIX}")
970
971 externalproject_add(snappy_ep
972 ${EP_LOG_OPTIONS}
973 BUILD_IN_SOURCE 1
974 INSTALL_DIR ${SNAPPY_PREFIX}
975 URL ${SNAPPY_SOURCE_URL}
976 URL_HASH "SHA256=${ARROW_SNAPPY_BUILD_SHA256_CHECKSUM}"
977 CMAKE_ARGS ${SNAPPY_CMAKE_ARGS}
978 BUILD_BYPRODUCTS "${SNAPPY_STATIC_LIB}")
979
980 file(MAKE_DIRECTORY "${SNAPPY_PREFIX}/include")
981
982 add_library(Snappy::snappy STATIC IMPORTED)
983 set_target_properties(Snappy::snappy
984 PROPERTIES IMPORTED_LOCATION "${SNAPPY_STATIC_LIB}"
985 INTERFACE_INCLUDE_DIRECTORIES
986 "${SNAPPY_PREFIX}/include")
987 add_dependencies(toolchain snappy_ep)
988 add_dependencies(Snappy::snappy snappy_ep)
989
990 list(APPEND ARROW_BUNDLED_STATIC_LIBS Snappy::snappy)
991endmacro()
992
993if(ARROW_WITH_SNAPPY)
994 resolve_dependency(Snappy PC_PACKAGE_NAMES snappy)
995 if(${Snappy_SOURCE} STREQUAL "SYSTEM" AND NOT snappy_PC_FOUND)
996 get_target_property(SNAPPY_LIB Snappy::snappy IMPORTED_LOCATION)
997 string(APPEND ARROW_PC_LIBS_PRIVATE " ${SNAPPY_LIB}")
998 endif()
999 # TODO: Don't use global includes but rather target_include_directories
1000 get_target_property(SNAPPY_INCLUDE_DIRS Snappy::snappy INTERFACE_INCLUDE_DIRECTORIES)
1001 include_directories(SYSTEM ${SNAPPY_INCLUDE_DIRS})
1002endif()
1003
1004# ----------------------------------------------------------------------
1005# Brotli
1006
1007macro(build_brotli)
1008 message(STATUS "Building brotli from source")
1009 set(BROTLI_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/brotli_ep/src/brotli_ep-install")
1010 set(BROTLI_INCLUDE_DIR "${BROTLI_PREFIX}/include")
1011 set(BROTLI_LIB_DIR lib)
1012 set(BROTLI_STATIC_LIBRARY_ENC
1013 "${BROTLI_PREFIX}/${BROTLI_LIB_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}brotlienc-static${CMAKE_STATIC_LIBRARY_SUFFIX}"
1014 )
1015 set(BROTLI_STATIC_LIBRARY_DEC
1016 "${BROTLI_PREFIX}/${BROTLI_LIB_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}brotlidec-static${CMAKE_STATIC_LIBRARY_SUFFIX}"
1017 )
1018 set(BROTLI_STATIC_LIBRARY_COMMON
1019 "${BROTLI_PREFIX}/${BROTLI_LIB_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}brotlicommon-static${CMAKE_STATIC_LIBRARY_SUFFIX}"
1020 )
1021 set(BROTLI_CMAKE_ARGS ${EP_COMMON_CMAKE_ARGS} "-DCMAKE_INSTALL_PREFIX=${BROTLI_PREFIX}"
1022 -DCMAKE_INSTALL_LIBDIR=${BROTLI_LIB_DIR})
1023
1024 externalproject_add(brotli_ep
1025 URL ${BROTLI_SOURCE_URL}
1026 URL_HASH "SHA256=${ARROW_BROTLI_BUILD_SHA256_CHECKSUM}"
1027 BUILD_BYPRODUCTS "${BROTLI_STATIC_LIBRARY_ENC}"
1028 "${BROTLI_STATIC_LIBRARY_DEC}"
1029 "${BROTLI_STATIC_LIBRARY_COMMON}"
1030 ${BROTLI_BUILD_BYPRODUCTS}
1031 ${EP_LOG_OPTIONS}
1032 CMAKE_ARGS ${BROTLI_CMAKE_ARGS}
1033 STEP_TARGETS headers_copy)
1034
1035 add_dependencies(toolchain brotli_ep)
1036 file(MAKE_DIRECTORY "${BROTLI_INCLUDE_DIR}")
1037
1038 add_library(Brotli::brotlicommon STATIC IMPORTED)
1039 set_target_properties(Brotli::brotlicommon
1040 PROPERTIES IMPORTED_LOCATION "${BROTLI_STATIC_LIBRARY_COMMON}"
1041 INTERFACE_INCLUDE_DIRECTORIES "${BROTLI_INCLUDE_DIR}")
1042 add_dependencies(Brotli::brotlicommon brotli_ep)
1043
1044 add_library(Brotli::brotlienc STATIC IMPORTED)
1045 set_target_properties(Brotli::brotlienc
1046 PROPERTIES IMPORTED_LOCATION "${BROTLI_STATIC_LIBRARY_ENC}"
1047 INTERFACE_INCLUDE_DIRECTORIES "${BROTLI_INCLUDE_DIR}")
1048 add_dependencies(Brotli::brotlienc brotli_ep)
1049
1050 add_library(Brotli::brotlidec STATIC IMPORTED)
1051 set_target_properties(Brotli::brotlidec
1052 PROPERTIES IMPORTED_LOCATION "${BROTLI_STATIC_LIBRARY_DEC}"
1053 INTERFACE_INCLUDE_DIRECTORIES "${BROTLI_INCLUDE_DIR}")
1054 add_dependencies(Brotli::brotlidec brotli_ep)
1055
1056 list(APPEND
1057 ARROW_BUNDLED_STATIC_LIBS
1058 Brotli::brotlicommon
1059 Brotli::brotlienc
1060 Brotli::brotlidec)
1061endmacro()
1062
1063if(ARROW_WITH_BROTLI)
1064 resolve_dependency(Brotli PC_PACKAGE_NAMES libbrotlidec libbrotlienc)
1065 # TODO: Don't use global includes but rather target_include_directories
1066 get_target_property(BROTLI_INCLUDE_DIR Brotli::brotlicommon
1067 INTERFACE_INCLUDE_DIRECTORIES)
1068 include_directories(SYSTEM ${BROTLI_INCLUDE_DIR})
1069endif()
1070
1071if(PARQUET_REQUIRE_ENCRYPTION AND NOT ARROW_PARQUET)
1072 set(PARQUET_REQUIRE_ENCRYPTION OFF)
1073endif()
1074set(ARROW_OPENSSL_REQUIRED_VERSION "1.0.2")
1075if(BREW_BIN AND NOT OPENSSL_ROOT_DIR)
1076 execute_process(COMMAND ${BREW_BIN} --prefix "openssl@1.1"
1077 OUTPUT_VARIABLE OPENSSL11_BREW_PREFIX
1078 OUTPUT_STRIP_TRAILING_WHITESPACE)
1079 if(OPENSSL11_BREW_PREFIX)
1080 set(OPENSSL_ROOT_DIR ${OPENSSL11_BREW_PREFIX})
1081 else()
1082 execute_process(COMMAND ${BREW_BIN} --prefix "openssl"
1083 OUTPUT_VARIABLE OPENSSL_BREW_PREFIX
1084 OUTPUT_STRIP_TRAILING_WHITESPACE)
1085 if(OPENSSL_BREW_PREFIX)
1086 set(OPENSSL_ROOT_DIR ${OPENSSL_BREW_PREFIX})
1087 endif()
1088 endif()
1089endif()
1090
1091set(ARROW_USE_OPENSSL OFF)
1092if(PARQUET_REQUIRE_ENCRYPTION
1093 OR ARROW_FLIGHT
1094 OR ARROW_S3)
1095 # OpenSSL is required
1096 if(ARROW_OPENSSL_USE_SHARED)
1097 # Find shared OpenSSL libraries.
1098 set(OpenSSL_USE_STATIC_LIBS OFF)
1099 # Seems that different envs capitalize this differently?
1100 set(OPENSSL_USE_STATIC_LIBS OFF)
1101 set(BUILD_SHARED_LIBS_KEEP ${BUILD_SHARED_LIBS})
1102 set(BUILD_SHARED_LIBS ON)
1103
1104 find_package(OpenSSL ${ARROW_OPENSSL_REQUIRED_VERSION} REQUIRED)
1105 set(BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS_KEEP})
1106 unset(BUILD_SHARED_LIBS_KEEP)
1107 else()
1108 # Find static OpenSSL headers and libs
1109 set(OpenSSL_USE_STATIC_LIBS ON)
1110 set(OPENSSL_USE_STATIC_LIBS ON)
1111 find_package(OpenSSL ${ARROW_OPENSSL_REQUIRED_VERSION} REQUIRED)
1112 endif()
1113 set(ARROW_USE_OPENSSL ON)
1114endif()
1115
1116if(ARROW_USE_OPENSSL)
1117 message(STATUS "Found OpenSSL Crypto Library: ${OPENSSL_CRYPTO_LIBRARY}")
1118 message(STATUS "Building with OpenSSL (Version: ${OPENSSL_VERSION}) support")
1119
1120 list(APPEND ARROW_SYSTEM_DEPENDENCIES "OpenSSL")
1121
1122 include_directories(SYSTEM ${OPENSSL_INCLUDE_DIR})
1123else()
1124 message(STATUS "Building without OpenSSL support. Minimum OpenSSL version ${ARROW_OPENSSL_REQUIRED_VERSION} required."
1125 )
1126endif()
1127
1128# ----------------------------------------------------------------------
1129# GLOG
1130
1131macro(build_glog)
1132 message(STATUS "Building glog from source")
1133 set(GLOG_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/glog_ep-prefix/src/glog_ep")
1134 set(GLOG_INCLUDE_DIR "${GLOG_BUILD_DIR}/include")
1135 if(${UPPERCASE_BUILD_TYPE} STREQUAL "DEBUG")
1136 set(GLOG_LIB_SUFFIX "d")
1137 else()
1138 set(GLOG_LIB_SUFFIX "")
1139 endif()
1140 set(GLOG_STATIC_LIB
1141 "${GLOG_BUILD_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}glog${GLOG_LIB_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}"
1142 )
1143 set(GLOG_CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
1144 set(GLOG_CMAKE_C_FLAGS "${EP_C_FLAGS} -fPIC")
1145 if(CMAKE_THREAD_LIBS_INIT)
1146 set(GLOG_CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_THREAD_LIBS_INIT}")
1147 set(GLOG_CMAKE_C_FLAGS "${EP_C_FLAGS} ${CMAKE_THREAD_LIBS_INIT}")
1148 endif()
1149
1150 if(APPLE)
1151 # If we don't set this flag, the binary built with 10.13 cannot be used in 10.12.
1152 set(GLOG_CMAKE_CXX_FLAGS "${GLOG_CMAKE_CXX_FLAGS} -mmacosx-version-min=10.9")
1153 endif()
1154
1155 set(GLOG_CMAKE_ARGS
1156 ${EP_COMMON_CMAKE_ARGS}
1157 "-DCMAKE_INSTALL_PREFIX=${GLOG_BUILD_DIR}"
1158 -DBUILD_SHARED_LIBS=OFF
1159 -DBUILD_TESTING=OFF
1160 -DWITH_GFLAGS=OFF
1161 -DCMAKE_CXX_FLAGS_${UPPERCASE_BUILD_TYPE}=${GLOG_CMAKE_CXX_FLAGS}
1162 -DCMAKE_C_FLAGS_${UPPERCASE_BUILD_TYPE}=${GLOG_CMAKE_C_FLAGS}
1163 -DCMAKE_CXX_FLAGS=${GLOG_CMAKE_CXX_FLAGS})
1164 externalproject_add(glog_ep
1165 URL ${GLOG_SOURCE_URL}
1166 URL_HASH "SHA256=${ARROW_GLOG_BUILD_SHA256_CHECKSUM}"
1167 BUILD_IN_SOURCE 1
1168 BUILD_BYPRODUCTS "${GLOG_STATIC_LIB}"
1169 CMAKE_ARGS ${GLOG_CMAKE_ARGS} ${EP_LOG_OPTIONS})
1170
1171 add_dependencies(toolchain glog_ep)
1172 file(MAKE_DIRECTORY "${GLOG_INCLUDE_DIR}")
1173
1174 add_library(glog::glog STATIC IMPORTED)
1175 set_target_properties(glog::glog
1176 PROPERTIES IMPORTED_LOCATION "${GLOG_STATIC_LIB}"
1177 INTERFACE_INCLUDE_DIRECTORIES "${GLOG_INCLUDE_DIR}")
1178 add_dependencies(glog::glog glog_ep)
1179
1180 list(APPEND ARROW_BUNDLED_STATIC_LIBS glog::glog)
1181endmacro()
1182
1183if(ARROW_USE_GLOG)
1184 resolve_dependency(GLOG PC_PACKAGE_NAMES libglog)
1185 # TODO: Don't use global includes but rather target_include_directories
1186 get_target_property(GLOG_INCLUDE_DIR glog::glog INTERFACE_INCLUDE_DIRECTORIES)
1187 include_directories(SYSTEM ${GLOG_INCLUDE_DIR})
1188endif()
1189
1190# ----------------------------------------------------------------------
1191# gflags
1192
1193if(ARROW_BUILD_TESTS
1194 OR ARROW_BUILD_BENCHMARKS
1195 OR ARROW_BUILD_INTEGRATION
1196 OR ARROW_PLASMA
1197 OR ARROW_USE_GLOG
1198 OR ARROW_WITH_GRPC)
1199 set(ARROW_NEED_GFLAGS 1)
1200else()
1201 set(ARROW_NEED_GFLAGS 0)
1202endif()
1203
1204macro(build_gflags)
1205 message(STATUS "Building gflags from source")
1206
1207 set(GFLAGS_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/gflags_ep-prefix/src/gflags_ep")
1208 set(GFLAGS_INCLUDE_DIR "${GFLAGS_PREFIX}/include")
1209 if(${UPPERCASE_BUILD_TYPE} STREQUAL "DEBUG")
1210 set(GFLAGS_LIB_SUFFIX "_debug")
1211 else()
1212 set(GFLAGS_LIB_SUFFIX "")
1213 endif()
1214 if(MSVC)
1215 set(GFLAGS_STATIC_LIB "${GFLAGS_PREFIX}/lib/gflags_static${GFLAGS_LIB_SUFFIX}.lib")
1216 else()
1217 set(GFLAGS_STATIC_LIB "${GFLAGS_PREFIX}/lib/libgflags${GFLAGS_LIB_SUFFIX}.a")
1218 endif()
1219 set(GFLAGS_CMAKE_ARGS
1220 ${EP_COMMON_CMAKE_ARGS}
1221 "-DCMAKE_INSTALL_PREFIX=${GFLAGS_PREFIX}"
1222 -DBUILD_SHARED_LIBS=OFF
1223 -DBUILD_STATIC_LIBS=ON
1224 -DBUILD_PACKAGING=OFF
1225 -DBUILD_TESTING=OFF
1226 -DBUILD_CONFIG_TESTS=OFF
1227 -DINSTALL_HEADERS=ON)
1228
1229 file(MAKE_DIRECTORY "${GFLAGS_INCLUDE_DIR}")
1230 externalproject_add(gflags_ep
1231 URL ${GFLAGS_SOURCE_URL} ${EP_LOG_OPTIONS}
1232 URL_HASH "SHA256=${ARROW_GFLAGS_BUILD_SHA256_CHECKSUM}"
1233 BUILD_IN_SOURCE 1
1234 BUILD_BYPRODUCTS "${GFLAGS_STATIC_LIB}"
1235 CMAKE_ARGS ${GFLAGS_CMAKE_ARGS})
1236
1237 add_dependencies(toolchain gflags_ep)
1238
1239 add_thirdparty_lib(gflags STATIC_LIB ${GFLAGS_STATIC_LIB})
1240 set(GFLAGS_LIBRARY gflags_static)
1241 set_target_properties(${GFLAGS_LIBRARY}
1242 PROPERTIES INTERFACE_COMPILE_DEFINITIONS "GFLAGS_IS_A_DLL=0"
1243 INTERFACE_INCLUDE_DIRECTORIES "${GFLAGS_INCLUDE_DIR}")
1244 if(MSVC)
1245 set_target_properties(${GFLAGS_LIBRARY} PROPERTIES INTERFACE_LINK_LIBRARIES
1246 "shlwapi.lib")
1247 endif()
1248 set(GFLAGS_LIBRARIES ${GFLAGS_LIBRARY})
1249
1250 set(GFLAGS_VENDORED TRUE)
1251
1252 list(APPEND ARROW_BUNDLED_STATIC_LIBS gflags_static)
1253endmacro()
1254
1255if(ARROW_NEED_GFLAGS)
1256 set(ARROW_GFLAGS_REQUIRED_VERSION "2.1.0")
1257 resolve_dependency(gflags
1258 HAVE_ALT
1259 TRUE
1260 REQUIRED_VERSION
1261 ${ARROW_GFLAGS_REQUIRED_VERSION}
1262 IS_RUNTIME_DEPENDENCY
1263 FALSE)
1264 # TODO: Don't use global includes but rather target_include_directories
1265 include_directories(SYSTEM ${GFLAGS_INCLUDE_DIR})
1266
1267 if(NOT TARGET ${GFLAGS_LIBRARIES})
1268 if(TARGET gflags-shared)
1269 set(GFLAGS_LIBRARIES gflags-shared)
1270 elseif(TARGET gflags_shared)
1271 set(GFLAGS_LIBRARIES gflags_shared)
1272 endif()
1273 endif()
1274endif()
1275
1276# ----------------------------------------------------------------------
1277# Thrift
1278
1279macro(build_thrift)
1280 if(CMAKE_VERSION VERSION_LESS 3.10)
1281 message(FATAL_ERROR "Building thrift using ExternalProject requires at least CMake 3.10"
1282 )
1283 endif()
1284 message("Building Apache Thrift from source")
1285 set(THRIFT_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/thrift_ep-install")
1286 set(THRIFT_INCLUDE_DIR "${THRIFT_PREFIX}/include")
1287 set(THRIFT_CMAKE_ARGS
1288 ${EP_COMMON_CMAKE_ARGS}
1289 "-DCMAKE_INSTALL_PREFIX=${THRIFT_PREFIX}"
1290 "-DCMAKE_INSTALL_RPATH=${THRIFT_PREFIX}/lib"
1291 -DBUILD_COMPILER=OFF
1292 -DBUILD_SHARED_LIBS=OFF
1293 -DBUILD_TESTING=OFF
1294 -DBUILD_EXAMPLES=OFF
1295 -DBUILD_TUTORIALS=OFF
1296 -DWITH_QT4=OFF
1297 -DWITH_C_GLIB=OFF
1298 -DWITH_JAVA=OFF
1299 -DWITH_PYTHON=OFF
1300 -DWITH_HASKELL=OFF
1301 -DWITH_CPP=ON
1302 -DWITH_STATIC_LIB=ON
1303 -DWITH_LIBEVENT=OFF
1304 # Work around https://gitlab.kitware.com/cmake/cmake/issues/18865
1305 -DBoost_NO_BOOST_CMAKE=ON)
1306
1307 # Thrift also uses boost. Forward important boost settings if there were ones passed.
1308 if(DEFINED BOOST_ROOT)
1309 list(APPEND THRIFT_CMAKE_ARGS "-DBOOST_ROOT=${BOOST_ROOT}")
1310 endif()
1311 if(DEFINED Boost_NAMESPACE)
1312 list(APPEND THRIFT_CMAKE_ARGS "-DBoost_NAMESPACE=${Boost_NAMESPACE}")
1313 endif()
1314
1315 set(THRIFT_STATIC_LIB_NAME "${CMAKE_STATIC_LIBRARY_PREFIX}thrift")
1316 if(MSVC)
1317 if(ARROW_USE_STATIC_CRT)
1318 set(THRIFT_STATIC_LIB_NAME "${THRIFT_STATIC_LIB_NAME}mt")
1319 list(APPEND THRIFT_CMAKE_ARGS "-DWITH_MT=ON")
1320 else()
1321 set(THRIFT_STATIC_LIB_NAME "${THRIFT_STATIC_LIB_NAME}md")
1322 list(APPEND THRIFT_CMAKE_ARGS "-DWITH_MT=OFF")
1323 endif()
1324 endif()
1325 if(${UPPERCASE_BUILD_TYPE} STREQUAL "DEBUG")
1326 set(THRIFT_STATIC_LIB_NAME "${THRIFT_STATIC_LIB_NAME}d")
1327 endif()
1328 set(THRIFT_STATIC_LIB
1329 "${THRIFT_PREFIX}/lib/${THRIFT_STATIC_LIB_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX}")
1330
1331 if(BOOST_VENDORED)
1332 set(THRIFT_DEPENDENCIES ${THRIFT_DEPENDENCIES} boost_ep)
1333 endif()
1334
1335 externalproject_add(thrift_ep
1336 URL ${THRIFT_SOURCE_URL}
1337 URL_HASH "SHA256=${ARROW_THRIFT_BUILD_SHA256_CHECKSUM}"
1338 BUILD_BYPRODUCTS "${THRIFT_STATIC_LIB}"
1339 CMAKE_ARGS ${THRIFT_CMAKE_ARGS}
1340 DEPENDS ${THRIFT_DEPENDENCIES} ${EP_LOG_OPTIONS})
1341
1342 add_library(thrift::thrift STATIC IMPORTED)
1343 # The include directory must exist before it is referenced by a target.
1344 file(MAKE_DIRECTORY "${THRIFT_INCLUDE_DIR}")
1345 set_target_properties(thrift::thrift
1346 PROPERTIES IMPORTED_LOCATION "${THRIFT_STATIC_LIB}"
1347 INTERFACE_INCLUDE_DIRECTORIES "${THRIFT_INCLUDE_DIR}")
1348 add_dependencies(toolchain thrift_ep)
1349 add_dependencies(thrift::thrift thrift_ep)
1350 set(THRIFT_VERSION ${ARROW_THRIFT_BUILD_VERSION})
1351
1352 list(APPEND ARROW_BUNDLED_STATIC_LIBS thrift::thrift)
1353endmacro()
1354
1355if(ARROW_WITH_THRIFT)
1356 # We already may have looked for Thrift earlier, when considering whether
1357 # to build Boost, so don't look again if already found.
1358 if(NOT Thrift_FOUND)
1359 # Thrift c++ code generated by 0.13 requires 0.11 or greater
1360 resolve_dependency(Thrift
1361 REQUIRED_VERSION
1362 0.11.0
1363 PC_PACKAGE_NAMES
1364 thrift)
1365 endif()
1366 # TODO: Don't use global includes but rather target_include_directories
1367 include_directories(SYSTEM ${THRIFT_INCLUDE_DIR})
1368
1369 string(REPLACE "." ";" VERSION_LIST ${THRIFT_VERSION})
1370 list(GET VERSION_LIST 0 THRIFT_VERSION_MAJOR)
1371 list(GET VERSION_LIST 1 THRIFT_VERSION_MINOR)
1372 list(GET VERSION_LIST 2 THRIFT_VERSION_PATCH)
1373endif()
1374
1375# ----------------------------------------------------------------------
1376# Protocol Buffers (required for ORC and Flight and Gandiva libraries)
1377
1378macro(build_protobuf)
1379 message("Building Protocol Buffers from source")
1380 set(PROTOBUF_VENDORED TRUE)
1381 set(PROTOBUF_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/protobuf_ep-install")
1382 set(PROTOBUF_INCLUDE_DIR "${PROTOBUF_PREFIX}/include")
1383 # Newer protobuf releases always have a lib prefix independent from CMAKE_STATIC_LIBRARY_PREFIX
1384 set(PROTOBUF_STATIC_LIB
1385 "${PROTOBUF_PREFIX}/lib/libprotobuf${CMAKE_STATIC_LIBRARY_SUFFIX}")
1386 set(PROTOC_STATIC_LIB "${PROTOBUF_PREFIX}/lib/libprotoc${CMAKE_STATIC_LIBRARY_SUFFIX}")
1387 set(Protobuf_PROTOC_LIBRARY "${PROTOC_STATIC_LIB}")
1388 set(PROTOBUF_COMPILER "${PROTOBUF_PREFIX}/bin/protoc")
1389
1390 if(CMAKE_VERSION VERSION_LESS 3.7)
1391 set(PROTOBUF_CONFIGURE_ARGS
1392 "AR=${CMAKE_AR}"
1393 "RANLIB=${CMAKE_RANLIB}"
1394 "CC=${CMAKE_C_COMPILER}"
1395 "CXX=${CMAKE_CXX_COMPILER}"
1396 "--disable-shared"
1397 "--prefix=${PROTOBUF_PREFIX}"
1398 "CFLAGS=${EP_C_FLAGS}"
1399 "CXXFLAGS=${EP_CXX_FLAGS}")
1400 set(PROTOBUF_BUILD_COMMAND ${MAKE} ${MAKE_BUILD_ARGS})
1401 if(CMAKE_OSX_SYSROOT)
1402 list(APPEND PROTOBUF_CONFIGURE_ARGS "SDKROOT=${CMAKE_OSX_SYSROOT}")
1403 list(APPEND PROTOBUF_BUILD_COMMAND "SDKROOT=${CMAKE_OSX_SYSROOT}")
1404 endif()
1405 set(PROTOBUF_EXTERNAL_PROJECT_ADD_ARGS
1406 CONFIGURE_COMMAND
1407 "./configure"
1408 ${PROTOBUF_CONFIGURE_ARGS}
1409 BUILD_COMMAND
1410 ${PROTOBUF_BUILD_COMMAND})
1411 else()
1412 # Strip lto flags (which may be added by dh_auto_configure)
1413 # See https://github.com/protocolbuffers/protobuf/issues/7092
1414 set(PROTOBUF_C_FLAGS ${EP_C_FLAGS})
1415 set(PROTOBUF_CXX_FLAGS ${EP_CXX_FLAGS})
1416 string(REPLACE "-flto=auto" "" PROTOBUF_C_FLAGS "${PROTOBUF_C_FLAGS}")
1417 string(REPLACE "-ffat-lto-objects" "" PROTOBUF_C_FLAGS "${PROTOBUF_C_FLAGS}")
1418 string(REPLACE "-flto=auto" "" PROTOBUF_CXX_FLAGS "${PROTOBUF_CXX_FLAGS}")
1419 string(REPLACE "-ffat-lto-objects" "" PROTOBUF_CXX_FLAGS "${PROTOBUF_CXX_FLAGS}")
1420 set(PROTOBUF_CMAKE_ARGS
1421 ${EP_COMMON_CMAKE_ARGS}
1422 -DBUILD_SHARED_LIBS=OFF
1423 -DCMAKE_INSTALL_LIBDIR=lib
1424 "-DCMAKE_INSTALL_PREFIX=${PROTOBUF_PREFIX}"
1425 -Dprotobuf_BUILD_TESTS=OFF
1426 -Dprotobuf_DEBUG_POSTFIX=
1427 "-DCMAKE_C_FLAGS=${PROTOBUF_C_FLAGS}"
1428 "-DCMAKE_CXX_FLAGS=${PROTOBUF_CXX_FLAGS}"
1429 "-DCMAKE_C_FLAGS_${UPPERCASE_BUILD_TYPE}=${PROTOBUF_C_FLAGS}"
1430 "-DCMAKE_CXX_FLAGS_${UPPERCASE_BUILD_TYPE}=${PROTOBUF_CXX_FLAGS}")
1431 if(MSVC AND NOT ARROW_USE_STATIC_CRT)
1432 list(APPEND PROTOBUF_CMAKE_ARGS "-Dprotobuf_MSVC_STATIC_RUNTIME=OFF")
1433 endif()
1434 if(ZLIB_ROOT)
1435 list(APPEND PROTOBUF_CMAKE_ARGS "-DZLIB_ROOT=${ZLIB_ROOT}")
1436 endif()
1437 set(PROTOBUF_EXTERNAL_PROJECT_ADD_ARGS CMAKE_ARGS ${PROTOBUF_CMAKE_ARGS}
1438 SOURCE_SUBDIR "cmake")
1439 endif()
1440
1441 externalproject_add(protobuf_ep
1442 ${PROTOBUF_EXTERNAL_PROJECT_ADD_ARGS}
1443 BUILD_BYPRODUCTS "${PROTOBUF_STATIC_LIB}" "${PROTOBUF_COMPILER}"
1444 ${EP_LOG_OPTIONS}
1445 BUILD_IN_SOURCE 1
1446 URL ${PROTOBUF_SOURCE_URL}
1447 URL_HASH "SHA256=${ARROW_PROTOBUF_BUILD_SHA256_CHECKSUM}")
1448
1449 file(MAKE_DIRECTORY "${PROTOBUF_INCLUDE_DIR}")
1450
1451 add_library(arrow::protobuf::libprotobuf STATIC IMPORTED)
1452 set_target_properties(arrow::protobuf::libprotobuf
1453 PROPERTIES IMPORTED_LOCATION "${PROTOBUF_STATIC_LIB}"
1454 INTERFACE_INCLUDE_DIRECTORIES
1455 "${PROTOBUF_INCLUDE_DIR}")
1456 add_library(arrow::protobuf::libprotoc STATIC IMPORTED)
1457 set_target_properties(arrow::protobuf::libprotoc
1458 PROPERTIES IMPORTED_LOCATION "${PROTOC_STATIC_LIB}"
1459 INTERFACE_INCLUDE_DIRECTORIES
1460 "${PROTOBUF_INCLUDE_DIR}")
1461 add_executable(arrow::protobuf::protoc IMPORTED)
1462 set_target_properties(arrow::protobuf::protoc PROPERTIES IMPORTED_LOCATION
1463 "${PROTOBUF_COMPILER}")
1464
1465 add_dependencies(toolchain protobuf_ep)
1466 add_dependencies(arrow::protobuf::libprotobuf protobuf_ep)
1467
1468 list(APPEND ARROW_BUNDLED_STATIC_LIBS arrow::protobuf::libprotobuf)
1469endmacro()
1470
1471if(ARROW_WITH_PROTOBUF)
1472 if(ARROW_WITH_GRPC)
1473 # FlightSQL uses proto3 optionals, which require 3.15 or later.
1474 set(ARROW_PROTOBUF_REQUIRED_VERSION "3.15.0")
1475 elseif(ARROW_GANDIVA_JAVA)
1476 # google::protobuf::MessageLite::ByteSize() is deprecated since
1477 # Protobuf 3.4.0.
1478 set(ARROW_PROTOBUF_REQUIRED_VERSION "3.4.0")
1479 else()
1480 set(ARROW_PROTOBUF_REQUIRED_VERSION "2.6.1")
1481 endif()
1482 resolve_dependency(Protobuf
1483 REQUIRED_VERSION
1484 ${ARROW_PROTOBUF_REQUIRED_VERSION}
1485 PC_PACKAGE_NAMES
1486 protobuf)
1487
1488 if(ARROW_PROTOBUF_USE_SHARED AND MSVC_TOOLCHAIN)
1489 add_definitions(-DPROTOBUF_USE_DLLS)
1490 endif()
1491
1492 # TODO: Don't use global includes but rather target_include_directories
1493 include_directories(SYSTEM ${PROTOBUF_INCLUDE_DIR})
1494
1495 if(TARGET arrow::protobuf::libprotobuf)
1496 set(ARROW_PROTOBUF_LIBPROTOBUF arrow::protobuf::libprotobuf)
1497 else()
1498 # CMake 3.8 or older don't define the targets
1499 if(NOT TARGET protobuf::libprotobuf)
1500 add_library(protobuf::libprotobuf UNKNOWN IMPORTED)
1501 set_target_properties(protobuf::libprotobuf
1502 PROPERTIES IMPORTED_LOCATION "${PROTOBUF_LIBRARY}"
1503 INTERFACE_INCLUDE_DIRECTORIES
1504 "${PROTOBUF_INCLUDE_DIR}")
1505 endif()
1506 set(ARROW_PROTOBUF_LIBPROTOBUF protobuf::libprotobuf)
1507 endif()
1508 if(TARGET arrow::protobuf::libprotoc)
1509 set(ARROW_PROTOBUF_LIBPROTOC arrow::protobuf::libprotoc)
1510 else()
1511 # CMake 3.8 or older don't define the targets
1512 if(NOT TARGET protobuf::libprotoc)
1513 if(PROTOBUF_PROTOC_LIBRARY AND NOT Protobuf_PROTOC_LIBRARY)
1514 # Old CMake versions have a different casing.
1515 set(Protobuf_PROTOC_LIBRARY ${PROTOBUF_PROTOC_LIBRARY})
1516 endif()
1517 if(NOT Protobuf_PROTOC_LIBRARY)
1518 message(FATAL_ERROR "libprotoc was set to ${Protobuf_PROTOC_LIBRARY}")
1519 endif()
1520 add_library(protobuf::libprotoc UNKNOWN IMPORTED)
1521 set_target_properties(protobuf::libprotoc
1522 PROPERTIES IMPORTED_LOCATION "${Protobuf_PROTOC_LIBRARY}"
1523 INTERFACE_INCLUDE_DIRECTORIES
1524 "${PROTOBUF_INCLUDE_DIR}")
1525 endif()
1526 set(ARROW_PROTOBUF_LIBPROTOC protobuf::libprotoc)
1527 endif()
1528 if(TARGET arrow::protobuf::protoc)
1529 set(ARROW_PROTOBUF_PROTOC arrow::protobuf::protoc)
1530 else()
1531 if(NOT TARGET protobuf::protoc)
1532 add_executable(protobuf::protoc IMPORTED)
1533 set_target_properties(protobuf::protoc PROPERTIES IMPORTED_LOCATION
1534 "${PROTOBUF_PROTOC_EXECUTABLE}")
1535 endif()
1536 set(ARROW_PROTOBUF_PROTOC protobuf::protoc)
1537 endif()
1538
1539 # Log protobuf paths as we often see issues with mixed sources for
1540 # the libraries and protoc.
1541 get_target_property(PROTOBUF_PROTOC_EXECUTABLE ${ARROW_PROTOBUF_PROTOC}
1542 IMPORTED_LOCATION)
1543 message(STATUS "Found protoc: ${PROTOBUF_PROTOC_EXECUTABLE}")
1544 # Protobuf_PROTOC_LIBRARY is set by all versions of FindProtobuf.cmake
1545 message(STATUS "Found libprotoc: ${Protobuf_PROTOC_LIBRARY}")
1546 get_target_property(PROTOBUF_LIBRARY ${ARROW_PROTOBUF_LIBPROTOBUF} IMPORTED_LOCATION)
1547 message(STATUS "Found libprotobuf: ${PROTOBUF_LIBRARY}")
1548 message(STATUS "Found protobuf headers: ${PROTOBUF_INCLUDE_DIR}")
1549endif()
1550
1551# ----------------------------------------------------------------------
1552# jemalloc - Unix-only high-performance allocator
1553
1554if(ARROW_JEMALLOC)
1555 message(STATUS "Building (vendored) jemalloc from source")
1556 # We only use a vendored jemalloc as we want to control its version.
1557 # Also our build of jemalloc is specially prefixed so that it will not
1558 # conflict with the default allocator as well as other jemalloc
1559 # installations.
1560 # find_package(jemalloc)
1561
1562 set(ARROW_JEMALLOC_USE_SHARED OFF)
1563 set(JEMALLOC_PREFIX
1564 "${CMAKE_CURRENT_BINARY_DIR}/jemalloc_ep-prefix/src/jemalloc_ep/dist/")
1565 set(JEMALLOC_LIB_DIR "${JEMALLOC_PREFIX}/lib")
1566 set(JEMALLOC_STATIC_LIB
1567 "${JEMALLOC_LIB_DIR}/libjemalloc_pic${CMAKE_STATIC_LIBRARY_SUFFIX}")
1568 set(JEMALLOC_CONFIGURE_COMMAND ./configure "AR=${CMAKE_AR}" "CC=${CMAKE_C_COMPILER}")
1569 if(CMAKE_OSX_SYSROOT)
1570 list(APPEND JEMALLOC_CONFIGURE_COMMAND "SDKROOT=${CMAKE_OSX_SYSROOT}")
1571 endif()
1572 if(DEFINED ARROW_JEMALLOC_LG_PAGE)
1573 # Used for arm64 manylinux wheels in order to make the wheel work on both
1574 # 4k and 64k page arm64 systems.
1575 list(APPEND JEMALLOC_CONFIGURE_COMMAND "--with-lg-page=${ARROW_JEMALLOC_LG_PAGE}")
1576 endif()
1577 list(APPEND
1578 JEMALLOC_CONFIGURE_COMMAND
1579 "--prefix=${JEMALLOC_PREFIX}"
1580 "--libdir=${JEMALLOC_LIB_DIR}"
1581 "--with-jemalloc-prefix=je_arrow_"
1582 "--with-private-namespace=je_arrow_private_"
1583 "--without-export"
1584 "--disable-shared"
1585 # Don't override operator new()
1586 "--disable-cxx"
1587 "--disable-libdl"
1588 # See https://github.com/jemalloc/jemalloc/issues/1237
1589 "--disable-initial-exec-tls"
1590 ${EP_LOG_OPTIONS})
1591 set(JEMALLOC_BUILD_COMMAND ${MAKE} ${MAKE_BUILD_ARGS})
1592 if(CMAKE_OSX_SYSROOT)
1593 list(APPEND JEMALLOC_BUILD_COMMAND "SDKROOT=${CMAKE_OSX_SYSROOT}")
1594 endif()
1595 externalproject_add(jemalloc_ep
1596 URL ${JEMALLOC_SOURCE_URL}
1597 URL_HASH "SHA256=${ARROW_JEMALLOC_BUILD_SHA256_CHECKSUM}"
1598 PATCH_COMMAND touch doc/jemalloc.3 doc/jemalloc.html
1599 # The prefix "je_arrow_" must be kept in sync with the value in memory_pool.cc
1600 CONFIGURE_COMMAND ${JEMALLOC_CONFIGURE_COMMAND}
1601 BUILD_IN_SOURCE 1
1602 BUILD_COMMAND ${JEMALLOC_BUILD_COMMAND}
1603 BUILD_BYPRODUCTS "${JEMALLOC_STATIC_LIB}"
1604 INSTALL_COMMAND ${MAKE} -j1 install)
1605
1606 # Don't use the include directory directly so that we can point to a path
1607 # that is unique to our codebase.
1608 include_directories(SYSTEM "${CMAKE_CURRENT_BINARY_DIR}/jemalloc_ep-prefix/src/")
1609 # The include directory must exist before it is referenced by a target.
1610 file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/jemalloc_ep-prefix/src/")
1611 add_library(jemalloc::jemalloc STATIC IMPORTED)
1612 set_target_properties(jemalloc::jemalloc
1613 PROPERTIES INTERFACE_LINK_LIBRARIES Threads::Threads
1614 IMPORTED_LOCATION "${JEMALLOC_STATIC_LIB}"
1615 INTERFACE_INCLUDE_DIRECTORIES
1616 "${CMAKE_CURRENT_BINARY_DIR}/jemalloc_ep-prefix/src")
1617 add_dependencies(jemalloc::jemalloc jemalloc_ep)
1618
1619 list(APPEND ARROW_BUNDLED_STATIC_LIBS jemalloc::jemalloc)
1620endif()
1621
1622# ----------------------------------------------------------------------
1623# mimalloc - Cross-platform high-performance allocator, from Microsoft
1624
1625if(ARROW_MIMALLOC)
1626 message(STATUS "Building (vendored) mimalloc from source")
1627 # We only use a vendored mimalloc as we want to control its build options.
1628
1629 set(MIMALLOC_LIB_BASE_NAME "mimalloc")
1630 if(WIN32)
1631 set(MIMALLOC_LIB_BASE_NAME "${MIMALLOC_LIB_BASE_NAME}-static")
1632 endif()
1633 if(${UPPERCASE_BUILD_TYPE} STREQUAL "DEBUG")
1634 set(MIMALLOC_LIB_BASE_NAME "${MIMALLOC_LIB_BASE_NAME}-${LOWERCASE_BUILD_TYPE}")
1635 endif()
1636
1637 set(MIMALLOC_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/mimalloc_ep/src/mimalloc_ep")
1638 set(MIMALLOC_INCLUDE_DIR "${MIMALLOC_PREFIX}/include/mimalloc-1.7")
1639 set(MIMALLOC_STATIC_LIB
1640 "${MIMALLOC_PREFIX}/lib/mimalloc-1.7/${CMAKE_STATIC_LIBRARY_PREFIX}${MIMALLOC_LIB_BASE_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX}"
1641 )
1642
1643 set(MIMALLOC_CMAKE_ARGS
1644 ${EP_COMMON_CMAKE_ARGS}
1645 "-DCMAKE_INSTALL_PREFIX=${MIMALLOC_PREFIX}"
1646 -DMI_OVERRIDE=OFF
1647 -DMI_LOCAL_DYNAMIC_TLS=ON
1648 -DMI_BUILD_OBJECT=OFF
1649 -DMI_BUILD_SHARED=OFF
1650 -DMI_BUILD_TESTS=OFF)
1651
1652 externalproject_add(mimalloc_ep
1653 URL ${MIMALLOC_SOURCE_URL}
1654 URL_HASH "SHA256=${ARROW_MIMALLOC_BUILD_SHA256_CHECKSUM}"
1655 CMAKE_ARGS ${MIMALLOC_CMAKE_ARGS}
1656 BUILD_BYPRODUCTS "${MIMALLOC_STATIC_LIB}")
1657
1658 include_directories(SYSTEM ${MIMALLOC_INCLUDE_DIR})
1659 file(MAKE_DIRECTORY ${MIMALLOC_INCLUDE_DIR})
1660
1661 add_library(mimalloc::mimalloc STATIC IMPORTED)
1662 set_target_properties(mimalloc::mimalloc
1663 PROPERTIES INTERFACE_LINK_LIBRARIES Threads::Threads
1664 IMPORTED_LOCATION "${MIMALLOC_STATIC_LIB}"
1665 INTERFACE_INCLUDE_DIRECTORIES
1666 "${MIMALLOC_INCLUDE_DIR}")
1667 add_dependencies(mimalloc::mimalloc mimalloc_ep)
1668 add_dependencies(toolchain mimalloc_ep)
1669
1670 list(APPEND ARROW_BUNDLED_STATIC_LIBS mimalloc::mimalloc)
1671endif()
1672
1673# ----------------------------------------------------------------------
1674# Google gtest
1675
1676macro(build_gtest)
1677 message(STATUS "Building gtest from source")
1678 set(GTEST_VENDORED TRUE)
1679 set(GTEST_CMAKE_CXX_FLAGS ${EP_CXX_FLAGS})
1680
1681 if(CMAKE_BUILD_TYPE MATCHES DEBUG)
1682 set(CMAKE_GTEST_DEBUG_EXTENSION "d")
1683 else()
1684 set(CMAKE_GTEST_DEBUG_EXTENSION "")
1685 endif()
1686
1687 if(APPLE)
1688 set(GTEST_CMAKE_CXX_FLAGS ${GTEST_CMAKE_CXX_FLAGS} -DGTEST_USE_OWN_TR1_TUPLE=1
1689 -Wno-unused-value -Wno-ignored-attributes)
1690 endif()
1691
1692 if(MSVC)
1693 set(GTEST_CMAKE_CXX_FLAGS "${GTEST_CMAKE_CXX_FLAGS} -DGTEST_CREATE_SHARED_LIBRARY=1")
1694 endif()
1695
1696 set(GTEST_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/googletest_ep-prefix")
1697 set(GTEST_INCLUDE_DIR "${GTEST_PREFIX}/include")
1698
1699 set(_GTEST_LIBRARY_DIR "${GTEST_PREFIX}/lib")
1700
1701 if(MSVC)
1702 set(_GTEST_IMPORTED_TYPE IMPORTED_IMPLIB)
1703 set(_GTEST_LIBRARY_SUFFIX
1704 "${CMAKE_GTEST_DEBUG_EXTENSION}${CMAKE_IMPORT_LIBRARY_SUFFIX}")
1705 else()
1706 set(_GTEST_IMPORTED_TYPE IMPORTED_LOCATION)
1707 set(_GTEST_LIBRARY_SUFFIX
1708 "${CMAKE_GTEST_DEBUG_EXTENSION}${CMAKE_SHARED_LIBRARY_SUFFIX}")
1709
1710 endif()
1711
1712 set(GTEST_SHARED_LIB
1713 "${_GTEST_LIBRARY_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}gtest${_GTEST_LIBRARY_SUFFIX}")
1714 set(GMOCK_SHARED_LIB
1715 "${_GTEST_LIBRARY_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}gmock${_GTEST_LIBRARY_SUFFIX}")
1716 set(GTEST_MAIN_SHARED_LIB
1717 "${_GTEST_LIBRARY_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}gtest_main${_GTEST_LIBRARY_SUFFIX}"
1718 )
1719 set(GTEST_INSTALL_NAME_DIR "$<INSTALL_PREFIX$<ANGLE-R>/lib")
1720 # Fix syntax highlighting mess introduced by unclosed bracket above
1721 set(dummy ">")
1722
1723 set(GTEST_CMAKE_ARGS
1724 ${EP_COMMON_TOOLCHAIN}
1725 -DBUILD_SHARED_LIBS=ON
1726 -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
1727 -DCMAKE_CXX_FLAGS=${GTEST_CMAKE_CXX_FLAGS}
1728 -DCMAKE_CXX_FLAGS_${UPPERCASE_BUILD_TYPE}=${GTEST_CMAKE_CXX_FLAGS}
1729 -DCMAKE_INSTALL_LIBDIR=lib
1730 -DCMAKE_INSTALL_NAME_DIR=${GTEST_INSTALL_NAME_DIR}
1731 -DCMAKE_INSTALL_PREFIX=${GTEST_PREFIX}
1732 -DCMAKE_MACOSX_RPATH=OFF)
1733 set(GMOCK_INCLUDE_DIR "${GTEST_PREFIX}/include")
1734
1735 add_definitions(-DGTEST_LINKED_AS_SHARED_LIBRARY=1)
1736
1737 if(MSVC AND NOT ARROW_USE_STATIC_CRT)
1738 set(GTEST_CMAKE_ARGS ${GTEST_CMAKE_ARGS} -Dgtest_force_shared_crt=ON)
1739 endif()
1740
1741 externalproject_add(googletest_ep
1742 URL ${GTEST_SOURCE_URL}
1743 URL_HASH "SHA256=${ARROW_GTEST_BUILD_SHA256_CHECKSUM}"
1744 BUILD_BYPRODUCTS ${GTEST_SHARED_LIB} ${GTEST_MAIN_SHARED_LIB}
1745 ${GMOCK_SHARED_LIB}
1746 CMAKE_ARGS ${GTEST_CMAKE_ARGS} ${EP_LOG_OPTIONS})
1747 if(WIN32)
1748 # Copy the built shared libraries to the same directory as our
1749 # test programs because Windows doesn't provided rpath (run-time
1750 # search path) feature. We need to put these shared libraries to
1751 # the same directory as our test programs or add
1752 # _GTEST_LIBRARY_DIR to PATH when we run our test programs. We
1753 # choose the former because the latter may be forgotten.
1754 set(_GTEST_RUNTIME_DIR "${GTEST_PREFIX}/bin")
1755 set(_GTEST_RUNTIME_SUFFIX
1756 "${CMAKE_GTEST_DEBUG_EXTENSION}${CMAKE_SHARED_LIBRARY_SUFFIX}")
1757 set(_GTEST_RUNTIME_LIB
1758 "${_GTEST_RUNTIME_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}gtest${_GTEST_RUNTIME_SUFFIX}"
1759 )
1760 set(_GMOCK_RUNTIME_LIB
1761 "${_GTEST_RUNTIME_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}gmock${_GTEST_RUNTIME_SUFFIX}"
1762 )
1763 set(_GTEST_MAIN_RUNTIME_LIB
1764 "${_GTEST_RUNTIME_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}gtest_main${_GTEST_RUNTIME_SUFFIX}"
1765 )
1766 if(CMAKE_VERSION VERSION_LESS 3.9)
1767 message(FATAL_ERROR "Building GoogleTest from source on Windows requires at least CMake 3.9"
1768 )
1769 endif()
1770 get_property(_GENERATOR_IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
1771 if(_GENERATOR_IS_MULTI_CONFIG)
1772 set(_GTEST_RUNTIME_OUTPUT_DIR "${BUILD_OUTPUT_ROOT_DIRECTORY}/${CMAKE_BUILD_TYPE}")
1773 else()
1774 set(_GTEST_RUNTIME_OUTPUT_DIR ${BUILD_OUTPUT_ROOT_DIRECTORY})
1775 endif()
1776 externalproject_add_step(googletest_ep copy
1777 COMMAND ${CMAKE_COMMAND} -E make_directory
1778 ${_GTEST_RUNTIME_OUTPUT_DIR}
1779 COMMAND ${CMAKE_COMMAND} -E copy ${_GTEST_RUNTIME_LIB}
1780 ${_GTEST_RUNTIME_OUTPUT_DIR}
1781 COMMAND ${CMAKE_COMMAND} -E copy ${_GMOCK_RUNTIME_LIB}
1782 ${_GTEST_RUNTIME_OUTPUT_DIR}
1783 COMMAND ${CMAKE_COMMAND} -E copy ${_GTEST_MAIN_RUNTIME_LIB}
1784 ${_GTEST_RUNTIME_OUTPUT_DIR}
1785 DEPENDEES install)
1786 endif()
1787
1788 # The include directory must exist before it is referenced by a target.
1789 file(MAKE_DIRECTORY "${GTEST_INCLUDE_DIR}")
1790
1791 add_library(GTest::gtest SHARED IMPORTED)
1792 set_target_properties(GTest::gtest
1793 PROPERTIES ${_GTEST_IMPORTED_TYPE} "${GTEST_SHARED_LIB}"
1794 INTERFACE_INCLUDE_DIRECTORIES "${GTEST_INCLUDE_DIR}")
1795
1796 add_library(GTest::gtest_main SHARED IMPORTED)
1797 set_target_properties(GTest::gtest_main
1798 PROPERTIES ${_GTEST_IMPORTED_TYPE} "${GTEST_MAIN_SHARED_LIB}"
1799 INTERFACE_INCLUDE_DIRECTORIES "${GTEST_INCLUDE_DIR}")
1800
1801 add_library(GTest::gmock SHARED IMPORTED)
1802 set_target_properties(GTest::gmock
1803 PROPERTIES ${_GTEST_IMPORTED_TYPE} "${GMOCK_SHARED_LIB}"
1804 INTERFACE_INCLUDE_DIRECTORIES "${GTEST_INCLUDE_DIR}")
1805 add_dependencies(toolchain-tests googletest_ep)
1806 add_dependencies(GTest::gtest googletest_ep)
1807 add_dependencies(GTest::gtest_main googletest_ep)
1808 add_dependencies(GTest::gmock googletest_ep)
1809endmacro()
1810
1811if(ARROW_TESTING)
1812 resolve_dependency(GTest
1813 REQUIRED_VERSION
1814 1.10.0
1815 USE_CONFIG
1816 TRUE)
1817
1818 if(NOT GTEST_VENDORED)
1819 # TODO(wesm): This logic does not work correctly with the MSVC static libraries
1820 # built for the shared crt
1821
1822 # set(CMAKE_REQUIRED_LIBRARIES GTest::GTest GTest::Main GTest::GMock)
1823 # CHECK_CXX_SOURCE_COMPILES("
1824 # #include <gmock/gmock.h>
1825 # #include <gtest/gtest.h>
1826
1827 # class A {
1828 # public:
1829 # int run() const { return 1; }
1830 # };
1831
1832 # class B : public A {
1833 # public:
1834 # MOCK_CONST_METHOD0(run, int());
1835 # };
1836
1837 # TEST(Base, Test) {
1838 # B b;
1839 # }" GTEST_COMPILES_WITHOUT_MACRO)
1840 # if (NOT GTEST_COMPILES_WITHOUT_MACRO)
1841 # message(STATUS "Setting GTEST_LINKED_AS_SHARED_LIBRARY=1 on GTest::GTest")
1842 # add_compile_definitions("GTEST_LINKED_AS_SHARED_LIBRARY=1")
1843 # endif()
1844 # set(CMAKE_REQUIRED_LIBRARIES)
1845 endif()
1846
1847 get_target_property(GTEST_INCLUDE_DIR GTest::gtest INTERFACE_INCLUDE_DIRECTORIES)
1848 # TODO: Don't use global includes but rather target_include_directories
1849 include_directories(SYSTEM ${GTEST_INCLUDE_DIR})
1850endif()
1851
1852macro(build_benchmark)
1853 message(STATUS "Building benchmark from source")
1854 if(CMAKE_VERSION VERSION_LESS 3.6)
1855 message(FATAL_ERROR "Building gbenchmark from source requires at least CMake 3.6")
1856 endif()
1857
1858 if(NOT MSVC)
1859 set(GBENCHMARK_CMAKE_CXX_FLAGS "${EP_CXX_FLAGS} -std=c++11")
1860 endif()
1861
1862 if(APPLE AND (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" OR CMAKE_CXX_COMPILER_ID
1863 STREQUAL "Clang"))
1864 set(GBENCHMARK_CMAKE_CXX_FLAGS "${GBENCHMARK_CMAKE_CXX_FLAGS} -stdlib=libc++")
1865 endif()
1866
1867 set(GBENCHMARK_PREFIX
1868 "${CMAKE_CURRENT_BINARY_DIR}/gbenchmark_ep/src/gbenchmark_ep-install")
1869 set(GBENCHMARK_INCLUDE_DIR "${GBENCHMARK_PREFIX}/include")
1870 set(GBENCHMARK_STATIC_LIB
1871 "${GBENCHMARK_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}benchmark${CMAKE_STATIC_LIBRARY_SUFFIX}"
1872 )
1873 set(GBENCHMARK_MAIN_STATIC_LIB
1874 "${GBENCHMARK_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}benchmark_main${CMAKE_STATIC_LIBRARY_SUFFIX}"
1875 )
1876 set(GBENCHMARK_CMAKE_ARGS
1877 ${EP_COMMON_CMAKE_ARGS}
1878 "-DCMAKE_INSTALL_PREFIX=${GBENCHMARK_PREFIX}"
1879 -DCMAKE_INSTALL_LIBDIR=lib
1880 -DBENCHMARK_ENABLE_TESTING=OFF
1881 -DCMAKE_CXX_FLAGS=${GBENCHMARK_CMAKE_CXX_FLAGS})
1882 if(APPLE)
1883 set(GBENCHMARK_CMAKE_ARGS ${GBENCHMARK_CMAKE_ARGS} "-DBENCHMARK_USE_LIBCXX=ON")
1884 endif()
1885
1886 externalproject_add(gbenchmark_ep
1887 URL ${GBENCHMARK_SOURCE_URL}
1888 URL_HASH "SHA256=${ARROW_GBENCHMARK_BUILD_SHA256_CHECKSUM}"
1889 BUILD_BYPRODUCTS "${GBENCHMARK_STATIC_LIB}"
1890 "${GBENCHMARK_MAIN_STATIC_LIB}"
1891 CMAKE_ARGS ${GBENCHMARK_CMAKE_ARGS} ${EP_LOG_OPTIONS})
1892
1893 # The include directory must exist before it is referenced by a target.
1894 file(MAKE_DIRECTORY "${GBENCHMARK_INCLUDE_DIR}")
1895
1896 add_library(benchmark::benchmark STATIC IMPORTED)
1897 set_target_properties(benchmark::benchmark
1898 PROPERTIES IMPORTED_LOCATION "${GBENCHMARK_STATIC_LIB}"
1899 INTERFACE_INCLUDE_DIRECTORIES
1900 "${GBENCHMARK_INCLUDE_DIR}")
1901
1902 add_library(benchmark::benchmark_main STATIC IMPORTED)
1903 set_target_properties(benchmark::benchmark_main
1904 PROPERTIES IMPORTED_LOCATION "${GBENCHMARK_MAIN_STATIC_LIB}"
1905 INTERFACE_INCLUDE_DIRECTORIES
1906 "${GBENCHMARK_INCLUDE_DIR}")
1907
1908 add_dependencies(toolchain-benchmarks gbenchmark_ep)
1909 add_dependencies(benchmark::benchmark gbenchmark_ep)
1910 add_dependencies(benchmark::benchmark_main gbenchmark_ep)
1911endmacro()
1912
1913if(ARROW_BUILD_BENCHMARKS)
1914 # ArgsProduct() is available since 1.5.2
1915 set(BENCHMARK_REQUIRED_VERSION 1.5.2)
1916 resolve_dependency(benchmark
1917 REQUIRED_VERSION
1918 ${BENCHMARK_REQUIRED_VERSION}
1919 IS_RUNTIME_DEPENDENCY
1920 FALSE)
1921 # TODO: Don't use global includes but rather target_include_directories
1922 get_target_property(BENCHMARK_INCLUDE_DIR benchmark::benchmark
1923 INTERFACE_INCLUDE_DIRECTORIES)
1924 include_directories(SYSTEM ${BENCHMARK_INCLUDE_DIR})
1925endif()
1926
1927macro(build_rapidjson)
1928 message(STATUS "Building RapidJSON from source")
1929 set(RAPIDJSON_PREFIX
1930 "${CMAKE_CURRENT_BINARY_DIR}/rapidjson_ep/src/rapidjson_ep-install")
1931 set(RAPIDJSON_CMAKE_ARGS
1932 ${EP_COMMON_CMAKE_ARGS}
1933 -DRAPIDJSON_BUILD_DOC=OFF
1934 -DRAPIDJSON_BUILD_EXAMPLES=OFF
1935 -DRAPIDJSON_BUILD_TESTS=OFF
1936 "-DCMAKE_INSTALL_PREFIX=${RAPIDJSON_PREFIX}")
1937
1938 externalproject_add(rapidjson_ep
1939 ${EP_LOG_OPTIONS}
1940 PREFIX "${CMAKE_BINARY_DIR}"
1941 URL ${RAPIDJSON_SOURCE_URL}
1942 URL_HASH "SHA256=${ARROW_RAPIDJSON_BUILD_SHA256_CHECKSUM}"
1943 CMAKE_ARGS ${RAPIDJSON_CMAKE_ARGS})
1944
1945 set(RAPIDJSON_INCLUDE_DIR "${RAPIDJSON_PREFIX}/include")
1946
1947 add_dependencies(toolchain rapidjson_ep)
1948 add_dependencies(toolchain-tests rapidjson_ep)
1949 add_dependencies(rapidjson rapidjson_ep)
1950
1951 set(RAPIDJSON_VENDORED TRUE)
1952endmacro()
1953
1954if(ARROW_WITH_RAPIDJSON)
1955 set(ARROW_RAPIDJSON_REQUIRED_VERSION "1.1.0")
1956 resolve_dependency(RapidJSON
1957 HAVE_ALT
1958 TRUE
1959 REQUIRED_VERSION
1960 ${ARROW_RAPIDJSON_REQUIRED_VERSION}
1961 IS_RUNTIME_DEPENDENCY
1962 FALSE)
1963
1964 if(RapidJSON_INCLUDE_DIR)
1965 set(RAPIDJSON_INCLUDE_DIR "${RapidJSON_INCLUDE_DIR}")
1966 endif()
1967
1968 # TODO: Don't use global includes but rather target_include_directories
1969 include_directories(SYSTEM ${RAPIDJSON_INCLUDE_DIR})
1970endif()
1971
1972macro(build_xsimd)
1973 message(STATUS "Building xsimd from source")
1974 set(XSIMD_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/xsimd_ep/src/xsimd_ep-install")
1975 set(XSIMD_CMAKE_ARGS ${EP_COMMON_CMAKE_ARGS} "-DCMAKE_INSTALL_PREFIX=${XSIMD_PREFIX}")
1976
1977 externalproject_add(xsimd_ep
1978 ${EP_LOG_OPTIONS}
1979 PREFIX "${CMAKE_BINARY_DIR}"
1980 URL ${XSIMD_SOURCE_URL}
1981 URL_HASH "SHA256=${ARROW_XSIMD_BUILD_SHA256_CHECKSUM}"
1982 CMAKE_ARGS ${XSIMD_CMAKE_ARGS})
1983
1984 set(XSIMD_INCLUDE_DIR "${XSIMD_PREFIX}/include")
1985
1986 add_dependencies(toolchain xsimd_ep)
1987 add_dependencies(toolchain-tests xsimd_ep)
1988
1989 set(XSIMD_VENDORED TRUE)
1990endmacro()
1991
1992if((NOT ARROW_SIMD_LEVEL STREQUAL "NONE") OR (NOT ARROW_RUNTIME_SIMD_LEVEL STREQUAL "NONE"
1993 ))
1994 set(xsimd_SOURCE "BUNDLED")
1995 resolve_dependency(xsimd)
1996 # TODO: Don't use global includes but rather target_include_directories
1997 include_directories(SYSTEM ${XSIMD_INCLUDE_DIR})
1998endif()
1999
2000macro(build_zlib)
2001 message(STATUS "Building ZLIB from source")
2002 set(ZLIB_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/zlib_ep/src/zlib_ep-install")
2003 if(MSVC)
2004 if(${UPPERCASE_BUILD_TYPE} STREQUAL "DEBUG")
2005 set(ZLIB_STATIC_LIB_NAME zlibstaticd.lib)
2006 else()
2007 set(ZLIB_STATIC_LIB_NAME zlibstatic.lib)
2008 endif()
2009 else()
2010 set(ZLIB_STATIC_LIB_NAME libz.a)
2011 endif()
2012 set(ZLIB_STATIC_LIB "${ZLIB_PREFIX}/lib/${ZLIB_STATIC_LIB_NAME}")
2013 set(ZLIB_CMAKE_ARGS ${EP_COMMON_CMAKE_ARGS} "-DCMAKE_INSTALL_PREFIX=${ZLIB_PREFIX}"
2014 -DBUILD_SHARED_LIBS=OFF)
2015
2016 externalproject_add(zlib_ep
2017 URL ${ZLIB_SOURCE_URL} ${EP_LOG_OPTIONS}
2018 URL_HASH "SHA256=${ARROW_ZLIB_BUILD_SHA256_CHECKSUM}"
2019 BUILD_BYPRODUCTS "${ZLIB_STATIC_LIB}"
2020 CMAKE_ARGS ${ZLIB_CMAKE_ARGS})
2021
2022 file(MAKE_DIRECTORY "${ZLIB_PREFIX}/include")
2023
2024 add_library(ZLIB::ZLIB STATIC IMPORTED)
2025 set(ZLIB_LIBRARIES ${ZLIB_STATIC_LIB})
2026 set(ZLIB_INCLUDE_DIRS "${ZLIB_PREFIX}/include")
2027 set_target_properties(ZLIB::ZLIB
2028 PROPERTIES IMPORTED_LOCATION ${ZLIB_LIBRARIES}
2029 INTERFACE_INCLUDE_DIRECTORIES ${ZLIB_INCLUDE_DIRS})
2030
2031 add_dependencies(toolchain zlib_ep)
2032 add_dependencies(ZLIB::ZLIB zlib_ep)
2033
2034 list(APPEND ARROW_BUNDLED_STATIC_LIBS ZLIB::ZLIB)
2035endmacro()
2036
2037if(ARROW_WITH_ZLIB)
2038 resolve_dependency(ZLIB PC_PACKAGE_NAMES zlib)
2039
2040 # TODO: Don't use global includes but rather target_include_directories
2041 get_target_property(ZLIB_INCLUDE_DIR ZLIB::ZLIB INTERFACE_INCLUDE_DIRECTORIES)
2042 include_directories(SYSTEM ${ZLIB_INCLUDE_DIR})
2043endif()
2044
2045macro(build_lz4)
2046 message(STATUS "Building lz4 from source")
2047 set(LZ4_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/lz4_ep-prefix/src/lz4_ep")
2048 set(LZ4_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/lz4_ep-prefix")
2049
2050 if(MSVC)
2051 if(ARROW_USE_STATIC_CRT)
2052 if(${UPPERCASE_BUILD_TYPE} STREQUAL "DEBUG")
2053 set(LZ4_RUNTIME_LIBRARY_LINKAGE "/p:RuntimeLibrary=MultiThreadedDebug")
2054 else()
2055 set(LZ4_RUNTIME_LIBRARY_LINKAGE "/p:RuntimeLibrary=MultiThreaded")
2056 endif()
2057 endif()
2058 set(LZ4_STATIC_LIB
2059 "${LZ4_BUILD_DIR}/build/VS2010/bin/x64_${CMAKE_BUILD_TYPE}/liblz4_static.lib")
2060 set(LZ4_BUILD_COMMAND
2061 BUILD_COMMAND msbuild.exe /m /p:Configuration=${CMAKE_BUILD_TYPE} /p:Platform=x64
2062 /p:PlatformToolset=v140 ${LZ4_RUNTIME_LIBRARY_LINKAGE} /t:Build
2063 ${LZ4_BUILD_DIR}/build/VS2010/lz4.sln)
2064 else()
2065 set(LZ4_STATIC_LIB "${LZ4_BUILD_DIR}/lib/liblz4.a")
2066 # Must explicitly invoke sh on MinGW
2067 set(LZ4_BUILD_COMMAND
2068 BUILD_COMMAND sh "${CMAKE_SOURCE_DIR}/build-support/build-lz4-lib.sh"
2069 "AR=${CMAKE_AR}" "OS=${CMAKE_SYSTEM_NAME}")
2070 endif()
2071
2072 # We need to copy the header in lib to directory outside of the build
2073 externalproject_add(lz4_ep
2074 URL ${LZ4_SOURCE_URL} ${EP_LOG_OPTIONS}
2075 URL_HASH "SHA256=${ARROW_LZ4_BUILD_SHA256_CHECKSUM}"
2076 UPDATE_COMMAND ${CMAKE_COMMAND} -E copy_directory
2077 "${LZ4_BUILD_DIR}/lib" "${LZ4_PREFIX}/include"
2078 ${LZ4_PATCH_COMMAND}
2079 CONFIGURE_COMMAND ""
2080 INSTALL_COMMAND ""
2081 BINARY_DIR ${LZ4_BUILD_DIR}
2082 BUILD_BYPRODUCTS ${LZ4_STATIC_LIB} ${LZ4_BUILD_COMMAND})
2083
2084 file(MAKE_DIRECTORY "${LZ4_PREFIX}/include")
2085 add_library(LZ4::lz4 STATIC IMPORTED)
2086 set_target_properties(LZ4::lz4
2087 PROPERTIES IMPORTED_LOCATION "${LZ4_STATIC_LIB}"
2088 INTERFACE_INCLUDE_DIRECTORIES "${LZ4_PREFIX}/include")
2089 add_dependencies(toolchain lz4_ep)
2090 add_dependencies(LZ4::lz4 lz4_ep)
2091
2092 list(APPEND ARROW_BUNDLED_STATIC_LIBS LZ4::lz4)
2093endmacro()
2094
2095if(ARROW_WITH_LZ4)
2096 resolve_dependency(Lz4 PC_PACKAGE_NAMES liblz4)
2097
2098 # TODO: Don't use global includes but rather target_include_directories
2099 get_target_property(LZ4_INCLUDE_DIR LZ4::lz4 INTERFACE_INCLUDE_DIRECTORIES)
2100 include_directories(SYSTEM ${LZ4_INCLUDE_DIR})
2101endif()
2102
2103macro(build_zstd)
2104 message(STATUS "Building zstd from source")
2105 set(ZSTD_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/zstd_ep-install")
2106
2107 set(ZSTD_CMAKE_ARGS
2108 ${EP_COMMON_TOOLCHAIN}
2109 "-DCMAKE_INSTALL_PREFIX=${ZSTD_PREFIX}"
2110 -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
2111 -DCMAKE_INSTALL_LIBDIR=${CMAKE_INSTALL_LIBDIR}
2112 -DZSTD_BUILD_PROGRAMS=off
2113 -DZSTD_BUILD_SHARED=off
2114 -DZSTD_BUILD_STATIC=on
2115 -DZSTD_MULTITHREAD_SUPPORT=off)
2116
2117 if(MSVC)
2118 set(ZSTD_STATIC_LIB "${ZSTD_PREFIX}/${CMAKE_INSTALL_LIBDIR}/zstd_static.lib")
2119 if(ARROW_USE_STATIC_CRT)
2120 set(ZSTD_CMAKE_ARGS ${ZSTD_CMAKE_ARGS} "-DZSTD_USE_STATIC_RUNTIME=on")
2121 endif()
2122 else()
2123 set(ZSTD_STATIC_LIB "${ZSTD_PREFIX}/${CMAKE_INSTALL_LIBDIR}/libzstd.a")
2124 # Only pass our C flags on Unix as on MSVC it leads to a
2125 # "incompatible command-line options" error
2126 set(ZSTD_CMAKE_ARGS
2127 ${ZSTD_CMAKE_ARGS}
2128 -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
2129 -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
2130 -DCMAKE_C_FLAGS=${EP_C_FLAGS}
2131 -DCMAKE_CXX_FLAGS=${EP_CXX_FLAGS})
2132 endif()
2133
2134 if(CMAKE_VERSION VERSION_LESS 3.7)
2135 message(FATAL_ERROR "Building zstd using ExternalProject requires at least CMake 3.7")
2136 endif()
2137
2138 externalproject_add(zstd_ep
2139 ${EP_LOG_OPTIONS}
2140 CMAKE_ARGS ${ZSTD_CMAKE_ARGS}
2141 SOURCE_SUBDIR "build/cmake"
2142 INSTALL_DIR ${ZSTD_PREFIX}
2143 URL ${ZSTD_SOURCE_URL}
2144 URL_HASH "SHA256=${ARROW_ZSTD_BUILD_SHA256_CHECKSUM}"
2145 BUILD_BYPRODUCTS "${ZSTD_STATIC_LIB}")
2146
2147 file(MAKE_DIRECTORY "${ZSTD_PREFIX}/include")
2148
2149 add_library(zstd::libzstd STATIC IMPORTED)
2150 set_target_properties(zstd::libzstd
2151 PROPERTIES IMPORTED_LOCATION "${ZSTD_STATIC_LIB}"
2152 INTERFACE_INCLUDE_DIRECTORIES "${ZSTD_PREFIX}/include")
2153
2154 add_dependencies(toolchain zstd_ep)
2155 add_dependencies(zstd::libzstd zstd_ep)
2156
2157 list(APPEND ARROW_BUNDLED_STATIC_LIBS zstd::libzstd)
2158endmacro()
2159
2160if(ARROW_WITH_ZSTD)
2161 # ARROW-13384: ZSTD_minCLevel was added in v1.4.0, required by ARROW-13091
2162 resolve_dependency(zstd
2163 PC_PACKAGE_NAMES
2164 libzstd
2165 REQUIRED_VERSION
2166 1.4.0)
2167
2168 if(TARGET zstd::libzstd)
2169 set(ARROW_ZSTD_LIBZSTD zstd::libzstd)
2170 else()
2171 # "SYSTEM" source will prioritize cmake config, which exports
2172 # zstd::libzstd_{static,shared}
2173 if(ARROW_ZSTD_USE_SHARED)
2174 if(TARGET zstd::libzstd_shared)
2175 set(ARROW_ZSTD_LIBZSTD zstd::libzstd_shared)
2176 endif()
2177 else()
2178 if(TARGET zstd::libzstd_static)
2179 set(ARROW_ZSTD_LIBZSTD zstd::libzstd_static)
2180 endif()
2181 endif()
2182 endif()
2183
2184 # TODO: Don't use global includes but rather target_include_directories
2185 get_target_property(ZSTD_INCLUDE_DIR ${ARROW_ZSTD_LIBZSTD}
2186 INTERFACE_INCLUDE_DIRECTORIES)
2187 include_directories(SYSTEM ${ZSTD_INCLUDE_DIR})
2188endif()
2189
2190# ----------------------------------------------------------------------
2191# RE2 (required for Gandiva)
2192
2193macro(build_re2)
2194 message(STATUS "Building RE2 from source")
2195 set(RE2_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/re2_ep-install")
2196 set(RE2_STATIC_LIB
2197 "${RE2_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}re2${CMAKE_STATIC_LIBRARY_SUFFIX}")
2198
2199 set(RE2_CMAKE_ARGS ${EP_COMMON_CMAKE_ARGS} "-DCMAKE_INSTALL_PREFIX=${RE2_PREFIX}"
2200 -DCMAKE_INSTALL_LIBDIR=lib)
2201
2202 externalproject_add(re2_ep
2203 ${EP_LOG_OPTIONS}
2204 INSTALL_DIR ${RE2_PREFIX}
2205 URL ${RE2_SOURCE_URL}
2206 URL_HASH "SHA256=${ARROW_RE2_BUILD_SHA256_CHECKSUM}"
2207 CMAKE_ARGS ${RE2_CMAKE_ARGS}
2208 BUILD_BYPRODUCTS "${RE2_STATIC_LIB}")
2209
2210 file(MAKE_DIRECTORY "${RE2_PREFIX}/include")
2211 add_library(re2::re2 STATIC IMPORTED)
2212 set_target_properties(re2::re2
2213 PROPERTIES IMPORTED_LOCATION "${RE2_STATIC_LIB}"
2214 INTERFACE_INCLUDE_DIRECTORIES "${RE2_PREFIX}/include")
2215
2216 add_dependencies(toolchain re2_ep)
2217 add_dependencies(re2::re2 re2_ep)
2218 set(RE2_VENDORED TRUE)
2219 # Set values so that FindRE2 finds this too
2220 set(RE2_LIB ${RE2_STATIC_LIB})
2221 set(RE2_INCLUDE_DIR "${RE2_PREFIX}/include")
2222
2223 list(APPEND ARROW_BUNDLED_STATIC_LIBS re2::re2)
2224endmacro()
2225
2226if(ARROW_WITH_RE2)
2227 # Don't specify "PC_PACKAGE_NAMES re2" here because re2.pc may
2228 # include -std=c++11. It's not compatible with C source and C++
2229 # source not uses C++ 11.
2230 resolve_dependency(re2 HAVE_ALT TRUE)
2231 if(${re2_SOURCE} STREQUAL "SYSTEM")
2232 get_target_property(RE2_LIB re2::re2 IMPORTED_LOCATION)
2233 string(APPEND ARROW_PC_LIBS_PRIVATE " ${RE2_LIB}")
2234 endif()
2235 add_definitions(-DARROW_WITH_RE2)
2236
2237 # TODO: Don't use global includes but rather target_include_directories
2238 get_target_property(RE2_INCLUDE_DIR re2::re2 INTERFACE_INCLUDE_DIRECTORIES)
2239 include_directories(SYSTEM ${RE2_INCLUDE_DIR})
2240endif()
2241
2242macro(build_bzip2)
2243 message(STATUS "Building BZip2 from source")
2244 set(BZIP2_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/bzip2_ep-install")
2245 set(BZIP2_STATIC_LIB
2246 "${BZIP2_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}bz2${CMAKE_STATIC_LIBRARY_SUFFIX}"
2247 )
2248
2249 set(BZIP2_EXTRA_ARGS "CC=${CMAKE_C_COMPILER}" "CFLAGS=${EP_C_FLAGS}")
2250
2251 if(CMAKE_OSX_SYSROOT)
2252 list(APPEND BZIP2_EXTRA_ARGS "SDKROOT=${CMAKE_OSX_SYSROOT}")
2253 endif()
2254
2255 if(CMAKE_AR)
2256 list(APPEND BZIP2_EXTRA_ARGS AR=${CMAKE_AR})
2257 endif()
2258
2259 if(CMAKE_RANLIB)
2260 list(APPEND BZIP2_EXTRA_ARGS RANLIB=${CMAKE_RANLIB})
2261 endif()
2262
2263 externalproject_add(bzip2_ep
2264 ${EP_LOG_OPTIONS}
2265 CONFIGURE_COMMAND ""
2266 BUILD_IN_SOURCE 1
2267 BUILD_COMMAND ${MAKE} libbz2.a ${MAKE_BUILD_ARGS}
2268 ${BZIP2_EXTRA_ARGS}
2269 INSTALL_COMMAND ${MAKE} install PREFIX=${BZIP2_PREFIX}
2270 ${BZIP2_EXTRA_ARGS}
2271 INSTALL_DIR ${BZIP2_PREFIX}
2272 URL ${ARROW_BZIP2_SOURCE_URL}
2273 URL_HASH "SHA256=${ARROW_BZIP2_BUILD_SHA256_CHECKSUM}"
2274 BUILD_BYPRODUCTS "${BZIP2_STATIC_LIB}")
2275
2276 file(MAKE_DIRECTORY "${BZIP2_PREFIX}/include")
2277 add_library(BZip2::BZip2 STATIC IMPORTED)
2278 set_target_properties(BZip2::BZip2
2279 PROPERTIES IMPORTED_LOCATION "${BZIP2_STATIC_LIB}"
2280 INTERFACE_INCLUDE_DIRECTORIES
2281 "${BZIP2_PREFIX}/include")
2282 set(BZIP2_INCLUDE_DIR "${BZIP2_PREFIX}/include")
2283
2284 add_dependencies(toolchain bzip2_ep)
2285 add_dependencies(BZip2::BZip2 bzip2_ep)
2286
2287 list(APPEND ARROW_BUNDLED_STATIC_LIBS BZip2::BZip2)
2288endmacro()
2289
2290if(ARROW_WITH_BZ2)
2291 resolve_dependency(BZip2)
2292 if(${BZip2_SOURCE} STREQUAL "SYSTEM")
2293 string(APPEND ARROW_PC_LIBS_PRIVATE " ${BZIP2_LIBRARIES}")
2294 endif()
2295
2296 if(NOT TARGET BZip2::BZip2)
2297 add_library(BZip2::BZip2 UNKNOWN IMPORTED)
2298 set_target_properties(BZip2::BZip2
2299 PROPERTIES IMPORTED_LOCATION "${BZIP2_LIBRARIES}"
2300 INTERFACE_INCLUDE_DIRECTORIES "${BZIP2_INCLUDE_DIR}")
2301 endif()
2302 include_directories(SYSTEM "${BZIP2_INCLUDE_DIR}")
2303endif()
2304
2305macro(build_utf8proc)
2306 message(STATUS "Building utf8proc from source")
2307 set(UTF8PROC_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/utf8proc_ep-install")
2308 if(MSVC)
2309 set(UTF8PROC_STATIC_LIB "${UTF8PROC_PREFIX}/lib/utf8proc_static.lib")
2310 else()
2311 set(UTF8PROC_STATIC_LIB
2312 "${UTF8PROC_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}utf8proc${CMAKE_STATIC_LIBRARY_SUFFIX}"
2313 )
2314 endif()
2315
2316 set(UTF8PROC_CMAKE_ARGS
2317 ${EP_COMMON_TOOLCHAIN}
2318 "-DCMAKE_INSTALL_PREFIX=${UTF8PROC_PREFIX}"
2319 -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
2320 -DCMAKE_INSTALL_LIBDIR=lib
2321 -DBUILD_SHARED_LIBS=OFF)
2322
2323 externalproject_add(utf8proc_ep
2324 ${EP_LOG_OPTIONS}
2325 CMAKE_ARGS ${UTF8PROC_CMAKE_ARGS}
2326 INSTALL_DIR ${UTF8PROC_PREFIX}
2327 URL ${ARROW_UTF8PROC_SOURCE_URL}
2328 URL_HASH "SHA256=${ARROW_UTF8PROC_BUILD_SHA256_CHECKSUM}"
2329 BUILD_BYPRODUCTS "${UTF8PROC_STATIC_LIB}")
2330
2331 file(MAKE_DIRECTORY "${UTF8PROC_PREFIX}/include")
2332 add_library(utf8proc::utf8proc STATIC IMPORTED)
2333 set_target_properties(utf8proc::utf8proc
2334 PROPERTIES IMPORTED_LOCATION "${UTF8PROC_STATIC_LIB}"
2335 INTERFACE_COMPILER_DEFINITIONS "UTF8PROC_STATIC"
2336 INTERFACE_INCLUDE_DIRECTORIES
2337 "${UTF8PROC_PREFIX}/include")
2338
2339 add_dependencies(toolchain utf8proc_ep)
2340 add_dependencies(utf8proc::utf8proc utf8proc_ep)
2341
2342 list(APPEND ARROW_BUNDLED_STATIC_LIBS utf8proc::utf8proc)
2343endmacro()
2344
2345if(ARROW_WITH_UTF8PROC)
2346 resolve_dependency(utf8proc
2347 REQUIRED_VERSION
2348 "2.2.0"
2349 PC_PACKAGE_NAMES
2350 libutf8proc)
2351
2352 add_definitions(-DARROW_WITH_UTF8PROC)
2353
2354 # TODO: Don't use global definitions but rather
2355 # target_compile_definitions or target_link_libraries
2356 get_target_property(UTF8PROC_COMPILER_DEFINITIONS utf8proc::utf8proc
2357 INTERFACE_COMPILER_DEFINITIONS)
2358 if(UTF8PROC_COMPILER_DEFINITIONS)
2359 add_definitions(-D${UTF8PROC_COMPILER_DEFINITIONS})
2360 endif()
2361
2362 # TODO: Don't use global includes but rather
2363 # target_include_directories or target_link_libraries
2364 get_target_property(UTF8PROC_INCLUDE_DIR utf8proc::utf8proc
2365 INTERFACE_INCLUDE_DIRECTORIES)
2366 include_directories(SYSTEM ${UTF8PROC_INCLUDE_DIR})
2367endif()
2368
2369macro(build_cares)
2370 message(STATUS "Building c-ares from source")
2371 set(CARES_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/cares_ep-install")
2372 set(CARES_INCLUDE_DIR "${CARES_PREFIX}/include")
2373
2374 # If you set -DCARES_SHARED=ON then the build system names the library
2375 # libcares_static.a
2376 set(CARES_STATIC_LIB
2377 "${CARES_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}cares${CMAKE_STATIC_LIBRARY_SUFFIX}"
2378 )
2379
2380 set(CARES_CMAKE_ARGS
2381 "${EP_COMMON_CMAKE_ARGS}"
2382 -DCARES_STATIC=ON
2383 -DCARES_SHARED=OFF
2384 -DCMAKE_INSTALL_LIBDIR=lib
2385 "-DCMAKE_INSTALL_PREFIX=${CARES_PREFIX}")
2386
2387 externalproject_add(cares_ep
2388 ${EP_LOG_OPTIONS}
2389 URL ${CARES_SOURCE_URL}
2390 URL_HASH "SHA256=${ARROW_CARES_BUILD_SHA256_CHECKSUM}"
2391 CMAKE_ARGS ${CARES_CMAKE_ARGS}
2392 BUILD_BYPRODUCTS "${CARES_STATIC_LIB}")
2393
2394 file(MAKE_DIRECTORY ${CARES_INCLUDE_DIR})
2395
2396 add_dependencies(toolchain cares_ep)
2397 add_library(c-ares::cares STATIC IMPORTED)
2398 set_target_properties(c-ares::cares
2399 PROPERTIES IMPORTED_LOCATION "${CARES_STATIC_LIB}"
2400 INTERFACE_INCLUDE_DIRECTORIES "${CARES_INCLUDE_DIR}")
2401 add_dependencies(c-ares::cares cares_ep)
2402
2403 if(APPLE)
2404 # libresolv must be linked from c-ares version 1.16.1
2405 find_library(LIBRESOLV_LIBRARY NAMES resolv libresolv REQUIRED)
2406 set_target_properties(c-ares::cares PROPERTIES INTERFACE_LINK_LIBRARIES
2407 "${LIBRESOLV_LIBRARY}")
2408 endif()
2409
2410 set(CARES_VENDORED TRUE)
2411
2412 list(APPEND ARROW_BUNDLED_STATIC_LIBS c-ares::cares)
2413endmacro()
2414
2415# ----------------------------------------------------------------------
2416# Dependencies for Arrow Flight RPC
2417
2418macro(build_absl_once)
2419 if(NOT TARGET absl_ep)
2420 message(STATUS "Building Abseil-cpp from source")
2421 set(ABSL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/absl_ep-install")
2422 set(ABSL_INCLUDE_DIR "${ABSL_PREFIX}/include")
2423 set(ABSL_CMAKE_ARGS
2424 "${EP_COMMON_CMAKE_ARGS}" -DABSL_RUN_TESTS=OFF -DCMAKE_INSTALL_LIBDIR=lib
2425 "-DCMAKE_INSTALL_PREFIX=${ABSL_PREFIX}")
2426 set(ABSL_BUILD_BYPRODUCTS)
2427 set(ABSL_LIBRARIES)
2428
2429 # Abseil produces the following libraries, each is fairly small, but there
2430 # are (as you can see), many of them. We need to add the libraries first,
2431 # and then describe how they depend on each other. The list can be
2432 # refreshed using:
2433 # ls -1 $PREFIX/lib/libabsl_*.a | sed -e 's/.*libabsl_//' -e 's/.a$//'
2434 set(_ABSL_LIBS
2435 bad_any_cast_impl
2436 bad_optional_access
2437 bad_variant_access
2438 base
2439 city
2440 civil_time
2441 cord
2442 debugging_internal
2443 demangle_internal
2444 examine_stack
2445 exponential_biased
2446 failure_signal_handler
2447 flags
2448 flags_commandlineflag
2449 flags_commandlineflag_internal
2450 flags_config
2451 flags_internal
2452 flags_marshalling
2453 flags_parse
2454 flags_private_handle_accessor
2455 flags_program_name
2456 flags_reflection
2457 flags_usage
2458 flags_usage_internal
2459 graphcycles_internal
2460 hash
2461 hashtablez_sampler
2462 int128
2463 leak_check
2464 leak_check_disable
2465 log_severity
2466 malloc_internal
2467 periodic_sampler
2468 random_distributions
2469 random_internal_distribution_test_util
2470 random_internal_platform
2471 random_internal_pool_urbg
2472 random_internal_randen
2473 random_internal_randen_hwaes
2474 random_internal_randen_hwaes_impl
2475 random_internal_randen_slow
2476 random_internal_seed_material
2477 random_seed_gen_exception
2478 random_seed_sequences
2479 raw_hash_set
2480 raw_logging_internal
2481 scoped_set_env
2482 spinlock_wait
2483 stacktrace
2484 status
2485 statusor
2486 strerror
2487 str_format_internal
2488 strings
2489 strings_internal
2490 symbolize
2491 synchronization
2492 throw_delegate
2493 time
2494 time_zone
2495 wyhash)
2496 # Abseil creates a number of header-only targets, which are needed to resolve dependencies.
2497 # The list can be refreshed using:
2498 # comm -13 <(ls -l $PREFIX/lib/libabsl_*.a | sed -e 's/.*libabsl_//' -e 's/.a$//' | sort -u) \
2499 # <(ls -1 $PREFIX/lib/pkgconfig/absl_*.pc | sed -e 's/.*absl_//' -e 's/.pc$//' | sort -u)
2500 set(_ABSL_INTERFACE_LIBS
2501 algorithm
2502 algorithm_container
2503 any
2504 atomic_hook
2505 bad_any_cast
2506 base_internal
2507 bind_front
2508 bits
2509 btree
2510 cleanup
2511 cleanup_internal
2512 compare
2513 compressed_tuple
2514 config
2515 container_common
2516 container_memory
2517 core_headers
2518 counting_allocator
2519 debugging
2520 dynamic_annotations
2521 endian
2522 errno_saver
2523 fast_type_id
2524 fixed_array
2525 flags_path_util
2526 flat_hash_map
2527 flat_hash_set
2528 function_ref
2529 hash_function_defaults
2530 hash_policy_traits
2531 hashtable_debug
2532 hashtable_debug_hooks
2533 have_sse
2534 inlined_vector
2535 inlined_vector_internal
2536 kernel_timeout_internal
2537 layout
2538 memory
2539 meta
2540 node_hash_map
2541 node_hash_policy
2542 node_hash_set
2543 numeric
2544 numeric_representation
2545 optional
2546 pretty_function
2547 random_bit_gen_ref
2548 random_internal_distribution_caller
2549 random_internal_fastmath
2550 random_internal_fast_uniform_bits
2551 random_internal_generate_real
2552 random_internal_iostream_state_saver
2553 random_internal_mock_helpers
2554 random_internal_nonsecure_base
2555 random_internal_pcg_engine
2556 random_internal_randen_engine
2557 random_internal_salted_seed_seq
2558 random_internal_traits
2559 random_internal_uniform_helper
2560 random_internal_wide_multiply
2561 random_random
2562 raw_hash_map
2563 span
2564 str_format
2565 type_traits
2566 utility
2567 variant)
2568
2569 foreach(_ABSL_LIB ${_ABSL_LIBS})
2570 set(_ABSL_STATIC_LIBRARY
2571 "${ABSL_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}absl_${_ABSL_LIB}${CMAKE_STATIC_LIBRARY_SUFFIX}"
2572 )
2573 add_library(absl::${_ABSL_LIB} STATIC IMPORTED)
2574 set_target_properties(absl::${_ABSL_LIB}
2575 PROPERTIES IMPORTED_LOCATION ${_ABSL_STATIC_LIBRARY}
2576 INTERFACE_INCLUDE_DIRECTORIES
2577 "${ABSL_INCLUDE_DIR}")
2578 list(APPEND ABSL_BUILD_BYPRODUCTS ${_ABSL_STATIC_LIBRARY})
2579 endforeach()
2580 foreach(_ABSL_LIB ${_ABSL_INTERFACE_LIBS})
2581 add_library(absl::${_ABSL_LIB} INTERFACE IMPORTED)
2582 set_target_properties(absl::${_ABSL_LIB} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
2583 "${ABSL_INCLUDE_DIR}")
2584 endforeach()
2585
2586 # Extracted the dependency information using the Abseil pkg-config files:
2587 # grep Requires $PREFIX/pkgconfig/absl_*.pc | \
2588 # sed -e 's;.*/absl_;set_property(TARGET absl::;' \
2589 # -e 's/.pc:Requires:/ PROPERTY INTERFACE_LINK_LIBRARIES /' \
2590 # -e 's/ = 20210324,//g' \
2591 # -e 's/ = 20210324//g' \
2592 # -e 's/absl_/absl::/g' \
2593 # -e 's/$/)/' | \
2594 # grep -v 'INTERFACE_LINK_LIBRARIES[ ]*)'
2595 set_property(TARGET absl::algorithm_container
2596 PROPERTY INTERFACE_LINK_LIBRARIES absl::algorithm absl::core_headers
2597 absl::meta)
2598 set_property(TARGET absl::algorithm PROPERTY INTERFACE_LINK_LIBRARIES absl::config)
2599 set_property(TARGET absl::any
2600 PROPERTY INTERFACE_LINK_LIBRARIES
2601 absl::bad_any_cast
2602 absl::config
2603 absl::core_headers
2604 absl::fast_type_id
2605 absl::type_traits
2606 absl::utility)
2607 set_property(TARGET absl::atomic_hook PROPERTY INTERFACE_LINK_LIBRARIES absl::config
2608 absl::core_headers)
2609 set_property(TARGET absl::bad_any_cast_impl
2610 PROPERTY INTERFACE_LINK_LIBRARIES absl::config
2611 absl::raw_logging_internal)
2612 set_property(TARGET absl::bad_any_cast PROPERTY INTERFACE_LINK_LIBRARIES
2613 absl::bad_any_cast_impl absl::config)
2614 set_property(TARGET absl::bad_optional_access
2615 PROPERTY INTERFACE_LINK_LIBRARIES absl::config
2616 absl::raw_logging_internal)
2617 set_property(TARGET absl::bad_variant_access
2618 PROPERTY INTERFACE_LINK_LIBRARIES absl::config
2619 absl::raw_logging_internal)
2620 set_property(TARGET absl::base_internal PROPERTY INTERFACE_LINK_LIBRARIES
2621 absl::config absl::type_traits)
2622 set_property(TARGET absl::base
2623 PROPERTY INTERFACE_LINK_LIBRARIES
2624 absl::atomic_hook
2625 absl::base_internal
2626 absl::config
2627 absl::core_headers
2628 absl::dynamic_annotations
2629 absl::log_severity
2630 absl::raw_logging_internal
2631 absl::spinlock_wait
2632 absl::type_traits)
2633 set_property(TARGET absl::bind_front
2634 PROPERTY INTERFACE_LINK_LIBRARIES absl::base_internal
2635 absl::compressed_tuple)
2636 set_property(TARGET absl::bits PROPERTY INTERFACE_LINK_LIBRARIES absl::core_headers)
2637 set_property(TARGET absl::btree
2638 PROPERTY INTERFACE_LINK_LIBRARIES
2639 absl::container_common
2640 absl::compare
2641 absl::compressed_tuple
2642 absl::container_memory
2643 absl::cord
2644 absl::core_headers
2645 absl::layout
2646 absl::memory
2647 absl::strings
2648 absl::throw_delegate
2649 absl::type_traits
2650 absl::utility)
2651 set_property(TARGET absl::city PROPERTY INTERFACE_LINK_LIBRARIES absl::config
2652 absl::core_headers absl::endian)
2653 set_property(TARGET absl::cleanup_internal
2654 PROPERTY INTERFACE_LINK_LIBRARIES absl::base_internal absl::core_headers
2655 absl::utility)
2656 set_property(TARGET absl::cleanup
2657 PROPERTY INTERFACE_LINK_LIBRARIES absl::cleanup_internal absl::config
2658 absl::core_headers)
2659 set_property(TARGET absl::compare PROPERTY INTERFACE_LINK_LIBRARIES
2660 absl::core_headers absl::type_traits)
2661 set_property(TARGET absl::compressed_tuple PROPERTY INTERFACE_LINK_LIBRARIES
2662 absl::utility)
2663 set_property(TARGET absl::container_common PROPERTY INTERFACE_LINK_LIBRARIES
2664 absl::type_traits)
2665 set_property(TARGET absl::container_memory
2666 PROPERTY INTERFACE_LINK_LIBRARIES
2667 absl::config
2668 absl::memory
2669 absl::type_traits
2670 absl::utility)
2671 set_property(TARGET absl::cord
2672 PROPERTY INTERFACE_LINK_LIBRARIES
2673 absl::base
2674 absl::base_internal
2675 absl::compressed_tuple
2676 absl::config
2677 absl::core_headers
2678 absl::endian
2679 absl::fixed_array
2680 absl::function_ref
2681 absl::inlined_vector
2682 absl::optional
2683 absl::raw_logging_internal
2684 absl::strings
2685 absl::strings_internal
2686 absl::throw_delegate
2687 absl::type_traits)
2688 set_property(TARGET absl::core_headers PROPERTY INTERFACE_LINK_LIBRARIES absl::config)
2689 set_property(TARGET absl::counting_allocator PROPERTY INTERFACE_LINK_LIBRARIES
2690 absl::config)
2691 set_property(TARGET absl::debugging_internal
2692 PROPERTY INTERFACE_LINK_LIBRARIES
2693 absl::core_headers
2694 absl::config
2695 absl::dynamic_annotations
2696 absl::errno_saver
2697 absl::raw_logging_internal)
2698 set_property(TARGET absl::debugging PROPERTY INTERFACE_LINK_LIBRARIES
2699 absl::stacktrace absl::leak_check)
2700 set_property(TARGET absl::demangle_internal PROPERTY INTERFACE_LINK_LIBRARIES
2701 absl::base absl::core_headers)
2702 set_property(TARGET absl::dynamic_annotations PROPERTY INTERFACE_LINK_LIBRARIES
2703 absl::config)
2704 set_property(TARGET absl::endian PROPERTY INTERFACE_LINK_LIBRARIES absl::base
2705 absl::config absl::core_headers)
2706 set_property(TARGET absl::errno_saver PROPERTY INTERFACE_LINK_LIBRARIES absl::config)
2707 set_property(TARGET absl::examine_stack
2708 PROPERTY INTERFACE_LINK_LIBRARIES
2709 absl::stacktrace
2710 absl::symbolize
2711 absl::config
2712 absl::core_headers
2713 absl::raw_logging_internal)
2714 set_property(TARGET absl::exponential_biased PROPERTY INTERFACE_LINK_LIBRARIES
2715 absl::config absl::core_headers)
2716 set_property(TARGET absl::failure_signal_handler
2717 PROPERTY INTERFACE_LINK_LIBRARIES
2718 absl::examine_stack
2719 absl::stacktrace
2720 absl::base
2721 absl::config
2722 absl::core_headers
2723 absl::errno_saver
2724 absl::raw_logging_internal)
2725 set_property(TARGET absl::fast_type_id PROPERTY INTERFACE_LINK_LIBRARIES absl::config)
2726 set_property(TARGET absl::fixed_array
2727 PROPERTY INTERFACE_LINK_LIBRARIES
2728 absl::compressed_tuple
2729 absl::algorithm
2730 absl::config
2731 absl::core_headers
2732 absl::dynamic_annotations
2733 absl::throw_delegate
2734 absl::memory)
2735 set_property(TARGET absl::flags_commandlineflag_internal
2736 PROPERTY INTERFACE_LINK_LIBRARIES absl::config absl::fast_type_id)
2737 set_property(TARGET absl::flags_commandlineflag
2738 PROPERTY INTERFACE_LINK_LIBRARIES
2739 absl::config
2740 absl::fast_type_id
2741 absl::flags_commandlineflag_internal
2742 absl::optional
2743 absl::strings)
2744 set_property(TARGET absl::flags_config
2745 PROPERTY INTERFACE_LINK_LIBRARIES
2746 absl::config
2747 absl::flags_path_util
2748 absl::flags_program_name
2749 absl::core_headers
2750 absl::strings
2751 absl::synchronization)
2752 set_property(TARGET absl::flags_internal
2753 PROPERTY INTERFACE_LINK_LIBRARIES
2754 absl::base
2755 absl::config
2756 absl::flags_commandlineflag
2757 absl::flags_commandlineflag_internal
2758 absl::flags_config
2759 absl::flags_marshalling
2760 absl::synchronization
2761 absl::meta
2762 absl::utility)
2763 set_property(TARGET absl::flags_marshalling
2764 PROPERTY INTERFACE_LINK_LIBRARIES
2765 absl::config
2766 absl::core_headers
2767 absl::log_severity
2768 absl::strings
2769 absl::str_format)
2770 set_property(TARGET absl::flags_parse
2771 PROPERTY INTERFACE_LINK_LIBRARIES
2772 absl::config
2773 absl::core_headers
2774 absl::flags_config
2775 absl::flags
2776 absl::flags_commandlineflag
2777 absl::flags_commandlineflag_internal
2778 absl::flags_internal
2779 absl::flags_private_handle_accessor
2780 absl::flags_program_name
2781 absl::flags_reflection
2782 absl::flags_usage
2783 absl::strings
2784 absl::synchronization)
2785 set_property(TARGET absl::flags_path_util PROPERTY INTERFACE_LINK_LIBRARIES
2786 absl::config absl::strings)
2787 set_property(TARGET absl::flags
2788 PROPERTY INTERFACE_LINK_LIBRARIES
2789 absl::config
2790 absl::flags_commandlineflag
2791 absl::flags_config
2792 absl::flags_internal
2793 absl::flags_reflection
2794 absl::base
2795 absl::core_headers
2796 absl::strings)
2797 set_property(TARGET absl::flags_private_handle_accessor
2798 PROPERTY INTERFACE_LINK_LIBRARIES
2799 absl::config
2800 absl::flags_commandlineflag
2801 absl::flags_commandlineflag_internal
2802 absl::strings)
2803 set_property(TARGET absl::flags_program_name
2804 PROPERTY INTERFACE_LINK_LIBRARIES
2805 absl::config
2806 absl::core_headers
2807 absl::flags_path_util
2808 absl::strings
2809 absl::synchronization)
2810 set_property(TARGET absl::flags_reflection
2811 PROPERTY INTERFACE_LINK_LIBRARIES
2812 absl::config
2813 absl::flags_commandlineflag
2814 absl::flags_private_handle_accessor
2815 absl::flags_config
2816 absl::strings
2817 absl::synchronization
2818 absl::flat_hash_map)
2819 set_property(TARGET absl::flags_usage_internal
2820 PROPERTY INTERFACE_LINK_LIBRARIES
2821 absl::config
2822 absl::flags_config
2823 absl::flags
2824 absl::flags_commandlineflag
2825 absl::flags_internal
2826 absl::flags_path_util
2827 absl::flags_private_handle_accessor
2828 absl::flags_program_name
2829 absl::flags_reflection
2830 absl::strings
2831 absl::synchronization)
2832 set_property(TARGET absl::flags_usage
2833 PROPERTY INTERFACE_LINK_LIBRARIES
2834 absl::config
2835 absl::core_headers
2836 absl::flags_usage_internal
2837 absl::strings
2838 absl::synchronization)
2839 set_property(TARGET absl::flat_hash_map
2840 PROPERTY INTERFACE_LINK_LIBRARIES
2841 absl::container_memory
2842 absl::hash_function_defaults
2843 absl::raw_hash_map
2844 absl::algorithm_container
2845 absl::memory)
2846 set_property(TARGET absl::flat_hash_set
2847 PROPERTY INTERFACE_LINK_LIBRARIES
2848 absl::container_memory
2849 absl::hash_function_defaults
2850 absl::raw_hash_set
2851 absl::algorithm_container
2852 absl::core_headers
2853 absl::memory)
2854 set_property(TARGET absl::function_ref PROPERTY INTERFACE_LINK_LIBRARIES
2855 absl::base_internal absl::meta)
2856 set_property(TARGET absl::graphcycles_internal
2857 PROPERTY INTERFACE_LINK_LIBRARIES
2858 absl::base
2859 absl::base_internal
2860 absl::config
2861 absl::core_headers
2862 absl::malloc_internal
2863 absl::raw_logging_internal)
2864 set_property(TARGET absl::hash_function_defaults
2865 PROPERTY INTERFACE_LINK_LIBRARIES
2866 absl::config
2867 absl::cord
2868 absl::hash
2869 absl::strings)
2870 set_property(TARGET absl::hash
2871 PROPERTY INTERFACE_LINK_LIBRARIES
2872 absl::city
2873 absl::config
2874 absl::core_headers
2875 absl::endian
2876 absl::fixed_array
2877 absl::meta
2878 absl::int128
2879 absl::strings
2880 absl::optional
2881 absl::variant
2882 absl::utility
2883 absl::wyhash)
2884 set_property(TARGET absl::hash_policy_traits PROPERTY INTERFACE_LINK_LIBRARIES
2885 absl::meta)
2886 set_property(TARGET absl::hashtable_debug_hooks PROPERTY INTERFACE_LINK_LIBRARIES
2887 absl::config)
2888 set_property(TARGET absl::hashtable_debug PROPERTY INTERFACE_LINK_LIBRARIES
2889 absl::hashtable_debug_hooks)
2890 set_property(TARGET absl::hashtablez_sampler
2891 PROPERTY INTERFACE_LINK_LIBRARIES
2892 absl::base
2893 absl::exponential_biased
2894 absl::have_sse
2895 absl::synchronization)
2896 set_property(TARGET absl::inlined_vector_internal
2897 PROPERTY INTERFACE_LINK_LIBRARIES
2898 absl::compressed_tuple
2899 absl::core_headers
2900 absl::memory
2901 absl::span
2902 absl::type_traits)
2903 set_property(TARGET absl::inlined_vector
2904 PROPERTY INTERFACE_LINK_LIBRARIES
2905 absl::algorithm
2906 absl::core_headers
2907 absl::inlined_vector_internal
2908 absl::throw_delegate
2909 absl::memory)
2910 set_property(TARGET absl::int128 PROPERTY INTERFACE_LINK_LIBRARIES absl::config
2911 absl::core_headers absl::bits)
2912 set_property(TARGET absl::kernel_timeout_internal
2913 PROPERTY INTERFACE_LINK_LIBRARIES absl::core_headers
2914 absl::raw_logging_internal absl::time)
2915 set_property(TARGET absl::layout
2916 PROPERTY INTERFACE_LINK_LIBRARIES
2917 absl::config
2918 absl::core_headers
2919 absl::meta
2920 absl::strings
2921 absl::span
2922 absl::utility)
2923 set_property(TARGET absl::leak_check PROPERTY INTERFACE_LINK_LIBRARIES absl::config
2924 absl::core_headers)
2925 set_property(TARGET absl::log_severity PROPERTY INTERFACE_LINK_LIBRARIES
2926 absl::core_headers)
2927 set_property(TARGET absl::malloc_internal
2928 PROPERTY INTERFACE_LINK_LIBRARIES
2929 absl::base
2930 absl::base_internal
2931 absl::config
2932 absl::core_headers
2933 absl::dynamic_annotations
2934 absl::raw_logging_internal)
2935 set_property(TARGET absl::memory PROPERTY INTERFACE_LINK_LIBRARIES absl::core_headers
2936 absl::meta)
2937 set_property(TARGET absl::meta PROPERTY INTERFACE_LINK_LIBRARIES absl::type_traits)
2938 set_property(TARGET absl::node_hash_map
2939 PROPERTY INTERFACE_LINK_LIBRARIES
2940 absl::container_memory
2941 absl::hash_function_defaults
2942 absl::node_hash_policy
2943 absl::raw_hash_map
2944 absl::algorithm_container
2945 absl::memory)
2946 set_property(TARGET absl::node_hash_policy PROPERTY INTERFACE_LINK_LIBRARIES
2947 absl::config)
2948 set_property(TARGET absl::node_hash_set
2949 PROPERTY INTERFACE_LINK_LIBRARIES
2950 absl::hash_function_defaults
2951 absl::node_hash_policy
2952 absl::raw_hash_set
2953 absl::algorithm_container
2954 absl::memory)
2955 set_property(TARGET absl::numeric PROPERTY INTERFACE_LINK_LIBRARIES absl::int128)
2956 set_property(TARGET absl::numeric_representation PROPERTY INTERFACE_LINK_LIBRARIES
2957 absl::config)
2958 set_property(TARGET absl::optional
2959 PROPERTY INTERFACE_LINK_LIBRARIES
2960 absl::bad_optional_access
2961 absl::base_internal
2962 absl::config
2963 absl::core_headers
2964 absl::memory
2965 absl::type_traits
2966 absl::utility)
2967 set_property(TARGET absl::periodic_sampler
2968 PROPERTY INTERFACE_LINK_LIBRARIES absl::core_headers
2969 absl::exponential_biased)
2970 set_property(TARGET absl::random_bit_gen_ref
2971 PROPERTY INTERFACE_LINK_LIBRARIES
2972 absl::core_headers
2973 absl::random_internal_distribution_caller
2974 absl::random_internal_fast_uniform_bits
2975 absl::type_traits)
2976 set_property(TARGET absl::random_distributions
2977 PROPERTY INTERFACE_LINK_LIBRARIES
2978 absl::base_internal
2979 absl::config
2980 absl::core_headers
2981 absl::random_internal_generate_real
2982 absl::random_internal_distribution_caller
2983 absl::random_internal_fast_uniform_bits
2984 absl::random_internal_fastmath
2985 absl::random_internal_iostream_state_saver
2986 absl::random_internal_traits
2987 absl::random_internal_uniform_helper
2988 absl::random_internal_wide_multiply
2989 absl::strings
2990 absl::type_traits)
2991 set_property(TARGET absl::random_internal_distribution_caller
2992 PROPERTY INTERFACE_LINK_LIBRARIES absl::config absl::utility
2993 absl::fast_type_id)
2994 set_property(TARGET absl::random_internal_distribution_test_util
2995 PROPERTY INTERFACE_LINK_LIBRARIES
2996 absl::config
2997 absl::core_headers
2998 absl::raw_logging_internal
2999 absl::strings
3000 absl::str_format
3001 absl::span)
3002 set_property(TARGET absl::random_internal_fastmath PROPERTY INTERFACE_LINK_LIBRARIES
3003 absl::bits)
3004 set_property(TARGET absl::random_internal_fast_uniform_bits
3005 PROPERTY INTERFACE_LINK_LIBRARIES absl::config)
3006 set_property(TARGET absl::random_internal_generate_real
3007 PROPERTY INTERFACE_LINK_LIBRARIES
3008 absl::bits
3009 absl::random_internal_fastmath
3010 absl::random_internal_traits
3011 absl::type_traits)
3012 set_property(TARGET absl::random_internal_iostream_state_saver
3013 PROPERTY INTERFACE_LINK_LIBRARIES absl::int128 absl::type_traits)
3014 set_property(TARGET absl::random_internal_mock_helpers
3015 PROPERTY INTERFACE_LINK_LIBRARIES absl::fast_type_id absl::optional)
3016 set_property(TARGET absl::random_internal_nonsecure_base
3017 PROPERTY INTERFACE_LINK_LIBRARIES
3018 absl::core_headers
3019 absl::optional
3020 absl::random_internal_pool_urbg
3021 absl::random_internal_salted_seed_seq
3022 absl::random_internal_seed_material
3023 absl::span
3024 absl::type_traits)
3025 set_property(TARGET absl::random_internal_pcg_engine
3026 PROPERTY INTERFACE_LINK_LIBRARIES
3027 absl::config
3028 absl::int128
3029 absl::random_internal_fastmath
3030 absl::random_internal_iostream_state_saver
3031 absl::type_traits)
3032 set_property(TARGET absl::random_internal_platform PROPERTY INTERFACE_LINK_LIBRARIES
3033 absl::config)
3034 set_property(TARGET absl::random_internal_pool_urbg
3035 PROPERTY INTERFACE_LINK_LIBRARIES
3036 absl::base
3037 absl::config
3038 absl::core_headers
3039 absl::endian
3040 absl::random_internal_randen
3041 absl::random_internal_seed_material
3042 absl::random_internal_traits
3043 absl::random_seed_gen_exception
3044 absl::raw_logging_internal
3045 absl::span)
3046 set_property(TARGET absl::random_internal_randen_engine
3047 PROPERTY INTERFACE_LINK_LIBRARIES
3048 absl::endian
3049 absl::random_internal_iostream_state_saver
3050 absl::random_internal_randen
3051 absl::raw_logging_internal
3052 absl::type_traits)
3053 set_property(TARGET absl::random_internal_randen_hwaes_impl
3054 PROPERTY INTERFACE_LINK_LIBRARIES absl::random_internal_platform
3055 absl::config)
3056 set_property(TARGET absl::random_internal_randen_hwaes
3057 PROPERTY INTERFACE_LINK_LIBRARIES absl::random_internal_platform
3058 absl::random_internal_randen_hwaes_impl absl::config)
3059 set_property(TARGET absl::random_internal_randen
3060 PROPERTY INTERFACE_LINK_LIBRARIES absl::random_internal_platform
3061 absl::random_internal_randen_hwaes
3062 absl::random_internal_randen_slow)
3063 set_property(TARGET absl::random_internal_randen_slow
3064 PROPERTY INTERFACE_LINK_LIBRARIES absl::random_internal_platform
3065 absl::config)
3066 set_property(TARGET absl::random_internal_salted_seed_seq
3067 PROPERTY INTERFACE_LINK_LIBRARIES
3068 absl::inlined_vector
3069 absl::optional
3070 absl::span
3071 absl::random_internal_seed_material
3072 absl::type_traits)
3073 set_property(TARGET absl::random_internal_seed_material
3074 PROPERTY INTERFACE_LINK_LIBRARIES
3075 absl::core_headers
3076 absl::optional
3077 absl::random_internal_fast_uniform_bits
3078 absl::raw_logging_internal
3079 absl::span
3080 absl::strings)
3081 set_property(TARGET absl::random_internal_traits PROPERTY INTERFACE_LINK_LIBRARIES
3082 absl::config)
3083 set_property(TARGET absl::random_internal_uniform_helper
3084 PROPERTY INTERFACE_LINK_LIBRARIES absl::config
3085 absl::random_internal_traits absl::type_traits)
3086 set_property(TARGET absl::random_internal_wide_multiply
3087 PROPERTY INTERFACE_LINK_LIBRARIES absl::bits absl::config absl::int128)
3088 set_property(TARGET absl::random_random
3089 PROPERTY INTERFACE_LINK_LIBRARIES
3090 absl::random_distributions
3091 absl::random_internal_nonsecure_base
3092 absl::random_internal_pcg_engine
3093 absl::random_internal_pool_urbg
3094 absl::random_internal_randen_engine
3095 absl::random_seed_sequences)
3096 set_property(TARGET absl::random_seed_gen_exception PROPERTY INTERFACE_LINK_LIBRARIES
3097 absl::config)
3098 set_property(TARGET absl::random_seed_sequences
3099 PROPERTY INTERFACE_LINK_LIBRARIES
3100 absl::inlined_vector
3101 absl::random_internal_nonsecure_base
3102 absl::random_internal_pool_urbg
3103 absl::random_internal_salted_seed_seq
3104 absl::random_internal_seed_material
3105 absl::random_seed_gen_exception
3106 absl::span)
3107 set_property(TARGET absl::raw_hash_map
3108 PROPERTY INTERFACE_LINK_LIBRARIES absl::container_memory
3109 absl::raw_hash_set absl::throw_delegate)
3110 set_property(TARGET absl::raw_hash_set
3111 PROPERTY INTERFACE_LINK_LIBRARIES
3112 absl::bits
3113 absl::compressed_tuple
3114 absl::config
3115 absl::container_common
3116 absl::container_memory
3117 absl::core_headers
3118 absl::endian
3119 absl::hash_policy_traits
3120 absl::hashtable_debug_hooks
3121 absl::have_sse
3122 absl::layout
3123 absl::memory
3124 absl::meta
3125 absl::optional
3126 absl::utility
3127 absl::hashtablez_sampler)
3128 set_property(TARGET absl::raw_logging_internal
3129 PROPERTY INTERFACE_LINK_LIBRARIES
3130 absl::atomic_hook
3131 absl::config
3132 absl::core_headers
3133 absl::log_severity)
3134 set_property(TARGET absl::scoped_set_env
3135 PROPERTY INTERFACE_LINK_LIBRARIES absl::config
3136 absl::raw_logging_internal)
3137 set_property(TARGET absl::span
3138 PROPERTY INTERFACE_LINK_LIBRARIES
3139 absl::algorithm
3140 absl::core_headers
3141 absl::throw_delegate
3142 absl::type_traits)
3143 set_property(TARGET absl::spinlock_wait
3144 PROPERTY INTERFACE_LINK_LIBRARIES absl::base_internal absl::core_headers
3145 absl::errno_saver)
3146 set_property(TARGET absl::stacktrace
3147 PROPERTY INTERFACE_LINK_LIBRARIES absl::debugging_internal absl::config
3148 absl::core_headers)
3149 set_property(TARGET absl::statusor
3150 PROPERTY INTERFACE_LINK_LIBRARIES
3151 absl::status
3152 absl::core_headers
3153 absl::raw_logging_internal
3154 absl::type_traits
3155 absl::strings
3156 absl::utility
3157 absl::variant)
3158 set_property(TARGET absl::status
3159 PROPERTY INTERFACE_LINK_LIBRARIES
3160 absl::atomic_hook
3161 absl::config
3162 absl::core_headers
3163 absl::raw_logging_internal
3164 absl::inlined_vector
3165 absl::stacktrace
3166 absl::symbolize
3167 absl::strings
3168 absl::cord
3169 absl::str_format
3170 absl::optional)
3171 set_property(TARGET absl::strerror PROPERTY INTERFACE_LINK_LIBRARIES absl::config
3172 absl::core_headers absl::errno_saver)
3173 set_property(TARGET absl::str_format_internal
3174 PROPERTY INTERFACE_LINK_LIBRARIES
3175 absl::bits
3176 absl::strings
3177 absl::config
3178 absl::core_headers
3179 absl::numeric_representation
3180 absl::type_traits
3181 absl::int128
3182 absl::span)
3183 set_property(TARGET absl::str_format PROPERTY INTERFACE_LINK_LIBRARIES
3184 absl::str_format_internal)
3185 set_property(TARGET absl::strings_internal
3186 PROPERTY INTERFACE_LINK_LIBRARIES
3187 absl::config
3188 absl::core_headers
3189 absl::endian
3190 absl::raw_logging_internal
3191 absl::type_traits)
3192 set_property(TARGET absl::strings
3193 PROPERTY INTERFACE_LINK_LIBRARIES
3194 absl::strings_internal
3195 absl::base
3196 absl::bits
3197 absl::config
3198 absl::core_headers
3199 absl::endian
3200 absl::int128
3201 absl::memory
3202 absl::raw_logging_internal
3203 absl::throw_delegate
3204 absl::type_traits)
3205 set_property(TARGET absl::symbolize
3206 PROPERTY INTERFACE_LINK_LIBRARIES
3207 absl::debugging_internal
3208 absl::demangle_internal
3209 absl::base
3210 absl::config
3211 absl::core_headers
3212 absl::dynamic_annotations
3213 absl::malloc_internal
3214 absl::raw_logging_internal
3215 absl::strings)
3216 set_property(TARGET absl::synchronization
3217 PROPERTY INTERFACE_LINK_LIBRARIES
3218 absl::graphcycles_internal
3219 absl::kernel_timeout_internal
3220 absl::atomic_hook
3221 absl::base
3222 absl::base_internal
3223 absl::config
3224 absl::core_headers
3225 absl::dynamic_annotations
3226 absl::malloc_internal
3227 absl::raw_logging_internal
3228 absl::stacktrace
3229 absl::symbolize
3230 absl::time)
3231 set_property(TARGET absl::throw_delegate
3232 PROPERTY INTERFACE_LINK_LIBRARIES absl::config
3233 absl::raw_logging_internal)
3234 set_property(TARGET absl::time
3235 PROPERTY INTERFACE_LINK_LIBRARIES
3236 absl::base
3237 absl::civil_time
3238 absl::core_headers
3239 absl::int128
3240 absl::raw_logging_internal
3241 absl::strings
3242 absl::time_zone)
3243 set_property(TARGET absl::type_traits PROPERTY INTERFACE_LINK_LIBRARIES absl::config)
3244 set_property(TARGET absl::utility
3245 PROPERTY INTERFACE_LINK_LIBRARIES absl::base_internal absl::config
3246 absl::type_traits)
3247 set_property(TARGET absl::variant
3248 PROPERTY INTERFACE_LINK_LIBRARIES
3249 absl::bad_variant_access
3250 absl::base_internal
3251 absl::config
3252 absl::core_headers
3253 absl::type_traits
3254 absl::utility)
3255 set_property(TARGET absl::wyhash PROPERTY INTERFACE_LINK_LIBRARIES absl::config
3256 absl::endian absl::int128)
3257
3258 externalproject_add(absl_ep
3259 ${EP_LOG_OPTIONS}
3260 URL ${ABSL_SOURCE_URL}
3261 URL_HASH "SHA256=${ARROW_ABSL_BUILD_SHA256_CHECKSUM}"
3262 CMAKE_ARGS ${ABSL_CMAKE_ARGS}
3263 BUILD_BYPRODUCTS ${ABSL_BUILD_BYPRODUCTS})
3264
3265 # Work around https://gitlab.kitware.com/cmake/cmake/issues/15052
3266 file(MAKE_DIRECTORY ${ABSL_INCLUDE_DIR})
3267
3268 endif()
3269endmacro()
3270
3271macro(build_grpc)
3272 resolve_dependency(c-ares
3273 HAVE_ALT
3274 TRUE
3275 PC_PACKAGE_NAMES
3276 libcares)
3277 # TODO: Don't use global includes but rather target_include_directories
3278 get_target_property(c-ares_INCLUDE_DIR c-ares::cares INTERFACE_INCLUDE_DIRECTORIES)
3279 include_directories(SYSTEM ${c-ares_INCLUDE_DIR})
3280
3281 # First need to build Abseil
3282 build_absl_once()
3283
3284 message(STATUS "Building gRPC from source")
3285
3286 set(GRPC_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/grpc_ep-prefix/src/grpc_ep-build")
3287 set(GRPC_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/grpc_ep-install")
3288 set(GRPC_HOME "${GRPC_PREFIX}")
3289 set(GRPC_INCLUDE_DIR "${GRPC_PREFIX}/include")
3290
3291 set(GRPC_STATIC_LIBRARY_GPR
3292 "${GRPC_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}gpr${CMAKE_STATIC_LIBRARY_SUFFIX}"
3293 )
3294 set(GRPC_STATIC_LIBRARY_GRPC
3295 "${GRPC_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}grpc${CMAKE_STATIC_LIBRARY_SUFFIX}"
3296 )
3297 set(GRPC_STATIC_LIBRARY_GRPCPP
3298 "${GRPC_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}grpc++${CMAKE_STATIC_LIBRARY_SUFFIX}"
3299 )
3300 set(GRPC_STATIC_LIBRARY_ADDRESS_SORTING
3301 "${GRPC_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}address_sorting${CMAKE_STATIC_LIBRARY_SUFFIX}"
3302 )
3303 set(GRPC_STATIC_LIBRARY_UPB
3304 "${GRPC_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}upb${CMAKE_STATIC_LIBRARY_SUFFIX}"
3305 )
3306 set(GRPC_CPP_PLUGIN "${GRPC_PREFIX}/bin/grpc_cpp_plugin${CMAKE_EXECUTABLE_SUFFIX}")
3307
3308 set(GRPC_CMAKE_PREFIX)
3309
3310 add_custom_target(grpc_dependencies)
3311
3312 add_dependencies(grpc_dependencies absl_ep)
3313 if(CARES_VENDORED)
3314 add_dependencies(grpc_dependencies cares_ep)
3315 endif()
3316
3317 if(GFLAGS_VENDORED)
3318 add_dependencies(grpc_dependencies gflags_ep)
3319 endif()
3320
3321 if(RE2_VENDORED)
3322 add_dependencies(grpc_dependencies re2_ep)
3323 endif()
3324
3325 add_dependencies(grpc_dependencies ${ARROW_PROTOBUF_LIBPROTOBUF} c-ares::cares
3326 ZLIB::ZLIB)
3327
3328 get_target_property(GRPC_PROTOBUF_INCLUDE_DIR ${ARROW_PROTOBUF_LIBPROTOBUF}
3329 INTERFACE_INCLUDE_DIRECTORIES)
3330 get_filename_component(GRPC_PB_ROOT "${GRPC_PROTOBUF_INCLUDE_DIR}" DIRECTORY)
3331 get_target_property(GRPC_Protobuf_PROTOC_LIBRARY ${ARROW_PROTOBUF_LIBPROTOC}
3332 IMPORTED_LOCATION)
3333 get_target_property(GRPC_CARES_INCLUDE_DIR c-ares::cares INTERFACE_INCLUDE_DIRECTORIES)
3334 get_filename_component(GRPC_CARES_ROOT "${GRPC_CARES_INCLUDE_DIR}" DIRECTORY)
3335 get_target_property(GRPC_GFLAGS_INCLUDE_DIR ${GFLAGS_LIBRARIES}
3336 INTERFACE_INCLUDE_DIRECTORIES)
3337 get_filename_component(GRPC_GFLAGS_ROOT "${GRPC_GFLAGS_INCLUDE_DIR}" DIRECTORY)
3338 get_target_property(GRPC_RE2_INCLUDE_DIR re2::re2 INTERFACE_INCLUDE_DIRECTORIES)
3339 get_filename_component(GRPC_RE2_ROOT "${GRPC_RE2_INCLUDE_DIR}" DIRECTORY)
3340
3341 set(GRPC_CMAKE_PREFIX "${GRPC_CMAKE_PREFIX};${GRPC_PB_ROOT}")
3342 set(GRPC_CMAKE_PREFIX "${GRPC_CMAKE_PREFIX};${GRPC_GFLAGS_ROOT}")
3343 set(GRPC_CMAKE_PREFIX "${GRPC_CMAKE_PREFIX};${GRPC_CARES_ROOT}")
3344 set(GRPC_CMAKE_PREFIX "${GRPC_CMAKE_PREFIX};${GRPC_RE2_ROOT}")
3345
3346 # ZLIB is never vendored
3347 set(GRPC_CMAKE_PREFIX "${GRPC_CMAKE_PREFIX};${ZLIB_ROOT}")
3348 set(GRPC_CMAKE_PREFIX "${GRPC_CMAKE_PREFIX};${ABSL_PREFIX}")
3349
3350 if(RAPIDJSON_VENDORED)
3351 add_dependencies(grpc_dependencies rapidjson_ep)
3352 endif()
3353
3354 # Yuck, see https://stackoverflow.com/a/45433229/776560
3355 string(REPLACE ";" "|" GRPC_PREFIX_PATH_ALT_SEP "${GRPC_CMAKE_PREFIX}")
3356
3357 set(GRPC_CMAKE_ARGS
3358 "${EP_COMMON_CMAKE_ARGS}"
3359 -DCMAKE_PREFIX_PATH='${GRPC_PREFIX_PATH_ALT_SEP}'
3360 -DgRPC_ABSL_PROVIDER=package
3361 -DgRPC_BUILD_CSHARP_EXT=OFF
3362 -DgRPC_BUILD_GRPC_CSHARP_PLUGIN=OFF
3363 -DgRPC_BUILD_GRPC_NODE_PLUGIN=OFF
3364 -DgRPC_BUILD_GRPC_OBJECTIVE_C_PLUGIN=OFF
3365 -DgRPC_BUILD_GRPC_PHP_PLUGIN=OFF
3366 -DgRPC_BUILD_GRPC_PYTHON_PLUGIN=OFF
3367 -DgRPC_BUILD_GRPC_RUBY_PLUGIN=OFF
3368 -DgRPC_BUILD_TESTS=OFF
3369 -DgRPC_CARES_PROVIDER=package
3370 -DgRPC_GFLAGS_PROVIDER=package
3371 -DgRPC_MSVC_STATIC_RUNTIME=${ARROW_USE_STATIC_CRT}
3372 -DgRPC_PROTOBUF_PROVIDER=package
3373 -DgRPC_RE2_PROVIDER=package
3374 -DgRPC_SSL_PROVIDER=package
3375 -DgRPC_ZLIB_PROVIDER=package
3376 -DCMAKE_INSTALL_PREFIX=${GRPC_PREFIX}
3377 -DCMAKE_INSTALL_LIBDIR=lib
3378 -DBUILD_SHARED_LIBS=OFF)
3379 if(PROTOBUF_VENDORED)
3380 list(APPEND GRPC_CMAKE_ARGS -DgRPC_PROTOBUF_PACKAGE_TYPE=CONFIG)
3381 endif()
3382 if(OPENSSL_ROOT_DIR)
3383 list(APPEND GRPC_CMAKE_ARGS -DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR})
3384 endif()
3385
3386 # XXX the gRPC git checkout is huge and takes a long time
3387 # Ideally, we should be able to use the tarballs, but they don't contain
3388 # vendored dependencies such as c-ares...
3389 externalproject_add(grpc_ep
3390 URL ${GRPC_SOURCE_URL}
3391 URL_HASH "SHA256=${ARROW_GRPC_BUILD_SHA256_CHECKSUM}"
3392 LIST_SEPARATOR |
3393 BUILD_BYPRODUCTS ${GRPC_STATIC_LIBRARY_GPR}
3394 ${GRPC_STATIC_LIBRARY_GRPC}
3395 ${GRPC_STATIC_LIBRARY_GRPCPP}
3396 ${GRPC_STATIC_LIBRARY_ADDRESS_SORTING}
3397 ${GRPC_STATIC_LIBRARY_UPB}
3398 ${GRPC_CPP_PLUGIN}
3399 CMAKE_ARGS ${GRPC_CMAKE_ARGS} ${EP_LOG_OPTIONS}
3400 DEPENDS ${grpc_dependencies})
3401
3402 # Work around https://gitlab.kitware.com/cmake/cmake/issues/15052
3403 file(MAKE_DIRECTORY ${GRPC_INCLUDE_DIR})
3404
3405 add_library(gRPC::upb STATIC IMPORTED)
3406 set_target_properties(gRPC::upb
3407 PROPERTIES IMPORTED_LOCATION "${GRPC_STATIC_LIBRARY_UPB}"
3408 INTERFACE_INCLUDE_DIRECTORIES "${GRPC_INCLUDE_DIR}")
3409
3410 set(GRPC_GPR_ABSL_LIBRARIES
3411 absl::base
3412 absl::statusor
3413 absl::status
3414 absl::cord
3415 absl::strings
3416 absl::synchronization
3417 absl::time)
3418 add_library(gRPC::gpr STATIC IMPORTED)
3419 set_target_properties(gRPC::gpr
3420 PROPERTIES IMPORTED_LOCATION "${GRPC_STATIC_LIBRARY_GPR}"
3421 INTERFACE_INCLUDE_DIRECTORIES "${GRPC_INCLUDE_DIR}"
3422 INTERFACE_LINK_LIBRARIES "${GRPC_GPR_ABSL_LIBRARIES}")
3423
3424 add_library(gRPC::address_sorting STATIC IMPORTED)
3425 set_target_properties(gRPC::address_sorting
3426 PROPERTIES IMPORTED_LOCATION
3427 "${GRPC_STATIC_LIBRARY_ADDRESS_SORTING}"
3428 INTERFACE_INCLUDE_DIRECTORIES "${GRPC_INCLUDE_DIR}")
3429
3430 add_library(gRPC::grpc STATIC IMPORTED)
3431 set(GRPC_LINK_LIBRARIES
3432 gRPC::gpr
3433 gRPC::upb
3434 gRPC::address_sorting
3435 re2::re2
3436 c-ares::cares
3437 ZLIB::ZLIB
3438 OpenSSL::SSL
3439 Threads::Threads)
3440 set_target_properties(gRPC::grpc
3441 PROPERTIES IMPORTED_LOCATION "${GRPC_STATIC_LIBRARY_GRPC}"
3442 INTERFACE_INCLUDE_DIRECTORIES "${GRPC_INCLUDE_DIR}"
3443 INTERFACE_LINK_LIBRARIES "${GRPC_LINK_LIBRARIES}")
3444
3445 add_library(gRPC::grpc++ STATIC IMPORTED)
3446 set(GRPCPP_LINK_LIBRARIES gRPC::grpc ${ARROW_PROTOBUF_LIBPROTOBUF})
3447 set_target_properties(gRPC::grpc++
3448 PROPERTIES IMPORTED_LOCATION "${GRPC_STATIC_LIBRARY_GRPCPP}"
3449 INTERFACE_INCLUDE_DIRECTORIES "${GRPC_INCLUDE_DIR}"
3450 INTERFACE_LINK_LIBRARIES "${GRPCPP_LINK_LIBRARIES}")
3451
3452 add_executable(gRPC::grpc_cpp_plugin IMPORTED)
3453 set_target_properties(gRPC::grpc_cpp_plugin PROPERTIES IMPORTED_LOCATION
3454 ${GRPC_CPP_PLUGIN})
3455
3456 add_dependencies(grpc_ep grpc_dependencies)
3457 add_dependencies(toolchain grpc_ep)
3458 add_dependencies(gRPC::grpc++ grpc_ep)
3459 add_dependencies(gRPC::grpc_cpp_plugin grpc_ep)
3460 set(GRPC_VENDORED TRUE)
3461
3462 # ar -M rejects with the "libgrpc++.a" filename because "+" is a line
3463 # continuation character in these scripts, so we have to create a copy of the
3464 # static lib that we will bundle later
3465
3466 set(GRPC_STATIC_LIBRARY_GRPCPP_FOR_AR
3467 "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}grpcpp${CMAKE_STATIC_LIBRARY_SUFFIX}"
3468 )
3469 add_custom_command(OUTPUT ${GRPC_STATIC_LIBRARY_GRPCPP_FOR_AR}
3470 COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:gRPC::grpc++>
3471 ${GRPC_STATIC_LIBRARY_GRPCPP_FOR_AR}
3472 DEPENDS grpc_ep)
3473 add_library(gRPC::grpcpp_for_bundling STATIC IMPORTED)
3474 set_target_properties(gRPC::grpcpp_for_bundling
3475 PROPERTIES IMPORTED_LOCATION
3476 "${GRPC_STATIC_LIBRARY_GRPCPP_FOR_AR}")
3477
3478 set_source_files_properties("${GRPC_STATIC_LIBRARY_GRPCPP_FOR_AR}" PROPERTIES GENERATED
3479 TRUE)
3480 add_custom_target(grpc_copy_grpc++ ALL DEPENDS "${GRPC_STATIC_LIBRARY_GRPCPP_FOR_AR}")
3481 add_dependencies(gRPC::grpcpp_for_bundling grpc_copy_grpc++)
3482
3483 list(APPEND
3484 ARROW_BUNDLED_STATIC_LIBS
3485 ${GRPC_GPR_ABSL_LIBRARIES}
3486 gRPC::address_sorting
3487 gRPC::gpr
3488 gRPC::grpc
3489 gRPC::grpcpp_for_bundling
3490 gRPC::upb)
3491endmacro()
3492
3493if(ARROW_WITH_GRPC)
3494 set(ARROW_GRPC_REQUIRED_VERSION "1.17.0")
3495 resolve_dependency(gRPC
3496 HAVE_ALT
3497 TRUE
3498 REQUIRED_VERSION
3499 ${ARROW_GRPC_REQUIRED_VERSION}
3500 PC_PACKAGE_NAMES
3501 grpc++)
3502
3503 # TODO: Don't use global includes but rather target_include_directories
3504 get_target_property(GRPC_INCLUDE_DIR gRPC::grpc++ INTERFACE_INCLUDE_DIRECTORIES)
3505 include_directories(SYSTEM ${GRPC_INCLUDE_DIR})
3506
3507 if(GRPC_VENDORED)
3508 set(GRPCPP_PP_INCLUDE TRUE)
3509 else()
3510 # grpc++ headers may reside in ${GRPC_INCLUDE_DIR}/grpc++ or ${GRPC_INCLUDE_DIR}/grpcpp
3511 # depending on the gRPC version.
3512 if(EXISTS "${GRPC_INCLUDE_DIR}/grpcpp/impl/codegen/config_protobuf.h")
3513 set(GRPCPP_PP_INCLUDE TRUE)
3514 elseif(EXISTS "${GRPC_INCLUDE_DIR}/grpc++/impl/codegen/config_protobuf.h")
3515 set(GRPCPP_PP_INCLUDE FALSE)
3516 else()
3517 message(FATAL_ERROR "Cannot find grpc++ headers in ${GRPC_INCLUDE_DIR}")
3518 endif()
3519 endif()
3520endif()
3521
3522# ----------------------------------------------------------------------
3523# GCS and dependencies
3524
3525macro(build_crc32c_once)
3526 if(NOT TARGET crc32c_ep)
3527 message(STATUS "Building crc32c from source")
3528 # Build crc32c
3529 set(CRC32C_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/crc32c_ep-install")
3530 set(CRC32C_INCLUDE_DIR "${CRC32C_PREFIX}/include")
3531 set(CRC32C_CMAKE_ARGS
3532 ${EP_COMMON_CMAKE_ARGS}
3533 -DCMAKE_INSTALL_LIBDIR=lib
3534 "-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>"
3535 -DCMAKE_CXX_STANDARD=11
3536 -DCRC32C_BUILD_TESTS=OFF
3537 -DCRC32C_BUILD_BENCHMARKS=OFF
3538 -DCRC32C_USE_GLOG=OFF)
3539
3540 set(_CRC32C_STATIC_LIBRARY
3541 "${CRC32C_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}crc32c${CMAKE_STATIC_LIBRARY_SUFFIX}"
3542 )
3543 set(CRC32C_BUILD_BYPRODUCTS ${_CRC32C_STATIC_LIBRARY})
3544 set(CRC32C_LIBRARIES crc32c)
3545
3546 externalproject_add(crc32c_ep
3547 ${EP_LOG_OPTIONS}
3548 INSTALL_DIR ${CRC32C_PREFIX}
3549 URL ${CRC32C_SOURCE_URL}
3550 URL_HASH "SHA256=${ARROW_CRC32C_BUILD_SHA256_CHECKSUM}"
3551 CMAKE_ARGS ${CRC32C_CMAKE_ARGS}
3552 BUILD_BYPRODUCTS ${CRC32C_BUILD_BYPRODUCTS})
3553 # Work around https://gitlab.kitware.com/cmake/cmake/issues/15052
3554 file(MAKE_DIRECTORY "${CRC32C_INCLUDE_DIR}")
3555 add_library(Crc32c::crc32c STATIC IMPORTED)
3556 set_target_properties(Crc32c::crc32c
3557 PROPERTIES IMPORTED_LOCATION ${_CRC32C_STATIC_LIBRARY}
3558 INTERFACE_INCLUDE_DIRECTORIES
3559 "${CRC32C_INCLUDE_DIR}")
3560 add_dependencies(Crc32c::crc32c crc32c_ep)
3561 endif()
3562endmacro()
3563
3564macro(build_nlohmann_json_once)
3565 if(NOT TARGET nlohmann_json_ep)
3566 message(STATUS "Building nlohmann-json from source")
3567 # "Build" nlohmann-json
3568 set(NLOHMANN_JSON_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/nlohmann_json_ep-install")
3569 set(NLOHMANN_JSON_INCLUDE_DIR "${NLOHMANN_JSON_PREFIX}/include")
3570 set(NLOHMANN_JSON_CMAKE_ARGS
3571 ${EP_COMMON_CMAKE_ARGS} -DCMAKE_CXX_STANDARD=11
3572 "-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>" -DBUILD_TESTING=OFF)
3573
3574 set(NLOHMANN_JSON_BUILD_BYPRODUCTS ${NLOHMANN_JSON_PREFIX}/include/nlohmann/json.hpp)
3575
3576 externalproject_add(nlohmann_json_ep
3577 ${EP_LOG_OPTIONS}
3578 INSTALL_DIR ${NLOHMANN_JSON_PREFIX}
3579 URL ${NLOHMANN_JSON_SOURCE_URL}
3580 URL_HASH "SHA256=${ARROW_NLOHMANN_JSON_BUILD_SHA256_CHECKSUM}"
3581 CMAKE_ARGS ${NLOHMANN_JSON_CMAKE_ARGS}
3582 BUILD_BYPRODUCTS ${NLOHMANN_JSON_BUILD_BYPRODUCTS})
3583
3584 # Work around https://gitlab.kitware.com/cmake/cmake/issues/15052
3585 file(MAKE_DIRECTORY ${NLOHMANN_JSON_INCLUDE_DIR})
3586
3587 add_library(nlohmann_json::nlohmann_json INTERFACE IMPORTED)
3588 set_target_properties(nlohmann_json::nlohmann_json
3589 PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
3590 "${NLOHMANN_JSON_INCLUDE_DIR}")
3591 add_dependencies(nlohmann_json::nlohmann_json nlohmann_json_ep)
3592 endif()
3593endmacro()
3594
3595macro(build_google_cloud_cpp_storage)
3596 message(STATUS "Building google-cloud-cpp from source")
3597 message(STATUS "Only building the google-cloud-cpp::storage component")
3598
3599 # List of dependencies taken from https://github.com/googleapis/google-cloud-cpp/blob/master/doc/packaging.md
3600 build_absl_once()
3601 build_crc32c_once()
3602 build_nlohmann_json_once()
3603
3604 # Curl is required on all platforms, but building it internally might also trip over S3's copy.
3605 # For now, force its inclusion from the underlying system or fail.
3606 find_package(CURL 7.47.0 REQUIRED)
3607 find_package(OpenSSL ${ARROW_OPENSSL_REQUIRED_VERSION} REQUIRED)
3608
3609 # Build google-cloud-cpp, with only storage_client
3610
3611 # Inject vendored packages via CMAKE_PREFIX_PATH
3612 list(APPEND GOOGLE_CLOUD_CPP_PREFIX_PATH_LIST ${ABSL_PREFIX})
3613 list(APPEND GOOGLE_CLOUD_CPP_PREFIX_PATH_LIST ${CRC32C_PREFIX})
3614 list(APPEND GOOGLE_CLOUD_CPP_PREFIX_PATH_LIST ${NLOHMANN_JSON_PREFIX})
3615
3616 set(GOOGLE_CLOUD_CPP_PREFIX_PATH_LIST_SEP_CHAR "|")
3617 list(JOIN GOOGLE_CLOUD_CPP_PREFIX_PATH_LIST
3618 ${GOOGLE_CLOUD_CPP_PREFIX_PATH_LIST_SEP_CHAR} GOOGLE_CLOUD_CPP_PREFIX_PATH)
3619
3620 set(GOOGLE_CLOUD_CPP_INSTALL_PREFIX
3621 "${CMAKE_CURRENT_BINARY_DIR}/google_cloud_cpp_ep-install")
3622 set(GOOGLE_CLOUD_CPP_INCLUDE_DIR "${GOOGLE_CLOUD_CPP_INSTALL_PREFIX}/include")
3623 set(GOOGLE_CLOUD_CPP_CMAKE_ARGS
3624 ${EP_COMMON_CMAKE_ARGS}
3625 -DBUILD_TESTING=OFF
3626 -DCMAKE_INSTALL_LIBDIR=lib
3627 "-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>"
3628 -DCMAKE_INSTALL_RPATH=$ORIGIN
3629 -DCMAKE_PREFIX_PATH=${GOOGLE_CLOUD_CPP_PREFIX_PATH}
3630 # Compile only the storage library and its dependencies. To enable
3631 # other services (Spanner, Bigtable, etc.) add them (as a list) to this
3632 # parameter. Each has its own `google-cloud-cpp::*` library.
3633 -DGOOGLE_CLOUD_CPP_ENABLE=storage)
3634 if(OPENSSL_ROOT_DIR)
3635 list(APPEND GOOGLE_CLOUD_CPP_CMAKE_ARGS -DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR})
3636 endif()
3637
3638 add_custom_target(google_cloud_cpp_dependencies)
3639
3640 add_dependencies(google_cloud_cpp_dependencies absl_ep)
3641 add_dependencies(google_cloud_cpp_dependencies crc32c_ep)
3642 add_dependencies(google_cloud_cpp_dependencies nlohmann_json_ep)
3643 # Typically the steps to build the AWKSSDK provide `CURL::libcurl`, but if that is
3644 # disabled we need to provide our own.
3645 if(NOT TARGET CURL::libcurl)
3646 find_package(CURL REQUIRED)
3647 if(NOT TARGET CURL::libcurl)
3648 # For CMake 3.11 or older
3649 add_library(CURL::libcurl UNKNOWN IMPORTED)
3650 set_target_properties(CURL::libcurl
3651 PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
3652 "${CURL_INCLUDE_DIRS}" IMPORTED_LOCATION
3653 "${CURL_LIBRARIES}")
3654 endif()
3655 endif()
3656
3657 set(GOOGLE_CLOUD_CPP_STATIC_LIBRARY_STORAGE
3658 "${GOOGLE_CLOUD_CPP_INSTALL_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}google_cloud_cpp_storage${CMAKE_STATIC_LIBRARY_SUFFIX}"
3659 )
3660
3661 set(GOOGLE_CLOUD_CPP_STATIC_LIBRARY_COMMON
3662 "${GOOGLE_CLOUD_CPP_INSTALL_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}google_cloud_cpp_common${CMAKE_STATIC_LIBRARY_SUFFIX}"
3663 )
3664
3665 externalproject_add(google_cloud_cpp_ep
3666 ${EP_LOG_OPTIONS}
3667 LIST_SEPARATOR ${GOOGLE_CLOUD_CPP_PREFIX_PATH_LIST_SEP_CHAR}
3668 INSTALL_DIR ${GOOGLE_CLOUD_CPP_INSTALL_PREFIX}
3669 URL ${google_cloud_cpp_storage_SOURCE_URL}
3670 URL_HASH "SHA256=${ARROW_GOOGLE_CLOUD_CPP_BUILD_SHA256_CHECKSUM}"
3671 CMAKE_ARGS ${GOOGLE_CLOUD_CPP_CMAKE_ARGS}
3672 BUILD_BYPRODUCTS ${GOOGLE_CLOUD_CPP_STATIC_LIBRARY_STORAGE}
3673 ${GOOGLE_CLOUD_CPP_STATIC_LIBRARY_COMMON}
3674 DEPENDS google_cloud_cpp_dependencies)
3675
3676 # Work around https://gitlab.kitware.com/cmake/cmake/issues/15052
3677 file(MAKE_DIRECTORY ${GOOGLE_CLOUD_CPP_INCLUDE_DIR})
3678
3679 add_dependencies(toolchain google_cloud_cpp_ep)
3680
3681 add_library(google-cloud-cpp::common STATIC IMPORTED)
3682 set_target_properties(google-cloud-cpp::common
3683 PROPERTIES IMPORTED_LOCATION
3684 "${GOOGLE_CLOUD_CPP_STATIC_LIBRARY_COMMON}"
3685 INTERFACE_INCLUDE_DIRECTORIES
3686 "${GOOGLE_CLOUD_CPP_INCLUDE_DIR}")
3687 set_property(TARGET google-cloud-cpp::common
3688 PROPERTY INTERFACE_LINK_LIBRARIES
3689 absl::any
3690 absl::flat_hash_map
3691 absl::memory
3692 absl::optional
3693 absl::time
3694 Threads::Threads)
3695
3696 add_library(google-cloud-cpp::storage STATIC IMPORTED)
3697 set_target_properties(google-cloud-cpp::storage
3698 PROPERTIES IMPORTED_LOCATION
3699 "${GOOGLE_CLOUD_CPP_STATIC_LIBRARY_STORAGE}"
3700 INTERFACE_INCLUDE_DIRECTORIES
3701 "${GOOGLE_CLOUD_CPP_INCLUDE_DIR}")
3702 set_property(TARGET google-cloud-cpp::storage
3703 PROPERTY INTERFACE_LINK_LIBRARIES
3704 google-cloud-cpp::common
3705 absl::memory
3706 absl::strings
3707 absl::str_format
3708 absl::time
3709 absl::variant
3710 nlohmann_json::nlohmann_json
3711 Crc32c::crc32c
3712 CURL::libcurl
3713 Threads::Threads
3714 OpenSSL::SSL
3715 OpenSSL::Crypto)
3716 add_dependencies(google-cloud-cpp::storage google_cloud_cpp_ep)
3717
3718 list(APPEND ARROW_BUNDLED_STATIC_LIBS google-cloud-cpp::storage
3719 google-cloud-cpp::common)
3720endmacro()
3721
3722if(ARROW_WITH_GOOGLE_CLOUD_CPP)
3723 resolve_dependency(google_cloud_cpp_storage)
3724 get_target_property(google_cloud_cpp_storage_INCLUDE_DIR google-cloud-cpp::storage
3725 INTERFACE_INCLUDE_DIRECTORIES)
3726 include_directories(SYSTEM ${google_cloud_cpp_storage_INCLUDE_DIR})
3727 get_target_property(absl_base_INCLUDE_DIR absl::base INTERFACE_INCLUDE_DIRECTORIES)
3728 include_directories(SYSTEM ${absl_base_INCLUDE_DIR})
3729 message(STATUS "Found google-cloud-cpp::storage headers: ${google_cloud_cpp_storage_INCLUDE_DIR}"
3730 )
3731endif()
3732
3733#
3734# HDFS thirdparty setup
3735
3736if(DEFINED ENV{HADOOP_HOME})
3737 set(HADOOP_HOME $ENV{HADOOP_HOME})
3738 if(NOT EXISTS "${HADOOP_HOME}/include/hdfs.h")
3739 message(STATUS "Did not find hdfs.h in expected location, using vendored one")
3740 set(HADOOP_HOME "${THIRDPARTY_DIR}/hadoop")
3741 endif()
3742else()
3743 set(HADOOP_HOME "${THIRDPARTY_DIR}/hadoop")
3744endif()
3745
3746set(HDFS_H_PATH "${HADOOP_HOME}/include/hdfs.h")
3747if(NOT EXISTS ${HDFS_H_PATH})
3748 message(FATAL_ERROR "Did not find hdfs.h at ${HDFS_H_PATH}")
3749endif()
3750message(STATUS "Found hdfs.h at: " ${HDFS_H_PATH})
3751
3752include_directories(SYSTEM "${HADOOP_HOME}/include")
3753
3754# ----------------------------------------------------------------------
3755# Apache ORC
3756
3757macro(build_orc)
3758 message("Building Apache ORC from source")
3759 set(ORC_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/orc_ep-install")
3760 set(ORC_HOME "${ORC_PREFIX}")
3761 set(ORC_INCLUDE_DIR "${ORC_PREFIX}/include")
3762 set(ORC_STATIC_LIB
3763 "${ORC_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}orc${CMAKE_STATIC_LIBRARY_SUFFIX}")
3764
3765 get_target_property(ORC_PROTOBUF_INCLUDE_DIR ${ARROW_PROTOBUF_LIBPROTOBUF}
3766 INTERFACE_INCLUDE_DIRECTORIES)
3767 get_filename_component(ORC_PB_ROOT "${ORC_PROTOBUF_INCLUDE_DIR}" DIRECTORY)
3768 get_target_property(ORC_PROTOBUF_LIBRARY ${ARROW_PROTOBUF_LIBPROTOBUF}
3769 IMPORTED_LOCATION)
3770
3771 get_target_property(ORC_SNAPPY_INCLUDE_DIR Snappy::snappy INTERFACE_INCLUDE_DIRECTORIES)
3772 get_filename_component(ORC_SNAPPY_ROOT "${ORC_SNAPPY_INCLUDE_DIR}" DIRECTORY)
3773
3774 get_target_property(ORC_LZ4_ROOT LZ4::lz4 INTERFACE_INCLUDE_DIRECTORIES)
3775 get_filename_component(ORC_LZ4_ROOT "${ORC_LZ4_ROOT}" DIRECTORY)
3776
3777 # Weirdly passing in PROTOBUF_LIBRARY for PROTOC_LIBRARY still results in ORC finding
3778 # the protoc library.
3779 set(ORC_CMAKE_ARGS
3780 ${EP_COMMON_CMAKE_ARGS}
3781 "-DCMAKE_INSTALL_PREFIX=${ORC_PREFIX}"
3782 -DCMAKE_CXX_FLAGS=${EP_CXX_FLAGS}
3783 -DSTOP_BUILD_ON_WARNING=OFF
3784 -DBUILD_LIBHDFSPP=OFF
3785 -DBUILD_JAVA=OFF
3786 -DBUILD_TOOLS=OFF
3787 -DBUILD_CPP_TESTS=OFF
3788 -DINSTALL_VENDORED_LIBS=OFF
3789 "-DSNAPPY_HOME=${ORC_SNAPPY_ROOT}"
3790 "-DSNAPPY_INCLUDE_DIR=${ORC_SNAPPY_INCLUDE_DIR}"
3791 "-DPROTOBUF_HOME=${ORC_PB_ROOT}"
3792 "-DPROTOBUF_INCLUDE_DIR=${ORC_PROTOBUF_INCLUDE_DIR}"
3793 "-DPROTOBUF_LIBRARY=${ORC_PROTOBUF_LIBRARY}"
3794 "-DPROTOC_LIBRARY=${ORC_PROTOBUF_LIBRARY}"
3795 "-DLZ4_HOME=${LZ4_HOME}"
3796 "-DZSTD_HOME=${ZSTD_HOME}")
3797 if(ZLIB_ROOT)
3798 set(ORC_CMAKE_ARGS ${ORC_CMAKE_ARGS} "-DZLIB_HOME=${ZLIB_ROOT}")
3799 endif()
3800
3801 # Work around CMake bug
3802 file(MAKE_DIRECTORY ${ORC_INCLUDE_DIR})
3803
3804 externalproject_add(orc_ep
3805 URL ${ORC_SOURCE_URL}
3806 URL_HASH "SHA256=${ARROW_ORC_BUILD_SHA256_CHECKSUM}"
3807 BUILD_BYPRODUCTS ${ORC_STATIC_LIB}
3808 CMAKE_ARGS ${ORC_CMAKE_ARGS} ${EP_LOG_OPTIONS})
3809
3810 add_dependencies(toolchain orc_ep)
3811
3812 set(ORC_VENDORED 1)
3813 add_dependencies(orc_ep ZLIB::ZLIB)
3814 add_dependencies(orc_ep LZ4::lz4)
3815 add_dependencies(orc_ep Snappy::snappy)
3816 add_dependencies(orc_ep ${ARROW_PROTOBUF_LIBPROTOBUF})
3817
3818 add_library(orc::liborc STATIC IMPORTED)
3819 set_target_properties(orc::liborc
3820 PROPERTIES IMPORTED_LOCATION "${ORC_STATIC_LIB}"
3821 INTERFACE_INCLUDE_DIRECTORIES "${ORC_INCLUDE_DIR}")
3822
3823 add_dependencies(toolchain orc_ep)
3824 add_dependencies(orc::liborc orc_ep)
3825
3826 list(APPEND ARROW_BUNDLED_STATIC_LIBS orc::liborc)
3827endmacro()
3828
3829if(ARROW_ORC)
3830 resolve_dependency(ORC)
3831 include_directories(SYSTEM ${ORC_INCLUDE_DIR})
3832 message(STATUS "Found ORC static library: ${ORC_STATIC_LIB}")
3833 message(STATUS "Found ORC headers: ${ORC_INCLUDE_DIR}")
3834endif()
3835
3836# ----------------------------------------------------------------------
3837# AWS SDK for C++
3838
3839macro(build_awssdk)
3840 message("Building AWS C++ SDK from source")
3841 if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS
3842 "4.9")
3843 message(FATAL_ERROR "AWS C++ SDK requires gcc >= 4.9")
3844 endif()
3845 set(AWSSDK_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/awssdk_ep-install")
3846 set(AWSSDK_INCLUDE_DIR "${AWSSDK_PREFIX}/include")
3847 set(AWSSDK_LIB_DIR "lib")
3848
3849 if(WIN32)
3850 # On Windows, need to match build types
3851 set(AWSSDK_BUILD_TYPE ${CMAKE_BUILD_TYPE})
3852 else()
3853 # Otherwise, always build in release mode.
3854 # Especially with gcc, debug builds can fail with "asm constraint" errors:
3855 # https://github.com/TileDB-Inc/TileDB/issues/1351
3856 set(AWSSDK_BUILD_TYPE release)
3857 endif()
3858
3859 set(AWSSDK_COMMON_CMAKE_ARGS
3860 ${EP_COMMON_CMAKE_ARGS}
3861 -DBUILD_SHARED_LIBS=OFF
3862 -DCMAKE_BUILD_TYPE=${AWSSDK_BUILD_TYPE}
3863 -DCMAKE_INSTALL_LIBDIR=${AWSSDK_LIB_DIR}
3864 -DENABLE_TESTING=OFF
3865 -DENABLE_UNITY_BUILD=ON
3866 "-DCMAKE_INSTALL_PREFIX=${AWSSDK_PREFIX}"
3867 "-DCMAKE_PREFIX_PATH=${AWSSDK_PREFIX}")
3868
3869 set(AWSSDK_CMAKE_ARGS
3870 ${AWSSDK_COMMON_CMAKE_ARGS}
3871 -DBUILD_DEPS=OFF
3872 -DBUILD_ONLY=config\\$<SEMICOLON>s3\\$<SEMICOLON>transfer\\$<SEMICOLON>identity-management\\$<SEMICOLON>sts
3873 -DMINIMIZE_SIZE=ON)
3874 if(UNIX AND TARGET zlib_ep)
3875 list(APPEND AWSSDK_CMAKE_ARGS -DZLIB_INCLUDE_DIR=${ZLIB_INCLUDE_DIRS}
3876 -DZLIB_LIBRARY=${ZLIB_LIBRARIES})
3877 endif()
3878
3879 file(MAKE_DIRECTORY ${AWSSDK_INCLUDE_DIR})
3880
3881 # AWS C++ SDK related libraries to link statically
3882 set(_AWSSDK_LIBS
3883 aws-cpp-sdk-identity-management
3884 aws-cpp-sdk-sts
3885 aws-cpp-sdk-cognito-identity
3886 aws-cpp-sdk-s3
3887 aws-cpp-sdk-core
3888 aws-c-event-stream
3889 aws-checksums
3890 aws-c-common)
3891 set(AWSSDK_LIBRARIES)
3892 foreach(_AWSSDK_LIB ${_AWSSDK_LIBS})
3893 # aws-c-common -> AWS-C-COMMON
3894 string(TOUPPER ${_AWSSDK_LIB} _AWSSDK_LIB_UPPER)
3895 # AWS-C-COMMON -> AWS_C_COMMON
3896 string(REPLACE "-" "_" _AWSSDK_LIB_NAME_PREFIX ${_AWSSDK_LIB_UPPER})
3897 set(_AWSSDK_STATIC_LIBRARY
3898 "${AWSSDK_PREFIX}/${AWSSDK_LIB_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}${_AWSSDK_LIB}${CMAKE_STATIC_LIBRARY_SUFFIX}"
3899 )
3900 if(${_AWSSDK_LIB} MATCHES "^aws-cpp-sdk-")
3901 set(_AWSSDK_TARGET_NAME ${_AWSSDK_LIB})
3902 else()
3903 set(_AWSSDK_TARGET_NAME AWS::${_AWSSDK_LIB})
3904 endif()
3905 add_library(${_AWSSDK_TARGET_NAME} STATIC IMPORTED)
3906 set_target_properties(${_AWSSDK_TARGET_NAME}
3907 PROPERTIES IMPORTED_LOCATION ${_AWSSDK_STATIC_LIBRARY}
3908 INTERFACE_INCLUDE_DIRECTORIES
3909 "${AWSSDK_INCLUDE_DIR}")
3910 set("${_AWSSDK_LIB_NAME_PREFIX}_STATIC_LIBRARY" ${_AWSSDK_STATIC_LIBRARY})
3911 list(APPEND AWSSDK_LIBRARIES ${_AWSSDK_TARGET_NAME})
3912 endforeach()
3913
3914 externalproject_add(aws_c_common_ep
3915 ${EP_LOG_OPTIONS}
3916 URL ${AWS_C_COMMON_SOURCE_URL}
3917 URL_HASH "SHA256=${ARROW_AWS_C_COMMON_BUILD_SHA256_CHECKSUM}"
3918 CMAKE_ARGS ${AWSSDK_COMMON_CMAKE_ARGS}
3919 BUILD_BYPRODUCTS ${AWS_C_COMMON_STATIC_LIBRARY})
3920 add_dependencies(AWS::aws-c-common aws_c_common_ep)
3921
3922 externalproject_add(aws_checksums_ep
3923 ${EP_LOG_OPTIONS}
3924 URL ${AWS_CHECKSUMS_SOURCE_URL}
3925 URL_HASH "SHA256=${ARROW_AWS_CHECKSUMS_BUILD_SHA256_CHECKSUM}"
3926 CMAKE_ARGS ${AWSSDK_COMMON_CMAKE_ARGS}
3927 BUILD_BYPRODUCTS ${AWS_CHECKSUMS_STATIC_LIBRARY}
3928 DEPENDS aws_c_common_ep)
3929 add_dependencies(AWS::aws-checksums aws_checksums_ep)
3930
3931 externalproject_add(aws_c_event_stream_ep
3932 ${EP_LOG_OPTIONS}
3933 URL ${AWS_C_EVENT_STREAM_SOURCE_URL}
3934 URL_HASH "SHA256=${ARROW_AWS_C_EVENT_STREAM_BUILD_SHA256_CHECKSUM}"
3935 CMAKE_ARGS ${AWSSDK_COMMON_CMAKE_ARGS}
3936 BUILD_BYPRODUCTS ${AWS_C_EVENT_STREAM_STATIC_LIBRARY}
3937 DEPENDS aws_checksums_ep)
3938 add_dependencies(AWS::aws-c-event-stream aws_c_event_stream_ep)
3939
3940 set(AWSSDK_PATCH_COMMAND)
3941 if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER
3942 "10")
3943 # Workaround for https://github.com/aws/aws-sdk-cpp/issues/1750
3944 set(AWSSDK_PATCH_COMMAND "sed" "-i.bak" "-e" "s/\"-Werror\"//g"
3945 "<SOURCE_DIR>/cmake/compiler_settings.cmake")
3946 endif()
3947 externalproject_add(awssdk_ep
3948 ${EP_LOG_OPTIONS}
3949 URL ${AWSSDK_SOURCE_URL}
3950 URL_HASH "SHA256=${ARROW_AWSSDK_BUILD_SHA256_CHECKSUM}"
3951 CMAKE_ARGS ${AWSSDK_CMAKE_ARGS}
3952 PATCH_COMMAND ${AWSSDK_PATCH_COMMAND}
3953 BUILD_BYPRODUCTS ${AWS_CPP_SDK_COGNITO_IDENTITY_STATIC_LIBRARY}
3954 ${AWS_CPP_SDK_CORE_STATIC_LIBRARY}
3955 ${AWS_CPP_SDK_IDENTITY_MANAGEMENT_STATIC_LIBRARY}
3956 ${AWS_CPP_SDK_S3_STATIC_LIBRARY}
3957 ${AWS_CPP_SDK_STS_STATIC_LIBRARY}
3958 DEPENDS aws_c_event_stream_ep)
3959 add_dependencies(toolchain awssdk_ep)
3960 foreach(_AWSSDK_LIB ${_AWSSDK_LIBS})
3961 if(${_AWSSDK_LIB} MATCHES "^aws-cpp-sdk-")
3962 add_dependencies(${_AWSSDK_LIB} awssdk_ep)
3963 endif()
3964 endforeach()
3965
3966 set(AWSSDK_VENDORED TRUE)
3967 list(APPEND ARROW_BUNDLED_STATIC_LIBS ${AWSSDK_LIBRARIES})
3968 set(AWSSDK_LINK_LIBRARIES ${AWSSDK_LIBRARIES})
3969 if(UNIX)
3970 # on Linux and macOS curl seems to be required
3971 find_package(CURL REQUIRED)
3972 if(NOT TARGET CURL::libcurl)
3973 # For CMake 3.11 or older
3974 add_library(CURL::libcurl UNKNOWN IMPORTED)
3975 set_target_properties(CURL::libcurl
3976 PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
3977 "${CURL_INCLUDE_DIRS}" IMPORTED_LOCATION
3978 "${CURL_LIBRARIES}")
3979 endif()
3980 set_property(TARGET aws-cpp-sdk-core
3981 APPEND
3982 PROPERTY INTERFACE_LINK_LIBRARIES CURL::libcurl)
3983 set_property(TARGET CURL::libcurl
3984 APPEND
3985 PROPERTY INTERFACE_LINK_LIBRARIES OpenSSL::SSL)
3986 if(TARGET zlib_ep)
3987 set_property(TARGET aws-cpp-sdk-core
3988 APPEND
3989 PROPERTY INTERFACE_LINK_LIBRARIES ZLIB::ZLIB)
3990 add_dependencies(awssdk_ep zlib_ep)
3991 endif()
3992 endif()
3993
3994 # AWSSDK is static-only build
3995endmacro()
3996
3997if(ARROW_S3)
3998 # See https://aws.amazon.com/blogs/developer/developer-experience-of-the-aws-sdk-for-c-now-simplified-by-cmake/
3999
4000 # Workaround to force AWS CMake configuration to look for shared libraries
4001 if(DEFINED ENV{CONDA_PREFIX})
4002 if(DEFINED BUILD_SHARED_LIBS)
4003 set(BUILD_SHARED_LIBS_WAS_SET TRUE)
4004 set(BUILD_SHARED_LIBS_VALUE ${BUILD_SHARED_LIBS})
4005 else()
4006 set(BUILD_SHARED_LIBS_WAS_SET FALSE)
4007 endif()
4008 set(BUILD_SHARED_LIBS "ON")
4009 endif()
4010
4011 # Need to customize the find_package() call, so cannot call resolve_dependency()
4012 if(AWSSDK_SOURCE STREQUAL "AUTO")
4013 find_package(AWSSDK
4014 COMPONENTS config
4015 s3
4016 transfer
4017 identity-management
4018 sts)
4019 if(NOT AWSSDK_FOUND)
4020 build_awssdk()
4021 endif()
4022 elseif(AWSSDK_SOURCE STREQUAL "BUNDLED")
4023 build_awssdk()
4024 elseif(AWSSDK_SOURCE STREQUAL "SYSTEM")
4025 find_package(AWSSDK REQUIRED
4026 COMPONENTS config
4027 s3
4028 transfer
4029 identity-management
4030 sts)
4031 endif()
4032
4033 # Restore previous value of BUILD_SHARED_LIBS
4034 if(DEFINED ENV{CONDA_PREFIX})
4035 if(BUILD_SHARED_LIBS_WAS_SET)
4036 set(BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS_VALUE})
4037 else()
4038 unset(BUILD_SHARED_LIBS)
4039 endif()
4040 endif()
4041
4042 include_directories(SYSTEM ${AWSSDK_INCLUDE_DIR})
4043 message(STATUS "Found AWS SDK headers: ${AWSSDK_INCLUDE_DIR}")
4044 message(STATUS "Found AWS SDK libraries: ${AWSSDK_LINK_LIBRARIES}")
4045
4046 if(APPLE)
4047 # CoreFoundation's path is hardcoded in the CMake files provided by
4048 # aws-sdk-cpp to use the MacOSX SDK provided by XCode which makes
4049 # XCode a hard dependency. Command Line Tools is often used instead
4050 # of the full XCode suite, so let the linker to find it.
4051 set_target_properties(AWS::aws-c-common
4052 PROPERTIES INTERFACE_LINK_LIBRARIES
4053 "-pthread;pthread;-framework CoreFoundation")
4054 endif()
4055endif()
4056
4057message(STATUS "All bundled static libraries: ${ARROW_BUNDLED_STATIC_LIBS}")
4058
4059# Write out the package configurations.
4060
4061configure_file("src/arrow/util/config.h.cmake" "src/arrow/util/config.h" ESCAPE_QUOTES)
4062install(FILES "${ARROW_BINARY_DIR}/src/arrow/util/config.h"
4063 DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/arrow/util")