# Tutorial: http://www.cmake.org/cmake/help/cmake_tutorial.html cmake_minimum_required(VERSION 2.6) project(concordia C CXX) set (CONCORDIA_VERSION_MAJOR 1) set (CONCORDIA_VERSION_MINOR 0) # Whether to use stop words set (STOP_WORDS_ENABLED "false") include(CheckTypeSize) # Type of the characters in SA CHECK_TYPE_SIZE("unsigned int" UINT_SIZE) message(STATUS "UINT_SIZE: ${UINT_SIZE}") CHECK_TYPE_SIZE("unsigned long" ULONG_SIZE) message(STATUS "ULONG_SIZE: ${ULONG_SIZE}") CHECK_TYPE_SIZE("unsigned long long" ULLONG_SIZE) message(STATUS "ULLONG_SIZE: ${ULLONG_SIZE}") if (UINT_SIZE EQUAL 4 AND ULONG_SIZE EQUAL 8) set (INDEX_CHARACTER_TYPE "unsigned int") set (INDEX_CHARACTER_TYPE_MAX_VALUE "UINT_MAX") # Suffix markers set (SUFFIX_MARKER_TYPE "unsigned long") set (SUFFIX_MARKER_TYPE_MAX_VALUE "ULONG_MAX") elseif(ULONG_SIZE EQUAL 4 AND ULLONG_SIZE EQUAL 8) set (INDEX_CHARACTER_TYPE "unsigned long") set (INDEX_CHARACTER_TYPE_MAX_VALUE "ULONG_MAX") # Suffix markers set (SUFFIX_MARKER_TYPE "unsigned long long") set (SUFFIX_MARKER_TYPE_MAX_VALUE "ULLONG_MAX") else() message(FATAL_ERROR "Can not find proper C++ types. Try installing in 64-bit architecture") endif() set (SUFFIX_MARKER_SENTENCE_BYTES 2) # The above allows for (roughly) 2^32 = 4 294 967 295 words in corpus. # It assigns 4 bytes to sentence id and 2 bytes each for suffix offset and sentence length. # This allows to store 2^32=4 294 967 296 sentences no longer than 65536 words. # After changing these values be sure to adjust tests (as well as the above calculations). # Also, you might want to run TooLongHashTest from test_hash_generator.cpp # =============================== # # Production paths # ============================== # set (PROD_RESOURCES_DIRECTORY "${concordia_SOURCE_DIR}/prod/resources") # ============================== # # Testing paths # ============================== # set (TEST_RESOURCES_DIRECTORY "${concordia_SOURCE_DIR}/tests/resources") file(MAKE_DIRECTORY ${TEST_RESOURCES_DIRECTORY}/temp) file(MAKE_DIRECTORY ${PROD_RESOURCES_DIRECTORY}/temp) SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") set(BASE_TARGETS concordia) # ================================================ # Third-party libraries # ================================================ # ---------------------------------------------------- # Regular expression libraries # ---------------------------------------------------- option(WITH_RE2 "Using RE2 regular expression library" OFF) message(STATUS "Using RE2 regular expression library ${WITH_RE2}") if(WITH_RE2) set(HAVE_RE2 1) endif(WITH_RE2) option(WITH_PCRE "Using PCRE regular expression library" ON) message(STATUS "Using PCRE regular expression library ${WITH_PCRE}") if(WITH_PCRE) set(HAVE_PCRE 1) endif(WITH_PCRE) # ---------------------------------------------------- # Boost # ---------------------------------------------------- set(Boost_USE_STATIC_LIBS OFF) set(Boost_USE_STATIC_RUNTIME OFF) find_package(Boost COMPONENTS serialization unit_test_framework system filesystem program_options iostreams regex locale REQUIRED) # ---------------------------------------------------- # libconfig # ---------------------------------------------------- find_library(LIBCONFIG_LIB NAMES config++) find_path(LIBCONFIG_INCLUDE libconfig.h++) if(EXISTS ${LIBCONFIG_LIB} AND EXISTS ${LIBCONFIG_INCLUDE}) message(STATUS "Found Libconfig") include_directories(${LIBCONFIG_INCLUDE}) link_directories(${LIBCONFIG_LIB}) else() message(FATAL_ERROR "Libconfig not found") endif(EXISTS ${LIBCONFIG_LIB} AND EXISTS ${LIBCONFIG_INCLUDE}) # ---------------------------------------------------- # ICU (I feeeeel youuuuu...) # ---------------------------------------------------- find_library(ICU_LIB NAMES icui18n) find_path(ICU_INCLUDE unicode) if(EXISTS ${ICU_LIB} AND EXISTS ${ICU_INCLUDE}) message(STATUS "Found ICU") include_directories(${ICU_INCLUDE}) link_directories(${ICU_LIB}) else() message(FATAL_ERROR "ICU not found") endif(EXISTS ${ICU_LIB} AND EXISTS ${ICU_INCLUDE}) # ---------------------------------------------------- # Logging # ---------------------------------------------------- find_library(LOG4CPP_LIB NAMES log4cpp) find_path(LOG4CPP_INCLUDE log4cpp/Appender.hh) if(EXISTS ${LOG4CPP_LIB} AND EXISTS ${LOG4CPP_INCLUDE}) message(STATUS "Found Log4cpp") include_directories(${LOG4CPP_INCLUDE}) link_directories(${LOG4CPP_LIB}) else() message(FATAL_ERROR "Log4cpp not found") endif(EXISTS ${LOG4CPP_LIB} AND EXISTS ${LOG4CPP_INCLUDE}) # ================================================ # Concordia: Configuration # ================================================ configure_file ( "${concordia_SOURCE_DIR}/concordia/common/config.hpp.in" "${concordia_SOURCE_DIR}/concordia/common/config.hpp" ) message(STATUS "Configured common/config.hpp") configure_file ( "${concordia_SOURCE_DIR}/tests/resources/concordia-config/concordia.cfg.in" "${concordia_SOURCE_DIR}/tests/resources/concordia-config/concordia.cfg" ) message(STATUS "Configured tests/.../concordia.cfg") if (EXISTS "${concordia_SOURCE_DIR}/prod/resources/concordia-config/concordia.cfg.in") configure_file ( "${concordia_SOURCE_DIR}/prod/resources/concordia-config/concordia.cfg.in" "${concordia_SOURCE_DIR}/prod/resources/concordia-config/concordia.cfg" ) message(STATUS "Configured prod/.../concordia.cfg") endif() # ================================================ # Concordia: sub-projects # ================================================ set(ALL_DIRECTORIES concordia concordia-console concordia-sentence-tokenizer libdivsufsort utf8 utf8case) include_directories("${concordia_SOURCE_DIR}") # In order to include dynamically generated libdivsufsort headers include_directories("${concordia_SOURCE_DIR}/build/libdivsufsort/include") foreach(dir ${ALL_DIRECTORIES}) link_directories("${concordia_BINARY_DIR}/${dir}") add_subdirectory(${dir}) endforeach(dir) # ================================================ # Tests # ================================================ set(TESTS_TARGETS concordia-tests) add_subdirectory(tests) ENABLE_TESTING() ADD_TEST(FullTest ${CMAKE_CURRENT_BINARY_DIR}/tests/unit-tests/test_runner) # Doxygen find_package(Doxygen) if(DOXYGEN_FOUND) FIND_PROGRAM(DOT_TOOL dot DOC "Dot tool from graphviz") SET(DOXYFILE_LATEX ON) SET(DOXYGEN_HAVE_DOT NO) SET(DOXYGEN_QUIET YES) SET(INPUT_FILES) SET(INPUT_FILES "${INPUT_FILES} ${CMAKE_CURRENT_SOURCE_DIR}") if(DOT_TOOL) SET(DOXYGEN_HAVE_DOT YES) message(STATUS "Graphviz found") else(DOT_TOOL) message(STATUS "Consider installing Graphviz for call and caller graphs in the documentation") endif(DOT_TOOL) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY) add_custom_target(doc ALL ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "Generating API documentation with Doxygen" VERBATIM) endif(DOXYGEN_FOUND)