forked from manticoresoftware/manticoresearch
-
Notifications
You must be signed in to change notification settings - Fork 0
/
CMakeLists.txt
424 lines (348 loc) · 15.7 KB
/
CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
cmake_minimum_required ( VERSION 3.17 )
FOREACH (policy CMP0012 CMP0013 CMP0014 CMP0048 CMP0074 CMP0077 CMP0091 CMP0110)
IF (POLICY ${policy})
CMAKE_POLICY ( SET ${policy} NEW )
ENDIF ()
ENDFOREACH ()
if (DEFINED ENV{CMAKE_INTERPROCEDURAL_OPTIMIZATION})
set ( CMAKE_INTERPROCEDURAL_OPTIMIZATION $ENV{CMAKE_INTERPROCEDURAL_OPTIMIZATION} )
endif ()
set ( CMAKE_ENABLE_EXPORTS ON )
set ( _CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} )
PROJECT ( MANTICORE )
# sometimes CMAKE_BUILD_TYPE became set after PROJECT statement, undo it.
if (NOT _CMAKE_BUILD_TYPE AND CMAKE_BUILD_TYPE)
unset ( CMAKE_BUILD_TYPE CACHE )
endif ()
SET ( CMAKE_CXX_STANDARD 17 )
SET ( MANTICORE_CMAKE_DIR "${MANTICORE_SOURCE_DIR}/cmake" )
SET ( CMAKE_MODULE_PATH "${MANTICORE_SOURCE_DIR}/cmake" )
SET ( MANTICORE_MODULE_PATH "${CMAKE_MODULE_PATH}" )
include ( init_cache_settings ) # set libs_bundle, cacheb, diagnostic. etc.
include ( helpers )
# Set a default build type for single-configuration CMake generators if no build type is set.
get_property ( isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG )
if (NOT isMultiConfig AND NOT CMAKE_BUILD_TYPE)
set ( CMAKE_BUILD_TYPE RelWithDebInfo )
message ( STATUS "Automatically set build type to RelWithDebInfo since no other provided" )
endif ()
if (WIN32 AND WIN_BUNDLE)
list ( APPEND CMAKE_PREFIX_PATH "${WIN_BUNDLE}" )
set ( CMAKE_FIND_PACKAGE_PREFER_CONFIG TRUE )
endif ()
set ( BUILD_TAG "" CACHE STRING "The tag which will be added to build" )
set ( PACKAGE_NAME "manticore" )
set ( COMPANY_NAME "Manticore Software LTD" )
set ( CPACK_PACKAGE_NAME "${PACKAGE_NAME}" )
include ( setup_distribution_build ) # process PACK, DISTR_BUILD and ENV{DISTR}
include ( FeatureSummary )
# cast away too old gcc compiler (Minspec is 4.7.2)
if (CXX_COMPILER_ID STREQUAL GNU AND CXX_COMPILER_VERSION VERSION_LESS 4.7.2)
message ( FATAL_ERROR "Gcc version error. Minspec is 4.7.2" )
endif ()
# Collect string information which will be included into binaries
include ( banner )
bannervar ( DISTR_BUILD )
add_library ( lextra INTERFACE ) # main interface lib to collect all build-wide libs and options
# Looking for threads library
set ( THREADS_PREFER_PTHREAD_FLAG ON )
find_package ( Threads REQUIRED )
target_link_libraries ( lextra INTERFACE Threads::Threads )
# Checking for specific headers
include ( CheckIncludeFile )
# that part is safe on windows, however these libs are absent there, so no reason to spend time on them
if (NOT WIN32)
# Checking if mincore has unsigned 3-rd param
include ( mincore_test )
add_lib_for ( getaddrinfo_a anl lextra )
add_lib_for ( setsockopt socket lextra )
add_lib_for ( getaddrinfo "nsl;socket;resolv" lextra )
add_lib_for ( clock_gettime rt lextra )
add_lib_for ( logf m lextra )
set ( CMAKE_REQUIRED_LIBRARIES ${CMAKE_THREAD_LIBS_INIT} )
check_function_exists ( poll HAVE_POLL )
check_function_exists ( pthread_mutex_timedlock HAVE_PTHREAD_MUTEX_TIMEDLOCK )
check_function_exists ( pthread_cond_timedwait HAVE_PTHREAD_COND_TIMEDWAIT )
check_function_exists ( pread HAVE_PREAD )
check_function_exists ( backtrace HAVE_BACKTRACE )
check_function_exists ( backtrace_symbols HAVE_BACKTRACE_SYMBOLS )
check_function_exists ( mremap HAVE_MREMAP )
check_function_exists ( eventfd HAVE_EVENTFD )
check_function_exists ( kqueue HAVE_KQUEUE )
check_function_exists ( pthread_getname_np HAVE_PTHREAD_GETNAME_NP )
check_function_exists ( getrlimit HAVE_GETRLIMIT )
check_function_exists ( setrlimit HAVE_SETRLIMIT )
check_function_exists ( epoll_ctl HAVE_EPOLL )
# Checking for few other flags
include ( CheckSymbolExists )
check_symbol_exists ( F_SETLKW "fcntl.h" HAVE_F_SETLKW )
check_symbol_exists ( SO_REUSEPORT "sys/types.h;sys/socket.h" HAVE_SO_REUSEPORT )
check_symbol_exists ( malloc_trim "malloc.h" HAVE_MALLOC_TRIM )
check_symbol_exists ( malloc_stats "malloc.h" HAVE_MALLOC_STATS )
# Checking for PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP flag
include ( check_rwlock_prefer_writer )
# Check availabiliby of pthread_setname_np and whether it pick 1 or 2 params
include ( check_vitable_pthread_setname_np )
set ( STATIC_BINARY OFF CACHE BOOL "Produce statically linked ELF" )
add_feature_info ( Static STATIC_BINARY "make pure static build undependent of any local libraries" )
endif ()
if (STATIC_BINARY)
# options for clang/gcc c and c++
target_compile_options ( lextra INTERFACE $<${ONLYGNUCLANGC_CXX}:-static> )
set ( HAVE_DLOPEN 0 CACHE BOOL "" FORCE )
set ( HAVE_GETADDRINFO_A 0 CACHE BOOL "" FORCE )
set ( WITH_ODBC 0 CACHE BOOL "" FORCE )
set ( WITH_MYSQL 0 CACHE BOOL "" FORCE )
set ( WITH_POSTGRESQL 0 CACHE BOOL "" FORCE )
set ( WITH_GALERA 0 CACHE BOOL "" FORCE )
set ( WITH_SSL 0 CACHE BOOL "" FORCE )
set ( WITH_ZSTD 0 CACHE BOOL "" FORCE )
set ( WITH_CURL 0 CACHE BOOL "" FORCE )
SET ( BUILD_TESTING 0 CACHE BOOL "" FORCE )
elseif (NOT WIN32)
if (CMAKE_DL_LIBS) # CMAKE internal, usually '-ldl' on most UNIX machines
target_link_libraries ( lextra INTERFACE ${CMAKE_DL_LIBS} )
endif ()
set ( CMAKE_REQUIRED_LIBRARIES "${CMAKE_DL_LIBS}" )
check_symbol_exists ( dlopen "dlfcn.h" HAVE_DLOPEN )
else ()
set ( HAVE_DLOPEN 1 CACHE BOOL "Use emulated dlopen" FORCE )
endif ()
include ( TestBigEndian ) # fixme! That is deprecated in cmake 3.20 in favor to CMAKE_<LANG>_BYTE_ORDER var
test_big_endian ( USE_BIG_ENDIAN )
target_compile_options ( lextra INTERFACE $<$<COMPILE_LANG_AND_ID:CXX,MSVC>:-D_CRT_SECURE_NO_WARNINGS -wd4996 -wd4706 -wd4244 -wd4702 -wd4577> )
include ( CheckFunctionExists )
check_function_exists ( strnlen HAVE_STRNLEN )
# Checking for atomic function
include ( check_atomic_intrinsics )
set ( DISABLE_MEMROUTINES OFF CACHE BOOL "If the build is broken because new/delete override, this option will disable the overriding" )
mark_as_advanced ( DISABLE_MEMROUTINES )
# Option USE_SYSLOG
check_include_file ( "syslog.h" HAVE_SYSLOG_H )
set ( USE_SYSLOG ${HAVE_SYSLOG_H} CACHE BOOL "compile with possibility to use syslog for logging" )
bannervar ( USE_SYSLOG )
# options for clang/gcc c and c++
target_compile_options ( lextra INTERFACE $<${ONLYGNUCLANGC_CXX}:-D_FILE_OFFSET_BITS=64 -Wall -fno-strict-aliasing> )
target_compile_options ( lextra INTERFACE $<${CLANGWIN}:-fno-strict-aliasing -Wno-format -Wno-uninitialized-const-reference -Wno-unneeded-internal-declaration
-Wno-deprecated-declarations -Wno-implicit-const-int-float-conversion -Wno-missing-braces -Wno-unused-function> )
# disable rtti
target_compile_options ( lextra INTERFACE $<${ONLYGNUCLANGCXX}:-fno-rtti>$<${MSCXX}:/GR-> ) # no rtti
if (WIN32)
target_compile_definitions ( lextra INTERFACE
_CRT_SECURE_NO_DEPRECATE=1
_CRT_NONSTDC_NO_DEPRECATE=1
)
# that is necessary only for IDE correct highlighting. Note, that is only global (not target-located) definitions, global-wide
# add_compile_definitions ( _WIN32=1 )
endif()
if (COVERAGE_TEST)
target_compile_options ( lextra INTERFACE $<${ONLYGNUCLANGC_CXX}:-fprofile-arcs -ftest-coverage> )
target_link_options ( lextra INTERFACE
$<$<LINK_LANG_AND_ID:CXX,GNU>:-lgcov --coverage>
$<$<LINK_LANG_AND_ID:C,GNU>:-lgcov --coverage>
$<$<LINK_LANG_AND_ID:CXX,Clang,AppleClang>: --coverage>
$<$<LINK_LANG_AND_ID:C,Clang,AppleClang>: --coverage>
)
endif (COVERAGE_TEST)
# options for clang in C++
target_compile_options ( lextra INTERFACE $<${CLANGCXX}:
-Wno-deprecated-register -Wno-missing-exception-spec -Wno-implicit-exception-spec-mismatch -Wno-invalid-offsetof -Wc++11-narrowing> )
# Checking for unaligned RAM access
if (CMAKE_CROSSCOMPILING)
if (CMAKE_SYSTEM_PROCESSOR MATCHES "^(i.86|x86(_64)?)$"
OR CMAKE_SYSTEM_PROCESSOR STREQUAL amd64
OR CMAKE_SYSTEM_PROCESSOR STREQUAL arm64
OR CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64)
set ( UNALIGNED_RAM_ACCESS_EXITCODE "0" CACHE STRING "Result from TRY_RUN" )
set ( UNALIGNED_RAM_ACCESS_EXITCODE__TRYRUN_OUTPUT "" CACHE STRING "Output from TRY_RUN" )
endif ()
endif ()
include ( check_unaligned_ram_access )
option ( USE_SMALLALLOC "Use 'small allocator' derived from loki lib. Bench! Glibc allocator now is fast enough!" )
bannervar ( WITH_SMALLALLOC )
mark_as_advanced ( WITH_SMALLALLOC )
#check galera, as it is not available on win, to fail early
if (WIN32)
if (WITH_GALERA)
message ( FATAL_ERROR "Galera is not supported on win; reconfigure with WITH_GALERA=FALSE" )
endif ()
else ()
include ( GetGALERA )
if (WITH_GALERA)
cache_galera_module_name () # write GALERA_SONAME as var to cache
endif ()
diag ( WITH_GALERA )
bannervar ( WITH_GALERA )
endif ()
# Check for RE2 build
set ( WITH_RE2_FORCE_STATIC 1 CACHE BOOL "force to compile re2 from sources" )
with_get ( re2 "RE2" "a regular expression library" )
# Check for Libstemmer build
set ( WITH_STEMMER_FORCE_STATIC 1 CACHE BOOL "force to compile stemmer from sources" )
with_get ( stemmer "Stemmer" "stemming library (Snowball)" )
get_dep ( nlohmann_json NLJSON "JSON for Modern C++ library" )
get_dep ( uni-algo UniAlgo "unicode algorithm implementation for C/C++" )
# Check for ICU build
set ( WITH_ICU_FORCE_STATIC 1 CACHE BOOL "force to compile ICU from sources" )
if (STATIC_BINARY)
set ( WITH_ICU_FORCE_STATIC ON CACHE BOOL "force to compile ICU from sources" FORCE )
set ( WITH_ICU_FORCE_BUILD ON )
endif ()
with_get ( icu "ICU" "International Components for Unicode" )
include ( GetCCTZ )
# Support for OpenSSL
with_menu_comp ( OpenSSL SSL "OpenSSL" "for encrypted networking" )
win_install_c ( OpenSSL SSL daemon )
trace ( OpenSSL::Crypto )
# Support for ZLIB
with_menu ( ZLIB "zlib" "for compressed data and networking" )
with_menu ( ZSTD "libzstd" "for compressed networking" )
dl_package ( ZSTD "zstd" )
win_install ( ZSTD daemon )
with_menu_libname ( CURL libcurl "libCURL" "for enhanced network communication" )
dl_package_comp ( CURL libcurl "curl" )
win_install_lib ( CURL libcurl daemon )
# ODBC and it's dynamic linking
with_menu ( ODBC "ODBC/UnixODBC/iODBC" "for indexing MSSQL (windows) and generic ODBC sources with indexer" )
dl_package ( ODBC "ODBC/UnixODBC/iODBC" )
# EXPAT and it's dynamic linking
with_menu ( EXPAT "expat" "for indexing xmlpipe sources with indexer" )
dl_package ( EXPAT "expat" )
win_install ( EXPAT common )
# test for ICONV
if (WITH_EXPAT)
with_menu ( Iconv "iconv" "for support different encodings when indexing xmlpipe sources with indexer" )
if (Iconv_IS_BUILT_IN)
set_target_properties ( Iconv::Iconv PROPERTIES INTERFACE_COMPILE_DEFINITIONS LIBICONV_PLUG )
else ()
dl_package ( Iconv "iconv" )
win_install ( Iconv common )
endif ()
include ( check_const_iconv )
diag ( Iconv_IS_BUILT_IN )
endif ()
# MYSQL and it's dynamic linking
set ( WITH_STATIC_MYSQL OFF CACHE BOOL "link to mysql library statically" )
if (WITH_STATIC_MYSQL)
set ( MYSQL_USE_STATIC_LIBS ON )
endif ()
with_menu ( Mysql "mysql" "for indexing mysql sources with indexer" )
dl_package ( Mysql "mysql" )
win_install ( Mysql indexer )
# PostgreSQL and it's dynamic linking
with_menu ( PostgreSQL "pgsql" "for indexing postgresql sources with indexer" )
dl_package ( PostgreSQL "pgsql" )
win_install ( PostgreSQL indexer )
# Storing compiler version
set ( COMPILER "${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}" )
diag ( COMPILER )
# Storing system name
set ( HOST_SYSTEM "${CMAKE_HOST_SYSTEM_NAME} ${CMAKE_HOST_SYSTEM_PROCESSOR}" )
set ( TARGET_SYSTEM "${CMAKE_SYSTEM_NAME} ${CMAKE_SYSTEM_PROCESSOR}" )
set ( HOST_DISTRO "${HOST_SYSTEM}" )
set ( TARGET_DISTRO "${TARGET_SYSTEM}" )
if (DISTR)
set ( HOST_DISTRO "${HOST_DISTRO} (${DISTR})" )
set ( TARGET_DISTRO "${TARGET_DISTRO} (${DISTR})" )
endif ()
if (CMAKE_CROSSCOMPILING)
if (HOST_SYSTEM STREQUAL "${TARGET_SYSTEM}")
SET ( OS_UNAME "${HOST_DISTRO} (cross-compiled)" )
else ()
SET ( OS_UNAME "${HOST_SYSTEM} for ${TARGET_DISTRO}" )
endif ()
else ()
SET ( OS_UNAME "${HOST_DISTRO}" )
endif ()
diag ( OS_UNAME )
diag ( SPLIT )
configure_file ( "LICENSE" "${MANTICORE_BINARY_DIR}/LICENSE" COPYONLY )
# Common all-packages info
include ( ${MANTICORE_SOURCE_DIR}/sphinxrev.cmake )
include ( CommonInfo )
# set final paths for build
set ( only_set_paths ON )
include ( SetBuildType )
diag ( installed )
if (NOT installed) # GNUInstallDirs wasn't yet included...
include ( GNUInstallDirs )
SET ( LOCALDATADIR "${CMAKE_INSTALL_FULL_LOCALSTATEDIR}" ) # will be used also in the app
if (WIN32)
set ( CMAKE_INSTALL_DOCDIR "${CMAKE_INSTALL_DATAROOTDIR}/doc" )
SET ( FULL_SHARE_DIR "${CMAKE_INSTALL_FULL_DATADIR}" )
SET ( CMAKE_INSTALL_FULL_LOCALLIBDIR "usr/local/lib" )
install ( DIRECTORY api doc contrib DESTINATION ${CMAKE_INSTALL_DOCDIR} COMPONENT common )
install ( FILES example.sql DESTINATION ${CMAKE_INSTALL_DOCDIR} COMPONENT tools )
install ( DIRECTORY misc/stopwords DESTINATION ${CMAKE_INSTALL_DATADIR} COMPONENT common )
install ( FILES LICENSE INSTALL manticore.conf.in DESTINATION . COMPONENT common )
install ( DIRECTORY DESTINATION ${CMAKE_INSTALL_LOCALSTATEDIR}/log COMPONENT searchd )
install ( DIRECTORY DESTINATION ${CMAKE_INSTALL_LOCALSTATEDIR} COMPONENT common )
if (WITH_ICU AND WITH_ICU_FORCE_STATIC)
install_icudata ( ${CMAKE_INSTALL_DATADIR}/icu )
endif ()
else ()
set ( CMAKE_INSTALL_DOCDIR "${CMAKE_INSTALL_DATAROOTDIR}/doc/manticore" )
configure_config ( lib/manticore )
SET ( FULL_SHARE_DIR "${CMAKE_INSTALL_FULL_DATADIR}/manticore" )
SET ( CMAKE_INSTALL_FULL_LOCALLIBDIR "${CMAKE_INSTALL_FULL_LIBDIR}" )
install ( FILES ${MANTICORE_BINARY_DIR}/manticore.conf DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/manticoresearch COMPONENT common )
install ( DIRECTORY misc/stopwords DESTINATION ${CMAKE_INSTALL_DATADIR}/manticore COMPONENT common )
install ( DIRECTORY DESTINATION ${CMAKE_INSTALL_LOCALSTATEDIR}/lib/manticore COMPONENT common )
install ( DIRECTORY DESTINATION ${CMAKE_INSTALL_RUNSTATEDIR}/manticore COMPONENT searchd )
install ( DIRECTORY DESTINATION ${CMAKE_INSTALL_LOCALSTATEDIR}/log/manticore COMPONENT searchd )
if (WITH_ICU AND WITH_ICU_FORCE_STATIC)
install_icudata ( ${CMAKE_INSTALL_DATADIR}/manticore/icu )
endif ()
endif ()
endif ()
set ( CPACK_RPM_COMPONENT_INSTALL 1 )
set ( CPACK_DEB_COMPONENT_INSTALL 1 )
set ( CPACK_ARCHIVE_COMPONENT_INSTALL 1 )
bannervar ( LOCALDATADIR )
bannervar ( FULL_SHARE_DIR )
set ( CPACK_PROJECT_CONFIG_FILE "${MANTICORE_BINARY_DIR}/config/CPackOptions.cmake" )
set ( DEFAULT_CTEST_CONFIGURATION_TYPE "Debug" )
include ( CTest )
add_subdirectory ( src )
if (BUILD_TESTING)
add_subdirectory ( test )
if (NOT TEST_SPECIAL_EXTERNAL)
add_subdirectory ( api/libsphinxclient )
endif ()
endif ()
# run setBuildType again, full pass. Select distribution build and install rules for most of the files
if (installed)
set ( only_set_paths OFF )
include ( SetBuildType )
endif ()
cmake_print_variables ( CMAKE_INSTALL_PREFIX )
foreach (var BINDIR SBINDIR LIBEXECDIR SYSCONFDIR SHAREDSTATEDIR LOCALSTATEDIR RUNSTATEDIR LIBDIR INCLUDEDIR OLDINCLUDEDIR DATAROOTDIR DATADIR INFODIR LOCALEDIR MANDIR DOCDIR LOCALLIBDIR)
cmake_print_variables ( CMAKE_INSTALL_${var} CMAKE_INSTALL_FULL_${var} )
endforeach ()
if (NOT CPack_CMake_INCLUDED)
include ( CPack )
endif ()
cpack_add_component ( server GROUP main )
cpack_add_component ( searchd GROUP main )
cpack_add_component ( common GROUP main )
cpack_add_component ( tools GROUP main )
cpack_add_component ( meta )
cpack_add_component ( devel GROUP main )
cpack_add_component ( converter GROUP helpers )
cpack_add_component_group ( main EXPANDED )
cpack_add_component_group ( helpers EXPANDED )
if (WITH_ICU)
cpack_add_component ( icudata )
endif ()
if (WIN32)
cpack_add_component ( runtime GROUP main )
endif ()
#feature_summary (
# INCLUDE_QUIET_PACKAGES
# DESCRIPTION "Enabled Features1:"
# VAR enabledFeaturesText
# WHAT ALL)
#message (STATUS "${enabledFeaturesText}")
feature_summary ( WHAT ENABLED_FEATURES INCLUDE_QUIET_PACKAGES DESCRIPTION "Enabled features compiled in:" )
feature_summary ( WHAT RUNTIME_PACKAGES_FOUND INCLUDE_QUIET_PACKAGES DESCRIPTION "Available runtime features:" )
#feature_summary (WHAT ALL DESCRIPTION "Enabled ALL features4:")