2020# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
2121# SOFTWARE.
2222
23+ cmake_minimum_required (VERSION 3.13)
24+
2325###
24- # config
26+ # project
2527###
26- cmake_minimum_required (VERSION 2.8.7)
28+ if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.12)
29+ cmake_policy (SET CMP0048 NEW)
30+ project (cpp_redis
31+ VERSION 4.4.0
32+ DESCRIPTION "Lightweight C++11 Redis Client"
33+ HOMEPAGE_URL "https://github.com/cpp-redis/cpp_redis"
34+ LANGUAGES CXX)
35+ else ()
36+ # for cmake >= 3.0
37+ project (cpp_redis VERSION 4.4.0 LANGUAGES CXX)
38+ endif ()
39+ if (POLICY CMP0077)
40+ cmake_policy (SET CMP0077 NEW)
41+ endif ()
42+
2743set (CMAKE_MACOSX_RPATH 1)
28- include ( ${CMAKE_ROOT} /Modules/ExternalProject.cmake )
44+ set (CMAKE_CXX_STANDARD 11 )
2945
46+ set (EXPORT_TARGET_NAME ${PROJECT_NAME} CACHE STRING "Name of the exported CMake target used in install(EXPORT)" )
3047
3148###
3249# verbose make
3350###
3451# set(CMAKE_VERBOSE_MAKEFILE TRUE)
3552
36-
37- ###
38- # project
39- ###
40- set (PROJECT cpp_redis)
41- project (${PROJECT} CXX)
42-
53+ include (sources .cmake)
4354
4455###
4556# compilation options
4657###
4758if (MSVC )
48- set ( CMAKE_CXX_FLAGS " ${CMAKE_CXX_FLAGS} /W3 /O2 /bigobj" )
49-
50- # was causing conflics with gtest build
51- string (REPLACE "/RTC1" "" CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG} )
52-
53- if ("${MSVC_RUNTIME_LIBRARY_CONFIG} " STREQUAL "" )
54- set (MSVC_RUNTIME_LIBRARY_CONFIG "/MT" )
55- endif ()
56-
57- foreach (flag_var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE )
58- if ("${MSVC_RUNTIME_LIBRARY_CONFIG} " STREQUAL "/MT" )
59- string (REPLACE "/MD" "/MT" ${flag_var} "${${flag_var} }" )
60- elseif ("${MSVC_RUNTIME_LIBRARY_CONFIG} " STREQUAL "/MD" )
61- string (REPLACE "/MT" "/MD" ${flag_var} "${${flag_var} }" )
62- else ()
63- string (REPLACE "/MD" "${MSVC_RUNTIME_LIBRARY_CONFIG} " ${flag_var} "${${flag_var} }" )
64- string (REPLACE "/MT" "${MSVC_RUNTIME_LIBRARY_CONFIG} " ${flag_var} "${${flag_var} }" )
65- endif ()
66- endforeach ()
67-
68- add_definitions (-D_UNICODE)
69- add_definitions (-DUNICODE)
70- add_definitions (-DWIN32_LEAN_AND_MEAN)
59+ add_compile_options ( /W3 /O2 /bigobj)
60+
61+ # was causing conflics with gtest build
62+ string (REPLACE "/RTC1" "" CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG} )
63+
64+ if ("${MSVC_RUNTIME_LIBRARY_CONFIG} " STREQUAL "" )
65+ set (MSVC_RUNTIME_LIBRARY_CONFIG "/MT" )
66+ endif ()
67+
68+ foreach (flag_var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE )
69+ if ("${MSVC_RUNTIME_LIBRARY_CONFIG} " STREQUAL "/MT" )
70+ string (REPLACE "/MD" "/MT" ${flag_var} "${${flag_var} }" )
71+ elseif ("${MSVC_RUNTIME_LIBRARY_CONFIG} " STREQUAL "/MD" )
72+ string (REPLACE "/MT" "/MD" ${flag_var} "${${flag_var} }" )
73+ else ()
74+ string (REPLACE "/MD" "${MSVC_RUNTIME_LIBRARY_CONFIG} " ${flag_var} "${${flag_var} }" )
75+ string (REPLACE "/MT" "${MSVC_RUNTIME_LIBRARY_CONFIG} " ${flag_var} "${${flag_var} }" )
76+ endif ()
77+ endforeach ()
78+
79+ add_definitions (-D_UNICODE)
80+ add_definitions (-DUNICODE)
81+ add_definitions (-DWIN32_LEAN_AND_MEAN)
7182else ()
72- set ( CMAKE_CXX_FLAGS " ${CMAKE_CXX_FLAGS} -std=c++11 - W -Wall -Wextra -O3" )
83+ add_compile_options (- W -Wall -Wextra -O3)
7384endif ()
7485
75-
7686###
77- # variables
87+ # tacopie
7888###
79- find_path (TACOPIE_INCLUDE_DIR tacopie/tacopie PATHS ${PROJECT_SOURCE_DIR} /tacopie/includes/)
80- find_library (TACOPIE_LIBRARY tacopie)
81- set (CPP_REDIS_INCLUDES ${PROJECT_SOURCE_DIR} /includes)
82- set (DEPS_INCLUDES ${PROJECT_SOURCE_DIR} /deps/include )
83-
84- if (NOT USE_CUSTOM_TCP_CLIENT)
85- set (DEPS_INCLUDES ${DEPS_INCLUDES} ${TACOPIE_INCLUDE_DIR} )
89+ if (NOT tacopie_library AND NOT USE_CUSTOM_TCP_CLIENT)
90+ # requires CMP0077 set to NEW
91+ set (BUILD_EXAMPLES OFF )
92+ set (BUILD_TESTS OFF )
93+ add_subdirectory (tacopie)
94+ # TODO: add alias library
8695endif ()
8796
88- set (DEPS_LIBRARIES ${PROJECT_SOURCE_DIR} /deps/lib)
89-
90-
91- ###
92- # includes
93- ###
94- include_directories (${CPP_REDIS_INCLUDES} ${DEPS_INCLUDES} )
95-
96-
97- ###
98- # sources
99- ###
100- set (SRC_DIRS "sources"
101- "sources/builders"
102- "sources/core"
103- "sources/misc"
104- "sources/network"
105- "includes/cpp_redis"
106- "includes/cpp_redis/builders"
107- "includes/cpp_redis/core"
108- "includes/cpp_redis/misc"
109- "includes/cpp_redis/network" )
97+ set (cpp_redis_includes ${CMAKE_CURRENT_LIST_DIR} /includes)
98+ set (deps_includes ${CMAKE_CURRENT_LIST_DIR} /deps/include )
11099
111- foreach (dir ${SRC_DIRS} )
112- # get directory sources and headers
113- file (GLOB s_${dir} "${dir} /*.cpp" )
114- file (GLOB h_${dir} "${dir} /*.hpp" )
115- file (GLOB i_${dir} "${dir} /*.ipp" )
100+ set (deps_libraries ${PROJECT_SOURCE_DIR} /deps/lib)
116101
117- # set sources
118- set (SOURCES ${SOURCES} ${s_${dir} } ${h_${dir} } ${i_${dir} })
119- endforeach ()
120102# filter tcp_client if no tacopie
121103if (USE_CUSTOM_TCP_CLIENT)
122- file (GLOB tacopie_cpp "sources/network/tcp_client.cpp" )
123- file (GLOB tacopie_h "includes/cpp_redis/network/tcp_client.hpp" )
124- list (REMOVE_ITEM SOURCES ${tacopie_cpp} ${tacopie_h} )
125- endif (USE_CUSTOM_TCP_CLIENT)
126-
104+ file (GLOB tacopie_cpp "sources/network/tcp_client.cpp" )
105+ list (REMOVE_ITEM ${cpp_redis_sources} ${tacopie_cpp} )
106+ endif ()
127107
128108###
129109# outputs
@@ -136,88 +116,83 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
136116###
137117# pkg-config
138118###
139- configure_file ("cpp_redis .pc.in" "${CMAKE_PKGCONFIG_OUTPUT_DIRECTORY} /cpp_redis .pc" @ONLY)
119+ configure_file ("${PROJECT_NAME} .pc.in" "${CMAKE_PKGCONFIG_OUTPUT_DIRECTORY} /${PROJECT_NAME} .pc" @ONLY)
140120
141121###
142- # executable
122+ # main target
143123###
144- add_library (${PROJECT} ${SOURCES} )
145- set_property (TARGET ${PROJECT} PROPERTY POSITION_INDEPENDENT_CODE ON )
124+ add_library (${PROJECT_NAME} SHARED ${cpp_redis_sources} )
146125
147- if (WIN32 )
148- set_target_properties (${PROJECT}
149- PROPERTIES COMPILE_PDB_NAME ${PROJECT}
150- COMPILE_PDB_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} )
151- endif (WIN32 )
126+ ###
127+ # includes
128+ ###
129+ target_include_directories (${PROJECT_NAME} PUBLIC
130+ $<BUILD_INTERFACE:${cpp_redis_includes} >
131+ $<INSTALL_INTERFACE:include >)
152132
153133if (WIN32 )
154- target_link_libraries (${PROJECT} ws2_32)
155- else ()
156- target_link_libraries ( ${PROJECT} pthread )
157- endif (WIN32 )
134+ set_target_properties (${PROJECT_NAME} PROPERTIES
135+ COMPILE_PDB_NAME ${PROJECT_NAME}
136+ COMPILE_PDB_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} )
137+ endif ()
158138
159- if (TACOPIE_LIBRARY)
160- target_link_libraries (${PROJECT} ${TACOPIE_LIBRARY} )
161- else ()
162- target_link_libraries (${PROJECT} tacopie)
163- endif (TACOPIE_LIBRARY)
139+ set_target_properties (${PROJECT_NAME} PROPERTIES
140+ SOVERSION ${PROJECT_VERSION}
141+ RESOURCE ${CMAKE_PKGCONFIG_OUTPUT_DIRECTORY} /${PROJECT_NAME} .pc)
142+
143+ find_package (Threads REQUIRED)
144+ target_link_libraries (${PROJECT_NAME} PRIVATE Threads::Threads)
164145
146+ if (tacopie_library)
147+ target_link_libraries (${PROJECT_NAME} PUBLIC ${tacopie_library} )
148+ else ()
149+ target_link_libraries (${PROJECT_NAME} PUBLIC tacopie)
150+ endif ()
165151
166- # __CPP_REDIS_READ_SIZE
167- if (READ_SIZE)
168- set_property (TARGET ${PROJECT} APPEND_STRING PROPERTY COMPILE_DEFINITIONS " __CPP_REDIS_READ_SIZE=${READ_SIZE} " )
169- endif (READ_SIZE)
152+ ###
153+ # parameters
154+ ###
155+ set (READ_SIZE "4096" CACHE STRING "Number of bytes read from sockets" )
156+ if (READ_SIZE MATCHES "^[1-9]+" )
157+ target_compile_definitions (${PROJECT_NAME} PRIVATE __CPP_REDIS_READ_SIZE=${READ_SIZE} )
158+ endif ()
170159
171- # __CPP_REDIS_LOGGING_ENABLED
160+ option (LOGGING_ENABLED "If true enables logging calls to cpp_redis::level()" OFF )
172161if (LOGGING_ENABLED)
173- set_property ( TARGET ${PROJECT} APPEND_STRING PROPERTY COMPILE_DEFINITIONS " __CPP_REDIS_LOGGING_ENABLED= ${LOGGING_ENABLED} " )
174- endif (LOGGING_ENABLED )
162+ target_compile_definitions ( ${PROJECT_NAME} PRIVATE __CPP_REDIS_LOGGING_ENABLED)
163+ endif ()
175164
176- # __CPP_REDIS_USE_CUSTOM_TCP_CLIENT
165+ option (USE_CUSTOM_TCP_CLIENT "If true user must provide a custom tcp_client_iface instance, otherwise uses tacopie" OFF )
177166if (USE_CUSTOM_TCP_CLIENT)
178- set_property (TARGET ${PROJECT} APPEND_STRING PROPERTY COMPILE_DEFINITIONS " __CPP_REDIS_USE_CUSTOM_TCP_CLIENT=${USE_CUSTOM_TCP_CLIENT} " )
179- endif (USE_CUSTOM_TCP_CLIENT)
180-
167+ target_compile_definitions (${PROJECT_NAME} PRIVATE __CPP_REDIS_USE_CUSTOM_TCP_CLIENT)
168+ endif ()
181169
182170###
183171# install
184172###
185- # ensure lib and bin directories exist
186- install (CODE "FILE(MAKE_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} )" )
187- install (CODE "FILE(MAKE_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} )" )
188- # install cpp_redis
189- install (DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} / DESTINATION lib USE_SOURCE_PERMISSIONS)
190- install (DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} / DESTINATION bin USE_SOURCE_PERMISSIONS)
191- install (DIRECTORY ${CPP_REDIS_INCLUDES} / DESTINATION include USE_SOURCE_PERMISSIONS)
173+ install (DIRECTORY ${cpp_redis_includes} / DESTINATION include USE_SOURCE_PERMISSIONS)
192174
175+ include (GNUInstallDirs)
176+ install (TARGETS ${PROJECT_NAME} EXPORT ${EXPORT_TARGET_NAME}
177+ LIBRARY
178+ RESOURCE DESTINATION ${CMAKE_INSTALL_LIBDIR} /pkgconfig)
179+ install (EXPORT ${EXPORT_TARGET_NAME} DESTINATION lib/${PROJECT_NAME} EXPORT_LINK_INTERFACE_LIBRARIES)
193180
194181###
195182# examples
196183###
197184if (BUILD_EXAMPLES)
198- add_subdirectory (examples)
199- # Reset variable to false to ensure tacopie does no build examples
200- set (BUILD_EXAMPLES false )
201- endif (BUILD_EXAMPLES)
185+ add_subdirectory (examples)
186+ endif ()
202187
203188###
204189# tests
205190###
206191if (BUILD_TESTS)
207- enable_testing ()
208- add_subdirectory (tests)
209- ExternalProject_Add("googletest"
210- GIT_REPOSITORY "https://github.com/google/googletest.git"
211- CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=${PROJECT_SOURCE_DIR} /deps" )
212- # Reset variable to false to ensure tacopie does no build tests
213- set (BUILD_TESTS false )
214- endif (BUILD_TESTS)
215-
216-
217- ###
218- # tacopie
219- ###
220- if (NOT TACOPIE_LIBRARY AND NOT USE_CUSTOM_TCP_CLIENT)
221- set (SOURCES ) # reset the SOURCES var so that the tacopie project won't include the cpp_redis sources too
222- add_subdirectory (tacopie)
223- endif (NOT TACOPIE_LIBRARY AND NOT USE_CUSTOM_TCP_CLIENT)
192+ enable_testing ()
193+ if (NOT TARGET gtest)
194+ set (INSTALL_GTEST OFF )
195+ add_subdirectory (googletest)
196+ endif ()
197+ add_subdirectory (tests)
198+ endif ()
0 commit comments