From 0f5cfdbd1a6551fd7da1f620218791bcd88b56c8 Mon Sep 17 00:00:00 2001 From: Markus Makela Date: Tue, 16 Sep 2014 15:02:43 +0300 Subject: [PATCH] Added dependency checks, Debian packaging and fixes to various parts of the CMake build files. --- CMakeLists.txt | 56 ++++----------- macros.cmake | 69 ++++++++++++++++++- .../test/canonical_tests/CMakeLists.txt | 2 +- rabbitmq_consumer/CMakeLists.txt | 18 +---- server/core/CMakeLists.txt | 2 +- server/test/CMakeLists.txt | 2 +- 6 files changed, 86 insertions(+), 63 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 21055593f..bdfb86ccd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,11 +1,14 @@ cmake_minimum_required(VERSION 2.8.12) include(macros.cmake) -enable_testing() + +enable_testing() set_variables() set_maxscale_version() + set(CMAKE_INSTALL_PREFIX "${INSTALL_DIR}" CACHE INTERNAL "Prefix prepended to install directories." FORCE) + if(NOT ( BUILD_TYPE STREQUAL "None" ) ) set(CMAKE_BUILD_TYPE "${BUILD_TYPE}" CACHE INTERNAL "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel. " FORCE) else() @@ -14,6 +17,11 @@ endif() project(MaxScale) +if(NOT DEPS_OK) + check_deps() +else() + message(STATUS "Dependencies ok") +endif() set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_RPATH}:${CMAKE_INSTALL_PREFIX}/lib:${CMAKE_INSTALL_PREFIX}/modules) @@ -22,20 +30,6 @@ configure_file(${CMAKE_SOURCE_DIR}/server/include/version.h.in ${CMAKE_SOURCE_DI configure_file(${CMAKE_SOURCE_DIR}/maxscale.conf.in ${CMAKE_SOURCE_DIR}/maxscale.conf) configure_file(${CMAKE_SOURCE_DIR}/etc/init.d/maxscale.in ${CMAKE_SOURCE_DIR}/etc/init.d/maxscale) -if(NOT MYSQL_DIR) - find_path(MYSQL_DIR mysql.h PATH_SUFFIXES mysql mariadb) - if(MYSQL_DIR-NOTFOUND) - message(FATAL_ERROR "Fatal Error: MySQL headers were not found.") - endif(MYSQL_DIR-NOTFOUND) -endif() - -if(NOT ERRMSG) - find_file(ERRMSG errmsg.sys PATHS /usr/share/mysql /usr/local/share/mysql ${CUSTOM_ERRMSG} PATH_SUFFIXES english) - if(ERRMSG-NOTFOUND) - message(FATAL_ERROR "Fatal Error: The errmsg.sys file was not found.") - endif(ERRMSG-NOTFOUND) -endif() - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") @@ -45,28 +39,6 @@ if(GCOV) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lgcov") endif() -if((NOT EMBEDDED_LIB) AND STATIC_EMBEDDED) - - find_file(EMBEDDED_LIB libmysqld.a PATHS /usr/lib /usr/lib64 PATH_SUFFIXES mysql mariadb) - - if(EMBEDDED_LIB-NOTFOUND) - message(WARNING "Warning: Static library not found, looking for dynamic version") - find_library(EMBEDDED_LIB mysqld PATHS /usr/lib /usr/lib64 PATH_SUFFIXES mysql mariadb) - get_filename_component(EMBEDDED_LIB ${EMBEDDED_LIB} REALPATH) - endif() - -elseif( NOT STATIC_EMBEDDED) - - find_library(EMBEDDED_LIB mysqld PATHS /usr/lib /usr/lib64 PATH_SUFFIXES mysql mariadb) - get_filename_component(EMBEDDED_LIB ${EMBEDDED_LIB} REALPATH) - -endif() - -if(EMBEDDED_LIB-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=") -else() - message(STATUS "Using embedded library: ${EMBEDDED_LIB}") -endif() include_directories(${MYSQL_DIR}) include_directories(${MYSQL_DIR}/private) @@ -115,9 +87,8 @@ install(FILES ${ERRMSG} DESTINATION mysql) install(FILES ${EMBEDDED_LIB} DESTINATION lib) install(FILES ${DOCS} DESTINATION Documentation) -set(CPACK_GENERATOR "RPM") +set(CPACK_GENERATOR RPM DEB) set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "MaxScale") -set(CPACK_PACKAGE_NAME "MaxScale") set(CPACK_PACKAGE_VERSION_MAJOR "${MAXSCALE_VERSION_MAJOR}") set(CPACK_PACKAGE_VERSION_MINOR "${MAXSCALE_VERSION_MINOR}") set(CPACK_PACKAGE_VERSION_PATCH "${MAXSCALE_VERSION_PATCH}") @@ -127,6 +98,7 @@ set(CPACK_PACKAGE_NAME "maxscale") set(CPACK_PACKAGE_VENDOR "SkySQL Ab") set(CPACK_PACKAGE_DESCRIPTION_FILE ${CMAKE_SOURCE_DIR}/README) set(CPACK_PACKAGING_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") +set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "x86_64") set(CPACK_RPM_SPEC_INSTALL_POST "/sbin/ldconfig") set(CPACK_RPM_PACKAGE_NAME "maxscale") set(CPACK_RPM_PACKAGE_VENDOR "SkySQL Ab") @@ -139,11 +111,11 @@ set(CPACK_RPM_USER_FILELIST "%ignore /etc/ld.so.conf.d") set(CPACK_RPM_USER_FILELIST "%ignore /etc") include(CPack) -#add_test(PrepareTests ${CMAKE_COMMAND} -DBUILD_TESTS=Y -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR} -DINSTALL_SYSTEM_FILES=N ${CMAKE_SOURCE_DIR}) +#add_test(PrepareTests ${CMAKE_COMMAND} -DDEPS_OK=Y -DBUILD_TESTS=Y -DBUILD_TYPE=Debug -DINSTALL_DIR=${CMAKE_BINARY_DIR} -DINSTALL_SYSTEM_FILES=N ${CMAKE_SOURCE_DIR}) #set_tests_properties(PrepareTests PROPERTIES WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) -#set_tests_properties(PrepareTests PROPERTIES COST 1000) +#set_tests_properties(PrepareTests PROPERTIES COST 2000.0) #add_test(BuildTests ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target install) #set_tests_properties(BuildTests PROPERTIES WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) #set_tests_properties(BuildTests PROPERTIES DEPENDS PrepareTests) -#set_tests_properties(BuildTests PROPERTIES COST 900) +#set_tests_properties(PrepareTests PROPERTIES COST 1999.0) \ No newline at end of file diff --git a/macros.cmake b/macros.cmake index ebfc14040..0aaa115c6 100644 --- a/macros.cmake +++ b/macros.cmake @@ -38,7 +38,7 @@ macro(set_variables) set(TEST_PASSWORD "maxpwd" CACHE STRING "password of MaxScale user") # Use static version of libmysqld - set(STATIC_EMBEDDED FALSE CACHE BOOL "Use static version of libmysqld") + set(STATIC_EMBEDDED TRUE CACHE BOOL "Use static version of libmysqld") # Build RabbitMQ components set(BUILD_RABBITMQ FALSE CACHE BOOL "Build RabbitMQ components") @@ -54,3 +54,70 @@ macro(set_variables) endmacro() + +macro(check_deps) + + # Check for libraries MaxScale depends on + set(MAXSCALE_DEPS aio ssl crypt crypto z m dl rt pthread) + foreach(LIB ${MAXSCALE_DEPS}) + find_library(LIB${LIB} ${LIB}) + if((DEFINED LIB${LIB}) AND (${LIB${LIB}} STREQUAL "LIB${LIB}-NOTFOUND")) + set(DEPS_ERROR TRUE CACHE INTERNAL " ") + set(FAILED_DEPS "${FAILED_DEPS} lib${LIB}" CACHE INTERNAL " ") + endif() + set(LIB${LIB} "" CACHE INTERNAL "library") + endforeach() + + if(DEPS_ERROR) + message(FATAL_ERROR "Cannot find dependencies: ${FAILED_DEPS}") + endif() + + # Find the MySQL headers if they were not defined + if(NOT ( DEFINED MYSQL_DIR ) ) + find_path(MYSQL_DIR mysql.h PATH_SUFFIXES mysql mariadb) + if(${MYSQL_DIR} STREQUAL "MYSQL_DIR-NOTFOUND") + message(FATAL_ERROR "Fatal Error: MySQL headers were not found.") + endif() + 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.") + endif() + endif() + + # Find the embedded mysql library + if( NOT ( DEFINED EMBEDDED_LIB ) ) + + if(STATIC_EMBEDDED) + + find_file(EMBEDDED_LIB libmysqld.a PATHS /usr/lib /usr/lib64 PATH_SUFFIXES mysql mariadb) + + if(${EMBEDDED_LIB} STREQUAL "EMBEDDED_LIB-NOTFOUND") + + message(WARNING "Warning: Static library not found, looking for dynamic version") + find_library(EMBEDDED_LIB mysqld PATHS /usr/lib /usr/lib64 PATH_SUFFIXES mysql mariadb) + + endif() + else() + + find_library(EMBEDDED_LIB mysqld PATHS /usr/lib /usr/lib64 PATH_SUFFIXES mysql mariadb) + + endif() + + endif() + + + # Inform the user about the embedded library + if(${EMBEDDED_LIB} STREQUAL "EMBEDDED_LIB-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=") + else() + get_filename_component(EMBEDDED_LIB ${EMBEDDED_LIB} REALPATH) + message(STATUS "Using embedded library: ${EMBEDDED_LIB}") + endif() + + set(DEPS_OK TRUE) + +endmacro() \ No newline at end of file diff --git a/query_classifier/test/canonical_tests/CMakeLists.txt b/query_classifier/test/canonical_tests/CMakeLists.txt index c5ec3bf2d..fcfe6da2a 100644 --- a/query_classifier/test/canonical_tests/CMakeLists.txt +++ b/query_classifier/test/canonical_tests/CMakeLists.txt @@ -1,6 +1,6 @@ file(COPY ${ERRMSG} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) add_executable(canonizer canonizer.c) -target_link_libraries(canonizer pthread query_classifier z dl ssl aio crypt crypto rt m ${EMBEDDED_LIB} fullcore) +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 $ ${CMAKE_CURRENT_SOURCE_DIR}/input.sql diff --git a/rabbitmq_consumer/CMakeLists.txt b/rabbitmq_consumer/CMakeLists.txt index 5b9ed09d5..975a4e3e5 100644 --- a/rabbitmq_consumer/CMakeLists.txt +++ b/rabbitmq_consumer/CMakeLists.txt @@ -1,10 +1,6 @@ -cmake_minimum_required (VERSION 2.8) - -project (consumer) - find_library(MYSQL_CLIENT_LIB NAMES mysqlclient PATHS /usr/lib /usr/lib64 PATH_SUFFIXES mysql mariadb) -if( ( RABBITMQ_LIB AND RABBITMQ_HEADERS ) AND MYSQL_CLIENT_LIB ) +if( ( RABBITMQ_LIB AND RABBITMQ_HEADERS ) AND ( NOT ( ${MYSQL_CLIENT_LIB} STREQUAL "MYSQL_CLIENT_LIB-NOTFOUND" ) ) ) add_executable (consumer consumer.c) target_link_libraries(consumer ${MYSQL_CLIENT_LIB} rabbitmq inih) @@ -17,15 +13,3 @@ else() message(FATAL_ERROR "Error: Can not find requred libraries and headers: librabbitmq libmysqlclient") endif() - -# Packaging of RabbitMQ disabled for now - -#set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "RabbitMQ Consumer Client") -#set(CPACK_PACKAGE_NAME "RabbitMQ Consumer") -#set(CPACK_GENERATOR "RPM") -#set(CPACK_PACKAGE_VERSION_MAJOR "1") -#set(CPACK_PACKAGE_VERSION_MINOR "0") -#set(CPACK_RPM_PACKAGE_NAME "rabbitmq-consumer") -#set(CPACK_RPM_PACKAGE_VENDOR "SkySQL Ab") -#set(CPACK_RPM_PACKAGE_AUTOREQPROV " no") -#include(CPack) \ No newline at end of file diff --git a/server/core/CMakeLists.txt b/server/core/CMakeLists.txt index de6d27414..9be404c3f 100644 --- a/server/core/CMakeLists.txt +++ b/server/core/CMakeLists.txt @@ -6,7 +6,7 @@ add_executable(maxscale atomic.c buffer.c spinlock.c gateway.c gw_utils.c utils.c dcb.c load_utils.c session.c service.c server.c poll.c config.c users.c hashtable.c dbusers.c thread.c gwbitmask.c monitor.c adminusers.c secrets.c filter.c modutil.c hint.c housekeeper.c) -target_link_libraries(maxscale utils log_manager ssl aio pthread crypt dl ${EMBEDDED_LIB} crypto inih z rt m) +target_link_libraries(maxscale utils log_manager ssl aio pthread crypt dl ${EMBEDDED_LIB} crypto inih z rt m stdc++) install(TARGETS maxscale DESTINATION bin) add_executable(maxkeys maxkeys.c secrets.c utils.c) diff --git a/server/test/CMakeLists.txt b/server/test/CMakeLists.txt index eca007b98..9a3fd8b55 100644 --- a/server/test/CMakeLists.txt +++ b/server/test/CMakeLists.txt @@ -5,4 +5,4 @@ set_tests_properties(RunExecutable PROPERTIES TIMEOUT 5) set_tests_properties(RunExecutable PROPERTIES WILL_FAIL TRUE) add_test(NAME KillExecutable COMMAND killall -KILL maxscale) -set_tests_properties(KillExecutable PROPERTIES COST 100000) +set_tests_properties(KillExecutable PROPERTIES DEPENDS StackHintTest )