CMakeLists.txt 8.4 KB
Newer Older
1
project (ClickHouse)
2
cmake_minimum_required (VERSION 2.6)
A
Alexey Milovidov 已提交
3

4 5
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")

6 7
message(STATUS "Building for: ${CMAKE_SYSTEM} ${CMAKE_SYSTEM_PROCESSOR} ${CMAKE_LIBRARY_ARCHITECTURE}")

8
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
9
	# Require at least gcc 5
10
	if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5 AND NOT CMAKE_VERSION VERSION_LESS 2.8.9)
11 12
		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 ()
13
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
14 15 16 17 18 19 20
	# 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 ()
A
Alexey Milovidov 已提交
21

V
Vladimir Smirnov 已提交
22
if (APPLE)
23 24 25 26 27
	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")
28
endif ()
29

30 31
cmake_policy (SET CMP0014 OLD) # Ignore warning about CMakeLists.txt in each directory
cmake_policy (SET CMP0012 NEW) # Don't dereference TRUE and FALSE
A
Alexey Milovidov 已提交
32

33 34 35 36 37
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} )
A
Alexey Milovidov 已提交
38

39 40
# ASan - build type with address sanitizer
# UBSan - build type with undefined behaviour sanitizer
41
# TSan is not supported due to false positive errors in libstdc++ and necessity to rebuild libstdc++ with TSan
42
set (CMAKE_CONFIGURATION_TYPES "RelWithDebInfo;Debug;Release;MinSizeRel;ASan;UBSan" CACHE STRING "" FORCE)
A
Alexey Milovidov 已提交
43

44

45 46 47
if (CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64.*|AARCH64.*)")
	set (AARCH64 1)
endif ()
A
Alexey Milovidov 已提交
48

49
set (COMMON_WARNING_FLAGS "-Wall")	# -Werror is also added inside directories with our own code.
50
set (CXX_WARNING_FLAGS "-Wnon-virtual-dtor")
51

A
Alexey Milovidov 已提交
52
set (CXX11_ABI "ENABLE" CACHE STRING "Use C++11 ABI: DEFAULT, ENABLE, DISABLE")
53 54
option (TEST_COVERAGE "Enables flags for test coverage" OFF)
option (ENABLE_TESTS "Enables tests" ON)
55

56
option (USE_STATIC_LIBRARIES "Set to FALSE to use shared libraries" ON)
57 58 59
if (NOT $ENV{USE_STATIC_LIBRARIES})
	set (USE_STATIC_LIBRARIES FALSE)
endif ()
60

61 62 63 64 65
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 ()

66 67 68 69
if (USE_INTERNAL_BOOST_LIBRARY)
	add_definitions(-DBOOST_SYSTEM_NO_DEPRECATED)
endif ()

70 71 72
option (USE_INTERNAL_POCO_LIBRARY "Set to FALSE to use system poco library instead of bundled" ON)
option (USE_INTERNAL_GPERFTOOLS_LIBRARY "Set to FALSE to use system gperftools (tcmalloc) library instead of bundled" ON)

73

74
option (ENABLE_LIBTCMALLOC "Set to TRUE to enable libtcmalloc." ON)
75 76 77 78
if (NOT $ENV{ENABLE_LIBTCMALLOC})
	set (ENABLE_LIBTCMALLOC FALSE)
endif ()

79
option (DEBUG_LIBTCMALLOC "Set to TRUE to use debug version of libtcmalloc." OFF)
80
if ($ENV{DEBUG_LIBTCMALLOC})
81
	set (DEBUG_LIBTCMALLOC TRUE)
82
endif ()
83

84 85 86 87 88
option (GLIBC_COMPATIBILITY "Set to TRUE to enable compatibility with older glibc libraries. Note that it is not compatible with ASan." OFF)
if ($ENV{GLIBC_COMPATIBILITY})
	set (GLIBC_COMPATIBILITY TRUE)
endif ()

89
if (GLIBC_COMPATIBILITY)
90 91 92
	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 ()
93

94
if (CXX11_ABI STREQUAL ENABLE)
95
	set (CXX11_ABI_FLAGS "-D_GLIBCXX_USE_CXX11_ABI=1")
96
elseif (CXX11_ABI STREQUAL DISABLE)
97 98 99
	set (CXX11_ABI_FLAGS "-D_GLIBCXX_USE_CXX11_ABI=0")
else ()
	set (CXX11_ABI_FLAGS "")
100
endif ()
101

P
proller 已提交
102 103 104 105 106 107 108
set (COMPILER_FLAGS                       "${COMPILER_FLAGS} ${CXX11_ABI_FLAGS}")

option (PIPE "-pipe compiler option [less /tmp usage, more ram usage]" ON)
if (PIPE)
	set (COMPILER_FLAGS                   "${COMPILER_FLAGS} -pipe")
endif ()

P
proller 已提交
109 110 111 112 113 114 115
include (cmake/test_cpu.cmake)

option (ARCHNATIVE "Enable -march=native compiler flag" OFF)
if (ARCHNATIVE)
	set (COMPILER_FLAGS                   "${COMPILER_FLAGS} -march=native")
endif ()

P
proller 已提交
116

117
set (CMAKE_BUILD_COLOR_MAKEFILE          ON)
P
proller 已提交
118
set (CMAKE_CXX_FLAGS                     "${CMAKE_CXX_FLAGS} ${COMPILER_FLAGS} -std=gnu++1y ${PLATFORM_EXTRA_CXX_FLAG} -fno-omit-frame-pointer ${COMMON_WARNING_FLAGS} ${CXX_WARNING_FLAGS} ${GLIBC_COMPATIBILITY_COMPILE_FLAGS}")
119 120 121
#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")
122

P
proller 已提交
123
set (CMAKE_C_FLAGS                       "${CMAKE_C_FLAGS} ${COMPILER_FLAGS} -fno-omit-frame-pointer ${COMMON_WARNING_FLAGS} ${GLIBC_COMPATIBILITY_COMPILE_FLAGS}")
124 125 126
#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")
127

128 129 130 131
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 ()

V
Vladimir Smirnov 已提交
132
if (NOT APPLE)
133
	set (CMAKE_EXE_LINKER_FLAGS          "${CMAKE_EXE_LINKER_FLAGS} ${GLIBC_COMPATIBILITY_LINK_FLAGS} ${CXX11_ABI_FLAGS}")
134
endif ()
A
Alexey Milovidov 已提交
135

P
proller 已提交
136 137 138
if (USE_STATIC_LIBRARIES AND NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
	set (CMAKE_CXX_FLAGS                 "${CMAKE_CXX_FLAGS} -no-pie")
	set (CMAKE_C_FLAGS                   "${CMAKE_C_FLAGS} -no-pie")
139 140
endif ()

P
proller 已提交
141

142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
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")
	# -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")
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")
157 158 159

# Flags for test coverage
if (TEST_COVERAGE)
P
proller 已提交
160
	set (CMAKE_CXX_FLAGS_DEBUG "${COMPILER_FLAGS} -O0 -g -fprofile-arcs -ftest-coverage -fPIC -DIS_DEBUG")
161 162 163 164 165
endif (TEST_COVERAGE)

# Run tests with "make check"
if (ENABLE_TESTS)
	message (STATUS "Tests are enabled")
166
	include (cmake/add_check.cmake)
167 168 169
endif (ENABLE_TESTS)

# Installation prefix
170 171
if (NOT CMAKE_SYSTEM MATCHES "FreeBSD")
	set (CMAKE_INSTALL_PREFIX /usr)
172 173 174
	set (CLICKHOUSE_ETC_DIR /etc)
else ()
	set (CLICKHOUSE_ETC_DIR ${CMAKE_INSTALL_PREFIX}/etc)
175 176
endif ()

177
include (cmake/find_openssl.cmake)
178
include (cmake/find_icu4c.cmake)
179
include (cmake/find_boost.cmake)
180
include (cmake/find_poco.cmake)
181
include (cmake/find_libtool.cmake)
182
include (cmake/find_rt.cmake)
183 184
include (cmake/find_readline_edit.cmake)

185 186 187
if (ENABLE_LIBTCMALLOC)
    include (cmake/find_gperftools.cmake)
endif ()
188

189 190 191 192 193 194
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}}")
message (STATUS "C_FLAGS    = ${FULL_C_FLAGS}")
message (STATUS "CXX_FLAGS  = ${FULL_CXX_FLAGS}")
message (STATUS "LINK_FLAGS = ${CMAKE_EXE_LINKER_FLAGS}")

195 196
# Directory for Yandex specific files
set (CLICKHOUSE_PRIVATE_DIR ${ClickHouse_SOURCE_DIR}/private/)
197
if (EXISTS ${CLICKHOUSE_PRIVATE_DIR})
198
	add_subdirectory (${CLICKHOUSE_PRIVATE_DIR})
199
endif ()
200

P
proller 已提交
201 202 203 204 205
add_subdirectory (contrib)
add_subdirectory (libs)
add_subdirectory (utils)
add_subdirectory (dbms)

206
include (cmake/print_include_directories.cmake)