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

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

6
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
A
alexey-milovidov 已提交
7 8 9
    # 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.")
10
    endif ()
11
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
12 13 14 15
    # 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 ()
A
alexey-milovidov 已提交
16
    if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4)
17
        message (WARNING "Compilation has only been tested with Clang 4+")
18
    endif ()
19
else ()
A
alexey-milovidov 已提交
20
    message (WARNING "You are using an unsupported compiler! Compilation has only been tested with Clang 4+ and GCC 6+.")
21
endif ()
A
Alexey Milovidov 已提交
22

23
if (CMAKE_SYSTEM MATCHES "FreeBSD")
24
    set (PLATFORM_EXTRA_CXX_FLAG "-DCLOCK_MONOTONIC_COARSE=CLOCK_MONOTONIC_FAST")
25
endif ()
26

27 28 29
# Write compile_commands.json
set(CMAKE_EXPORT_COMPILE_COMMANDS 1)

30
include (cmake/find_ccache.cmake)
P
proller 已提交
31

P
proller 已提交
32
if (NOT CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE STREQUAL "None")
33 34
    message (STATUS "CMAKE_BUILD_TYPE is not set, set to default = RELWITHDEBINFO")
    set (CMAKE_BUILD_TYPE "RELWITHDEBINFO")
35
endif ()
P
proller 已提交
36
string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UC)
37
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
if (CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64.*|AARCH64.*)")
45
    set (ARCH_AARCH64 1)
46
endif ()
47 48
if (ARCH_AARCH64 OR CMAKE_SYSTEM_PROCESSOR MATCHES "arm")
    set (ARCH_ARM 1)
P
proller 已提交
49
endif ()
P
proller 已提交
50 51 52 53 54 55 56
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 ()
A
Alexey Milovidov 已提交
57

58
set (COMMON_WARNING_FLAGS "-Wall")    # -Werror is also added inside directories with our own code.
59
set (CXX_WARNING_FLAGS "-Wnon-virtual-dtor")
60

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

65
option (USE_STATIC_LIBRARIES "Set to FALSE to use shared libraries" ON)
66
option (MAKE_STATIC_LIBRARIES "Set to FALSE to make shared libraries" ${USE_STATIC_LIBRARIES})
P
proller 已提交
67
if (USE_STATIC_LIBRARIES)
68
    list(REVERSE CMAKE_FIND_LIBRARY_SUFFIXES)
69
endif ()
70

71 72 73 74 75 76 77
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 ()
78

79
if (GLIBC_COMPATIBILITY)
80
    set (USE_INTERNAL_MEMCPY ON)
81
endif ()
82

83
if (CXX11_ABI STREQUAL ENABLE)
84
    set (CXX11_ABI_FLAGS "-D_GLIBCXX_USE_CXX11_ABI=1")
85
elseif (CXX11_ABI STREQUAL DISABLE)
86
    set (CXX11_ABI_FLAGS "-D_GLIBCXX_USE_CXX11_ABI=0")
87
else ()
88
    set (CXX11_ABI_FLAGS "")
89
endif ()
90

91
set (COMPILER_FLAGS                      "${COMPILER_FLAGS} ${CXX11_ABI_FLAGS}")
P
proller 已提交
92

A
Alexey Milovidov 已提交
93 94
find_program (LLD_PATH NAMES lld)
find_program (GOLD_PATH NAMES gold)
A
alexey-milovidov 已提交
95

A
Alexey Milovidov 已提交
96 97 98 99 100 101 102 103 104
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}")
A
alexey-milovidov 已提交
105 106
endif ()

P
proller 已提交
107 108
option (PIPE "-pipe compiler option [less /tmp usage, more ram usage]" ON)
if (PIPE)
109
    set (COMPILER_FLAGS                  "${COMPILER_FLAGS} -pipe")
P
proller 已提交
110 111
endif ()

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

option (ARCHNATIVE "Enable -march=native compiler flag" OFF)
if (ARCHNATIVE)
116 117 118 119 120 121 122 123
    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.
P
proller 已提交
124 125
endif ()

126
# Special options for better optimized code with clang
127 128 129
#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 ()
130

131 132 133 134 135 136 137 138
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 ()

139
set (CMAKE_BUILD_COLOR_MAKEFILE          ON)
140
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}")
141 142 143
#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")
144

P
proller 已提交
145
set (CMAKE_C_FLAGS                       "${CMAKE_C_FLAGS} ${COMPILER_FLAGS} -fno-omit-frame-pointer ${COMMON_WARNING_FLAGS} ${GLIBC_COMPATIBILITY_COMPILE_FLAGS}")
146 147 148
#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")
149

150
if (NOT APPLE AND NOT (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_SYSTEM MATCHES "FreeBSD"))
151
    set (CMAKE_EXE_LINKER_FLAGS          "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc")
152
    set (CMAKE_EXE_LINKER_FLAGS          "${CMAKE_EXE_LINKER_FLAGS} -static-libstdc++")
153 154
endif ()

V
Vladimir Smirnov 已提交
155
if (NOT APPLE)
156
    set (CMAKE_EXE_LINKER_FLAGS          "${CMAKE_EXE_LINKER_FLAGS} ${GLIBC_COMPATIBILITY_LINK_FLAGS} ${CXX11_ABI_FLAGS}")
157 158

    if (USE_LIBCXX AND (CMAKE_CXX_COMPILER_ID STREQUAL "Clang"))
159
        link_libraries (-Wl,-Bstatic -stdlib=libc++ c++ c++abi -Wl,-Bdynamic)
160
    endif ()
161
endif ()
A
Alexey Milovidov 已提交
162

P
proller 已提交
163 164
include (cmake/test_compiler.cmake)
if (USE_STATIC_LIBRARIES AND HAVE_NO_PIE)
165 166
    set (CMAKE_CXX_FLAGS                 "${CMAKE_CXX_FLAGS} ${FLAG_NO_PIE}")
    set (CMAKE_C_FLAGS                   "${CMAKE_C_FLAGS} ${FLAG_NO_PIE}")
167 168
endif ()

169
if (NOT MAKE_STATIC_LIBRARIES)
170
    set(CMAKE_POSITION_INDEPENDENT_CODE ON)
P
proller 已提交
171 172
endif ()

P
proller 已提交
173 174 175 176 177 178 179
set (SAN_FLAGS "${SAN_FLAGS} -g -fno-omit-frame-pointer")
if (SAN_DEBUG)
    set (SAN_FLAGS "${SAN_FLAGS} -O0")
else ()
    set (SAN_FLAGS "${SAN_FLAGS} -O3")
endif ()

180 181 182 183 184 185 186 187
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")
188

189 190 191 192 193 194 195 196 197 198 199 200
# 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 ()

201 202
# Flags for test coverage
if (TEST_COVERAGE)
203
    set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fprofile-arcs -ftest-coverage -DIS_DEBUG")
204 205 206
endif (TEST_COVERAGE)

if (ENABLE_TESTS)
207 208
    message (STATUS "Tests are enabled")
    enable_testing()
P
proller 已提交
209
endif ()
210

P
proller 已提交
211
# when installing to /usr - place configs to /etc but for /usr/local place to /usr/local/etc
P
proller 已提交
212 213
if (CMAKE_INSTALL_PREFIX STREQUAL "/usr")
    set (CLICKHOUSE_ETC_DIR "/etc")
214
else ()
P
proller 已提交
215
    set (CLICKHOUSE_ETC_DIR "${CMAKE_INSTALL_PREFIX}/etc")
216 217
endif ()

218 219
option (UNBUNDLED "Try find all libraries in system (if fail - use bundled from contrib/)" OFF)
if (UNBUNDLED)
220
    set(NOT_UNBUNDLED 0)
221
else ()
222
    set(NOT_UNBUNDLED 1)
223
endif ()
224
# Using system libs can cause lot of warnings in includes.
P
proller 已提交
225
if (UNBUNDLED OR NOT (CMAKE_SYSTEM MATCHES "Linux" OR APPLE) OR ARCH_32)
226 227
    option (NO_WERROR "Disable -Werror compiler option" ON)
endif ()
228

229
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}")
230

P
proller 已提交
231 232
include(GNUInstallDirs)

233
include (cmake/find_openssl.cmake)
234 235 236 237
if (NOT OPENSSL_FOUND)
    message (FATAL_ERROR "Need openssl for build. debian tip: sudo apt install libssl-dev")
endif ()

238
include (cmake/lib_name.cmake)
239
include (cmake/find_icu4c.cmake)
240
include (cmake/find_boost.cmake)
241
# openssl, zlib before poco
242
include (cmake/find_zlib.cmake)
243
include (cmake/find_zstd.cmake)
244
include (cmake/find_poco.cmake)
245 246
include (cmake/find_lz4.cmake)
include (cmake/find_sparsehash.cmake)
247
include (cmake/find_rt.cmake)
248
include (cmake/find_readline_edit.cmake)
249 250
include (cmake/find_zookeeper.cmake)
include (cmake/find_re2.cmake)
251
include (cmake/find_rdkafka.cmake)
252
include (cmake/find_capnp.cmake)
A
alexey-milovidov 已提交
253
include (cmake/find_llvm.cmake)
254 255 256 257 258 259 260 261

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)

262
# Need to process before "contrib" dir:
263
include (libs/libcommon/cmake/find_gperftools.cmake)
P
proller 已提交
264
include (libs/libcommon/cmake/find_jemalloc.cmake)
265
include (libs/libcommon/cmake/find_cctz.cmake)
266
include (libs/libmysqlxx/cmake/find_mysqlclient.cmake)
267 268
include (libs/libdaemon/cmake/find_unwind.cmake)

269

P
proller 已提交
270 271
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}}")
272 273 274 275
message (STATUS "C_FLAGS    = ${FULL_C_FLAGS}")
message (STATUS "CXX_FLAGS  = ${FULL_CXX_FLAGS}")
message (STATUS "LINK_FLAGS = ${CMAKE_EXE_LINKER_FLAGS}")

276 277
# Directory for Yandex specific files
set (CLICKHOUSE_PRIVATE_DIR ${ClickHouse_SOURCE_DIR}/private/)
278
if (EXISTS ${CLICKHOUSE_PRIVATE_DIR})
279
    add_subdirectory (${CLICKHOUSE_PRIVATE_DIR})
280
endif ()
281

P
proller 已提交
282 283 284 285 286
add_subdirectory (contrib)
add_subdirectory (libs)
add_subdirectory (utils)
add_subdirectory (dbms)

287
include (cmake/print_include_directories.cmake)