diff --git a/CMakeLists.txt b/CMakeLists.txt index 07b4f1af6..38da98860 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,6 @@ cmake_minimum_required(VERSION 2.6) include(macros.cmake) - enable_testing() set_variables() set_maxscale_version() diff --git a/README b/README index 6f8c2dd0a..3affd5b85 100644 --- a/README +++ b/README @@ -166,9 +166,6 @@ values, you can run CMake in interactive mode by using the -i flag or use a CMak It is highly recommended to make a separate build directory to build into. This keeps the source and build trees clean and makes it easy to get rid of everything you built. -By default, MaxScale installs to /usr/local/skysql and places init.d scripts and ldconfig files into their folders. Change the INSTALL_DIR -variable to your desired installation directory and set INSTALL_SYSTEM_FILES=N to prevent the init.d script and ldconfig file installation. - To build MaxScale using CMake: cd @@ -190,20 +187,33 @@ To build MaxScale using the ccmake GUI: ccmake + +If you have your headers and libraries in non-standard locations, you can define those locations at configuration time as such: + + cmake -D= + +By default, MaxScale installs to '/usr/local/skysql/maxscale' and places init.d scripts and ldconfig files into their folders. Change the INSTALL_DIR +variable to your desired installation directory and set INSTALL_SYSTEM_FILES=N to prevent the init.d script and ldconfig file installation. + All the parameters affecting CMake can be found in 'macros.cmake'. This file also has the parameters CMake uses for testing. -Variables controlling the CMake build process: +All the variables that control the CMake build process: INSTALL_DIR= Installation directory BUILD_TYPE=[None|Debug|Release] Type of the build, defaults to Release (optimized) INSTALL_SYSTEM_FILES=[Y|N] Install startup scripts and ld configuration files EMBEDDED_LIB= Path to the embedded library, filename included MYSQL_DIR= Path to MySQL headers +ERRMSG= Path to errmsg.sys file STATIC_EMBEDDED=[Y|N] Link the static or the dynamic verson of the library GCOV=[Y|N] Generate gcov output BUILD_TESTS=[Y|N] Build tests +DEPS_OK=[Y|N] Check dependencies, use N when you want to force a recheck of values DEBUG_OUTPUT=[Y|N] Produce debugging output when configuring CMake - +RABBITMQ_LIB= Path to RabbitMQ-C libraries +RABBITMQ_HEADERS= Path to RabbitMQ-C headers +MYSQL_CLIENT_LIB= Path to MySQL client libraries +MYSQL_CLIENT_HEADERS= Path to MySQL client headers \section Running Running MaxScale diff --git a/macros.cmake b/macros.cmake index 6ffe6dc26..7c5109925 100644 --- a/macros.cmake +++ b/macros.cmake @@ -70,6 +70,7 @@ macro(check_deps) if(DEPS_ERROR) message(FATAL_ERROR "Cannot find dependencies: ${FAILED_DEPS}") + set(DEPS_OK FALSE CACHE BOOL "If all the dependencies were found.") endif() endmacro() @@ -86,19 +87,23 @@ macro(check_dirs) set(MYSQL_DIR ${MYSQL_DIR_LOC} CACHE PATH "Path to MySQL headers" FORCE) if(${MYSQL_DIR} STREQUAL "MYSQL_DIR-NOTFOUND") message(FATAL_ERROR "Fatal Error: MySQL headers were not found.") + set(DEPS_OK FALSE CACHE BOOL "If all the dependencies were found.") else() message(STATUS "Using MySQL headers found at: ${MYSQL_DIR}") endif() # Find the errmsg.sys file if it was not defied - if( NOT ( DEFINED ERRMSG ) ) - find_file(ERRMSG errmsg.sys PATHS /usr/share/mysql /usr/local/share/mysql ${CUSTOM_ERRMSG} PATH_SUFFIXES english) - if(${ERRMSG} STREQUAL "ERRMSG-NOTFOUND") - message(FATAL_ERROR "Fatal Error: The errmsg.sys file was not found.") - elseif(DEBUG_OUTPUT) - message(STATUS "Using errmsg.sys found at: ${ERRMSG}") - endif() + if( DEFINED ERRMSG ) + find_file(ERRMSG_FILE errmsg.sys PATHS ${ERRMSG} NO_DEFAULT_PATH) endif() + find_file(ERRMSG_FILE errmsg.sys PATHS /usr/share/mysql /usr/local/share/mysql PATH_SUFFIXES english) + if(${ERRMSG_FILE} MATCHES "ERRMSG_FILE-NOTFOUND") + message(FATAL_ERROR "Fatal Error: The errmsg.sys file was not found, please define the path to it by using -DERRMSG=") + set(DEPS_OK FALSE CACHE BOOL "If all the dependencies were found.") + else() + message(STATUS "Using errmsg.sys found at: ${ERRMSG_FILE}") + endif() + set(ERRMSG ${ERRMSG_FILE} CACHE FILEPATH "Path to the errmsg.sys file." FORCE) # Find the embedded mysql library if(STATIC_EMBEDDED) @@ -132,6 +137,7 @@ macro(check_dirs) # Inform the user about the embedded library if( (${EMBEDDED_LIB} STREQUAL "EMBEDDED_LIB_STATIC-NOTFOUND") OR (${EMBEDDED_LIB} STREQUAL "EMBEDDED_LIB_DYNAMIC-NOTFOUND")) message(FATAL_ERROR "Library not found: libmysqld. If your install of MySQL is in a non-default location, please provide the location with -DEMBEDDED_LIB=") + set(DEPS_OK FALSE CACHE BOOL "If all the dependencies were found.") else() get_filename_component(EMBEDDED_LIB ${EMBEDDED_LIB} REALPATH) message(STATUS "Using embedded library: ${EMBEDDED_LIB}") @@ -144,13 +150,42 @@ macro(check_dirs) find_file(DEB_FNC init-functions PATHS /lib/lsb) if(${DEB_FNC} MATCHES "DEB_FNC-NOTFOUND") message(FATAL_ERROR "Cannot find required init-functions in /lib/lsb/ or /etc/rc.d/init.d/, please confirm that your system files are OK.") + set(DEPS_OK FALSE CACHE BOOL "If all the dependencies were found.") else() set(DEB_BASED TRUE CACHE BOOL "If init.d script uses /lib/lsb/init-functions instead of /etc/rc.d/init.d/functions.") endif() else() set(DEB_BASED FALSE CACHE BOOL "If init.d script uses /lib/lsb/init-functions instead of /etc/rc.d/init.d/functions.") endif() - + + #Check RabbitMQ headers and libraries + if(BUILD_RABBITMQ) + + if(DEFINED RABBITMQ_LIB) + find_library(RMQ_LIB rabbitmq PATHS ${RABBITMQ_LIB} NO_DEFAULT_PATH) + endif() + find_library(RMQ_LIB rabbitmq) + if(RMQ_LIB STREQUAL "RMQ_LIB-NOTFOUND") + message(FATAL_ERROR "Cannot find RabbitMQ libraries, please define the path to the libraries with -DRABBITMQ_LIB=") + set(DEPS_OK FALSE CACHE BOOL "If all the dependencies were found.") + else() + set(RABBITMQ_LIB ${RMQ_LIB} CACHE PATH "Path to RabbitMQ libraries" FORCE) + message(STATUS "Using RabbitMQ libraries found at: ${RABBITMQ_LIB}") + endif() + + if(DEFINED RABBITMQ_HEADERS) + find_file(RMQ_HEADERS amqp.h PATHS ${RABBITMQ_HEADERS} NO_DEFAULT_PATH) + endif() + find_file(RMQ_HEADERS amqp.h) + if(RMQ_HEADERS STREQUAL "RMQ_HEADERS-NOTFOUND") + message(FATAL_ERROR "Cannot find RabbitMQ headers, please define the path to the headers with -DRABBITMQ_HEADERS=") + set(DEPS_OK FALSE CACHE BOOL "If all the dependencies were found.") + else() + set(RABBITMQ_HEADERS ${RMQ_HEADERS} CACHE PATH "Path to RabbitMQ headers" FORCE) + message(STATUS "Using RabbitMQ headers found at: ${RABBITMQ_HEADERS}") + endif() + + endif() set(DEPS_OK TRUE CACHE BOOL "If all the dependencies were found.") diff --git a/query_classifier/test/canonical_tests/CMakeLists.txt b/query_classifier/test/canonical_tests/CMakeLists.txt index 0575a1a0e..4777fad8d 100644 --- a/query_classifier/test/canonical_tests/CMakeLists.txt +++ b/query_classifier/test/canonical_tests/CMakeLists.txt @@ -1,4 +1,7 @@ file(COPY ${ERRMSG} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) +if(${ERRMSG} MATCHES "ERRMSG-NOTFOUND") + message(FATAL_ERROR "The errmsg.sys file was not found, please define the path with -DERRMSG=") +endif() add_executable(canonizer canonizer.c) target_link_libraries(canonizer pthread query_classifier z dl ssl aio crypt crypto rt m ${EMBEDDED_LIB} fullcore stdc++) add_test(NAME TestCanonicalQuery COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/canontest.sh diff --git a/rabbitmq_consumer/CMakeLists.txt b/rabbitmq_consumer/CMakeLists.txt index 975a4e3e5..aee18a6da 100644 --- a/rabbitmq_consumer/CMakeLists.txt +++ b/rabbitmq_consumer/CMakeLists.txt @@ -1,7 +1,13 @@ -find_library(MYSQL_CLIENT_LIB NAMES mysqlclient PATHS /usr/lib /usr/lib64 PATH_SUFFIXES mysql mariadb) +if (NOT ( DEFINED MYSQL_CLIENT_LIB ) ) + find_library(MYSQL_CLIENT_LIB NAMES mysqlclient PATHS /usr/lib /usr/lib64 PATH_SUFFIXES mysql mariadb) +endif() -if( ( RABBITMQ_LIB AND RABBITMQ_HEADERS ) AND ( NOT ( ${MYSQL_CLIENT_LIB} STREQUAL "MYSQL_CLIENT_LIB-NOTFOUND" ) ) ) +if (NOT ( DEFINED MYSQL_CLIENT_HEADERS ) ) + find_path(MYSQL_CLIENT_HEADERS NAMES mysql.h PATH_SUFFIXES mysql mariadb) +endif() +if( ( RABBITMQ_LIB AND RABBITMQ_HEADERS ) AND ( NOT ( ${MYSQL_CLIENT_LIB} STREQUAL "MYSQL_CLIENT_LIB-NOTFOUND" ) ) AND ( NOT ( ${MYSQL_CLIENT_HEADERS} STREQUAL "MYSQL_CLIENT_HEADERS-NOTFOUND" ) ) ) + include_directories(${MYSQL_CLIENT_HEADERS}) add_executable (consumer consumer.c) target_link_libraries(consumer ${MYSQL_CLIENT_LIB} rabbitmq inih) install(TARGETS consumer DESTINATION bin) diff --git a/server/modules/filter/CMakeLists.txt b/server/modules/filter/CMakeLists.txt index 61c658ace..f9dea236d 100644 --- a/server/modules/filter/CMakeLists.txt +++ b/server/modules/filter/CMakeLists.txt @@ -1,11 +1,7 @@ if(BUILD_RABBITMQ) - if(RABBITMQ_LIB AND RABBITMQ_HEADERS) - add_library(mqfilter SHARED mqfilter.c) - target_link_libraries(mqfilter query_classifier log_manager utils rabbitmq) - install(TARGETS mqfilter DESTINATION modules) - else() - message(ERROR "Error: Cannot find the required librabbitmq-c locations, please check that you have them configured correctly.") - endif() + add_library(mqfilter SHARED mqfilter.c) + target_link_libraries(mqfilter query_classifier log_manager utils rabbitmq) + install(TARGETS mqfilter DESTINATION modules) endif() add_library(regexfilter SHARED regexfilter.c)