mirror of https://gitee.com/bigwinds/arangodb
292 lines
9.5 KiB
CMake
292 lines
9.5 KiB
CMake
cmake_minimum_required(VERSION 3.2 FATAL_ERROR)
|
|
|
|
set (IResearch_TARGET_NAME
|
|
"iresearch"
|
|
CACHE INTERNAL
|
|
""
|
|
)
|
|
|
|
project(${IResearch_TARGET_NAME})
|
|
|
|
# attach additional cmake modules
|
|
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
|
|
|
|
# load cmake utils
|
|
include(Utils)
|
|
|
|
if (NOT MSVC)
|
|
# put GCC version into GCC_VERSION variable
|
|
execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION)
|
|
endif()
|
|
|
|
################################################################################
|
|
### compile options
|
|
################################################################################
|
|
|
|
option(USE_TESTS "Build tests" OFF)
|
|
option(USE_PYRESEARCH "Build iresearch python bridge" OFF)
|
|
option(USE_VALGRIND "Use workarounds to avoid false positives in valgrind" OFF)
|
|
option(USE_SIMDCOMP "Use architecture specific low-level optimizations" OFF)
|
|
add_option_gprof(FALSE)
|
|
|
|
if (USE_VALGRIND)
|
|
add_definitions(-DIRESEARCH_VALGRIND)
|
|
endif()
|
|
|
|
if (MSVC)
|
|
# FIXME TODO find a workaround or do not use alignas(...)
|
|
# MSVC2017.1 - MSVC2018.7 does not correctly support alignas()
|
|
# MSVC2017.8 requires the following define
|
|
add_definitions(-D_ENABLE_EXTENDED_ALIGNED_STORAGE)
|
|
|
|
if (MSVC_BUILD_THREADS)
|
|
set(CMAKE_C_FLAGS "/MP${MSVC_BUILD_THREADS} ${CMAKE_C_FLAGS}")
|
|
set(CMAKE_CXX_FLAGS "/MP${MSVC_BUILD_THREADS} ${CMAKE_CXX_FLAGS}")
|
|
else ()
|
|
set(CMAKE_C_FLAGS "/MP ${CMAKE_C_FLAGS}")
|
|
set(CMAKE_CXX_FLAGS "/MP ${CMAKE_CXX_FLAGS}")
|
|
endif()
|
|
endif()
|
|
|
|
################################################################################
|
|
### setup ccache
|
|
################################################################################
|
|
|
|
option(USE_CCACHE "Use CCACHE if present" ON)
|
|
|
|
if (USE_CCACHE)
|
|
find_program(CCACHE_FOUND ccache)
|
|
|
|
if(CCACHE_FOUND)
|
|
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
|
|
endif(CCACHE_FOUND)
|
|
endif()
|
|
|
|
if (USE_OPTIMIZE_FOR_ARCHITECTURE)
|
|
include(OptimizeForArchitecture)
|
|
OptimizeForArchitecture()
|
|
|
|
add_definitions(${Vc_ARCHITECTURE_FLAGS})
|
|
endif()
|
|
|
|
################################################################################
|
|
### find 3rd party libraries
|
|
################################################################################
|
|
|
|
# find Boost
|
|
find_package(BoostLocal
|
|
REQUIRED
|
|
)
|
|
|
|
# set pthread library
|
|
if (NOT MSVC)
|
|
set(PTHREAD_LIBRARY pthread)
|
|
endif()
|
|
|
|
# set gcov library
|
|
if (NOT MSVC AND (CMAKE_BUILD_TYPE STREQUAL "Coverage"))
|
|
set(GCOV_LIBRARY gcov)
|
|
endif()
|
|
|
|
# set sanitizers
|
|
find_package(Sanitizers)
|
|
|
|
#find BFD
|
|
find_package(BFD
|
|
#OPTIONAL
|
|
)
|
|
|
|
if (BFD_FOUND)
|
|
add_definitions(-DUSE_LIBBFD)
|
|
else()
|
|
set(BFD_INCLUDE_DIR "")
|
|
set(BFD_SHARED_LIBS "")
|
|
set(BFD_STATIC_LIBS "")
|
|
set(BFD_SHARED_LIB_RESOURCES "")
|
|
endif()
|
|
|
|
# find LZ4
|
|
find_package(Lz4
|
|
REQUIRED
|
|
)
|
|
|
|
# find ICU
|
|
find_package(ICU
|
|
REQUIRED
|
|
)
|
|
|
|
# find Snowball
|
|
find_package(Snowball
|
|
REQUIRED
|
|
)
|
|
|
|
# find Unwind
|
|
find_package(Unwind
|
|
#OPTIONAL
|
|
)
|
|
|
|
if (Unwind_FOUND)
|
|
add_definitions(-DUSE_LIBUNWIND)
|
|
else()
|
|
set(Unwind_INCLUDE_DIR "")
|
|
set(Unwind_SHARED_LIBS "")
|
|
set(Unwind_STATIC_LIBS "")
|
|
set(Unwind_SHARED_LIB_RESOURCES "")
|
|
endif()
|
|
|
|
# set external dirs
|
|
set(EXTERNAL_INCLUDE_DIRS
|
|
${PROJECT_SOURCE_DIR}/external
|
|
CACHE INTERNAL
|
|
""
|
|
)
|
|
|
|
set(IResearch_INCLUDE_DIR
|
|
"${PROJECT_SOURCE_DIR}/core"
|
|
CACHE INTERNAL
|
|
""
|
|
)
|
|
|
|
# set output directories
|
|
set(EXECUTABLE_OUTPUT_PATH
|
|
${CMAKE_BINARY_DIR}/bin
|
|
CACHE PATH
|
|
"Executable output path"
|
|
)
|
|
|
|
set(LIBRARY_OUTPUT_PATH
|
|
${CMAKE_BINARY_DIR}/bin
|
|
CACHE PATH
|
|
"Library output path"
|
|
)
|
|
|
|
mark_as_advanced(
|
|
EXECUTABLE_OUTPUT_PATH
|
|
LIBRARY_OUTPUT_PATH
|
|
)
|
|
|
|
add_definitions(-DUNICODE -D_UNICODE)
|
|
|
|
# set test resource directory
|
|
set(IResearch_test_resource_dir
|
|
${CMAKE_CURRENT_SOURCE_DIR}/tests/resources
|
|
)
|
|
|
|
# generate tests_config.hpp here instead of inside 'tests' to make available externally
|
|
configure_file(
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/tests/tests_config.hpp.in"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/tests/tests_config.hpp"
|
|
)
|
|
|
|
add_subdirectory(core)
|
|
add_subdirectory(external)
|
|
add_subdirectory(utils)
|
|
|
|
if (USE_PYRESEARCH)
|
|
add_subdirectory(python)
|
|
endif()
|
|
|
|
if (USE_TESTS)
|
|
add_subdirectory(tests)
|
|
|
|
# setup code coverage
|
|
if (NOT MSVC AND (CMAKE_BUILD_TYPE STREQUAL "Coverage"))
|
|
include(CodeCoverage)
|
|
|
|
# exclude directories from coverage report
|
|
SET(LCOV_EXCLUDE "external/*;boost/*;${LCOV_EXCLUDE}")
|
|
|
|
setup_target_for_coverage(
|
|
${IResearch_TARGET_NAME}-coverage
|
|
$<TARGET_FILE:${IResearchTests_TARGET_NAME}-static>
|
|
coverage
|
|
"--ires_output"
|
|
)
|
|
add_dependencies(${IResearch_TARGET_NAME}-coverage
|
|
${IResearchTests_TARGET_NAME}-static
|
|
)
|
|
|
|
if (PYTHON_EXECUTABLE AND GCOVR_PATH)
|
|
# exclude directories from coverage report
|
|
SET(GCOVR_EXTRA_ARGS "-e;${PROJECT_SOURCE_DIR}/external/;${GCOVR_EXTRA_ARGS}")
|
|
|
|
setup_target_for_coverage_cobertura(
|
|
${IResearch_TARGET_NAME}-coverage-cobertura
|
|
$<TARGET_FILE:${IResearchTests_TARGET_NAME}-static>
|
|
coverage
|
|
"--ires_output"
|
|
)
|
|
add_dependencies(${IResearch_TARGET_NAME}-coverage-cobertura
|
|
${IResearchTests_TARGET_NAME}-static
|
|
)
|
|
endif()
|
|
endif()
|
|
|
|
# testing
|
|
enable_testing()
|
|
add_test(
|
|
iresearch-tests
|
|
${EXECUTABLE_OUTPUT_PATH}/iresearch-tests${CMAKE_EXECUTABLE_SUFFIX}
|
|
)
|
|
|
|
# testing auto build not working
|
|
# due to the following bug in cmake
|
|
# http://public.kitware.com/Bug/view.php?id=8774
|
|
# here is the workaround:
|
|
add_custom_target(iresearch-check
|
|
COMMAND ${CMAKE_CTEST_COMMAND}
|
|
DEPENDS iresearch-tests
|
|
)
|
|
|
|
# setup target for memory allocation profiling
|
|
add_custom_target(iresearch-tests-malloc
|
|
COMMAND ${CMAKE_COMMAND} -E echo "Arguments to valgrind may be provided via an environment variable 'EXTRA_VALGRIND_ARGS'"
|
|
COMMAND ${CMAKE_COMMAND} -E echo "Arguments to iresearch-tests${CMAKE_EXECUTABLE_SUFFIX} may be provided via an environment variable 'EXTRA_VALGRIND_PROG_ARGS'"
|
|
COMMAND valgrind --tool=massif --depth=100 --max-snapshots=500 --time-unit=ms --detailed-freq=1 --massif-out-file=massif.out $$EXTRA_VALGRIND_ARGS ${EXECUTABLE_OUTPUT_PATH}/iresearch-tests${CMAKE_EXECUTABLE_SUFFIX} --ires_output $$EXTRA_VALGRIND_PROG_ARGS
|
|
COMMAND ms_print --x=500 --y=100 massif.out > massif.log
|
|
DEPENDS iresearch-tests
|
|
)
|
|
|
|
# setup target for memory allocation profiling
|
|
add_custom_target(iresearch-tests-malloc-s
|
|
COMMAND ${CMAKE_COMMAND} -E echo "Arguments to valgrind may be provided via an environment variable 'EXTRA_VALGRIND_ARGS'"
|
|
COMMAND ${CMAKE_COMMAND} -E echo "Arguments to iresearch-tests${CMAKE_EXECUTABLE_SUFFIX} may be provided via an environment variable 'EXTRA_VALGRIND_PROG_ARGS'"
|
|
COMMAND valgrind --tool=massif --depth=100 --max-snapshots=500 --time-unit=ms --detailed-freq=1 --massif-out-file=massif.out $$EXTRA_VALGRIND_ARGS ${EXECUTABLE_OUTPUT_PATH}/iresearch-tests-s${CMAKE_EXECUTABLE_SUFFIX} --ires_output $$EXTRA_VALGRIND_PROG_ARGS
|
|
COMMAND ms_print --x=500 --y=100 massif.out > massif.log
|
|
DEPENDS iresearch-tests
|
|
)
|
|
|
|
# setup target for memory leak detection
|
|
add_custom_target(iresearch-tests-memleak
|
|
COMMAND ${CMAKE_COMMAND} -E echo "Arguments to valgrind may be provided via an environment variable 'EXTRA_VALGRIND_ARGS'"
|
|
COMMAND ${CMAKE_COMMAND} -E echo "Arguments to iresearch-tests${CMAKE_EXECUTABLE_SUFFIX} may be provided via an environment variable 'EXTRA_VALGRIND_PROG_ARGS'"
|
|
COMMAND valgrind --xml=yes --xml-file=valgrind.xml --leak-check=yes --track-origins=yes --read-var-info=yes --num-callers=64 $$EXTRA_VALGRIND_ARGS ${EXECUTABLE_OUTPUT_PATH}/iresearch-tests${CMAKE_EXECUTABLE_SUFFIX} --ires_output $$EXTRA_VALGRIND_PROG_ARGS
|
|
DEPENDS iresearch-tests
|
|
)
|
|
|
|
# setup target for memory leak detection
|
|
add_custom_target(iresearch-tests-memleak-s
|
|
COMMAND ${CMAKE_COMMAND} -E echo "Arguments to valgrind may be provided via an environment variable 'EXTRA_VALGRIND_ARGS'"
|
|
COMMAND ${CMAKE_COMMAND} -E echo "Arguments to iresearch-tests${CMAKE_EXECUTABLE_SUFFIX} may be provided via an environment variable 'EXTRA_VALGRIND_PROG_ARGS'"
|
|
COMMAND valgrind --xml=yes --xml-file=valgrind.xml --leak-check=yes --track-origins=yes --read-var-info=yes --num-callers=64 $$EXTRA_VALGRIND_ARGS ${EXECUTABLE_OUTPUT_PATH}/iresearch-tests-s${CMAKE_EXECUTABLE_SUFFIX} --ires_output $$EXTRA_VALGRIND_PROG_ARGS
|
|
DEPENDS iresearch-tests-static
|
|
)
|
|
|
|
# setup target for thread race detection
|
|
add_custom_target(iresearch-tests-threadrace
|
|
COMMAND ${CMAKE_COMMAND} -E echo "Arguments to valgrind may be provided via an environment variable 'EXTRA_VALGRIND_ARGS'"
|
|
COMMAND ${CMAKE_COMMAND} -E echo "Arguments to iresearch-tests${CMAKE_EXECUTABLE_SUFFIX} may be provided via an environment variable 'EXTRA_VALGRIND_PROG_ARGS'"
|
|
COMMAND valgrind --xml=yes --xml-file=valgrind.xml --tool=helgrind --read-var-info=yes --num-callers=64 $$EXTRA_VALGRIND_ARGS ${EXECUTABLE_OUTPUT_PATH}/iresearch-tests${CMAKE_EXECUTABLE_SUFFIX} --ires_output $$EXTRA_VALGRIND_PROG_ARGS
|
|
DEPENDS iresearch-tests
|
|
)
|
|
|
|
# setup target for thread race detection
|
|
add_custom_target(iresearch-tests-threadrace-s
|
|
COMMAND ${CMAKE_COMMAND} -E echo "Arguments to valgrind may be provided via an environment variable 'EXTRA_VALGRIND_ARGS'"
|
|
COMMAND ${CMAKE_COMMAND} -E echo "Arguments to iresearch-tests${CMAKE_EXECUTABLE_SUFFIX} may be provided via an environment variable 'EXTRA_VALGRIND_PROG_ARGS'"
|
|
COMMAND valgrind --xml=yes --xml-file=valgrind.xml --tool=helgrind --read-var-info=yes --num-callers=64 $$EXTRA_VALGRIND_ARGS ${EXECUTABLE_OUTPUT_PATH}/iresearch-tests-s${CMAKE_EXECUTABLE_SUFFIX} --ires_output $$EXTRA_VALGRIND_PROG_ARGS
|
|
DEPENDS iresearch-tests-static
|
|
)
|
|
|
|
endif() # USE_TESTS
|