Skip to content

Commit ec08c2b

Browse files
michael-grundernriverabloheronr
authored
Added CMake package config and fixed hiredis_ssl on Windows (#783)
* Add CMake package configuration so hiredis can be more easily included in other projects. * Fixes hiredis_ssl such that it compiles and works in windows Co-authored-by: nrivera <nrivera@blizzard.com> Co-authored-by: Nick <heronr1@gmail.com>
1 parent b314c0d commit ec08c2b

4 files changed

Lines changed: 109 additions & 7 deletions

File tree

CMakeLists.txt

Lines changed: 62 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,12 @@ SET(hiredis_sources
3333
sockcompat.c
3434
alloc.c)
3535

36+
SET(hiredis_sources ${hiredis_sources})
37+
38+
IF(WIN32)
39+
ADD_COMPILE_DEFINITIONS(_CRT_SECURE_NO_WARNINGS WIN32_LEAN_AND_MEAN)
40+
ENDIF()
41+
3642
ADD_LIBRARY(hiredis SHARED ${hiredis_sources})
3743

3844
SET_TARGET_PROPERTIES(hiredis
@@ -41,12 +47,16 @@ SET_TARGET_PROPERTIES(hiredis
4147
IF(WIN32 OR MINGW)
4248
TARGET_LINK_LIBRARIES(hiredis PRIVATE ws2_32)
4349
ENDIF()
44-
TARGET_INCLUDE_DIRECTORIES(hiredis PUBLIC .)
50+
51+
TARGET_INCLUDE_DIRECTORIES(hiredis PUBLIC $<INSTALL_INTERFACE:.> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>)
4552

4653
CONFIGURE_FILE(hiredis.pc.in hiredis.pc @ONLY)
4754

4855
INSTALL(TARGETS hiredis
49-
DESTINATION "${CMAKE_INSTALL_LIBDIR}")
56+
EXPORT hiredis-targets
57+
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
58+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
59+
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
5060

5161
INSTALL(FILES hiredis.h read.h sds.h async.h alloc.h
5262
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/hiredis)
@@ -57,30 +67,77 @@ INSTALL(DIRECTORY adapters
5767
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/hiredis.pc
5868
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
5969

70+
export(EXPORT hiredis-targets
71+
FILE "${CMAKE_CURRENT_BINARY_DIR}/hiredis-targets.cmake"
72+
NAMESPACE hiredis::)
73+
74+
SET(CMAKE_CONF_INSTALL_DIR share/hiredis)
75+
SET(INCLUDE_INSTALL_DIR include)
76+
include(CMakePackageConfigHelpers)
77+
configure_package_config_file(hiredis-config.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/hiredis-config.cmake
78+
INSTALL_DESTINATION ${CMAKE_CONF_INSTALL_DIR}
79+
PATH_VARS INCLUDE_INSTALL_DIR)
80+
81+
INSTALL(EXPORT hiredis-targets
82+
FILE hiredis-targets.cmake
83+
NAMESPACE hiredis::
84+
DESTINATION ${CMAKE_CONF_INSTALL_DIR})
85+
86+
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/hiredis-config.cmake
87+
DESTINATION ${CMAKE_CONF_INSTALL_DIR})
88+
89+
6090
IF(ENABLE_SSL)
6191
IF (NOT OPENSSL_ROOT_DIR)
6292
IF (APPLE)
6393
SET(OPENSSL_ROOT_DIR "/usr/local/opt/openssl")
6494
ENDIF()
6595
ENDIF()
6696
FIND_PACKAGE(OpenSSL REQUIRED)
67-
ADD_LIBRARY(hiredis_ssl SHARED
97+
SET(hiredis_ssl_sources
6898
ssl.c)
99+
ADD_LIBRARY(hiredis_ssl SHARED
100+
${hiredis_ssl_sources})
69101
SET_TARGET_PROPERTIES(hiredis_ssl
70-
PROPERTIES
102+
PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE
71103
VERSION "${HIREDIS_SONAME}")
104+
105+
72106
TARGET_INCLUDE_DIRECTORIES(hiredis_ssl PRIVATE "${OPENSSL_INCLUDE_DIR}")
73107
TARGET_LINK_LIBRARIES(hiredis_ssl PRIVATE ${OPENSSL_LIBRARIES})
108+
IF (WIN32 OR MINGW)
109+
TARGET_LINK_LIBRARIES(hiredis_ssl PRIVATE hiredis)
110+
ENDIF()
74111
CONFIGURE_FILE(hiredis_ssl.pc.in hiredis_ssl.pc @ONLY)
75112

76113
INSTALL(TARGETS hiredis_ssl
77-
DESTINATION "${CMAKE_INSTALL_LIBDIR}")
114+
EXPORT hiredis_ssl-targets
115+
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
116+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
117+
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
78118

79119
INSTALL(FILES hiredis_ssl.h
80120
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/hiredis)
81121

82122
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/hiredis_ssl.pc
83123
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
124+
125+
export(EXPORT hiredis_ssl-targets
126+
FILE "${CMAKE_CURRENT_BINARY_DIR}/hiredis_ssl-targets.cmake"
127+
NAMESPACE hiredis::)
128+
129+
SET(CMAKE_CONF_INSTALL_DIR share/hiredis_ssl)
130+
configure_package_config_file(hiredis_ssl-config.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/hiredis_ssl-config.cmake
131+
INSTALL_DESTINATION ${CMAKE_CONF_INSTALL_DIR}
132+
PATH_VARS INCLUDE_INSTALL_DIR)
133+
134+
INSTALL(EXPORT hiredis_ssl-targets
135+
FILE hiredis_ssl-targets.cmake
136+
NAMESPACE hiredis::
137+
DESTINATION ${CMAKE_CONF_INSTALL_DIR})
138+
139+
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/hiredis_ssl-config.cmake
140+
DESTINATION ${CMAKE_CONF_INSTALL_DIR})
84141
ENDIF()
85142

86143
IF(NOT DISABLE_TESTS)

hiredis-config.cmake.in

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
@PACKAGE_INIT@
2+
3+
set_and_check(hiredis_INCLUDEDIR "@PACKAGE_INCLUDE_INSTALL_DIR@")
4+
5+
IF (NOT TARGET hiredis::hiredis)
6+
INCLUDE(${CMAKE_CURRENT_LIST_DIR}/hiredis-targets.cmake)
7+
ENDIF()
8+
9+
SET(hiredis_LIBRARIES hiredis::hiredis)
10+
SET(hiredis_INCLUDE_DIRS ${hiredis_INCLUDEDIR})
11+
12+
check_required_components(hiredis)
13+

hiredis_ssl-config.cmake.in

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
@PACKAGE_INIT@
2+
3+
set_and_check(hiredis_ssl_INCLUDEDIR "@PACKAGE_INCLUDE_INSTALL_DIR@")
4+
5+
IF (NOT TARGET hiredis::hiredis_ssl)
6+
INCLUDE(${CMAKE_CURRENT_LIST_DIR}/hiredis_ssl-targets.cmake)
7+
ENDIF()
8+
9+
SET(hiredis_ssl_LIBRARIES hiredis::hiredis_ssl)
10+
SET(hiredis_ssl_INCLUDE_DIRS ${hiredis_ssl_INCLUDEDIR})
11+
12+
check_required_components(hiredis_ssl)
13+

ssl.c

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,18 @@
3434
#include "async.h"
3535

3636
#include <assert.h>
37-
#include <pthread.h>
3837
#include <errno.h>
3938
#include <string.h>
39+
#ifdef WIN32
40+
#include <windows.h>
41+
#else
42+
#include <pthread.h>
43+
#endif
4044

4145
#include <openssl/ssl.h>
4246
#include <openssl/err.h>
4347

48+
#include "win32.h"
4449
#include "async_private.h"
4550

4651
void __redisSetError(redisContext *c, int type, const char *str);
@@ -119,6 +124,18 @@ static void sslLogCallback(const SSL *ssl, int where, int ret) {
119124
#endif
120125

121126
#ifdef HIREDIS_USE_CRYPTO_LOCKS
127+
#ifdef WIN32
128+
typedef CRITICAL_SECTION sslLockType;
129+
static void sslLockInit(sslLockType* l) {
130+
InitializeCriticalSection(l);
131+
}
132+
static void sslLockAcquire(sslLockType* l) {
133+
EnterCriticalSection(l);
134+
}
135+
static void sslLockRelease(sslLockType* l) {
136+
LeaveCriticalSection(l);
137+
}
138+
#else
122139
typedef pthread_mutex_t sslLockType;
123140
static void sslLockInit(sslLockType *l) {
124141
pthread_mutex_init(l, NULL);
@@ -129,7 +146,9 @@ static void sslLockAcquire(sslLockType *l) {
129146
static void sslLockRelease(sslLockType *l) {
130147
pthread_mutex_unlock(l);
131148
}
132-
static pthread_mutex_t *ossl_locks;
149+
#endif
150+
151+
static sslLockType* ossl_locks;
133152

134153
static void opensslDoLock(int mode, int lkid, const char *f, int line) {
135154
sslLockType *l = ossl_locks + lkid;

0 commit comments

Comments
 (0)