| # 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. |
| |
| # Adapted from Apache Arrow: |
| # https://github.com/apache/arrow/blob/apache-arrow-17.0.0/cpp/CMakeLists.txt |
| |
| cmake_minimum_required(VERSION 3.16) |
| message(STATUS "Building using CMake version: ${CMAKE_VERSION}") |
| |
| # https://cmake.org/cmake/help/latest/policy/CMP0135.html |
| # |
| # CMP0135 is for solving re-building and re-downloading. |
| # We don't have a real problem with the OLD behavior for now |
| # but we use the NEW behavior explicitly to suppress CMP0135 |
| # warnings. |
| if(POLICY CMP0135) |
| cmake_policy(SET CMP0135 NEW) |
| endif() |
| |
| if(NOT CMAKE_BUILD_TYPE) |
| set(CMAKE_BUILD_TYPE |
| Release |
| CACHE STRING "Choose the type of build.") |
| endif() |
| |
| project(paimon |
| VERSION 0.2.3 |
| DESCRIPTION "Paimon C++ Project") |
| |
| string(TOUPPER "${CMAKE_BUILD_TYPE}" UPPERCASE_BUILD_TYPE) |
| |
| set(CMAKE_CXX_STANDARD 17) |
| set(CMAKE_CXX_STANDARD_REQUIRED ON) |
| set(CMAKE_CXX_EXTENSIONS OFF) |
| set(CMAKE_EXPORT_COMPILE_COMMANDS ON) |
| |
| option(PAIMON_BUILD_STATIC "Build static library" ON) |
| option(PAIMON_BUILD_SHARED "Build shared library" ON) |
| option(PAIMON_BUILD_TESTS "Build tests" OFF) |
| option(PAIMON_USE_ASAN "Use Address Sanitizer" OFF) |
| option(PAIMON_USE_UBSAN "Use Undefined Behavior Sanitizer" OFF) |
| option(PAIMON_USE_CXX11_ABI "Use C++11 ABI" ON) |
| option(PAIMON_ENABLE_AVRO "Whether to enable avro file format" ON) |
| option(PAIMON_ENABLE_ORC "Whether to enable orc file format" ON) |
| option(PAIMON_ENABLE_JINDO "Whether to enable jindo file system" OFF) |
| option(PAIMON_ENABLE_LUCENE "Whether to enable lucene index" OFF) |
| |
| if(PAIMON_ENABLE_ORC) |
| add_definitions(-DPAIMON_ENABLE_ORC) |
| endif() |
| if(PAIMON_ENABLE_AVRO) |
| add_definitions(-DPAIMON_ENABLE_AVRO) |
| endif() |
| if(PAIMON_ENABLE_JINDO) |
| add_definitions(-DPAIMON_ENABLE_JINDO) |
| endif() |
| if(PAIMON_USE_CXX11_ABI) |
| add_definitions(-D_GLIBCXX_USE_CXX11_ABI=1) |
| else() |
| # Lumina is provided as a shared library and cannot be recompiled with C++11 ABI off. |
| if(PAIMON_ENABLE_LUMINA) |
| message(FATAL_ERROR "Lumina cannot be enabled with C++11 ABI off") |
| endif() |
| add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0) |
| endif() |
| if(PAIMON_ENABLE_LUMINA) |
| add_definitions(-DPAIMON_ENABLE_LUMINA) |
| endif() |
| |
| if(PAIMON_ENABLE_LUCENE) |
| add_definitions(-DPAIMON_ENABLE_LUCENE) |
| endif() |
| |
| add_definitions(-DSNAPPY_CODEC_AVAILABLE) |
| add_definitions(-DZSTD_CODEC_AVAILABLE) |
| add_definitions(-DRAPIDJSON_HAS_STDSTRING) |
| |
| set(CLANG_TIDY_BIN "clang-tidy") |
| |
| set(PAIMON_SOURCE_DIR ${PROJECT_SOURCE_DIR}) |
| set(PAIMON_BINARY_DIR ${PROJECT_BINARY_DIR}) |
| set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules") |
| set(BUILD_SUPPORT_DIR "${CMAKE_SOURCE_DIR}/build_support") |
| |
| include(GNUInstallDirs) |
| set(PAIMON_CMAKE_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/Paimon") |
| include(DefineOptions) |
| |
| if(PAIMON_OPTIONAL_INSTALL) |
| # Don't make the "install" target depend on the "all" target |
| set(CMAKE_SKIP_INSTALL_ALL_DEPENDENCY true) |
| set(INSTALL_IS_OPTIONAL OPTIONAL) |
| endif() |
| |
| if(PAIMON_EXTRA_ERROR_CONTEXT) |
| add_definitions(-DPAIMON_EXTRA_ERROR_CONTEXT) |
| endif() |
| |
| if(NOT PAIMON_VERBOSE_LINT) |
| set(PAIMON_LINT_QUIET "--quiet") |
| endif() |
| |
| set(LINT_EXCLUSIONS_FILE ${BUILD_SUPPORT_DIR}/lint_exclusions.txt) |
| |
| set(LINT_SOURCE_DIRS ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/src |
| ${CMAKE_SOURCE_DIR}/test ${CMAKE_SOURCE_DIR}/examples) |
| |
| set(CLANG_TIDY_OPTIONS |
| ${PAIMON_LINT_QUIET} |
| --compile_commands |
| ${CMAKE_BINARY_DIR}/compile_commands.json |
| --exclude_globs |
| ${LINT_EXCLUSIONS_FILE}) |
| |
| if(PAIMON_LINT_GIT_DIFF_MODE) |
| list(JOIN LINT_SOURCE_DIRS "|" _lint_dir_union) |
| set(LINT_DIR_REGEX "^(${_lint_dir_union}\/?)") |
| |
| set(GIT_DIFF_FILE_PATH ${CMAKE_BINARY_DIR}/git_diff_files.txt) |
| add_custom_target(update_diff_files |
| # get git-diff file list |
| COMMAND git diff-index --name-only --diff-filter=d --cached |
| ${PAIMON_LINT_GIT_TARGET_COMMIT} > ${GIT_DIFF_FILE_PATH} |
| # convert to absolute path |
| COMMAND sed -i \"s|^|${CMAKE_SOURCE_DIR}/|\" ${GIT_DIFF_FILE_PATH} |
| # filter with ${LINT_SOURCE_DIRS} dirs |
| COMMAND sed -nE -i '\\@${LINT_DIR_REGEX}@p' ${GIT_DIFF_FILE_PATH} |
| COMMENT "Generate git_diff_files.txt for git-diff lint" |
| BYPRODUCTS ${GIT_DIFF_FILE_PATH}) |
| |
| list(APPEND CLANG_TIDY_OPTIONS --source_file @${GIT_DIFF_FILE_PATH}) |
| else() |
| list(APPEND CLANG_TIDY_OPTIONS --source_dir ${LINT_SOURCE_DIRS}) |
| endif() |
| |
| # runs clang-tidy and attempts to fix any warning automatically |
| add_custom_target(clang-tidy |
| ${PYTHON_EXECUTABLE} |
| ${BUILD_SUPPORT_DIR}/run_clang_tidy.py |
| --clang_tidy_binary |
| ${CLANG_TIDY_BIN} |
| ${CLANG_TIDY_OPTIONS} |
| --fix) |
| |
| # runs clang-tidy and exits with a non-zero exit code if any errors are found. |
| add_custom_target(check-clang-tidy |
| ${PYTHON_EXECUTABLE} |
| ${BUILD_SUPPORT_DIR}/run_clang_tidy.py |
| --clang_tidy_binary |
| ${CLANG_TIDY_BIN} |
| ${CLANG_TIDY_OPTIONS}) |
| |
| if(PAIMON_LINT_GIT_DIFF_MODE) |
| add_dependencies(clang-tidy update_diff_files) |
| add_dependencies(check-clang-tidy update_diff_files) |
| endif() |
| |
| if(UNIX) |
| add_custom_target(iwyu |
| ${CMAKE_COMMAND} |
| -E |
| env |
| "PYTHON=${PYTHON_EXECUTABLE}" |
| ${BUILD_SUPPORT_DIR}/iwyu/iwyu.sh) |
| add_custom_target(iwyu-all |
| ${CMAKE_COMMAND} |
| -E |
| env |
| "PYTHON=${PYTHON_EXECUTABLE}" |
| ${BUILD_SUPPORT_DIR}/iwyu/iwyu.sh |
| all) |
| endif(UNIX) |
| |
| # Setup ccache to accelerate compilation if available |
| if(PAIMON_USE_CCACHE |
| AND NOT CMAKE_C_COMPILER_LAUNCHER |
| AND NOT CMAKE_CXX_COMPILER_LAUNCHER) |
| |
| find_program(CCACHE_PROGRAM ccache) |
| if(CCACHE_PROGRAM) |
| message(STATUS "Found ccache: ${CCACHE_PROGRAM}") |
| set(CMAKE_C_COMPILER_LAUNCHER "${CCACHE_PROGRAM}") |
| set(CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_PROGRAM}") |
| else() |
| message(STATUS "ccache not found, compiling without cache acceleration") |
| endif() |
| endif() |
| |
| include(SetupCxxFlags) |
| |
| # set compile output directory |
| string(TOLOWER ${CMAKE_BUILD_TYPE} BUILD_SUBDIR_NAME) |
| |
| # If build in-source, create the latest symlink. If build out-of-source, which |
| # is preferred, simply output the binaries in the build folder |
| if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_BINARY_DIR}) |
| set(BUILD_OUTPUT_ROOT_DIRECTORY |
| "${CMAKE_CURRENT_BINARY_DIR}/build/${BUILD_SUBDIR_NAME}/") |
| # Link build/latest to the current build directory, to avoid developers |
| # accidentally running the latest debug build when in fact they're building |
| # release builds. |
| file(MAKE_DIRECTORY ${BUILD_OUTPUT_ROOT_DIRECTORY}) |
| if(NOT APPLE) |
| set(MORE_ARGS "-T") |
| endif() |
| execute_process(COMMAND ln ${MORE_ARGS} -sf ${BUILD_OUTPUT_ROOT_DIRECTORY} |
| ${CMAKE_CURRENT_BINARY_DIR}/build/latest) |
| else() |
| set(BUILD_OUTPUT_ROOT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${BUILD_SUBDIR_NAME}/") |
| endif() |
| |
| # where to put generated archives (.a files) |
| set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${BUILD_OUTPUT_ROOT_DIRECTORY}") |
| set(ARCHIVE_OUTPUT_DIRECTORY "${BUILD_OUTPUT_ROOT_DIRECTORY}") |
| |
| # where to put generated libraries (.so files) |
| set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${BUILD_OUTPUT_ROOT_DIRECTORY}") |
| set(LIBRARY_OUTPUT_DIRECTORY "${BUILD_OUTPUT_ROOT_DIRECTORY}") |
| |
| # where to put generated binaries |
| set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${BUILD_OUTPUT_ROOT_DIRECTORY}") |
| set(RUNTIME_OUTPUT_DIRECTORY "${BUILD_OUTPUT_ROOT_DIRECTORY}") |
| set(EXECUTABLE_OUTPUT_PATH "${BUILD_OUTPUT_ROOT_DIRECTORY}") |
| |
| include(BuildUtils) |
| enable_testing() |
| |
| # Add common flags |
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX_COMMON_FLAGS}") |
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${PAIMON_CXXFLAGS}") |
| |
| # For any C code, use the same flags. These flags don't contain C++ specific |
| # flags. |
| set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CXX_COMMON_FLAGS} ${PAIMON_CXXFLAGS}") |
| |
| # Remove --std=c++17 to avoid errors from C compilers |
| string(REPLACE "-std=c++17" "" CMAKE_C_FLAGS ${CMAKE_C_FLAGS}) |
| |
| # Add C++-only flags, like -std=c++11 |
| set(CMAKE_CXX_FLAGS "${CXX_ONLY_FLAGS} ${CMAKE_CXX_FLAGS}") |
| |
| include(san-config) |
| |
| # Code coverage |
| if("${PAIMON_GENERATE_COVERAGE}") |
| set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --coverage -DCOVERAGE_BUILD") |
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage -DCOVERAGE_BUILD") |
| endif() |
| |
| # CMAKE_CXX_FLAGS now fully assembled |
| message(STATUS "CMAKE_C_FLAGS: ${CMAKE_C_FLAGS}") |
| message(STATUS "CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}") |
| |
| include_directories(${CMAKE_CURRENT_BINARY_DIR}/src) |
| include_directories(src) |
| |
| # |
| # Visibility |
| # |
| # For generate_export_header() and add_compiler_export_flags(). |
| include(GenerateExportHeader) |
| include(ExternalProject) |
| include(ThirdpartyToolchain) |
| |
| add_custom_target(paimon_dependencies) |
| |
| if(PAIMON_STATIC_LINK_LIBS) |
| add_dependencies(paimon_dependencies ${PAIMON_STATIC_LINK_LIBS}) |
| endif() |
| |
| set(PAIMON_SHARED_PRIVATE_LINK_LIBS ${PAIMON_STATIC_LINK_LIBS}) |
| |
| add_subdirectory(third_party/roaring_bitmap EXCLUDE_FROM_ALL) |
| add_subdirectory(third_party/xxhash EXCLUDE_FROM_ALL) |
| |
| list(APPEND PAIMON_LINK_LIBS ${CMAKE_DL_LIBS}) |
| list(APPEND PAIMON_SHARED_INSTALL_INTERFACE_LIBS ${CMAKE_DL_LIBS}) |
| |
| if(PAIMON_ENABLE_LUCENE) |
| set(PAIMON_DICT_DEST "share/paimon/dict") |
| |
| install(DIRECTORY ${JIEBA_DICT_DIR}/ |
| DESTINATION ${PAIMON_DICT_DEST} |
| FILES_MATCHING |
| PATTERN "jieba.dict.utf8" |
| PATTERN "hmm_model.utf8" |
| PATTERN "idf.utf8" |
| PATTERN "stop_words.utf8" |
| PATTERN "user.dict.utf8" |
| PATTERN "pos_dict" |
| PATTERN ".git*" EXCLUDE |
| PATTERN "*.md" EXCLUDE) |
| endif() |
| |
| install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/ |
| DESTINATION "include" |
| FILES_MATCHING |
| PATTERN "*.h") |
| |
| set(CMAKE_CXX_VISIBILITY_PRESET hidden) |
| set(CMAKE_C_VISIBILITY_PRESET hidden) |
| |
| include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) |
| include_directories("${CMAKE_SOURCE_DIR}/third_party/roaring_bitmap") |
| include_directories("${CMAKE_SOURCE_DIR}/third_party/xxhash") |
| |
| include_directories(SYSTEM ${ARROW_INCLUDE_DIR}) |
| include_directories(SYSTEM ${TBB_INCLUDE_DIR}) |
| |
| include_directories(SYSTEM ${GLOG_INCLUDE_DIR}) |
| add_compile_definitions("GLOG_USE_GLOG_EXPORT") |
| |
| set(THREADS_PREFER_PTHREAD_FLAG ON) |
| find_package(Threads REQUIRED) |
| set(PAIMON_VERSION_SCRIPT_FLAGS |
| "-Wl,--version-script=${CMAKE_SOURCE_DIR}/src/paimon/symbols.map") |
| |
| set(ENV{PAIMON_TEST_DATA} "${CMAKE_SOURCE_DIR}/test/test_data") |
| |
| if(PAIMON_BUILD_TESTS) |
| if(NOT PAIMON_ENABLE_ORC) |
| message(FATAL_ERROR "PAIMON_ENABLE_ORC must be enabled if PAIMON_BUILD_TESTS is enable" |
| ) |
| endif() |
| if(NOT PAIMON_ENABLE_AVRO) |
| message(FATAL_ERROR "PAIMON_ENABLE_AVRO must be enabled if PAIMON_BUILD_TESTS is enable" |
| ) |
| endif() |
| # Adding unit tests part of the "paimon" portion of the test suite |
| add_custom_target(paimon-tests) |
| resolve_dependency(GTest) |
| |
| add_custom_target(unittest |
| ctest |
| -j4 |
| -L |
| unittest |
| --output-on-failure) |
| add_dependencies(unittest paimon-tests) |
| |
| include_directories(SYSTEM ${GTEST_INCLUDE_DIR}) |
| include_directories("${CMAKE_SOURCE_DIR}/test/") |
| |
| set(TEST_STATIC_LINK_LIBS |
| "-Wl,--whole-archive" |
| paimon_file_index_static |
| paimon_global_index_static |
| paimon_local_file_system_static |
| paimon_mock_file_format_static |
| "-Wl,--no-whole-archive" |
| "-Wl,--no-as-needed" |
| paimon_parquet_file_format_shared |
| paimon_blob_file_format_shared |
| "-Wl,--as-needed") |
| |
| if(PAIMON_ENABLE_ORC) |
| list(APPEND TEST_STATIC_LINK_LIBS "-Wl,--no-as-needed") |
| list(APPEND TEST_STATIC_LINK_LIBS paimon_orc_file_format_shared) |
| list(APPEND TEST_STATIC_LINK_LIBS "-Wl,--as-needed") |
| endif() |
| if(PAIMON_ENABLE_AVRO) |
| list(APPEND TEST_STATIC_LINK_LIBS "-Wl,--no-as-needed") |
| list(APPEND TEST_STATIC_LINK_LIBS paimon_avro_file_format_shared) |
| list(APPEND TEST_STATIC_LINK_LIBS "-Wl,--as-needed") |
| endif() |
| if(PAIMON_ENABLE_JINDO) |
| list(APPEND TEST_STATIC_LINK_LIBS "-Wl,--no-as-needed") |
| list(APPEND TEST_STATIC_LINK_LIBS paimon_jindo_file_system_shared) |
| list(APPEND TEST_STATIC_LINK_LIBS "-Wl,--as-needed") |
| endif() |
| if(PAIMON_ENABLE_LUMINA) |
| list(APPEND TEST_STATIC_LINK_LIBS "-Wl,--no-as-needed") |
| list(APPEND TEST_STATIC_LINK_LIBS paimon_lumina_index_shared) |
| list(APPEND TEST_STATIC_LINK_LIBS "-Wl,--as-needed") |
| endif() |
| if(PAIMON_ENABLE_LUCENE) |
| list(APPEND TEST_STATIC_LINK_LIBS "-Wl,--no-as-needed") |
| list(APPEND TEST_STATIC_LINK_LIBS paimon_lucene_index_shared) |
| list(APPEND TEST_STATIC_LINK_LIBS "-Wl,--as-needed") |
| endif() |
| endif() |
| |
| paimon_print_dependency_resolution_summary() |
| |
| include(CMakePackageConfigHelpers) |
| write_basic_package_version_file( |
| "${CMAKE_CURRENT_BINARY_DIR}/PaimonConfigVersion.cmake" |
| VERSION ${PROJECT_VERSION} |
| COMPATIBILITY AnyNewerVersion) |
| |
| configure_package_config_file("${CMAKE_CURRENT_SOURCE_DIR}/PaimonConfig.cmake.in" |
| "${CMAKE_CURRENT_BINARY_DIR}/PaimonConfig.cmake" |
| INSTALL_DESTINATION ${PAIMON_CMAKE_INSTALL_DIR}) |
| |
| install(FILES "${CMAKE_CURRENT_BINARY_DIR}/PaimonConfig.cmake" |
| "${CMAKE_CURRENT_BINARY_DIR}/PaimonConfigVersion.cmake" |
| DESTINATION ${PAIMON_CMAKE_INSTALL_DIR}) |
| |
| config_summary_message() |
| |
| add_subdirectory(src/paimon) |
| add_subdirectory(src/paimon/fs/local) |
| if(PAIMON_ENABLE_JINDO) |
| add_subdirectory(src/paimon/fs/jindo) |
| endif() |
| add_subdirectory(src/paimon/format/blob) |
| add_subdirectory(src/paimon/format/orc) |
| add_subdirectory(src/paimon/format/parquet) |
| add_subdirectory(src/paimon/format/avro) |
| if(PAIMON_ENABLE_LUMINA) |
| add_subdirectory(src/paimon/global_index/lumina) |
| endif() |
| add_subdirectory(src/paimon/global_index/lucene) |
| add_subdirectory(src/paimon/testing/mock) |
| add_subdirectory(src/paimon/testing/utils) |
| add_subdirectory(test/inte) |
| |
| install(EXPORT PaimonTargets |
| NAMESPACE Paimon:: |
| DESTINATION ${PAIMON_CMAKE_INSTALL_DIR}) |