summaryrefslogtreecommitdiff
path: root/CMakeLists.txt
blob: dd385f24f4f636c1f22e20634c3065cf0c13e351 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
# SPDX-FileCopyrightText: 2024 Hiredict Contributors
# SPDX-FileCopyrightText: 2024 Salvatore Sanfilippo <antirez at gmail dot com>
#
# SPDX-License-Identifier: BSD-3-Clause
# SPDX-License-Identifier: LGPL-3.0-or-later

CMAKE_MINIMUM_REQUIRED(VERSION 3.0.0)

MACRO(getVersionBit name)
  SET(VERSION_REGEX "^#define ${name} (.+)$")
  FILE(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/hiredict.h"
    VERSION_BIT REGEX ${VERSION_REGEX})
  STRING(REGEX REPLACE ${VERSION_REGEX} "\\1" ${name} "${VERSION_BIT}")
ENDMACRO(getVersionBit)

getVersionBit(HIREDICT_MAJOR)
getVersionBit(HIREDICT_MINOR)
getVersionBit(HIREDICT_PATCH)
getVersionBit(HIREDICT_SONAME)
SET(VERSION "${HIREDICT_MAJOR}.${HIREDICT_MINOR}.${HIREDICT_PATCH}")
MESSAGE("Detected version: ${VERSION}")

PROJECT(hiredict LANGUAGES "C" VERSION "${VERSION}")
INCLUDE(GNUInstallDirs)

OPTION(BUILD_SHARED_LIBS "Build shared libraries" ON)
OPTION(ENABLE_SSL "Build hiredict_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)
OPTION(ENABLE_EXAMPLES "Enable building hiredict examples" OFF)
OPTION(ENABLE_ASYNC_TESTS "Should we run all asynchronous API tests" OFF)
# Historically, the NuGet file was always install; default
# to ON for those who rely on that historical behaviour.
OPTION(ENABLE_NUGET "Install NuGET packaging details" ON)

# Hiredict requires C99
SET(CMAKE_C_STANDARD 99)
SET(CMAKE_DEBUG_POSTFIX d)

SET(hiredict_sources
    alloc.c
    async.c
    hiredict.c
    net.c
    read.c
    sds.c
    sockcompat.c)

SET(hiredict_sources ${hiredict_sources})

IF(WIN32)
    ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS -DWIN32_LEAN_AND_MEAN)
ENDIF()

ADD_LIBRARY(hiredict ${hiredict_sources})
ADD_LIBRARY(hiredict::hiredict ALIAS hiredict)
set(hiredict_export_name hiredict CACHE STRING "Name of the exported target")
set_target_properties(hiredict PROPERTIES EXPORT_NAME ${hiredict_export_name})

SET_TARGET_PROPERTIES(hiredict
    PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE
	VERSION "${HIREDICT_SONAME}")
IF(MSVC)
	SET_TARGET_PROPERTIES(hiredict
        PROPERTIES COMPILE_FLAGS /Z7)
ENDIF()
IF(WIN32)
    TARGET_LINK_LIBRARIES(hiredict PUBLIC ws2_32 crypt32)
ELSEIF(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
    TARGET_LINK_LIBRARIES(hiredict PUBLIC m)
ELSEIF(CMAKE_SYSTEM_NAME MATCHES "SunOS")
    TARGET_LINK_LIBRARIES(hiredict PUBLIC socket)
ENDIF()

TARGET_INCLUDE_DIRECTORIES(hiredict PUBLIC $<INSTALL_INTERFACE:include> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>)

CONFIGURE_FILE(hiredict.pc.in hiredict.pc @ONLY)

set(CPACK_PACKAGE_VENDOR "Redict")
set(CPACK_PACKAGE_DESCRIPTION "\
Hiredict is a minimalistic C client library for the Redict database.

It is minimalistic because it just adds minimal support for the protocol, \
but at the same time it uses a high level printf-alike API in order to make \
it much higher level than otherwise suggested by its minimal code base and the \
lack of explicit bindings for every Redict command.

Apart from supporting sending commands and receiving replies, it comes with a \
reply parser that is decoupled from the I/O layer. It is a stream parser designed \
for easy reusability, which can for instance be used in higher level language bindings \
for efficient reply parsing.

Hiredict only supports the binary-safe Redis protocol.

The library comes with multiple APIs. There is the synchronous API, the asynchronous API \
and the reply parsing API.")
set(CPACK_PACKAGE_HOMEPAGE_URL "https://codeberg.org/redict/hiredict")
set(CPACK_PACKAGE_CONTACT "navi@vlhl.dev")
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
set(CPACK_RPM_PACKAGE_AUTOREQPROV ON)

include(CPack)

INSTALL(TARGETS hiredict
    EXPORT hiredict-targets
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})

if (MSVC AND BUILD_SHARED_LIBS)
    INSTALL(FILES $<TARGET_PDB_FILE:hiredict>
        DESTINATION ${CMAKE_INSTALL_BINDIR}
        CONFIGURATIONS Debug RelWithDebInfo)
endif()

if (ENABLE_NUGET)
    # For NuGet packages
    INSTALL(FILES hiredict.targets
        DESTINATION build/native)
endif()

INSTALL(FILES hiredict.h read.h sds.h async.h alloc.h sockcompat.h
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/hiredict)

INSTALL(DIRECTORY adapters
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/hiredict)

INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/hiredict.pc
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)

export(EXPORT hiredict-targets
    FILE "${CMAKE_CURRENT_BINARY_DIR}/hiredict-targets.cmake"
    NAMESPACE hiredict::)

if(WIN32)
    SET(CMAKE_CONF_INSTALL_DIR share/hiredict)
else()
    SET(CMAKE_CONF_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/hiredict)
endif()
SET(INCLUDE_INSTALL_DIR include)
include(CMakePackageConfigHelpers)
write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/hiredict-config-version.cmake"
                                 COMPATIBILITY SameMajorVersion)
configure_package_config_file(hiredict-config.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/hiredict-config.cmake
                              INSTALL_DESTINATION ${CMAKE_CONF_INSTALL_DIR}
                              PATH_VARS INCLUDE_INSTALL_DIR)

INSTALL(EXPORT hiredict-targets
        FILE hiredict-targets.cmake
        NAMESPACE hiredict::
        DESTINATION ${CMAKE_CONF_INSTALL_DIR})

INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/hiredict-config.cmake
              ${CMAKE_CURRENT_BINARY_DIR}/hiredict-config-version.cmake
        DESTINATION ${CMAKE_CONF_INSTALL_DIR})


IF(ENABLE_SSL)
    IF (NOT OPENSSL_ROOT_DIR)
        IF (APPLE)
            SET(OPENSSL_ROOT_DIR "/usr/local/opt/openssl")
        ENDIF()
    ENDIF()
    FIND_PACKAGE(OpenSSL REQUIRED)
    SET(hiredict_ssl_sources
        ssl.c)
    ADD_LIBRARY(hiredict_ssl ${hiredict_ssl_sources})
    ADD_LIBRARY(hiredict::hiredict_ssl ALIAS hiredict_ssl)

    IF (APPLE AND BUILD_SHARED_LIBS)
        SET_PROPERTY(TARGET hiredict_ssl PROPERTY LINK_FLAGS "-Wl,-undefined -Wl,dynamic_lookup")
    ENDIF()

    SET_TARGET_PROPERTIES(hiredict_ssl
        PROPERTIES
        WINDOWS_EXPORT_ALL_SYMBOLS TRUE
		VERSION "${HIREDICT_SONAME}")
    IF(MSVC)
        SET_TARGET_PROPERTIES(hiredict_ssl
            PROPERTIES COMPILE_FLAGS /Z7)
    ENDIF()
    TARGET_LINK_LIBRARIES(hiredict_ssl PRIVATE OpenSSL::SSL)
    IF(WIN32)
        TARGET_LINK_LIBRARIES(hiredict_ssl PRIVATE hiredict)
    ENDIF()
    CONFIGURE_FILE(hiredict_ssl.pc.in hiredict_ssl.pc @ONLY)

    INSTALL(TARGETS hiredict_ssl
        EXPORT hiredict_ssl-targets
        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})

    if (MSVC AND BUILD_SHARED_LIBS)
        INSTALL(FILES $<TARGET_PDB_FILE:hiredict_ssl>
            DESTINATION ${CMAKE_INSTALL_BINDIR}
            CONFIGURATIONS Debug RelWithDebInfo)
    endif()

    INSTALL(FILES hiredict_ssl.h
        DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/hiredict)

    INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/hiredict_ssl.pc
        DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)

    export(EXPORT hiredict_ssl-targets
           FILE "${CMAKE_CURRENT_BINARY_DIR}/hiredict_ssl-targets.cmake"
           NAMESPACE hiredict::)

    if(WIN32)
        SET(CMAKE_CONF_INSTALL_DIR share/hiredict_ssl)
    else()
        SET(CMAKE_CONF_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/hiredict_ssl)
    endif()
    configure_package_config_file(hiredict_ssl-config.cmake.in
                                  ${CMAKE_CURRENT_BINARY_DIR}/hiredict_ssl-config.cmake
                                  INSTALL_DESTINATION ${CMAKE_CONF_INSTALL_DIR}
                                  PATH_VARS INCLUDE_INSTALL_DIR)

    INSTALL(EXPORT hiredict_ssl-targets
        FILE hiredict_ssl-targets.cmake
        NAMESPACE hiredict::
        DESTINATION ${CMAKE_CONF_INSTALL_DIR})

    INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/hiredict_ssl-config.cmake
        DESTINATION ${CMAKE_CONF_INSTALL_DIR})
ENDIF()

IF(NOT DISABLE_TESTS)
    ENABLE_TESTING()
    ADD_EXECUTABLE(hiredict-test test.c)
    TARGET_LINK_LIBRARIES(hiredict-test hiredict)
    IF(ENABLE_SSL_TESTS)
		ADD_DEFINITIONS(-DHIREDICT_TEST_SSL=1)
        TARGET_LINK_LIBRARIES(hiredict-test hiredict_ssl)
    ENDIF()
    IF(ENABLE_ASYNC_TESTS)
		ADD_DEFINITIONS(-DHIREDICT_TEST_ASYNC=1)
        TARGET_LINK_LIBRARIES(hiredict-test event)
    ENDIF()
    ADD_TEST(NAME hiredict-test
        COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/test.sh)
ENDIF()

# Add examples
IF(ENABLE_EXAMPLES)
    ADD_SUBDIRECTORY(examples)
ENDIF(ENABLE_EXAMPLES)