summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Grunder <michael.grunder@gmail.com>2020-04-09 08:05:14 -0700
committerGitHub <noreply@github.com>2020-04-09 08:05:14 -0700
commitec08c2b94a6d2e3f3572dfdac734fb8a92682ac8 (patch)
tree0a47e95eec8ad6f9dc31b03c8c2fe3dc55a66e01
parentb314c0df3d05b362d484fffe5cc03ca98584e084 (diff)
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>
-rw-r--r--CMakeLists.txt67
-rw-r--r--hiredis-config.cmake.in13
-rw-r--r--hiredis_ssl-config.cmake.in13
-rw-r--r--ssl.c23
4 files changed, 109 insertions, 7 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 04a03ee..b402b3d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -33,6 +33,12 @@ SET(hiredis_sources
sockcompat.c
alloc.c)
+SET(hiredis_sources ${hiredis_sources})
+
+IF(WIN32)
+ ADD_COMPILE_DEFINITIONS(_CRT_SECURE_NO_WARNINGS WIN32_LEAN_AND_MEAN)
+ENDIF()
+
ADD_LIBRARY(hiredis SHARED ${hiredis_sources})
SET_TARGET_PROPERTIES(hiredis
@@ -41,12 +47,16 @@ SET_TARGET_PROPERTIES(hiredis
IF(WIN32 OR MINGW)
TARGET_LINK_LIBRARIES(hiredis PRIVATE ws2_32)
ENDIF()
-TARGET_INCLUDE_DIRECTORIES(hiredis PUBLIC .)
+
+TARGET_INCLUDE_DIRECTORIES(hiredis PUBLIC $<INSTALL_INTERFACE:.> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>)
CONFIGURE_FILE(hiredis.pc.in hiredis.pc @ONLY)
INSTALL(TARGETS hiredis
- DESTINATION "${CMAKE_INSTALL_LIBDIR}")
+ EXPORT hiredis-targets
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
INSTALL(FILES hiredis.h read.h sds.h async.h alloc.h
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/hiredis)
@@ -57,6 +67,26 @@ INSTALL(DIRECTORY adapters
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/hiredis.pc
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
+export(EXPORT hiredis-targets
+ FILE "${CMAKE_CURRENT_BINARY_DIR}/hiredis-targets.cmake"
+ NAMESPACE hiredis::)
+
+SET(CMAKE_CONF_INSTALL_DIR share/hiredis)
+SET(INCLUDE_INSTALL_DIR include)
+include(CMakePackageConfigHelpers)
+configure_package_config_file(hiredis-config.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/hiredis-config.cmake
+ INSTALL_DESTINATION ${CMAKE_CONF_INSTALL_DIR}
+ PATH_VARS INCLUDE_INSTALL_DIR)
+
+INSTALL(EXPORT hiredis-targets
+ FILE hiredis-targets.cmake
+ NAMESPACE hiredis::
+ DESTINATION ${CMAKE_CONF_INSTALL_DIR})
+
+INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/hiredis-config.cmake
+ DESTINATION ${CMAKE_CONF_INSTALL_DIR})
+
+
IF(ENABLE_SSL)
IF (NOT OPENSSL_ROOT_DIR)
IF (APPLE)
@@ -64,23 +94,50 @@ IF(ENABLE_SSL)
ENDIF()
ENDIF()
FIND_PACKAGE(OpenSSL REQUIRED)
- ADD_LIBRARY(hiredis_ssl SHARED
+ SET(hiredis_ssl_sources
ssl.c)
+ ADD_LIBRARY(hiredis_ssl SHARED
+ ${hiredis_ssl_sources})
SET_TARGET_PROPERTIES(hiredis_ssl
- PROPERTIES
+ PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE
VERSION "${HIREDIS_SONAME}")
+
+
TARGET_INCLUDE_DIRECTORIES(hiredis_ssl PRIVATE "${OPENSSL_INCLUDE_DIR}")
TARGET_LINK_LIBRARIES(hiredis_ssl PRIVATE ${OPENSSL_LIBRARIES})
+ IF (WIN32 OR MINGW)
+ TARGET_LINK_LIBRARIES(hiredis_ssl PRIVATE hiredis)
+ ENDIF()
CONFIGURE_FILE(hiredis_ssl.pc.in hiredis_ssl.pc @ONLY)
INSTALL(TARGETS hiredis_ssl
- DESTINATION "${CMAKE_INSTALL_LIBDIR}")
+ EXPORT hiredis_ssl-targets
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
INSTALL(FILES hiredis_ssl.h
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/hiredis)
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/hiredis_ssl.pc
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
+
+ export(EXPORT hiredis_ssl-targets
+ FILE "${CMAKE_CURRENT_BINARY_DIR}/hiredis_ssl-targets.cmake"
+ NAMESPACE hiredis::)
+
+ SET(CMAKE_CONF_INSTALL_DIR share/hiredis_ssl)
+ configure_package_config_file(hiredis_ssl-config.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/hiredis_ssl-config.cmake
+ INSTALL_DESTINATION ${CMAKE_CONF_INSTALL_DIR}
+ PATH_VARS INCLUDE_INSTALL_DIR)
+
+ INSTALL(EXPORT hiredis_ssl-targets
+ FILE hiredis_ssl-targets.cmake
+ NAMESPACE hiredis::
+ DESTINATION ${CMAKE_CONF_INSTALL_DIR})
+
+ INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/hiredis_ssl-config.cmake
+ DESTINATION ${CMAKE_CONF_INSTALL_DIR})
ENDIF()
IF(NOT DISABLE_TESTS)
diff --git a/hiredis-config.cmake.in b/hiredis-config.cmake.in
new file mode 100644
index 0000000..98851dc
--- /dev/null
+++ b/hiredis-config.cmake.in
@@ -0,0 +1,13 @@
+@PACKAGE_INIT@
+
+set_and_check(hiredis_INCLUDEDIR "@PACKAGE_INCLUDE_INSTALL_DIR@")
+
+IF (NOT TARGET hiredis::hiredis)
+ INCLUDE(${CMAKE_CURRENT_LIST_DIR}/hiredis-targets.cmake)
+ENDIF()
+
+SET(hiredis_LIBRARIES hiredis::hiredis)
+SET(hiredis_INCLUDE_DIRS ${hiredis_INCLUDEDIR})
+
+check_required_components(hiredis)
+
diff --git a/hiredis_ssl-config.cmake.in b/hiredis_ssl-config.cmake.in
new file mode 100644
index 0000000..9a283df
--- /dev/null
+++ b/hiredis_ssl-config.cmake.in
@@ -0,0 +1,13 @@
+@PACKAGE_INIT@
+
+set_and_check(hiredis_ssl_INCLUDEDIR "@PACKAGE_INCLUDE_INSTALL_DIR@")
+
+IF (NOT TARGET hiredis::hiredis_ssl)
+ INCLUDE(${CMAKE_CURRENT_LIST_DIR}/hiredis_ssl-targets.cmake)
+ENDIF()
+
+SET(hiredis_ssl_LIBRARIES hiredis::hiredis_ssl)
+SET(hiredis_ssl_INCLUDE_DIRS ${hiredis_ssl_INCLUDEDIR})
+
+check_required_components(hiredis_ssl)
+
diff --git a/ssl.c b/ssl.c
index e1e4aba..502814d 100644
--- a/ssl.c
+++ b/ssl.c
@@ -34,13 +34,18 @@
#include "async.h"
#include <assert.h>
-#include <pthread.h>
#include <errno.h>
#include <string.h>
+#ifdef WIN32
+#include <windows.h>
+#else
+#include <pthread.h>
+#endif
#include <openssl/ssl.h>
#include <openssl/err.h>
+#include "win32.h"
#include "async_private.h"
void __redisSetError(redisContext *c, int type, const char *str);
@@ -119,6 +124,18 @@ static void sslLogCallback(const SSL *ssl, int where, int ret) {
#endif
#ifdef HIREDIS_USE_CRYPTO_LOCKS
+#ifdef WIN32
+typedef CRITICAL_SECTION sslLockType;
+static void sslLockInit(sslLockType* l) {
+ InitializeCriticalSection(l);
+}
+static void sslLockAcquire(sslLockType* l) {
+ EnterCriticalSection(l);
+}
+static void sslLockRelease(sslLockType* l) {
+ LeaveCriticalSection(l);
+}
+#else
typedef pthread_mutex_t sslLockType;
static void sslLockInit(sslLockType *l) {
pthread_mutex_init(l, NULL);
@@ -129,7 +146,9 @@ static void sslLockAcquire(sslLockType *l) {
static void sslLockRelease(sslLockType *l) {
pthread_mutex_unlock(l);
}
-static pthread_mutex_t *ossl_locks;
+#endif
+
+static sslLockType* ossl_locks;
static void opensslDoLock(int mode, int lkid, const char *f, int line) {
sslLockType *l = ossl_locks + lkid;