2016-05-22 13:09:06 +00:00
project ( ClickHouse )
2016-12-01 22:44:59 +00:00
cmake_minimum_required ( VERSION 2.6 )
2016-02-07 21:58:58 +00:00
2016-12-24 01:03:10 +00:00
if ( CMAKE_CXX_COMPILER_ID STREQUAL "GNU" )
2016-12-01 22:44:59 +00:00
# Require at least gcc 5
2016-12-06 16:51:34 +00:00
if ( CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5 AND NOT CMAKE_VERSION VERSION_LESS 2.8.9 )
2016-12-01 22:44:59 +00:00
message ( FATAL_ERROR "GCC version must be at least 5! For example, if GCC 5 is available under gcc-5, g++-5 names, do the following: export CC=gcc-5 CXX=g++-5; rm -rf CMakeCache.txt CMakeFiles; and re run cmake or ./release." )
endif ( )
2016-12-24 01:03:10 +00:00
elseif ( CMAKE_CXX_COMPILER_ID STREQUAL "Clang" )
2016-12-01 22:44:59 +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!" )
endif ( )
else ( )
message ( WARNING "You are using an unsupported compiler! Compilation has only been tested with Clang 3.8+ and GCC 5+." )
endif ( )
2016-05-22 22:41:03 +00:00
2016-10-26 22:27:38 +00:00
if ( APPLE )
2016-12-24 01:03:10 +00:00
set ( PLATFORM_EXTRA_CXX_FLAG "-Dexp10=__exp10" ) # Also needed for libc++
endif ( )
if ( CMAKE_SYSTEM MATCHES "FreeBSD" )
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
2016-12-06 16:51:34 +00: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-07 21:58:58 +00:00
2016-12-01 22:44:59 +00:00
if ( NOT CMAKE_BUILD_TYPE )
message ( STATUS "CMAKE_BUILD_TYPE is not set, set to default = RELWITHDEBINFO" )
set ( CMAKE_BUILD_TYPE "RELWITHDEBINFO" )
endif ( )
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-07-28 14:14:18 +00:00
2016-12-01 22:44:59 +00:00
if ( CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64.*|AARCH64.*)" )
set ( AARCH64 1 )
endif ( )
2016-02-07 21:58:58 +00:00
2016-12-01 22:44:59 +00:00
if ( NOT AARCH64 )
set ( MACHINE_FLAGS "-msse4 -mpopcnt" )
endif ( )
2016-02-07 21:58:58 +00:00
2016-12-01 22:44:59 +00:00
set ( COMMON_WARNING_FLAGS "-Wall -Werror" )
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 )
2016-12-01 22:44:59 +00:00
if ( NOT $ENV{ USE_STATIC_LIBRARIES } )
set ( USE_STATIC_LIBRARIES FALSE )
endif ( )
2016-06-27 06:34:10 +00:00
2016-12-12 16:17:23 +00:00
2016-12-12 04:17:16 +00:00
set ( USE_INTERNAL_BOOST_LIBRARY TRUE CACHE BOOL "Set to FALSE to use system boost library instead of bundled" )
if ( NOT $ENV{ USE_INTERNAL_BOOST_LIBRARY } )
set ( USE_INTERNAL_BOOST_LIBRARY FALSE )
endif ( )
2016-12-17 21:54:30 +00:00
if ( USE_INTERNAL_BOOST_LIBRARY )
add_definitions ( -DBOOST_SYSTEM_NO_DEPRECATED )
endif ( )
2016-12-09 15:39:50 +00: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 06:34:10 +00:00
if ( $ENV{ GLIBC_COMPATIBILITY } )
set ( GLIBC_COMPATIBILITY TRUE )
2016-12-01 22:44:59 +00:00
endif ( )
2016-12-09 15:39:50 +00:00
option ( ENABLE_LIBTCMALLOC "Set to TRUE to enable libtcmalloc." ON )
2016-12-01 22:44:59 +00:00
if ( NOT $ENV{ ENABLE_LIBTCMALLOC } )
set ( ENABLE_LIBTCMALLOC FALSE )
endif ( )
2016-12-09 15:39:50 +00:00
option ( DEBUG_LIBTCMALLOC "Set to TRUE to use debug version of libtcmalloc." OFF )
2016-12-01 22:44:59 +00:00
if ( $ENV{ DEBUG_LIBTCMALLOC } )
2016-12-12 15:23:21 +00:00
set ( DEBUG_LIBTCMALLOC TRUE )
2016-12-01 22:44:59 +00:00
endif ( )
2016-06-27 06:34:10 +00:00
if ( GLIBC_COMPATIBILITY )
2016-12-01 22:44:59 +00: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" )
endif ( )
2016-06-27 06:34:10 +00:00
2016-12-24 01:03:10 +00:00
if ( CXX11_ABI STREQUAL ENABLE )
2016-12-08 06:34:16 +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 )
2016-12-08 06:34:16 +00:00
set ( CXX11_ABI_FLAGS "-D_GLIBCXX_USE_CXX11_ABI=0" )
else ( )
set ( CXX11_ABI_FLAGS "" )
2016-12-01 22:44:59 +00:00
endif ( )
2016-06-27 06:34:10 +00:00
2016-12-01 22:44:59 +00:00
set ( CMAKE_BUILD_COLOR_MAKEFILE ON )
2016-12-24 01:03:10 +00:00
set ( CMAKE_CXX_FLAGS "-std=gnu++1y ${PLATFORM_EXTRA_CXX_FLAG} -fno-omit-frame-pointer ${COMMON_WARNING_FLAGS} ${CXX_WARNING_FLAGS} ${MACHINE_FLAGS} ${GLIBC_COMPATIBILITY_COMPILE_FLAGS} ${CXX11_ABI_FLAGS}" )
2016-12-01 22:44:59 +00:00
set ( CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG" )
set ( CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 -g" )
set ( CMAKE_CXX_FLAGS_DEBUG "-O0 -g3 -ggdb3 -fno-inline" )
2016-07-28 14:14:18 +00:00
2016-12-08 06:34:16 +00:00
set ( CMAKE_C_FLAGS "-fno-omit-frame-pointer ${COMMON_WARNING_FLAGS} ${MACHINE_FLAGS} ${GLIBC_COMPATIBILITY_COMPILE_FLAGS} ${CXX11_ABI_FLAGS}" )
2016-12-01 22:44:59 +00:00
set ( CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG" )
set ( CMAKE_C_FLAGS_RELWITHDEBINFO "-O3 -g" )
set ( 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" ) )
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++" )
endif ( )
2016-10-26 22:27:38 +00:00
if ( NOT APPLE )
2016-12-24 01:03:10 +00:00
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GLIBC_COMPATIBILITY_LINK_FLAGS} ${CXX11_ABI_FLAGS}" )
2016-12-06 16:51:34 +00:00
endif ( )
2016-02-07 21:58:58 +00:00
2016-12-08 06:34:16 +00:00
# -fuse-ld=gold - fix linkage for gcc-5.4, gcc-6.1
2016-12-01 22:44:59 +00:00
# See more in http://stackoverflow.com/questions/37603238/fsanitize-not-using-gold-linker-in-gcc-6-1
2016-12-08 06:34:16 +00:00
set ( CMAKE_CXX_FLAGS_ASAN "-O3 -g -fsanitize=address -fno-omit-frame-pointer -fuse-ld=gold ${CXX11_ABI_FLAGS}" )
set ( CMAKE_CXX_FLAGS_UBSAN "-O3 -g -fsanitize=undefined -fno-omit-frame-pointer ${CXX11_ABI_FLAGS}" )
set ( CMAKE_C_FLAGS_ASAN "-O3 -g -fsanitize=address -fno-omit-frame-pointer -fuse-ld=gold ${CXX11_ABI_FLAGS}" )
set ( CMAKE_C_FLAGS_UBSAN "-O3 -g -fsanitize=undefined -fno-omit-frame-pointer ${CXX11_ABI_FLAGS}" )
2016-12-01 22:44:59 +00:00
# Flags for test coverage
if ( TEST_COVERAGE )
2016-12-08 06:34:16 +00:00
set ( CMAKE_CXX_FLAGS_DEBUG "-O0 -g -fprofile-arcs -ftest-coverage -fPIC -DIS_DEBUG ${CXX11_ABI_FLAGS}" )
2016-12-01 22:44:59 +00:00
endif ( TEST_COVERAGE )
# Run tests with "make check"
if ( ENABLE_TESTS )
message ( STATUS "Tests are enabled" )
2016-12-06 13:46:21 +00:00
include ( cmake/add_check.cmake )
2016-12-01 22:44:59 +00:00
endif ( ENABLE_TESTS )
# Installation prefix
2016-12-24 01:03:10 +00:00
if ( NOT CMAKE_SYSTEM MATCHES "FreeBSD" )
set ( CMAKE_INSTALL_PREFIX /usr )
endif ( )
include_directories ( BEFORE ${ ClickHouse_SOURCE_DIR } /contrib/libcityhash/include/ )
include_directories ( BEFORE ${ ClickHouse_SOURCE_DIR } /contrib/liblz4/include/ )
include_directories ( BEFORE ${ ClickHouse_SOURCE_DIR } /contrib/libdivide/ )
include_directories ( BEFORE ${ ClickHouse_SOURCE_DIR } /contrib/libdouble-conversion/ )
include_directories ( BEFORE ${ ClickHouse_SOURCE_DIR } /contrib/libcpuid/include/ )
include_directories ( BEFORE ${ ClickHouse_SOURCE_DIR } /contrib/libzstd/include/ )
include_directories ( BEFORE ${ ClickHouse_SOURCE_DIR } /contrib/libfarmhash/ )
include_directories ( BEFORE ${ ClickHouse_SOURCE_DIR } /contrib/libmetrohash/src )
include_directories ( BEFORE ${ ClickHouse_SOURCE_DIR } /contrib/libsparsehash/ )
include_directories ( BEFORE ${ ClickHouse_SOURCE_DIR } /contrib/libre2/ )
include_directories ( BEFORE ${ ClickHouse_BINARY_DIR } /contrib/libre2/ )
include_directories ( BEFORE ${ ClickHouse_SOURCE_DIR } /contrib/libzookeeper/include/ )
include_directories ( BEFORE ${ ClickHouse_SOURCE_DIR } /contrib/libtcmalloc/include/ )
include_directories ( BEFORE ${ ClickHouse_SOURCE_DIR } /contrib/libpoco/Foundation/include/ )
include_directories ( BEFORE ${ ClickHouse_SOURCE_DIR } /contrib/libpoco/Util/include/ )
include_directories ( BEFORE ${ ClickHouse_SOURCE_DIR } /contrib/libpoco/Net/include/ )
include_directories ( BEFORE ${ ClickHouse_SOURCE_DIR } /contrib/libpoco/NetSSL_OpenSSL/include/ )
include_directories ( BEFORE ${ ClickHouse_SOURCE_DIR } /contrib/libpoco/Data/include/ )
include_directories ( BEFORE ${ ClickHouse_SOURCE_DIR } /contrib/libpoco/Data/MySQL/include/ )
include_directories ( BEFORE ${ ClickHouse_SOURCE_DIR } /contrib/libpoco/Data/ODBC/include/ )
include_directories ( BEFORE ${ ClickHouse_SOURCE_DIR } /contrib/libpoco/Data/SQLite/include/ )
include_directories ( BEFORE ${ ClickHouse_SOURCE_DIR } /contrib/libpoco/Crypto/include/ )
include_directories ( BEFORE ${ ClickHouse_SOURCE_DIR } /contrib/libpoco/XML/include/ )
include_directories ( BEFORE ${ ClickHouse_SOURCE_DIR } /contrib/libpoco/JSON/include/ )
include_directories ( BEFORE ${ ClickHouse_SOURCE_DIR } /contrib/libpoco/MongoDB/include/ )
include_directories ( BEFORE ${ ClickHouse_SOURCE_DIR } /contrib/libpoco/Zip/include/ )
include_directories ( BEFORE ${ ClickHouse_SOURCE_DIR } /contrib/libboost/boost_1_62_0/ )
include_directories ( BEFORE ${ ClickHouse_SOURCE_DIR } /libs/libcommon/include/ )
include_directories ( BEFORE ${ ClickHouse_BINARY_DIR } /libs/libcommon/include/ )
include_directories ( BEFORE ${ ClickHouse_SOURCE_DIR } /libs/libdaemon/include/ )
include_directories ( BEFORE ${ ClickHouse_SOURCE_DIR } /libs/libpocoext/include/ )
include_directories ( BEFORE ${ ClickHouse_SOURCE_DIR } /libs/libmysqlxx/include/ )
include_directories ( BEFORE ${ ClickHouse_SOURCE_DIR } /libs/libzkutil/include/ )
include_directories ( BEFORE ${ ClickHouse_SOURCE_DIR } /dbms/include )
2016-02-07 21:58:58 +00:00
include_directories ( /usr/local/include/ )
link_directories ( /usr/local/lib )
2016-12-06 13:42:53 +00:00
include ( cmake/find_openssl.cmake )
include ( cmake/find_icu4c.cmake )
2016-12-06 13:35:28 +00:00
include ( cmake/find_boost.cmake )
2016-12-06 13:42:53 +00:00
include ( cmake/find_libtool.cmake )
2016-12-06 16:51:34 +00:00
include ( cmake/find_libmysqlclient.cmake )
2016-12-06 18:04:10 +00:00
include ( cmake/find_rt.cmake )
2016-11-29 22:36:32 +00:00
2016-06-26 04:17:49 +00:00
# Directory for Yandex specific files
2016-12-01 22:44:59 +00:00
set ( CLICKHOUSE_PRIVATE_DIR ${ ClickHouse_SOURCE_DIR } /private/ )
2016-06-26 04:17:49 +00:00
2016-02-07 21:58:58 +00:00
add_subdirectory ( contrib )
add_subdirectory ( libs )
add_subdirectory ( utils )
add_subdirectory ( dbms )
2016-06-26 04:17:49 +00:00
2016-12-01 22:44:59 +00:00
if ( EXISTS ${ CLICKHOUSE_PRIVATE_DIR } )
2016-06-26 04:17:49 +00:00
add_subdirectory ( private )
2016-12-01 22:44:59 +00:00
endif ( )
2016-06-27 08:13:54 +00:00
2016-12-01 22:44:59 +00:00
message ( STATUS "C_FLAGS: =${CMAKE_C_FLAGS}" )
message ( STATUS "CXX_FLAGS:=${CMAKE_CXX_FLAGS}" )
2016-12-06 18:04:10 +00:00
include ( cmake/print_include_directories.cmake )