Skip to content

Commit

Permalink
Upgrade to target-based CMake. Added option for shared libraries. (#46)
Browse files Browse the repository at this point in the history
  • Loading branch information
psalvaggio authored and nekipelov committed Oct 20, 2017
1 parent 51bf6e8 commit 52b92c9
Show file tree
Hide file tree
Showing 23 changed files with 381 additions and 182 deletions.
144 changes: 63 additions & 81 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,92 +1,74 @@
cmake_minimum_required(VERSION 2.6)

PROJECT(RedisClient)

OPTION(ADDRESS_SANITIZER "Enable address sanitizer" OFF)
OPTION(BENCHMARK "Build benmarks" OFF)

if(NOT CMAKE_BUILD_TYPE)
message(STATUS "No build type selected, default to Release")
set(CMAKE_BUILD_TYPE "Release")
# CMake script for RedisClient
############################################################

cmake_minimum_required(VERSION 3.1)

# Project and Versioning
project(RedisClient)
set(VERSION_MAJOR 0 CACHE STRING "Project major version number.")
set(VERSION_MINOR 5 CACHE STRING "Project minor version number.")
set(VERSION_PATCH 0 CACHE STRING "Project patch version number.")
set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH})
mark_as_advanced(VERSION_MAJOR VERSION_MINOR VERSION_PATCH VERSION)

# Include utility functions
include(cmake/Utils.cmake)

# Set the C++11 standard
set(CMAKE_CXX_STANDARD 11)

# Build options
option(ADDRESS_SANITIZER "Enable address sanitizer" OFF)
option(BENCHMARK "Build benmarks" OFF)
option(BUILD_SHARED_LIBS "Whether to build shared libraries" ON)
option(BUILD_TEST "Whether to build the unit tests" ON)
option(BUILD_EXAMPLES "Whether to build the examples" ON)
option(HEADER_ONLY "Whether to build in header-only mode" OFF)

# Default to Release mode
if (NOT CMAKE_BUILD_TYPE)
message(STATUS "No build type selected, default to Release")
set(CMAKE_BUILD_TYPE "Release")
endif()

if(ADDRESS_SANITIZER)
message(STATUS "Build with address-sanitizer")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
set(CMAKE_LD_FLAGS "-fsanitize=address")
# Optionally add the address sanitizer
if (ADDRESS_SANITIZER)
message(STATUS "Build with address-sanitizer")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
set(CMAKE_LD_FLAGS "-fsanitize=address")
endif()

if(MSVC)
ADD_DEFINITIONS(-DBOOST_ALL_NO_LIB)
if (MSVC)
add_definitions(-DBOOST_ALL_NO_LIB)
endif()

if(NOT Boost_USE_STATIC_LIBS)
ADD_DEFINITIONS(-DBOOST_ALL_DYN_LINK)
if (NOT Boost_USE_STATIC_LIBS)
add_definitions(-DBOOST_ALL_DYN_LINK)
endif()

FIND_PACKAGE(Boost COMPONENTS system program_options unit_test_framework date_time REQUIRED)

LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})

IF(MSVC)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3")
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od -DDEBUG ")
SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /O2 -DNDEBUG")
ELSE()
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W -Wall -Wextra -fPIC -pthread -std=c++11")
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -g3 -DDEBUG ")
SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -g3 -DNDEBUG")
ENDIF()

SET(SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/src/redisclient/impl/redisvalue.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/redisclient/impl/redissyncclient.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/redisclient/impl/redisparser.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/redisclient/impl/redisclientimpl.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/redisclient/impl/redisasyncclient.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/redisclient/impl/pipeline.cpp
)

SET(HEADERS
${CMAKE_CURRENT_SOURCE_DIR}/src/redisclient/config.h
${CMAKE_CURRENT_SOURCE_DIR}/src/redisclient/version.h
${CMAKE_CURRENT_SOURCE_DIR}/src/redisclient/redisvalue.h
${CMAKE_CURRENT_SOURCE_DIR}/src/redisclient/redissyncclient.h
${CMAKE_CURRENT_SOURCE_DIR}/src/redisclient/redisparser.h
${CMAKE_CURRENT_SOURCE_DIR}/src/redisclient/redisbuffer.h
${CMAKE_CURRENT_SOURCE_DIR}/src/redisclient/redisasyncclient.h
${CMAKE_CURRENT_SOURCE_DIR}/src/redisclient/pipeline.h
${CMAKE_CURRENT_SOURCE_DIR}/src/redisclient/impl/redisclientimpl.h
)

INCLUDE_DIRECTORIES(
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/src
${Boost_INCLUDE_DIRS}
)

ADD_EXECUTABLE(parsertest tests/parsertest.cpp ${SOURCES} ${HEADERS})
ADD_EXECUTABLE(redisvaluetest tests/redisvaluetest.cpp ${SOURCES} ${HEADERS})
ADD_LIBRARY(redisclient STATIC ${HEADERS} ${SOURCES})

SET(TESTS
parsertest
redisvaluetest
)

FOREACH(TEST ${TESTS})
TARGET_LINK_LIBRARIES(${TEST} ${Boost_SYSTEM_LIBRARY} ${Boost_DATE_TIME_LIBRARY} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})
ENDFOREACH()


INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/src DESTINATION include)

ADD_SUBDIRECTORY(examples)
if(ADDRESS_SANITIZER)
ADD_SUBDIRECTORY(benchmarks)
# Find all of our dependencies
include(cmake/Dependencies.cmake)

if (MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od -DDEBUG ")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /O2 -DNDEBUG")
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W -Wall -Wextra -pthread")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -g3 -DDEBUG ")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -DNDEBUG")
endif()

INCLUDE(CTest)
ADD_TEST(ParserTest parsertest)
ADD_TEST(RedisValueTest redisvaluetest)
add_subdirectory(src)
if (BUILD_EXAMPLES)
add_subdirectory(examples)
endif()
if (BUILD_TEST)
enable_testing()
add_subdirectory(tests)
endif()
if (BENCHMARK)
add_subdirectory(benchmarks)
endif()

include(cmake/Install.cmake)
2 changes: 1 addition & 1 deletion appveyor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ build_script:
$env:CMAKE_GENERATOR_NAME="Visual Studio 14 2015 Win64"
$env:BOOST_LIBRARYDIR=$env:BOOST_LIBRARYDIR_WIN64
}
- cmd: cmake -G "%CMAKE_GENERATOR_NAME%" -DCMAKE_BUILD_TYPE=%configuration% -DBOOST_ROOT="%BOOST_ROOT%" -DBOOST_LIBRARYDIR="%BOOST_LIBRARYDIR%" -DBoost_USE_STATIC_LIBS="ON" ..
- cmd: cmake -G "%CMAKE_GENERATOR_NAME%" -DCMAKE_BUILD_TYPE=%configuration% -DBOOST_ROOT="%BOOST_ROOT%" -DBOOST_LIBRARYDIR="%BOOST_LIBRARYDIR%" -DBoost_USE_STATIC_LIBS="ON" -DBUILD_SHARED_LIBS=OFF ..
- cmd: cmake --build . -- /verbosity:detailed

#test_script:
Expand Down
54 changes: 10 additions & 44 deletions benchmarks/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,47 +1,13 @@

SET(REDISCLIENT_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/../src/redisclient/impl/redisvalue.cpp
${CMAKE_CURRENT_SOURCE_DIR}/../src/redisclient/impl/redissyncclient.cpp
${CMAKE_CURRENT_SOURCE_DIR}/../src/redisclient/impl/redisparser.cpp
${CMAKE_CURRENT_SOURCE_DIR}/../src/redisclient/impl/redisclientimpl.cpp
${CMAKE_CURRENT_SOURCE_DIR}/../src/redisclient/impl/redisasyncclient.cpp
${CMAKE_CURRENT_SOURCE_DIR}/../src/redisclient/config.h
${CMAKE_CURRENT_SOURCE_DIR}/../src/redisclient/version.h
${CMAKE_CURRENT_SOURCE_DIR}/../src/redisclient/redisvalue.h
${CMAKE_CURRENT_SOURCE_DIR}/../src/redisclient/redissyncclient.h
${CMAKE_CURRENT_SOURCE_DIR}/../src/redisclient/redisparser.h
${CMAKE_CURRENT_SOURCE_DIR}/../src/redisclient/redisbuffer.h
${CMAKE_CURRENT_SOURCE_DIR}/../src/redisclient/redisasyncclient.h
${CMAKE_CURRENT_SOURCE_DIR}/../src/redisclient/impl/redisclientimpl.h
)

INCLUDE_DIRECTORIES(
${Boost_INCLUDE_DIRS}
${CMAKE_SOURCE_DIR}/src/
)

SET(BENCHMARKS
set(BENCHMARKS
redis-parser-benchmark.cpp
)

FOREACH(FILE ${REDISCLIENT_SOURCES})
SET_SOURCE_FILES_PROPERTIES(${FILE} PROPERTIES HEADER_FILE_ONLY TRUE)
ENDFOREACH()

FOREACH(BENCHMARK ${BENCHMARKS})
GET_FILENAME_COMPONENT(EXECUTABLE ${BENCHMARK} NAME_WE)
ADD_EXECUTABLE(${EXECUTABLE} ${BENCHMARK} ${REDISCLIENT_SOURCES})
TARGET_LINK_LIBRARIES(${EXECUTABLE}
${Boost_SYSTEM_LIBRARY}
# ${Boost_DATE_TIME_LIBRARY}
# ${Boost_TIMER_LIBRARY}
-lbenchmark
-lprofiler
)
ENDFOREACH(BENCHMARK)

#TARGET_LINK_LIBRARIES(benchmark
# ${Boost_PROGRAM_OPTIONS_LIBRARY}
# ${Boost_DATE_TIME_LIBRARY}
#)

foreach(BENCHMARK ${BENCHMARKS})
get_filename_component(EXECUTABLE ${BENCHMARK} NAME_WE)
add_executable(${EXECUTABLE} ${BENCHMARK})
target_link_libraries(${EXECUTABLE}
RedisClient
-lbenchmark
-lprofiler
)
endforeach()
21 changes: 21 additions & 0 deletions cmake/Dependencies.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# CMake script for finding dependencies. This file is included two times, once
# by the main CMake script for the project, for finding dependencies at build
# time, and once by the package's installed config script, for finding public
# dependencies. A variable, called ${CMAKE_PROJECT_NAME}Install is defined by
# the installed config script and can be used by this script to differentiate
# between the two cases

# Find Boost, users of the library only need system (for error_code), our
# examples use the other components
set(boost_components system)
if (NOT RedisClientInstall)
set(boost_components ${boost_components}
program_options
unit_test_framework
date_time)
endif()

find_package(Boost
COMPONENTS
${boost_components}
REQUIRED)
28 changes: 28 additions & 0 deletions cmake/Install.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
set(INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/include)
set(LIB_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/${INSTALL_LIB_DIR})

include(CMakePackageConfigHelpers)

configure_package_config_file(cmake/config/Config.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}Config.cmake
INSTALL_DESTINATION share/${CMAKE_PROJECT_NAME}
PATH_VARS INCLUDE_INSTALL_DIR LIB_INSTALL_DIR)

write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}ConfigVersion.cmake
VERSION ${VERSION}
COMPATIBILITY AnyNewerVersion)

install(EXPORT ${CMAKE_PROJECT_NAME}-targets
FILE ${CMAKE_PROJECT_NAME}Targets.cmake
NAMESPACE ${CMAKE_PROJECT_NAME}::
DESTINATION share/${CMAKE_PROJECT_NAME})

install(FILES
${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}Config.cmake
${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}ConfigVersion.cmake
DESTINATION share/${CMAKE_PROJECT_NAME})

install(FILES ${CMAKE_SOURCE_DIR}/cmake/Dependencies.cmake
RENAME ${CMAKE_PROJECT_NAME}Dependencies.cmake
DESTINATION share/${CMAKE_PROJECT_NAME})
Loading

0 comments on commit 52b92c9

Please sign in to comment.