diff --git a/ci/docker/ubuntu-20.04-cpp.dockerfile b/ci/docker/ubuntu-20.04-cpp.dockerfile index c2a468d9e35..35658b28a86 100644 --- a/ci/docker/ubuntu-20.04-cpp.dockerfile +++ b/ci/docker/ubuntu-20.04-cpp.dockerfile @@ -110,6 +110,7 @@ ENV ARROW_BUILD_TESTS=ON \ ARROW_DATASET=ON \ ARROW_FLIGHT=OFF \ ARROW_GANDIVA=ON \ + ARROW_GCS=ON \ ARROW_HDFS=ON \ ARROW_HOME=/usr/local \ ARROW_INSTALL_NAME_RPATH=OFF \ @@ -129,6 +130,7 @@ ENV ARROW_BUILD_TESTS=ON \ ARROW_WITH_ZSTD=ON \ ASAN_SYMBOLIZER_PATH=/usr/lib/llvm-${llvm}/bin/llvm-symbolizer \ AWSSDK_SOURCE=BUNDLED \ + google_cloud_cpp_storage_SOURCE=BUNDLED \ GTest_SOURCE=BUNDLED \ gRPC_SOURCE=BUNDLED \ ORC_SOURCE=BUNDLED \ diff --git a/ci/scripts/cpp_build.sh b/ci/scripts/cpp_build.sh index 46845d0e623..a11dd23b7f7 100755 --- a/ci/scripts/cpp_build.sh +++ b/ci/scripts/cpp_build.sh @@ -74,6 +74,7 @@ cmake -G "${CMAKE_GENERATOR:-Ninja}" \ -DARROW_GANDIVA_JAVA=${ARROW_GANDIVA_JAVA:-OFF} \ -DARROW_GANDIVA_PC_CXX_FLAGS=${ARROW_GANDIVA_PC_CXX_FLAGS:-} \ -DARROW_GANDIVA=${ARROW_GANDIVA:-OFF} \ + -DARROW_GCS=${ARROW_GCS:-OFF} \ -DARROW_HDFS=${ARROW_HDFS:-ON} \ -DARROW_HIVESERVER2=${ARROW_HIVESERVER2:-OFF} \ -DARROW_INSTALL_NAME_RPATH=${ARROW_INSTALL_NAME_RPATH:-ON} \ @@ -121,6 +122,7 @@ cmake -G "${CMAKE_GENERATOR:-Ninja}" \ -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX:-${ARROW_HOME}} \ -DCMAKE_UNITY_BUILD=${CMAKE_UNITY_BUILD:-OFF} \ -Dgflags_SOURCE=${gflags_SOURCE:-} \ + -Dgoogle_cloud_cpp_storage_SOURCE=${google_cloud_cpp_storage_SOURCE:-} \ -DgRPC_SOURCE=${gRPC_SOURCE:-} \ -DGTest_SOURCE=${GTest_SOURCE:-} \ -DLz4_SOURCE=${Lz4_SOURCE:-} \ diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 2bcdc0de179..e98a5d54948 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -740,6 +740,14 @@ if(ARROW_ORC) endif() endif() +if(ARROW_GCS) + list(APPEND ARROW_LINK_LIBS google-cloud-cpp::storage) + list(APPEND ARROW_STATIC_LINK_LIBS google-cloud-cpp::storage) + if(google_cloud_cpp_storage_SOURCE STREQUAL "SYSTEM") + list(APPEND ARROW_STATIC_INSTALL_INTERFACE_LIBS google-cloud-cpp::storage) + endif() +endif() + if(ARROW_USE_GLOG) list(APPEND ARROW_LINK_LIBS glog::glog) list(APPEND ARROW_STATIC_LINK_LIBS glog::glog) diff --git a/cpp/cmake_modules/DefineOptions.cmake b/cpp/cmake_modules/DefineOptions.cmake index e2a85a4aa55..e8fb9e98a6d 100644 --- a/cpp/cmake_modules/DefineOptions.cmake +++ b/cpp/cmake_modules/DefineOptions.cmake @@ -224,6 +224,10 @@ if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") define_option(ARROW_GANDIVA "Build the Gandiva libraries" OFF) + define_option(ARROW_GCS + "Build Arrow with GCS support (requires the GCloud SDK for C++)" OFF) + mark_as_advanced(ARROW_GCS) # TODO(ARROW-1231) - remove once completed + define_option(ARROW_HDFS "Build the Arrow HDFS bridge" OFF) define_option(ARROW_HIVESERVER2 "Build the HiveServer2 client and Arrow adapter" OFF) diff --git a/cpp/cmake_modules/ThirdpartyToolchain.cmake b/cpp/cmake_modules/ThirdpartyToolchain.cmake index 36c8c33ab16..234ebc5a734 100644 --- a/cpp/cmake_modules/ThirdpartyToolchain.cmake +++ b/cpp/cmake_modules/ThirdpartyToolchain.cmake @@ -151,6 +151,8 @@ macro(build_dependency DEPENDENCY_NAME) build_gflags() elseif("${DEPENDENCY_NAME}" STREQUAL "GLOG") build_glog() + elseif("${DEPENDENCY_NAME}" STREQUAL "google_cloud_cpp_storage") + build_google_cloud_cpp_storage() elseif("${DEPENDENCY_NAME}" STREQUAL "gRPC") build_grpc() elseif("${DEPENDENCY_NAME}" STREQUAL "GTest") @@ -287,6 +289,10 @@ if(ARROW_FLIGHT) set(ARROW_WITH_ZLIB ON) endif() +if(ARROW_GCS) + set(ARROW_WITH_GOOGLE_CLOUD_CPP ON) +endif() + if(ARROW_JSON) set(ARROW_WITH_RAPIDJSON ON) endif() @@ -433,6 +439,14 @@ else() ) endif() +if(DEFINED ENV{ARROW_CRC32C_URL}) + set(CRC32C_URL "$ENV{ARROW_CRC32C_URL}") +else() + set_urls(CRC32C_SOURCE_URL + "https://github.com/google/crc32c/archive/${ARROW_CRC32C_BUILD_VERSION}.tar.gz" + ) +endif() + if(DEFINED ENV{ARROW_GBENCHMARK_URL}) set(GBENCHMARK_SOURCE_URL "$ENV{ARROW_GBENCHMARK_URL}") else() @@ -460,6 +474,14 @@ else() ) endif() +if(DEFINED ENV{ARROW_GOOGLE_CLOUD_CPP_URL}) + set(google_cloud_cpp_storage_SOURCE_URL "$ENV{ARROW_GOOGLE_CLOUD_CPP_URL}") +else() + set_urls(google_cloud_cpp_storage_SOURCE_URL + "https://github.com/googleapis/google-cloud-cpp/archive/${ARROW_GOOGLE_CLOUD_CPP_BUILD_VERSION}.tar.gz" + ) +endif() + if(DEFINED ENV{ARROW_GRPC_URL}) set(GRPC_SOURCE_URL "$ENV{ARROW_GRPC_URL}") else() @@ -497,6 +519,14 @@ else() ) endif() +if(DEFINED ENV{ARROW_NLOHMANN_JSON_URL}) + set(NLOHMANN_JSON_SOURCE_URL "$ENV{ARROW_NLOHMANN_JSON_URL}") +else() + set_urls(NLOHMANN_JSON_SOURCE_URL + "https://github.com/nlohmann/json/archive/${ARROW_NLOHMANN_JSON_BUILD_VERSION}.tar.gz" + ) +endif() + if(DEFINED ENV{ARROW_LZ4_URL}) set(LZ4_SOURCE_URL "$ENV{ARROW_LZ4_URL}") else() @@ -3470,6 +3500,197 @@ if(ARROW_WITH_GRPC) endif() endif() +# ---------------------------------------------------------------------- +# GCS and dependencies + +macro(build_crc32c_once) + if(NOT TARGET crc32c_ep) + message(STATUS "Building crc32c from source") + # Build crc32c + set(CRC32C_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/crc32c_ep-install") + set(CRC32C_CMAKE_ARGS + ${EP_COMMON_CMAKE_ARGS} + -DCMAKE_INSTALL_LIBDIR=lib + "-DCMAKE_INSTALL_PREFIX=" + -DCMAKE_CXX_STANDARD=11 + -DCRC32C_BUILD_TESTS=OFF + -DCRC32C_BUILD_BENCHMARKS=OFF + -DCRC32C_USE_GLOG=OFF) + + set(_CRC32C_STATIC_LIBRARY + "${CRC32C_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}crc32c${CMAKE_STATIC_LIBRARY_SUFFIX}" + ) + set(CRC32C_BUILD_BYPRODUCTS ${_CRC32C_STATIC_LIBRARY}) + set(CRC32C_LIBRARIES crc32c) + + externalproject_add(crc32c_ep + ${EP_LOG_OPTIONS} + INSTALL_DIR ${CRC32C_PREFIX} + URL ${CRC32C_SOURCE_URL} + URL_HASH "SHA256=${ARROW_CRC32C_BUILD_SHA256_CHECKSUM}" + CMAKE_ARGS ${CRC32C_CMAKE_ARGS} + BUILD_BYPRODUCTS ${CRC32C_BUILD_BYPRODUCTS}) + add_library(Crc32c::crc32c STATIC IMPORTED) + set_target_properties(Crc32c::crc32c + PROPERTIES IMPORTED_LOCATION ${_CRC32C_STATIC_LIBRARY} + INTERFACE_INCLUDE_DIRECTORIES + "${CRC32C_INCLUDE}/include") + add_dependencies(Crc32c::crc32c crc32c_ep) + endif() +endmacro() + +macro(build_nlohmann_json_once) + if(NOT TARGET nlohmann_json_ep) + message(STATUS "Building nlohmann-json from source") + # "Build" nlohmann-json + set(NLOHMANN_JSON_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/nlohmann_json_ep-install") + set(NLOHMANN_JSON_CMAKE_ARGS + ${EP_COMMON_CMAKE_ARGS} -DCMAKE_CXX_STANDARD=11 + "-DCMAKE_INSTALL_PREFIX=" -DBUILD_TESTING=OFF) + + set(NLOHMANN_JSON_BUILD_BYPRODUCTS ${NLOHMANN_JSON_PREFIX}/include/json.hpp) + + externalproject_add(nlohmann_json_ep + ${EP_LOG_OPTIONS} + INSTALL_DIR ${NLOHMANN_JSON_PREFIX} + URL ${NLOHMANN_JSON_SOURCE_URL} + URL_HASH "SHA256=${ARROW_NLOHMANN_JSON_BUILD_SHA256_CHECKSUM}" + CMAKE_ARGS ${NLOHMANN_JSON_CMAKE_ARGS} + BUILD_BYPRODUCTS ${NLOHMANN_JSON_BUILD_BYPRODUCTS}) + add_library(nlohmann_json::nlohmann_json INTERFACE IMPORTED) + set_target_properties(nlohmann_json::nlohmann_json + PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${NLOHMANN_JSON_PREFIX}/include") + add_dependencies(nlohmann_json::nlohmann_json nlohmann_json_ep) + endif() +endmacro() + +macro(build_google_cloud_cpp_storage) + message(STATUS "Building google-cloud-cpp from source") + message(STATUS "Only building the google-cloud-cpp::storage component") + + # List of dependencies taken from https://github.com/googleapis/google-cloud-cpp/blob/master/doc/packaging.md + build_absl_once() + build_crc32c_once() + build_nlohmann_json_once() + + # Curl is required on all platforms, but building it internally might also trip over S3's copy. + # For now, force its inclusion from the underlying system or fail. + find_package(CURL REQUIRED 7.47.0) + + # Build google-cloud-cpp, with only storage_client + + # Inject vendored packages via CMAKE_PREFIX_PATH + list(APPEND GOOGLE_CLOUD_CPP_PREFIX_PATH_LIST ${ABSL_PREFIX}) + list(APPEND GOOGLE_CLOUD_CPP_PREFIX_PATH_LIST ${CRC32C_PREFIX}) + list(APPEND GOOGLE_CLOUD_CPP_PREFIX_PATH_LIST ${NLOHMANN_JSON_PREFIX}) + + set(GOOGLE_CLOUD_CPP_PREFIX_PATH_LIST_SEP_CHAR "|") + list(JOIN GOOGLE_CLOUD_CPP_PREFIX_PATH_LIST + ${GOOGLE_CLOUD_CPP_PREFIX_PATH_LIST_SEP_CHAR} GOOGLE_CLOUD_CPP_PREFIX_PATH) + + set(GOOGLE_CLOUD_CPP_INSTALL_PREFIX + "${CMAKE_CURRENT_BINARY_DIR}/google_cloud_cpp_ep-install") + set(GOOGLE_CLOUD_CPP_INCLUDE_DIR "${GOOGLE_CLOUD_CPP_INSTALL_PREFIX}/include") + set(GOOGLE_CLOUD_CPP_CMAKE_ARGS + ${EP_COMMON_CMAKE_ARGS} + -DBUILD_TESTING=OFF + -DCMAKE_INSTALL_LIBDIR=lib + "-DCMAKE_INSTALL_PREFIX=" + -DCMAKE_INSTALL_RPATH=$ORIGIN + -DCMAKE_PREFIX_PATH=${GOOGLE_CLOUD_CPP_PREFIX_PATH} + # Compile only the storage library and its dependencies. To enable + # other services (Spanner, Bigtable, etc.) add them (as a list) to this + # parameter. Each has its own `google-cloud-cpp::*` library. + -DGOOGLE_CLOUD_CPP_ENABLE=storage) + if(OPENSSL_ROOT_DIR) + list(APPEND GOOGLE_CLOUD_CPP_CMAKE_ARGS -DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR}) + endif() + + add_custom_target(google_cloud_cpp_dependencies) + + add_dependencies(google_cloud_cpp_dependencies absl_ep) + add_dependencies(google_cloud_cpp_dependencies crc32c_ep) + add_dependencies(google_cloud_cpp_dependencies nlohmann_json_ep) + # Typically the steps to build the AWKSSDK provide `CURL::libcurl`, but if that is + # disabled we need to provide our own. + if(NOT TARGET CURL::libcurl) + find_package(CURL REQUIRED) + if(NOT TARGET CURL::libcurl) + # For CMake 3.11 or older + add_library(CURL::libcurl UNKNOWN IMPORTED) + set_target_properties(CURL::libcurl + PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${CURL_INCLUDE_DIRS}" IMPORTED_LOCATION + "${CURL_LIBRARIES}") + endif() + endif() + + set(GOOGLE_CLOUD_CPP_STATIC_LIBRARY_STORAGE + "${GOOGLE_CLOUD_CPP_INSTALL_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}google_cloud_cpp_storage${CMAKE_STATIC_LIBRARY_SUFFIX}" + ) + + set(GOOGLE_CLOUD_CPP_STATIC_LIBRARY_COMMON + "${GOOGLE_CLOUD_CPP_INSTALL_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}google_cloud_cpp_common${CMAKE_STATIC_LIBRARY_SUFFIX}" + ) + + externalproject_add(google_cloud_cpp_ep + ${EP_LOG_OPTIONS} + LIST_SEPARATOR ${GOOGLE_CLOUD_CPP_PREFIX_PATH_LIST_SEP_CHAR} + INSTALL_DIR ${GOOGLE_CLOUD_CPP_INSTALL_PREFIX} + URL ${google_cloud_cpp_storage_SOURCE_URL} + URL_HASH "SHA256=${ARROW_GOOGLE_CLOUD_CPP_BUILD_SHA256_CHECKSUM}" + CMAKE_ARGS ${GOOGLE_CLOUD_CPP_CMAKE_ARGS} + BUILD_BYPRODUCTS ${GOOGLE_CLOUD_CPP_STATIC_LIBRARY_STORAGE} + ${GOOGLE_CLOUD_CPP_STATIC_LIBRARY_COMMON} + DEPENDS google_cloud_cpp_dependencies) + add_dependencies(toolchain google_cloud_cpp_ep) + + add_library(google-cloud-cpp::common STATIC IMPORTED) + set_target_properties(google-cloud-cpp::common + PROPERTIES IMPORTED_LOCATION + "${GOOGLE_CLOUD_CPP_STATIC_LIBRARY_COMMON}" + INTERFACE_INCLUDE_DIRECTORIES + "${GOOGLE_CLOUD_CPP_INCLUDE_DIR}") + set_property(TARGET google-cloud-cpp::common + PROPERTY INTERFACE_LINK_LIBRARIES + absl::any + absl::flat_hash_map + absl::memory + absl::optional + absl::time + Threads::Threads) + + add_library(google-cloud-cpp::storage STATIC IMPORTED) + set_target_properties(google-cloud-cpp::storage + PROPERTIES IMPORTED_LOCATION + "${GOOGLE_CLOUD_CPP_STATIC_LIBRARY_STORAGE}" + INTERFACE_INCLUDE_DIRECTORIES + "${GOOGLE_CLOUD_CPP_INCLUDE_DIR}") + set_property(TARGET google-cloud-cpp::storage + PROPERTY INTERFACE_LINK_LIBRARIES + google-cloud-cpp::common + absl::memory + absl::strings + absl::str_format + absl::time + absl::variant + nlohmann_json::nlohmann_json + Crc32c::crc32c + CURL::libcurl + Threads::Threads + OpenSSL::SSL + OpenSSL::Crypto) + add_dependencies(google-cloud-cpp::storage google_cloud_cpp_ep) + + list(APPEND ARROW_BUNDLED_STATIC_LIBS google-cloud-cpp::storage + google-cloud-cpp::common) +endmacro() + +if(ARROW_WITH_GOOGLE_CLOUD_CPP) + resolve_dependency(google_cloud_cpp_storage) +endif() + # # HDFS thirdparty setup diff --git a/cpp/thirdparty/versions.txt b/cpp/thirdparty/versions.txt index 09fc0295cf8..b40c37f9c1f 100644 --- a/cpp/thirdparty/versions.txt +++ b/cpp/thirdparty/versions.txt @@ -41,12 +41,16 @@ ARROW_BZIP2_BUILD_VERSION=1.0.8 ARROW_BZIP2_BUILD_SHA256_CHECKSUM=ab5a03176ee106d3f0fa90e381da478ddae405918153cca248e682cd0c4a2269 ARROW_CARES_BUILD_VERSION=1.17.1 ARROW_CARES_BUILD_SHA256_CHECKSUM=d73dd0f6de824afd407ce10750ea081af47eba52b8a6cb307d220131ad93fc40 +ARROW_CRC32C_BUILD_VERSION=1.1.1 +ARROW_CRC32C_BUILD_SHA256_CHECKSUM=a6533f45b1670b5d59b38a514d82b09c6fb70cc1050467220216335e873074e8 ARROW_GBENCHMARK_BUILD_VERSION=v1.5.2 ARROW_GBENCHMARK_BUILD_SHA256_CHECKSUM=dccbdab796baa1043f04982147e67bb6e118fe610da2c65f88912d73987e700c ARROW_GFLAGS_BUILD_VERSION=v2.2.2 ARROW_GFLAGS_BUILD_SHA256_CHECKSUM=34af2f15cf7367513b352bdcd2493ab14ce43692d2dcd9dfc499492966c64dcf ARROW_GLOG_BUILD_VERSION=v0.4.0 ARROW_GLOG_BUILD_SHA256_CHECKSUM=f28359aeba12f30d73d9e4711ef356dc842886968112162bc73002645139c39c +ARROW_GOOGLE_CLOUD_CPP_BUILD_VERSION=v1.31.1 +ARROW_GOOGLE_CLOUD_CPP_BUILD_SHA256_CHECKSUM=dc7cbf95b506a84b48cf71e0462985d262183edeaabdacaaee2109852394a609 ARROW_GRPC_BUILD_VERSION=v1.35.0 ARROW_GRPC_BUILD_SHA256_CHECKSUM=27dd2fc5c9809ddcde8eb6fa1fa278a3486566dfc28335fca13eb8df8bd3b958 ARROW_GTEST_BUILD_VERSION=1.11.0 @@ -59,6 +63,8 @@ ARROW_LZ4_BUILD_SHA256_CHECKSUM=030644df4611007ff7dc962d981f390361e6c97a34e5cbc3 # https://github.com/microsoft/mimalloc/issues/353 ARROW_MIMALLOC_BUILD_VERSION=v1.7.2 ARROW_MIMALLOC_BUILD_SHA256_CHECKSUM=b1912e354565a4b698410f7583c0f83934a6dbb3ade54ab7ddcb1569320936bd +ARROW_NLOHMANN_JSON_BUILD_VERSION=v3.10.2 +ARROW_NLOHMANN_JSON_BUILD_SHA256_CHECKSUM=081ed0f9f89805c2d96335c3acfa993b39a0a5b4b4cef7edb68dd2210a13458c ARROW_ORC_BUILD_VERSION=1.7.0 ARROW_ORC_BUILD_SHA256_CHECKSUM=45d6ba9149ffa2aaa168d61ab326f61181861c94529f26da3918a9aa2f801e39 ARROW_PROTOBUF_BUILD_VERSION=v3.17.3 @@ -98,14 +104,17 @@ DEPENDENCIES=( "ARROW_BROTLI_URL brotli-${ARROW_BROTLI_BUILD_VERSION}.tar.gz https://github.com/google/brotli/archive/${ARROW_BROTLI_BUILD_VERSION}.tar.gz" "ARROW_BZIP2_URL bzip2-${ARROW_BZIP2_BUILD_VERSION}.tar.gz https://sourceware.org/pub/bzip2/bzip2-${ARROW_BZIP2_BUILD_VERSION}.tar.gz" "ARROW_CARES_URL cares-${ARROW_CARES_BUILD_VERSION}.tar.gz https://c-ares.haxx.se/download/c-ares-${ARROW_CARES_BUILD_VERSION}.tar.gz" + "ARROW_CRC32C_URL crc32c-${ARROW_CRC32C_BUILD_VERSION}.tar.gz https://github.com/google/crc32c/archive/refs/tags/${ARROW_CRC32C_BUILD_VERSION}.tar.gz "ARROW_GBENCHMARK_URL gbenchmark-${ARROW_GBENCHMARK_BUILD_VERSION}.tar.gz https://github.com/google/benchmark/archive/${ARROW_GBENCHMARK_BUILD_VERSION}.tar.gz" "ARROW_GFLAGS_URL gflags-${ARROW_GFLAGS_BUILD_VERSION}.tar.gz https://github.com/gflags/gflags/archive/${ARROW_GFLAGS_BUILD_VERSION}.tar.gz" "ARROW_GLOG_URL glog-${ARROW_GLOG_BUILD_VERSION}.tar.gz https://github.com/google/glog/archive/${ARROW_GLOG_BUILD_VERSION}.tar.gz" + "ARROW_GOOGLE_CLOUD_CPP_URL google-cloud-cpp-${ARROW_GOOGLE_CLOUD_CPP_BUILD_VERSION}.tar.gz https://github.com/googleapis/google-cloud-cpp/archive/refs/tags/${ARROW_GOOGLE_CLOUD_CPP_BUILD_VERSION}.tar.gz "ARROW_GRPC_URL grpc-${ARROW_GRPC_BUILD_VERSION}.tar.gz https://github.com/grpc/grpc/archive/${ARROW_GRPC_BUILD_VERSION}.tar.gz" "ARROW_GTEST_URL gtest-${ARROW_GTEST_BUILD_VERSION}.tar.gz https://github.com/google/googletest/archive/release-${ARROW_GTEST_BUILD_VERSION}.tar.gz" "ARROW_JEMALLOC_URL jemalloc-${ARROW_JEMALLOC_BUILD_VERSION}.tar.bz2 https://github.com/jemalloc/jemalloc/releases/download/${ARROW_JEMALLOC_BUILD_VERSION}/jemalloc-${ARROW_JEMALLOC_BUILD_VERSION}.tar.bz2" "ARROW_LZ4_URL lz4-${ARROW_LZ4_BUILD_VERSION}.tar.gz https://github.com/lz4/lz4/archive/${ARROW_LZ4_BUILD_VERSION}.tar.gz" "ARROW_MIMALLOC_URL mimalloc-${ARROW_MIMALLOC_BUILD_VERSION}.tar.gz https://github.com/microsoft/mimalloc/archive/${ARROW_MIMALLOC_BUILD_VERSION}.tar.gz" + "ARROW_NLOHMANN_JSON_URL nlohmann-json-${ARROW_NLOHMANN_JSON_BUILD_VERSION}.tar.gz https://github.com/nlohmann/json/archive/refs/tags/${ARROW_NLOHMANN_JSON_BUILD_VERSION}.tar.gz "ARROW_ORC_URL orc-${ARROW_ORC_BUILD_VERSION}.tar.gz https://github.com/apache/orc/archive/rel/release-${ARROW_ORC_BUILD_VERSION}.tar.gz" "ARROW_PROTOBUF_URL protobuf-${ARROW_PROTOBUF_BUILD_VERSION}.tar.gz https://github.com/google/protobuf/releases/download/${ARROW_PROTOBUF_BUILD_VERSION}/protobuf-all-${ARROW_PROTOBUF_BUILD_VERSION:1}.tar.gz" "ARROW_RAPIDJSON_URL rapidjson-${ARROW_RAPIDJSON_BUILD_VERSION}.tar.gz https://github.com/miloyip/rapidjson/archive/${ARROW_RAPIDJSON_BUILD_VERSION}.tar.gz"