blob: 749341dc88cb76e4ac2f759c5f4cae5b5d361695 [file]
# 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.
#
# =============================================================================
# Apache IoTDB - C++ Session Client (top-level CMake build)
# =============================================================================
cmake_minimum_required(VERSION 3.15)
project(iotdb_session CXX C)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
set(CMAKE_POLICY_DEFAULT_CMP0091 NEW)
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
endif()
set(IOTDB_EXTRA_CXX_FLAGS ""
CACHE STRING "Extra flags appended to CMAKE_CXX_FLAGS")
set(IOTDB_USE_CXX11_ABI ""
CACHE STRING "Set _GLIBCXX_USE_CXX11_ABI for GNU libstdc++ builds (empty keeps toolchain default)")
if(NOT MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
if(IOTDB_EXTRA_CXX_FLAGS)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${IOTDB_EXTRA_CXX_FLAGS}")
endif()
endif()
if(MSVC)
# /MD: matches default Visual Studio projects; CRT lives in the VC redistributable.
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL")
endif()
if(NOT IOTDB_USE_CXX11_ABI STREQUAL "" AND NOT IOTDB_USE_CXX11_ABI MATCHES "^[01]$")
message(FATAL_ERROR "IOTDB_USE_CXX11_ABI must be empty, 0, or 1")
endif()
if(NOT MSVC)
if(NOT IOTDB_USE_CXX11_ABI STREQUAL "")
set(_iotdb_cxx11_abi_stamp_value "${IOTDB_USE_CXX11_ABI}")
add_compile_definitions(_GLIBCXX_USE_CXX11_ABI=${IOTDB_USE_CXX11_ABI})
else()
set(_iotdb_cxx11_abi_stamp_value "default")
endif()
set(_iotdb_cxx11_abi_stamp "${CMAKE_BINARY_DIR}/.iotdb-cxx11-abi")
if(EXISTS "${_iotdb_cxx11_abi_stamp}")
file(READ "${_iotdb_cxx11_abi_stamp}" _iotdb_previous_cxx11_abi)
else()
set(_iotdb_previous_cxx11_abi "")
endif()
if(NOT _iotdb_previous_cxx11_abi STREQUAL _iotdb_cxx11_abi_stamp_value)
message(STATUS
"IOTDB_USE_CXX11_ABI changed from '${_iotdb_previous_cxx11_abi}' "
"to '${_iotdb_cxx11_abi_stamp_value}'; removing cached iotdb_session objects")
file(REMOVE_RECURSE "${CMAKE_BINARY_DIR}/CMakeFiles/iotdb_session.dir")
file(GLOB _iotdb_stale_session_libs "${CMAKE_BINARY_DIR}/libiotdb_session.so*")
if(_iotdb_stale_session_libs)
file(REMOVE ${_iotdb_stale_session_libs})
endif()
endif()
file(WRITE "${_iotdb_cxx11_abi_stamp}" "${_iotdb_cxx11_abi_stamp_value}")
endif()
option(WITH_SSL "Build with OpenSSL support" OFF)
option(BUILD_TESTING "Build IT test executables" OFF)
option(IOTDB_OFFLINE "Disable all network access during configure" OFF)
set(IOTDB_SESSION_VERSION "0.0.0"
CACHE STRING "IoTDB C++ session package version")
string(REGEX MATCH "^[0-9]+" IOTDB_SESSION_SOVERSION "${IOTDB_SESSION_VERSION}")
if(NOT IOTDB_SESSION_SOVERSION)
set(IOTDB_SESSION_SOVERSION "0")
endif()
set(IOTDB_DEPS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/third-party"
CACHE PATH "Local tarball cache for third-party dependencies (lives under client-cpp/)")
if(APPLE)
set(_iotdb_default_boost_version "1.84.0")
else()
set(_iotdb_default_boost_version "1.60.0")
endif()
set(BOOST_VERSION "${_iotdb_default_boost_version}"
CACHE STRING "Boost version used when downloading / unpacking (Thrift build only)")
set(THRIFT_VERSION "0.21.0"
CACHE STRING "Apache Thrift version used when downloading / building")
if(WIN32)
set(IOTDB_OS_DEPS_DIR "${IOTDB_DEPS_DIR}/windows")
elseif(APPLE)
set(IOTDB_OS_DEPS_DIR "${IOTDB_DEPS_DIR}/mac")
else()
set(IOTDB_OS_DEPS_DIR "${IOTDB_DEPS_DIR}/linux")
endif()
file(MAKE_DIRECTORY "${IOTDB_OS_DEPS_DIR}")
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install"
CACHE PATH "Install prefix" FORCE)
endif()
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
include(FetchBoost) # -> BOOST_INCLUDE_DIR (Thrift build only)
include(FetchBuildTools)
if(WITH_SSL)
include(FetchOpenSSL)
endif()
include(FetchThrift)
include(GenerateThriftSources)
file(GLOB SESSION_PUBLIC_SRCS CONFIGURE_DEPENDS
"${CMAKE_CURRENT_SOURCE_DIR}/src/session/*.cpp")
file(GLOB SESSION_RPC_SRCS CONFIGURE_DEPENDS
"${CMAKE_CURRENT_SOURCE_DIR}/src/rpc/*.cpp")
add_library(iotdb_session SHARED
${SESSION_PUBLIC_SRCS}
${SESSION_RPC_SRCS}
${THRIFT_GENERATED_SRCS})
if(WIN32)
set_target_properties(iotdb_session PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON)
endif()
if(UNIX AND NOT APPLE)
set_target_properties(iotdb_session PROPERTIES
VERSION "${IOTDB_SESSION_VERSION}"
SOVERSION "${IOTDB_SESSION_SOVERSION}")
endif()
add_dependencies(iotdb_session iotdb_thrift_external iotdb_thrift_codegen)
target_compile_definitions(iotdb_session PRIVATE THRIFT_STATIC_DEFINE IOTDB_BUILDING_SHARED)
if(NOT IOTDB_USE_CXX11_ABI STREQUAL "" AND NOT MSVC)
target_compile_definitions(iotdb_session PUBLIC
_GLIBCXX_USE_CXX11_ABI=${IOTDB_USE_CXX11_ABI})
endif()
target_include_directories(iotdb_session
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/include>
$<INSTALL_INTERFACE:include>
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/src/rpc
${THRIFT_GEN_CPP_DIR}
${THRIFT_INCLUDE_DIR}
$<$<BOOL:${BOOST_INCLUDE_DIR}>:${BOOST_INCLUDE_DIR}>)
if(APPLE)
target_link_libraries(iotdb_session PRIVATE "-Wl,-force_load,${THRIFT_STATIC_LIB_PATH}")
elseif(UNIX AND NOT MSVC)
# whole-archive pulls all Thrift objects into libiotdb_session.so; allow-multiple-definition
# avoids libgcc __morestack_* duplicate symbol errors on some GCC/toolchain combos.
target_link_libraries(iotdb_session PRIVATE
-Wl,--whole-archive
${THRIFT_STATIC_LIB_PATH}
-Wl,--no-whole-archive
-Wl,--allow-multiple-definition)
else()
target_link_libraries(iotdb_session PRIVATE iotdb_thrift_static)
endif()
if(WITH_SSL)
target_link_libraries(iotdb_session PUBLIC OpenSSL::SSL OpenSSL::Crypto)
target_compile_definitions(iotdb_session PUBLIC WITH_SSL=1)
else()
target_compile_definitions(iotdb_session PUBLIC WITH_SSL=0)
endif()
if(UNIX)
target_link_libraries(iotdb_session PUBLIC pthread)
endif()
if(IOTDB_USE_CXX11_ABI STREQUAL "1" AND CMAKE_SYSTEM_NAME STREQUAL "Linux")
add_custom_command(TARGET iotdb_session POST_BUILD
COMMAND ${CMAKE_COMMAND}
-DIOTDB_SESSION_LIBRARY=$<TARGET_FILE:iotdb_session>
-P "${CMAKE_CURRENT_SOURCE_DIR}/cmake/CheckCxx11Abi.cmake"
COMMENT "Verifying _GLIBCXX_USE_CXX11_ABI=1 symbols in libiotdb_session")
endif()
include(GNUInstallDirs)
set(IOTDB_PUBLIC_HEADERS
Export.h
SessionConfig.h
Session.h
Common.h
Optional.h
Date.h
Status.h
Endpoint.h
SessionBuilder.h
AbstractSessionBuilder.h
TableSession.h
TableSessionBuilder.h
SessionC.h
SessionDataSet.h
DeviceID.h
Column.h
ColumnDecoder.h
TsBlock.h)
# Windows: RUNTIME = iotdb_session.dll, ARCHIVE = import .lib (both under lib/ in the zip).
install(TARGETS iotdb_session
RUNTIME DESTINATION lib
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)
foreach(_hdr IN LISTS IOTDB_PUBLIC_HEADERS)
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/include/${_hdr}"
DESTINATION include)
endforeach()
set(IOTDB_SESSION_PC_LIBS "-liotdb_session")
set(IOTDB_SESSION_PC_CFLAGS "")
set(IOTDB_SESSION_CXX11_ABI_COMPILE_DEFINITION "")
if(UNIX)
set(IOTDB_SESSION_PC_LIBS "${IOTDB_SESSION_PC_LIBS} -pthread")
endif()
if(NOT IOTDB_USE_CXX11_ABI STREQUAL "" AND NOT MSVC)
set(IOTDB_SESSION_PC_CFLAGS "-D_GLIBCXX_USE_CXX11_ABI=${IOTDB_USE_CXX11_ABI}")
set(IOTDB_SESSION_CXX11_ABI_COMPILE_DEFINITION
"_GLIBCXX_USE_CXX11_ABI=${IOTDB_USE_CXX11_ABI}")
endif()
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/iotdb-session-config.cmake.in"
"${CMAKE_BINARY_DIR}/package-metadata/cmake/iotdb-session-config.cmake"
@ONLY)
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/iotdb-session.pc.in"
"${CMAKE_BINARY_DIR}/package-metadata/pkgconfig/iotdb-session.pc"
@ONLY)
execute_process(
COMMAND git rev-parse HEAD
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
OUTPUT_VARIABLE IOTDB_SESSION_GIT_COMMIT
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET)
if(NOT IOTDB_SESSION_GIT_COMMIT)
set(IOTDB_SESSION_GIT_COMMIT "unknown")
endif()
string(TIMESTAMP IOTDB_SESSION_BUILD_TIME "%Y-%m-%dT%H:%M:%SZ" UTC)
set(IOTDB_SESSION_CI_BUILD_ID "$ENV{GITHUB_RUN_ID}")
if(NOT IOTDB_SESSION_CI_BUILD_ID)
set(IOTDB_SESSION_CI_BUILD_ID "local")
endif()
file(WRITE "${CMAKE_BINARY_DIR}/package-metadata/VERSION"
"${IOTDB_SESSION_VERSION}\n")
file(WRITE "${CMAKE_BINARY_DIR}/package-metadata/BUILD-INFO.txt"
"Apache IoTDB C++ session client build information\n\n"
"version=${IOTDB_SESSION_VERSION}\n"
"commit=${IOTDB_SESSION_GIT_COMMIT}\n"
"build.time=${IOTDB_SESSION_BUILD_TIME}\n"
"ci.build.id=${IOTDB_SESSION_CI_BUILD_ID}\n"
"compiler=${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}\n"
"cmake.generator=${CMAKE_GENERATOR}\n"
"cmake.build.type=${CMAKE_BUILD_TYPE}\n"
"with.ssl=${WITH_SSL}\n"
"iotdb.offline=${IOTDB_OFFLINE}\n"
"iotdb.use.cxx11.abi=${IOTDB_USE_CXX11_ABI}\n"
"iotdb.extra.cxx.flags=${IOTDB_EXTRA_CXX_FLAGS}\n")
install(FILES "${CMAKE_BINARY_DIR}/package-metadata/cmake/iotdb-session-config.cmake"
DESTINATION cmake)
install(FILES "${CMAKE_BINARY_DIR}/package-metadata/pkgconfig/iotdb-session.pc"
DESTINATION pkgconfig)
install(FILES
"${CMAKE_BINARY_DIR}/package-metadata/VERSION"
"${CMAKE_BINARY_DIR}/package-metadata/BUILD-INFO.txt"
DESTINATION .)
if(BUILD_TESTING)
enable_testing()
add_subdirectory(test)
set(IOTDB_EXAMPLES_REGISTER_TESTS ON)
add_subdirectory(examples)
endif()
message(STATUS "iotdb_session configuration summary:")
message(STATUS " WITH_SSL = ${WITH_SSL}")
message(STATUS " BUILD_TESTING = ${BUILD_TESTING}")
message(STATUS " IOTDB_OFFLINE = ${IOTDB_OFFLINE}")
message(STATUS " IOTDB_USE_CXX11_ABI = ${IOTDB_USE_CXX11_ABI}")
message(STATUS " IOTDB_DEPS_DIR = ${IOTDB_DEPS_DIR}")
message(STATUS " BOOST_INCLUDE_DIR = ${BOOST_INCLUDE_DIR} (Thrift build only)")
message(STATUS " THRIFT_INCLUDE_DIR = ${THRIFT_INCLUDE_DIR}")
message(STATUS " THRIFT_STATIC_LIB = ${THRIFT_STATIC_LIB_PATH}")
message(STATUS " THRIFT_EXECUTABLE = ${THRIFT_EXECUTABLE}")
message(STATUS " CMAKE_INSTALL_PREFIX = ${CMAKE_INSTALL_PREFIX}")