From acd09461d3c796751a0ea07ea69d81e7ce264320 Mon Sep 17 00:00:00 2001 From: Fabrice Fontaine Date: Thu, 22 Dec 2022 23:00:56 +0100 Subject: [PATCH] CMakeLists.txt: respect BUILD_SHARED_LIBS To allow building hiredis on toolchain without dynamic library support, respect standard cmake BUILD_SHARED_LIBS: https://cmake.org/cmake/help/latest/variable/BUILD_SHARED_LIBS.html Signed-off-by: Fabrice Fontaine --- CMakeLists.txt | 78 ++++++++++++++++++++++++++++------------- examples/CMakeLists.txt | 20 +++++------ 2 files changed, 63 insertions(+), 35 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3d52d0ca0..f05caf213 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 3.0.0) +OPTION(BUILD_SHARED_LIBS "Build shared libraries" ON) OPTION(ENABLE_SSL "Build hiredis_ssl for SSL support" OFF) OPTION(DISABLE_TESTS "If tests should be compiled or not" OFF) OPTION(ENABLE_SSL_TESTS "Should we test SSL connections" OFF) @@ -44,35 +45,49 @@ IF(WIN32) ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS -DWIN32_LEAN_AND_MEAN) ENDIF() -ADD_LIBRARY(hiredis SHARED ${hiredis_sources}) ADD_LIBRARY(hiredis_static STATIC ${hiredis_sources}) -ADD_LIBRARY(hiredis::hiredis ALIAS hiredis) ADD_LIBRARY(hiredis::hiredis_static ALIAS hiredis_static) +SET(HIREDIS_DEFAULT_LIBRARY hiredis_static) +SET(HIREDIS_TARGETS hiredis_static) IF(NOT MSVC) SET_TARGET_PROPERTIES(hiredis_static PROPERTIES OUTPUT_NAME hiredis) ENDIF() -SET_TARGET_PROPERTIES(hiredis - PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE - VERSION "${HIREDIS_SONAME}") +IF(BUILD_SHARED_LIBS) + ADD_LIBRARY(hiredis SHARED ${hiredis_sources}) + ADD_LIBRARY(hiredis::hiredis ALIAS hiredis) + SET(HIREDIS_DEFAULT_LIBRARY hiredis) + SET(HIREDIS_TARGETS ${HIREDIS_TARGETS} hiredis) + SET_TARGET_PROPERTIES(hiredis + PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE + VERSION "${HIREDIS_SONAME}") +ENDIF() IF(MSVC) SET_TARGET_PROPERTIES(hiredis_static PROPERTIES COMPILE_FLAGS /Z7) ENDIF() IF(WIN32 OR MINGW) - TARGET_LINK_LIBRARIES(hiredis PUBLIC ws2_32 crypt32) + IF(BUILD_SHARED_LIBS) + TARGET_LINK_LIBRARIES(hiredis PUBLIC ws2_32 crypt32) + ENDIF() TARGET_LINK_LIBRARIES(hiredis_static PUBLIC ws2_32 crypt32) ELSEIF(CMAKE_SYSTEM_NAME MATCHES "FreeBSD") - TARGET_LINK_LIBRARIES(hiredis PUBLIC m) + IF(BUILD_SHARED_LIBS) + TARGET_LINK_LIBRARIES(hiredis PUBLIC m) + ENDIF() TARGET_LINK_LIBRARIES(hiredis_static PUBLIC m) ELSEIF(CMAKE_SYSTEM_NAME MATCHES "SunOS") - TARGET_LINK_LIBRARIES(hiredis PUBLIC socket) + IF(BUILD_SHARED_LIBS) + TARGET_LINK_LIBRARIES(hiredis PUBLIC socket) + ENDIF() TARGET_LINK_LIBRARIES(hiredis_static PUBLIC socket) ENDIF() -TARGET_INCLUDE_DIRECTORIES(hiredis PUBLIC $ $) +IF(BUILD_SHARED_LIBS) + TARGET_INCLUDE_DIRECTORIES(hiredis PUBLIC $ $) +ENDIF() TARGET_INCLUDE_DIRECTORIES(hiredis_static PUBLIC $ $) CONFIGURE_FILE(hiredis.pc.in hiredis.pc @ONLY) @@ -103,13 +118,13 @@ set(CPACK_RPM_PACKAGE_AUTOREQPROV ON) include(CPack) -INSTALL(TARGETS hiredis hiredis_static +INSTALL(TARGETS ${HIREDIS_TARGETS} EXPORT hiredis-targets RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) -if (MSVC) +if (MSVC AND BUILD_SHARED_LIBS) INSTALL(FILES $ DESTINATION ${CMAKE_INSTALL_BINDIR} CONFIGURATIONS Debug RelWithDebInfo) @@ -161,45 +176,58 @@ IF(ENABLE_SSL) FIND_PACKAGE(OpenSSL REQUIRED) SET(hiredis_ssl_sources ssl.c) - ADD_LIBRARY(hiredis_ssl SHARED - ${hiredis_ssl_sources}) + ADD_LIBRARY(hiredis_ssl_static STATIC ${hiredis_ssl_sources}) + SET(HIREDIS_SSL_DEFAULT_LIBRARY hiredis_ssl_static) + SET(HIREDIS_SSL_TARGETS hiredis_ssl_static) + IF(BUILD_SHARED_LIBS) + ADD_LIBRARY(hiredis_ssl SHARED + ${hiredis_ssl_sources}) + SET(HIREDIS_SSL_DEFAULT_LIBRARY hiredis_ssl) + SET(HIREDIS_SSL_TARGETS ${HIREDIS_SSL_TARGETS} hiredis_ssl) + ENDIF() IF(NOT MSVC) SET_TARGET_PROPERTIES(hiredis_ssl_static PROPERTIES OUTPUT_NAME hiredis_ssl) ENDIF() - IF (APPLE) + IF (APPLE AND BUILD_SHARED_LIBS) SET_PROPERTY(TARGET hiredis_ssl PROPERTY LINK_FLAGS "-Wl,-undefined -Wl,dynamic_lookup") ENDIF() - SET_TARGET_PROPERTIES(hiredis_ssl - PROPERTIES - WINDOWS_EXPORT_ALL_SYMBOLS TRUE - VERSION "${HIREDIS_SONAME}") + IF(BUILD_SHARED_LIBS) + SET_TARGET_PROPERTIES(hiredis_ssl + PROPERTIES + WINDOWS_EXPORT_ALL_SYMBOLS TRUE + VERSION "${HIREDIS_SONAME}") + ENDIF() IF(MSVC) SET_TARGET_PROPERTIES(hiredis_ssl_static PROPERTIES COMPILE_FLAGS /Z7) ENDIF() - TARGET_INCLUDE_DIRECTORIES(hiredis_ssl PRIVATE "${OPENSSL_INCLUDE_DIR}") TARGET_INCLUDE_DIRECTORIES(hiredis_ssl_static PRIVATE "${OPENSSL_INCLUDE_DIR}") + IF(BUILD_SHARED_LIBS) + TARGET_INCLUDE_DIRECTORIES(hiredis_ssl PRIVATE "${OPENSSL_INCLUDE_DIR}") + TARGET_LINK_LIBRARIES(hiredis_ssl PRIVATE ${OPENSSL_LIBRARIES}) + ENDIF() - TARGET_LINK_LIBRARIES(hiredis_ssl PRIVATE ${OPENSSL_LIBRARIES}) IF (WIN32 OR MINGW) - TARGET_LINK_LIBRARIES(hiredis_ssl PRIVATE hiredis) + IF (BUILD_SHARED_LIBS) + TARGET_LINK_LIBRARIES(hiredis_ssl PRIVATE hiredis) + ENDIF() TARGET_LINK_LIBRARIES(hiredis_ssl_static PUBLIC hiredis_static) ENDIF() CONFIGURE_FILE(hiredis_ssl.pc.in hiredis_ssl.pc @ONLY) - INSTALL(TARGETS hiredis_ssl hiredis_ssl_static + INSTALL(TARGETS ${HIREDIS_SSL_TARGETS} EXPORT hiredis_ssl-targets RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) - if (MSVC) + if (MSVC AND BUILD_SHARED_LIBS) INSTALL(FILES $ DESTINATION ${CMAKE_INSTALL_BINDIR} CONFIGURATIONS Debug RelWithDebInfo) @@ -236,10 +264,10 @@ ENDIF() IF(NOT DISABLE_TESTS) ENABLE_TESTING() ADD_EXECUTABLE(hiredis-test test.c) - TARGET_LINK_LIBRARIES(hiredis-test hiredis) + TARGET_LINK_LIBRARIES(hiredis-test ${HIREDIS_DEFAULT_LIBRARY}) IF(ENABLE_SSL_TESTS) ADD_DEFINITIONS(-DHIREDIS_TEST_SSL=1) - TARGET_LINK_LIBRARIES(hiredis-test hiredis_ssl) + TARGET_LINK_LIBRARIES(hiredis-test ${HIREDIS_SSL_DEFAULT_LIBRARY}) ENDIF() IF(ENABLE_ASYNC_TESTS) ADD_DEFINITIONS(-DHIREDIS_TEST_ASYNC=1) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 214898b07..a208401b8 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -6,7 +6,7 @@ if (GLIB2_FOUND) INCLUDE_DIRECTORIES(${GLIB2_INCLUDE_DIRS}) LINK_DIRECTORIES(${GLIB2_LIBRARY_DIRS}) ADD_EXECUTABLE(example-glib example-glib.c) - TARGET_LINK_LIBRARIES(example-glib hiredis ${GLIB2_LIBRARIES}) + TARGET_LINK_LIBRARIES(example-glib ${HIREDIS_DEFAULT_LIBRARY} ${GLIB2_LIBRARIES}) ENDIF(GLIB2_FOUND) FIND_PATH(LIBEV ev.h @@ -16,46 +16,46 @@ FIND_PATH(LIBEV ev.h if (LIBEV) # Just compile and link with libev ADD_EXECUTABLE(example-libev example-libev.c) - TARGET_LINK_LIBRARIES(example-libev hiredis ev) + TARGET_LINK_LIBRARIES(example-libev ${HIREDIS_DEFAULT_LIBRARY} ev) ENDIF() FIND_PATH(LIBEVENT event.h) if (LIBEVENT) ADD_EXECUTABLE(example-libevent example-libevent.c) - TARGET_LINK_LIBRARIES(example-libevent hiredis event) + TARGET_LINK_LIBRARIES(example-libevent ${HIREDIS_DEFAULT_LIBRARY} event) ENDIF() FIND_PATH(LIBHV hv/hv.h) IF (LIBHV) ADD_EXECUTABLE(example-libhv example-libhv.c) - TARGET_LINK_LIBRARIES(example-libhv hiredis hv) + TARGET_LINK_LIBRARIES(example-libhv ${HIREDIS_DEFAULT_LIBRARY} hv) ENDIF() FIND_PATH(LIBUV uv.h) IF (LIBUV) ADD_EXECUTABLE(example-libuv example-libuv.c) - TARGET_LINK_LIBRARIES(example-libuv hiredis uv) + TARGET_LINK_LIBRARIES(example-libuv ${HIREDIS_DEFAULT_LIBRARY} uv) ENDIF() FIND_PATH(LIBSDEVENT systemd/sd-event.h) IF (LIBSDEVENT) ADD_EXECUTABLE(example-libsdevent example-libsdevent.c) - TARGET_LINK_LIBRARIES(example-libsdevent hiredis systemd) + TARGET_LINK_LIBRARIES(example-libsdevent ${HIREDIS_DEFAULT_LIBRARY} systemd) ENDIF() IF (APPLE) FIND_LIBRARY(CF CoreFoundation) ADD_EXECUTABLE(example-macosx example-macosx.c) - TARGET_LINK_LIBRARIES(example-macosx hiredis ${CF}) + TARGET_LINK_LIBRARIES(example-macosx ${HIREDIS_DEFAULT_LIBRARY} ${CF}) ENDIF() IF (ENABLE_SSL) ADD_EXECUTABLE(example-ssl example-ssl.c) - TARGET_LINK_LIBRARIES(example-ssl hiredis hiredis_ssl) + TARGET_LINK_LIBRARIES(example-ssl ${HIREDIS_DEFAULT_LIBRARY} ${HIREDIS_SSL_DEFAULT_LIBRARY}) ENDIF() ADD_EXECUTABLE(example example.c) -TARGET_LINK_LIBRARIES(example hiredis) +TARGET_LINK_LIBRARIES(example ${HIREDIS_DEFAULT_LIBRARY}) ADD_EXECUTABLE(example-push example-push.c) -TARGET_LINK_LIBRARIES(example-push hiredis) +TARGET_LINK_LIBRARIES(example-push ${HIREDIS_DEFAULT_LIBRARY})