Skip to content

Commit 1e28afd

Browse files
committed
GH-47792: [C++] Upgrade bundled ORC to 2.3.0
1 parent d091957 commit 1e28afd

3 files changed

Lines changed: 134 additions & 63 deletions

File tree

cpp/cmake_modules/ThirdpartyToolchain.cmake

Lines changed: 28 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -3761,66 +3761,31 @@ function(build_orc)
37613761

37623762
message(STATUS "Building Apache ORC from source")
37633763

3764-
if(LZ4_VENDORED)
3765-
set(ORC_LZ4_TARGET lz4_static)
3766-
set(ORC_LZ4_ROOT "${lz4_SOURCE_DIR}")
3767-
set(ORC_LZ4_INCLUDE_DIR "${lz4_SOURCE_DIR}/lib")
3768-
else()
3769-
set(ORC_LZ4_TARGET LZ4::lz4)
3770-
get_target_property(ORC_LZ4_INCLUDE_DIR ${ORC_LZ4_TARGET}
3771-
INTERFACE_INCLUDE_DIRECTORIES)
3772-
get_filename_component(ORC_LZ4_ROOT "${ORC_LZ4_INCLUDE_DIR}" DIRECTORY)
3773-
endif()
3774-
37753764
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.29)
3765+
# ORC 2.3.0 doesn't include apache/orc#2437 yet. Patch it so
3766+
# FetchContent can reuse Arrow's bundled dependency targets directly.
3767+
set(ORC_PATCH_COMMAND)
3768+
find_program(GIT git)
3769+
if(GIT)
3770+
set(ORC_PATCH_COMMAND ${GIT} apply ${CMAKE_CURRENT_LIST_DIR}/orc-2437.patch)
3771+
else()
3772+
find_program(PATCH patch)
3773+
if(PATCH)
3774+
set(ORC_PATCH_COMMAND ${PATCH} -p1 -i ${CMAKE_CURRENT_LIST_DIR}/orc-2437.patch)
3775+
endif()
3776+
endif()
3777+
if(NOT ORC_PATCH_COMMAND)
3778+
message(FATAL_ERROR "git or patch is required to patch bundled ORC")
3779+
endif()
3780+
37763781
fetchcontent_declare(orc
37773782
${FC_DECLARE_COMMON_OPTIONS}
3783+
PATCH_COMMAND ${ORC_PATCH_COMMAND}
37783784
URL ${ORC_SOURCE_URL}
37793785
URL_HASH "SHA256=${ARROW_ORC_BUILD_SHA256_CHECKSUM}")
37803786
prepare_fetchcontent()
37813787

37823788
set(CMAKE_UNITY_BUILD FALSE)
3783-
3784-
set(ORC_PREFER_STATIC_LZ4 OFF)
3785-
set(LZ4_HOME "${ORC_LZ4_ROOT}")
3786-
set(LZ4_INCLUDE_DIR "${ORC_LZ4_INCLUDE_DIR}")
3787-
set(LZ4_LIBRARY ${ORC_LZ4_TARGET})
3788-
3789-
set(ORC_PREFER_STATIC_PROTOBUF OFF)
3790-
get_target_property(PROTOBUF_INCLUDE_DIR ${ARROW_PROTOBUF_LIBPROTOBUF}
3791-
INTERFACE_INCLUDE_DIRECTORIES)
3792-
get_filename_component(Protobuf_ROOT "${PROTOBUF_INCLUDE_DIR}" DIRECTORY)
3793-
set(PROTOBUF_HOME ${Protobuf_ROOT})
3794-
set(PROTOBUF_EXECUTABLE ${ARROW_PROTOBUF_PROTOC})
3795-
set(PROTOBUF_LIBRARY ${ARROW_PROTOBUF_LIBPROTOBUF})
3796-
set(PROTOC_LIBRARY ${ARROW_PROTOBUF_LIBPROTOC})
3797-
3798-
set(ORC_PREFER_STATIC_SNAPPY OFF)
3799-
get_target_property(SNAPPY_INCLUDE_DIR ${Snappy_TARGET} INTERFACE_INCLUDE_DIRECTORIES)
3800-
get_filename_component(Snappy_ROOT "${SNAPPY_INCLUDE_DIR}" DIRECTORY)
3801-
set(SNAPPY_HOME ${Snappy_ROOT})
3802-
set(SNAPPY_LIBRARY ${Snappy_TARGET})
3803-
3804-
set(ORC_PREFER_STATIC_ZLIB OFF)
3805-
get_target_property(ZLIB_INCLUDE_DIR ZLIB::ZLIB INTERFACE_INCLUDE_DIRECTORIES)
3806-
get_filename_component(ZLIB_ROOT "${ZLIB_INCLUDE_DIR}" DIRECTORY)
3807-
set(ZLIB_HOME ${ZLIB_ROOT})
3808-
# From CMake 3.21 onwards the set(CACHE) command does not remove
3809-
# any normal variable of the same name from the current scope. We
3810-
# have to manually remove the variable via unset to avoid ORC not
3811-
# finding the ZLIB_LIBRARY.
3812-
unset(ZLIB_LIBRARY)
3813-
set(ZLIB_LIBRARY
3814-
ZLIB::ZLIB
3815-
CACHE STRING "" FORCE)
3816-
3817-
set(ORC_PREFER_STATIC_ZSTD OFF)
3818-
get_target_property(ZSTD_INCLUDE_DIR ${ARROW_ZSTD_LIBZSTD}
3819-
INTERFACE_INCLUDE_DIRECTORIES)
3820-
get_filename_component(ZSTD_ROOT "${ZSTD_INCLUDE_DIR}" DIRECTORY)
3821-
set(ZSTD_HOME ${ZSTD_ROOT})
3822-
set(ZSTD_LIBRARY ${ARROW_ZSTD_LIBZSTD})
3823-
38243789
set(BUILD_CPP_TESTS OFF)
38253790
set(BUILD_JAVA OFF)
38263791
set(BUILD_LIBHDFSPP OFF)
@@ -3830,15 +3795,6 @@ function(build_orc)
38303795

38313796
fetchcontent_makeavailable(orc)
38323797

3833-
# ORC 2.2.1 unconditionally adds /std:c++17 on MSVC via
3834-
# add_compile_options, which overrides CMAKE_CXX_STANDARD and causes
3835-
# ABI mismatches with protobuf (GlobalEmptyStringConstexpr vs
3836-
# GlobalEmptyStringDynamicInit). Override the standard on the orc target.
3837-
# Fixed in ORC 2.3.0: https://github.com/apache/orc/commit/7674f43
3838-
if(MSVC)
3839-
target_compile_options(orc PRIVATE "/std:c++${CMAKE_CXX_STANDARD}")
3840-
endif()
3841-
38423798
add_library(orc::orc INTERFACE IMPORTED)
38433799
target_link_libraries(orc::orc INTERFACE orc)
38443800
target_link_libraries(orc::orc INTERFACE ${ARROW_PROTOBUF_LIBPROTOBUF})
@@ -3889,6 +3845,17 @@ function(build_orc)
38893845
get_target_property(ORC_ZLIB_ROOT ZLIB::ZLIB INTERFACE_INCLUDE_DIRECTORIES)
38903846
get_filename_component(ORC_ZLIB_ROOT "${ORC_ZLIB_ROOT}" DIRECTORY)
38913847

3848+
if(LZ4_VENDORED)
3849+
set(ORC_LZ4_TARGET lz4_static)
3850+
set(ORC_LZ4_ROOT "${lz4_SOURCE_DIR}")
3851+
set(ORC_LZ4_INCLUDE_DIR "${lz4_SOURCE_DIR}/lib")
3852+
else()
3853+
set(ORC_LZ4_TARGET LZ4::lz4)
3854+
get_target_property(ORC_LZ4_INCLUDE_DIR ${ORC_LZ4_TARGET}
3855+
INTERFACE_INCLUDE_DIRECTORIES)
3856+
get_filename_component(ORC_LZ4_ROOT "${ORC_LZ4_INCLUDE_DIR}" DIRECTORY)
3857+
endif()
3858+
38923859
if(ORC_ABSL_INCLUDE_DIR)
38933860
set(ORC_CXX_FLAGS "${EP_CXX_FLAGS} -isystem ${ORC_ABSL_INCLUDE_DIR}")
38943861
else()

cpp/cmake_modules/orc-2437.patch

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
# Licensed to the Apache Software Foundation (ASF) under one
2+
# or more contributor license agreements. See the NOTICE file
3+
# distributed with this work for additional information
4+
# regarding copyright ownership. The ASF licenses this file
5+
# to you under the Apache License, Version 2.0 (the
6+
# "License"); you may not use this file except in compliance
7+
# with the License. You may obtain a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing,
12+
# software distributed under the License is distributed on an
13+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14+
# KIND, either express or implied. See the License for the
15+
# specific language governing permissions and limitations
16+
# under the License.
17+
18+
diff --git a/cmake_modules/ThirdpartyToolchain.cmake b/cmake_modules/ThirdpartyToolchain.cmake
19+
index c03afa8f29..e8cfb85aa1 100644
20+
--- a/cmake_modules/ThirdpartyToolchain.cmake
21+
+++ b/cmake_modules/ThirdpartyToolchain.cmake
22+
@@ -172,6 +172,12 @@ elseif (ORC_PACKAGE_KIND STREQUAL "vcpkg")
23+
list (APPEND ORC_SYSTEM_DEPENDENCIES Protobuf)
24+
list (APPEND ORC_INSTALL_INTERFACE_TARGETS "$<INSTALL_INTERFACE:protobuf::libprotobuf>")
25+
set (PROTOBUF_EXECUTABLE protobuf::protoc)
26+
+elseif (TARGET ${ARROW_PROTOBUF_LIBPROTOBUF})
27+
+ # Used by Apache Arrow only, remove this once Arrow leverages FetchContent for Protobuf
28+
+ add_library (orc_protobuf INTERFACE IMPORTED)
29+
+ target_link_libraries(orc_protobuf INTERFACE ${ARROW_PROTOBUF_LIBPROTOBUF})
30+
+ set (PROTOBUF_EXECUTABLE ${ARROW_PROTOBUF_PROTOC})
31+
+ message(STATUS "Using existing ${ARROW_PROTOBUF_LIBPROTOBUF}")
32+
elseif (NOT "${PROTOBUF_HOME}" STREQUAL "")
33+
find_package (ProtobufAlt REQUIRED)
34+
35+
@@ -181,12 +187,6 @@ elseif (NOT "${PROTOBUF_HOME}" STREQUAL "")
36+
orc_add_resolved_library (orc_protobuf ${PROTOBUF_LIBRARY} ${PROTOBUF_INCLUDE_DIR})
37+
endif ()
38+
39+
- if (ORC_PREFER_STATIC_PROTOBUF AND PROTOC_STATIC_LIB)
40+
- orc_add_resolved_library (orc_protoc ${PROTOC_STATIC_LIB} ${PROTOBUF_INCLUDE_DIR})
41+
- else ()
42+
- orc_add_resolved_library (orc_protoc ${PROTOC_LIBRARY} ${PROTOBUF_INCLUDE_DIR})
43+
- endif ()
44+
-
45+
list (APPEND ORC_SYSTEM_DEPENDENCIES ProtobufAlt)
46+
list (APPEND ORC_INSTALL_INTERFACE_TARGETS "$<INSTALL_INTERFACE:protobuf::libprotobuf>")
47+
orc_provide_find_module (ProtobufAlt)
48+
@@ -245,9 +245,7 @@ else ()
49+
50+
add_library(orc_protobuf INTERFACE IMPORTED)
51+
target_link_libraries(orc_protobuf INTERFACE protobuf::libprotobuf)
52+
- if(NOT PROTOBUF_EXECUTABLE)
53+
- set(PROTOBUF_EXECUTABLE protobuf::protoc)
54+
- endif()
55+
+ set(PROTOBUF_EXECUTABLE protobuf::protoc)
56+
endblock()
57+
endif ()
58+
59+
@@ -277,6 +275,16 @@ elseif (NOT "${SNAPPY_HOME}" STREQUAL "")
60+
list (APPEND ORC_SYSTEM_DEPENDENCIES SnappyAlt)
61+
list (APPEND ORC_INSTALL_INTERFACE_TARGETS "$<INSTALL_INTERFACE:Snappy::snappy>")
62+
orc_provide_find_module (SnappyAlt)
63+
+elseif (TARGET Snappy::snappy)
64+
+ # Used by Apache Arrow only, remove this once Arrow leverages FetchContent for Snappy
65+
+ add_library (orc_snappy INTERFACE IMPORTED)
66+
+ target_link_libraries(orc_snappy INTERFACE Snappy::snappy)
67+
+ message(STATUS "Using existing Snappy::snappy")
68+
+elseif (TARGET Snappy::snappy-static)
69+
+ # Used by Apache Arrow only, remove this once Arrow leverages FetchContent for Snappy
70+
+ add_library (orc_snappy INTERFACE IMPORTED)
71+
+ target_link_libraries(orc_snappy INTERFACE Snappy::snappy-static)
72+
+ message(STATUS "Using existing Snappy::snappy-static")
73+
else ()
74+
block(PROPAGATE ORC_SYSTEM_DEPENDENCIES ORC_INSTALL_INTERFACE_TARGETS)
75+
prepare_fetchcontent()
76+
@@ -359,6 +367,11 @@ elseif (NOT "${ZLIB_HOME}" STREQUAL "")
77+
list (APPEND ORC_SYSTEM_DEPENDENCIES ZLIBAlt)
78+
list (APPEND ORC_INSTALL_INTERFACE_TARGETS "$<INSTALL_INTERFACE:ZLIB::ZLIB>")
79+
orc_provide_find_module (ZLIBAlt)
80+
+elseif (TARGET ZLIB::ZLIB)
81+
+ # Used by Apache Arrow only, remove this once Arrow leverages FetchContent for ZLIB
82+
+ add_library (orc_zlib INTERFACE IMPORTED)
83+
+ target_link_libraries(orc_zlib INTERFACE ZLIB::ZLIB)
84+
+ message(STATUS "Using existing ZLIB::ZLIB")
85+
else ()
86+
block(PROPAGATE ORC_SYSTEM_DEPENDENCIES ORC_INSTALL_INTERFACE_TARGETS ZLIB_LIBRARIES ZLIB_INCLUDE_DIRS)
87+
prepare_fetchcontent()
88+
@@ -450,6 +463,16 @@ elseif (NOT "${ZSTD_HOME}" STREQUAL "")
89+
endif ()
90+
list (APPEND ORC_SYSTEM_DEPENDENCIES ZSTDAlt)
91+
orc_provide_find_module (ZSTDAlt)
92+
+elseif (TARGET zstd::libzstd_shared)
93+
+ # Used by Apache Arrow only, remove this once Arrow leverages FetchContent for zstd
94+
+ add_library (orc_zstd INTERFACE IMPORTED)
95+
+ target_link_libraries(orc_zstd INTERFACE zstd::libzstd_shared)
96+
+ message(STATUS "Using existing zstd::libzstd_shared")
97+
+elseif (TARGET zstd::libzstd_static)
98+
+ # Used by Apache Arrow only, remove this once Arrow leverages FetchContent for zstd
99+
+ add_library (orc_zstd INTERFACE IMPORTED)
100+
+ target_link_libraries(orc_zstd INTERFACE zstd::libzstd_static)
101+
+ message(STATUS "Using existing zstd::libzstd_static")
102+
else ()
103+
block(PROPAGATE ORC_SYSTEM_DEPENDENCIES ORC_INSTALL_INTERFACE_TARGETS)
104+
prepare_fetchcontent()

cpp/thirdparty/versions.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,8 @@ ARROW_OPENTELEMETRY_BUILD_VERSION=v1.21.0
8888
ARROW_OPENTELEMETRY_BUILD_SHA256_CHECKSUM=98e5546f577a11b52a57faed1f4cc60d8c1daa44760eba393f43eab5a8ec46a2
8989
ARROW_OPENTELEMETRY_PROTO_BUILD_VERSION=v1.7.0
9090
ARROW_OPENTELEMETRY_PROTO_BUILD_SHA256_CHECKSUM=11330d850f5e24d34c4246bc8cb21fcd311e7565d219195713455a576bb11bed
91-
ARROW_ORC_BUILD_VERSION=2.2.1
92-
ARROW_ORC_BUILD_SHA256_CHECKSUM=52fc762332442e8b05d7182f8c035f9e04d945b9a52be22ab69f28b3f37d4500
91+
ARROW_ORC_BUILD_VERSION=2.3.0
92+
ARROW_ORC_BUILD_SHA256_CHECKSUM=6c9e2f6663ac9ef34ca4ae5ae4f004a651e5fe31f2e05b6eb5d99d105091d87c
9393
ARROW_PROTOBUF_BUILD_VERSION=v31.1
9494
ARROW_PROTOBUF_BUILD_SHA256_CHECKSUM=12bfd76d27b9ac3d65c00966901609e020481b9474ef75c7ff4601ac06fa0b82
9595
# Because of https://github.com/Tencent/rapidjson/pull/1323, we require

0 commit comments

Comments
 (0)