summaryrefslogtreecommitdiffstats
path: root/wsrep-lib/CMakeLists.txt
diff options
context:
space:
mode:
Diffstat (limited to 'wsrep-lib/CMakeLists.txt')
-rw-r--r--wsrep-lib/CMakeLists.txt211
1 files changed, 211 insertions, 0 deletions
diff --git a/wsrep-lib/CMakeLists.txt b/wsrep-lib/CMakeLists.txt
new file mode 100644
index 00000000..d928fa53
--- /dev/null
+++ b/wsrep-lib/CMakeLists.txt
@@ -0,0 +1,211 @@
+#
+# Copyright (C) 2021 Codership Oy <info@codership.com>
+#
+
+cmake_minimum_required (VERSION 2.8)
+
+# Parse version from version header file and store it into
+# WSREP_LIB_VERSION.
+file (READ "include/wsrep/version.hpp" ver)
+string(REGEX MATCH "WSREP_LIB_VERSION_MAJOR ([0-9]*)" _ ${ver})
+set(ver_major ${CMAKE_MATCH_1})
+file (READ "include/wsrep/version.hpp" ver)
+string(REGEX MATCH "WSREP_LIB_VERSION_MINOR ([0-9]*)" _ ${ver})
+set(ver_minor ${CMAKE_MATCH_1})
+file (READ "include/wsrep/version.hpp" ver)
+string(REGEX MATCH "WSREP_LIB_VERSION_PATCH ([0-9]*)" _ ${ver})
+set(ver_patch ${CMAKE_MATCH_1})
+set(WSREP_LIB_VERSION "${ver_major}.${ver_minor}.${ver_patch}")
+message(STATUS "Wsrep-lib version: ${WSREP_LIB_VERSION}")
+
+if (POLICY CMP0048)
+ cmake_policy(SET CMP0048 NEW)
+ project(wsrep-lib VERSION ${WSREP_LIB_VERSION})
+else()
+ project(wsrep-lib)
+endif()
+
+if (POLICY CMP0057)
+ cmake_policy(SET CMP0057 NEW)
+endif()
+
+if (POLICY CMP0077)
+ cmake_policy(SET CMP0077 NEW)
+endif()
+
+include(CheckIncludeFileCXX)
+include(CheckLibraryExists)
+include(CheckCXXCompilerFlag)
+
+# Options
+
+# Compile unit tests
+option(WSREP_LIB_WITH_UNIT_TESTS "Compile unit tests" ON)
+if (WSREP_LIB_WITH_UNIT_TESTS)
+ # Run tests automatically by default if compiled
+ option(WSREP_LIB_WITH_AUTO_TEST "Run unit tests automatically after build" OFF)
+ option(WSREP_LIB_WITH_UNIT_TESTS_EXTRA "Compile unit tests that may require additional software" OFF)
+endif()
+
+# Build a sample program
+option(WSREP_LIB_WITH_DBSIM "Compile sample dbsim program" ON)
+
+option(WSREP_LIB_WITH_ASAN "Enable address sanitizer" OFF)
+option(WSREP_LIB_WITH_TSAN "Enable thread sanitizer" OFF)
+
+option(WSREP_LIB_WITH_DOCUMENTATION "Generate documentation" OFF)
+option(WSREP_LIB_WITH_COVERAGE "Compile with coverage instrumentation" OFF)
+
+option(WSREP_LIB_STRICT_BUILD_FLAGS "Compile with strict build flags" OFF)
+option(WSREP_LIB_MAINTAINER_MODE "Fail compilation on any warnings" OFF)
+
+# Compiler options
+
+# Set std to C++0x/C++11 if superproject has not set standard yet
+if (NOT CMAKE_CXX_STANDARD OR CMAKE_CXX_STANDARD LESS 11)
+ string(FIND "${CMAKE_CXX_FLAGS}" "-std=" HAVE_STD)
+ if (HAVE_STD EQUAL -1)
+ if (CMAKE_VERSION VERSION_LESS "3.1")
+ if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND
+ CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8.1)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
+ else()
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
+ endif()
+ else()
+ set(CMAKE_CXX_STANDARD 11)
+ endif()
+ endif()
+endif()
+
+# C flags
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wconversion")
+# CXX flags
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Woverloaded-virtual -Wconversion -g")
+check_cxx_compiler_flag("-Wsuggest-override" HAVE_SUGGEST_OVERRIDE)
+if (HAVE_SUGGEST_OVERRIDE)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wsuggest-override")
+endif()
+
+if (WSREP_LIB_STRICT_BUILD_FLAGS)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Weffc++")
+endif()
+if (WSREP_LIB_MAINTAINER_MODE)
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
+endif()
+
+# Enable extra libstdc++ assertions with debug build.
+if (CMAKE_BUILD_TYPE STREQUAL "Debug")
+ add_definitions("-D_GLIBCXX_ASSERTIONS")
+else()
+ # Make sure that NDEBUG is enabled in release builds even
+ # if the parent project does not define it.
+ add_definitions("-DNDEBUG")
+endif()
+
+# Set up include directories
+include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include")
+include_directories("${CMAKE_CURRENT_SOURCE_DIR}/wsrep-API")
+
+# Find libraries.
+CHECK_LIBRARY_EXISTS(dl dlopen "" WSREP_LIB_HAVE_LIBDL)
+if (WSREP_LIB_HAVE_LIBDL)
+ set(WSREP_LIB_LIBDL "dl")
+else()
+ set(WSREP_LIB_LIBDL "")
+endif()
+
+set(MIN_BOOST_VERSION "1.54.0")
+if (WSREP_LIB_WITH_UNIT_TESTS)
+ if (WSREP_LIB_WITH_UNIT_TESTS_EXTRA)
+ set(json_HEADER "boost/json/src.hpp")
+ # Extra tests may require packages from very recent boost which may be
+ # unavailable on the system. In such case download private boost distro.
+ check_include_file_cxx(${json_HEADER} system_json_FOUND)
+ if (NOT system_json_FOUND)
+ if (NOT WITH_BOOST)
+ set(WITH_BOOST "${CMAKE_SOURCE_DIR}/../boost")
+ endif()
+ set(DOWNLOAD_BOOST ON)
+ include (cmake/boost.cmake)
+ set(MIN_BOOST_VERSION "${BOOST_MAJOR}.${BOOST_MINOR}.${BOOST_PATCH}")
+ message(STATUS "Boost includes: ${BOOST_INCLUDE_DIR}, ver: ${MIN_BOOST_VERSION}")
+ find_package(Boost ${MIN_BOOST_VERSION} REQUIRED
+ COMPONENTS json headers
+ PATHS ${WITH_BOOST}/lib/cmake
+ NO_DEFAULT_PATH
+ )
+ # Boost 1.76.0 comes very sloppy (and not only in JSON department)
+ # - need to disable some checks.
+ set(ADDITIONAL_CXX_FLAGS "-Wno-effc++ -Wno-conversion -Wno-suggest-override -Wno-overloaded-virtual")
+ set(ADDITIONAL_CXX_INCLUDES ${BOOST_INCLUDE_DIR})
+ check_include_file_cxx(${json_HEADER} json_FOUND
+ "-I${ADDITIONAL_CXX_INCLUDES} ${ADDITIONAL_CXX_FLAGS}"
+ )
+ if (NOT json_FOUND)
+ message(FATAL_ERROR "Required header 'boost/json.hpp' not found: ${json_FOUND}")
+ else()
+ include_directories(SYSTEM ${ADDITIONAL_CXX_INCLUDES})
+ endif()
+ endif()
+ endif()
+ find_package(Boost ${MIN_BOOST_VERSION} REQUIRED
+ unit_test_framework
+ )
+endif()
+
+if (WSREP_LIB_WITH_DBSIM)
+ find_package(Boost ${MIN_BOOST_VERSION} REQUIRED
+ program_options
+ filesystem
+ thread
+ )
+endif()
+
+if (WSREP_LIB_WITH_ASAN)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
+endif()
+if (WSREP_LIB_WITH_TSAN)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread")
+endif()
+
+# Coverage
+#
+# To produce a coverage report, call cmake with -DWITH_COVERAGE=ON,
+# run
+#
+# make
+# make test
+# make coverage_report
+#
+# The coverage report output will be in directory coverage_report/index.html
+#
+if (WSREP_LIB_WITH_COVERAGE)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage")
+endif()
+
+add_custom_target(coverage_report
+ lcov --base-directory ${CMAKE_CURRENT_SOURCE_DIR} --capture --directory ${CMAKE_CURRENT_BINARY_DIR} --output lcov.info --no-external --quiet
+ COMMAND genhtml --output-directory coverage_report lcov.info)
+
+
+if (WSREP_LIB_WITH_DOCUMENTATION)
+ find_package(Doxygen REQUIRED)
+ add_custom_target(doc ALL
+ COMMAND doxygen ${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/doc
+ COMMENT "Generating documentation with Doxygen"
+ VERBATIM)
+endif()
+
+add_subdirectory(src)
+add_subdirectory(wsrep-API)
+if (WSREP_LIB_WITH_UNIT_TESTS)
+ enable_testing()
+ add_subdirectory(test)
+endif()
+if (WSREP_LIB_WITH_DBSIM)
+ add_subdirectory(dbsim)
+endif()