This is an automated email from the ASF dual-hosted git repository.
xuanwo 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 95b592d Add iceberg_arrow library (#6)
95b592d is described below
commit 95b592d1af867566f4b72948323416a7f339c291
Author: Gang Wu <[email protected]>
AuthorDate: Thu Jan 9 21:19:45 2025 +0800
Add iceberg_arrow library (#6)
Co-authored-by: Sutou Kouhei <[email protected]>
---
CMakeLists.txt | 24 ++--
README.md | 36 ++++--
api/CMakeLists.txt | 21 ----
cmake_modules/BuildUtils.cmake | 50 ++++++--
cmake_modules/ThirdpartyToolchain.cmake | 132 +++++++++++++++++++++
example/CMakeLists.txt | 7 +-
example/demo_example.cc | 10 +-
src/.DS_Store | Bin 0 -> 6148 bytes
src/CMakeLists.txt | 3 +-
src/core/icebergConfig.cmake.in | 22 ----
src/{core => iceberg}/CMakeLists.txt | 22 ++--
src/iceberg/IcebergConfig.cmake.in | 80 +++++++++++++
src/iceberg/arrow/CMakeLists.txt | 78 ++++++++++++
.../demo_table.cc => iceberg/arrow/demo_arrow.cc} | 15 ++-
.../demo_table.h => iceberg/arrow/demo_arrow.h} | 16 +--
.../demo_puffin.h => iceberg/demo_table.cc} | 10 +-
src/{core => iceberg}/demo_table.h | 4 +-
{api => src}/iceberg/puffin.h | 10 +-
src/iceberg/puffin/CMakeLists.txt | 56 +++++++++
.../puffin/demo_puffin.cc} | 10 +-
src/{ => iceberg}/puffin/demo_puffin.h | 10 +-
{api => src}/iceberg/table.h | 10 +-
src/puffin/CMakeLists.txt | 27 -----
src/puffin/demo_puffin.cc | 28 -----
src/puffin/puffinConfig.cmake.in | 22 ----
25 files changed, 498 insertions(+), 205 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 22e24d6..82c6045 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -21,9 +21,9 @@ if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Debug)
endif()
-list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules")
+list(PREPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules")
-project(iceberg
+project(Iceberg
VERSION 0.1.0
DESCRIPTION "Iceberg C++ Project"
LANGUAGES CXX)
@@ -36,22 +36,26 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
option(ICEBERG_BUILD_STATIC "Build static library" ON)
option(ICEBERG_BUILD_SHARED "Build shared library" OFF)
option(ICEBERG_BUILD_TESTS "Build tests" ON)
+option(ICEBERG_ARROW "Build Arrow" ON)
-include(CMakePackageConfigHelpers)
-include(CMakeParseArguments)
-include(BuildUtils)
-include(ExternalProject)
-include(FindPackageHandleStandardArgs)
include(GNUInstallDirs)
-
-set(ICEBERG_API_DIR "${CMAKE_SOURCE_DIR}/api")
set(ICEBERG_INSTALL_LIBDIR "${CMAKE_INSTALL_LIBDIR}")
set(ICEBERG_INSTALL_BINDIR "${CMAKE_INSTALL_BINDIR}")
set(ICEBERG_INSTALL_INCLUDEDIR "${CMAKE_INSTALL_INCLUDEDIR}")
set(ICEBERG_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake")
set(ICEBERG_INSTALL_DOCDIR "share/doc/${PROJECT_NAME}")
-add_subdirectory(api)
+if(WIN32 AND NOT MINGW)
+ set(MSVC_TOOLCHAIN TRUE)
+else()
+ set(MSVC_TOOLCHAIN FALSE)
+endif()
+
+include(CMakeParseArguments)
+include(BuildUtils)
+include(ThirdpartyToolchain)
+include(GenerateExportHeader)
+
add_subdirectory(src)
if(ICEBERG_BUILD_TESTS)
diff --git a/README.md b/README.md
index 56cedaf..7009aee 100644
--- a/README.md
+++ b/README.md
@@ -32,10 +32,27 @@ C++ implementation of [Apache
Iceberg™](https://iceberg.apache.org/).
```bash
cd iceberg-cpp
-mkdir build && cd build
-cmake .. -DCMAKE_INSTALL_PREFIX=/tmp/iceberg -DICEBERG_BUILD_STATIC=ON
-DICEBERG_BUILD_SHARED=ON
-cmake --build .
-cmake --install .
+cmake -S . -B build -DCMAKE_INSTALL_PREFIX=/path/to/install
-DICEBERG_BUILD_STATIC=ON -DICEBERG_BUILD_SHARED=ON
+cmake --build build
+cmake --install build
+```
+
+### Build and Install Iceberg Arrow Library
+
+#### Vendored Apache Arrow (default)
+
+```bash
+cmake -S . -B build -DCMAKE_INSTALL_PREFIX=/path/to/install -DICEBERG_ARROW=ON
+cmake --build build
+cmake --install build
+```
+
+#### Provided Apache Arrow
+
+```bash
+cmake -S . -B build -DCMAKE_INSTALL_PREFIX=/path/to/install
-DCMAKE_PREFIX_PATH=/path/to/arrow -DICEBERG_ARROW=ON
+cmake --build build
+cmake --install build
```
### Build Examples
@@ -44,9 +61,14 @@ After installing the core libraries, you can build the
examples:
```bash
cd iceberg-cpp/example
-mkdir build && cd build
-cmake .. -DCMAKE_PREFIX_PATH=/tmp/iceberg
-cmake --build .
+cmake -S . -B build -DCMAKE_PREFIX_PATH=/path/to/install
+cmake --build build
+```
+
+If you are using provided Apache Arrow, you need to include `/path/to/arrow`
in `CMAKE_PREFIX_PATH` as below.
+
+```bash
+cmake -S . -B build -DCMAKE_PREFIX_PATH="/path/to/install;/path/to/arrow"
```
## Contribute
diff --git a/api/CMakeLists.txt b/api/CMakeLists.txt
deleted file mode 100644
index 5a481c8..0000000
--- a/api/CMakeLists.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/iceberg"
- DESTINATION "${ICEBERG_INSTALL_INCLUDEDIR}"
- FILES_MATCHING
- PATTERN "*.h")
diff --git a/cmake_modules/BuildUtils.cmake b/cmake_modules/BuildUtils.cmake
index 4d6bf1d..8a30753 100644
--- a/cmake_modules/BuildUtils.cmake
+++ b/cmake_modules/BuildUtils.cmake
@@ -18,6 +18,8 @@
# Borrowed the file from Apache Arrow:
# https://github.com/apache/arrow/blob/main/cpp/cmake_modules/BuildUtils.cmake
+include(CMakePackageConfigHelpers)
+
function(iceberg_install_cmake_package PACKAGE_NAME EXPORT_NAME)
set(CONFIG_CMAKE "${PACKAGE_NAME}Config.cmake")
set(BUILT_CONFIG_CMAKE "${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_CMAKE}")
@@ -37,12 +39,11 @@ function(iceberg_install_cmake_package PACKAGE_NAME
EXPORT_NAME)
FILE "${TARGETS_CMAKE}")
endfunction()
-function(ADD_ICEBERG_LIB LIB_NAME)
+function(add_iceberg_lib LIB_NAME)
set(options)
set(one_value_args
BUILD_SHARED
BUILD_STATIC
- CMAKE_PACKAGE_NAME
INSTALL_ARCHIVE_DIR
INSTALL_LIBRARY_DIR
INSTALL_RUNTIME_DIR
@@ -146,8 +147,8 @@ function(ADD_ICEBERG_LIB LIB_NAME)
"$<INSTALL_INTERFACE:${ARG_SHARED_INSTALL_INTERFACE_LIBS}>"
PRIVATE ${ARG_SHARED_PRIVATE_LINK_LIBS})
- install(TARGETS ${LIB_NAME}_shared ${INSTALL_IS_OPTIONAL}
- EXPORT ${LIB_NAME}_targets
+ install(TARGETS ${LIB_NAME}_shared
+ EXPORT iceberg_targets
ARCHIVE DESTINATION ${INSTALL_ARCHIVE_DIR}
LIBRARY DESTINATION ${INSTALL_LIBRARY_DIR}
RUNTIME DESTINATION ${INSTALL_RUNTIME_DIR}
@@ -201,8 +202,8 @@ function(ADD_ICEBERG_LIB LIB_NAME)
PUBLIC
"$<BUILD_INTERFACE:${ARG_STATIC_LINK_LIBS}>")
endif()
- install(TARGETS ${LIB_NAME}_static ${INSTALL_IS_OPTIONAL}
- EXPORT ${LIB_NAME}_targets
+ install(TARGETS ${LIB_NAME}_static
+ EXPORT iceberg_targets
ARCHIVE DESTINATION ${INSTALL_ARCHIVE_DIR}
LIBRARY DESTINATION ${INSTALL_LIBRARY_DIR}
RUNTIME DESTINATION ${INSTALL_RUNTIME_DIR}
@@ -210,8 +211,16 @@ function(ADD_ICEBERG_LIB LIB_NAME)
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
endif()
- if(ARG_CMAKE_PACKAGE_NAME)
- iceberg_install_cmake_package(${ARG_CMAKE_PACKAGE_NAME}
${LIB_NAME}_targets)
+ # generate export header file
+ if(BUILD_SHARED)
+ generate_export_header(${LIB_NAME}_shared BASE_NAME ${LIB_NAME})
+ if(BUILD_STATIC)
+ string(TOUPPER ${LIB_NAME} LIB_NAME_UPPER)
+ target_compile_definitions(${LIB_NAME}_static
+ PUBLIC ${LIB_NAME_UPPER}_STATIC_DEFINE)
+ endif()
+ elseif(BUILD_STATIC)
+ generate_export_header(${LIB_NAME}_static BASE_NAME ${LIB_NAME})
endif()
# Modify variable in calling scope
@@ -221,3 +230,28 @@ function(ADD_ICEBERG_LIB LIB_NAME)
PARENT_SCOPE)
endif()
endfunction()
+
+function(iceberg_install_all_headers PATH)
+ set(options)
+ set(one_value_args)
+ set(multi_value_args PATTERN)
+ cmake_parse_arguments(ARG
+ "${options}"
+ "${one_value_args}"
+ "${multi_value_args}"
+ ${ARGN})
+ if(NOT ARG_PATTERN)
+ set(ARG_PATTERN "*.h" "*.hpp")
+ endif()
+ file(GLOB CURRENT_DIRECTORY_HEADERS ${ARG_PATTERN})
+
+ set(PUBLIC_HEADERS)
+ foreach(HEADER ${CURRENT_DIRECTORY_HEADERS})
+ get_filename_component(HEADER_BASENAME ${HEADER} NAME)
+ if(HEADER_BASENAME MATCHES "internal")
+ continue()
+ endif()
+ list(APPEND PUBLIC_HEADERS ${HEADER})
+ endforeach()
+ install(FILES ${PUBLIC_HEADERS} DESTINATION
"${ICEBERG_INSTALL_INCLUDEDIR}/${PATH}")
+endfunction()
diff --git a/cmake_modules/ThirdpartyToolchain.cmake
b/cmake_modules/ThirdpartyToolchain.cmake
new file mode 100644
index 0000000..efd587a
--- /dev/null
+++ b/cmake_modules/ThirdpartyToolchain.cmake
@@ -0,0 +1,132 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# Accumulate all dependencies to provide suitable static link parameters to the
+# third party libraries.
+set(ICEBERG_SYSTEM_DEPENDENCIES)
+set(ICEBERG_ARROW_INSTALL_INTERFACE_LIBS)
+
+# ----------------------------------------------------------------------
+# Versions and URLs for toolchain builds
+
+set(ICEBERG_ARROW_BUILD_VERSION "18.1.0")
+set(ICEBERG_ARROW_BUILD_SHA256_CHECKSUM
+ "2dc8da5f8796afe213ecc5e5aba85bb82d91520eff3cf315784a52d0fa61d7fc")
+
+if(DEFINED ENV{ICEBERG_ARROW_URL})
+ set(ARROW_SOURCE_URL "$ENV{ICEBERG_ARROW_URL}")
+else()
+ set(ARROW_SOURCE_URL
+
"https://www.apache.org/dyn/closer.lua?action=download&filename=/arrow/arrow-${ICEBERG_ARROW_BUILD_VERSION}/apache-arrow-${ICEBERG_ARROW_BUILD_VERSION}.tar.gz"
+
"https://downloads.apache.org/arrow/arrow-${ICEBERG_ARROW_BUILD_VERSION}/apache-arrow-${ICEBERG_ARROW_BUILD_VERSION}.tar.gz"
+ )
+endif()
+
+# ----------------------------------------------------------------------
+# FetchContent
+
+include(FetchContent)
+set(FC_DECLARE_COMMON_OPTIONS)
+if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.28)
+ list(APPEND FC_DECLARE_COMMON_OPTIONS EXCLUDE_FROM_ALL TRUE)
+endif()
+
+macro(prepare_fetchcontent)
+ set(BUILD_SHARED_LIBS OFF)
+ set(BUILD_STATIC_LIBS ON)
+ set(CMAKE_COMPILE_WARNING_AS_ERROR FALSE)
+ set(CMAKE_EXPORT_NO_PACKAGE_REGISTRY TRUE)
+ set(CMAKE_POSITION_INDEPENDENT_CODE ON)
+endmacro()
+
+# ----------------------------------------------------------------------
+# Apache Arrow
+
+function(resolve_arrow_dependency)
+ prepare_fetchcontent()
+
+ set(ARROW_BUILD_SHARED
+ OFF
+ CACHE BOOL "" FORCE)
+ set(ARROW_BUILD_STATIC
+ ON
+ CACHE BOOL "" FORCE)
+ set(ARROW_FILESYSTEM
+ OFF
+ CACHE BOOL "" FORCE)
+ set(ARROW_SIMD_LEVEL
+ "NONE"
+ CACHE STRING "" FORCE)
+ set(ARROW_RUNTIME_SIMD_LEVEL
+ "NONE"
+ CACHE STRING "" FORCE)
+ set(ARROW_POSITION_INDEPENDENT_CODE
+ ON
+ CACHE BOOL "" FORCE)
+ set(ARROW_DEPENDENCY_SOURCE
+ "AUTO"
+ CACHE STRING "" FORCE)
+
+ fetchcontent_declare(Arrow
+ ${FC_DECLARE_COMMON_OPTIONS}
+ URL ${ARROW_SOURCE_URL}
+ URL_HASH "SHA256=${ICEBERG_ARROW_BUILD_SHA256_CHECKSUM}"
+ SOURCE_SUBDIR
+ cpp
+ FIND_PACKAGE_ARGS
+ NAMES
+ Arrow
+ CONFIG)
+
+ # Add Arrow cmake modules to the search path
+ list(PREPEND CMAKE_MODULE_PATH
+ ${CMAKE_CURRENT_BINARY_DIR}/_deps/arrow-src/cpp/cmake_modules)
+
+ fetchcontent_makeavailable(Arrow)
+
+ if(arrow_SOURCE_DIR)
+ if(NOT TARGET Arrow::arrow_static)
+ add_library(Arrow::arrow_static INTERFACE IMPORTED)
+ target_link_libraries(Arrow::arrow_static INTERFACE arrow_static)
+ target_include_directories(Arrow::arrow_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
+ EXPORT iceberg_targets
+ RUNTIME DESTINATION "${ICEBERG_INSTALL_BINDIR}"
+ ARCHIVE DESTINATION "${ICEBERG_INSTALL_LIBDIR}"
+ LIBRARY DESTINATION "${ICEBERG_INSTALL_LIBDIR}")
+ else()
+ set(ARROW_VENDORED FALSE)
+ list(APPEND ICEBERG_SYSTEM_DEPENDENCIES Arrow)
+ endif()
+
+ set(ICEBERG_SYSTEM_DEPENDENCIES
+ ${ICEBERG_SYSTEM_DEPENDENCIES}
+ PARENT_SCOPE)
+ set(ARROW_VENDORED
+ ${ARROW_VENDORED}
+ PARENT_SCOPE)
+endfunction()
+
+if(ICEBERG_ARROW)
+ resolve_arrow_dependency()
+endif()
diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt
index 0d21c3a..4da20ca 100644
--- a/example/CMakeLists.txt
+++ b/example/CMakeLists.txt
@@ -22,10 +22,9 @@ project(example)
set(CMAKE_CXX_STANDARD 20)
-find_package(iceberg CONFIG REQUIRED)
-find_package(puffin CONFIG REQUIRED)
+find_package(Iceberg CONFIG REQUIRED)
add_executable(demo_example demo_example.cc)
-target_link_libraries(demo_example PRIVATE iceberg::iceberg_core_static
- puffin::iceberg_puffin_static)
+target_link_libraries(demo_example PRIVATE Iceberg::iceberg_puffin_static
+ Iceberg::iceberg_arrow_static)
diff --git a/example/demo_example.cc b/example/demo_example.cc
index 99d4bcf..f4801f1 100644
--- a/example/demo_example.cc
+++ b/example/demo_example.cc
@@ -19,11 +19,13 @@
#include <iostream>
-#include "iceberg/puffin.h"
-#include "iceberg/table.h"
+#include "iceberg/arrow/demo_arrow.h"
+#include "iceberg/demo_table.h"
+#include "iceberg/puffin/demo_puffin.h"
int main() {
- std::cout << iceberg::Table::create()->print() << std::endl;
- std::cout << iceberg::Puffin::create()->print() << std::endl;
+ std::cout << iceberg::DemoTable().print() << std::endl;
+ std::cout << iceberg::puffin::DemoPuffin().print() << std::endl;
+ std::cout << iceberg::arrow::DemoArrow().print() << std::endl;
return 0;
}
diff --git a/src/.DS_Store b/src/.DS_Store
new file mode 100644
index 0000000..b27e8d8
Binary files /dev/null and b/src/.DS_Store differ
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index bec7622..6ec40de 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -15,5 +15,4 @@
# specific language governing permissions and limitations
# under the License.
-add_subdirectory(core)
-add_subdirectory(puffin)
+add_subdirectory(iceberg)
diff --git a/src/core/icebergConfig.cmake.in b/src/core/icebergConfig.cmake.in
deleted file mode 100644
index 2e12a8f..0000000
--- a/src/core/icebergConfig.cmake.in
+++ /dev/null
@@ -1,22 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-@PACKAGE_INIT@
-
-include("${CMAKE_CURRENT_LIST_DIR}/icebergTargets.cmake")
-check_required_components(iceberg)
diff --git a/src/core/CMakeLists.txt b/src/iceberg/CMakeLists.txt
similarity index 64%
rename from src/core/CMakeLists.txt
rename to src/iceberg/CMakeLists.txt
index 83787d7..a84f3f9 100644
--- a/src/core/CMakeLists.txt
+++ b/src/iceberg/CMakeLists.txt
@@ -15,13 +15,21 @@
# specific language governing permissions and limitations
# under the License.
-set(ICEBERG_CORE_SOURCES demo_table.cc)
-set(ICEBERG_CORE_INCLUDES "${ICEBERG_API_DIR}")
+set(ICEBERG_SOURCES demo_table.cc)
+set(ICEBERG_INCLUDES "${CMAKE_SOURCE_DIR}/src" "${CMAKE_BINARY_DIR}/src")
-add_iceberg_lib(iceberg_core
- CMAKE_PACKAGE_NAME
- iceberg
+add_iceberg_lib(iceberg
SOURCES
- ${ICEBERG_CORE_SOURCES}
+ ${ICEBERG_SOURCES}
PRIVATE_INCLUDES
- ${ICEBERG_CORE_INCLUDES})
+ ${ICEBERG_INCLUDES})
+
+iceberg_install_all_headers(iceberg)
+
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/iceberg_export.h
+ DESTINATION ${ICEBERG_INSTALL_INCLUDEDIR}/iceberg)
+
+add_subdirectory(arrow)
+add_subdirectory(puffin)
+
+iceberg_install_cmake_package(Iceberg iceberg_targets)
diff --git a/src/iceberg/IcebergConfig.cmake.in
b/src/iceberg/IcebergConfig.cmake.in
new file mode 100644
index 0000000..e0b690d
--- /dev/null
+++ b/src/iceberg/IcebergConfig.cmake.in
@@ -0,0 +1,80 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# This config sets the following variables in your project::
+#
+# Iceberg_FOUND - true if Iceberg found on the system
+# Iceberg_VERSION - version of the found Iceberg
+#
+# This config sets the following targets (if built) in your project::
+#
+# Iceberg::iceberg_shared
+# Iceberg::iceberg_static
+# Iceberg::iceberg_puffin_shared
+# Iceberg::iceberg_puffin_static
+# Iceberg::iceberg_arrow_shared
+# Iceberg::iceberg_arrow_static
+
+@PACKAGE_INIT@
+
+set(ICEBERG_BUILD_STATIC "@ICEBERG_BUILD_STATIC@")
+set(ICEBERG_SYSTEM_DEPENDENCIES "@ICEBERG_SYSTEM_DEPENDENCIES@")
+
+include(CMakeFindDependencyMacro)
+
+macro(iceberg_find_dependencies dependencies)
+ if(DEFINED CMAKE_MODULE_PATH)
+ set(ICEBERG_CMAKE_MODULE_PATH_OLD ${CMAKE_MODULE_PATH})
+ else()
+ unset(ICEBERG_CMAKE_MODULE_PATH_OLD)
+ endif()
+ set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")
+
+ foreach(dependency ${dependencies})
+ find_dependency(${dependency})
+ endforeach()
+
+ if(DEFINED ICEBERG_CMAKE_MODULE_PATH_OLD)
+ set(CMAKE_MODULE_PATH ${ICEBERG_CMAKE_MODULE_PATH_OLD})
+ unset(ICEBERG_CMAKE_MODULE_PATH_OLD)
+ else()
+ unset(CMAKE_MODULE_PATH)
+ endif()
+endmacro()
+
+macro(iceberg_find_components components)
+ foreach(comp ${components})
+ string(TOLOWER "${comp}" _comp_lower_case)
+ if(TARGET "Iceberg::iceberg_${_comp_lower_case}_shared" OR
+ TARGET "Iceberg::iceberg_${_comp_lower_case}_static")
+ set(Iceberg_${comp}_FOUND TRUE)
+ else()
+ set(Iceberg_${comp}_FOUND FALSE)
+ set(Iceberg_NOT_FOUND_MESSAGE "Component ${comp} was not installed")
+ endif()
+ endforeach()
+endmacro()
+
+# Find system dependencies
+iceberg_find_dependencies("${ICEBERG_SYSTEM_DEPENDENCIES}")
+
+include("${CMAKE_CURRENT_LIST_DIR}/IcebergTargets.cmake")
+
+# Find required components
+iceberg_find_components("${Iceberg_FIND_COMPONENTS}")
+
+check_required_components(Iceberg)
diff --git a/src/iceberg/arrow/CMakeLists.txt b/src/iceberg/arrow/CMakeLists.txt
new file mode 100644
index 0000000..792631d
--- /dev/null
+++ b/src/iceberg/arrow/CMakeLists.txt
@@ -0,0 +1,78 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+if(NOT ICEBERG_ARROW)
+ return()
+endif()
+
+set(ICEBERG_ARROW_SOURCES demo_arrow.cc)
+set(ICEBERG_ARROW_INCLUDES "${ICEBERG_INCLUDES}")
+
+# Libraries to link with exported libiceberg_arrow.{so,a}.
+set(ICEBERG_ARROW_STATIC_BUILD_INTERFACE_LIBS)
+set(ICEBERG_ARROW_SHARED_BUILD_INTERFACE_LIBS)
+set(ICEBERG_ARROW_STATIC_INSTALL_INTERFACE_LIBS)
+set(ICEBERG_ARROW_SHARED_INSTALL_INTERFACE_LIBS)
+
+list(APPEND ICEBERG_ARROW_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>")
+list(APPEND ICEBERG_ARROW_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(ARROW_VENDORED)
+ list(APPEND ICEBERG_ARROW_STATIC_INSTALL_INTERFACE_LIBS
Iceberg::arrow_static)
+ list(APPEND ICEBERG_ARROW_SHARED_INSTALL_INTERFACE_LIBS
Iceberg::arrow_static)
+else()
+ list(APPEND
+ ICEBERG_ARROW_STATIC_INSTALL_INTERFACE_LIBS
+
"$<IF:$<TARGET_EXISTS:Arrow::arrow_static>,Arrow::arrow_static,Arrow::arrow_shared>"
+ )
+ list(APPEND
+ ICEBERG_ARROW_SHARED_INSTALL_INTERFACE_LIBS
+
"$<IF:$<TARGET_EXISTS:Arrow::arrow_shared>,Arrow::arrow_shared,Arrow::arrow_static>"
+ )
+endif()
+
+list(APPEND
+ ICEBERG_ARROW_STATIC_INSTALL_INTERFACE_LIBS
+
"$<IF:$<TARGET_EXISTS:Iceberg::iceberg_static>,Iceberg::iceberg_static,Iceberg::iceberg_shared>"
+)
+list(APPEND
+ ICEBERG_ARROW_SHARED_INSTALL_INTERFACE_LIBS
+
"$<IF:$<TARGET_EXISTS:Iceberg::iceberg_shared>,Iceberg::iceberg_shared,Iceberg::iceberg_static>"
+)
+
+add_iceberg_lib(iceberg_arrow
+ SOURCES
+ ${ICEBERG_ARROW_SOURCES}
+ PRIVATE_INCLUDES
+ ${ICEBERG_ARROW_INCLUDES}
+ SHARED_LINK_LIBS
+ ${ICEBERG_ARROW_SHARED_BUILD_INTERFACE_LIBS}
+ STATIC_LINK_LIBS
+ ${ICEBERG_ARROW_STATIC_BUILD_INTERFACE_LIBS}
+ STATIC_INSTALL_INTERFACE_LIBS
+ ${ICEBERG_ARROW_STATIC_INSTALL_INTERFACE_LIBS}
+ SHARED_INSTALL_INTERFACE_LIBS
+ ${ICEBERG_ARROW_SHARED_INSTALL_INTERFACE_LIBS})
+
+iceberg_install_all_headers(iceberg/arrow)
+
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/iceberg_arrow_export.h
+ DESTINATION ${ICEBERG_INSTALL_INCLUDEDIR}/iceberg/arrow)
diff --git a/src/core/demo_table.cc b/src/iceberg/arrow/demo_arrow.cc
similarity index 73%
copy from src/core/demo_table.cc
copy to src/iceberg/arrow/demo_arrow.cc
index 5c9d521..22c2b2a 100644
--- a/src/core/demo_table.cc
+++ b/src/iceberg/arrow/demo_arrow.cc
@@ -17,12 +17,17 @@
* under the License.
*/
-#include "demo_table.h"
+#include "iceberg/arrow/demo_arrow.h"
-namespace iceberg {
+#include <arrow/config.h>
-std::string_view DemoTable::print() const { return "DemoTable"; }
+#include "iceberg/demo_table.h"
-std::unique_ptr<Table> Table::create() { return std::make_unique<DemoTable>();
}
+namespace iceberg::arrow {
-} // namespace iceberg
+std::string DemoArrow::print() const {
+ return DemoTable().print() +
+ ", Arrow version: " + ::arrow::GetBuildInfo().version_string;
+}
+
+} // namespace iceberg::arrow
diff --git a/src/core/demo_table.h b/src/iceberg/arrow/demo_arrow.h
similarity index 75%
copy from src/core/demo_table.h
copy to src/iceberg/arrow/demo_arrow.h
index 3a8604c..61ac953 100644
--- a/src/core/demo_table.h
+++ b/src/iceberg/arrow/demo_arrow.h
@@ -19,16 +19,18 @@
#pragma once
+#include <string>
+
+#include "iceberg/arrow/iceberg_arrow_export.h"
#include "iceberg/table.h"
-namespace iceberg {
+namespace iceberg::arrow {
-class DemoTable : public Table {
+class ICEBERG_ARROW_EXPORT DemoArrow : public Table {
public:
- DemoTable() = default;
- ~DemoTable() override = default;
-
- std::string_view print() const override;
+ DemoArrow() = default;
+ ~DemoArrow() override = default;
+ std::string print() const override;
};
-} // namespace iceberg
+} // namespace iceberg::arrow
diff --git a/src/puffin/demo_puffin.h b/src/iceberg/demo_table.cc
similarity index 84%
copy from src/puffin/demo_puffin.h
copy to src/iceberg/demo_table.cc
index a03649b..29879b8 100644
--- a/src/puffin/demo_puffin.h
+++ b/src/iceberg/demo_table.cc
@@ -17,18 +17,12 @@
* under the License.
*/
-#pragma once
+#include "iceberg/demo_table.h"
#include "iceberg/puffin.h"
namespace iceberg {
-class DemoPuffin : public Puffin {
- public:
- DemoPuffin() = default;
- ~DemoPuffin() override = default;
-
- std::string_view print() const override;
-};
+std::string DemoTable::print() const { return "DemoTable"; }
} // namespace iceberg
diff --git a/src/core/demo_table.h b/src/iceberg/demo_table.h
similarity index 91%
rename from src/core/demo_table.h
rename to src/iceberg/demo_table.h
index 3a8604c..2dabaa5 100644
--- a/src/core/demo_table.h
+++ b/src/iceberg/demo_table.h
@@ -23,12 +23,12 @@
namespace iceberg {
-class DemoTable : public Table {
+class ICEBERG_EXPORT DemoTable : public Table {
public:
DemoTable() = default;
~DemoTable() override = default;
- std::string_view print() const override;
+ std::string print() const override;
};
} // namespace iceberg
diff --git a/api/iceberg/puffin.h b/src/iceberg/puffin.h
similarity index 86%
rename from api/iceberg/puffin.h
rename to src/iceberg/puffin.h
index b3dc8f7..52514f7 100644
--- a/api/iceberg/puffin.h
+++ b/src/iceberg/puffin.h
@@ -19,16 +19,16 @@
#pragma once
-#include <memory>
-#include <string_view>
+#include <string>
+
+#include "iceberg/iceberg_export.h"
namespace iceberg {
-class Puffin {
+class ICEBERG_EXPORT Puffin {
public:
virtual ~Puffin() = default;
- virtual std::string_view print() const = 0;
- static std::unique_ptr<Puffin> create();
+ virtual std::string print() const = 0;
};
} // namespace iceberg
diff --git a/src/iceberg/puffin/CMakeLists.txt
b/src/iceberg/puffin/CMakeLists.txt
new file mode 100644
index 0000000..5acd6be
--- /dev/null
+++ b/src/iceberg/puffin/CMakeLists.txt
@@ -0,0 +1,56 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+set(ICEBERG_PUFFIN_SOURCES demo_puffin.cc)
+set(ICEBERG_PUFFIN_INCLUDES "${ICEBERG_INCLUDES}")
+
+set(ICEBERG_PUFFIN_STATIC_BUILD_INTERFACE_LIBS)
+set(ICEBERG_PUFFIN_SHARED_BUILD_INTERFACE_LIBS)
+set(ICEBERG_PUFFIN_STATIC_INSTALL_INTERFACE_LIBS)
+set(ICEBERG_PUFFIN_SHARED_INSTALL_INTERFACE_LIBS)
+
+list(APPEND ICEBERG_PUFFIN_STATIC_BUILD_INTERFACE_LIBS
+ "$<IF:$<TARGET_EXISTS:iceberg_static>,iceberg_static,iceberg_shared>")
+list(APPEND ICEBERG_PUFFIN_SHARED_BUILD_INTERFACE_LIBS
+ "$<IF:$<TARGET_EXISTS:iceberg_shared>,iceberg_shared,iceberg_static>")
+list(APPEND
+ ICEBERG_PUFFIN_STATIC_INSTALL_INTERFACE_LIBS
+
"$<IF:$<TARGET_EXISTS:Iceberg::iceberg_static>,Iceberg::iceberg_static,Iceberg::iceberg_shared>"
+)
+list(APPEND
+ ICEBERG_PUFFIN_SHARED_INSTALL_INTERFACE_LIBS
+
"$<IF:$<TARGET_EXISTS:Iceberg::iceberg_shared>,Iceberg::iceberg_shared,Iceberg::iceberg_static>"
+)
+
+add_iceberg_lib(iceberg_puffin
+ SOURCES
+ ${ICEBERG_PUFFIN_SOURCES}
+ PRIVATE_INCLUDES
+ ${ICEBERG_PUFFIN_INCLUDES}
+ SHARED_LINK_LIBS
+ ${ICEBERG_PUFFIN_SHARED_BUILD_INTERFACE_LIBS}
+ STATIC_LINK_LIBS
+ ${ICEBERG_PUFFIN_STATIC_BUILD_INTERFACE_LIBS}
+ STATIC_INSTALL_INTERFACE_LIBS
+ ${ICEBERG_PUFFIN_STATIC_INSTALL_INTERFACE_LIBS}
+ SHARED_INSTALL_INTERFACE_LIBS
+ ${ICEBERG_PUFFIN_SHARED_INSTALL_INTERFACE_LIBS})
+
+iceberg_install_all_headers(iceberg/puffin)
+
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/iceberg_puffin_export.h
+ DESTINATION ${ICEBERG_INSTALL_INCLUDEDIR}/iceberg/puffin)
diff --git a/src/core/demo_table.cc b/src/iceberg/puffin/demo_puffin.cc
similarity index 78%
rename from src/core/demo_table.cc
rename to src/iceberg/puffin/demo_puffin.cc
index 5c9d521..51aa08c 100644
--- a/src/core/demo_table.cc
+++ b/src/iceberg/puffin/demo_puffin.cc
@@ -17,12 +17,10 @@
* under the License.
*/
-#include "demo_table.h"
+#include "iceberg/puffin/demo_puffin.h"
-namespace iceberg {
+namespace iceberg::puffin {
-std::string_view DemoTable::print() const { return "DemoTable"; }
+std::string DemoPuffin::print() const { return "DemoPuffin"; }
-std::unique_ptr<Table> Table::create() { return std::make_unique<DemoTable>();
}
-
-} // namespace iceberg
+} // namespace iceberg::puffin
diff --git a/src/puffin/demo_puffin.h b/src/iceberg/puffin/demo_puffin.h
similarity index 81%
rename from src/puffin/demo_puffin.h
rename to src/iceberg/puffin/demo_puffin.h
index a03649b..3544b7c 100644
--- a/src/puffin/demo_puffin.h
+++ b/src/iceberg/puffin/demo_puffin.h
@@ -20,15 +20,15 @@
#pragma once
#include "iceberg/puffin.h"
+#include "iceberg/puffin/iceberg_puffin_export.h"
-namespace iceberg {
+namespace iceberg::puffin {
-class DemoPuffin : public Puffin {
+class ICEBERG_PUFFIN_EXPORT DemoPuffin : public Puffin {
public:
DemoPuffin() = default;
~DemoPuffin() override = default;
-
- std::string_view print() const override;
+ std::string print() const override;
};
-} // namespace iceberg
+} // namespace iceberg::puffin
diff --git a/api/iceberg/table.h b/src/iceberg/table.h
similarity index 86%
rename from api/iceberg/table.h
rename to src/iceberg/table.h
index f06e336..bbdd999 100644
--- a/api/iceberg/table.h
+++ b/src/iceberg/table.h
@@ -19,16 +19,16 @@
#pragma once
-#include <memory>
-#include <string_view>
+#include <string>
+
+#include "iceberg/iceberg_export.h"
namespace iceberg {
-class Table {
+class ICEBERG_EXPORT Table {
public:
virtual ~Table() = default;
- virtual std::string_view print() const = 0;
- static std::unique_ptr<Table> create();
+ virtual std::string print() const = 0;
};
} // namespace iceberg
diff --git a/src/puffin/CMakeLists.txt b/src/puffin/CMakeLists.txt
deleted file mode 100644
index ff353e2..0000000
--- a/src/puffin/CMakeLists.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-set(ICEBERG_PUFFIN_SOURCES demo_puffin.cc)
-set(ICEBERG_PUFFIN_INCLUDES "${ICEBERG_API_DIR}")
-
-add_iceberg_lib(iceberg_puffin
- CMAKE_PACKAGE_NAME
- puffin
- SOURCES
- ${ICEBERG_PUFFIN_SOURCES}
- PRIVATE_INCLUDES
- ${ICEBERG_PUFFIN_INCLUDES})
diff --git a/src/puffin/demo_puffin.cc b/src/puffin/demo_puffin.cc
deleted file mode 100644
index a4fe7a0..0000000
--- a/src/puffin/demo_puffin.cc
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#include "demo_puffin.h"
-
-namespace iceberg {
-
-std::string_view DemoPuffin::print() const { return "DemoPuffin"; }
-
-std::unique_ptr<Puffin> Puffin::create() { return
std::make_unique<DemoPuffin>(); }
-
-} // namespace iceberg
diff --git a/src/puffin/puffinConfig.cmake.in b/src/puffin/puffinConfig.cmake.in
deleted file mode 100644
index c55b018..0000000
--- a/src/puffin/puffinConfig.cmake.in
+++ /dev/null
@@ -1,22 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-@PACKAGE_INIT@
-
-include("${CMAKE_CURRENT_LIST_DIR}/puffinTargets.cmake")
-check_required_components(puffin)