You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iceberg.apache.org by fo...@apache.org on 2025/04/29 08:01:18 UTC

(iceberg-cpp) branch main updated: feat: enable arrow to build parquet (#89)

This is an automated email from the ASF dual-hosted git repository.

fokko pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/iceberg-cpp.git


The following commit(s) were added to refs/heads/main by this push:
     new 1375104  feat: enable arrow to build parquet (#89)
1375104 is described below

commit 1375104e7de5150d3a6b7d9dda5b0951392f2eca
Author: Gang Wu <us...@gmail.com>
AuthorDate: Tue Apr 29 16:01:14 2025 +0800

    feat: enable arrow to build parquet (#89)
---
 cmake_modules/IcebergThirdpartyToolchain.cmake | 38 ++++++++++++++++++++++----
 src/iceberg/CMakeLists.txt                     |  4 +++
 src/iceberg/IcebergConfig.cmake.in             | 25 +++++++++++++++++
 src/iceberg/arrow/demo_arrow.cc                |  4 ++-
 4 files changed, 64 insertions(+), 7 deletions(-)

diff --git a/cmake_modules/IcebergThirdpartyToolchain.cmake b/cmake_modules/IcebergThirdpartyToolchain.cmake
index 1394fb1..caa6f6c 100644
--- a/cmake_modules/IcebergThirdpartyToolchain.cmake
+++ b/cmake_modules/IcebergThirdpartyToolchain.cmake
@@ -65,13 +65,15 @@ function(resolve_arrow_dependency)
   set(ARROW_BUILD_STATIC
       ON
       CACHE BOOL "" FORCE)
-  # To workaround https://github.com/apache/arrow/pull/45513
   set(ARROW_IPC
-      ON
+      OFF
       CACHE BOOL "" FORCE)
   set(ARROW_FILESYSTEM
       ON
       CACHE BOOL "" FORCE)
+  set(ARROW_PARQUET
+      ON
+      CACHE BOOL "" FORCE)
   set(ARROW_SIMD_LEVEL
       "NONE"
       CACHE STRING "" FORCE)
@@ -82,13 +84,15 @@ function(resolve_arrow_dependency)
       ON
       CACHE BOOL "" FORCE)
   set(ARROW_DEPENDENCY_SOURCE
-      "AUTO"
+      "BUNDLED"
       CACHE STRING "" FORCE)
 
   fetchcontent_declare(Arrow
                        ${FC_DECLARE_COMMON_OPTIONS}
-                       URL ${ARROW_SOURCE_URL}
-                       URL_HASH "SHA256=${ICEBERG_ARROW_BUILD_SHA256_CHECKSUM}"
+                       GIT_REPOSITORY https://github.com/wgtmac/arrow.git
+                       GIT_TAG 7d50c4ac803ad983734de5f418b7cd18f25b0dc9
+                       #URL ${ARROW_SOURCE_URL}
+                       #URL_HASH "SHA256=${ICEBERG_ARROW_BUILD_SHA256_CHECKSUM}"
                        SOURCE_SUBDIR
                        cpp
                        FIND_PACKAGE_ARGS
@@ -107,13 +111,35 @@ function(resolve_arrow_dependency)
                                            ${arrow_SOURCE_DIR}/cpp/src)
     endif()
 
+    if(NOT TARGET Parquet::parquet_static)
+      add_library(Parquet::parquet_static INTERFACE IMPORTED)
+      target_link_libraries(Parquet::parquet_static INTERFACE parquet_static)
+      target_include_directories(Parquet::parquet_static
+                                 INTERFACE ${arrow_BINARY_DIR}/src
+                                           ${arrow_SOURCE_DIR}/cpp/src)
+    endif()
+
     set(ARROW_VENDORED TRUE)
     set_target_properties(arrow_static PROPERTIES OUTPUT_NAME "iceberg_vendored_arrow")
-    install(TARGETS arrow_static
+    set_target_properties(parquet_static PROPERTIES OUTPUT_NAME
+                                                    "iceberg_vendored_parquet")
+    install(TARGETS arrow_static parquet_static
             EXPORT iceberg_targets
             RUNTIME DESTINATION "${ICEBERG_INSTALL_BINDIR}"
             ARCHIVE DESTINATION "${ICEBERG_INSTALL_LIBDIR}"
             LIBRARY DESTINATION "${ICEBERG_INSTALL_LIBDIR}")
+
+    if(TARGET arrow_bundled_dependencies)
+      message(STATUS "arrow_bundled_dependencies found")
+      # arrow_bundled_dependencies is only INSTALL_INTERFACE and will not be built by default.
+      # We need to add it as a dependency to arrow_static so that it will be built.
+      add_dependencies(arrow_static arrow_bundled_dependencies)
+      # We cannot install an IMPORTED target, so we need to install the library manually.
+      get_target_property(arrow_bundled_dependencies_location arrow_bundled_dependencies
+                          IMPORTED_LOCATION)
+      install(FILES ${arrow_bundled_dependencies_location}
+              DESTINATION ${ICEBERG_INSTALL_LIBDIR})
+    endif()
   else()
     set(ARROW_VENDORED FALSE)
     list(APPEND ICEBERG_SYSTEM_DEPENDENCIES Arrow)
diff --git a/src/iceberg/CMakeLists.txt b/src/iceberg/CMakeLists.txt
index 0f105a1..d1280ad 100644
--- a/src/iceberg/CMakeLists.txt
+++ b/src/iceberg/CMakeLists.txt
@@ -89,12 +89,14 @@ if(ICEBERG_BUILD_BUNDLE)
        ICEBERG_BUNDLE_STATIC_BUILD_INTERFACE_LIBS
        "$<IF:$<TARGET_EXISTS:iceberg_static>,iceberg_static,iceberg_shared>"
        "$<IF:$<TARGET_EXISTS:Arrow::arrow_static>,Arrow::arrow_static,Arrow::arrow_shared>"
+       "$<IF:$<TARGET_EXISTS:Parquet::parquet_static>,Parquet::parquet_static,Parquet::parquet_shared>"
        "$<IF:$<TARGET_EXISTS:Avro::avrocpp_static>,Avro::avrocpp_static,Avro::avrocpp_shared>"
   )
   list(APPEND
        ICEBERG_BUNDLE_SHARED_BUILD_INTERFACE_LIBS
        "$<IF:$<TARGET_EXISTS:iceberg_shared>,iceberg_shared,iceberg_static>"
        "$<IF:$<TARGET_EXISTS:Arrow::arrow_shared>,Arrow::arrow_shared,Arrow::arrow_static>"
+       "$<IF:$<TARGET_EXISTS:Parquet::parquet_shared>,Parquet::parquet_shared,Parquet::parquet_static>"
        "$<IF:$<TARGET_EXISTS:Avro::avrocpp_shared>,Avro::avrocpp_shared,Avro::avrocpp_static>"
   )
 
@@ -102,12 +104,14 @@ if(ICEBERG_BUILD_BUNDLE)
        ICEBERG_BUNDLE_STATIC_INSTALL_INTERFACE_LIBS
        "$<IF:$<TARGET_EXISTS:Iceberg::iceberg_static>,Iceberg::iceberg_static,Iceberg::iceberg_shared>"
        "$<IF:$<BOOL:${ARROW_VENDORED}>,Iceberg::arrow_static,$<IF:$<TARGET_EXISTS:Arrow::arrow_static>,Arrow::arrow_static,Arrow::arrow_shared>>"
+       "$<IF:$<BOOL:${ARROW_VENDORED}>,Iceberg::parquet_static,$<IF:$<TARGET_EXISTS:Parquet::parquet_static>,Parquet::parquet_static,Parquet::parquet_shared>>"
        "$<IF:$<BOOL:${AVRO_VENDORED}>,Iceberg::avrocpp_s,$<IF:$<TARGET_EXISTS:Avro::avrocpp_static>,Avro::avrocpp_static,Avro::avrocpp_shared>>"
   )
   list(APPEND
        ICEBERG_BUNDLE_SHARED_INSTALL_INTERFACE_LIBS
        "$<IF:$<TARGET_EXISTS:Iceberg::iceberg_shared>,Iceberg::iceberg_shared,Iceberg::iceberg_static>"
        "$<IF:$<BOOL:${ARROW_VENDORED}>,Iceberg::arrow_static,$<IF:$<TARGET_EXISTS:Arrow::arrow_shared>,Arrow::arrow_shared,Arrow::arrow_static>>"
+       "$<IF:$<BOOL:${ARROW_VENDORED}>,Iceberg::parquet_static,$<IF:$<TARGET_EXISTS:Parquet::parquet_shared>,Parquet::parquet_shared,Parquet::parquet_static>>"
        "$<IF:$<BOOL:${AVRO_VENDORED}>,Iceberg::avrocpp_s,$<IF:$<TARGET_EXISTS:Avro::avrocpp_shared>,Avro::avrocpp_shared,Avro::avrocpp_static>>"
   )
 
diff --git a/src/iceberg/IcebergConfig.cmake.in b/src/iceberg/IcebergConfig.cmake.in
index a466a62..8a9b9f3 100644
--- a/src/iceberg/IcebergConfig.cmake.in
+++ b/src/iceberg/IcebergConfig.cmake.in
@@ -72,6 +72,31 @@ iceberg_find_dependencies("${ICEBERG_SYSTEM_DEPENDENCIES}")
 
 include("${CMAKE_CURRENT_LIST_DIR}/IcebergTargets.cmake")
 
+if(TARGET Iceberg::arrow_static)
+  add_library(Arrow::arrow_static ALIAS Iceberg::arrow_static)
+
+  add_library(Arrow::arrow_bundled_dependencies STATIC IMPORTED)
+  get_target_property(arrow_static_configurations Iceberg::arrow_static
+                      IMPORTED_CONFIGURATIONS)
+  foreach(CONFIGURATION ${arrow_static_configurations})
+    string(TOUPPER "${CONFIGURATION}" CONFIGURATION)
+    get_target_property(arrow_static_location Iceberg::arrow_static
+                        LOCATION_${CONFIGURATION})
+    get_filename_component(arrow_lib_dir "${arrow_static_location}" DIRECTORY)
+    set_property(TARGET Arrow::arrow_bundled_dependencies
+                 APPEND
+                 PROPERTY IMPORTED_CONFIGURATIONS ${CONFIGURATION})
+    set_target_properties(Arrow::arrow_bundled_dependencies
+                          PROPERTIES IMPORTED_LOCATION_${CONFIGURATION}
+                                     "${arrow_lib_dir}/${CMAKE_STATIC_LIBRARY_PREFIX}arrow_bundled_dependencies${CMAKE_STATIC_LIBRARY_SUFFIX}"
+    )
+  endforeach()
+endif()
+
+if(TARGET Iceberg::parquet_static)
+  add_library(Parquet::parquet_static ALIAS Iceberg::parquet_static)
+endif()
+
 # Find required components
 iceberg_find_components("${Iceberg_FIND_COMPONENTS}")
 
diff --git a/src/iceberg/arrow/demo_arrow.cc b/src/iceberg/arrow/demo_arrow.cc
index e67a074..1e5de28 100644
--- a/src/iceberg/arrow/demo_arrow.cc
+++ b/src/iceberg/arrow/demo_arrow.cc
@@ -20,13 +20,15 @@
 #include "iceberg/arrow/demo_arrow.h"
 
 #include <arrow/config.h>
+#include <parquet/parquet_version.h>
 
 #include "iceberg/demo.h"
 
 namespace iceberg::arrow {
 
 std::string DemoArrow::print() const {
-  return Demo().print() + ", Arrow version: " + ::arrow::GetBuildInfo().version_string;
+  return Demo().print() + ", Arrow version: " + ::arrow::GetBuildInfo().version_string +
+         ", Parquet version: " + CREATED_BY_VERSION;
 }
 
 }  // namespace iceberg::arrow