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 )
2023-09-05 12:59:32 +00:00
include ( cmake/utils.cmake )
2019-08-30 16:50:43 +00:00
2023-11-20 00:55:34 +00:00
# This is needed to set up the CMAKE_INSTALL_BINDIR variable.
include ( GNUInstallDirs )
2019-08-28 20:49:37 +00:00
# Ignore export() since we don't use it,
2023-11-20 00:55:34 +00:00
# but it gets broken with global targets via link_libraries()
2019-08-28 20:49:37 +00:00
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
2023-05-06 16:33:45 +00:00
# -fsanitize=memory is too heavy
2023-04-11 16:16:26 +00:00
if ( SANITIZE STREQUAL "memory" )
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 ( 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 )
2023-08-24 23:22:39 +00:00
# We don't want to instrument everything with fuzzer, but only specific targets (see below),
2023-08-27 23:19:24 +00:00
# also, since we build our own llvm, we specifically don't want to instrument
2023-08-24 23:22:39 +00:00
# libFuzzer library itself - it would result in infinite recursion
#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
2023-03-17 13:27:48 +00:00
# --> available since CMake 3.24: https://stackoverflow.com/a/73349744
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
2023-03-17 13:27:48 +00:00
# See https://blog.llvm.org/posts/2021-04-05-constructor-homing-for-debug-info/
if ( CMAKE_BUILD_TYPE_UC STREQUAL "DEBUG" OR CMAKE_BUILD_TYPE_UC STREQUAL "RELWITHDEBINFO" )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Xclang -fuse-ctor-homing" )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Xclang -fuse-ctor-homing" )
2021-09-08 15:07:27 +00:00
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
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
2023-03-11 15:48:40 +00:00
if ( OS_LINUX )
# We should not export dynamic symbols, because:
# - The main clickhouse binary does not use dlopen,
# and whatever is poisoning it by LD_PRELOAD should not link to our symbols.
# - The clickhouse-odbc-bridge and clickhouse-library-bridge binaries
# should not expose their symbols to ODBC drivers and libraries.
2023-11-15 11:26:14 +00:00
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--no-export-dynamic -Wl,--gc-sections" )
2023-03-11 15:48:40 +00:00
endif ( )
2019-08-22 03:24:05 +00:00
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 ( )
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.
2023-03-27 12:13:32 +00:00
if ( LINKER_NAME MATCHES "lld" )
2019-09-17 09:49:27 +00:00
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gdb-index" )
message ( STATUS "Adding .gdb-index via --gdb-index linker option." )
endif ( )
2019-09-16 11:00:00 +00:00
endif ( )
2023-10-29 22:43:36 +00:00
if ( NOT ( SANITIZE_COVERAGE OR WITH_COVERAGE )
AND ( 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 " ) )
2022-06-29 16:21:28 +00:00
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
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)
2023-03-27 12:13:32 +00:00
if ( LINKER_NAME MATCHES "lld" )
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
2024-02-09 13:53:03 +00:00
# Query Profiler doesn't work on MacOS for several reasons
# - PHDR cache is not available
# - We use native functionality to get stacktraces which is not async signal safe
# and thus we don't need to generate asynchronous unwind tables
if ( NOT OS_DARWIN )
# 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" )
endif ( )
2021-04-24 22:29:48 +00:00
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 )
2023-05-18 15:23:39 +00:00
set ( COMPILER_FLAGS "${COMPILER_FLAGS} -ffile-prefix-map=${PROJECT_SOURCE_DIR}=." )
set ( CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -ffile-prefix-map=${PROJECT_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" )
2023-11-14 08:01:50 +00:00
if ( LINKER_NAME MATCHES "lld" )
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--time-trace" )
set ( CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--time-trace" )
endif ( )
2022-04-16 00:54:21 +00:00
else ( )
message ( ${ RECONFIGURE_MESSAGE_LEVEL } "Build profiling is only available with CLang" )
endif ( )
endif ( )
2023-03-10 10:54:46 +00:00
set ( CMAKE_CXX_STANDARD 23 )
2023-03-16 15:02:52 +00:00
set ( CMAKE_CXX_EXTENSIONS OFF )
2022-04-23 17:53:25 +00:00
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 )
2023-03-16 15:02:52 +00:00
set ( CMAKE_C_EXTENSIONS ON ) # required by most contribs written in C
2021-03-29 18:05:00 +00:00
set ( CMAKE_C_STANDARD_REQUIRED ON )
2017-11-02 21:30:27 +00:00
2023-04-11 16:16:26 +00:00
if ( COMPILER_CLANG )
2019-07-12 17:22:20 +00:00
# Enable C++14 sized global deallocation functions. It should be enabled by setting -std=c++14 but I'm not sure.
2023-03-17 13:27:48 +00:00
# See https://reviews.llvm.org/D112921
2019-07-12 17:22:20 +00:00
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsized-deallocation" )
2023-04-11 16:20:28 +00:00
# falign-functions=32 prevents from random performance regressions with the code change. Thus, providing more stable
# benchmarks.
2021-03-03 19:41:20 +00:00
set ( COMPILER_FLAGS "${COMPILER_FLAGS} -falign-functions=32" )
2023-04-11 16:20:28 +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" )
set ( COMPILER_FLAGS "${COMPILER_FLAGS} ${BRANCHES_WITHIN_32B_BOUNDARIES}" )
endif ( )
endif ( )
2020-03-18 18:54:27 +00:00
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.
2023-11-16 17:58:00 +00:00
set ( DEBUG_INFO_FLAGS "-g" )
2020-12-04 02:15:44 +00:00
2023-09-26 08:48:28 +00:00
# Disable omit frame pointer compiler optimization using -fno-omit-frame-pointer
option ( DISABLE_OMIT_FRAME_POINTER "Disable omit frame pointer compiler optimization" OFF )
if ( DISABLE_OMIT_FRAME_POINTER )
2023-10-30 16:16:25 +00:00
set ( CMAKE_CXX_FLAGS_ADD "${CMAKE_CXX_FLAGS_ADD} -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer" )
set ( CMAKE_C_FLAGS_ADD "${CMAKE_C_FLAGS_ADD} -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer" )
set ( CMAKE_ASM_FLAGS_ADD "${CMAKE_ASM_FLAGS_ADD} -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer" )
2023-09-26 08:48:28 +00:00
endif ( )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMPILER_FLAGS} ${CMAKE_CXX_FLAGS_ADD}" )
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
2024-01-19 02:59:05 +00:00
if ( NOT ENABLE_TESTS AND NOT SANITIZE AND NOT SANITIZE_COVERAGE AND OS_LINUX )
2020-09-15 20:17:24 +00:00
# https://clang.llvm.org/docs/ThinLTO.html
Disable ThinLTO on non-Linux
Cross-compiling on Linux for Mac failed with CMake parameters
-DCMAKE_BUILD_TYPE=None -DENABLE_CLICKHOUSE_SELF_EXTRACTING=1
-DENABLE_TESTS=0 (see below). This happened e.g. in #51243.
The problem was that ThinLTO enabled/disabled depends on ENABLE_TESTS
(see the top-level CMakeLists.txt). If ENABLE_TESTS=0 then ThinLTO is
activated. On Linux, building/linking works with or without ThinLTO but
on Mac building/linking the self-extracting compressor binary doesn’t
work if ThinLTO is on. This is quite weird, as a workaround restrict
ThinLTO to Linux.
-------
[185/187] Linking CXX static library base/glibc-compatibility/libglibc-compatibility.a
[186/187] Linking CXX static library contrib/zstd-cmake/lib_zstd.a
[187/187] Linking CXX executable utils/self-extracting-executable/pre_compressor
-- Configuring done
-- Generating done
-- Build files have been written to: /home/ubuntu/repo/ch4/build
[0/2] Re-checking globbed directories...
[108/108] Linking CXX executable utils/self-extracting-executable/pre_compressor
FAILED: utils/self-extracting-executable/pre_compressor
: && /usr/bin/clang++-16 --target=x86_64-apple-darwin -std=c++20 -fdiagnostics-color=always -Xclang -fuse-ctor-homing -Wno-enum-constexpr-conversion -fsized-deallocation -gdwarf-aranges -pipe -mssse3 -msse4.1 -msse4.2 -mpclmul -mpopcnt -fasynchronous-unwind-tables -ffile-prefix-map=/home/ubuntu/repo/ch4=. -falign-functions=32 -mbranches-within-32B-boundaries -stdlib=libc++ -fdiagnostics-absolute-paths -fstrict
-vtable-pointers -Wall -Wextra -Wframe-larger-than=65536 -Weverything -Wpedantic -Wno-zero-length-array -Wno-c++98-compat-pedantic -Wno-c++98-compat -Wno-c++20-compat -Wno-sign-conversion -Wno-implicit-int-conversion -Wno-implicit-int-float-conversion -Wno-ctad-maybe-unsupported -Wno-disabled-macro-expansion -Wno-documentation-unknown-command -Wno-double-promotion -Wno-exit-time-destructors -Wno-float-equal -Wn
o-global-constructors -Wno-missing-prototypes -Wno-missing-variable-declarations -Wno-padded -Wno-switch-enum -Wno-undefined-func-template -Wno-unused-template -Wno-vla -Wno-weak-template-vtables -Wno-weak-vtables -Wno-thread-safety-negative -Wno-enum-constexpr-conversion -Wno-unsafe-buffer-usage -O2 -g -DNDEBUG -O3 -g -gdwarf-4 -flto=thin -fwhole-program-vtables -isysroot /home/ubuntu/repo/ch4/cmake/darwin/..
/toolchain/darwin-x86_64 -mmacosx-version-min=10.15 -Wl,-headerpad_max_install_names --ld-path=/home/ubuntu/cctools/bin/x86_64-apple-darwin-ld -rdynamic -Wl,-U,_inside_main -flto=thin -fwhole-program-vtables utils/self-extracting-executable/CMakeFiles/pre_compressor.dir/compressor.cpp.o -o utils/self-extracting-executable/pre_compressor contrib/zstd-cmake/lib_zstd.a contrib/libcxx-cmake/libcxx.a contrib/lib
cxxabi-cmake/libcxxabi.a -nodefaultlibs -lc -lm -lpthread -ldl && :
clang: warning: argument unused during compilation: '-stdlib=libc++' [-Wunused-command-line-argument]
ld: warning: ignoring file utils/self-extracting-executable/CMakeFiles/pre_compressor.dir/compressor.cpp.o, building for macOS-x86_64 but attempting to link with file built for unknown-unsupported file format ( 0xDE 0xC0 0x17 0x0B 0x00 0x00 0x00 0x00 0x14 0x00 0x00 0x00 0x88 0x3E 0x03 0x00 )
ld: warning: ignoring file contrib/zstd-cmake/lib_zstd.a, building for macOS-x86_64 but attempting to link with file built for macOS-x86_64
ld: warning: ignoring file contrib/libcxxabi-cmake/libcxxabi.a, building for macOS-x86_64 but attempting to link with file built for unknown-unsupported file format ( 0x21 0x3C 0x61 0x72 0x63 0x68 0x3E 0x0A 0x23 0x31 0x2F 0x31 0x32 0x20 0x20 0x20 )
ld: warning: ignoring file contrib/libcxx-cmake/libcxx.a, building for macOS-x86_64 but attempting to link with file built for unknown-unsupported file format ( 0x21 0x3C 0x61 0x72 0x63 0x68 0x3E 0x0A 0x23 0x31 0x2F 0x31 0x32 0x20 0x20 0x20 )
Undefined symbols for architecture x86_64:
"_main", referenced from:
implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
2023-07-06 13:02:03 +00:00
# Applies to clang and linux only.
2020-09-15 20:17:24 +00:00
# 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-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 )
2023-05-01 20:37:33 +00:00
# We use mmap for allocations more heavily in debug builds,
# but GWP-ASan also wants to use mmap frequently,
# and due to a large number of memory mappings,
2023-04-16 14:01:41 +00:00
# it does not work together well.
2023-04-15 10:54:54 +00:00
if ( ( NOT OS_LINUX AND NOT OS_ANDROID ) OR ( CMAKE_BUILD_TYPE_UC STREQUAL "DEBUG" ) )
2023-01-17 22:06:44 +00:00
set ( ENABLE_GWP_ASAN OFF )
endif ( )
2023-05-01 22:05:36 +00:00
option ( ENABLE_FIU "Enable Fiu" ON )
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.
2023-03-17 13:27:48 +00:00
# TODO: Set CMAKE_COMPILE_WARNING_AS_ERROR (cmake 3.24)
2022-01-25 03:43:28 +00:00
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-04-25 13:45:23 +00:00
if ( NOT SANITIZE )
set ( CMAKE_POSITION_INDEPENDENT_CODE OFF )
2023-04-25 13:47:47 +00:00
endif ( )
2023-04-25 13:45:23 +00:00
if ( OS_LINUX AND NOT ( ARCH_AARCH64 OR ARCH_S390X ) AND NOT SANITIZE )
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
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 )
Improve performance of BLAKE3 by 11% by enabling LTO for Rust
LTO in Rust produces multiple definition of `rust_eh_personality' (and
few others), and to overcome this --allow-multiple-definition has been
added.
Query for benchmark:
SELECT ignore(BLAKE3(materialize('Lorem ipsum dolor sit amet, consectetur adipiscing elit'))) FROM numbers(1000000000) FORMAT `Null`
upstream : Elapsed: 2.494 sec. Processed 31.13 million rows, 249.08 MB (12.48 million rows/s., 99.86 MB/s.)
upstream + rust lto: Elapsed: 13.56 sec. Processed 191.9 million rows, 1.5400 GB (14.15 million rows/s., 113.22 MB/s.)
llvm BLAKE3 : Elapsed: 3.053 sec. Processed 43.24 million rows, 345.88 MB (14.16 million rows/s., 113.28 MB/s.)
Note, I thought about simply replacing it with BLAKE3 from LLVM, but:
- this will not solve LTO issues for Rust (and in future more libraries
could be added)
- it makes integrating_rust_libraries.md useless (and there is even blog
post)
So instead I've decided to add this quirk (--allow-multiple-definition)
to fix builds.
Signed-off-by: Azat Khuzhin <a.khuzhin@semrush.com>
2023-05-06 16:54:56 +00:00
# With LTO Rust adds few symbols with global visiblity, the most common is
# rust_eh_personality. And this leads to linking errors because multiple
# Rust libraries contains the same symbol.
#
# If it was shared library, that we could use version script for linker to
# hide this symbols, but libraries are static.
#
# we could in theory compile everything to one library but this will be a
# mess
#
# But this should be OK since CI has lots of other builds that are done
# without LTO and it will find multiple definitions if there will be any.
#
# More information about this behaviour in Rust can be found here
# - https://github.com/rust-lang/rust/issues/44322
# - https://alanwu.space/post/symbol-hygiene/
if ( ENABLE_THINLTO )
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--allow-multiple-definition" )
endif ( )
2022-09-13 20:09:39 +00:00
endif ( )
2022-09-12 19:51:43 +00:00
2024-01-19 04:26:14 +00:00
if ( CMAKE_BUILD_TYPE_UC STREQUAL "RELWITHDEBINFO" AND NOT SANITIZE AND NOT SANITIZE_COVERAGE AND OS_LINUX AND ( ARCH_AMD64 OR ARCH_AARCH64 ) )
2023-11-10 23:44:46 +00:00
set ( CHECK_LARGE_OBJECT_SIZES_DEFAULT ON )
else ( )
set ( CHECK_LARGE_OBJECT_SIZES_DEFAULT OFF )
endif ( )
option ( CHECK_LARGE_OBJECT_SIZES "Check that there are no large object files after build." ${ CHECK_LARGE_OBJECT_SIZES_DEFAULT } )
2020-02-14 14:48:30 +00:00
add_subdirectory ( base )
2020-04-03 15:14:31 +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 ( utils )
2017-01-18 14:03:30 +00:00
2023-08-24 23:22:39 +00:00
if ( FUZZER )
2023-08-27 19:47:11 +00:00
# Bundle fuzzers target
add_custom_target ( fuzzers )
2023-09-01 14:20:50 +00:00
# Instrument all targets fuzzer and link with libfuzzer
2023-08-24 23:22:39 +00:00
get_all_targets ( all_targets )
foreach ( target ${ all_targets } )
2023-09-01 14:20:50 +00:00
if ( NOT(target STREQUAL "_fuzzer" OR target STREQUAL "_fuzzer_no_main" ) )
get_target_property ( target_type ${ target } TYPE )
if ( NOT(target_type STREQUAL "INTERFACE_LIBRARY" OR target_type STREQUAL "UTILITY" ) )
target_compile_options ( ${ target } PRIVATE "-fsanitize=fuzzer-no-link" )
endif ( )
# clickhouse fuzzer isn't working correctly
# initial PR https://github.com/ClickHouse/ClickHouse/pull/27526
#if (target MATCHES ".+_fuzzer" OR target STREQUAL "clickhouse")
2023-09-05 12:59:32 +00:00
if ( target_type STREQUAL "EXECUTABLE" AND target MATCHES ".+_fuzzer" )
2023-09-01 14:20:50 +00:00
message ( STATUS "${target} instrumented with fuzzer" )
target_link_libraries ( ${ target } PUBLIC ch_contrib::fuzzer )
# Add to fuzzers bundle
add_dependencies ( fuzzers ${ target } )
2023-09-05 12:59:32 +00:00
get_target_filename ( ${ target } target_bin_name )
get_target_property ( target_bin_dir ${ target } BINARY_DIR )
add_custom_command ( TARGET fuzzers POST_BUILD COMMAND mv "${target_bin_dir}/${target_bin_name}" "${CMAKE_CURRENT_BINARY_DIR}/programs/" VERBATIM )
2023-08-28 02:05:43 +00:00
endif ( )
2023-08-24 23:22:39 +00:00
endif ( )
endforeach ( )
2023-09-11 19:06:00 +00:00
add_custom_command ( TARGET fuzzers POST_BUILD COMMAND SRC= ${ CMAKE_SOURCE_DIR } BIN= ${ CMAKE_BINARY_DIR } OUT= ${ CMAKE_BINARY_DIR } /programs ${ CMAKE_SOURCE_DIR } /tests/fuzz/build.sh VERBATIM )
2023-08-24 23:22:39 +00:00
endif ( )
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..." )
2023-05-18 15:23:39 +00:00
set ( NATIVE_BUILD_DIR "${PROJECT_BINARY_DIR}/native" )
2022-07-21 03:09:05 +00:00
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 } "
2023-03-29 14:52:04 +00:00
" - D C O M P I L E R _ C A C H E = $ { C O M P I L E R _ 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 } "
2023-05-18 15:23:39 +00:00
$ { P R O J E C T _ S O U R C E _ D I R }
2022-07-21 03:09:05 +00:00
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 ( )