# -*- mode: CMAKE; -*- # ------------------------------------------------------------------------------ # General # ------------------------------------------------------------------------------ cmake_minimum_required(VERSION 3.2) if (POLICY CMP0048) cmake_policy(SET CMP0048 NEW) endif () if (POLICY CMP0037) cmake_policy(SET CMP0037 NEW) endif () if (POLICY CMP0017) cmake_policy(SET CMP0017 NEW) endif () if (NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Release CACHE string "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." FORCE ) endif () if (NOT (CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo" OR CMAKE_BUILD_TYPE STREQUAL "MinSizeRel" OR CMAKE_BUILD_TYPE STREQUAL "None")) message(FATAL_ERROR "expecting CMAKE_BUILD_TYPE: None Debug Release RelWithDebInfo MinSizeRel, got ${CMAKE_BUILD_TYPE}.") endif () string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UPPER) if (NOT CMAKE_OSX_DEPLOYMENT_TARGET) set(CMAKE_OSX_DEPLOYMENT_TARGET "10.11" CACHE STRING "deployment target for MacOSX; adjust to your sysem") endif () # where to find CMAKE modules set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH}) option(SKIP_PACKAGING "" OFF) # be verbose about flags used option(VERBOSE "be verbose about flags used" OFF) # don't use standalone boost asio # use this when asio is included outside of Boost # add_definitions("-DARANGODB_STANDALONE_ASIO=0") # add_definitions("-DFUERTE_STANDALONE_ASIO=0") # ------------------------------------------------------------------------------ # VERSION information # ------------------------------------------------------------------------------ # stable release: MAJOR.MINOR.PATCH # hot fix: MAJOR.MINOR.PATCH-FIXNUMBER # unstable release: MAJOR.MINOR.PATCH-TYPE.NUMBER # devel: MAJOR.MINOR.0-devel # # These are mapped to the following variables: # # ARANGODB_VERSION_MAJOR = MAJOR # ARANGODB_VERSION_MINOR = MINOR # ARANGODB_VERSION_PATCH = PATCH # # for pre-releases, otherwise empty: # # ARANGODB_VERSION_PRELEASE_TYPE = TYPE # ARANGODB_VERSION_PRELEASE_NUMBER = NUMBER # # This will set the following variables # # ARANGODB_DEBIAN_UPSTREAM # ARANGODB_DEBIAN_REVISION # # ARANGODB_RPM_UPSTREAM # ARANGODB_RPM_REVISION set(ARANGODB_VERSION_MAJOR "3") set(ARANGODB_VERSION_MINOR "5") # when building the nightly ARANGODB_VERSION_PATCH will be set if (NOT DEFINED ARANGODB_VERSION_PATCH) set(ARANGODB_VERSION_PATCH "3") set(ARANGODB_VERSION_RELEASE_TYPE "") set(ARANGODB_VERSION_RELEASE_NUMBER "") else() unset (ARANGODB_VERSION_RELEASE_TYPE) # do not remove space unset (ARANGODB_VERSION_RELEASE_NUMBER) # do not remove space endif() # unset TYPE and NUMBER in case they are empty if (DEFINED ARANGODB_VERSION_RELEASE_TYPE) if (ARANGODB_VERSION_RELEASE_TYPE STREQUAL "") unset (ARANGODB_VERSION_RELEASE_TYPE) # do not remove space unset (ARANGODB_VERSION_RELEASE_NUMBER) # do not remove space endif() else() unset (ARANGODB_VERSION_RELEASE_NUMBER) # do not remove space endif() if (DEFINED ARANGODB_VERSION_RELEASE_NUMBER) if (ARANGODB_VERSION_RELEASE_NUMBER STREQUAL "") unset (ARANGODB_VERSION_RELEASE_NUMBER) # do not remove space endif() endif() # semantic version set(ARANGODB_PLAIN_VERSION "${ARANGODB_VERSION_MAJOR}.${ARANGODB_VERSION_MINOR}.${ARANGODB_VERSION_PATCH}") if (DEFINED ARANGODB_VERSION_RELEASE_TYPE) if (DEFINED ARANGODB_VERSION_RELEASE_NUMBER) set(ARANGODB_VERSION "${ARANGODB_PLAIN_VERSION}-${ARANGODB_VERSION_RELEASE_TYPE}.${ARANGODB_VERSION_RELEASE_NUMBER}") else() set(ARANGODB_VERSION "${ARANGODB_PLAIN_VERSION}-${ARANGODB_VERSION_RELEASE_TYPE}") endif() else() set(ARANGODB_VERSION "${ARANGODB_PLAIN_VERSION}") endif() set(ARANGODB_JS_VERSION "js") message(STATUS "ARANGODB PLAIN VERSION: ${ARANGODB_PLAIN_VERSION}") message(STATUS "ARANGODB VERSION: ${ARANGODB_VERSION}") message(STATUS "ARANGODB JS VERSION: ${ARANGODB_JS_VERSION}") ################################################################################ # DEBIAN, RPM, MacOS version ################################################################################ if (DEFINED ARANGODB_VERSION_RELEASE_TYPE) # devel if (ARANGODB_VERSION_PATCH STREQUAL "0" AND ARANGODB_VERSION_RELEASE_TYPE STREQUAL "devel") set(ARANGODB_DEBIAN_UPSTREAM "${ARANGODB_VERSION_MAJOR}.${ARANGODB_VERSION_MINOR}.0~~${ARANGODB_VERSION_PATCH}") set(ARANGODB_DEBIAN_REVISION "1") set(ARANGODB_RPM_UPSTREAM "${ARANGODB_VERSION_MAJOR}.${ARANGODB_VERSION_MINOR}.0") set(ARANGODB_RPM_REVISION "0.1.devel") set(ARANGODB_DARWIN_UPSTREAM "${ARANGODB_PLAIN_VERSION}") set(ARANGODB_DARWIN_REVISION "devel") # nightly elseif (ARANGODB_VERSION_RELEASE_TYPE STREQUAL "nightly") set(ARANGODB_DEBIAN_UPSTREAM "${ARANGODB_PLAIN_VERSION}") set(ARANGODB_DEBIAN_REVISION "1") set(ARANGODB_RPM_UPSTREAM "${ARANGODB_VERSION_MAJOR}.${ARANGODB_VERSION_MINOR}.0") set(ARANGODB_RPM_REVISION "0.2.nightly") set(ARANGODB_DARWIN_UPSTREAM "${ARANGODB_PLAIN_VERSION}") set(ARANGODB_DARWIN_REVISION "nightly") # unstable version elseif ( ARANGODB_VERSION_RELEASE_TYPE STREQUAL "alpha" OR ARANGODB_VERSION_RELEASE_TYPE STREQUAL "beta" OR ARANGODB_VERSION_RELEASE_TYPE STREQUAL "milestone" OR ARANGODB_VERSION_RELEASE_TYPE STREQUAL "preview" OR ARANGODB_VERSION_RELEASE_TYPE STREQUAL "rc") if (NOT DEFINED ARANGODB_VERSION_RELEASE_NUMBER) message(FATAL_ERROR "ARANGODB_VERSION_RELEASE_NUMBER is missing") endif() if (ARANGODB_VERSION_RELEASE_TYPE STREQUAL "alpha") set(ARANGODB_RPM_REVISION_NUMBER 100) elseif (ARANGODB_VERSION_RELEASE_TYPE STREQUAL "beta") set(ARANGODB_RPM_REVISION_NUMBER 200) elseif (ARANGODB_VERSION_RELEASE_TYPE STREQUAL "milestone") set(ARANGODB_RPM_REVISION_NUMBER 300) elseif (ARANGODB_VERSION_RELEASE_TYPE STREQUAL "preview") set(ARANGODB_RPM_REVISION_NUMBER 400) elseif (ARANGODB_VERSION_RELEASE_TYPE STREQUAL "rc") set(ARANGODB_RPM_REVISION_NUMBER 500) endif() MATH(EXPR ARANGODB_RPM_REVISION_NUMBER "${ARANGODB_RPM_REVISION_NUMBER}+${ARANGODB_VERSION_RELEASE_NUMBER}") set(ARANGODB_DEBIAN_UPSTREAM "${ARANGODB_PLAIN_VERSION}~${ARANGODB_VERSION_RELEASE_TYPE}.${ARANGODB_VERSION_RELEASE_NUMBER}") set(ARANGODB_DEBIAN_REVISION "1") set(ARANGODB_RPM_UPSTREAM "${ARANGODB_PLAIN_VERSION}") set(ARANGODB_RPM_REVISION "0.${ARANGODB_RPM_REVISION_NUMBER}") set(ARANGODB_DARWIN_UPSTREAM "${ARANGODB_PLAIN_VERSION}") set(ARANGODB_DARWIN_REVISION "${ARANGODB_VERSION_RELEASE_TYPE}.${ARANGODB_VERSION_RELEASE_NUMBER}") # hot-fix else() if (DEFINED ARANGODB_VERSION_RELEASE_NUMBER) message(FATAL_ERROR "ARANGODB_VERSION_RELEASE_NUMBER must be empty for type ${ARANGODB_VERSION_RELEASE_TYPE}") endif() set(ARANGODB_DEBIAN_UPSTREAM "${ARANGODB_PLAIN_VERSION}.${ARANGODB_VERSION_RELEASE_TYPE}") set(ARANGODB_DEBIAN_REVISION "1") set(ARANGODB_RPM_UPSTREAM "${ARANGODB_PLAIN_VERSION}") set(ARANGODB_RPM_REVISION "1.${ARANGODB_VERSION_RELEASE_TYPE}") set(ARANGODB_DARWIN_UPSTREAM "${ARANGODB_PLAIN_VERSION}.${ARANGODB_VERSION_RELEASE_TYPE}") set(ARANGODB_DARWIN_REVISION "") endif() else() # stable version set(ARANGODB_DEBIAN_UPSTREAM "${ARANGODB_PLAIN_VERSION}") set(ARANGODB_DEBIAN_REVISION "1") set(ARANGODB_RPM_UPSTREAM "${ARANGODB_PLAIN_VERSION}") set(ARANGODB_RPM_REVISION "1.0") set(ARANGODB_DARWIN_UPSTREAM "${ARANGODB_PLAIN_VERSION}") set(ARANGODB_DARWIN_REVISION "") endif() message(STATUS "DEBIAN VERSION: ${ARANGODB_DEBIAN_UPSTREAM} / ${ARANGODB_DEBIAN_REVISION}") message(STATUS "RPM VERSION: ${ARANGODB_RPM_UPSTREAM} / ${ARANGODB_RPM_REVISION}") message(STATUS "DARWIN VERSION: ${ARANGODB_DARWIN_UPSTREAM} / ${ARANGODB_DARWIN_REVISION}") ################################################################################ # Windows version ################################################################################ # PATCH needs to be numeric for the windows rc file set(ARANGODB_WINDOWS_UPSTREAM "${ARANGODB_VERSION}") if (ARANGODB_VERSION_PATCH GREATER -1) set(ARANGODB_WINDOWS_PATCH "${ARANGODB_VERSION_PATCH}") else() set(ARANGODB_WINDOWS_PATCH 1337) endif() message(STATUS "WINDOWS VERSION: ${ARANGODB_WINDOWS_UPSTREAM}") if (MSVC) option(USE_CLCACHE_MODE "whether we want to use CLCACHE-specific build options" OFF ) endif () ################################################################################ # SNAP version ################################################################################ set(ARANGODB_SNAP_REVISION "1") message(STATUS "SNAP REVISION: ${ARANGODB_SNAP_REVISION}") # ------------------------------------------------------------------------------ # # ------------------------------------------------------------------------------ if (WIN32) project(arangodb3 LANGUAGES CXX C VERSION ${ARANGODB_VERSION_MAJOR}.${ARANGODB_VERSION_MINOR}) else () project(arangodb3 LANGUAGES CXX C ASM VERSION ${ARANGODB_VERSION_MAJOR}.${ARANGODB_VERSION_MINOR}) endif () # required for clang completion in editors - must be set after creating project set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # Static executables: option(STATIC_EXECUTABLES "produce static executables" OFF) if (STATIC_EXECUTABLES) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static") endif() # enable enterprise features set(ENTERPRISE_INCLUDE_DIR "enterprise") option(USE_ENTERPRISE "enable enterprise build" OFF) if (USE_ENTERPRISE) add_definitions("-DUSE_ENTERPRISE=1") add_subdirectory(enterprise) endif () option(DEBUG_SYNC_REPLICATION "Enable debug code to enable synchronous replication debugging" OFF) if (DEBUG_SYNC_REPLICATION) add_definitions("-DDEBUG_SYNC_REPLICATION=1") endif () # for the packages set(ARANGODB_PACKAGE_VENDOR "ArangoDB GmbH") set(ARANGODB_PACKAGE_CONTACT "info@arangodb.com") set(ARANGODB_DISPLAY_NAME "ArangoDB") set(ARANGODB_URL_INFO_ABOUT "https://www.arangodb.com") set(ARANGODB_HELP_LINK "https://docs.arangodb.com/${ARANGODB_VERSION_MAJOR}.${ARANGODB_VERSION_MINOR}/") set(ARANGODB_CONTACT "hackers@arangodb.com") set(ARANGODB_FRIENDLY_STRING "ArangoDB - the native multi-model NoSQL database") # MSVC set(ARANGO_BENCH_FRIENDLY_STRING "arangobench - stress test program") set(ARANGO_BACKUP_FRIENDLY_STRING "arangobackup - hot backup tool") set(ARANGO_DUMP_FRIENDLY_STRING "arangodump - export") set(ARANGO_RESTORE_FRIENDLY_STRING "arangrestore - importer") set(ARANGO_EXPORT_FRIENDLY_STRING "arangoexport - data exporter") set(ARANGO_IMPORT_FRIENDLY_STRING "arangoimport - TSV/CSV/JSON importer") set(ARANGOSH_FRIENDLY_STRING "arangosh - commandline client") set(ARANGO_VPACK_FRIENDLY_STRING "arangovpack - vpack printer") # libraries set(LIB_ARANGO arango) set(LIB_ARANGO_GEO arango_geo) set(LIB_ARANGO_V8 arango_v8) # binaries set(BIN_ARANGOBENCH arangobench) set(BIN_ARANGOBACKUP arangobackup) set(BIN_ARANGOD arangod) set(BIN_ARANGODUMP arangodump) set(BIN_ARANGOEXPORT arangoexport) set(BIN_ARANGOIMPORT arangoimport) set(BIN_ARANGORESTORE arangorestore) set(BIN_ARANGOSH arangosh) set(BIN_ARANGOVPACK arangovpack) # test binaries set(BIN_ARANGODB_TESTS arangodbtests) set(CLEAN_AUTOGENERATED_FILES) set(PACKAGES_LIST) set(COPY_PACKAGES_LIST) set(CLEAN_PACKAGES_LIST) set(INSTALL_CONFIGFILES_LIST) # ------------------------------------------------------------------------------ # update files containing VERSION information # ------------------------------------------------------------------------------ if (${CMAKE_MAJOR_VERSION} EQUAL 2) set(ARANGODB_BUILD_DATE "YYYY-MM-DD HH:MM:SS") else () string(TIMESTAMP ARANGODB_BUILD_DATE "%Y-%m-%d %H:%M:%S") endif () configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/lib/Basics/build.h.in" "${CMAKE_CURRENT_BINARY_DIR}/lib/Basics/build.h" NEWLINE_STYLE UNIX ) if (NOT DEFINED GENERATE_BUILD_DATE OR GENERATE_BUILD_DATE) set(GENERATE_BUILD_DATE ON CACHE INTERNAL "whether we should generate the build date") configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/lib/Basics/build-date.h.in" "${CMAKE_CURRENT_BINARY_DIR}/lib/Basics/build-date.h" NEWLINE_STYLE UNIX ) else() set(GENERATE_BUILD_DATE OFF CACHE INTERNAL "whether we should generate the build date") endif() configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/lib/Basics/VERSION.in" "${CMAKE_CURRENT_SOURCE_DIR}/VERSION" NEWLINE_STYLE UNIX ) ################################################################################ ## Find the git revision ################################################################################ find_program (GIT_EXE git) if (DEFINED GIT_EXE AND IS_DIRECTORY "${CMAKE_SOURCE_DIR}/.git") execute_process( WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMAND ${GIT_EXE} describe --all --tags --long --dirty=-dirty OUTPUT_VARIABLE GIT_OUTPUT) # this may fail on shallow clones that only knows about a limited number of commits. # if there is an older merged revision the head, it may not be available to git. if (NOT GIT_OUTPUT) set(ARANGODB_BUILD_REPOSITORY "GIT FAILED TO RETRIEVE THE VERSION - SHALLOW CLONE?") set(HAVE_ARANGODB_BUILD_REPOSITORY "1") else() string(STRIP ${GIT_OUTPUT} REPOSITORY_VERSION) set(ARANGODB_BUILD_REPOSITORY ${REPOSITORY_VERSION}) set(HAVE_ARANGODB_BUILD_REPOSITORY "1") endif() else () set(ARANGODB_BUILD_REPOSITORY "") set(HAVE_ARANGODB_BUILD_REPOSITORY "0") endif() configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/lib/Basics/build-repository.h.in" "${CMAKE_CURRENT_BINARY_DIR}/lib/Basics/build-repository.h" NEWLINE_STYLE UNIX ) if (VERBOSE) message(STATUS "ARANGODB_BUILD_REPOSITORY=\"${ARANGODB_BUILD_REPOSITORY}\"") endif () ################################################################################ ## OPERATION SYSTEM ################################################################################ option(HOMEBREW "whether to install for homebrew" Off ) if (WIN32) set(WINDOWS TRUE) set(MSBUILD TRUE) add_definitions(-D_USE_MATH_DEFINES -DNOMINMAX -D_WIN32_WINNT=_WIN32_WINNT_VISTA -DINCL_EXTRA_HTON_FUNCTIONS -DPSAPI_VERSION=1) elseif (UNIX AND NOT APPLE) if(CMAKE_SYSTEM_NAME MATCHES ".*Linux") set(LINUX TRUE) elseif (CMAKE_SYSTEM_NAME MATCHES "kFreeBSD.*") set(FREEBSD TRUE) elseif (CMAKE_SYSTEM_NAME MATCHES "kNetBSD.*|NetBSD.*") set(NETBSD TRUE) elseif (CMAKE_SYSTEM_NAME MATCHES "kOpenBSD.*|OpenBSD.*") set(OPENBSD TRUE) elseif (CMAKE_SYSTEM_NAME MATCHES ".*GNU.*") set(GNU TRUE) elseif (CMAKE_SYSTEM_NAME MATCHES ".*BSDI.*") set(BSDI TRUE) elseif (CMAKE_SYSTEM_NAME MATCHES "DragonFly.*|FreeBSD") set(FREEBSD TRUE) elseif (CMAKE_SYSTEM_NAME MATCHES "SYSV5.*") set(SYSV5 TRUE) elseif ((CMAKE_SYSTEM_NAME MATCHES "Solaris.*") OR (CMAKE_SYSTEM_NAME MATCHES "SunOS.*")) set(SOLARIS TRUE) elseif (CMAKE_SYSTEM_NAME MATCHES "HP-UX.*") set(HPUX TRUE) elseif (CMAKE_SYSTEM_NAME MATCHES "AIX.*") set(AIX TRUE) elseif (CMAKE_SYSTEM_NAME MATCHES "Minix.*") set(MINIX TRUE) endif () elseif (APPLE) if (CMAKE_SYSTEM_NAME MATCHES ".*Darwin.*") set(DARWIN TRUE) elseif (CMAKE_SYSTEM_NAME MATCHES ".*MacOS.*") set(DARWIN TRUE) endif () find_program(BREW brew) endif () # ------------------------------------------------------------------------------ # user options # ------------------------------------------------------------------------------ if (WINDOWS) SET(USE_JEMALLOC OFF) else () option( USE_JEMALLOC "use jemalloc memory allocator" ON ) endif () if (CROSS_COMPILING) # curently off, need additional params to configure like --hoast=triple SET(USE_JEMALLOC OFF) endif() ################################################################################ ## EXTERNAL PROGRAMS ################################################################################ if (SOLARIS) set(MAKE gmake) else () set(MAKE make) endif () find_package(PythonInterp 2 EXACT REQUIRED) get_filename_component(PYTHON_EXECUTABLE "${PYTHON_EXECUTABLE}" REALPATH) set($ENV{PYTHON_EXECUTABLE} ${PYTHON_EXECUTABLE}) # FIXME the build containers seem to have a # /usr/bin/ch(mod|own) to prevent the search # to find those files the NO_DEFAULT_PATH # argument is passed if (NOT WINDOWS) find_program( CHMOD_EXECUTABLE chmod PATHS "/bin/" "/usr/bin/" NO_DEFAULT_PATH ) message(STATUS "chmod found in ${CHMOD_EXECUTABLE}") find_program( CHOWN_EXECUTABLE chown PATHS "/bin" "/usr/bin" NO_DEFAULT_PATH ) message(STATUS "chown found in ${CHOWN_EXECUTABLE}") endif() ################################################################################ ## ARCHITECTURE ################################################################################ if (SOLARIS OR NOT CMAKE_SIZEOF_VOID_P) set(CMAKE_SIZEOF_VOID_P 8) set(CMAKE_CXX_SIZEOF_DATA_PTR 8) endif () math(EXPR BITS "8*${CMAKE_SIZEOF_VOID_P}") add_definitions("-DARANGODB_BITS=${BITS}") ################################################################################ ## COMPILER FEATURES ################################################################################ if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") set(CMAKE_COMPILER_IS_CLANG 1) elseif (CMAKE_CXX_COMPILER_ID MATCHES "AppleClang") set(CMAKE_COMPILER_IS_CLANG 1) endif () if (WINDOWS) set(BASE_FLAGS "/D WIN32 /D _WINDOWS /W3 /MP" CACHE STRING "base flags") set(BASE_C_FLAGS "" CACHE STRING "base C flags") set(BASE_CXX_FLAGS "/GR /EHsc" CACHE STRING "base C++flags") else () set(BASE_FLAGS "" CACHE STRING "base flags") set(BASE_C_FLAGS "${CMAKE_C_FLAGS} $ENV{CFLAGS}" CACHE STRING "base C flags") set(BASE_CXX_FLAGS "${CMAKE_CXX_FLAGS} $ENV{CXXFLAGS}" CACHE STRING "base C++ flags") set(BASE_LD_FLAGS "$ENV{LDFLAGS}" CACHE STRING "base linker flags") set(BASE_LIBS "$ENV{LIBS}" CACHE STRING "base libraries") endif () if (SOLARIS) set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++") set(CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES /lib;/lib64;/lib64;/usr/lib;/usr/lib64;/usr/lib64 ) list(APPEND SYSTEM_LIBRARIES nsl socket) # force 64bit compile set(BASE_FLAGS "-I /opt/csw/include -D_REENTRANT -m64 ${BASE_FLAGS}") endif () if (CMAKE_COMPILER_IS_GNUCC) if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "5.4") message(FATAL_ERROR "ArangoDB requires g++ 5.4 or newer.") elseif(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "9.9.9") message(FATAL_ERROR "ArangoDB doesn't support g++ 10.0 yet.") endif() set(BASE_C_FLAGS "${BASE_C_FLAGS}") endif () if (CMAKE_COMPILER_IS_GNUCC OR APPLE) if (CMAKE_COMPILER_IS_GNUCC AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6) set(BASE_CXX_FLAGS "${BASE_CXX_FLAGS} -std=c++11") else() set(BASE_CXX_FLAGS "${BASE_CXX_FLAGS} -std=c++14") endif() endif () if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") # MSVC2018.1 - MSVC2018.7 does not correctly support alignas() if (MSVC_VERSION VERSION_LESS 1915) message(FATAL_ERROR "ArangoDB Requires at least MSVC 2017 update 15.8!") endif() # MSVC2018.8 requires the following define add_definitions(-D_ENABLE_EXTENDED_ALIGNED_STORAGE) endif() if (CMAKE_COMPILER_IS_CLANG) if (APPLE) if (NOT DEFINED ENV{MACOSX_DEPLOYMENT_TARGET} OR ENV{MACOSX_DEPLOYMENT_TARGET} STREQUAL "") set(BASE_CXX_FLAGS "${BASE_CXX_FLAGS} -stdlib=libc++") else () set(BASE_C_FLAGS "${BASE_C_FLAGS} -mmacosx-version-min=$ENV{MACOSX_DEPLOYMENT_TARGET}") set(BASE_CXX_FLAGS "${BASE_CXX_FLAGS} -stdlib=libc++ -mmacosx-version-min=$ENV{MACOSX_DEPLOYMENT_TARGET}") set(BASE_LD_FLAGS "${BASE_LD_FLAGS} -mmacosx-version-min=$ENV{MACOSX_DEPLOYMENT_TARGET}") endif () add_definitions("-Wno-deprecated-declarations") else () if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "3.3") message(FATAL_ERROR "ArangoDB requires clang 3.3 or newer.") endif() list(APPEND BASE_LIBS atomic) endif () endif () # need c++14 # XXX this should really be set on a per target level using cmake compile_features capabilties set(CMAKE_CXX_STANDARD 14) # need threads find_package(Threads REQUIRED) if (MSVC) configure_file("Installation/Windows/vcproj.user/arangod.vcxproj.user" ${CMAKE_BINARY_DIR}) add_definitions("-D_CRT_SECURE_NO_WARNINGS=1") add_definitions("-DFD_SETSIZE=8192") add_definitions("-DU_STATIC_IMPLEMENTATION=1") # https://blogs.msdn.microsoft.com/vcblog/2016/04/14/stl-fixes-in-vs-2015-update-2/ # https://connect.microsoft.com/VisualStudio/feedback/details/1892487 # http://lists.boost.org/boost-users/2016/04/85968.php add_definitions("-D_ENABLE_ATOMIC_ALIGNMENT_FIX") # bcrypt is needed for SSL set(MSVC_LIBS Shlwapi.lib;crypt32.lib;bcrypt.lib;WINMM.LIB;Ws2_32.lib;Psapi.lib) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:CONSOLE /SAFESEH:NO /MACHINE:x64 /ignore:4099 ${BASE_LD_FLAGS}" ) else () set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${BASE_LD_FLAGS}" ) endif () # broken clock_gettime on MacOSX SET(USE_LOCAL_CLOCK_GETTIME FALSE) if (APPLE) TRY_RUN(RUN_CLOCK_GETTIME COMPILE_CLOCK_GETTIME ${PROJECT_BINARY_DIR}/test_clock_gettime ${CMAKE_SOURCE_DIR}/cmake/test_clock_gettime.c OUTPUT_VARIABLE OUTPUT_CLOCK_GETTIME) if (${COMPILE_CLOCK_GETTIME}) if (${RUN_CLOCK_GETTIME} STREQUAL "FAILED_TO_RUN") set(USE_LOCAL_CLOCK_GETTIME TRUE) endif () endif () if (USE_LOCAL_CLOCK_GETTIME) message(STATUS "using a home-made clock_gettime") endif () endif () ################################################################################ ## INCLUDE DIRECTORIES ################################################################################ include_directories(${PROJECT_BINARY_DIR}) include_directories(${PROJECT_BINARY_DIR}/lib) include_directories(${PROJECT_SOURCE_DIR}) include_directories(${PROJECT_SOURCE_DIR}/arangod) include_directories(${PROJECT_SOURCE_DIR}/arangosh) include_directories(${PROJECT_SOURCE_DIR}/lib) if (CUSTOM_INCLUDES) include_directories(${CUSTOM_INCLUDES}) endif () ################################################################################ ## TARGET ARCHITECTURE ################################################################################ set(ARANGODB_SSE42_FLAGS "") if (WINDOWS) add_definitions("-DNO_SSE42") else () include(TargetArch) target_architecture(CMAKE_TARGET_ARCHITECTURES) list(LENGTH CMAKE_TARGET_ARCHITECTURES cmake_target_arch_len) if (NOT "${cmake_target_arch_len}" EQUAL "1") set(CMAKE_TARGET_ARCHITECTURE_UNIVERSAL TRUE) set(CMAKE_TARGET_ARCHITECTURE_CODE "universal") else () set(CMAKE_TARGET_ARCHITECTURE_UNIVERSAL FALSE) set(CMAKE_TARGET_ARCHITECTURE_CODE "${CMAKE_TARGET_ARCHITECTURES}") endif () include(VcMacros) option(USE_OPTIMIZE_FOR_ARCHITECTURE "try to determine CPU architecture" ON) if (USE_OPTIMIZE_FOR_ARCHITECTURE) # mop: core2 (merom) is our absolute minimum! # SET(TARGET_ARCHITECTURE "merom") include(OptimizeForArchitecture) OptimizeForArchitecture() endif () if (USE_SSE4_2) set(ARANGODB_SSE42_FLAGS "-msse4.2") endif () set(BASE_FLAGS "${Vc_ARCHITECTURE_FLAGS} ${BASE_FLAGS}") endif () set(ARCHITECTURE_OPTIMIZATIONS "\"${Vc_ARCHITECTURE_FLAGS}\"") ################################################################################ ## BACKTRACE ################################################################################ option(USE_BACKTRACE "whether we should try to generate c-level stacktraces" OFF ) # iresearch uses backtrace anyway, so we need to find and link libexecinfo # for the case that we are on libmusl and not on glibc if (NOT MSVC) find_package(Backtrace) endif() if (USE_BACKTRACE) if (MSVC) set(BT_LIBS "Dbghelp" CACHE path "Debug Helper libraries") else () set(BT_LIBS ${Backtrace_LIBRARY} CACHE path "Debug Helper libraries") endif () add_definitions("-DARANGODB_ENABLE_BACKTRACE=1") else () set(BT_LIBS ${Backtrace_LIBRARY} CACHE path "Debug Helper libraries") endif () ################################################################################ ## ASSEMBLER OPTIMIZATIONS ################################################################################ # Allow to prohibit assembler optimization code explicitly if (MSVC) SET(ASM_OPTIMIZATIONS_DEFAULT OFF) else (MSVC) SET(ASM_OPTIMIZATIONS_DEFAULT ON) endif (MSVC) option(ASM_OPTIMIZATIONS "whether hand-optimized assembler code should be used" ${ASM_OPTIMIZATIONS_DEFAULT}) if (ASM_OPTIMIZATIONS) add_definitions("-DASM_OPTIMIZATIONS=1") else (ASM_OPTIMIZATIONS) add_definitions("-DASM_OPTIMIZATIONS=0") endif (ASM_OPTIMIZATIONS) ################################################################################ ## MAINTAINER MODE ################################################################################ option(USE_MAINTAINER_MODE "whether we want to have assertions and other development features" OFF ) if (USE_MAINTAINER_MODE) add_definitions("-DARANGODB_ENABLE_MAINTAINER_MODE=1") if (CMAKE_COMPILER_IS_GNUCC) add_definitions("-D_FORTIFY_SOURCE=2") endif() find_package(FLEX) find_package(BISON) # these are required for generateREADME.sh find_program(FGREP_EXECUTABLE fgrep) find_program(MARKDOWN_EXECUTABLE markdown) find_program(HTML2TEXT_EXECUTABLE html2text) find_program(SED_EXECUTABLE sed) find_program(AWK_EXECUTABLE awk) endif () option(USE_GOOGLE_TESTS "Compile C++ unit tests" ON) if (USE_GOOGLE_TESTS) add_definitions("-DARANGODB_USE_GOOGLE_TESTS=1") endif() include(debugInformation) find_program(READELF_EXECUTABLE readelf) detect_binary_id_type(CMAKE_DEBUG_FILENAMES_SHA_SUM) ################################################################################ ## FAILURE TESTS ################################################################################ option(USE_FAILURE_TESTS "whether we want to have failure tests compiled in" OFF ) if (USE_FAILURE_TESTS) add_definitions("-DARANGODB_ENABLE_FAILURE_TESTS=1") endif () ################################################################################ ## LIBRARY RESOLV ################################################################################ if (NOT WINDOWS) set(SYS_LIBS ${SYS_LIBS} resolv) if (NOT DARWIN) set(SYS_LIBS ${SYS_LIBS} rt) endif () endif () # ------------------------------------------------------------------------------ # IMPLICIT INCLUDES AND LIBIRARY DIRECTORIES # ------------------------------------------------------------------------------ function(CREATE_FLAGS OUTPUT GLUE) set(_TMP_RESULT "") foreach(arg ${ARGN}) set(_TMP_RESULT "${_TMP_RESULT} ${GLUE}${arg}") endforeach() set(${OUTPUT} "${_TMP_RESULT}" PARENT_SCOPE) endfunction() # CREATE_FLAGS(IMPLICIT_C_INCLUDES "${CMAKE_C_SYSROOT_FLAG} " ${CMAKE_OSX_SYSROOT}) # CREATE_FLAGS(IMPLICIT_CXX_INCLUDES "${CMAKE_CXX_SYSROOT_FLAG} " ${CMAKE_OSX_SYSROOT}) # ------------------------------------------------------------------------------ # JEMALLOC # ------------------------------------------------------------------------------ if (USE_JEMALLOC) add_definitions("-DARANGODB_HAVE_JEMALLOC=1") endif () # ------------------------------------------------------------------------------ # NDEBUG # ------------------------------------------------------------------------------ add_definitions(-DNDEBUG) ################################################################################ ## FLAGS ################################################################################ if (VERBOSE) message(STATUS) endif () # compiler options if (CMAKE_COMPILER_IS_GNUCC) if (VERBOSE) message(STATUS "Compiler type GNU: ${CMAKE_CXX_COMPILER}") endif () set(BASE_FLAGS "-Wall -Wextra -Wno-unused-parameter ${BASE_FLAGS}") set(CMAKE_C_FLAGS "-g" CACHE INTERNAL "default C compiler flags") set(CMAKE_C_FLAGS_DEBUG "-O0 -g -D_DEBUG=1" CACHE INTERNAL "C debug flags") set(CMAKE_C_FLAGS_MINSIZEREL "-Os" CACHE INTERNAL "C minimal size flags") set(CMAKE_C_FLAGS_RELEASE "-O3 -fomit-frame-pointer" CACHE INTERNAL "C release flags") set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O3 -g -fno-omit-frame-pointer" CACHE INTERNAL "C release with debug info flags") set(CMAKE_CXX_FLAGS "-g -Wnon-virtual-dtor" CACHE INTERNAL "default C++ compiler flags") set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g -D_DEBUG=1" CACHE INTERNAL "C++ debug flags") set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os" CACHE INTERNAL "C++ minimal size flags") set(CMAKE_CXX_FLAGS_RELEASE "-O3 -fomit-frame-pointer" CACHE INTERNAL "C++ release flags") set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 -g -fno-omit-frame-pointer" CACHE INTERNAL "C++ release with debug info flags") elseif (CMAKE_COMPILER_IS_CLANG) if (VERBOSE) message(STATUS "Compiler type CLANG: ${CMAKE_CXX_COMPILER}") endif () set(BASE_FLAGS "-Wall -Wextra -Wno-unused-parameter ${BASE_FLAGS}") set(CMAKE_C_FLAGS "-g" CACHE INTERNAL "default C compiler flags") set(CMAKE_C_FLAGS_DEBUG "-O0 -g -D_DEBUG=1" CACHE INTERNAL "C debug flags") set(CMAKE_C_FLAGS_MINSIZEREL "-Os" CACHE INTERNAL "C minimal size flags") set(CMAKE_C_FLAGS_RELEASE "-O3 -fomit-frame-pointer" CACHE INTERNAL "C release flags") set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O3 -g -fno-omit-frame-pointer" CACHE INTERNAL "C release with debug info flags") set(CMAKE_CXX_FLAGS "-g -Wnon-virtual-dtor" CACHE INTERNAL "default C++ compiler flags") set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g -D_DEBUG=1" CACHE INTERNAL "C++ debug flags") set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os" CACHE INTERNAL "C++ minimal size flags") set(CMAKE_CXX_FLAGS_RELEASE "-O3 -fomit-frame-pointer" CACHE INTERNAL "C++ release flags") set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 -g -fno-omit-frame-pointer" CACHE INTERNAL "C++ release with debug info flags") elseif (MSVC) if (VERBOSE) message(STATUS "Compiler type MSVC: ${CMAKE_CXX_COMPILER}") endif () set(CMAKE_C_FLAGS "/MTd" CACHE INTERNAL "default C++ compiler flags") set(CMAKE_C_FLAGS_DEBUG "/D _DEBUG /MTd /Zi /Ob0 /Od /RTC1 /bigobj" CACHE INTERNAL "C++ debug flags") set(CMAKE_C_FLAGS_MINSIZEREL "/MT /O1 /Ob1" CACHE INTERNAL "C++ minimal size flags") set(CMAKE_C_FLAGS_RELEASE "/MT /O2 /Ob2" CACHE INTERNAL "C++ release flags") set(CMAKE_C_FLAGS_RELWITHDEBINFO "/MT /Zi /O2 /Ob1" CACHE INTERNAL "C++ release with debug info flags") set(CMAKE_CXX_FLAGS "/MTd" CACHE INTERNAL "default C++ compiler flags") set(CMAKE_CXX_FLAGS_DEBUG "/D _DEBUG /MTd /Zi /Ob0 /Od /RTC1 /bigobj" CACHE INTERNAL "C++ debug flags") set(CMAKE_CXX_FLAGS_MINSIZEREL "/MT /O1 /Ob1" CACHE INTERNAL "C++ minimal size flags") set(CMAKE_CXX_FLAGS_RELEASE "/MT /O2 /Ob2" CACHE INTERNAL "C++ release flags") set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/MT /Zi /O2 /Ob1" CACHE INTERNAL "C++ release with debug info flags") if (USE_CLCACHE_MODE) set(CMAKE_VS_GLOBALS "TrackFileAccess=false") add_definitions(/Z7) endif () else () # unknown compiler message(STATUS "Compiler type UNKNOWN: ${CMAKE_CXX_COMPILER}") set(BASE_FLAGS "-Wall ${BASE_FLAGS}") set(CMAKE_C_FLAGS "-g" CACHE INTERNAL "default C compiler flags") set(CMAKE_C_FLAGS_DEBUG "-O0 -g" CACHE INTERNAL "C debug flags") set(CMAKE_C_FLAGS_MINSIZEREL "-Os" CACHE INTERNAL "C minimal size flags") set(CMAKE_C_FLAGS_RELEASE "-O3 -fomit-frame-pointer" CACHE INTERNAL "C release flags") set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O3 -g -fno-omit-frame-pointer" CACHE INTERNAL "C release with debug info flags") set(CMAKE_CXX_FLAGS "-g" CACHE INTERNAL "default C++ compiler flags") set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g" CACHE INTERNAL "C++ debug flags") set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os" CACHE INTERNAL "C++ minimal size flags") set(CMAKE_CXX_FLAGS_RELEASE "-O3 -fomit-frame-pointer" CACHE INTERNAL "C++ release flags") set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 -g -fno-omit-frame-pointer" CACHE INTERNAL "C++ release with debug info flags") endif () set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${BASE_FLAGS} ${BASE_C_FLAGS}") set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${BASE_FLAGS} ${BASE_C_FLAGS}") set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} ${BASE_FLAGS} ${BASE_C_FLAGS}") set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} ${BASE_FLAGS} ${BASE_C_FLAGS}") set(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} ${BASE_FLAGS} ${BASE_C_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${BASE_FLAGS} ${BASE_CXX_FLAGS}") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${BASE_FLAGS} ${BASE_CXX_FLAGS}") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${BASE_FLAGS} ${BASE_CXX_FLAGS}") set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} ${BASE_FLAGS} ${BASE_CXX_FLAGS}") set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} ${BASE_FLAGS} ${BASE_CXX_FLAGS}") if (VERBOSE) message(STATUS "Info BASE_FLAGS: ${BASE_FLAGS}") message(STATUS "Info BASE_C_FLAGS: ${BASE_C_FLAGS}") message(STATUS "Info BASE_CXX_FLAGS: ${BASE_CXX_FLAGS}") message(STATUS "Info BASE_LD_FLAGS: ${BASE_LD_FLAGS}") message(STATUS "Info BASE_LIBS: ${BASE_LIBS}") message(STATUS) if (CMAKE_BUILD_TYPE STREQUAL "None") message(STATUS "Info CMAKE_C_FLAGS: ${CMAKE_C_FLAGS}") message(STATUS "Info CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}") else () message(STATUS "Info CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UPPER}: ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UPPER}}") message(STATUS "Info CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE_UPPER}: ${CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE_UPPER}}") endif () message(STATUS "Info CMAKE_EXE_LINKER_FLAGS: ${CMAKE_EXE_LINKER_FLAGS}") message(STATUS) endif () if(ARANGODB_DEBUG_CMAKE) get_directory_property( DirDefs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMPILE_DEFINITIONS ) foreach( d ${DirDefs} ) message( STATUS "Found Define: " ${d} ) endforeach() message( STATUS "DirDefs: ${DirDefs}" ) endif() ################################################################################ ## OpenSSL ################################################################################ if (NOT EXISTS "${CMAKE_CURRENT_LIST_DIR}/VERSIONS") message(FATAL_ERROR "expecting ${CMAKE_CURRENT_LIST_DIR}/VERSIONS") else () file(READ "${CMAKE_CURRENT_LIST_DIR}/VERSIONS" ARANGODB_VERSIONS_CONTENT) if (LINUX) set (TARGET_OS "LINUX") elseif (DARWIN) set (TARGET_OS "MACOS") elseif (WIN32) set (TARGET_OS "WINDOWS") endif () if (USE_STRICT_OPENSSL_VERSION) set (OPENSSL_VERSION_PATTERN ".*OPENSSL_${TARGET_OS}[ ]+\"([^\"]*).*") else () set (OPENSSL_VERSION_PATTERN ".*OPENSSL_${TARGET_OS}[ ]+\"([^\"a-z]*).*") endif () string(REGEX MATCH "${OPENSSL_VERSION_PATTERN}" ARANGODB_REQUIRED_OPENSSL_VERSION "${ARANGODB_VERSIONS_CONTENT}") if ("${CMAKE_MATCH_1}" STREQUAL "") message(FATAL_ERROR "expecting OPENSSL_${TARGET_OS} in ${CMAKE_CURRENT_LIST_DIR}/VERSIONS") else () set (ARANGODB_REQUIRED_OPENSSL_VERSION "${CMAKE_MATCH_1}") if (USE_STRICT_OPENSSL_VERSION) set (MSG_ARANGODB_REQUIRED_OPENSSL_VERSION "${ARANGODB_REQUIRED_OPENSSL_VERSION}") else () set (MSG_ARANGODB_REQUIRED_OPENSSL_VERSION "${ARANGODB_REQUIRED_OPENSSL_VERSION}*") endif () message ("Required OpenSSL version: ${MSG_ARANGODB_REQUIRED_OPENSSL_VERSION}") endif () endif () if (NOT DEFINED OPENSSL_ROOT_DIR OR "${OPENSSL_ROOT_DIR}" STREQUAL "") if (DEFINED ENV{OPENSSL_ROOT_DIR} AND NOT "$ENV{OPENSSL_ROOT_DIR}" STREQUAL "") set (OPENSSL_ROOT_DIR "$ENV{OPENSSL_ROOT_DIR}") endif () else () set(ENV{OPENSSL_ROOT_DIR} "${OPENSSL_ROOT_DIR}") endif () unset (OPENSSL_FOUND CACHE) unset (OPENSSL_INCLUDE_DIR CACHE) unset (OPENSSL_CRYPTO_LIBRARY CACHE) unset (OPENSSL_SSL_LIBRARY CACHE) unset (OPENSSL_LIBRARIES CACHE) unset (OPENSSL_VERSION CACHE) if (DEFINED OPENSSL_ROOT_DIR AND NOT "${OPENSSL_ROOT_DIR}" STREQUAL "") message ("Use OPENSSL_ROOT_DIR: ${OPENSSL_ROOT_DIR}") endif () if (WIN32) # Attempt to find ArangoDB CI compiled OpenSSL message ("Attempt to find ArangoDB CI compiled OpenSSL:") include ("${CMAKE_CURRENT_LIST_DIR}/cmake/custom/ArangoDB_FindOpenSSL_WIN32.cmake") if (NOT OPENSSL_FOUND) message ("System-wide attempt to find OpenSSL:") find_package(OpenSSL REQUIRED) endif () else () find_package(OpenSSL REQUIRED) endif () if (OPENSSL_FOUND) if (NOT "${OPENSSL_VERSION}" MATCHES "${ARANGODB_REQUIRED_OPENSSL_VERSION}") message (FATAL_ERROR "Wrong OpenSSL version was found: ${OPENSSL_VERSION}! Required version: ${MSG_ARANGODB_REQUIRED_OPENSSL_VERSION}!") endif () endif () message(${OPENSSL_INCLUDE_DIR}) include_directories(${OPENSSL_INCLUDE_DIR}) add_definitions(-DARANGODB_OPENSSL_VERSION=\"${OPENSSL_VERSION}\") add_definitions(-DOPENSSL_VERSION_MAJOR=${OPENSSL_VERSION_MAJOR}) add_definitions(-DOPENSSL_VERSION_MINOR=${OPENSSL_VERSION_MINOR}) if (OPENSSL_VERSION) string(REPLACE "." ";" OPENSSL_VERSION_LIST ${OPENSSL_VERSION}) list(GET OPENSSL_VERSION_LIST 0 OPENSSL_VERSION_MAJOR) list(GET OPENSSL_VERSION_LIST 1 OPENSSL_VERSION_MINOR) if ("${OPENSSL_VERSION_MAJOR}" GREATER 0 AND "${OPENSSL_VERSION_MINOR}" GREATER 0) option(USE_OPENSSL_NO_SSL2 "do not use OPENSSL_NO_SSL2" ON ) else () option(USE_OPENSSL_NO_SSL2 "do not use OPENSSL_NO_SSL2" OFF ) endif () endif () if (USE_OPENSSL_NO_SSL2) add_definitions(-DOPENSSL_NO_SSL2) endif () ################################################################################ ## 3RD PARTY ################################################################################ # ------------------------------------------------------------------------------ # IResearch # ------------------------------------------------------------------------------ set(LIB_ARANGO_IRESEARCH arango_iresearch) # 3rdParty exports: # # V8_VERSION # V8_LIBS # V8_INCLUDE_DIR # # ICU_VERSION # ICU_LIBS # ICU_INCLUDE_DIR # # ZLIB_VERSION # ZLIB_LIBS # ZLIB_INCLUDE_DIR add_definitions(-DBOOST_ALL_NO_LIB=1) #disable boost autolink on windows add_subdirectory(3rdParty) add_definitions("-DARANGODB_BOOST_VERSION=\"${BOOST_VERSION}\"") ################################################################################ ## 3rd Party INCLUDE DIRECTORIES ################################################################################ include_directories(SYSTEM ${PROJECT_SOURCE_DIR}/3rdParty/linenoise-ng/include) include_directories(SYSTEM ${PROJECT_SOURCE_DIR}/3rdParty/linenoise-ng/src) include_directories(SYSTEM ${PROJECT_SOURCE_DIR}/3rdParty/velocypack/include) include_directories(SYSTEM ${PROJECT_SOURCE_DIR}/3rdParty/fuerte/include) include_directories(SYSTEM ${PROJECT_SOURCE_DIR}/3rdParty/rocksdb/${ARANGO_ROCKSDB_VERSION}/include) include_directories(SYSTEM ${PROJECT_SOURCE_DIR}/3rdParty/s2geometry/${ARANGO_S2GEOMETRY_VERSION}/src) include_directories(SYSTEM ${PROJECT_SOURCE_DIR}/3rdParty/rocksdb/${ARANGO_ROCKSDB_VERSION}) include_directories(SYSTEM ${PROJECT_SOURCE_DIR}/3rdParty/date/include) # ------------------------------------------------------------------------------ # RocksDB # ------------------------------------------------------------------------------ add_definitions(-DARANGODB_ROCKSDB_VERSION=\"${ARANGO_ROCKSDB_VERSION}\") include_directories(${ROCKSDB_INCLUDE_DIR}) set(ROCKSDB_LIBS rocksdb;${SNAPPY_LIB}) add_dependencies(rocksdb ${SNAPPY_LIB}) if (USE_JEMALLOC) add_dependencies(rocksdb jemalloc) endif () ################################################################################ ## VELOCYPACK ################################################################################ add_definitions("-DVELOCYPACK_XXHASH=1") set(V8_LINK_DIRECTORIES "${LINK_DIRECTORIES}" CACHE INTERNAL "" FORCE) ################################################################################ ## ICU ################################################################################ include_directories(SYSTEM ${ICU_INCLUDE_DIR}) ################################################################################ ## V8 ################################################################################ include_directories(SYSTEM ${V8_INCLUDE_DIR}) add_definitions("-DARANGODB_V8_VERSION=\"${V8_VERSION}\"") foreach (LINK_DIR ${V8_LINK_DIRECTORIES}) link_directories("${LINK_DIR}") endforeach() ################################################################################ ## ZLIB ################################################################################ include_directories(SYSTEM ${ZLIB_INCLUDE_DIR}) add_definitions("-DARANGODB_ZLIB_VERSION=\"${ZLIB_VERSION}\"") link_directories("${PROJECT_BINARY_DIR}/bin") ################################################################################ ## cURL ################################################################################ add_definitions(-DCURL_STATICLIB=1) include_directories(SYSTEM ${CURL_SRC_DIR}/include/ ${CURL_BIN_DIR}/include/curl/ ) ################################################################################ ## PATHS, installation, packages, frontend ################################################################################ if (MSVC) # versioning set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/Installation/Windows/version") include(generate_product_version) endif() add_subdirectory(Documentation) include(ArangoDBInstall) include(frontend/aardvark) if (NOT(SKIP_PACKAGING)) include(packages/packages) endif() ################################################################################ ## ERRORS FILE ################################################################################ if (USE_MAINTAINER_MODE) set(ERROR_FILES lib/Basics/voc-errors.h lib/Basics/voc-errors.cpp js/common/bootstrap/errors.js ) set(ERROR_FILES_GEN) set(ERRORS_DAT lib/Basics/errors.dat) foreach (m IN LISTS ERROR_FILES) add_custom_command( OUTPUT ${CMAKE_SOURCE_DIR}/${m} COMMAND ${PYTHON_EXECUTABLE} ./utils/generateErrorfile.py ./${ERRORS_DAT} ./${m}.tmp COMMAND ${CMAKE_COMMAND} -E copy_if_different ./${m}.tmp ./${m} COMMAND ${CMAKE_COMMAND} -E remove ./${m}.tmp DEPENDS ${CMAKE_SOURCE_DIR}/${ERRORS_DAT} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMENT "Building errors files ${m}" VERBATIM ) list(APPEND ERROR_FILES_GEN ${CMAKE_SOURCE_DIR}/${m}) endforeach () add_custom_target(errorfiles ALL DEPENDS ${ERROR_FILES_GEN}) set(EXIT_CODE_FILES lib/Basics/exitcodes.h lib/Basics/exitcodes.cpp js/common/bootstrap/exitcodes.js Installation/Windows/Plugins/exitcodes.nsh ) set(EXIT_CODE_FILES_GEN) set(EXIT_CODES_DAT lib/Basics/exitcodes.dat) foreach (m IN LISTS EXIT_CODE_FILES) add_custom_command( OUTPUT ${CMAKE_SOURCE_DIR}/${m} COMMAND ${PYTHON_EXECUTABLE} ./utils/generateExitCodesFiles.py ./${EXIT_CODES_DAT} ./${m}.tmp COMMAND ${CMAKE_COMMAND} -E copy_if_different ./${m}.tmp ./${m} COMMAND ${CMAKE_COMMAND} -E remove ./${m}.tmp DEPENDS ${CMAKE_SOURCE_DIR}/${EXIT_CODES_DAT} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMENT "Building exitcode files ${m}" VERBATIM ) list(APPEND EXIT_CODE_FILES_GEN ${CMAKE_SOURCE_DIR}/${m}) endforeach () add_custom_target(exitcodefiles ALL DEPENDS ${EXIT_CODE_FILES_GEN}) endif () ################################################################################ ## MIMETYPES FILE ################################################################################ if (USE_MAINTAINER_MODE) set(MIMETYPES_FILES lib/Basics/voc-mimetypes.h lib/Basics/voc-mimetypes.cpp ) set(MIMETYPES_FILES_GEN) set(MIMETYPES_DAT lib/Basics/mimetypes.dat) foreach (m IN LISTS MIMETYPES_FILES) add_custom_command( OUTPUT ${CMAKE_SOURCE_DIR}/${m} COMMAND ${PYTHON_EXECUTABLE} ./utils/generateMimetypes.py ./${MIMETYPES_DAT} ./${m}.tmp COMMAND ${CMAKE_COMMAND} -E copy_if_different ./${m}.tmp ./${m} COMMAND ${CMAKE_COMMAND} -E remove ./${m}.tmp DEPENDS ${CMAKE_SOURCE_DIR}/${MIMETYPES_DAT} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMENT "Building mimetypes files ${m}" VERBATIM ) list(APPEND MIMETYPES_FILES_GEN ${CMAKE_SOURCE_DIR}/${m}) endforeach () add_custom_target(mimetypes ALL DEPENDS ${MIMETYPES_FILES_GEN}) endif () ################################################################################ ## SUB-PROJECTS ################################################################################ list(INSERT SYSTEM_LIBRARIES 0 ${BT_LIBS} ${ZLIB_LIBS} ${ICU_LIBS} ${OPENSSL_LIBRARIES} libcurl ${BASE_LIBS} ${SYS_LIBS} ${CMAKE_DL_LIBS} ${CMAKE_THREAD_LIBS_INIT} ) add_subdirectory(lib) add_subdirectory(arangosh) add_subdirectory(arangod) if (USE_GOOGLE_TESTS) add_subdirectory(tests) endif () add_dependencies(arangobench zlibstatic) if (USE_ENTERPRISE) add_dependencies(arangobackup zlibstatic) endif () add_dependencies(arangod zlibstatic) add_dependencies(arangodump zlibstatic) add_dependencies(arangoexport zlibstatic) add_dependencies(arangoimport zlibstatic) add_dependencies(arangorestore zlibstatic) add_dependencies(arangosh zlibstatic) if (UNIX) add_dependencies(arangobench man) if (USE_ENTERPRISE) add_dependencies(arangobackup man) endif () add_dependencies(arangod man) add_dependencies(arangodump man) add_dependencies(arangoexport man) add_dependencies(arangoimport man) add_dependencies(arangorestore man) add_dependencies(arangosh man) endif () if (NOT USE_PRECOMPILED_V8) # all binaries depend on v8_build because it contains ICU as well add_dependencies(arangobench v8_build) if (USE_ENTERPRISE) add_dependencies(arangobackup v8_build) endif () add_dependencies(arangod v8_build) add_dependencies(arangodump v8_build) add_dependencies(arangoexport v8_build) add_dependencies(arangoimport v8_build) add_dependencies(arangorestore v8_build) add_dependencies(arangosh v8_build) if (USE_GOOGLE_TESTS) add_dependencies(arangodbtests v8_build) endif () endif () add_custom_target(packages DEPENDS ${PACKAGES_LIST} ) add_custom_target(copy_packages DEPENDS ${COPY_PACKAGES_LIST} ) add_custom_target(clean_packages DEPENDS ${CLEAN_PACKAGES_LIST} ) add_custom_target(clean_autogenerated_files DEPENDS ${CLEAN_AUTOGENERATED_FILES} ) message(STATUS "building for git revision: ${ARANGODB_BUILD_REPOSITORY}") # if (VERBOSE) # get_cmake_property(_variableNames VARIABLES) # # foreach (_variableName ${_variableNames}) # message(STATUS "${_variableName}=${${_variableName}}") # endforeach () # endif ()