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 () if (NOT DEFINED BUILD_TAG AND DEFINED ENV{BUILD_TAG}) set ( BUILD_TAG $ENV{BUILD_TAG} CACHE STRING "The tag which will be added to build" ) elseif (NOT DEFINED BUILD_TAG) set ( BUILD_TAG "" CACHE STRING "The tag which will be added to build" ) endif() 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} set ( PACK_BUNDLE OFF CACHE BOOL "Build bundle package (manticore = daemon + all deps from deps.txt); requires PACK=1 and network at configure" ) if (PACK AND PACK_BUNDLE AND DISTR AND NOT WIN32) # Helper: on non-zero result, merge stdout/stderr and FATAL_ERROR with script name. macro ( _bundle_script_fail result out err name ) if ( ${result} ) set ( _msg "${${out}}" ) if ( ${err} ) set ( _msg "${_msg}\n${${err}}" ) endif () message ( FATAL_ERROR "${name} failed (exit ${${result}}).\n${_msg}" ) endif () endmacro () set ( BUNDLE_DEPS_EXTRACT_DIR "${CMAKE_BINARY_DIR}/bundle_deps_extract" ) # Skip download if bundle deps already present. Linux package extracts typically # have usr/, while macOS bundle deps are normalized to bin/ and share/. if ( EXISTS "${BUNDLE_DEPS_EXTRACT_DIR}/usr" OR EXISTS "${BUNDLE_DEPS_EXTRACT_DIR}/bin" OR EXISTS "${BUNDLE_DEPS_EXTRACT_DIR}/share" ) message ( STATUS "PACK_BUNDLE: using existing bundle deps at ${BUNDLE_DEPS_EXTRACT_DIR}" ) else () message ( STATUS "PACK_BUNDLE: downloading bundle deps into ${BUNDLE_DEPS_EXTRACT_DIR}" ) # Use cmake -E env to pass env vars for portability (same on Windows/macOS/Linux; no system env required) execute_process ( COMMAND ${CMAKE_COMMAND} -E env DISTR=${DISTR} arch=${CMAKE_SYSTEM_PROCESSOR} BUNDLE_REPO_TYPE=$ENV{BUNDLE_REPO_TYPE} MCL_PACKAGE_DIR=$ENV{MCL_PACKAGE_DIR} MCL_PACKAGE_SHA=$ENV{MCL_PACKAGE_SHA} MCL_REPO_TYPE=$ENV{MCL_REPO_TYPE} REPO_ROOT=${MANTICORE_SOURCE_DIR} -- "${MANTICORE_SOURCE_DIR}/dist/download_bundle_deps.sh" "${BUNDLE_DEPS_EXTRACT_DIR}" WORKING_DIRECTORY "${MANTICORE_SOURCE_DIR}" RESULT_VARIABLE _bundledeps_result OUTPUT_VARIABLE _bundledeps_out ERROR_VARIABLE _bundledeps_err ) _bundle_script_fail ( _bundledeps_result _bundledeps_out _bundledeps_err "download_bundle_deps.sh" ) endif () # Import external runtime requirements discovered from the downloaded bundle deps # so the resulting bundle package still declares system-level dependencies. if ( EXISTS "${BUNDLE_DEPS_EXTRACT_DIR}/.bundle_depends.deb" ) file ( STRINGS "${BUNDLE_DEPS_EXTRACT_DIR}/.bundle_depends.deb" _bundle_deb_dep_lines ) if ( _bundle_deb_dep_lines ) list ( JOIN _bundle_deb_dep_lines ", " _bundle_deb_depends ) set ( CPACK_DEBIAN_BUNDLE_PACKAGE_DEPENDS "${_bundle_deb_depends}" ) message ( STATUS "PACK_BUNDLE: DEB bundle depends: ${CPACK_DEBIAN_BUNDLE_PACKAGE_DEPENDS}" ) endif () endif () set ( _bundle_deb_replaces "manticore-common" "manticore-server-core" "manticore-server" "manticore-tools" "manticore-dev" "manticore-converter" "manticore-extra" "manticore-icudata-65l" "manticore-language-packs" ) if ( EXISTS "${BUNDLE_DEPS_EXTRACT_DIR}/.bundle_owned_packages.deb" ) file ( STRINGS "${BUNDLE_DEPS_EXTRACT_DIR}/.bundle_owned_packages.deb" _bundle_deb_owned_lines ) if ( _bundle_deb_owned_lines ) list ( APPEND _bundle_deb_replaces ${_bundle_deb_owned_lines} ) endif () endif () list ( REMOVE_DUPLICATES _bundle_deb_replaces ) list ( JOIN _bundle_deb_replaces ", " _bundle_deb_replaces_joined ) set ( CPACK_DEBIAN_BUNDLE_PACKAGE_REPLACES "${_bundle_deb_replaces_joined}" ) set ( CPACK_DEBIAN_BUNDLE_PACKAGE_BREAKS "${_bundle_deb_replaces_joined}" ) message ( STATUS "PACK_BUNDLE: DEB bundle replaces/breaks: ${_bundle_deb_replaces_joined}" ) if ( EXISTS "${BUNDLE_DEPS_EXTRACT_DIR}/.bundle_requires.rpm" ) file ( STRINGS "${BUNDLE_DEPS_EXTRACT_DIR}/.bundle_requires.rpm" _bundle_rpm_req_lines ) if ( _bundle_rpm_req_lines ) list ( JOIN _bundle_rpm_req_lines ", " _bundle_rpm_requires ) set ( CPACK_RPM_BUNDLE_PACKAGE_REQUIRES "${_bundle_rpm_requires}" ) message ( STATUS "PACK_BUNDLE: RPM bundle requires: ${CPACK_RPM_BUNDLE_PACKAGE_REQUIRES}" ) endif () endif () set ( _bundle_rpm_obsoletes "manticore-common" "manticore-server-core" "manticore-server" "manticore-tools" "manticore-devel" "manticore-converter" "manticore-extra" "manticore-icudata" "manticore-language-packs" ) if ( EXISTS "${BUNDLE_DEPS_EXTRACT_DIR}/.bundle_owned_packages.rpm" ) file ( STRINGS "${BUNDLE_DEPS_EXTRACT_DIR}/.bundle_owned_packages.rpm" _bundle_rpm_owned_lines ) if ( _bundle_rpm_owned_lines ) list ( APPEND _bundle_rpm_obsoletes ${_bundle_rpm_owned_lines} ) endif () endif () list ( REMOVE_DUPLICATES _bundle_rpm_obsoletes ) list ( JOIN _bundle_rpm_obsoletes ", " _bundle_rpm_obsoletes_joined ) set ( CPACK_RPM_BUNDLE_PACKAGE_OBSOLETES "${_bundle_rpm_obsoletes_joined}" ) message ( STATUS "PACK_BUNDLE: RPM bundle obsoletes: ${_bundle_rpm_obsoletes_joined}" ) set ( _bundle_rpm_provides "manticore-common" "manticore-server-core" "manticore-server" "manticore-tools" "manticore-devel" "manticore-converter" "manticore-extra" "manticore-icudata" "manticore-language-packs" ) if ( EXISTS "${BUNDLE_DEPS_EXTRACT_DIR}/.bundle_provides.rpm" ) file ( STRINGS "${BUNDLE_DEPS_EXTRACT_DIR}/.bundle_provides.rpm" _bundle_rpm_provide_lines ) if ( _bundle_rpm_provide_lines ) list ( APPEND _bundle_rpm_provides ${_bundle_rpm_provide_lines} ) endif () endif () list ( REMOVE_DUPLICATES _bundle_rpm_provides ) list ( JOIN _bundle_rpm_provides ", " _bundle_rpm_provides_joined ) set ( CPACK_RPM_BUNDLE_PACKAGE_PROVIDES "${_bundle_rpm_provides_joined}" ) message ( STATUS "PACK_BUNDLE: RPM bundle provides: ${_bundle_rpm_provides_joined}" ) # Language packs (morphology de/en/ru + jieba) set ( BUNDLE_LANG_PACKS_EXTRACT_DIR "${CMAKE_BINARY_DIR}/bundle_lang_packs_extract" ) message ( STATUS "PACK_BUNDLE: downloading language packs into ${BUNDLE_LANG_PACKS_EXTRACT_DIR}" ) execute_process ( COMMAND "${MANTICORE_SOURCE_DIR}/dist/download_bundle_language_packs.sh" "${BUNDLE_LANG_PACKS_EXTRACT_DIR}" WORKING_DIRECTORY "${MANTICORE_SOURCE_DIR}" RESULT_VARIABLE _langpacks_result OUTPUT_VARIABLE _langpacks_out ERROR_VARIABLE _langpacks_err ) _bundle_script_fail ( _langpacks_result _langpacks_out _langpacks_err "download_bundle_language_packs.sh" ) endif () include ( FeatureSummary ) # Option to build Source RPMs (SRPMs) - provides instructions for proper SRPM generation set ( BUILD_SRPMS OFF CACHE BOOL "Show instructions for building Source RPMs (SRPMs)" ) if (BUILD_SRPMS) set ( CPACK_RPM_PACKAGE_SOURCES ON ) message ( STATUS "SRPM generation requested - will provide instructions for proper SRPM creation" ) endif () add_feature_info ( "SRPM generation" BUILD_SRPMS "Show instructions for building Source RPM packages" ) # 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 ) if (QFUZZER) if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") target_compile_options ( lextra INTERFACE -g -fsanitize=address,fuzzer ) target_compile_definitions ( lextra INTERFACE DISABLE_MEMROUTINES=1 ) set ( DISABLE_MEMROUTINES ON CACHE BOOL "If the build is broken because new/delete override, this option will disable the overriding" FORCE ) else() message(FATAL_ERROR "QFUZZER requires Clang compiler") endif() endif() # 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__BYTE_ORDER var test_big_endian ( USE_BIG_ENDIAN ) target_compile_options ( lextra INTERFACE $<$:-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 -Wstrict-aliasing> ) target_compile_options ( lextra INTERFACE $<${CLANGWIN}:-Wstrict-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 $<$:-lgcov --coverage> $<$:-lgcov --coverage> $<$: --coverage> $<$: --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) string ( TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" _PROC ) if (_PROC MATCHES "^(i.86|x86(_64)?)$" OR _PROC STREQUAL amd64 OR _PROC STREQUAL arm64 OR _PROC STREQUAL aarch64 OR _PROC STREQUAL s390x) 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 ) target_link_libraries ( lextra INTERFACE cctz::cctz ) include ( GetxxHash ) target_link_libraries ( lextra INTERFACE xxHash::xxhash ) with_get ( jieba "Jieba" "Chinese text segmentation tool" ) # Support for OpenSSL set ( OPENSSL_USE_STATIC_LIBS ON ) include ( GetSSL ) 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" ) win_install ( ZLIB common ) with_menu ( ZSTD "libzstd" "for compressed networking" ) dl_package ( ZSTD "zstd" ) win_install ( ZSTD daemon ) set ( MANTICORE_PREFER_HOMEBREW_CURL ON CACHE BOOL "Prefer Homebrew curl over Apple SDK curl on macOS" ) if (CMAKE_SYSTEM_NAME STREQUAL Darwin AND MANTICORE_PREFER_HOMEBREW_CURL) set ( _curl_should_prefer_homebrew TRUE ) if (DEFINED CURL_LIBRARY_RELEASE AND NOT CURL_LIBRARY_RELEASE MATCHES "\\.tbd$") set ( _curl_should_prefer_homebrew FALSE ) endif () if (_curl_should_prefer_homebrew) foreach (_curl_prefix /opt/homebrew/opt/curl /usr/local/opt/curl) if (EXISTS "${_curl_prefix}/include/curl/curl.h" AND EXISTS "${_curl_prefix}/lib/libcurl.4.dylib") set ( CURL_INCLUDE_DIR "${_curl_prefix}/include" CACHE PATH "Path to curl headers" FORCE ) set ( CURL_LIBRARY_RELEASE "${_curl_prefix}/lib/libcurl.4.dylib" CACHE FILEPATH "Path to curl release library" FORCE ) set ( CURL_ROOT "${_curl_prefix}" CACHE PATH "Path to curl installation" FORCE ) break () endif () endforeach () endif () unset ( _curl_should_prefer_homebrew ) endif () 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" ) # roll-back to 'unversioned' mysql dylib on macos (#2997) if (CMAKE_SYSTEM_NAME STREQUAL Darwin) if (TARGET Mysql::Mysql_ld) if ( DL_MYSQL ) GET_FILENAME_COMPONENT ( __mysql_21_dylib_name ${MYSQL_LIB} NAME ) get_target_property ( _mysql_dylib Mysql::Mysql LOCATION ) GET_FILENAME_COMPONENT ( __mysql_dylib_name ${_mysql_dylib} NAME ) if ( NOT __mysql_21_dylib_name STREQUAL ${__mysql_dylib_name} ) GET_FILENAME_COMPONENT ( __mysql_dir ${MYSQL_LIB} DIRECTORY ) set ( MYSQL_LIB "${__mysql_dir}/${__mysql_dylib_name}" CACHE FILEPATH "Library file of Mysql" FORCE ) infomsg ( "Mysql lib name fixed from ${__mysql_21_dylib_name} to ${__mysql_dylib_name} (${MYSQL_LIB})" ) endif() endif () endif () endif () 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 ) include( builds/VersionDeps ) message("EXECUTOR image: manticoresearch/manticore-executor:${EXECUTOR_VERNUM}") # set final paths for build set ( only_set_paths ON ) include ( SetBuildType ) # Bundle component: base layout (config, stopwords, dirs) plus bundle-only files. Used from cmake/builds/CommonDeb.cmake, CommonRpm.cmake when PACK_BUNDLE (distro files do not use install_component_and_bundle for common/searchd, so bundle base must be installed here). macro ( _manticore_bundle_base_install_rules ) install ( FILES ${MANTICORE_BINARY_DIR}/manticore.conf DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/manticoresearch COMPONENT bundle ) install ( DIRECTORY misc/stopwords DESTINATION ${CMAKE_INSTALL_DATADIR}/manticore COMPONENT bundle ) if ( NOT NOAPI ) install ( DIRECTORY api DESTINATION ${CMAKE_INSTALL_DATADIR}/manticore COMPONENT bundle ) endif () install ( DIRECTORY DESTINATION ${CMAKE_INSTALL_LOCALSTATEDIR}/lib/manticore COMPONENT bundle ) install ( DIRECTORY DESTINATION ${CMAKE_INSTALL_RUNSTATEDIR}/manticore COMPONENT bundle ) install ( DIRECTORY DESTINATION ${CMAKE_INSTALL_LOCALSTATEDIR}/log/manticore COMPONENT bundle ) install ( DIRECTORY DESTINATION /usr/local/lib/manticore COMPONENT bundle ) _manticore_bundle_extra_install_rules () endmacro () # Bundle component only: BUNDLE_LICENSES, LICENSE, INSTALL, component-licenses, deps, lang packs (no base layout; that comes from install_component_and_bundle or _manticore_bundle_base_install_rules). macro ( _manticore_bundle_extra_install_rules ) configure_file ( "${MANTICORE_SOURCE_DIR}/dist/bundle/BUNDLE_LICENSES.in" "${CMAKE_BINARY_DIR}/BUNDLE_LICENSES" @ONLY ) install ( FILES "${CMAKE_BINARY_DIR}/BUNDLE_LICENSES" DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/doc/manticore RENAME BUNDLE_LICENSES COMPONENT bundle ) install ( FILES "${MANTICORE_BINARY_DIR}/LICENSE" "${MANTICORE_SOURCE_DIR}/INSTALL" DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/doc/manticore COMPONENT bundle ) install ( DIRECTORY "${MANTICORE_SOURCE_DIR}/component-licenses" DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/doc/manticore COMPONENT bundle ) if ( EXISTS "${BUNDLE_DEPS_EXTRACT_DIR}" ) # Merge the extracted dependency tree into the package prefix rather than the host root. install ( DIRECTORY ${BUNDLE_DEPS_EXTRACT_DIR}/ DESTINATION . COMPONENT bundle USE_SOURCE_PERMISSIONS ) if ( EXISTS "${BUNDLE_DEPS_EXTRACT_DIR}/usr/share/manticore/modules" ) install ( DIRECTORY "${BUNDLE_DEPS_EXTRACT_DIR}/usr/share/manticore/modules/" DESTINATION ${CMAKE_INSTALL_DATADIR}/manticore/modules COMPONENT bundle ) endif () endif () if ( EXISTS "${BUNDLE_LANG_PACKS_EXTRACT_DIR}" ) install ( DIRECTORY ${BUNDLE_LANG_PACKS_EXTRACT_DIR}/ DESTINATION ${CMAKE_INSTALL_DATADIR}/manticore COMPONENT bundle ) endif () endmacro () # Bundle component: systemd units and etc/default files from dirserver/dirtools (both distros create these). Call from CommonDeb/CommonRpm when PACK_BUNDLE; Debian additionally installs dirserver/manticore (etc/default) before calling. macro ( _manticore_bundle_server_tools_install_rules ) install ( FILES "${dirserver}/manticore.service" DESTINATION ${CMAKE_INSTALL_LIBDIR}/systemd/system COMPONENT bundle ) install ( FILES "${dirtools}/manticore-indexer_global" DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/default COMPONENT bundle ) install ( FILES "${dirtools}/manticore-indexer.service" "${dirtools}/manticore-indexer@.service" DESTINATION ${CMAKE_INSTALL_LIBDIR}/systemd/system COMPONENT bundle ) if ( EXISTS "${MANTICORE_BINARY_DIR}/manticore.tmpfiles" ) install ( FILES "${MANTICORE_BINARY_DIR}/manticore.tmpfiles" DESTINATION ${CMAKE_INSTALL_LIBDIR}/tmpfiles.d COMPONENT bundle RENAME searchd.conf ) endif () endmacro () 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_component_and_bundle ( common DIRECTORY api doc contrib DESTINATION ${CMAKE_INSTALL_DOCDIR} ) install_component_and_bundle ( tools FILES example.sql DESTINATION ${CMAKE_INSTALL_DOCDIR} ) install_component_and_bundle ( common DIRECTORY misc/stopwords DESTINATION ${CMAKE_INSTALL_DATADIR} ) install_component_and_bundle ( common FILES LICENSE INSTALL manticore.conf.in DESTINATION . ) install_component_and_bundle ( searchd DIRECTORY DESTINATION ${CMAKE_INSTALL_LOCALSTATEDIR}/log ) install_component_and_bundle ( common DIRECTORY DESTINATION ${CMAKE_INSTALL_LOCALSTATEDIR} ) 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}" ) # FHS layout: config under etc, data under var/lib/manticore, logs under var/log; when PACK_BUNDLE add bundle-only extras install_component_and_bundle ( common FILES ${MANTICORE_BINARY_DIR}/manticore.conf DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/manticoresearch ) install_component_and_bundle ( common DIRECTORY misc/stopwords DESTINATION ${CMAKE_INSTALL_DATADIR}/manticore ) install_component_and_bundle ( common DIRECTORY DESTINATION ${CMAKE_INSTALL_LOCALSTATEDIR}/lib/manticore ) install_component_and_bundle ( searchd DIRECTORY DESTINATION ${CMAKE_INSTALL_RUNSTATEDIR}/manticore ) install_component_and_bundle ( searchd DIRECTORY DESTINATION ${CMAKE_INSTALL_LOCALSTATEDIR}/log/manticore ) if ( PACK_BUNDLE ) _manticore_bundle_extra_install_rules () endif () 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 () if ( PACK_BUNDLE AND installed AND NOT WIN32 ) if ( APPLE ) # macOS does not go through the Linux distro install helpers, so bundle-only # common payload has to be registered here explicitly. install ( FILES "${MANTICORE_BINARY_DIR}/manticore.conf" DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/manticoresearch COMPONENT bundle ) install ( DIRECTORY "${MANTICORE_SOURCE_DIR}/misc/stopwords" DESTINATION ${CMAKE_INSTALL_DATADIR}/manticore COMPONENT bundle ) if ( NOT NOAPI ) install ( DIRECTORY "${MANTICORE_SOURCE_DIR}/api" DESTINATION ${CMAKE_INSTALL_DATADIR}/manticore COMPONENT bundle ) endif () _manticore_bundle_extra_install_rules () endif () # Server/tools etc/default and systemd units are installed from CommonDeb/CommonRpm (each distro adds only the files it creates). install ( PROGRAMS "${MANTICORE_SOURCE_DIR}/dist/deb/manticore_new_cluster" DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT bundle ) if ( NOT APPLE ) install ( FILES "${MANTICORE_SOURCE_DIR}/dist/70-manticore.conf" DESTINATION /etc/sysctl.d COMPONENT bundle ) endif () install ( FILES "${MANTICORE_SOURCE_DIR}/doc/indexer.1" "${MANTICORE_SOURCE_DIR}/doc/indextool.1" DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 COMPONENT bundle ) install ( FILES "${MANTICORE_SOURCE_DIR}/example.sql" DESTINATION ${CMAKE_INSTALL_DOCDIR} COMPONENT bundle ) install ( FILES "${MANTICORE_BINARY_DIR}/manticore.conf" DESTINATION ${CMAKE_INSTALL_DOCDIR} COMPONENT bundle RENAME manticore.conf.dist ) # searchd: logrotate, man page if ( EXISTS "${MANTICORE_BINARY_DIR}/manticore.logrotate" ) install ( FILES "${MANTICORE_BINARY_DIR}/manticore.logrotate" DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/logrotate.d COMPONENT bundle RENAME manticore ) endif () install ( FILES "${MANTICORE_SOURCE_DIR}/doc/searchd.1" DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 COMPONENT bundle ) # ICU data (same content as manticore-icudata-65l) if ( WITH_ICU AND WITH_ICU_FORCE_STATIC AND TARGET icu::icudata ) get_target_property ( _bundle_icu_data icu::icudata INTERFACE_SOURCES ) if ( _bundle_icu_data ) install ( FILES ${_bundle_icu_data} DESTINATION ${CMAKE_INSTALL_DATADIR}/manticore/icu COMPONENT bundle ) endif () unset ( _bundle_icu_data ) endif () # Common: README.Debian if present if ( EXISTS "${MANTICORE_BINARY_DIR}/README.Debian" ) install ( FILES "${MANTICORE_BINARY_DIR}/README.Debian" DESTINATION ${CMAKE_INSTALL_DOCDIR} COMPONENT bundle ) endif () 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 () # Configure CPack source packaging for SRPM generation set ( CPACK_SOURCE_GENERATOR "RPM" ) set ( CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}" ) # For source RPMs: Override the make command to use cmake --build instead # This automatically handles any generator (Unix Makefiles, Ninja, etc.) if (CPACK_SOURCE_GENERATOR STREQUAL "RPM" OR CPACK_RPM_PACKAGE_SOURCES) set ( CPACK_RPM_SPEC_MORE_DEFINE "${CPACK_RPM_SPEC_MORE_DEFINE} %global __make cmake --build . --parallel") endif() # Configure source directories for debuginfo packages # This is required when debuginfo packaging is enabled set ( CPACK_BUILD_SOURCE_DIRS "${CMAKE_SOURCE_DIR};${CMAKE_BINARY_DIR}" ) # Bundle package name: when PACK_BUNDLE=1 the bundle package is named "manticore" (not "manticore-bundle"). # All components are still built (server, tools, common, etc.); CommonDeb/CommonRpm append "bundle" instead of "meta" so the "manticore" package is the bundle. if (PACK_BUNDLE AND NOT WIN32) set ( _bundle_deb_provides "manticore-common (= ${CPACK_PACKAGE_VERSION})" "manticore-server-core (= ${CPACK_PACKAGE_VERSION})" "manticore-server (= ${CPACK_PACKAGE_VERSION})" "manticore-tools (= ${CPACK_PACKAGE_VERSION})" "manticore-dev (= ${CPACK_PACKAGE_VERSION})" "manticore-converter (= ${CPACK_PACKAGE_VERSION})" "manticore-extra (= ${CPACK_PACKAGE_VERSION})" "manticore-icudata-65l (= ${CPACK_PACKAGE_VERSION})" "manticore-language-packs" ) if ( EXISTS "${BUNDLE_DEPS_EXTRACT_DIR}/.bundle_provides.deb" ) file ( STRINGS "${BUNDLE_DEPS_EXTRACT_DIR}/.bundle_provides.deb" _bundle_deb_provide_lines ) if ( _bundle_deb_provide_lines ) list ( APPEND _bundle_deb_provides ${_bundle_deb_provide_lines} ) endif () endif () list ( REMOVE_DUPLICATES _bundle_deb_provides ) list ( JOIN _bundle_deb_provides ", " _bundle_deb_provides_joined ) set ( CPACK_DEBIAN_BUNDLE_PACKAGE_PROVIDES "${_bundle_deb_provides_joined}" ) message ( STATUS "PACK_BUNDLE: DEB bundle provides: ${_bundle_deb_provides_joined}" ) set ( CPACK_DEBIAN_BUNDLE_PACKAGE_NAME "manticore" ) set ( CPACK_RPM_BUNDLE_PACKAGE_NAME "manticore" ) if ( APPLE ) set ( CPACK_ARCHIVE_BUNDLE_FILE_NAME "${CPACK_PACKAGE_FILE_NAME}" ) else () set ( CPACK_ARCHIVE_BUNDLE_FILE_NAME "manticore" ) endif () endif () 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 ) if (NOT PACK_BUNDLE) cpack_add_component ( meta ) endif () cpack_add_component ( devel GROUP main ) cpack_add_component ( converter GROUP helpers ) cpack_add_component_group ( main EXPANDED ) cpack_add_component_group ( helpers EXPANDED ) # Bundle component only on Linux/macOS; Windows does not get a populated bundle package. # When PACK_BUNDLE, CommonDeb/CommonRpm omit "meta" from CPACK_COMPONENTS_ALL so all component packages plus bundle (named "manticore") are built. if (PACK_BUNDLE AND NOT WIN32) cpack_add_component ( bundle ) set ( CPACK_COMPONENT_BUNDLE_DISPLAY_NAME "Manticore Search" ) set ( CPACK_COMPONENT_BUNDLE_SUMMARY "Manticore Search (server and related components)" ) set ( CPACK_COMPONENT_BUNDLE_DESCRIPTION "Manticore Search server and related components. This package aggregates multiple components with different licenses; see /usr/share/doc/manticore/BUNDLE_LICENSES." ) endif () if (WITH_ICU) cpack_add_component ( icudata ) endif () #if (WITH_JIEBA) # cpack_add_component ( jiebadicts ) #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:")