2016-05-22 13:09:06 +00:00
project ( ClickHouse )
2017-02-22 12:45:02 +00:00
cmake_minimum_required ( VERSION 2.8 )
2016-02-07 21:58:58 +00:00
2017-02-06 15:15:19 +00:00
set ( CMAKE_MODULE_PATH ${ CMAKE_MODULE_PATH } "${ClickHouse_SOURCE_DIR}/cmake/Modules/" )
2017-01-13 11:25:44 +00:00
2016-12-24 01:03:10 +00:00
if ( CMAKE_CXX_COMPILER_ID STREQUAL "GNU" )
2017-07-21 22:45:05 +00:00
# Require at least gcc 6
if ( CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6 AND NOT CMAKE_VERSION VERSION_LESS 2.8.9 )
message ( FATAL_ERROR "GCC version must be at least 6! For example, if GCC 6 is available under gcc-6, g++-6 names, do the following: export CC=gcc-6 CXX=g++-6; rm -rf CMakeCache.txt CMakeFiles; and re run cmake or ./release." )
2017-04-01 07:20:54 +00:00
endif ( )
2016-12-24 01:03:10 +00:00
elseif ( CMAKE_CXX_COMPILER_ID STREQUAL "Clang" )
2017-07-24 17:18:23 +00:00
# Require at least clang 3.8
if ( CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.8 )
message ( FATAL_ERROR "Clang version must be at least 3.8! Recommended 4+" )
endif ( )
2017-07-21 22:45:05 +00:00
if ( CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4 )
2017-07-24 17:18:23 +00:00
message ( WARNING "Compilation has only been tested with Clang 4+" )
2017-04-01 07:20:54 +00:00
endif ( )
2016-12-01 22:44:59 +00:00
else ( )
2017-07-21 22:45:05 +00:00
message ( WARNING "You are using an unsupported compiler! Compilation has only been tested with Clang 4+ and GCC 6+." )
2016-12-01 22:44:59 +00:00
endif ( )
2016-05-22 22:41:03 +00:00
2016-12-24 01:03:10 +00:00
if ( CMAKE_SYSTEM MATCHES "FreeBSD" )
2017-04-01 07:20:54 +00:00
set ( PLATFORM_EXTRA_CXX_FLAG "-DCLOCK_MONOTONIC_COARSE=CLOCK_MONOTONIC_FAST" )
2016-12-01 22:44:59 +00:00
endif ( )
2016-05-27 20:18:34 +00:00
2017-09-07 19:13:37 +00:00
# Write compile_commands.json
set ( CMAKE_EXPORT_COMPILE_COMMANDS 1 )
2017-09-09 00:32:34 +00:00
include ( cmake/find_ccache.cmake )
2017-07-26 19:13:53 +00:00
2017-04-12 18:41:53 +00:00
if ( NOT CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE STREQUAL "None" )
2017-04-01 07:20:54 +00:00
message ( STATUS "CMAKE_BUILD_TYPE is not set, set to default = RELWITHDEBINFO" )
set ( CMAKE_BUILD_TYPE "RELWITHDEBINFO" )
2016-12-01 22:44:59 +00:00
endif ( )
2017-09-11 15:51:32 +00:00
string ( TOUPPER ${ CMAKE_BUILD_TYPE } CMAKE_BUILD_TYPE_UC )
2016-12-01 22:44:59 +00:00
message ( STATUS "CMAKE_BUILD_TYPE: " ${ CMAKE_BUILD_TYPE } )
2016-02-07 21:58:58 +00:00
2016-07-28 14:14:18 +00:00
# ASan - build type with address sanitizer
# UBSan - build type with undefined behaviour sanitizer
2016-08-23 14:08:47 +00:00
# TSan is not supported due to false positive errors in libstdc++ and necessity to rebuild libstdc++ with TSan
2016-12-01 22:44:59 +00:00
set ( CMAKE_CONFIGURATION_TYPES "RelWithDebInfo;Debug;Release;MinSizeRel;ASan;UBSan" CACHE STRING "" FORCE )
2016-02-07 21:58:58 +00:00
2016-12-01 22:44:59 +00:00
if ( CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64.*|AARCH64.*)" )
2017-08-09 20:52:55 +00:00
set ( ARCH_AARCH64 1 )
2016-12-01 22:44:59 +00:00
endif ( )
2017-08-09 20:52:55 +00:00
if ( ARCH_AARCH64 OR CMAKE_SYSTEM_PROCESSOR MATCHES "arm" )
set ( ARCH_ARM 1 )
2017-07-29 19:58:10 +00:00
endif ( )
2017-09-01 17:21:03 +00:00
if ( CMAKE_LIBRARY_ARCHITECTURE MATCHES "i386" )
set ( ARCH_I386 1 )
endif ( )
if ( ( ARCH_ARM AND NOT ARCH_AARCH64 ) OR ARCH_I386 )
set ( ARCH_32 1 )
message ( WARNING "Support 32bit platforms is highly experimental" )
endif ( )
2016-02-07 21:58:58 +00:00
2017-04-01 07:20:54 +00:00
set ( COMMON_WARNING_FLAGS "-Wall" ) # -Werror is also added inside directories with our own code.
2016-12-12 04:17:16 +00:00
set ( CXX_WARNING_FLAGS "-Wnon-virtual-dtor" )
2016-06-27 06:34:10 +00:00
2016-12-12 05:42:18 +00:00
set ( CXX11_ABI "ENABLE" CACHE STRING "Use C++11 ABI: DEFAULT, ENABLE, DISABLE" )
2016-12-09 15:39:50 +00:00
option ( TEST_COVERAGE "Enables flags for test coverage" OFF )
option ( ENABLE_TESTS "Enables tests" ON )
2016-06-27 06:34:10 +00:00
2016-12-09 15:39:50 +00:00
option ( USE_STATIC_LIBRARIES "Set to FALSE to use shared libraries" ON )
2017-03-27 12:26:24 +00:00
option ( MAKE_STATIC_LIBRARIES "Set to FALSE to make shared libraries" ${ USE_STATIC_LIBRARIES } )
2017-01-27 20:00:02 +00:00
if ( USE_STATIC_LIBRARIES )
2017-04-01 07:20:54 +00:00
list ( REVERSE CMAKE_FIND_LIBRARY_SUFFIXES )
2016-12-01 22:44:59 +00:00
endif ( )
2016-06-27 06:34:10 +00:00
2017-09-16 22:41:20 +00:00
if ( CMAKE_SYSTEM_PROCESSOR MATCHES "amd64.*|x86_64.*|AMD64.*" )
option ( USE_INTERNAL_MEMCPY "Use internal implementation of 'memcpy' function instead of provided by libc. Only for x86_64." ON )
if ( CMAKE_SYSTEM MATCHES "Linux" )
option ( GLIBC_COMPATIBILITY "Set to TRUE to enable compatibility with older glibc libraries. Only for x86_64, Linux. Implies USE_INTERNAL_MEMCPY." ON )
endif ( )
endif ( )
2017-01-18 12:41:47 +00:00
2016-06-27 06:34:10 +00:00
if ( GLIBC_COMPATIBILITY )
2017-09-15 05:27:09 +00:00
set ( USE_INTERNAL_MEMCPY ON )
2016-12-01 22:44:59 +00:00
endif ( )
2016-06-27 06:34:10 +00:00
2016-12-24 01:03:10 +00:00
if ( CXX11_ABI STREQUAL ENABLE )
2017-04-01 07:20:54 +00:00
set ( CXX11_ABI_FLAGS "-D_GLIBCXX_USE_CXX11_ABI=1" )
2016-12-24 01:03:10 +00:00
elseif ( CXX11_ABI STREQUAL DISABLE )
2017-04-01 07:20:54 +00:00
set ( CXX11_ABI_FLAGS "-D_GLIBCXX_USE_CXX11_ABI=0" )
2016-12-08 06:34:16 +00:00
else ( )
2017-04-01 07:20:54 +00:00
set ( CXX11_ABI_FLAGS "" )
2016-12-01 22:44:59 +00:00
endif ( )
2016-06-27 06:34:10 +00:00
2017-09-09 00:06:06 +00:00
set ( COMPILER_FLAGS "${COMPILER_FLAGS} ${CXX11_ABI_FLAGS}" )
2017-01-17 14:03:37 +00:00
2017-11-12 16:45:30 +00:00
find_program ( LLD_PATH NAMES lld )
find_program ( GOLD_PATH NAMES gold )
2017-11-12 12:58:40 +00:00
2017-11-12 16:45:30 +00:00
if ( CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND LLD_PATH )
set ( LINKER_NAME "lld" )
elseif ( GOLD_PATH )
set ( LINKER_NAME "gold" )
endif ( )
if ( LINKER_NAME )
message ( STATUS "Using linker: ${LINKER_NAME}" )
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=${LINKER_NAME}" )
2017-11-12 12:58:40 +00:00
endif ( )
2017-01-17 14:03:37 +00:00
option ( PIPE "-pipe compiler option [less /tmp usage, more ram usage]" ON )
if ( PIPE )
2017-09-09 00:06:06 +00:00
set ( COMPILER_FLAGS "${COMPILER_FLAGS} -pipe" )
2017-01-17 14:03:37 +00:00
endif ( )
2017-01-27 19:55:33 +00:00
include ( cmake/test_cpu.cmake )
option ( ARCHNATIVE "Enable -march=native compiler flag" OFF )
if ( ARCHNATIVE )
2017-09-09 00:06:06 +00:00
set ( COMPILER_FLAGS "${COMPILER_FLAGS} -march=native" )
endif ( )
option ( USE_LIBCXX "Use libc++ and libc++abi instead of libstdc++ (only make sense on Linux with Clang)" OFF )
if ( USE_LIBCXX )
set ( COMPILER_FLAGS "${COMPILER_FLAGS} -pthread" ) # NOTE: Why this is not the default and why this is needed only with libc++?
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++" )
set ( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_LIBCPP_DEBUG=1" ) # More checks in debug build.
2017-01-27 19:55:33 +00:00
endif ( )
2017-09-15 10:12:50 +00:00
# Special options for better optimized code with clang
2017-09-16 22:33:05 +00:00
#if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
# set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -Wno-unused-command-line-argument -mllvm -inline-threshold=10000")
#endif ()
2017-09-15 10:12:50 +00:00
2017-11-02 21:30:27 +00:00
if ( CMAKE_VERSION VERSION_LESS "3.8.0" )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++1z" )
else ( )
set ( CMAKE_CXX_STANDARD 17 )
set ( CMAKE_CXX_STANDARD_REQUIRED ON )
set ( CXX_FLAGS_INTERNAL_COMPILER "-std=gnu++1z" )
endif ( )
2016-12-01 22:44:59 +00:00
set ( CMAKE_BUILD_COLOR_MAKEFILE ON )
2017-11-02 21:30:27 +00:00
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMPILER_FLAGS} ${PLATFORM_EXTRA_CXX_FLAG} -fno-omit-frame-pointer ${COMMON_WARNING_FLAGS} ${CXX_WARNING_FLAGS} ${GLIBC_COMPATIBILITY_COMPILE_FLAGS}" )
2017-01-25 22:24:36 +00:00
#set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
set ( CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -O3" )
set ( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -g3 -ggdb3 -fno-inline" )
2016-07-28 14:14:18 +00:00
2017-01-27 19:55:33 +00:00
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMPILER_FLAGS} -fno-omit-frame-pointer ${COMMON_WARNING_FLAGS} ${GLIBC_COMPATIBILITY_COMPILE_FLAGS}" )
2017-01-25 22:24:36 +00:00
#set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
set ( CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -O3" )
set ( CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0 -g3 -ggdb3 -fno-inline" )
2016-08-25 14:58:01 +00:00
2016-12-24 01:03:10 +00:00
if ( NOT APPLE AND NOT ( CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_SYSTEM MATCHES "FreeBSD" ) )
2017-09-09 00:06:06 +00:00
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc" )
2017-09-09 01:01:36 +00:00
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libstdc++" )
2016-12-24 01:03:10 +00:00
endif ( )
2016-10-26 22:27:38 +00:00
if ( NOT APPLE )
2017-04-01 07:20:54 +00:00
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GLIBC_COMPATIBILITY_LINK_FLAGS} ${CXX11_ABI_FLAGS}" )
2017-09-09 00:06:06 +00:00
if ( USE_LIBCXX AND ( CMAKE_CXX_COMPILER_ID STREQUAL "Clang" ) )
2017-09-09 01:01:36 +00:00
link_libraries ( -Wl,-Bstatic -stdlib=libc++ c++ c++abi -Wl,-Bdynamic )
2017-09-09 00:06:06 +00:00
endif ( )
2016-12-06 16:51:34 +00:00
endif ( )
2016-02-07 21:58:58 +00:00
2017-01-30 13:40:04 +00:00
include ( cmake/test_compiler.cmake )
if ( USE_STATIC_LIBRARIES AND HAVE_NO_PIE )
2017-04-01 07:20:54 +00:00
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAG_NO_PIE}" )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FLAG_NO_PIE}" )
2017-01-13 20:11:21 +00:00
endif ( )
2017-03-27 12:26:24 +00:00
if ( NOT MAKE_STATIC_LIBRARIES )
2017-04-01 07:20:54 +00:00
set ( CMAKE_POSITION_INDEPENDENT_CODE ON )
2017-02-08 18:53:00 +00:00
endif ( )
2017-01-18 12:41:47 +00:00
set ( SAN_FLAGS "-O3 -g -fno-omit-frame-pointer" )
set ( CMAKE_CXX_FLAGS_ASAN "${CMAKE_CXX_FLAGS_ASAN} ${SAN_FLAGS} -fsanitize=address" )
set ( CMAKE_C_FLAGS_ASAN "${CMAKE_C_FLAGS_ASAN} ${SAN_FLAGS} -fsanitize=address" )
set ( CMAKE_CXX_FLAGS_UBSAN "${CMAKE_CXX_FLAGS_UBSAN} ${SAN_FLAGS} -fsanitize=undefined" )
set ( CMAKE_C_FLAGS_UBSAN "${CMAKE_C_FLAGS_UBSAN} ${SAN_FLAGS} -fsanitize=undefined" )
set ( CMAKE_CXX_FLAGS_MSAN "${CMAKE_CXX_FLAGS_MSAN} ${SAN_FLAGS} -fsanitize=memory" )
set ( CMAKE_C_FLAGS_MSAN "${CMAKE_C_FLAGS_MSAN} ${SAN_FLAGS} -fsanitize=memory" )
set ( CMAKE_CXX_FLAGS_TSAN "${CMAKE_CXX_FLAGS_TSAN} ${SAN_FLAGS} -fsanitize=thread" )
set ( CMAKE_C_FLAGS_TSAN "${CMAKE_C_FLAGS_TSAN} ${SAN_FLAGS} -fsanitize=thread" )
2016-12-01 22:44:59 +00:00
2017-09-10 06:51:27 +00:00
# Using "include-what-you-use" tool.
option ( USE_INCLUDE_WHAT_YOU_USE "Use 'include-what-you-use' tool" OFF )
if ( USE_INCLUDE_WHAT_YOU_USE )
find_program ( IWYU_PATH NAMES include-what-you-use iwyu )
if ( NOT IWYU_PATH )
message ( FATAL_ERROR "Could not find the program include-what-you-use" )
endif ( )
if ( ${ CMAKE_VERSION } VERSION_LESS "3.3.0" )
message ( FATAL_ERROR "include-what-you-use requires CMake version at least 3.3." )
endif ( )
endif ( )
2016-12-01 22:44:59 +00:00
# Flags for test coverage
if ( TEST_COVERAGE )
2017-04-01 07:20:54 +00:00
set ( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fprofile-arcs -ftest-coverage -DIS_DEBUG" )
2016-12-01 22:44:59 +00:00
endif ( TEST_COVERAGE )
if ( ENABLE_TESTS )
2017-04-01 07:20:54 +00:00
message ( STATUS "Tests are enabled" )
enable_testing ( )
2017-04-10 17:43:30 +00:00
endif ( )
2016-12-01 22:44:59 +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 ( )
2017-02-28 23:49:04 +00:00
option ( UNBUNDLED "Try find all libraries in system (if fail - use bundled from contrib/)" OFF )
if ( UNBUNDLED )
2017-04-01 07:20:54 +00:00
set ( NOT_UNBUNDLED 0 )
2017-02-28 23:49:04 +00:00
else ( )
2017-04-01 07:20:54 +00:00
set ( NOT_UNBUNDLED 1 )
2017-02-28 23:49:04 +00:00
endif ( )
2017-09-15 07:24:53 +00:00
# Using system libs can cause lot of warnings in includes.
2017-09-01 17:21:03 +00:00
if ( UNBUNDLED OR NOT ( CMAKE_SYSTEM MATCHES "Linux" OR APPLE ) OR ARCH_32 )
2017-06-23 14:41:07 +00:00
option ( NO_WERROR "Disable -Werror compiler option" ON )
endif ( )
2017-02-28 23:49:04 +00:00
2017-09-09 00:32:34 +00:00
message ( STATUS "Building for: ${CMAKE_SYSTEM} ${CMAKE_SYSTEM_PROCESSOR} ${CMAKE_LIBRARY_ARCHITECTURE} ; USE_STATIC_LIBRARIES=${USE_STATIC_LIBRARIES} MAKE_STATIC_LIBRARIES=${MAKE_STATIC_LIBRARIES} UNBUNDLED=${UNBUNDLED} CCACHE=${CCACHE_FOUND} ${CCACHE_VERSION}" )
2017-02-28 23:49:04 +00:00
2017-04-10 17:43:30 +00:00
include ( GNUInstallDirs )
2016-12-06 13:42:53 +00:00
include ( cmake/find_openssl.cmake )
2017-04-19 00:21:16 +00:00
if ( NOT OPENSSL_FOUND )
message ( FATAL_ERROR "Need openssl for build. debian tip: sudo apt install libssl-dev" )
endif ( )
2017-08-09 20:52:55 +00:00
include ( cmake/lib_name.cmake )
2017-01-25 18:19:15 +00:00
include ( cmake/find_icu4c.cmake )
2016-12-06 13:35:28 +00:00
include ( cmake/find_boost.cmake )
2017-04-19 00:21:16 +00:00
# openssl, zlib before poco
2017-02-07 21:28:13 +00:00
include ( cmake/find_zlib.cmake )
2017-02-28 23:49:04 +00:00
include ( cmake/find_zstd.cmake )
2017-01-13 11:25:44 +00:00
include ( cmake/find_poco.cmake )
2017-02-28 23:49:04 +00:00
include ( cmake/find_lz4.cmake )
include ( cmake/find_sparsehash.cmake )
2016-12-06 18:04:10 +00:00
include ( cmake/find_rt.cmake )
2017-01-25 18:19:15 +00:00
include ( cmake/find_readline_edit.cmake )
2017-02-28 23:49:04 +00:00
include ( cmake/find_zookeeper.cmake )
include ( cmake/find_re2.cmake )
2017-10-06 04:40:18 +00:00
include ( cmake/find_rdkafka.cmake )
2017-10-04 00:00:22 +00:00
include ( cmake/find_capnp.cmake )
2017-11-12 12:58:40 +00:00
include ( cmake/find_llvm.cmake )
2017-08-09 20:52:55 +00:00
include ( cmake/find_contrib_lib.cmake )
find_contrib_lib ( cityhash )
find_contrib_lib ( farmhash )
find_contrib_lib ( metrohash )
find_contrib_lib ( btrie )
find_contrib_lib ( double-conversion )
2017-06-23 14:41:07 +00:00
# Need to process before "contrib" dir:
2017-10-24 19:18:15 +00:00
include ( libs/libcommon/cmake/find_gperftools.cmake )
2017-03-16 15:04:05 +00:00
include ( libs/libcommon/cmake/find_jemalloc.cmake )
2017-06-23 14:41:07 +00:00
include ( libs/libcommon/cmake/find_cctz.cmake )
2017-04-19 00:25:57 +00:00
include ( libs/libmysqlxx/cmake/find_mysqlclient.cmake )
2017-06-23 14:41:07 +00:00
include ( libs/libdaemon/cmake/find_unwind.cmake )
2016-11-29 22:36:32 +00:00
2017-09-11 15:51:32 +00:00
set ( FULL_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UC}}" )
set ( FULL_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE_UC}}" )
2017-01-25 22:24:36 +00:00
message ( STATUS "C_FLAGS = ${FULL_C_FLAGS}" )
message ( STATUS "CXX_FLAGS = ${FULL_CXX_FLAGS}" )
message ( STATUS "LINK_FLAGS = ${CMAKE_EXE_LINKER_FLAGS}" )
2017-01-16 19:47:11 +00:00
# Directory for Yandex specific files
set ( CLICKHOUSE_PRIVATE_DIR ${ ClickHouse_SOURCE_DIR } /private/ )
2016-12-01 22:44:59 +00:00
if ( EXISTS ${ CLICKHOUSE_PRIVATE_DIR } )
2017-04-01 07:20:54 +00:00
add_subdirectory ( ${ CLICKHOUSE_PRIVATE_DIR } )
2016-12-01 22:44:59 +00:00
endif ( )
2016-06-27 08:13:54 +00:00
2017-01-18 14:03:30 +00:00
add_subdirectory ( contrib )
add_subdirectory ( libs )
add_subdirectory ( utils )
add_subdirectory ( dbms )
2016-12-06 18:04:10 +00:00
include ( cmake/print_include_directories.cmake )