Skip to content

Commit 65021dc

Browse files
committed
Add iceberg_arrow library
- add libiceberg_arrow - use single config file with three separate targets to support components - add fetchcontent support
1 parent 9f99f85 commit 65021dc

15 files changed

+443
-83
lines changed

CMakeLists.txt

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,24 +33,30 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
3333
set(CMAKE_CXX_EXTENSIONS OFF)
3434
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
3535

36+
if(WIN32 AND NOT MINGW)
37+
# This is used to handle builds using e.g. clang in an MSVC setting.
38+
set(MSVC_TOOLCHAIN TRUE)
39+
else()
40+
set(MSVC_TOOLCHAIN FALSE)
41+
endif()
42+
3643
option(ICEBERG_BUILD_STATIC "Build static library" ON)
3744
option(ICEBERG_BUILD_SHARED "Build shared library" OFF)
3845
option(ICEBERG_BUILD_TESTS "Build tests" ON)
46+
option(ICEBERG_ARROW "Build Arrow" ON)
3947

40-
include(CMakePackageConfigHelpers)
41-
include(CMakeParseArguments)
42-
include(BuildUtils)
43-
include(ExternalProject)
44-
include(FindPackageHandleStandardArgs)
4548
include(GNUInstallDirs)
46-
4749
set(ICEBERG_API_DIR "${CMAKE_SOURCE_DIR}/api")
4850
set(ICEBERG_INSTALL_LIBDIR "${CMAKE_INSTALL_LIBDIR}")
4951
set(ICEBERG_INSTALL_BINDIR "${CMAKE_INSTALL_BINDIR}")
5052
set(ICEBERG_INSTALL_INCLUDEDIR "${CMAKE_INSTALL_INCLUDEDIR}")
5153
set(ICEBERG_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake")
5254
set(ICEBERG_INSTALL_DOCDIR "share/doc/${PROJECT_NAME}")
5355

56+
include(CMakeParseArguments)
57+
include(BuildUtils)
58+
include(ThirdpartyToolchain)
59+
5460
add_subdirectory(api)
5561
add_subdirectory(src)
5662

README.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,29 @@ cmake --build .
3838
cmake --install .
3939
```
4040

41+
### Build and Install Iceberg Arrow Libraries
42+
43+
#### Vendored Apache Arrow (default)
44+
```bash
45+
cd iceberg-cpp/src/arrow
46+
mkdir build && cd build
47+
cmake .. -DCMAKE_INSTALL_PREFIX=/path/to/install -DICEBERG_ARROW=ON
48+
cmake --build .
49+
cmake --install .
50+
```
51+
52+
#### Provided Apache Arrow
53+
54+
```bash
55+
cd iceberg-cpp/src/arrow
56+
mkdir build && cd build
57+
cmake .. -DCMAKE_INSTALL_PREFIX=/path/to/install -DArrow_SOURCE=SYSTEM -DArrow_ROOT=/path/to/arrow
58+
cmake --build .
59+
cmake --install .
60+
```
61+
62+
Please note that `-DArrow_ROOT=/path/to/arrow` is required when building examples below when using provided Apache Arrow.
63+
4164
### Build Examples
4265

4366
After installing the core libraries, you can build the examples:

cmake_modules/BuildUtils.cmake

Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -18,31 +18,11 @@
1818
# Borrowed the file from Apache Arrow:
1919
# https://github.com/apache/arrow/blob/main/cpp/cmake_modules/BuildUtils.cmake
2020

21-
function(iceberg_install_cmake_package PACKAGE_NAME EXPORT_NAME)
22-
set(CONFIG_CMAKE "${PACKAGE_NAME}Config.cmake")
23-
set(BUILT_CONFIG_CMAKE "${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_CMAKE}")
24-
configure_package_config_file("${CONFIG_CMAKE}.in" "${BUILT_CONFIG_CMAKE}"
25-
INSTALL_DESTINATION "${ICEBERG_INSTALL_CMAKEDIR}/${PACKAGE_NAME}"
26-
)
27-
set(CONFIG_VERSION_CMAKE "${PACKAGE_NAME}ConfigVersion.cmake")
28-
set(BUILT_CONFIG_VERSION_CMAKE "${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_VERSION_CMAKE}")
29-
write_basic_package_version_file("${BUILT_CONFIG_VERSION_CMAKE}"
30-
COMPATIBILITY SameMajorVersion)
31-
install(FILES "${BUILT_CONFIG_CMAKE}" "${BUILT_CONFIG_VERSION_CMAKE}"
32-
DESTINATION "${ICEBERG_INSTALL_CMAKEDIR}/${PACKAGE_NAME}")
33-
set(TARGETS_CMAKE "${PACKAGE_NAME}Targets.cmake")
34-
install(EXPORT ${EXPORT_NAME}
35-
DESTINATION "${ICEBERG_INSTALL_CMAKEDIR}/${PACKAGE_NAME}"
36-
NAMESPACE "${PACKAGE_NAME}::"
37-
FILE "${TARGETS_CMAKE}")
38-
endfunction()
39-
4021
function(ADD_ICEBERG_LIB LIB_NAME)
4122
set(options)
4223
set(one_value_args
4324
BUILD_SHARED
4425
BUILD_STATIC
45-
CMAKE_PACKAGE_NAME
4626
INSTALL_ARCHIVE_DIR
4727
INSTALL_LIBRARY_DIR
4828
INSTALL_RUNTIME_DIR
@@ -146,7 +126,7 @@ function(ADD_ICEBERG_LIB LIB_NAME)
146126
"$<INSTALL_INTERFACE:${ARG_SHARED_INSTALL_INTERFACE_LIBS}>"
147127
PRIVATE ${ARG_SHARED_PRIVATE_LINK_LIBS})
148128

149-
install(TARGETS ${LIB_NAME}_shared ${INSTALL_IS_OPTIONAL}
129+
install(TARGETS ${LIB_NAME}_shared
150130
EXPORT ${LIB_NAME}_targets
151131
ARCHIVE DESTINATION ${INSTALL_ARCHIVE_DIR}
152132
LIBRARY DESTINATION ${INSTALL_LIBRARY_DIR}
@@ -201,7 +181,7 @@ function(ADD_ICEBERG_LIB LIB_NAME)
201181
PUBLIC "$<BUILD_INTERFACE:${ARG_STATIC_LINK_LIBS}>")
202182
endif()
203183

204-
install(TARGETS ${LIB_NAME}_static ${INSTALL_IS_OPTIONAL}
184+
install(TARGETS ${LIB_NAME}_static
205185
EXPORT ${LIB_NAME}_targets
206186
ARCHIVE DESTINATION ${INSTALL_ARCHIVE_DIR}
207187
LIBRARY DESTINATION ${INSTALL_LIBRARY_DIR}
@@ -210,9 +190,12 @@ function(ADD_ICEBERG_LIB LIB_NAME)
210190
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
211191
endif()
212192

213-
if(ARG_CMAKE_PACKAGE_NAME)
214-
iceberg_install_cmake_package(${ARG_CMAKE_PACKAGE_NAME} ${LIB_NAME}_targets)
215-
endif()
193+
string(TOLOWER ${LIB_NAME} LIB_NAME_LOWER_CASE)
194+
string(REPLACE "_" "-" LIB_NAME_DASH_SEPARATED_LOWER_CASE ${LIB_NAME_LOWER_CASE})
195+
install(EXPORT ${LIB_NAME}_targets
196+
DESTINATION "${ICEBERG_INSTALL_CMAKEDIR}/Iceberg"
197+
NAMESPACE "Iceberg::"
198+
FILE "${LIB_NAME_DASH_SEPARATED_LOWER_CASE}-targets.cmake")
216199

217200
# Modify variable in calling scope
218201
if(ARG_OUTPUTS)
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
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+
# Accumulate all dependencies to provide suitable static link parameters to the
19+
# third party libraries.
20+
set(ICEBERG_SYSTEM_DEPENDENCIES)
21+
set(ICEBERG_VENDOR_DEPENDENCIES)
22+
set(ICEBERG_ARROW_INSTALL_INTERFACE_LIBS)
23+
24+
# ----------------------------------------------------------------------
25+
# Versions and URLs for toolchain builds
26+
27+
set(ICEBERG_ARROW_BUILD_VERSION "18.1.0")
28+
set(ICEBERG_ARROW_BUILD_SHA256_CHECKSUM
29+
"2dc8da5f8796afe213ecc5e5aba85bb82d91520eff3cf315784a52d0fa61d7fc")
30+
set(ARROW_VENDORED TRUE)
31+
32+
if(DEFINED ENV{ICEBERG_ARROW_URL})
33+
set(ARROW_SOURCE_URL "$ENV{ICEBERG_ARROW_URL}")
34+
else()
35+
set(ARROW_SOURCE_URL
36+
"https://www.apache.org/dyn/closer.cgi?action=download&filename=/arrow/arrow-${ICEBERG_ARROW_BUILD_VERSION}/apache-arrow-${ICEBERG_ARROW_BUILD_VERSION}.tar.gz"
37+
"https://downloads.apache.org/arrow/arrow-${ICEBERG_ARROW_BUILD_VERSION}/apache-arrow-${ICEBERG_ARROW_BUILD_VERSION}.tar.gz"
38+
"https://github.com/apache/arrow/releases/download/apache-arrow-${ICEBERG_ARROW_BUILD_VERSION}/apache-arrow-${ICEBERG_ARROW_BUILD_VERSION}.tar.gz"
39+
)
40+
endif()
41+
42+
# ----------------------------------------------------------------------
43+
# FetchContent
44+
45+
include(FetchContent)
46+
set(FC_DECLARE_COMMON_OPTIONS)
47+
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.28)
48+
list(APPEND FC_DECLARE_COMMON_OPTIONS EXCLUDE_FROM_ALL TRUE)
49+
endif()
50+
51+
macro(prepare_fetchcontent)
52+
set(BUILD_SHARED_LIBS OFF)
53+
set(BUILD_STATIC_LIBS ON)
54+
set(CMAKE_COMPILE_WARNING_AS_ERROR FALSE)
55+
set(CMAKE_EXPORT_NO_PACKAGE_REGISTRY TRUE)
56+
endmacro()
57+
58+
# ----------------------------------------------------------------------
59+
# Apache Arrow
60+
61+
function(resolve_arrow_dependency)
62+
set(ARROW_BUILD_SHARED
63+
OFF
64+
CACHE BOOL "" FORCE)
65+
set(ARROW_BUILD_STATIC
66+
ON
67+
CACHE BOOL "" FORCE)
68+
set(ARROW_FILESYSTEM
69+
OFF
70+
CACHE BOOL "" FORCE)
71+
set(ARROW_SIMD_LEVEL
72+
"NONE"
73+
CACHE STRING "" FORCE)
74+
set(ARROW_RUNTIME_SIMD_LEVEL
75+
"NONE"
76+
CACHE STRING "" FORCE)
77+
78+
fetchcontent_declare(Arrow
79+
${FC_DECLARE_COMMON_OPTIONS}
80+
URL ${ARROW_SOURCE_URL}
81+
URL_HASH "SHA256=${ICEBERG_ARROW_BUILD_SHA256_CHECKSUM}"
82+
SOURCE_SUBDIR
83+
cpp
84+
FIND_PACKAGE_ARGS
85+
NAMES
86+
Arrow
87+
CONFIG)
88+
89+
# Add Arrow cmake modules to the search path
90+
list(PREPEND CMAKE_MODULE_PATH
91+
${CMAKE_CURRENT_BINARY_DIR}/_deps/arrow-src/cpp/cmake_modules)
92+
93+
fetchcontent_makeavailable(Arrow)
94+
95+
if(NOT TARGET Arrow::arrow_static)
96+
add_library(Arrow::arrow_static INTERFACE IMPORTED)
97+
target_link_libraries(Arrow::arrow_static INTERFACE arrow_static)
98+
target_include_directories(Arrow::arrow_static INTERFACE ${arrow_SOURCE_DIR}/cpp/src
99+
${arrow_BINARY_DIR}/src)
100+
endif()
101+
102+
fetchcontent_getproperties(Arrow)
103+
if(arrow_SOURCE_DIR)
104+
set(ARROW_VENDORED TRUE)
105+
install(TARGETS arrow_static
106+
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
107+
ARCHIVE DESTINATION "${ICEBERG_INSTALL_LIBDIR}"
108+
LIBRARY DESTINATION "${ICEBERG_INSTALL_LIBDIR}")
109+
110+
get_target_property(ARROW_STATIC_LIB arrow_static OUTPUT_NAME)
111+
set(ARROW_STATIC_LIB_NAME
112+
"${CMAKE_STATIC_LIBRARY_PREFIX}${ARROW_STATIC_LIB}${CMAKE_STATIC_LIBRARY_SUFFIX}")
113+
list(APPEND ICEBERG_VENDOR_DEPENDENCIES
114+
"Iceberg::arrow_vendored|${ARROW_STATIC_LIB_NAME}")
115+
else()
116+
set(ARROW_VENDORED FALSE)
117+
list(APPEND ICEBERG_SYSTEM_DEPENDENCIES Arrow)
118+
endif()
119+
120+
set(ICEBERG_VENDOR_DEPENDENCIES
121+
${ICEBERG_VENDOR_DEPENDENCIES}
122+
PARENT_SCOPE)
123+
set(ICEBERG_SYSTEM_DEPENDENCIES
124+
${ICEBERG_SYSTEM_DEPENDENCIES}
125+
PARENT_SCOPE)
126+
set(ARROW_VENDORED
127+
${ARROW_VENDORED}
128+
PARENT_SCOPE)
129+
endfunction()
130+
131+
if(ICEBERG_ARROW)
132+
resolve_arrow_dependency()
133+
endif()

example/CMakeLists.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@ project(example)
2222

2323
set(CMAKE_CXX_STANDARD 20)
2424

25-
find_package(iceberg CONFIG REQUIRED)
26-
find_package(puffin CONFIG REQUIRED)
25+
find_package(Iceberg CONFIG REQUIRED)
2726

2827
add_executable(demo_example demo_example.cc)
2928

30-
target_link_libraries(demo_example PRIVATE iceberg::iceberg_core_static
31-
puffin::iceberg_puffin_static)
29+
target_link_libraries(demo_example
30+
PRIVATE Iceberg::iceberg_core_static Iceberg::iceberg_puffin_static
31+
Iceberg::iceberg_arrow_static)

example/demo_example.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@
1919

2020
#include <iostream>
2121

22+
#include "iceberg/arrow/demo_arrow.h"
2223
#include "iceberg/puffin.h"
2324
#include "iceberg/table.h"
2425

2526
int main() {
2627
std::cout << iceberg::Table::create()->print() << std::endl;
2728
std::cout << iceberg::Puffin::create()->print() << std::endl;
29+
std::cout << iceberg::arrow::DemoArrow().print() << std::endl;
2830
return 0;
2931
}

src/CMakeLists.txt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,20 @@
1515
# specific language governing permissions and limitations
1616
# under the License.
1717

18+
add_subdirectory(arrow)
1819
add_subdirectory(core)
1920
add_subdirectory(puffin)
21+
22+
include(CMakePackageConfigHelpers)
23+
24+
configure_package_config_file("${CMAKE_CURRENT_SOURCE_DIR}/config.cmake.in"
25+
"${CMAKE_CURRENT_BINARY_DIR}/iceberg-config.cmake"
26+
INSTALL_DESTINATION "${ICEBERG_INSTALL_CMAKEDIR}/Iceberg")
27+
28+
write_basic_package_version_file(
29+
"${CMAKE_CURRENT_BINARY_DIR}/iceberg-config-version.cmake"
30+
COMPATIBILITY SameMajorVersion)
31+
32+
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/iceberg-config.cmake"
33+
"${CMAKE_CURRENT_BINARY_DIR}/iceberg-config-version.cmake"
34+
DESTINATION "${ICEBERG_INSTALL_CMAKEDIR}/Iceberg")

src/arrow/CMakeLists.txt

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
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+
if(NOT ICEBERG_ARROW)
19+
return()
20+
endif()
21+
22+
set(ICEBERG_ARROW_SOURCES demo_arrow.cc)
23+
set(ICEBERG_ARROW_INCLUDES "${ICEBERG_API_DIR}")
24+
25+
# Libraries to link with exported libiceberg_arrow.{so,a}.
26+
set(ICEBERG_ARROW_STATIC_BUILD_INTERFACE_LIBS)
27+
set(ICEBERG_ARROW_SHARED_BUILD_INTERFACE_LIBS)
28+
set(ICEBERG_ARROW_STATIC_INSTALL_INTERFACE_LIBS)
29+
set(ICEBERG_ARROW_SHARED_INSTALL_INTERFACE_LIBS)
30+
31+
list(APPEND ICEBERG_ARROW_STATIC_BUILD_INTERFACE_LIBS
32+
"$<IF:$<TARGET_EXISTS:Arrow::arrow_static>,Arrow::arrow_static,Arrow::arrow_shared>")
33+
list(APPEND ICEBERG_ARROW_SHARED_BUILD_INTERFACE_LIBS
34+
"$<IF:$<TARGET_EXISTS:Arrow::arrow_shared>,Arrow::arrow_shared,Arrow::arrow_static>")
35+
36+
if(ARROW_VENDORED)
37+
list(APPEND ICEBERG_ARROW_STATIC_INSTALL_INTERFACE_LIBS Iceberg::arrow_vendored)
38+
list(APPEND ICEBERG_ARROW_SHARED_INSTALL_INTERFACE_LIBS Iceberg::arrow_vendored)
39+
else()
40+
list(APPEND
41+
ICEBERG_ARROW_STATIC_INSTALL_INTERFACE_LIBS
42+
"$<IF:$<TARGET_EXISTS:Arrow::arrow_static>,Arrow::arrow_static,Arrow::arrow_shared>"
43+
)
44+
list(APPEND
45+
ICEBERG_ARROW_SHARED_INSTALL_INTERFACE_LIBS
46+
"$<IF:$<TARGET_EXISTS:Arrow::arrow_shared>,Arrow::arrow_shared,Arrow::arrow_static>"
47+
)
48+
endif()
49+
50+
add_iceberg_lib(iceberg_arrow
51+
SOURCES
52+
${ICEBERG_ARROW_SOURCES}
53+
PRIVATE_INCLUDES
54+
${ICEBERG_ARROW_INCLUDES}
55+
SHARED_LINK_LIBS
56+
${ICEBERG_ARROW_SHARED_BUILD_INTERFACE_LIBS}
57+
STATIC_LINK_LIBS
58+
${ICEBERG_ARROW_STATIC_BUILD_INTERFACE_LIBS}
59+
STATIC_INSTALL_INTERFACE_LIBS
60+
${ICEBERG_ARROW_STATIC_INSTALL_INTERFACE_LIBS}
61+
SHARED_INSTALL_INTERFACE_LIBS
62+
${ICEBERG_ARROW_SHARED_INSTALL_INTERFACE_LIBS})
63+
64+
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/demo_arrow.h"
65+
DESTINATION "${ICEBERG_INSTALL_INCLUDEDIR}/iceberg/arrow")

0 commit comments

Comments
 (0)