2016-05-22 21:09:06 +08:00
project ( ClickHouse )
2017-02-22 20:45:02 +08:00
cmake_minimum_required ( VERSION 2.8 )
2016-02-08 05:58:58 +08:00
2017-02-06 23:15:19 +08:00
set ( CMAKE_MODULE_PATH ${ CMAKE_MODULE_PATH } "${ClickHouse_SOURCE_DIR}/cmake/Modules/" )
2017-01-13 19:25:44 +08:00
2016-12-24 09:03:10 +08:00
if ( CMAKE_CXX_COMPILER_ID STREQUAL "GNU" )
2017-07-22 06:45:05 +08: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 15:20:54 +08:00
endif ( )
2016-12-24 09:03:10 +08:00
elseif ( CMAKE_CXX_COMPILER_ID STREQUAL "Clang" )
2017-07-25 01:18:23 +08: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-22 06:45:05 +08:00
if ( CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4 )
2017-07-25 01:18:23 +08:00
message ( WARNING "Compilation has only been tested with Clang 4+" )
2017-04-01 15:20:54 +08:00
endif ( )
2016-12-02 06:44:59 +08:00
else ( )
2017-07-22 06:45:05 +08:00
message ( WARNING "You are using an unsupported compiler! Compilation has only been tested with Clang 4+ and GCC 6+." )
2016-12-02 06:44:59 +08:00
endif ( )
2016-05-23 06:41:03 +08:00
2016-12-24 09:03:10 +08:00
if ( CMAKE_SYSTEM MATCHES "FreeBSD" )
2017-04-01 15:20:54 +08:00
set ( PLATFORM_EXTRA_CXX_FLAG "-DCLOCK_MONOTONIC_COARSE=CLOCK_MONOTONIC_FAST" )
2016-12-02 06:44:59 +08:00
endif ( )
2016-05-28 04:18:34 +08:00
2016-12-07 00:51:34 +08:00
cmake_policy ( SET CMP0014 OLD ) # Ignore warning about CMakeLists.txt in each directory
cmake_policy ( SET CMP0012 NEW ) # Don't dereference TRUE and FALSE
2016-02-08 05:58:58 +08:00
2017-09-08 03:13:37 +08:00
# Write compile_commands.json
set ( CMAKE_EXPORT_COMPILE_COMMANDS 1 )
2017-09-09 08:32:34 +08:00
include ( cmake/find_ccache.cmake )
2017-07-27 03:13:53 +08:00
2017-04-13 02:41:53 +08:00
if ( NOT CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE STREQUAL "None" )
2017-04-01 15:20:54 +08:00
message ( STATUS "CMAKE_BUILD_TYPE is not set, set to default = RELWITHDEBINFO" )
set ( CMAKE_BUILD_TYPE "RELWITHDEBINFO" )
2016-12-02 06:44:59 +08:00
endif ( )
message ( STATUS "CMAKE_BUILD_TYPE: " ${ CMAKE_BUILD_TYPE } )
2016-02-08 05:58:58 +08:00
2016-07-28 22:14:18 +08:00
# ASan - build type with address sanitizer
# UBSan - build type with undefined behaviour sanitizer
2016-08-23 22:08:47 +08:00
# TSan is not supported due to false positive errors in libstdc++ and necessity to rebuild libstdc++ with TSan
2016-12-02 06:44:59 +08:00
set ( CMAKE_CONFIGURATION_TYPES "RelWithDebInfo;Debug;Release;MinSizeRel;ASan;UBSan" CACHE STRING "" FORCE )
2016-02-08 05:58:58 +08:00
2016-12-02 06:44:59 +08:00
if ( CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64.*|AARCH64.*)" )
2017-08-10 04:52:55 +08:00
set ( ARCH_AARCH64 1 )
2016-12-02 06:44:59 +08:00
endif ( )
2017-08-10 04:52:55 +08:00
if ( ARCH_AARCH64 OR CMAKE_SYSTEM_PROCESSOR MATCHES "arm" )
set ( ARCH_ARM 1 )
2017-07-30 03:58:10 +08:00
endif ( )
2017-09-02 01:21:03 +08: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-08 05:58:58 +08:00
2017-04-01 15:20:54 +08:00
set ( COMMON_WARNING_FLAGS "-Wall" ) # -Werror is also added inside directories with our own code.
2016-12-12 12:17:16 +08:00
set ( CXX_WARNING_FLAGS "-Wnon-virtual-dtor" )
2016-06-27 14:34:10 +08:00
2016-12-12 13:42:18 +08:00
set ( CXX11_ABI "ENABLE" CACHE STRING "Use C++11 ABI: DEFAULT, ENABLE, DISABLE" )
2016-12-09 23:39:50 +08:00
option ( TEST_COVERAGE "Enables flags for test coverage" OFF )
option ( ENABLE_TESTS "Enables tests" ON )
2016-06-27 14:34:10 +08:00
2016-12-09 23:39:50 +08:00
option ( USE_STATIC_LIBRARIES "Set to FALSE to use shared libraries" ON )
2017-03-27 20:26:24 +08:00
option ( MAKE_STATIC_LIBRARIES "Set to FALSE to make shared libraries" ${ USE_STATIC_LIBRARIES } )
2017-01-28 04:00:02 +08:00
if ( USE_STATIC_LIBRARIES )
2017-04-01 15:20:54 +08:00
list ( REVERSE CMAKE_FIND_LIBRARY_SUFFIXES )
2016-12-02 06:44:59 +08:00
endif ( )
2016-06-27 14:34:10 +08:00
2017-01-18 20:41:47 +08:00
option ( GLIBC_COMPATIBILITY "Set to TRUE to enable compatibility with older glibc libraries. Note that it is not compatible with ASan." OFF )
2016-06-27 14:34:10 +08:00
if ( GLIBC_COMPATIBILITY )
2017-04-01 15:20:54 +08:00
set ( GLIBC_COMPATIBILITY_COMPILE_FLAGS "-include ${ClickHouse_SOURCE_DIR}/libs/libcommon/include/common/glibc_compatibility.h" )
set ( GLIBC_COMPATIBILITY_LINK_FLAGS "-Wl,--wrap=memcpy" )
2016-12-02 06:44:59 +08:00
endif ( )
2016-06-27 14:34:10 +08:00
2016-12-24 09:03:10 +08:00
if ( CXX11_ABI STREQUAL ENABLE )
2017-04-01 15:20:54 +08:00
set ( CXX11_ABI_FLAGS "-D_GLIBCXX_USE_CXX11_ABI=1" )
2016-12-24 09:03:10 +08:00
elseif ( CXX11_ABI STREQUAL DISABLE )
2017-04-01 15:20:54 +08:00
set ( CXX11_ABI_FLAGS "-D_GLIBCXX_USE_CXX11_ABI=0" )
2016-12-08 14:34:16 +08:00
else ( )
2017-04-01 15:20:54 +08:00
set ( CXX11_ABI_FLAGS "" )
2016-12-02 06:44:59 +08:00
endif ( )
2016-06-27 14:34:10 +08:00
2017-09-09 08:06:06 +08:00
set ( COMPILER_FLAGS "${COMPILER_FLAGS} ${CXX11_ABI_FLAGS}" )
2017-01-17 22:03:37 +08:00
option ( PIPE "-pipe compiler option [less /tmp usage, more ram usage]" ON )
if ( PIPE )
2017-09-09 08:06:06 +08:00
set ( COMPILER_FLAGS "${COMPILER_FLAGS} -pipe" )
2017-01-17 22:03:37 +08:00
endif ( )
2017-01-28 03:55:33 +08:00
include ( cmake/test_cpu.cmake )
option ( ARCHNATIVE "Enable -march=native compiler flag" OFF )
if ( ARCHNATIVE )
2017-09-09 08:06:06 +08: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-28 03:55:33 +08:00
endif ( )
2016-12-02 06:44:59 +08:00
set ( CMAKE_BUILD_COLOR_MAKEFILE ON )
2017-04-01 16:31:34 +08:00
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMPILER_FLAGS} -std=gnu++1z ${PLATFORM_EXTRA_CXX_FLAG} -fno-omit-frame-pointer ${COMMON_WARNING_FLAGS} ${CXX_WARNING_FLAGS} ${GLIBC_COMPATIBILITY_COMPILE_FLAGS}" )
2017-01-26 06:24:36 +08: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 22:14:18 +08:00
2017-01-28 03:55:33 +08:00
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMPILER_FLAGS} -fno-omit-frame-pointer ${COMMON_WARNING_FLAGS} ${GLIBC_COMPATIBILITY_COMPILE_FLAGS}" )
2017-01-26 06:24:36 +08: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 22:58:01 +08:00
2016-12-24 09:03:10 +08:00
if ( NOT APPLE AND NOT ( CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_SYSTEM MATCHES "FreeBSD" ) )
2017-09-09 08:06:06 +08:00
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc" )
2017-09-09 09:01:36 +08:00
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libstdc++" )
2016-12-24 09:03:10 +08:00
endif ( )
2016-10-27 06:27:38 +08:00
if ( NOT APPLE )
2017-04-01 15:20:54 +08:00
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GLIBC_COMPATIBILITY_LINK_FLAGS} ${CXX11_ABI_FLAGS}" )
2017-09-09 08:06:06 +08:00
if ( USE_LIBCXX AND ( CMAKE_CXX_COMPILER_ID STREQUAL "Clang" ) )
2017-09-09 09:01:36 +08:00
link_libraries ( -Wl,-Bstatic -stdlib=libc++ c++ c++abi -Wl,-Bdynamic )
2017-09-09 08:06:06 +08:00
endif ( )
2016-12-07 00:51:34 +08:00
endif ( )
2016-02-08 05:58:58 +08:00
2017-01-30 21:40:04 +08:00
include ( cmake/test_compiler.cmake )
if ( USE_STATIC_LIBRARIES AND HAVE_NO_PIE )
2017-04-01 15:20:54 +08:00
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAG_NO_PIE}" )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FLAG_NO_PIE}" )
2017-01-14 04:11:21 +08:00
endif ( )
2017-03-27 20:26:24 +08:00
if ( NOT MAKE_STATIC_LIBRARIES )
2017-04-01 15:20:54 +08:00
set ( CMAKE_POSITION_INDEPENDENT_CODE ON )
2017-02-09 02:53:00 +08:00
endif ( )
2017-01-18 20:41:47 +08: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" )
if ( CMAKE_CXX_COMPILER_ID STREQUAL "GNU" )
2017-04-01 15:20:54 +08:00
# -fuse-ld=gold - fix linkage for gcc-5.4, gcc-6.1
# See more in http://stackoverflow.com/questions/37603238/fsanitize-not-using-gold-linker-in-gcc-6-1
set ( CMAKE_CXX_FLAGS_ASAN "${CMAKE_CXX_FLAGS_ASAN} -fuse-ld=gold" )
set ( CMAKE_C_FLAGS_ASAN "${CMAKE_C_FLAGS_ASAN} -fuse-ld=gold" )
2017-01-18 20:41:47 +08:00
endif ( )
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-02 06:44:59 +08:00
2017-09-10 14:51:27 +08: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-02 06:44:59 +08:00
# Flags for test coverage
if ( TEST_COVERAGE )
2017-04-01 15:20:54 +08:00
set ( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fprofile-arcs -ftest-coverage -DIS_DEBUG" )
2016-12-02 06:44:59 +08:00
endif ( TEST_COVERAGE )
if ( ENABLE_TESTS )
2017-04-01 15:20:54 +08:00
message ( STATUS "Tests are enabled" )
enable_testing ( )
2017-04-11 01:43:30 +08:00
endif ( )
2016-12-02 06:44:59 +08:00
2017-04-05 20:19:05 +08:00
# when installing to /usr - place configs to /etc but for /usr/local place to /usr/local/etc
2017-04-13 02:41:53 +08:00
if ( CMAKE_INSTALL_PREFIX STREQUAL "/usr" )
set ( CLICKHOUSE_ETC_DIR "/etc" )
2017-01-12 21:51:30 +08:00
else ( )
2017-04-13 02:41:53 +08:00
set ( CLICKHOUSE_ETC_DIR "${CMAKE_INSTALL_PREFIX}/etc" )
2016-12-24 09:03:10 +08:00
endif ( )
2017-03-01 07:49:04 +08:00
option ( UNBUNDLED "Try find all libraries in system (if fail - use bundled from contrib/)" OFF )
if ( UNBUNDLED )
2017-04-01 15:20:54 +08:00
set ( NOT_UNBUNDLED 0 )
2017-03-01 07:49:04 +08:00
else ( )
2017-04-01 15:20:54 +08:00
set ( NOT_UNBUNDLED 1 )
2017-03-01 07:49:04 +08:00
endif ( )
2017-06-23 22:41:07 +08:00
# Using system libs can cause lot of warnings in includes.
2017-09-02 01:21:03 +08:00
if ( UNBUNDLED OR NOT ( CMAKE_SYSTEM MATCHES "Linux" OR APPLE ) OR ARCH_32 )
2017-06-23 22:41:07 +08:00
option ( NO_WERROR "Disable -Werror compiler option" ON )
endif ( )
2017-03-01 07:49:04 +08:00
2017-09-09 08:32:34 +08: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-03-01 07:49:04 +08:00
2017-04-11 01:43:30 +08:00
include ( GNUInstallDirs )
2016-12-06 21:42:53 +08:00
include ( cmake/find_openssl.cmake )
2017-04-19 08:21:16 +08:00
if ( NOT OPENSSL_FOUND )
message ( FATAL_ERROR "Need openssl for build. debian tip: sudo apt install libssl-dev" )
endif ( )
2017-08-10 04:52:55 +08:00
include ( cmake/lib_name.cmake )
2017-01-26 02:19:15 +08:00
include ( cmake/find_icu4c.cmake )
2016-12-06 21:35:28 +08:00
include ( cmake/find_boost.cmake )
2017-04-19 08:21:16 +08:00
# openssl, zlib before poco
2017-02-08 05:28:13 +08:00
include ( cmake/find_zlib.cmake )
2017-03-01 07:49:04 +08:00
include ( cmake/find_zstd.cmake )
2017-01-13 19:25:44 +08:00
include ( cmake/find_poco.cmake )
2017-03-01 07:49:04 +08:00
include ( cmake/find_lz4.cmake )
include ( cmake/find_sparsehash.cmake )
2016-12-07 02:04:10 +08:00
include ( cmake/find_rt.cmake )
2017-01-26 02:19:15 +08:00
include ( cmake/find_readline_edit.cmake )
2017-03-01 07:49:04 +08:00
include ( cmake/find_zookeeper.cmake )
include ( cmake/find_re2.cmake )
2017-08-10 04:52:55 +08: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 22:41:07 +08:00
# Need to process before "contrib" dir:
2017-03-16 23:04:05 +08:00
include ( libs/libcommon/cmake/find_gperftools.cmake )
include ( libs/libcommon/cmake/find_jemalloc.cmake )
2017-06-23 22:41:07 +08:00
include ( libs/libcommon/cmake/find_cctz.cmake )
2017-04-19 08:25:57 +08:00
include ( libs/libmysqlxx/cmake/find_mysqlclient.cmake )
2017-06-23 22:41:07 +08:00
include ( libs/libdaemon/cmake/find_unwind.cmake )
2016-11-30 06:36:32 +08:00
2017-02-13 21:59:34 +08:00
set ( FULL_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE}}" )
set ( FULL_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}}" )
2017-01-26 06:24:36 +08: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-17 03:47:11 +08:00
# Directory for Yandex specific files
set ( CLICKHOUSE_PRIVATE_DIR ${ ClickHouse_SOURCE_DIR } /private/ )
2016-12-02 06:44:59 +08:00
if ( EXISTS ${ CLICKHOUSE_PRIVATE_DIR } )
2017-04-01 15:20:54 +08:00
add_subdirectory ( ${ CLICKHOUSE_PRIVATE_DIR } )
2016-12-02 06:44:59 +08:00
endif ( )
2016-06-27 16:13:54 +08:00
2017-01-18 22:03:30 +08:00
add_subdirectory ( contrib )
add_subdirectory ( libs )
add_subdirectory ( utils )
add_subdirectory ( dbms )
2016-12-07 02:04:10 +08:00
include ( cmake/print_include_directories.cmake )