2022-09-13 20:09:39 +00:00
cmake_minimum_required ( VERSION 3.20 )
2019-08-22 03:24:05 +00:00
2022-05-10 08:44:28 +00:00
project ( ClickHouse LANGUAGES C CXX ASM )
2019-10-30 07:01:53 +00:00
2020-09-17 15:37:23 +00:00
# If turned off: e.g. when ENABLE_FOO is ON, but FOO tool was not found, the CMake will continue.
2020-08-14 15:44:04 +00:00
option ( FAIL_ON_UNSUPPORTED_OPTIONS_COMBINATION
2020-09-15 20:17:24 +00:00
" S t o p / F a i l C M a k e c o n f i g u r a t i o n i f s o m e E N A B L E _ X X X o p t i o n i s defined ( either ON or OFF )
b u t i s n o t p o s s i b l e t o s a t i s f y " O N )
2020-09-15 19:32:42 +00:00
2020-08-14 15:44:04 +00:00
if ( FAIL_ON_UNSUPPORTED_OPTIONS_COMBINATION )
set ( RECONFIGURE_MESSAGE_LEVEL FATAL_ERROR )
else ( )
2021-05-22 23:28:50 +00:00
set ( RECONFIGURE_MESSAGE_LEVEL WARNING )
2020-08-14 15:44:04 +00:00
endif ( )
2019-10-30 07:01:53 +00:00
include ( cmake/arch.cmake )
2019-08-30 16:50:43 +00:00
include ( cmake/target.cmake )
2019-10-30 07:01:53 +00:00
include ( cmake/tools.cmake )
2022-05-15 12:11:31 +00:00
include ( cmake/ccache.cmake )
2022-04-25 08:48:19 +00:00
include ( cmake/clang_tidy.cmake )
2022-09-27 11:43:31 +00:00
include ( cmake/git.cmake )
2019-08-30 16:50:43 +00:00
2019-08-28 20:49:37 +00:00
# Ignore export() since we don't use it,
# but it gets broken with a global targets via link_libraries()
macro ( export )
endmacro ( )
2019-03-28 10:36:49 +00:00
set ( CMAKE_EXPORT_COMPILE_COMMANDS 1 ) # Write compile_commands.json
set ( CMAKE_LINK_DEPENDS_NO_SHARED 1 ) # Do not relink all depended targets on .so
set ( CMAKE_CONFIGURATION_TYPES "RelWithDebInfo;Debug;Release;MinSizeRel" CACHE STRING "" FORCE )
set ( CMAKE_DEBUG_POSTFIX "d" CACHE STRING "Generate debug library name with a postfix." ) # To be consistent with CMakeLists from contrib libs.
2017-01-13 11:25:44 +00:00
2020-04-27 18:34:36 +00:00
# Enable the ability to organize targets into hierarchies of "folders" for capable GUI-based IDEs.
# For more info see https://cmake.org/cmake/help/latest/prop_gbl/USE_FOLDERS.html
2020-04-27 17:50:26 +00:00
set_property ( GLOBAL PROPERTY USE_FOLDERS ON )
2022-02-19 16:44:24 +00:00
# Check that submodules are present
if ( NOT EXISTS "${ClickHouse_SOURCE_DIR}/contrib/sysroot/README.md" )
2022-06-01 11:54:53 +00:00
message ( FATAL_ERROR "Submodules are not initialized. Run\n\tgit submodule update --init" )
2016-12-01 22:44:59 +00:00
endif ( )
2016-05-22 22:41:03 +00:00
2021-03-31 19:41:53 +00:00
# Take care to add prlimit in command line before ccache, or else ccache thinks that
# prlimit is compiler, and clang++ is its input file, and refuses to work with
# multiple inputs, e.g in ccache log:
# [2021-03-31T18:06:32.655327 36900] Command line: /usr/bin/ccache prlimit --as=10000000000 --data=5000000000 --cpu=600 /usr/bin/clang++-11 - ...... std=gnu++2a -MD -MT src/CMakeFiles/dbms.dir/Storages/MergeTree/IMergeTreeDataPart.cpp.o -MF src/CMakeFiles/dbms.dir/Storages/MergeTree/IMergeTreeDataPart.cpp.o.d -o src/CMakeFiles/dbms.dir/Storages/MergeTree/IMergeTreeDataPart.cpp.o -c ../src/Storages/MergeTree/IMergeTreeDataPart.cpp
#
# [2021-03-31T18:06:32.656704 36900] Multiple input files: /usr/bin/clang++-11 and ../src/Storages/MergeTree/IMergeTreeDataPart.cpp
2021-03-31 21:54:45 +00:00
#
# Another way would be to use --ccache-skip option before clang++-11 to make
# ccache ignore it.
2021-03-31 19:41:53 +00:00
option ( ENABLE_CHECK_HEAVY_BUILDS "Don't allow C++ translation units to compile too long or to take too much memory while compiling." OFF )
2020-09-20 20:43:28 +00:00
if ( ENABLE_CHECK_HEAVY_BUILDS )
2021-09-10 05:39:56 +00:00
# set DATA (since RSS does not work since 2.6.x+) to 5G
2020-12-26 14:26:50 +00:00
set ( RLIMIT_DATA 5000000000 )
2020-12-26 07:29:50 +00:00
# set VIRT (RLIMIT_AS) to 10G (DATA*10)
2020-12-26 14:26:50 +00:00
set ( RLIMIT_AS 10000000000 )
2021-09-10 18:02:18 +00:00
# set CPU time limit to 1000 seconds
set ( RLIMIT_CPU 1000 )
2021-04-06 16:46:24 +00:00
2020-12-26 14:26:50 +00:00
# gcc10/gcc10/clang -fsanitize=memory is too heavy
if ( SANITIZE STREQUAL "memory" OR COMPILER_GCC )
2021-09-10 05:39:56 +00:00
set ( RLIMIT_DATA 10000000000 ) # 10G
2020-12-26 14:26:50 +00:00
endif ( )
2021-04-06 16:46:24 +00:00
set ( CMAKE_CXX_COMPILER_LAUNCHER prlimit --as= ${ RLIMIT_AS } --data= ${ RLIMIT_DATA } --cpu= ${ RLIMIT_CPU } ${ CMAKE_CXX_COMPILER_LAUNCHER } )
2020-09-20 20:43:28 +00:00
endif ( )
2017-04-12 18:41:53 +00:00
if ( NOT CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE STREQUAL "None" )
2020-04-30 14:41:22 +00:00
set ( CMAKE_BUILD_TYPE "RelWithDebInfo" )
message ( STATUS "CMAKE_BUILD_TYPE is not set, set to default = ${CMAKE_BUILD_TYPE}" )
2016-12-01 22:44:59 +00:00
endif ( )
2018-08-29 15:54:00 +00:00
message ( STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}" )
2016-02-07 21:58:58 +00:00
2020-04-30 14:41:22 +00:00
string ( TOUPPER ${ CMAKE_BUILD_TYPE } CMAKE_BUILD_TYPE_UC )
2018-08-08 03:37:35 +00:00
2023-01-03 18:51:10 +00:00
list ( REVERSE CMAKE_FIND_LIBRARY_SUFFIXES )
2018-08-30 00:20:02 +00:00
2020-09-17 15:37:23 +00:00
option ( ENABLE_FUZZING "Fuzzy testing using libfuzzer" OFF )
2019-09-22 10:34:09 +00:00
if ( ENABLE_FUZZING )
2021-08-22 15:09:49 +00:00
# Also set WITH_COVERAGE=1 for better fuzzing process
# By default this is disabled, because fuzzers are built in CI with the clickhouse itself.
# And we don't want to enable coverage for it.
2019-09-22 10:34:09 +00:00
message ( STATUS "Fuzzing instrumentation enabled" )
2020-04-25 07:12:38 +00:00
set ( FUZZER "libfuzzer" )
2021-10-05 10:51:49 +00:00
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -nostdlib++" )
2021-10-15 14:35:50 +00:00
set ( ENABLE_CLICKHOUSE_ODBC_BRIDGE OFF )
set ( ENABLE_LIBRARIES 0 )
set ( ENABLE_SSL 1 )
set ( USE_UNWIND ON )
set ( ENABLE_EMBEDDED_COMPILER 0 )
set ( ENABLE_EXAMPLES 0 )
set ( ENABLE_UTILS 0 )
set ( ENABLE_THINLTO 0 )
set ( ENABLE_TCMALLOC 0 )
set ( ENABLE_JEMALLOC 0 )
set ( ENABLE_CHECK_HEAVY_BUILDS 1 )
set ( GLIBC_COMPATIBILITY OFF )
2022-12-08 12:38:08 +00:00
set ( ENABLE_BENCHMARKS 0 )
2021-12-06 21:34:52 +00:00
# For codegen_select_fuzzer
set ( ENABLE_PROTOBUF 1 )
2019-09-22 10:34:09 +00:00
endif ( )
2020-12-15 19:59:07 +00:00
# Global libraries
# See:
# - default_libs.cmake
# - sanitize.cmake
add_library ( global-libs INTERFACE )
2020-04-25 07:12:38 +00:00
include ( cmake/fuzzer.cmake )
2018-08-08 03:37:35 +00:00
include ( cmake/sanitize.cmake )
2016-02-07 21:58:58 +00:00
2022-05-10 13:29:00 +00:00
option ( ENABLE_COLORED_BUILD "Enable colors in compiler output" ON )
set ( CMAKE_COLOR_MAKEFILE ${ ENABLE_COLORED_BUILD } ) # works only for the makefile generator
if ( ENABLE_COLORED_BUILD AND CMAKE_GENERATOR STREQUAL "Ninja" )
2018-06-08 16:26:03 +00:00
# Turn on colored output. https://github.com/ninja-build/ninja/wiki/FAQ
2018-07-10 16:34:18 +00:00
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color=always" )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdiagnostics-color=always" )
2022-05-10 13:29:00 +00:00
# ... such manually setting of flags can be removed once CMake supports a variable to
# activate colors in *all* build systems: https://gitlab.kitware.com/cmake/cmake/-/issues/15502
2018-06-08 16:26:03 +00:00
endif ( )
2021-09-15 04:26:27 +00:00
include ( cmake/check_flags.cmake )
2020-01-10 10:25:14 +00:00
include ( cmake/add_warning.cmake )
2019-06-27 17:37:24 +00:00
if ( COMPILER_CLANG )
2019-07-29 22:26:44 +00:00
# generate ranges for fast "addr2line" search
if ( NOT CMAKE_BUILD_TYPE_UC STREQUAL "RELEASE" )
2022-08-31 17:34:35 +00:00
# NOTE: that clang has a bug because of it does not emit .debug_aranges
# with ThinLTO, so custom ld.lld wrapper is shipped in docker images.
2019-07-29 22:26:44 +00:00
set ( COMPILER_FLAGS "${COMPILER_FLAGS} -gdwarf-aranges" )
endif ( )
2021-09-08 15:07:27 +00:00
2021-09-15 04:26:27 +00:00
if ( HAS_USE_CTOR_HOMING )
# For more info see https://blog.llvm.org/posts/2021-04-05-constructor-homing-for-debug-info/
2022-02-04 14:13:06 +00:00
if ( CMAKE_BUILD_TYPE_UC STREQUAL "DEBUG" OR CMAKE_BUILD_TYPE_UC STREQUAL "RELWITHDEBINFO" )
2021-09-08 15:07:27 +00:00
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Xclang -fuse-ctor-homing" )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Xclang -fuse-ctor-homing" )
endif ( )
endif ( )
2022-08-13 04:06:01 +00:00
no_warning ( enum-constexpr-conversion ) # breaks Protobuf in clang-16
2017-11-29 15:56:29 +00:00
endif ( )
2016-06-27 06:34:10 +00:00
2021-10-03 23:34:23 +00:00
# If compiler has support for -Wreserved-identifier. It is difficult to detect by clang version,
# because there are two different branches of clang: clang and AppleClang.
# (AppleClang is not supported by ClickHouse, but some developers have misfortune to use it).
2021-10-03 13:42:36 +00:00
if ( HAS_RESERVED_IDENTIFIER )
2021-10-03 16:40:19 +00:00
add_compile_definitions ( HAS_RESERVED_IDENTIFIER )
endif ( )
2021-10-03 13:42:36 +00:00
2020-09-19 16:42:36 +00:00
option ( ENABLE_TESTS "Provide unit_test_dbms target with Google.Test unit tests" ON )
2021-04-28 04:32:23 +00:00
option ( ENABLE_EXAMPLES "Build all example programs in 'examples' subdirectories" OFF )
2022-12-08 12:38:08 +00:00
option ( ENABLE_BENCHMARKS "Build all benchmark programs in 'benchmarks' subdirectories" OFF )
2016-06-27 06:34:10 +00:00
2023-01-03 18:51:10 +00:00
if ( OS_LINUX AND ( ARCH_AMD64 OR ARCH_AARCH64 ) AND NOT USE_MUSL )
2021-05-08 12:22:29 +00:00
# Only for Linux, x86_64 or aarch64.
2020-09-15 20:17:24 +00:00
option ( GLIBC_COMPATIBILITY "Enable compatibility with older glibc libraries." ON )
2020-08-14 15:44:04 +00:00
elseif ( GLIBC_COMPATIBILITY )
message ( ${ RECONFIGURE_MESSAGE_LEVEL } "Glibc compatibility cannot be enabled in current configuration" )
2019-10-13 16:06:54 +00:00
endif ( )
2019-04-11 18:58:31 +00:00
2019-08-22 03:24:05 +00:00
# Make sure the final executable has symbols exported
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -rdynamic" )
2020-08-09 23:58:09 +00:00
if ( OS_DARWIN )
2021-06-07 21:56:32 +00:00
# The `-all_load` flag forces loading of all symbols from all libraries,
# and leads to multiply-defined symbols. This flag allows force loading
# from a _specific_ library, which is what we need.
set ( WHOLE_ARCHIVE -force_load )
# The `-noall_load` flag is the default and now obsolete.
2021-11-25 23:03:04 +00:00
set ( NO_WHOLE_ARCHIVE "-undefined,error" ) # Effectively, a no-op. Here to avoid empty "-Wl, " sequence to be generated in the command line.
2020-08-09 23:58:09 +00:00
else ( )
set ( WHOLE_ARCHIVE --whole-archive )
set ( NO_WHOLE_ARCHIVE --no-whole-archive )
endif ( )
2022-04-06 13:28:35 +00:00
option ( ENABLE_CURL_BUILD "Enable curl, azure, sentry build on by default except MacOS." ON )
if ( OS_DARWIN )
# Disable the curl, azure, senry build on MacOS
set ( ENABLE_CURL_BUILD OFF )
endif ( )
2020-09-19 16:42:36 +00:00
# Ignored if `lld` is used
option ( ADD_GDB_INDEX_FOR_GOLD "Add .gdb-index to resulting binaries for gold linker." )
2020-09-15 20:17:24 +00:00
2019-09-16 11:00:00 +00:00
if ( NOT CMAKE_BUILD_TYPE_UC STREQUAL "RELEASE" )
2022-08-27 21:45:22 +00:00
# Can be lld or ld-lld or lld-13 or /path/to/lld.
2022-10-29 10:58:11 +00:00
if ( LINKER_NAME MATCHES "lld" AND OS_LINUX )
2019-09-17 09:49:27 +00:00
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gdb-index" )
set ( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--gdb-index" )
message ( STATUS "Adding .gdb-index via --gdb-index linker option." )
2019-09-17 09:53:12 +00:00
# we use another tool for gdb-index, because gold linker removes section .debug_aranges, which used inside clickhouse stacktraces
# http://sourceware-org.1504.n7.nabble.com/gold-No-debug-aranges-section-when-linking-with-gdb-index-td540965.html#a556932
2021-01-01 06:36:42 +00:00
elseif ( LINKER_NAME MATCHES "gold$" AND ADD_GDB_INDEX_FOR_GOLD )
2019-09-17 09:49:27 +00:00
find_program ( GDB_ADD_INDEX_EXE NAMES "gdb-add-index" DOC "Path to gdb-add-index executable" )
if ( NOT GDB_ADD_INDEX_EXE )
set ( USE_GDB_ADD_INDEX 0 )
message ( WARNING "Cannot add gdb index to binaries, because gold linker is used, but gdb-add-index executable not found." )
else ( )
set ( USE_GDB_ADD_INDEX 1 )
message ( STATUS "gdb-add-index found: ${GDB_ADD_INDEX_EXE}" )
endif ( )
endif ( )
2019-09-16 11:00:00 +00:00
endif ( )
2022-06-29 16:21:28 +00:00
if ( CMAKE_BUILD_TYPE_UC STREQUAL "RELEASE"
O R C M A K E _ B U I L D _ T Y P E _ U C S T R E Q U A L " R E L W I T H D E B I N F O "
O R C M A K E _ B U I L D _ T Y P E _ U C S T R E Q U A L " M I N S I Z E R E L " )
set ( OMIT_HEAVY_DEBUG_SYMBOLS_DEFAULT ON )
else ( )
set ( OMIT_HEAVY_DEBUG_SYMBOLS_DEFAULT OFF )
endif ( )
# Provides faster linking and lower binary size.
# Tradeoff is the inability to debug some source files with e.g. gdb
# (empty stack frames and no local variables)."
option ( OMIT_HEAVY_DEBUG_SYMBOLS
" D o n o t g e n e r a t e d e b u g g e r i n f o f o r h e a v y modules ( ClickHouse functions and dictionaries, some contrib ) "
$ { O M I T _ H E A V Y _ D E B U G _ S Y M B O L S _ D E F A U L T } )
2021-11-28 03:54:37 +00:00
if ( CMAKE_BUILD_TYPE_UC STREQUAL "DEBUG" )
set ( USE_DEBUG_HELPERS ON )
endif ( )
option ( USE_DEBUG_HELPERS "Enable debug helpers" ${ USE_DEBUG_HELPERS } )
2022-06-29 16:21:28 +00:00
2022-03-11 14:47:07 +00:00
option ( BUILD_STANDALONE_KEEPER "Build keeper as small standalone binary" OFF )
2022-04-22 09:30:09 +00:00
if ( NOT BUILD_STANDALONE_KEEPER )
option ( CREATE_KEEPER_SYMLINK "Create symlink for clickhouse-keeper to main server binary" ON )
else ( )
option ( CREATE_KEEPER_SYMLINK "Create symlink for clickhouse-keeper to main server binary" OFF )
endif ( )
2021-11-28 03:54:37 +00:00
2021-01-07 01:03:53 +00:00
# Create BuildID when using lld. For other linkers it is created by default.
2022-08-28 06:21:22 +00:00
# (NOTE: LINKER_NAME can be either path or name, and in different variants)
2022-10-29 10:58:11 +00:00
if ( LINKER_NAME MATCHES "lld" AND OS_LINUX )
2021-01-07 01:03:53 +00:00
# SHA1 is not cryptographically secure but it is the best what lld is offering.
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--build-id=sha1" )
endif ( )
2021-01-07 02:56:57 +00:00
# Add a section with the hash of the compiled machine code for integrity checks.
# Only for official builds, because adding a section can be time consuming (rewrite of several GB).
2021-01-08 12:22:34 +00:00
# And cross compiled binaries are not supported (since you cannot execute clickhouse hash-binary)
2022-06-13 12:17:54 +00:00
if ( CLICKHOUSE_OFFICIAL_BUILD AND ( NOT CMAKE_TOOLCHAIN_FILE OR CMAKE_TOOLCHAIN_FILE MATCHES "linux/toolchain-x86_64.cmake$" ) )
2022-06-14 08:50:53 +00:00
message ( STATUS "Official build: A checksum hash will be added to the clickhouse executable" )
2022-03-30 21:27:46 +00:00
set ( USE_BINARY_HASH 1 CACHE STRING "Calculate binary hash and store it in the separate section" )
2022-06-13 12:17:54 +00:00
else ( )
2022-06-14 08:50:53 +00:00
message ( STATUS "No official build: A checksum hash will not be added to the clickhouse executable" )
2021-01-07 02:56:57 +00:00
endif ( )
2022-06-13 12:17:54 +00:00
# Optionally split binaries and debug symbols.
2022-06-30 21:35:44 +00:00
option ( SPLIT_DEBUG_SYMBOLS "Split binaries and debug symbols" OFF )
if ( SPLIT_DEBUG_SYMBOLS )
2022-06-13 12:17:54 +00:00
message ( STATUS "Will split binaries and debug symbols" )
2022-06-30 21:35:44 +00:00
set ( SPLITTED_DEBUG_SYMBOLS_DIR "stripped" CACHE STRING "A separate directory for stripped information" )
2022-03-10 21:23:28 +00:00
endif ( )
2019-01-11 12:40:19 +00:00
cmake_host_system_information ( RESULT AVAILABLE_PHYSICAL_MEMORY QUERY AVAILABLE_PHYSICAL_MEMORY ) # Not available under freebsd
2020-09-15 20:17:24 +00:00
2020-09-19 16:42:36 +00:00
2019-01-11 12:40:19 +00:00
if ( NOT AVAILABLE_PHYSICAL_MEMORY OR AVAILABLE_PHYSICAL_MEMORY GREATER 8000 )
2020-09-19 16:42:36 +00:00
# Less `/tmp` usage, more RAM usage.
option ( COMPILER_PIPE "-pipe compiler option" ON )
2019-01-11 12:40:19 +00:00
endif ( )
2020-09-17 15:09:59 +00:00
2019-01-11 12:40:19 +00:00
if ( COMPILER_PIPE )
set ( COMPILER_FLAGS "${COMPILER_FLAGS} -pipe" )
else ( )
message ( STATUS "Disabling compiler -pipe option (have only ${AVAILABLE_PHYSICAL_MEMORY} mb of memory)" )
endif ( )
2017-01-17 14:03:37 +00:00
2021-03-14 11:08:08 +00:00
include ( cmake/cpu_features.cmake )
2017-01-27 19:55:33 +00:00
2021-04-24 22:29:48 +00:00
# Asynchronous unwind tables are needed for Query Profiler.
# They are already by default on some platforms but possibly not on all platforms.
# Enable it explicitly.
set ( COMPILER_FLAGS "${COMPILER_FLAGS} -fasynchronous-unwind-tables" )
2022-04-06 12:17:22 +00:00
# Reproducible builds.
if ( CMAKE_BUILD_TYPE_UC STREQUAL "DEBUG" )
set ( ENABLE_BUILD_PATH_MAPPING_DEFAULT OFF )
else ( )
set ( ENABLE_BUILD_PATH_MAPPING_DEFAULT ON )
endif ( )
option ( ENABLE_BUILD_PATH_MAPPING "Enable remapping of file source paths in debug info, predefined preprocessor macros, and __builtin_FILE(). It's used to generate reproducible builds. See https://reproducible-builds.org/docs/build-path" ${ ENABLE_BUILD_PATH_MAPPING_DEFAULT } )
2022-03-10 19:35:04 +00:00
if ( ENABLE_BUILD_PATH_MAPPING )
set ( COMPILER_FLAGS "${COMPILER_FLAGS} -ffile-prefix-map=${CMAKE_SOURCE_DIR}=." )
set ( CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -ffile-prefix-map=${CMAKE_SOURCE_DIR}=." )
2022-04-06 12:17:22 +00:00
endif ( )
2021-11-26 01:55:17 +00:00
2022-04-16 00:54:21 +00:00
option ( ENABLE_BUILD_PROFILING "Enable profiling of build time" OFF )
if ( ENABLE_BUILD_PROFILING )
if ( COMPILER_CLANG )
set ( COMPILER_FLAGS "${COMPILER_FLAGS} -ftime-trace" )
else ( )
message ( ${ RECONFIGURE_MESSAGE_LEVEL } "Build profiling is only available with CLang" )
endif ( )
endif ( )
2022-04-23 17:53:25 +00:00
set ( CMAKE_CXX_STANDARD 20 )
set ( CMAKE_CXX_EXTENSIONS ON ) # Same as gnu++2a (ON) vs c++2a (OFF): https://cmake.org/cmake/help/latest/prop_tgt/CXX_EXTENSIONS.html
set ( CMAKE_CXX_STANDARD_REQUIRED ON )
2020-08-19 18:02:53 +00:00
2021-03-29 18:05:00 +00:00
set ( CMAKE_C_STANDARD 11 )
set ( CMAKE_C_EXTENSIONS ON )
set ( CMAKE_C_STANDARD_REQUIRED ON )
2017-11-02 21:30:27 +00:00
2019-07-12 17:22:20 +00:00
if ( COMPILER_GCC OR COMPILER_CLANG )
# Enable C++14 sized global deallocation functions. It should be enabled by setting -std=c++14 but I'm not sure.
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsized-deallocation" )
endif ( )
2021-03-03 19:41:20 +00:00
# falign-functions=32 prevents from random performance regressions with the code change. Thus, providing more stable
# benchmarks.
if ( COMPILER_GCC OR COMPILER_CLANG )
set ( COMPILER_FLAGS "${COMPILER_FLAGS} -falign-functions=32" )
endif ( )
2022-05-16 07:01:22 +00:00
if ( ARCH_AMD64 )
# align branches within a 32-Byte boundary to avoid the potential performance loss when code layout change,
# which makes benchmark results more stable.
set ( BRANCHES_WITHIN_32B_BOUNDARIES "-mbranches-within-32B-boundaries" )
if ( COMPILER_GCC )
# gcc is in assembler, need to add "-Wa," prefix
set ( BRANCHES_WITHIN_32B_BOUNDARIES "-Wa,${BRANCHES_WITHIN_32B_BOUNDARIES}" )
endif ( )
include ( CheckCXXCompilerFlag )
check_cxx_compiler_flag ( "${BRANCHES_WITHIN_32B_BOUNDARIES}" HAS_BRANCHES_WITHIN_32B_BOUNDARIES )
if ( HAS_BRANCHES_WITHIN_32B_BOUNDARIES )
set ( COMPILER_FLAGS "${COMPILER_FLAGS} ${BRANCHES_WITHIN_32B_BOUNDARIES}" )
endif ( )
endif ( )
2021-10-08 12:06:09 +00:00
if ( COMPILER_GCC )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fcoroutines" )
endif ( )
2020-09-15 20:17:24 +00:00
# Compiler-specific coverage flags e.g. -fcoverage-mapping for gcc
2020-09-17 15:09:59 +00:00
option ( WITH_COVERAGE "Profile the resulting binary/binaries" OFF )
2020-03-18 18:54:27 +00:00
2020-05-08 14:11:19 +00:00
if ( WITH_COVERAGE AND COMPILER_CLANG )
set ( COMPILER_FLAGS "${COMPILER_FLAGS} -fprofile-instr-generate -fcoverage-mapping" )
# If we want to disable coverage for specific translation units
set ( WITHOUT_COVERAGE "-fno-profile-instr-generate -fno-coverage-mapping" )
2019-06-27 17:37:24 +00:00
endif ( )
2020-03-18 18:54:27 +00:00
2020-05-08 14:11:19 +00:00
if ( WITH_COVERAGE AND COMPILER_GCC )
set ( COMPILER_FLAGS "${COMPILER_FLAGS} -fprofile-arcs -ftest-coverage" )
set ( COVERAGE_OPTION "-lgcov" )
set ( WITHOUT_COVERAGE "-fno-profile-arcs -fno-test-coverage" )
2019-06-27 17:37:24 +00:00
endif ( )
2022-02-20 20:47:27 +00:00
set ( COMPILER_FLAGS "${COMPILER_FLAGS}" )
2022-08-29 11:25:53 +00:00
# Our built-in unwinder only supports DWARF version up to 4.
set ( DEBUG_INFO_FLAGS "-g -gdwarf-4" )
2020-12-04 02:15:44 +00:00
2022-05-12 20:18:24 +00:00
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMPILER_FLAGS}" )
2022-02-20 20:47:27 +00:00
set ( CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -O3 ${DEBUG_INFO_FLAGS} ${CMAKE_CXX_FLAGS_ADD}" )
2022-12-24 19:31:04 +00:00
set ( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 ${DEBUG_INFO_FLAGS} ${CMAKE_CXX_FLAGS_ADD}" )
2016-07-28 14:14:18 +00:00
2022-05-12 18:07:41 +00:00
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMPILER_FLAGS} ${CMAKE_C_FLAGS_ADD}" )
2022-02-20 20:47:27 +00:00
set ( CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -O3 ${DEBUG_INFO_FLAGS} ${CMAKE_C_FLAGS_ADD}" )
2022-12-24 19:31:04 +00:00
set ( CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0 ${DEBUG_INFO_FLAGS} ${CMAKE_C_FLAGS_ADD}" )
2016-08-25 14:58:01 +00:00
2022-05-24 12:14:44 +00:00
set ( CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${COMPILER_FLAGS} ${CMAKE_ASM_FLAGS_ADD}" )
set ( CMAKE_ASM_FLAGS_RELWITHDEBINFO "${CMAKE_ASM_FLAGS_RELWITHDEBINFO} -O3 ${DEBUG_INFO_FLAGS} ${CMAKE_ASM_FLAGS_ADD}" )
2022-12-24 19:31:04 +00:00
set ( CMAKE_ASM_FLAGS_DEBUG "${CMAKE_ASM_FLAGS_DEBUG} -O0 ${DEBUG_INFO_FLAGS} ${CMAKE_ASM_FLAGS_ADD}" )
2022-05-24 12:14:44 +00:00
2019-12-11 18:08:09 +00:00
if ( COMPILER_CLANG )
2020-03-06 13:31:27 +00:00
if ( OS_DARWIN )
2020-04-27 17:53:15 +00:00
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++" )
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-U,_inside_main" )
2020-03-06 13:31:27 +00:00
endif ( )
2020-04-22 09:14:08 +00:00
# Display absolute paths in error messages. Otherwise KDevelop fails to navigate to correct file and opens a new file instead.
2020-05-12 02:12:08 +00:00
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-absolute-paths" )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdiagnostics-absolute-paths" )
2020-04-29 13:43:42 +00:00
2020-08-13 23:07:39 +00:00
if ( NOT ENABLE_TESTS AND NOT SANITIZE )
2020-09-15 20:17:24 +00:00
# https://clang.llvm.org/docs/ThinLTO.html
# Applies to clang only.
# Disabled when building with tests or sanitizers.
2020-09-17 15:09:59 +00:00
option ( ENABLE_THINLTO "Clang-specific link time optimization" ON )
2020-08-13 23:07:39 +00:00
endif ( )
2020-05-02 13:50:57 +00:00
2021-02-06 13:42:52 +00:00
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstrict-vtable-pointers" )
2020-10-05 06:01:51 +00:00
# Set new experimental pass manager, it's a performance, build time and binary size win.
# Can be removed after https://reviews.llvm.org/D66490 merged and released to at least two versions of clang.
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexperimental-new-pass-manager" )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fexperimental-new-pass-manager" )
2020-09-15 20:17:24 +00:00
# We cannot afford to use LTO when compiling unit tests, and it's not enough
2020-04-29 13:43:42 +00:00
# to only supply -fno-lto at the final linking stage. So we disable it
# completely.
2020-05-02 13:50:57 +00:00
if ( ENABLE_THINLTO AND NOT ENABLE_TESTS AND NOT SANITIZE )
2020-04-29 13:43:42 +00:00
# Link time optimization
2021-02-06 13:42:52 +00:00
set ( CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -flto=thin -fwhole-program-vtables" )
set ( CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -flto=thin -fwhole-program-vtables" )
set ( CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO} -flto=thin -fwhole-program-vtables" )
2020-08-14 15:44:04 +00:00
elseif ( ENABLE_THINLTO )
message ( ${ RECONFIGURE_MESSAGE_LEVEL } "Cannot enable ThinLTO" )
2020-04-29 13:43:42 +00:00
endif ( )
2020-08-13 23:07:39 +00:00
elseif ( ENABLE_THINLTO )
2022-04-25 08:31:41 +00:00
message ( ${ RECONFIGURE_MESSAGE_LEVEL } "ThinLTO is only available with Clang" )
2019-12-11 18:08:09 +00:00
endif ( )
2020-09-17 15:37:23 +00:00
# Turns on all external libs like s3, kafka, ODBC, ...
option ( ENABLE_LIBRARIES "Enable all external libraries by default" ON )
2020-09-15 20:17:24 +00:00
2021-12-19 04:20:17 +00:00
# Increase stack size on Musl. We need big stack for our recursive-descend parser.
if ( USE_MUSL )
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,stack-size=2097152" )
endif ( )
2019-08-28 20:49:37 +00:00
include ( cmake/dbms_glob_sources.cmake )
2019-09-11 10:01:38 +00:00
2022-01-25 03:43:28 +00:00
add_library ( global-group INTERFACE )
2020-07-15 11:16:00 +00:00
if ( OS_LINUX OR OS_ANDROID )
2019-08-30 16:50:43 +00:00
include ( cmake/linux/default_libs.cmake )
2019-09-09 18:19:43 +00:00
elseif ( OS_DARWIN )
include ( cmake/darwin/default_libs.cmake )
2020-04-07 08:33:49 +00:00
elseif ( OS_FREEBSD )
include ( cmake/freebsd/default_libs.cmake )
2022-11-15 16:53:24 +00:00
else ( )
link_libraries ( global-group )
2019-08-30 16:50:43 +00:00
endif ( )
2022-01-25 03:43:28 +00:00
2023-01-17 22:06:44 +00:00
option ( ENABLE_GWP_ASAN "Enable Gwp-Asan" ON )
if ( NOT OS_LINUX AND NOT OS_ANDROID )
set ( ENABLE_GWP_ASAN OFF )
endif ( )
2022-12-12 07:05:57 +00:00
option ( WERROR "Enable -Werror compiler option" ON )
2022-05-10 20:24:45 +00:00
2022-01-25 03:43:28 +00:00
if ( WERROR )
# Don't pollute CMAKE_CXX_FLAGS with -Werror as it will break some CMake checks.
# Instead, adopt modern cmake usage requirement.
target_compile_options ( global-group INTERFACE "-Werror" )
endif ( )
# Make this extra-checks for correct library dependencies.
if ( OS_LINUX AND NOT SANITIZE )
2022-05-12 20:53:09 +00:00
target_link_options ( global-group INTERFACE "LINKER:--no-undefined" )
2022-01-25 03:43:28 +00:00
endif ( )
2019-01-19 17:14:57 +00:00
2019-08-28 20:49:37 +00:00
######################################
### Add targets below this comment ###
######################################
2019-01-19 22:08:40 +00:00
2019-03-11 01:47:58 +00:00
set ( CMAKE_POSTFIX_VARIABLE "CMAKE_${CMAKE_BUILD_TYPE_UC}_POSTFIX" )
2023-01-03 18:51:10 +00:00
set ( CMAKE_POSITION_INDEPENDENT_CODE OFF )
2023-02-02 19:56:18 +00:00
if ( OS_LINUX AND NOT ARCH_AARCH64 )
2023-01-03 18:51:10 +00:00
# Slightly more efficient code can be generated
# It's disabled for ARM because otherwise ClickHouse cannot run on Android.
set ( CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -fno-pie" )
set ( CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -fno-pie" )
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -no-pie -Wl,-no-pie" )
2017-02-08 18:53:00 +00:00
endif ( )
2016-12-01 22:44:59 +00:00
if ( ENABLE_TESTS )
2020-09-19 18:05:40 +00:00
message ( STATUS "Unit tests are enabled" )
else ( )
message ( STATUS "Unit tests are disabled" )
2017-04-10 17:43:30 +00:00
endif ( )
2020-09-15 20:17:24 +00:00
2019-01-18 15:19:53 +00:00
enable_testing ( ) # Enable for tests without binary
2016-12-01 22:44:59 +00:00
2022-12-08 12:59:49 +00:00
option ( ENABLE_OPENSSL "This option performs a build with OpenSSL. NOTE! This option is insecure and should never be used. By default, ClickHouse uses and only supports BoringSSL" OFF )
2022-12-06 22:17:53 +00:00
2023-02-02 19:56:18 +00:00
if ( ARCH_S390X )
2023-02-09 19:50:45 +00:00
set ( ENABLE_OPENSSL_DYNAMIC_DEFAULT ON )
2023-02-02 19:56:18 +00:00
else ( )
2023-02-09 19:50:45 +00:00
set ( ENABLE_OPENSSL_DYNAMIC_DEFAULT OFF )
2023-02-02 19:56:18 +00:00
endif ( )
option ( ENABLE_OPENSSL_DYNAMIC "This option removes SSL from ClickHouse and will link to the OpenSSL version supplied by OS." ${ ENABLE_OPENSSL_DYNAMIC_DEFAULT } )
2022-09-12 16:05:38 +00:00
2017-04-05 12:19:05 +00:00
# when installing to /usr - place configs to /etc but for /usr/local place to /usr/local/etc
2017-04-12 18:41:53 +00:00
if ( CMAKE_INSTALL_PREFIX STREQUAL "/usr" )
set ( CLICKHOUSE_ETC_DIR "/etc" )
2017-01-12 13:51:30 +00:00
else ( )
2017-04-12 18:41:53 +00:00
set ( CLICKHOUSE_ETC_DIR "${CMAKE_INSTALL_PREFIX}/etc" )
2016-12-24 01:03:10 +00:00
endif ( )
2023-01-03 18:51:10 +00:00
message ( STATUS "Building for: ${CMAKE_SYSTEM} ${CMAKE_SYSTEM_PROCESSOR} ${CMAKE_LIBRARY_ARCHITECTURE}" )
2017-02-28 23:49:04 +00:00
2020-05-08 14:11:19 +00:00
include ( GNUInstallDirs )
2017-04-10 17:43:30 +00:00
2019-09-30 11:58:32 +00:00
# When testing for memory leaks with Valgrind, don't link tcmalloc or jemalloc.
2019-08-22 03:24:05 +00:00
2019-10-05 19:25:31 +00:00
if ( TARGET global-group )
install ( EXPORT global DESTINATION cmake )
endif ( )
2019-08-28 20:49:37 +00:00
2019-01-18 23:52:21 +00:00
add_subdirectory ( contrib EXCLUDE_FROM_ALL )
2019-09-30 11:58:32 +00:00
2020-07-09 07:25:42 +00:00
if ( NOT ENABLE_JEMALLOC )
message ( WARNING "Non default allocator is disabled. This is not recommended for production builds." )
2020-07-09 07:25:13 +00:00
endif ( )
2022-07-11 17:19:15 +00:00
macro ( clickhouse_add_executable target )
2019-09-30 11:58:32 +00:00
# invoke built-in add_executable
2019-12-05 11:22:43 +00:00
# explicitly acquire and interpose malloc symbols by clickhouse_malloc
2020-10-05 09:58:23 +00:00
# if GLIBC_COMPATIBILITY is ON and ENABLE_THINLTO is on than provide memcpy symbol explicitly to neutrialize thinlto's libcall generation.
2021-11-02 15:16:26 +00:00
if ( ARCH_AMD64 AND GLIBC_COMPATIBILITY AND ENABLE_THINLTO )
2022-07-11 17:19:15 +00:00
add_executable ( ${ ARGV } $< TARGET_OBJECTS:clickhouse_malloc > $< TARGET_OBJECTS:memcpy > )
2020-10-02 06:57:13 +00:00
else ( )
2022-07-11 17:19:15 +00:00
add_executable ( ${ ARGV } $< TARGET_OBJECTS:clickhouse_malloc > )
2020-10-01 17:19:05 +00:00
endif ( )
2020-10-02 06:57:13 +00:00
2019-09-30 11:58:32 +00:00
get_target_property ( type ${ target } TYPE )
if ( ${ type } STREQUAL EXECUTABLE )
2020-12-15 19:59:07 +00:00
# disabled for TSAN and gcc since libtsan.a provides overrides too
if ( TARGET clickhouse_new_delete )
# operator::new/delete for executables (MemoryTracker stuff)
2021-08-18 06:47:58 +00:00
target_link_libraries ( ${ target } PRIVATE clickhouse_new_delete )
2020-12-15 19:59:07 +00:00
endif ( )
2021-08-18 06:47:59 +00:00
# In case of static jemalloc, because zone_register() is located in zone.c and
# is never used outside (it is declared as constructor) it is omitted
# by the linker, and so jemalloc will not be registered as system
# allocator under osx [1], and clickhouse will SIGSEGV.
#
# [1]: https://github.com/jemalloc/jemalloc/issues/708
#
# About symbol name:
# - _zone_register not zone_register due to Mach-O binary format,
# - _je_zone_register due to JEMALLOC_PRIVATE_NAMESPACE=je_ under OS X.
# - but jemalloc-cmake does not run private_namespace.sh
# so symbol name should be _zone_register
2023-01-03 18:51:10 +00:00
if ( ENABLE_JEMALLOC AND OS_DARWIN )
2021-08-18 06:47:59 +00:00
set_property ( TARGET ${ target } APPEND PROPERTY LINK_OPTIONS -u_zone_register )
2020-12-15 19:59:07 +00:00
endif ( )
2019-09-30 11:58:32 +00:00
endif ( )
endmacro ( )
2022-09-13 20:09:39 +00:00
# With cross-compiling, all targets are built for the target platform which usually different from the host
# platform. This is problematic if a build artifact X (e.g. a file or an executable) is generated by running
# another executable Y previously produced in the build. This is solved by compiling and running Y for/on
2022-07-25 01:08:43 +00:00
# the host platform. Add target to the list:
# add_native_target(<target> ...)
set_property ( GLOBAL PROPERTY NATIVE_BUILD_TARGETS )
function ( add_native_target )
set_property ( GLOBAL APPEND PROPERTY NATIVE_BUILD_TARGETS ${ ARGV } )
endfunction ( add_native_target )
2022-09-28 08:28:47 +00:00
set ( CONFIG_INCLUDE_PATH ${ CMAKE_CURRENT_BINARY_DIR } /includes/configs CACHE INTERNAL "Path to generated configuration files." )
include_directories ( ${ CONFIG_INCLUDE_PATH } )
2020-04-01 23:51:21 +00:00
2020-05-09 22:59:34 +00:00
# Add as many warnings as possible for our own code.
include ( cmake/warnings.cmake )
2021-11-28 05:05:24 +00:00
include ( cmake/print_flags.cmake )
2020-05-09 22:59:34 +00:00
2022-09-13 20:09:39 +00:00
if ( ENABLE_RUST )
add_subdirectory ( rust )
endif ( )
2022-09-12 19:51:43 +00:00
2020-02-14 14:48:30 +00:00
add_subdirectory ( base )
2020-04-01 23:51:21 +00:00
add_subdirectory ( src )
2020-12-15 19:59:07 +00:00
add_subdirectory ( programs )
2020-04-01 23:51:21 +00:00
add_subdirectory ( tests )
add_subdirectory ( utils )
2017-01-18 14:03:30 +00:00
2022-11-16 06:20:24 +00:00
include ( cmake/sanitize_targets.cmake )
2022-07-21 03:09:05 +00:00
# Build native targets if necessary
get_property ( NATIVE_BUILD_TARGETS GLOBAL PROPERTY NATIVE_BUILD_TARGETS )
2022-09-13 20:09:39 +00:00
if ( NATIVE_BUILD_TARGETS
2022-07-25 01:08:43 +00:00
A N D NOT (
C M A K E _ H O S T _ S Y S T E M _ N A M E S T R E Q U A L C M A K E _ S Y S T E M _ N A M E
2022-07-21 03:09:05 +00:00
A N D C M A K E _ H O S T _ S Y S T E M _ P R O C E S S O R S T R E Q U A L C M A K E _ S Y S T E M _ P R O C E S S O R
2022-07-25 01:08:43 +00:00
)
2022-07-21 03:09:05 +00:00
)
message ( STATUS "Building native targets..." )
set ( NATIVE_BUILD_DIR "${CMAKE_BINARY_DIR}/native" )
execute_process (
C O M M A N D $ { C M A K E _ C O M M A N D } - E m a k e _ d i r e c t o r y " $ { N A T I V E _ B U I L D _ D I R } "
C O M M A N D _ E C H O S T D O U T )
execute_process (
C O M M A N D $ { C M A K E _ C O M M A N D }
" - D C M A K E _ C _ C O M P I L E R = $ { C M A K E _ C _ C O M P I L E R } "
" - D C M A K E _ C X X _ C O M P I L E R = $ { C M A K E _ C X X _ C O M P I L E R } "
2022-08-23 18:59:51 +00:00
" - D E N A B L E _ C C A C H E = $ { E N A B L E _ C C A C H E } "
2022-12-07 12:14:24 +00:00
# Avoid overriding .cargo/config.toml with native toolchain.
" - D E N A B L E _ R U S T = O F F "
2022-08-27 23:29:32 +00:00
" - D E N A B L E _ C L I C K H O U S E _ S E L F _ E X T R A C T I N G = $ { E N A B L E _ C L I C K H O U S E _ S E L F _ E X T R A C T I N G } "
2022-07-21 03:09:05 +00:00
$ { C M A K E _ S O U R C E _ D I R }
W O R K I N G _ D I R E C T O R Y " $ { N A T I V E _ B U I L D _ D I R } "
C O M M A N D _ E C H O S T D O U T )
execute_process (
C O M M A N D $ { C M A K E _ C O M M A N D } - - b u i l d " $ { N A T I V E _ B U I L D _ D I R } " - - t a r g e t $ { N A T I V E _ B U I L D _ T A R G E T S }
C O M M A N D _ E C H O S T D O U T )
endif ( )