Skip to content

Commit

Permalink
add fetchcontent support
Browse files Browse the repository at this point in the history
  • Loading branch information
wgtmac committed Dec 25, 2024
1 parent 4b907f9 commit 5f969b2
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 301 deletions.
3 changes: 0 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,6 @@ endif()
option(ICEBERG_BUILD_STATIC "Build static library" ON)
option(ICEBERG_BUILD_SHARED "Build shared library" OFF)
option(ICEBERG_BUILD_TESTS "Build tests" ON)

set(ICEBERG_DEPENDENCY_SOURCE "AUTO" CACHE STRING "Method to use for acquiring build dependencies")
set_property(CACHE ICEBERG_DEPENDENCY_SOURCE PROPERTY STRINGS "AUTO" "VENDOR" "SYSTEM")
option(ICEBERG_ARROW "Build Arrow" ON)

include(GNUInstallDirs)
Expand Down
229 changes: 37 additions & 192 deletions cmake_modules/ThirdpartyToolchain.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -22,170 +22,25 @@ set(ICEBERG_VENDOR_DEPENDENCIES)
set(ICEBERG_ARROW_INSTALL_INTERFACE_LIBS)

# ----------------------------------------------------------------------
# Resolve the dependencies
# Versions and URLs for toolchain builds

set(ICEBERG_THIRDPARTY_DEPENDENCIES Arrow)

message(STATUS "Using ${ICEBERG_DEPENDENCY_SOURCE} approach to find dependencies")

# For each dependency, set dependency source to global default, if unset
foreach(DEPENDENCY ${ICEBERG_THIRDPARTY_DEPENDENCIES})
if("${${DEPENDENCY}_SOURCE}" STREQUAL "")
set(${DEPENDENCY}_SOURCE ${ICEBERG_DEPENDENCY_SOURCE})
endif()
endforeach()

macro(build_dependency DEPENDENCY_NAME)
if("${DEPENDENCY_NAME}" STREQUAL "Arrow")
build_arrow()
else()
message(FATAL_ERROR "Unknown thirdparty dependency to build: ${DEPENDENCY_NAME}")
endif()
endmacro()

function(provide_cmake_module MODULE_NAME ICEBERG_CMAKE_PACKAGE_NAME)
set(module "${CMAKE_SOURCE_DIR}/cmake_modules/${MODULE_NAME}.cmake")
if(EXISTS "${module}")
message(STATUS "Providing CMake module for ${MODULE_NAME} as part of ${ICEBERG_CMAKE_PACKAGE_NAME} CMake package"
)
install(FILES "${module}"
DESTINATION "${ICEBERG_INSTALL_CMAKEDIR}/${ICEBERG_CMAKE_PACKAGE_NAME}")
endif()
endfunction()

# Find modules are needed by the consumer in case of a static build, or if the
# linkage is PUBLIC or INTERFACE.
function(provide_find_module PACKAGE_NAME ICEBERG_CMAKE_PACKAGE_NAME)
provide_cmake_module("Find${PACKAGE_NAME}" ${ICEBERG_CMAKE_PACKAGE_NAME})
endfunction()

macro(resolve_dependency DEPENDENCY_NAME)
set(options)
set(one_value_args
ICEBERG_CMAKE_PACKAGE_NAME
FORCE_ANY_NEWER_VERSION
HAVE_ALT
REQUIRED_VERSION
USE_CONFIG)
set(multi_value_args COMPONENTS OPTIONAL_COMPONENTS)
cmake_parse_arguments(ARG
"${options}"
"${one_value_args}"
"${multi_value_args}"
${ARGN})
if(ARG_UNPARSED_ARGUMENTS)
message(SEND_ERROR "Error: unrecognized arguments: ${ARG_UNPARSED_ARGUMENTS}")
endif()

if(ARG_HAVE_ALT)
set(PACKAGE_NAME "${DEPENDENCY_NAME}Alt")
else()
set(PACKAGE_NAME ${DEPENDENCY_NAME})
endif()
set(FIND_PACKAGE_ARGUMENTS ${PACKAGE_NAME})
if(ARG_REQUIRED_VERSION AND NOT ARG_FORCE_ANY_NEWER_VERSION)
list(APPEND FIND_PACKAGE_ARGUMENTS ${ARG_REQUIRED_VERSION})
endif()
if(ARG_USE_CONFIG)
list(APPEND FIND_PACKAGE_ARGUMENTS CONFIG)
endif()
if(ARG_COMPONENTS)
list(APPEND FIND_PACKAGE_ARGUMENTS COMPONENTS ${ARG_COMPONENTS})
endif()
if(ARG_OPTIONAL_COMPONENTS)
list(APPEND FIND_PACKAGE_ARGUMENTS OPTIONAL_COMPONENTS ${ARG_OPTIONAL_COMPONENTS})
endif()

if(${DEPENDENCY_NAME}_SOURCE STREQUAL "AUTO")
find_package(${FIND_PACKAGE_ARGUMENTS})
set(COMPATIBLE ${${PACKAGE_NAME}_FOUND})
if(COMPATIBLE
AND ARG_FORCE_ANY_NEWER_VERSION
AND ARG_REQUIRED_VERSION)
if(${${PACKAGE_NAME}_VERSION} VERSION_LESS ${ARG_REQUIRED_VERSION})
message(DEBUG "Couldn't find ${DEPENDENCY_NAME} >= ${ARG_REQUIRED_VERSION}")
set(COMPATIBLE FALSE)
endif()
endif()
if(COMPATIBLE)
set(${DEPENDENCY_NAME}_SOURCE "SYSTEM")
else()
build_dependency(${DEPENDENCY_NAME})
set(${DEPENDENCY_NAME}_SOURCE "VENDOR")
endif()
elseif(${DEPENDENCY_NAME}_SOURCE STREQUAL "VENDOR")
build_dependency(${DEPENDENCY_NAME})
elseif(${DEPENDENCY_NAME}_SOURCE STREQUAL "SYSTEM")
find_package(${FIND_PACKAGE_ARGUMENTS} REQUIRED)
if(ARG_FORCE_ANY_NEWER_VERSION AND ARG_REQUIRED_VERSION)
if(${${PACKAGE_NAME}_VERSION} VERSION_LESS ${ARG_REQUIRED_VERSION})
message(FATAL_ERROR "Couldn't find ${DEPENDENCY_NAME} >= ${ARG_REQUIRED_VERSION}")
endif()
endif()
endif()
if(${DEPENDENCY_NAME}_SOURCE STREQUAL "SYSTEM")
# IcebergCore -> _Iceberg_Core
string(REGEX REPLACE "([A-Z])" "_\\1" ARG_ICEBERG_CMAKE_PACKAGE_NAME_SNAKE
${ARG_ICEBERG_CMAKE_PACKAGE_NAME})
# _Iceberg_Core -> Iceberg_Core
string(SUBSTRING ${ARG_ICEBERG_CMAKE_PACKAGE_NAME_SNAKE} 1 -1
ARG_ICEBERG_CMAKE_PACKAGE_NAME_SNAKE)
# Iceberg_Core -> ICEBERG_CORE
string(TOUPPER ${ARG_ICEBERG_CMAKE_PACKAGE_NAME_SNAKE}
ARG_ICEBERG_CMAKE_PACKAGE_NAME_UPPER_SNAKE)
provide_find_module(${PACKAGE_NAME} ${ARG_ICEBERG_CMAKE_PACKAGE_NAME})
list(APPEND ${ARG_ICEBERG_CMAKE_PACKAGE_NAME_UPPER_SNAKE}_SYSTEM_DEPENDENCIES
${PACKAGE_NAME})
endif()
endmacro()

# ----------------------------------------------------------------------
# Thirdparty versions, environment variables, source URLs

set(THIRDPARTY_DIR "${CMAKE_SOURCE_DIR}/thirdparty")

# ----------------------------------------------------------------------
# Versions and URLs for toolchain builds, which also can be used to configure
# offline builds Note: We should not use the Apache dist server for build
# dependencies

macro(set_urls URLS)
set(${URLS} ${ARGN})
endmacro()

# Read toolchain versions from thirdparty/versions.txt
file(STRINGS "${THIRDPARTY_DIR}/versions.txt" TOOLCHAIN_VERSIONS_TXT)
foreach(_VERSION_ENTRY ${TOOLCHAIN_VERSIONS_TXT})
# Exclude comments
if(NOT ((_VERSION_ENTRY MATCHES "^[^#][A-Za-z0-9-_]+_VERSION=")
OR (_VERSION_ENTRY MATCHES "^[^#][A-Za-z0-9-_]+_CHECKSUM=")))
continue()
endif()

string(REGEX MATCH "^[^=]*" _VARIABLE_NAME ${_VERSION_ENTRY})
string(REPLACE "${_VARIABLE_NAME}=" "" _VARIABLE_VALUE ${_VERSION_ENTRY})

# Skip blank or malformed lines
if(_VARIABLE_VALUE STREQUAL "")
continue()
endif()

# For debugging
message(STATUS "${_VARIABLE_NAME}: ${_VARIABLE_VALUE}")

set(${_VARIABLE_NAME} ${_VARIABLE_VALUE})
endforeach()
set(ICEBERG_ARROW_BUILD_VERSION "18.1.0")
set(ICEBERG_ARROW_BUILD_SHA256_CHECKSUM
"2dc8da5f8796afe213ecc5e5aba85bb82d91520eff3cf315784a52d0fa61d7fc")
set(ARROW_VENDORED TRUE)

if(DEFINED ENV{ICEBERG_ARROW_URL})
set(ARROW_SOURCE_URL "$ENV{ICEBERG_ARROW_URL}")
else()
set_urls(ARROW_SOURCE_URL
"https://www.apache.org/dyn/closer.cgi?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"
"https://github.com/apache/arrow/releases/download/apache-arrow-${ICEBERG_ARROW_BUILD_VERSION}/apache-arrow-${ICEBERG_ARROW_BUILD_VERSION}.tar.gz"
set(ARROW_SOURCE_URL
"https://www.apache.org/dyn/closer.cgi?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"
"https://github.com/apache/arrow/releases/download/apache-arrow-${ICEBERG_ARROW_BUILD_VERSION}/apache-arrow-${ICEBERG_ARROW_BUILD_VERSION}.tar.gz"
)
endif()

# ----------------------------------------------------------------------
# FetchContent

include(FetchContent)
set(FC_DECLARE_COMMON_OPTIONS)
Expand All @@ -203,18 +58,7 @@ endmacro()
# ----------------------------------------------------------------------
# Apache Arrow

function(resolve_arrow)
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)

function(resolve_arrow_dependency)
set(ARROW_BUILD_SHARED
OFF
CACHE BOOL "" FORCE)
Expand All @@ -231,58 +75,59 @@ function(resolve_arrow)
"NONE"
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)

fetchcontent_getproperties(Arrow)
message("arrow_SOURCE_DIR: ${arrow_SOURCE_DIR}")
message("arrow_BINARY_DIR: ${arrow_BINARY_DIR}")
message("arrow_POPULATED: ${arrow_POPULATED}")

# Why Arrow::arrow_static is not available if built from source?
if(NOT TARGET Arrow::arrow_static)
message("Adding 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_SOURCE_DIR}/cpp/src
${arrow_BINARY_DIR}/src)
endif()

fetchcontent_getproperties(Arrow)
if(arrow_SOURCE_DIR)
message("arrow_SOURCE_DIR: ${arrow_SOURCE_DIR}")
set(ARROW_VENDORED TRUE)
install(TARGETS arrow_static
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
ARCHIVE DESTINATION "${ICEBERG_INSTALL_LIBDIR}"
LIBRARY DESTINATION "${ICEBERG_INSTALL_LIBDIR}")

get_target_property(ARROW_STATIC_LIB arrow_static OUTPUT_NAME)
message("ARROW_STATIC_LIB: ${ARROW_STATIC_LIB}")
set(ARROW_STATIC_LIB_NAME
"${CMAKE_STATIC_LIBRARY_PREFIX}${ARROW_STATIC_LIB}${CMAKE_STATIC_LIBRARY_SUFFIX}")
message("ARROW_STATIC_LIB_NAME: ${ARROW_STATIC_LIB_NAME}")
list(APPEND ICEBERG_VENDOR_DEPENDENCIES
"iceberg::vendored_Arrow|${ARROW_STATIC_LIB_NAME}")
"Iceberg::arrow_vendored|${ARROW_STATIC_LIB_NAME}")
else()
set(ARROW_VENDORED FALSE)
list(APPEND ICEBERG_SYSTEM_DEPENDENCIES Arrow)
endif()

set(ICEBERG_VENDOR_DEPENDENCIES ${ICEBERG_VENDOR_DEPENDENCIES} PARENT_SCOPE)
set(ICEBERG_SYSTEM_DEPENDENCIES ${ICEBERG_SYSTEM_DEPENDENCIES} PARENT_SCOPE)
set(ICEBERG_VENDOR_DEPENDENCIES
${ICEBERG_VENDOR_DEPENDENCIES}
PARENT_SCOPE)
set(ICEBERG_SYSTEM_DEPENDENCIES
${ICEBERG_SYSTEM_DEPENDENCIES}
PARENT_SCOPE)
set(ARROW_VENDORED
${ARROW_VENDORED}
PARENT_SCOPE)
endfunction()

if(ICEBERG_ARROW)
resolve_arrow()

if(ARROW_VENDORED)
set(ICEBERG_ARROW_VERSION ${ICEBERG_ARROW_BUILD_VERSION})
message(STATUS "ICEBERG_VENDOR_DEPENDENCIES: ${ICEBERG_VENDOR_DEPENDENCIES}"
)
else()
set(ICEBERG_ARROW_VERSION ${ArrowAlt_VERSION})
message(STATUS "Found Arrow static library: ${ARROW_STATIC_LIB}")
message(STATUS "Found Arrow headers: ${ARROW_INCLUDE_DIR}")
endif()
resolve_arrow_dependency()
endif()
8 changes: 4 additions & 4 deletions src/arrow/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,10 @@ list(APPEND ICEBERG_ARROW_STATIC_BUILD_INTERFACE_LIBS
list(APPEND ICEBERG_ARROW_SHARED_BUILD_INTERFACE_LIBS
"$<IF:$<TARGET_EXISTS:Arrow::arrow_shared>,Arrow::arrow_shared,Arrow::arrow_static>")

if(Arrow_SOURCE STREQUAL "SYSTEM")
if(ARROW_VENDORED)
list(APPEND ICEBERG_ARROW_STATIC_INSTALL_INTERFACE_LIBS Iceberg::arrow_vendored)
list(APPEND ICEBERG_ARROW_SHARED_INSTALL_INTERFACE_LIBS Iceberg::arrow_vendored)
else()
list(APPEND
ICEBERG_ARROW_STATIC_INSTALL_INTERFACE_LIBS
"$<IF:$<TARGET_EXISTS:Arrow::arrow_static>,Arrow::arrow_static,Arrow::arrow_shared>"
Expand All @@ -42,9 +45,6 @@ if(Arrow_SOURCE STREQUAL "SYSTEM")
ICEBERG_ARROW_SHARED_INSTALL_INTERFACE_LIBS
"$<IF:$<TARGET_EXISTS:Arrow::arrow_shared>,Arrow::arrow_shared,Arrow::arrow_static>"
)
else()
list(APPEND ICEBERG_ARROW_STATIC_INSTALL_INTERFACE_LIBS iceberg::vendored_Arrow)
list(APPEND ICEBERG_ARROW_SHARED_INSTALL_INTERFACE_LIBS iceberg::vendored_Arrow)
endif()

add_iceberg_lib(iceberg_arrow
Expand Down
65 changes: 0 additions & 65 deletions thirdparty/download_dependencies.sh

This file was deleted.

Loading

0 comments on commit 5f969b2

Please sign in to comment.