cmake_modules/IcebergBuildUtils.cmake (222 lines of code) (raw):
# 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.
# 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}")
configure_package_config_file("${CONFIG_CMAKE}.in" "${BUILT_CONFIG_CMAKE}"
INSTALL_DESTINATION "${ICEBERG_INSTALL_CMAKEDIR}/${PACKAGE_NAME}"
)
set(CONFIG_VERSION_CMAKE "${PACKAGE_NAME}ConfigVersion.cmake")
set(BUILT_CONFIG_VERSION_CMAKE "${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_VERSION_CMAKE}")
write_basic_package_version_file("${BUILT_CONFIG_VERSION_CMAKE}"
COMPATIBILITY SameMajorVersion)
install(FILES "${BUILT_CONFIG_CMAKE}" "${BUILT_CONFIG_VERSION_CMAKE}"
DESTINATION "${ICEBERG_INSTALL_CMAKEDIR}/${PACKAGE_NAME}")
set(TARGETS_CMAKE "${PACKAGE_NAME}Targets.cmake")
install(EXPORT ${EXPORT_NAME}
DESTINATION "${ICEBERG_INSTALL_CMAKEDIR}/${PACKAGE_NAME}"
NAMESPACE "${PACKAGE_NAME}::"
FILE "${TARGETS_CMAKE}")
endfunction()
function(add_iceberg_lib LIB_NAME)
set(options)
set(one_value_args
BUILD_SHARED
BUILD_STATIC
INSTALL_ARCHIVE_DIR
INSTALL_LIBRARY_DIR
INSTALL_RUNTIME_DIR
SHARED_LINK_FLAGS)
set(multi_value_args
SOURCES
OUTPUTS
STATIC_LINK_LIBS
SHARED_LINK_LIBS
SHARED_PRIVATE_LINK_LIBS
EXTRA_INCLUDES
PRIVATE_INCLUDES
DEPENDENCIES
DEFINITIONS
SHARED_INSTALL_INTERFACE_LIBS
STATIC_INSTALL_INTERFACE_LIBS)
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_OUTPUTS)
set(${ARG_OUTPUTS})
endif()
# Allow overriding ICEBERG_BUILD_SHARED and ICEBERG_BUILD_STATIC
if(DEFINED ARG_BUILD_SHARED)
set(BUILD_SHARED ${ARG_BUILD_SHARED})
else()
set(BUILD_SHARED ${ICEBERG_BUILD_SHARED})
endif()
if(DEFINED ARG_BUILD_STATIC)
set(BUILD_STATIC ${ARG_BUILD_STATIC})
else()
set(BUILD_STATIC ${ICEBERG_BUILD_STATIC})
endif()
# Prepare arguments for separate compilation of static and shared libs below
set(LIB_DEPS ${ARG_SOURCES})
set(EXTRA_DEPS ${ARG_DEPENDENCIES})
if(ARG_EXTRA_INCLUDES)
set(LIB_INCLUDES ${ARG_EXTRA_INCLUDES})
else()
set(LIB_INCLUDES "")
endif()
if(ARG_INSTALL_ARCHIVE_DIR)
set(INSTALL_ARCHIVE_DIR ${ARG_INSTALL_ARCHIVE_DIR})
else()
set(INSTALL_ARCHIVE_DIR ${CMAKE_INSTALL_LIBDIR})
endif()
if(ARG_INSTALL_LIBRARY_DIR)
set(INSTALL_LIBRARY_DIR ${ARG_INSTALL_LIBRARY_DIR})
else()
set(INSTALL_LIBRARY_DIR ${CMAKE_INSTALL_LIBDIR})
endif()
if(ARG_INSTALL_RUNTIME_DIR)
set(INSTALL_RUNTIME_DIR ${ARG_INSTALL_RUNTIME_DIR})
else()
set(INSTALL_RUNTIME_DIR bin)
endif()
if(BUILD_SHARED)
add_library(${LIB_NAME}_shared SHARED)
if(LIB_DEPS)
target_sources(${LIB_NAME}_shared PRIVATE ${LIB_DEPS})
endif()
if(EXTRA_DEPS)
add_dependencies(${LIB_NAME}_shared ${EXTRA_DEPS})
endif()
if(ARG_DEFINITIONS)
target_compile_definitions(${LIB_NAME}_shared PRIVATE ${ARG_DEFINITIONS})
endif()
if(ARG_OUTPUTS)
list(APPEND ${ARG_OUTPUTS} ${LIB_NAME}_shared)
endif()
if(LIB_INCLUDES)
target_include_directories(${LIB_NAME}_shared SYSTEM PUBLIC ${ARG_EXTRA_INCLUDES})
endif()
if(ARG_PRIVATE_INCLUDES)
target_include_directories(${LIB_NAME}_shared PRIVATE ${ARG_PRIVATE_INCLUDES})
endif()
set_target_properties(${LIB_NAME}_shared
PROPERTIES LINK_FLAGS "${ARG_SHARED_LINK_FLAGS}" OUTPUT_NAME
${LIB_NAME})
target_link_libraries(${LIB_NAME}_shared
PUBLIC "$<BUILD_INTERFACE:${ARG_SHARED_LINK_LIBS}>"
"$<INSTALL_INTERFACE:${ARG_SHARED_INSTALL_INTERFACE_LIBS}>"
PRIVATE ${ARG_SHARED_PRIVATE_LINK_LIBS})
install(TARGETS ${LIB_NAME}_shared
EXPORT iceberg_targets
ARCHIVE DESTINATION ${INSTALL_ARCHIVE_DIR}
LIBRARY DESTINATION ${INSTALL_LIBRARY_DIR}
RUNTIME DESTINATION ${INSTALL_RUNTIME_DIR}
INCLUDES
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
endif()
if(BUILD_STATIC)
add_library(${LIB_NAME}_static STATIC)
if(LIB_DEPS)
target_sources(${LIB_NAME}_static PRIVATE ${LIB_DEPS})
endif()
if(EXTRA_DEPS)
add_dependencies(${LIB_NAME}_static ${EXTRA_DEPS})
endif()
if(ARG_DEFINITIONS)
target_compile_definitions(${LIB_NAME}_static PRIVATE ${ARG_DEFINITIONS})
endif()
if(ARG_OUTPUTS)
list(APPEND ${ARG_OUTPUTS} ${LIB_NAME}_static)
endif()
if(LIB_INCLUDES)
target_include_directories(${LIB_NAME}_static SYSTEM PUBLIC ${ARG_EXTRA_INCLUDES})
endif()
if(ARG_PRIVATE_INCLUDES)
target_include_directories(${LIB_NAME}_static PRIVATE ${ARG_PRIVATE_INCLUDES})
endif()
if(MSVC_TOOLCHAIN)
set(LIB_NAME_STATIC ${LIB_NAME}_static)
else()
set(LIB_NAME_STATIC ${LIB_NAME})
endif()
set_target_properties(${LIB_NAME}_static PROPERTIES OUTPUT_NAME ${LIB_NAME_STATIC})
if(ARG_STATIC_INSTALL_INTERFACE_LIBS)
target_link_libraries(${LIB_NAME}_static
INTERFACE "$<INSTALL_INTERFACE:${ARG_STATIC_INSTALL_INTERFACE_LIBS}>"
)
endif()
if(ARG_STATIC_LINK_LIBS)
target_link_libraries(${LIB_NAME}_static
PUBLIC "$<BUILD_INTERFACE:${ARG_STATIC_LINK_LIBS}>")
endif()
install(TARGETS ${LIB_NAME}_static
EXPORT iceberg_targets
ARCHIVE DESTINATION ${INSTALL_ARCHIVE_DIR}
LIBRARY DESTINATION ${INSTALL_LIBRARY_DIR}
RUNTIME DESTINATION ${INSTALL_RUNTIME_DIR}
INCLUDES
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
endif()
# 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
if(ARG_OUTPUTS)
set(${ARG_OUTPUTS}
${${ARG_OUTPUTS}}
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()