Skip to content

Commit 5f969b2

Browse files
committed
add fetchcontent support
1 parent 4b907f9 commit 5f969b2

File tree

5 files changed

+41
-301
lines changed

5 files changed

+41
-301
lines changed

CMakeLists.txt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,6 @@ endif()
4343
option(ICEBERG_BUILD_STATIC "Build static library" ON)
4444
option(ICEBERG_BUILD_SHARED "Build shared library" OFF)
4545
option(ICEBERG_BUILD_TESTS "Build tests" ON)
46-
47-
set(ICEBERG_DEPENDENCY_SOURCE "AUTO" CACHE STRING "Method to use for acquiring build dependencies")
48-
set_property(CACHE ICEBERG_DEPENDENCY_SOURCE PROPERTY STRINGS "AUTO" "VENDOR" "SYSTEM")
4946
option(ICEBERG_ARROW "Build Arrow" ON)
5047

5148
include(GNUInstallDirs)

cmake_modules/ThirdpartyToolchain.cmake

Lines changed: 37 additions & 192 deletions
Original file line numberDiff line numberDiff line change
@@ -22,170 +22,25 @@ set(ICEBERG_VENDOR_DEPENDENCIES)
2222
set(ICEBERG_ARROW_INSTALL_INTERFACE_LIBS)
2323

2424
# ----------------------------------------------------------------------
25-
# Resolve the dependencies
25+
# Versions and URLs for toolchain builds
2626

27-
set(ICEBERG_THIRDPARTY_DEPENDENCIES Arrow)
28-
29-
message(STATUS "Using ${ICEBERG_DEPENDENCY_SOURCE} approach to find dependencies")
30-
31-
# For each dependency, set dependency source to global default, if unset
32-
foreach(DEPENDENCY ${ICEBERG_THIRDPARTY_DEPENDENCIES})
33-
if("${${DEPENDENCY}_SOURCE}" STREQUAL "")
34-
set(${DEPENDENCY}_SOURCE ${ICEBERG_DEPENDENCY_SOURCE})
35-
endif()
36-
endforeach()
37-
38-
macro(build_dependency DEPENDENCY_NAME)
39-
if("${DEPENDENCY_NAME}" STREQUAL "Arrow")
40-
build_arrow()
41-
else()
42-
message(FATAL_ERROR "Unknown thirdparty dependency to build: ${DEPENDENCY_NAME}")
43-
endif()
44-
endmacro()
45-
46-
function(provide_cmake_module MODULE_NAME ICEBERG_CMAKE_PACKAGE_NAME)
47-
set(module "${CMAKE_SOURCE_DIR}/cmake_modules/${MODULE_NAME}.cmake")
48-
if(EXISTS "${module}")
49-
message(STATUS "Providing CMake module for ${MODULE_NAME} as part of ${ICEBERG_CMAKE_PACKAGE_NAME} CMake package"
50-
)
51-
install(FILES "${module}"
52-
DESTINATION "${ICEBERG_INSTALL_CMAKEDIR}/${ICEBERG_CMAKE_PACKAGE_NAME}")
53-
endif()
54-
endfunction()
55-
56-
# Find modules are needed by the consumer in case of a static build, or if the
57-
# linkage is PUBLIC or INTERFACE.
58-
function(provide_find_module PACKAGE_NAME ICEBERG_CMAKE_PACKAGE_NAME)
59-
provide_cmake_module("Find${PACKAGE_NAME}" ${ICEBERG_CMAKE_PACKAGE_NAME})
60-
endfunction()
61-
62-
macro(resolve_dependency DEPENDENCY_NAME)
63-
set(options)
64-
set(one_value_args
65-
ICEBERG_CMAKE_PACKAGE_NAME
66-
FORCE_ANY_NEWER_VERSION
67-
HAVE_ALT
68-
REQUIRED_VERSION
69-
USE_CONFIG)
70-
set(multi_value_args COMPONENTS OPTIONAL_COMPONENTS)
71-
cmake_parse_arguments(ARG
72-
"${options}"
73-
"${one_value_args}"
74-
"${multi_value_args}"
75-
${ARGN})
76-
if(ARG_UNPARSED_ARGUMENTS)
77-
message(SEND_ERROR "Error: unrecognized arguments: ${ARG_UNPARSED_ARGUMENTS}")
78-
endif()
79-
80-
if(ARG_HAVE_ALT)
81-
set(PACKAGE_NAME "${DEPENDENCY_NAME}Alt")
82-
else()
83-
set(PACKAGE_NAME ${DEPENDENCY_NAME})
84-
endif()
85-
set(FIND_PACKAGE_ARGUMENTS ${PACKAGE_NAME})
86-
if(ARG_REQUIRED_VERSION AND NOT ARG_FORCE_ANY_NEWER_VERSION)
87-
list(APPEND FIND_PACKAGE_ARGUMENTS ${ARG_REQUIRED_VERSION})
88-
endif()
89-
if(ARG_USE_CONFIG)
90-
list(APPEND FIND_PACKAGE_ARGUMENTS CONFIG)
91-
endif()
92-
if(ARG_COMPONENTS)
93-
list(APPEND FIND_PACKAGE_ARGUMENTS COMPONENTS ${ARG_COMPONENTS})
94-
endif()
95-
if(ARG_OPTIONAL_COMPONENTS)
96-
list(APPEND FIND_PACKAGE_ARGUMENTS OPTIONAL_COMPONENTS ${ARG_OPTIONAL_COMPONENTS})
97-
endif()
98-
99-
if(${DEPENDENCY_NAME}_SOURCE STREQUAL "AUTO")
100-
find_package(${FIND_PACKAGE_ARGUMENTS})
101-
set(COMPATIBLE ${${PACKAGE_NAME}_FOUND})
102-
if(COMPATIBLE
103-
AND ARG_FORCE_ANY_NEWER_VERSION
104-
AND ARG_REQUIRED_VERSION)
105-
if(${${PACKAGE_NAME}_VERSION} VERSION_LESS ${ARG_REQUIRED_VERSION})
106-
message(DEBUG "Couldn't find ${DEPENDENCY_NAME} >= ${ARG_REQUIRED_VERSION}")
107-
set(COMPATIBLE FALSE)
108-
endif()
109-
endif()
110-
if(COMPATIBLE)
111-
set(${DEPENDENCY_NAME}_SOURCE "SYSTEM")
112-
else()
113-
build_dependency(${DEPENDENCY_NAME})
114-
set(${DEPENDENCY_NAME}_SOURCE "VENDOR")
115-
endif()
116-
elseif(${DEPENDENCY_NAME}_SOURCE STREQUAL "VENDOR")
117-
build_dependency(${DEPENDENCY_NAME})
118-
elseif(${DEPENDENCY_NAME}_SOURCE STREQUAL "SYSTEM")
119-
find_package(${FIND_PACKAGE_ARGUMENTS} REQUIRED)
120-
if(ARG_FORCE_ANY_NEWER_VERSION AND ARG_REQUIRED_VERSION)
121-
if(${${PACKAGE_NAME}_VERSION} VERSION_LESS ${ARG_REQUIRED_VERSION})
122-
message(FATAL_ERROR "Couldn't find ${DEPENDENCY_NAME} >= ${ARG_REQUIRED_VERSION}")
123-
endif()
124-
endif()
125-
endif()
126-
if(${DEPENDENCY_NAME}_SOURCE STREQUAL "SYSTEM")
127-
# IcebergCore -> _Iceberg_Core
128-
string(REGEX REPLACE "([A-Z])" "_\\1" ARG_ICEBERG_CMAKE_PACKAGE_NAME_SNAKE
129-
${ARG_ICEBERG_CMAKE_PACKAGE_NAME})
130-
# _Iceberg_Core -> Iceberg_Core
131-
string(SUBSTRING ${ARG_ICEBERG_CMAKE_PACKAGE_NAME_SNAKE} 1 -1
132-
ARG_ICEBERG_CMAKE_PACKAGE_NAME_SNAKE)
133-
# Iceberg_Core -> ICEBERG_CORE
134-
string(TOUPPER ${ARG_ICEBERG_CMAKE_PACKAGE_NAME_SNAKE}
135-
ARG_ICEBERG_CMAKE_PACKAGE_NAME_UPPER_SNAKE)
136-
provide_find_module(${PACKAGE_NAME} ${ARG_ICEBERG_CMAKE_PACKAGE_NAME})
137-
list(APPEND ${ARG_ICEBERG_CMAKE_PACKAGE_NAME_UPPER_SNAKE}_SYSTEM_DEPENDENCIES
138-
${PACKAGE_NAME})
139-
endif()
140-
endmacro()
141-
142-
# ----------------------------------------------------------------------
143-
# Thirdparty versions, environment variables, source URLs
144-
145-
set(THIRDPARTY_DIR "${CMAKE_SOURCE_DIR}/thirdparty")
146-
147-
# ----------------------------------------------------------------------
148-
# Versions and URLs for toolchain builds, which also can be used to configure
149-
# offline builds Note: We should not use the Apache dist server for build
150-
# dependencies
151-
152-
macro(set_urls URLS)
153-
set(${URLS} ${ARGN})
154-
endmacro()
155-
156-
# Read toolchain versions from thirdparty/versions.txt
157-
file(STRINGS "${THIRDPARTY_DIR}/versions.txt" TOOLCHAIN_VERSIONS_TXT)
158-
foreach(_VERSION_ENTRY ${TOOLCHAIN_VERSIONS_TXT})
159-
# Exclude comments
160-
if(NOT ((_VERSION_ENTRY MATCHES "^[^#][A-Za-z0-9-_]+_VERSION=")
161-
OR (_VERSION_ENTRY MATCHES "^[^#][A-Za-z0-9-_]+_CHECKSUM=")))
162-
continue()
163-
endif()
164-
165-
string(REGEX MATCH "^[^=]*" _VARIABLE_NAME ${_VERSION_ENTRY})
166-
string(REPLACE "${_VARIABLE_NAME}=" "" _VARIABLE_VALUE ${_VERSION_ENTRY})
167-
168-
# Skip blank or malformed lines
169-
if(_VARIABLE_VALUE STREQUAL "")
170-
continue()
171-
endif()
172-
173-
# For debugging
174-
message(STATUS "${_VARIABLE_NAME}: ${_VARIABLE_VALUE}")
175-
176-
set(${_VARIABLE_NAME} ${_VARIABLE_VALUE})
177-
endforeach()
27+
set(ICEBERG_ARROW_BUILD_VERSION "18.1.0")
28+
set(ICEBERG_ARROW_BUILD_SHA256_CHECKSUM
29+
"2dc8da5f8796afe213ecc5e5aba85bb82d91520eff3cf315784a52d0fa61d7fc")
30+
set(ARROW_VENDORED TRUE)
17831

17932
if(DEFINED ENV{ICEBERG_ARROW_URL})
18033
set(ARROW_SOURCE_URL "$ENV{ICEBERG_ARROW_URL}")
18134
else()
182-
set_urls(ARROW_SOURCE_URL
183-
"https://www.apache.org/dyn/closer.cgi?action=download&filename=/arrow/arrow-${ICEBERG_ARROW_BUILD_VERSION}/apache-arrow-${ICEBERG_ARROW_BUILD_VERSION}.tar.gz"
184-
"https://downloads.apache.org/arrow/arrow-${ICEBERG_ARROW_BUILD_VERSION}/apache-arrow-${ICEBERG_ARROW_BUILD_VERSION}.tar.gz"
185-
"https://github.com/apache/arrow/releases/download/apache-arrow-${ICEBERG_ARROW_BUILD_VERSION}/apache-arrow-${ICEBERG_ARROW_BUILD_VERSION}.tar.gz"
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"
18639
)
18740
endif()
18841

42+
# ----------------------------------------------------------------------
43+
# FetchContent
18944

19045
include(FetchContent)
19146
set(FC_DECLARE_COMMON_OPTIONS)
@@ -203,18 +58,7 @@ endmacro()
20358
# ----------------------------------------------------------------------
20459
# Apache Arrow
20560

206-
function(resolve_arrow)
207-
fetchcontent_declare(Arrow
208-
${FC_DECLARE_COMMON_OPTIONS}
209-
URL ${ARROW_SOURCE_URL}
210-
URL_HASH "SHA256=${ICEBERG_ARROW_BUILD_SHA256_CHECKSUM}"
211-
SOURCE_SUBDIR
212-
cpp
213-
FIND_PACKAGE_ARGS
214-
NAMES
215-
Arrow
216-
CONFIG)
217-
61+
function(resolve_arrow_dependency)
21862
set(ARROW_BUILD_SHARED
21963
OFF
22064
CACHE BOOL "" FORCE)
@@ -231,58 +75,59 @@ function(resolve_arrow)
23175
"NONE"
23276
CACHE STRING "" FORCE)
23377

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+
23489
# Add Arrow cmake modules to the search path
23590
list(PREPEND CMAKE_MODULE_PATH
23691
${CMAKE_CURRENT_BINARY_DIR}/_deps/arrow-src/cpp/cmake_modules)
23792

23893
fetchcontent_makeavailable(Arrow)
23994

240-
fetchcontent_getproperties(Arrow)
241-
message("arrow_SOURCE_DIR: ${arrow_SOURCE_DIR}")
242-
message("arrow_BINARY_DIR: ${arrow_BINARY_DIR}")
243-
message("arrow_POPULATED: ${arrow_POPULATED}")
244-
245-
# Why Arrow::arrow_static is not available if built from source?
24695
if(NOT TARGET Arrow::arrow_static)
247-
message("Adding Arrow::arrow_static")
24896
add_library(Arrow::arrow_static INTERFACE IMPORTED)
24997
target_link_libraries(Arrow::arrow_static INTERFACE arrow_static)
25098
target_include_directories(Arrow::arrow_static INTERFACE ${arrow_SOURCE_DIR}/cpp/src
25199
${arrow_BINARY_DIR}/src)
252100
endif()
253101

102+
fetchcontent_getproperties(Arrow)
254103
if(arrow_SOURCE_DIR)
255-
message("arrow_SOURCE_DIR: ${arrow_SOURCE_DIR}")
104+
set(ARROW_VENDORED TRUE)
256105
install(TARGETS arrow_static
257106
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
258107
ARCHIVE DESTINATION "${ICEBERG_INSTALL_LIBDIR}"
259108
LIBRARY DESTINATION "${ICEBERG_INSTALL_LIBDIR}")
260109

261110
get_target_property(ARROW_STATIC_LIB arrow_static OUTPUT_NAME)
262-
message("ARROW_STATIC_LIB: ${ARROW_STATIC_LIB}")
263111
set(ARROW_STATIC_LIB_NAME
264112
"${CMAKE_STATIC_LIBRARY_PREFIX}${ARROW_STATIC_LIB}${CMAKE_STATIC_LIBRARY_SUFFIX}")
265-
message("ARROW_STATIC_LIB_NAME: ${ARROW_STATIC_LIB_NAME}")
266113
list(APPEND ICEBERG_VENDOR_DEPENDENCIES
267-
"iceberg::vendored_Arrow|${ARROW_STATIC_LIB_NAME}")
114+
"Iceberg::arrow_vendored|${ARROW_STATIC_LIB_NAME}")
268115
else()
116+
set(ARROW_VENDORED FALSE)
269117
list(APPEND ICEBERG_SYSTEM_DEPENDENCIES Arrow)
270118
endif()
271119

272-
set(ICEBERG_VENDOR_DEPENDENCIES ${ICEBERG_VENDOR_DEPENDENCIES} PARENT_SCOPE)
273-
set(ICEBERG_SYSTEM_DEPENDENCIES ${ICEBERG_SYSTEM_DEPENDENCIES} PARENT_SCOPE)
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)
274129
endfunction()
275130

276131
if(ICEBERG_ARROW)
277-
resolve_arrow()
278-
279-
if(ARROW_VENDORED)
280-
set(ICEBERG_ARROW_VERSION ${ICEBERG_ARROW_BUILD_VERSION})
281-
message(STATUS "ICEBERG_VENDOR_DEPENDENCIES: ${ICEBERG_VENDOR_DEPENDENCIES}"
282-
)
283-
else()
284-
set(ICEBERG_ARROW_VERSION ${ArrowAlt_VERSION})
285-
message(STATUS "Found Arrow static library: ${ARROW_STATIC_LIB}")
286-
message(STATUS "Found Arrow headers: ${ARROW_INCLUDE_DIR}")
287-
endif()
132+
resolve_arrow_dependency()
288133
endif()

src/arrow/CMakeLists.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@ list(APPEND ICEBERG_ARROW_STATIC_BUILD_INTERFACE_LIBS
3333
list(APPEND ICEBERG_ARROW_SHARED_BUILD_INTERFACE_LIBS
3434
"$<IF:$<TARGET_EXISTS:Arrow::arrow_shared>,Arrow::arrow_shared,Arrow::arrow_static>")
3535

36-
if(Arrow_SOURCE STREQUAL "SYSTEM")
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()
3740
list(APPEND
3841
ICEBERG_ARROW_STATIC_INSTALL_INTERFACE_LIBS
3942
"$<IF:$<TARGET_EXISTS:Arrow::arrow_static>,Arrow::arrow_static,Arrow::arrow_shared>"
@@ -42,9 +45,6 @@ if(Arrow_SOURCE STREQUAL "SYSTEM")
4245
ICEBERG_ARROW_SHARED_INSTALL_INTERFACE_LIBS
4346
"$<IF:$<TARGET_EXISTS:Arrow::arrow_shared>,Arrow::arrow_shared,Arrow::arrow_static>"
4447
)
45-
else()
46-
list(APPEND ICEBERG_ARROW_STATIC_INSTALL_INTERFACE_LIBS iceberg::vendored_Arrow)
47-
list(APPEND ICEBERG_ARROW_SHARED_INSTALL_INTERFACE_LIBS iceberg::vendored_Arrow)
4848
endif()
4949

5050
add_iceberg_lib(iceberg_arrow

thirdparty/download_dependencies.sh

Lines changed: 0 additions & 65 deletions
This file was deleted.

0 commit comments

Comments
 (0)