CMakeLists.txt 9.0 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
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 已提交
29

P
proller 已提交
30
if (NOT CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE STREQUAL "None")
31 32
    message (STATUS "CMAKE_BUILD_TYPE is not set, set to default = RELWITHDEBINFO")
    set (CMAKE_BUILD_TYPE "RELWITHDEBINFO")
33 34
endif ()
message (STATUS "CMAKE_BUILD_TYPE: " ${CMAKE_BUILD_TYPE} )
A
Alexey Milovidov 已提交
35

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

41
if (CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64.*|AARCH64.*)")
42
    set (AARCH64 1)
43
endif ()
A
Alexey Milovidov 已提交
44

45
set (COMMON_WARNING_FLAGS "-Wall")    # -Werror is also added inside directories with our own code.
46
set (CXX_WARNING_FLAGS "-Wnon-virtual-dtor")
47

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

52
option (USE_STATIC_LIBRARIES "Set to FALSE to use shared libraries" ON)
53
option (MAKE_STATIC_LIBRARIES "Set to FALSE to make shared libraries" ${USE_STATIC_LIBRARIES})
P
proller 已提交
54
if (USE_STATIC_LIBRARIES)
55
    list(REVERSE CMAKE_FIND_LIBRARY_SUFFIXES)
56
endif ()
57

58 59
option (GLIBC_COMPATIBILITY "Set to TRUE to enable compatibility with older glibc libraries. Note that it is not compatible with ASan." OFF)

60
if (GLIBC_COMPATIBILITY)
61 62
    set (GLIBC_COMPATIBILITY_COMPILE_FLAGS   "-include ${ClickHouse_SOURCE_DIR}/libs/libcommon/include/common/glibc_compatibility.h")
    set (GLIBC_COMPATIBILITY_LINK_FLAGS      "-Wl,--wrap=memcpy")
63
endif ()
64

65
if (CXX11_ABI STREQUAL ENABLE)
66
    set (CXX11_ABI_FLAGS "-D_GLIBCXX_USE_CXX11_ABI=1")
67
elseif (CXX11_ABI STREQUAL DISABLE)
68
    set (CXX11_ABI_FLAGS "-D_GLIBCXX_USE_CXX11_ABI=0")
69
else ()
70
    set (CXX11_ABI_FLAGS "")
71
endif ()
72

P
proller 已提交
73 74 75 76
set (COMPILER_FLAGS                       "${COMPILER_FLAGS} ${CXX11_ABI_FLAGS}")

option (PIPE "-pipe compiler option [less /tmp usage, more ram usage]" ON)
if (PIPE)
77
    set (COMPILER_FLAGS                   "${COMPILER_FLAGS} -pipe")
P
proller 已提交
78 79
endif ()

P
proller 已提交
80 81 82 83
include (cmake/test_cpu.cmake)

option (ARCHNATIVE "Enable -march=native compiler flag" OFF)
if (ARCHNATIVE)
84
    set (COMPILER_FLAGS                   "${COMPILER_FLAGS} -march=native")
P
proller 已提交
85 86
endif ()

87
set (CMAKE_BUILD_COLOR_MAKEFILE          ON)
88
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}")
89 90 91
#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")
92

P
proller 已提交
93
set (CMAKE_C_FLAGS                       "${CMAKE_C_FLAGS} ${COMPILER_FLAGS} -fno-omit-frame-pointer ${COMMON_WARNING_FLAGS} ${GLIBC_COMPATIBILITY_COMPILE_FLAGS}")
94 95 96
#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")
97

98
if (NOT APPLE AND NOT (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_SYSTEM MATCHES "FreeBSD"))
99
    set (CMAKE_EXE_LINKER_FLAGS          "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++")
100 101
endif ()

V
Vladimir Smirnov 已提交
102
if (NOT APPLE)
103
    set (CMAKE_EXE_LINKER_FLAGS          "${CMAKE_EXE_LINKER_FLAGS} ${GLIBC_COMPATIBILITY_LINK_FLAGS} ${CXX11_ABI_FLAGS}")
104
endif ()
A
Alexey Milovidov 已提交
105

P
proller 已提交
106 107
include (cmake/test_compiler.cmake)
if (USE_STATIC_LIBRARIES AND HAVE_NO_PIE)
108 109
    set (CMAKE_CXX_FLAGS                 "${CMAKE_CXX_FLAGS} ${FLAG_NO_PIE}")
    set (CMAKE_C_FLAGS                   "${CMAKE_C_FLAGS} ${FLAG_NO_PIE}")
110 111
endif ()

112
if (NOT MAKE_STATIC_LIBRARIES)
113
    set(CMAKE_POSITION_INDEPENDENT_CODE ON)
P
proller 已提交
114 115
endif ()

116 117 118 119
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")
120 121 122 123
    # -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")
124 125 126 127 128 129 130
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")
131 132 133

# Flags for test coverage
if (TEST_COVERAGE)
134
    set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fprofile-arcs -ftest-coverage -DIS_DEBUG")
135 136 137
endif (TEST_COVERAGE)

if (ENABLE_TESTS)
138 139
    message (STATUS "Tests are enabled")
    enable_testing()
P
proller 已提交
140
endif ()
141

P
proller 已提交
142
# when installing to /usr - place configs to /etc but for /usr/local place to /usr/local/etc
P
proller 已提交
143 144
if (CMAKE_INSTALL_PREFIX STREQUAL "/usr")
    set (CLICKHOUSE_ETC_DIR "/etc")
145
else ()
P
proller 已提交
146
    set (CLICKHOUSE_ETC_DIR "${CMAKE_INSTALL_PREFIX}/etc")
147 148
endif ()

149 150
option (UNBUNDLED "Try find all libraries in system (if fail - use bundled from contrib/)" OFF)
if (UNBUNDLED)
151
    set(NOT_UNBUNDLED 0)
152
else ()
153
    set(NOT_UNBUNDLED 1)
154
endif ()
155 156 157 158
# Using system libs can cause lot of warnings in includes. 
if (UNBUNDLED OR NOT (CMAKE_SYSTEM MATCHES "Linux" OR APPLE))
    option (NO_WERROR "Disable -Werror compiler option" ON)
endif ()
159

160
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}")
161

P
proller 已提交
162 163
include(GNUInstallDirs)

164
include (cmake/find_openssl.cmake)
165 166 167 168
if (NOT OPENSSL_FOUND)
    message (FATAL_ERROR "Need openssl for build. debian tip: sudo apt install libssl-dev")
endif ()

169
include (cmake/find_icu4c.cmake)
170
include (cmake/find_boost.cmake)
171
# openssl, zlib before poco
172
include (cmake/find_zlib.cmake)
173
include (cmake/find_zstd.cmake)
174
include (cmake/find_poco.cmake)
175 176
include (cmake/find_lz4.cmake)
include (cmake/find_sparsehash.cmake)
177
include (cmake/find_libtool.cmake)
178
include (cmake/find_rt.cmake)
179
include (cmake/find_readline_edit.cmake)
180 181 182
include (cmake/find_zookeeper.cmake)
include (cmake/find_double-conversion.cmake)
include (cmake/find_re2.cmake)
183
# Need to process before "contrib" dir:
P
proller 已提交
184 185
include (libs/libcommon/cmake/find_gperftools.cmake)
include (libs/libcommon/cmake/find_jemalloc.cmake)
186
include (libs/libcommon/cmake/find_cctz.cmake)
187
include (libs/libmysqlxx/cmake/find_mysqlclient.cmake)
188
include (libs/libdaemon/cmake/find_unwind.cmake)
P
proller 已提交
189
include (cmake/lib_name.cmake)
190

191

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

198 199
# Directory for Yandex specific files
set (CLICKHOUSE_PRIVATE_DIR ${ClickHouse_SOURCE_DIR}/private/)
200
if (EXISTS ${CLICKHOUSE_PRIVATE_DIR})
201
    add_subdirectory (${CLICKHOUSE_PRIVATE_DIR})
202
endif ()
203

P
proller 已提交
204 205 206 207 208
add_subdirectory (contrib)
add_subdirectory (libs)
add_subdirectory (utils)
add_subdirectory (dbms)

209
include (cmake/print_include_directories.cmake)