Separate private defines in lws_config_private.h
[platform/upstream/libwebsockets.git] / CMakeLists.txt
1 cmake_minimum_required(VERSION 2.8)
2
3 if(NOT DEFINED CMAKE_BUILD_TYPE)
4         set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type")
5 endif()
6
7 project(libwebsockets C)
8
9 set(PACKAGE "libwebsockets")
10 set(CPACK_PACKAGE_NAME "${PACKAGE}")
11 set(CPACK_PACKAGE_VERSION_MAJOR "1")
12 set(CPACK_PACKAGE_VERSION_MINOR "4")
13 set(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}")
14 set(CPACK_PACKAGE_VENDOR "andy@warmcat.com")
15 set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${PACKAGE} ${PACKAGE_VERSION}")
16 set(SOVERSION "5")
17 set(CPACK_SOURCE_GENERATOR "TGZ")
18 set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}")
19 set(VERSION "${CPACK_PACKAGE_VERSION}")
20
21 set(LWS_LIBRARY_VERSION ${CPACK_PACKAGE_VERSION})
22 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake/")
23
24 message(STATUS "CMAKE_TOOLCHAIN_FILE='${CMAKE_TOOLCHAIN_FILE}'")
25
26 # Try to find the current Git hash.
27 find_package(Git)
28 if(GIT_EXECUTABLE)
29         execute_process(
30     WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
31     COMMAND "${GIT_EXECUTABLE}" log -n 1 --pretty=%h
32     OUTPUT_VARIABLE GIT_HASH
33     OUTPUT_STRIP_TRAILING_WHITESPACE
34     )
35
36     set(LWS_BUILD_HASH ${GIT_HASH})
37     message("Git commit hash: ${LWS_BUILD_HASH}")
38 endif()
39
40 set(LWS_USE_BUNDLED_ZLIB_DEFAULT OFF)
41 if(WIN32)
42         set(LWS_USE_BUNDLED_ZLIB_DEFAULT ON)
43 endif()
44
45 option(LWS_WITH_STATIC "Build the static version of the library" ON)
46 option(LWS_WITH_SHARED "Build the shared version of the library" ON)
47 option(LWS_WITH_SSL "Include SSL support (default OpenSSL, wolfSSL if LWS_USE_WOLFSSL is set)" ON)
48 option(LWS_USE_CYASSL "Use CyaSSL replacement for OpenSSL. When settings this, you also need to specify LWS_CYASSL_LIBRARIES and LWS_CYASSL_INCLUDE_DIRS" OFF)
49 option(LWS_USE_WOLFSSL "Use wolfSSL replacement for OpenSSL. When settings this, you also need to specify LWS_WOLFSSL_LIBRARIES and LWS_WOLFSSL_INCLUDE_DIRS" OFF)
50 option(LWS_WITH_ZLIB "Include zlib support (required for extensions)" ON)
51 option(LWS_WITH_LIBEV "Compile with support for libev" OFF)
52 option(LWS_USE_BUNDLED_ZLIB "Use bundled zlib version (Windows only)" ${LWS_USE_BUNDLED_ZLIB_DEFAULT})
53 option(LWS_SSL_CLIENT_USE_OS_CA_CERTS "SSL support should make use of OS installed CA root certs" ON)
54 option(LWS_WITHOUT_BUILTIN_GETIFADDRS "Don't use BSD getifaddrs implementation from libwebsockets if it is missing (this will result in a compilation error) ... Default is your libc provides it. On some systems such as uclibc it doesn't exist." OFF)
55 option(LWS_WITHOUT_CLIENT "Don't build the client part of the library" OFF)
56 option(LWS_WITHOUT_SERVER "Don't build the server part of the library" OFF)
57 option(LWS_LINK_TESTAPPS_DYNAMIC "Link the test apps to the shared version of the library. Default is to link statically" OFF)
58 option(LWS_WITHOUT_TESTAPPS "Don't build the libwebsocket-test-apps" OFF)
59 option(LWS_WITHOUT_TEST_SERVER "Don't build the test server" OFF)
60 option(LWS_WITHOUT_TEST_SERVER_EXTPOLL "Don't build the test server version that uses external poll" OFF)
61 option(LWS_WITHOUT_TEST_PING "Don't build the ping test application" OFF)
62 option(LWS_WITHOUT_TEST_CLIENT "Don't build the client test application" OFF)
63 option(LWS_WITHOUT_TEST_FRAGGLE "Don't build the ping test application" OFF)
64 option(LWS_WITHOUT_EXTENSIONS "Don't compile with extensions" OFF)
65 option(LWS_WITH_LATENCY "Build latency measuring code into the library" OFF)
66 option(LWS_WITHOUT_DAEMONIZE "Don't build the daemonization api" ON)
67 option(LWS_IPV6 "Compile with support for ipv6" OFF)
68 option(LWS_WITH_HTTP2 "Compile with support for http2" OFF)
69
70 # Allow the user to override installation directories.
71 set(LWS_INSTALL_LIB_DIR       lib CACHE PATH "Installation directory for libraries")
72 set(LWS_INSTALL_BIN_DIR       bin CACHE PATH "Installation directory for executables")
73 set(LWS_INSTALL_INCLUDE_DIR   include CACHE PATH "Installation directory for header files")
74 set(LWS_INSTALL_EXAMPLES_DIR  bin CACHE PATH "Installation directory for example files")
75
76 # Allow the user to use the old CyaSSL options/library in stead of wolfSSL
77 if (LWS_USE_CYASSL AND LWS_USE_WOLFSSL)
78         message(FATAL_ERROR "LWS_USE_CYASSL and LWS_USE_WOLFSSL are mutually exclusive!")
79 endif()
80 if (LWS_USE_CYASSL)
81         # Copy CyaSSL options to the wolfSSL options
82         set(LWS_USE_WOLFSSL ${LWS_USE_CYASSL} CACHE BOOL "Use wolfSSL/CyaSSL instead of OpenSSL" FORCE)
83         set(LWS_WOLFSSL_LIBRARIES ${LWS_CYASSL_LIBRARIES} CACHE PATH "Path to wolfSSL/CyaSSL libraries" FORCE)
84         set(LWS_WOLFSSL_INCLUDE_DIRS ${LWS_CYASSL_INCLUDE_DIRS} CACHE PATH "Path to wolfSSL/CyaSSL header files" FORCE)
85 endif()
86
87 if (LWS_WITHOUT_CLIENT AND LWS_WITHOUT_SERVER)
88         message(FATAL_ERROR "Makes no sense to compile without both client or server.")
89 endif()
90
91 if (NOT (LWS_WITH_STATIC OR LWS_WITH_SHARED))
92         message(FATAL_ERROR "Makes no sense to compile without both static or shared libraries.")
93 endif()
94
95 if (NOT LWS_WITHOUT_EXTENSIONS)
96         if (NOT LWS_WITH_ZLIB)
97                 message(FATAL_ERROR "zlib is required for extensions.")
98         endif()
99 endif()
100
101 set(LWS_ZLIB_LIBRARIES CACHE PATH "Path to the zlib library")
102 set(LWS_ZLIB_INCLUDE_DIRS CACHE PATH "Path to the zlib include directory")
103 set(LWS_OPENSSL_LIBRARIES CACHE PATH "Path to the OpenSSL library")
104 set(LWS_OPENSSL_INCLUDE_DIRS CACHE PATH "Path to the OpenSSL include directory")
105 set(LWS_WOLFSSL_LIBRARIES CACHE PATH "Path to the wolfSSL library")
106 set(LWS_WOLFSSL_INCLUDE_DIRS CACHE PATH "Path to the wolfSSL include directory")
107 set(LWS_LIBEV_LIBRARIES CACHE PATH "Path to the libev library")
108 set(LWS_LIBEV_INCLUDE_DIRS CACHE PATH "Path to the libev include directory")
109
110 if (LWS_WITH_SSL AND NOT LWS_USE_WOLFSSL)
111         if ("${LWS_OPENSSL_LIBRARIES}" STREQUAL "" OR "${LWS_OPENSSL_INCLUDE_DIRS}" STREQUAL "")
112         else()
113                 set(OPENSSL_LIBRARIES ${LWS_OPENSSL_LIBRARIES})
114                 set(OPENSSL_INCLUDE_DIRS ${LWS_OPENSSL_INCLUDE_DIRS})
115                 set(OPENSSL_FOUND 1)
116         endif()
117 endif()
118
119 if (LWS_WITH_SSL AND LWS_USE_WOLFSSL)
120         if ("${LWS_WOLFSSL_LIBRARIES}" STREQUAL "" OR "${LWS_WOLFSSL_INCLUDE_DIRS}" STREQUAL "")
121                 if (NOT WOLFSSL_FOUND)
122                         if (LWS_USE_CYASSL)
123                                 message(FATAL_ERROR "You must set LWS_CYASSL_LIBRARIES and LWS_CYASSL_INCLUDE_DIRS when LWS_USE_CYASSL is turned on.")
124                         else()
125                                 message(FATAL_ERROR "You must set LWS_WOLFSSL_LIBRARIES and LWS_WOLFSSL_INCLUDE_DIRS when LWS_USE_WOLFSSL is turned on.")
126                         endif()
127                 endif()
128         else()
129                 set(WOLFSSL_LIBRARIES ${LWS_WOLFSSL_LIBRARIES})
130                 set(WOLFSSL_INCLUDE_DIRS ${LWS_WOLFSSL_INCLUDE_DIRS})
131                 set(WOLFSSL_FOUND 1)
132         endif()
133         set(USE_WOLFSSL 1)
134         if (LWS_USE_CYASSL)
135                 set(USE_OLD_CYASSL 1)
136         endif()
137 endif()
138
139 if (LWS_WITH_ZLIB AND NOT LWS_USE_BUNDLED_ZLIB)
140         if ("${LWS_ZLIB_LIBRARIES}" STREQUAL "" OR "${LWS_ZLIB_INCLUDE_DIRS}" STREQUAL "")
141         else()
142                 set(ZLIB_LIBRARIES ${LWS_ZLIB_LIBRARIES})
143                 set(ZLIB_INCLUDE_DIRS ${LWS_ZLIB_INCLUDE_DIRS})
144                 set(ZLIB_FOUND 1)
145         endif()
146 endif()
147
148 if (LWS_WITH_LIBEV)
149         if ("${LWS_LIBEV_LIBRARIES}" STREQUAL "" OR "${LWS_LIBEV_INCLUDE_DIRS}" STREQUAL "")
150         else()
151                 set(LIBEV_LIBRARIES ${LWS_LIBEV_LIBRARIES})
152                 set(LIBEV_INCLUDE_DIRS ${LWS_LIBEV_INCLUDE_DIRS})
153                 set(LIBEV_FOUND 1)
154         endif()
155 endif()
156
157 # FIXME: This must be runtime-only option.
158 # The base dir where the test-apps look for the SSL certs.
159 set(LWS_OPENSSL_CLIENT_CERTS ../share CACHE PATH "Server SSL certificate directory")
160 if (WIN32)
161         set(LWS_OPENSSL_CLIENT_CERTS . CACHE PATH "Client SSL certificate directory")
162
163         if (LWS_IPV6)
164                 set(LWS_IPV6 OFF)
165                 message(WARNING "IPv6 does currently not work on Windows!")
166         endif()
167 else()
168         set(LWS_OPENSSL_CLIENT_CERTS /etc/pki/tls/certs/ CACHE PATH "Client SSL certificate directory")
169 endif()
170
171 if (LWS_WITHOUT_EXTENSIONS)
172         set(LWS_NO_EXTENSIONS 1)
173 endif()
174
175 if (LWS_WITH_SSL)
176         set(LWS_OPENSSL_SUPPORT 1)
177 endif()
178
179 if (LWS_SSL_CLIENT_USE_OS_CA_CERTS)
180         set(LWS_SSL_CLIENT_USE_OS_CA_CERTS 1)
181 endif()
182
183 if (LWS_WITH_LATENCY)
184         set(LWS_LATENCY 1)
185 endif()
186
187 if (LWS_WITHOUT_DAEMONIZE OR WIN32)
188         set(LWS_NO_DAEMONIZE 1)
189 endif()
190
191 if (LWS_WITHOUT_SERVER)
192         set(LWS_NO_SERVER 1)
193 endif()
194
195 if (LWS_WITHOUT_CLIENT)
196         set(LWS_NO_CLIENT 1)
197 endif()
198
199 if (LWS_WITH_LIBEV)
200         set(LWS_USE_LIBEV 1)
201 endif()
202
203 if (LWS_IPV6)
204         set(LWS_USE_IPV6 1)
205 endif()
206
207 if (LWS_WITH_HTTP2)
208         set(LWS_USE_HTTP2 1)
209 endif()
210
211 if (MINGW)
212         set(LWS_MINGW_SUPPORT 1)
213 endif()
214
215 include_directories("${PROJECT_BINARY_DIR}")
216
217 include(CheckCSourceCompiles)
218
219 # Check for different inline keyword versions.
220 foreach(KEYWORD "inline" "__inline__" "__inline")
221         set(CMAKE_REQUIRED_DEFINITIONS "-DKEYWORD=${KEYWORD}")
222         CHECK_C_SOURCE_COMPILES(
223                 "
224                 #include <stdio.h>
225                 static KEYWORD void a() {}
226                 int main(int argc, char **argv) { a(); return 0; }
227                 " LWS_HAVE_${KEYWORD})
228 endforeach()
229
230 if (NOT LWS_HAVE_inline)
231         if (LWS_HAVE___inline__)
232                 set(inline __inline__)
233         elseif(LWS_HAVE___inline)
234                 set(inline __inline)
235         endif()
236 endif()
237
238 # Put the libaries and binaries that get built into directories at the
239 # top of the build tree rather than in hard-to-find leaf directories. 
240 SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin")
241 SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib")
242 SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib")
243
244 # Put absolute path of dynamic libraries into the object code. Some
245 # architectures, notably Mac OS X, need this.
246 SET(CMAKE_INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/${LWS_INSTALL_LIB_DIR}${LIB_SUFFIX}")
247
248 include(CheckFunctionExists)
249 include(CheckIncludeFile)
250 include(CheckIncludeFiles)
251 include(CheckLibraryExists)
252 include(CheckTypeSize)
253
254 CHECK_FUNCTION_EXISTS(bzero LWS_HAVE_BZERO)
255 CHECK_FUNCTION_EXISTS(fork LWS_HAVE_FORK)
256 CHECK_FUNCTION_EXISTS(getenv LWS_HAVE_GETENV)
257 CHECK_FUNCTION_EXISTS(malloc LWS_HAVE_MALLOC)
258 CHECK_FUNCTION_EXISTS(memset LWS_HAVE_MEMSET)
259 CHECK_FUNCTION_EXISTS(realloc LWS_HAVE_REALLOC)
260 CHECK_FUNCTION_EXISTS(socket LWS_HAVE_SOCKET)
261 CHECK_FUNCTION_EXISTS(strerror LWS_HAVE_STRERROR)
262 CHECK_FUNCTION_EXISTS(vfork LWS_HAVE_VFORK)
263 CHECK_FUNCTION_EXISTS(getifaddrs LWS_HAVE_GETIFADDRS)
264
265 if (NOT LWS_HAVE_GETIFADDRS)
266         if (LWS_WITHOUT_BUILTIN_GETIFADDRS)
267                 message(FATAL_ERROR "No getifaddrs was found on the system. Turn off the LWS_WITHOUT_BUILTIN_GETIFADDRS compile option to use the supplied BSD version.")
268         endif()
269         set(LWS_BUILTIN_GETIFADDRS 1)
270 endif()
271
272 CHECK_INCLUDE_FILE(dlfcn.h LWS_HAVE_DLFCN_H)
273 CHECK_INCLUDE_FILE(fcntl.h LWS_HAVE_FCNTL_H)
274 CHECK_INCLUDE_FILE(in6addr.h LWS_HAVE_IN6ADDR_H)
275 CHECK_INCLUDE_FILE(inttypes.h LWS_HAVE_INTTYPES_H)
276 CHECK_INCLUDE_FILE(memory.h LWS_HAVE_MEMORY_H)
277 CHECK_INCLUDE_FILE(netinet/in.h LWS_HAVE_NETINET_IN_H)
278 CHECK_INCLUDE_FILE(stdint.h LWS_HAVE_STDINT_H)
279 CHECK_INCLUDE_FILE(stdlib.h LWS_HAVE_STDLIB_H)
280 CHECK_INCLUDE_FILE(strings.h LWS_HAVE_STRINGS_H)
281 CHECK_INCLUDE_FILE(string.h LWS_HAVE_STRING_H)
282 CHECK_INCLUDE_FILE(sys/prctl.h LWS_HAVE_SYS_PRCTL_H)
283 CHECK_INCLUDE_FILE(sys/socket.h LWS_HAVE_SYS_SOCKET_H)
284 CHECK_INCLUDE_FILE(sys/stat.h LWS_HAVE_SYS_STAT_H)
285 CHECK_INCLUDE_FILE(sys/types.h LWS_HAVE_SYS_TYPES_H)
286 CHECK_INCLUDE_FILE(unistd.h LWS_HAVE_UNISTD_H)
287 CHECK_INCLUDE_FILE(vfork.h LWS_HAVE_VFORK_H)
288 CHECK_INCLUDE_FILE(zlib.h LWS_HAVE_ZLIB_H)
289
290 # TODO: These can be tested if they actually work also...
291 set(LWS_HAVE_WORKING_FORK LWS_HAVE_FORK)
292 set(LWS_HAVE_WORKING_VFORK LWS_HAVE_VFORK)
293
294 CHECK_INCLUDE_FILES("stdlib.h;stdarg.h;string.h;float.h" STDC_HEADERS)
295
296 CHECK_TYPE_SIZE(pid_t PID_T_SIZE)
297 CHECK_TYPE_SIZE(size_t SIZE_T_SIZE)
298
299 if (NOT PID_T_SIZE)
300         set(pid_t int)
301 endif()
302
303 if (NOT SIZE_T_SIZE)
304         set(size_t "unsigned int")
305 endif()
306
307 if (NOT LWS_HAVE_MALLOC)
308         set(malloc rpl_malloc)
309 endif()
310
311 if (NOT LWS_HAVE_REALLOC)
312         set(realloc rpl_realloc)
313 endif()
314
315 # Generate the lws_config.h that includes all the public compilation settings.
316 configure_file(
317        "${PROJECT_SOURCE_DIR}/lws_config.h.in"
318        "${PROJECT_BINARY_DIR}/lws_config.h")
319
320 # Generate the lws_config.h that includes all the private compilation settings.
321 configure_file(
322        "${PROJECT_SOURCE_DIR}/lws_config_private.h.in"
323        "${PROJECT_BINARY_DIR}/lws_config_private.h")
324
325 if (MSVC)
326         # Turn off stupid microsoft security warnings.
327         add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE)
328 endif(MSVC)
329
330 include_directories("${PROJECT_SOURCE_DIR}/lib")
331
332 # Group headers and sources.
333 # Some IDEs use this for nicer file structure.
334 set(HDR_PRIVATE
335         lib/private-libwebsockets.h)
336
337 set(HDR_PUBLIC
338         "${PROJECT_SOURCE_DIR}/lib/libwebsockets.h"
339         "${PROJECT_BINARY_DIR}/lws_config.h")
340
341 set(SOURCES
342         lib/base64-decode.c
343         lib/handshake.c
344         lib/libwebsockets.c
345         lib/service.c
346         lib/pollfd.c
347         lib/output.c
348         lib/parsers.c
349         lib/context.c
350         lib/sha-1.c
351         lib/alloc.c
352         lib/header.c)
353
354 if (NOT LWS_WITHOUT_CLIENT)
355         list(APPEND SOURCES
356                 lib/client.c
357                 lib/client-handshake.c
358                 lib/client-parser.c)
359 endif()
360
361 if (LWS_WITH_SSL)
362         list(APPEND SOURCES
363                 lib/ssl.c)
364 endif()
365
366 if (LWS_WITH_HTTP2)
367         list(APPEND SOURCES
368                 lib/http2.c
369                 lib/hpack.c
370                 lib/ssl-http2.c)
371 endif()
372 # select the active platform files
373
374 if (WIN32)
375         list(APPEND SOURCES
376                 lib/lws-plat-win.c)
377 else()
378         list(APPEND SOURCES
379                 lib/lws-plat-unix.c)
380 endif()
381
382 if (NOT LWS_WITHOUT_SERVER)
383         list(APPEND SOURCES
384                 lib/server.c
385                 lib/server-handshake.c)
386 endif()
387
388 if (NOT LWS_WITHOUT_EXTENSIONS)
389         list(APPEND HDR_PRIVATE
390                 lib/extension-deflate-frame.h
391                 lib/extension-deflate-stream.h)
392         list(APPEND SOURCES
393                 lib/extension.c
394                 lib/extension-deflate-frame.c
395                 lib/extension-deflate-stream.c)
396 endif()
397
398 if (LWS_WITH_LIBEV)
399         list(APPEND SOURCES
400                 lib/libev.c)
401 endif(LWS_WITH_LIBEV)
402
403 # Add helper files for Windows.
404 if (WIN32)
405         set(WIN32_HELPERS_PATH win32port/win32helpers)
406         include_directories(${WIN32_HELPERS_PATH})
407 else()
408         # Unix.
409         if (NOT LWS_WITHOUT_DAEMONIZE)
410                 list(APPEND SOURCES
411                         lib/daemonize.c)
412         endif()
413 endif()
414
415 if (UNIX)
416         if (NOT LWS_HAVE_GETIFADDRS)
417                 list(APPEND HDR_PRIVATE lib/getifaddrs.h)
418                 list(APPEND SOURCES lib/getifaddrs.c)
419         endif()
420 endif()
421
422 if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
423     include (CheckCCompilerFlag)
424     CHECK_C_COMPILER_FLAG(-fvisibility=hidden LWS_HAVE_VISIBILITY)
425     if (LWS_HAVE_VISIBILITY)
426                 set(VISIBILITY_FLAG -fvisibility=hidden)
427     endif()
428     if (UNIX)
429                 set(CMAKE_C_FLAGS "-Wall -Werror -O3 ${VISIBILITY_FLAG} ${CMAKE_C_FLAGS}" )
430     else(UNIX)
431                 set(CMAKE_C_FLAGS "-Wall -O3 ${VISIBILITY_FLAG} ${CMAKE_C_FLAGS}" )
432     endif(UNIX)
433 endif ()
434
435 source_group("Headers Private"  FILES ${HDR_PRIVATE})
436 source_group("Headers Public"   FILES ${HDR_PUBLIC})
437 source_group("Sources"          FILES ${SOURCES})
438
439 #
440 # Create the lib.
441 #
442 set(LWS_LIBRARIES)
443
444 if (LWS_WITH_STATIC)
445         add_library(websockets STATIC
446                                 ${HDR_PRIVATE}
447                                 ${HDR_PUBLIC}
448                                 ${SOURCES})
449         list(APPEND LWS_LIBRARIES websockets)
450
451         if (WIN32)
452                 # Windows uses the same .lib ending for static libraries and shared
453                 # library linker files, so rename the static library.
454                 set_target_properties(websockets
455                         PROPERTIES
456                         OUTPUT_NAME websockets_static)
457         endif()
458 endif()
459
460 if (LWS_WITH_SHARED)
461         add_library(websockets_shared SHARED
462                                 ${HDR_PRIVATE}
463                                 ${HDR_PUBLIC}
464                                 ${SOURCES})
465         list(APPEND LWS_LIBRARIES websockets_shared)
466
467         # We want the shared lib to be named "libwebsockets"
468         # not "libwebsocket_shared".
469         set_target_properties(websockets_shared
470                 PROPERTIES
471                 OUTPUT_NAME websockets)
472
473         if (WIN32)
474                 # Compile as DLL (export function declarations)
475                 set_property(
476                         TARGET websockets_shared
477                         PROPERTY COMPILE_DEFINITIONS
478                         LWS_DLL
479                         LWS_INTERNAL)
480         endif()
481
482         if (APPLE)
483                 set_property(TARGET websockets_shared PROPERTY MACOSX_RPATH YES)
484         endif()
485 endif()
486
487
488 # Set the so version of the lib.
489 # Equivalent to LDFLAGS=-version-info x:x:x
490 if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
491         foreach(lib ${LWS_LIBRARIES})
492                 set_target_properties(${lib}
493                         PROPERTIES
494                         SOVERSION ${SOVERSION})
495         endforeach()
496 endif()
497
498 set(LIB_LIST)
499
500 #
501 # Find libraries.
502 #
503
504 #
505 # ZLIB (Only needed for deflate extensions).
506 #
507 if (LWS_WITH_ZLIB)
508         if (LWS_USE_BUNDLED_ZLIB)
509                 if (WIN32)
510                         set(WIN32_ZLIB_PATH "win32port/zlib")
511                         set(ZLIB_SRCS
512                                 ${WIN32_ZLIB_PATH}/adler32.c
513                                 ${WIN32_ZLIB_PATH}/compress.c
514                                 ${WIN32_ZLIB_PATH}/crc32.c
515                                 ${WIN32_ZLIB_PATH}/deflate.c
516                                 ${WIN32_ZLIB_PATH}/gzclose.c
517                                 ${WIN32_ZLIB_PATH}/gzio.c
518                                 ${WIN32_ZLIB_PATH}/gzlib.c
519                                 ${WIN32_ZLIB_PATH}/gzread.c
520                                 ${WIN32_ZLIB_PATH}/gzwrite.c
521                                 ${WIN32_ZLIB_PATH}/infback.c
522                                 ${WIN32_ZLIB_PATH}/inffast.c
523                                 ${WIN32_ZLIB_PATH}/inflate.c
524                                 ${WIN32_ZLIB_PATH}/inftrees.c
525                                 ${WIN32_ZLIB_PATH}/trees.c
526                                 ${WIN32_ZLIB_PATH}/uncompr.c
527                                 ${WIN32_ZLIB_PATH}/zutil.c)
528                         add_library(zlib_internal STATIC ${ZLIB_SRCS})
529                         set(ZLIB_INCLUDE_DIRS ${WIN32_ZLIB_PATH})
530                         get_property(ZLIB_LIBRARIES TARGET zlib_internal PROPERTY LOCATION)
531                         set(ZLIB_FOUND 1)
532                         # Make sure zlib_internal is compiled before the libs.
533                         foreach (lib ${LWS_LIBRARIES})
534                                 add_dependencies(${lib} zlib_internal)
535                         endforeach()
536                 else()
537                         message(FATAL_ERROR "Don't have bundled zlib for that platform")
538                 endif()
539         elseif (NOT ZLIB_FOUND)
540                 find_package(ZLIB REQUIRED)
541         endif()
542         message("zlib include dirs: ${ZLIB_INCLUDE_DIRS}")
543         message("zlib libraries: ${ZLIB_LIBRARIES}")
544         include_directories(${ZLIB_INCLUDE_DIRS})
545         list(APPEND LIB_LIST ${ZLIB_LIBRARIES})
546 endif()
547
548 #
549 # OpenSSL
550 #
551 if (LWS_WITH_SSL)
552         message("Compiling with SSL support")
553
554         if (LWS_USE_WOLFSSL)
555                 # Use wolfSSL as OpenSSL replacement.
556                 # TODO: Add a find_package command for this also.
557                 message("wolfSSL include dir: ${WOLFSSL_INCLUDE_DIRS}")
558                 message("wolfSSL libraries: ${WOLFSSL_LIBRARIES}")
559
560                 # Additional to the root directory we need to include
561                 # the wolfssl/ subdirectory which contains the OpenSSL
562                 # compatability layer headers.
563                 if (LWS_USE_CYASSL)
564                         foreach(inc ${WOLFSSL_INCLUDE_DIRS})
565                                 include_directories("${inc}" "${inc}/cyassl")
566                         endforeach()
567                 else()
568                         foreach(inc ${WOLFSSL_INCLUDE_DIRS})
569                                 include_directories("${inc}" "${inc}/wolfssl")
570                         endforeach()
571                 endif()
572
573                 list(APPEND LIB_LIST "${WOLFSSL_LIBRARIES}")
574         else()
575                 if (NOT OPENSSL_FOUND)
576                         # TODO: Add support for STATIC also.
577                         find_package(OpenSSL REQUIRED)
578                         set(OPENSSL_INCLUDE_DIRS "${OPENSSL_INCLUDE_DIR}")
579                 endif()
580
581                 message("OpenSSL include dir: ${OPENSSL_INCLUDE_DIRS}")
582                 message("OpenSSL libraries: ${OPENSSL_LIBRARIES}")
583
584                 include_directories("${OPENSSL_INCLUDE_DIRS}")
585                 list(APPEND LIB_LIST ${OPENSSL_LIBRARIES})
586         endif()
587 endif(LWS_WITH_SSL)
588
589 if (LWS_WITH_LIBEV)
590         if (NOT LIBEV_FOUND)
591                 find_path(LIBEV_INCLUDE_DIRS NAMES ev.h)
592                 find_library(LIBEV_LIBRARIES NAMES ev)
593                 if(LIBEV_INCLUDE_DIRS AND LIBEV_LIBRARIES)
594                         set(LIBEV_FOUND 1)
595                 endif()
596         endif()
597         message("libev include dir: ${LIBEV_INCLUDE_DIRS}")
598         message("libev libraries: ${LIBEV_LIBRARIES}")
599         include_directories("${LIBEV_INCLUDE_DIRS}")
600         list(APPEND LIB_LIST ${LIBEV_LIBRARIES})
601 endif(LWS_WITH_LIBEV)
602
603 #
604 # Platform specific libs.
605 #
606 if (WINCE)
607         list(APPEND LIB_LIST ws2.lib)
608 elseif (WIN32)
609         list(APPEND LIB_LIST ws2_32.lib)
610 endif()
611
612 if (UNIX)
613         list(APPEND LIB_LIST m)
614 endif()
615
616 # Setup the linking for all libs.
617 foreach (lib ${LWS_LIBRARIES})
618         target_link_libraries(${lib} ${LIB_LIST})
619 endforeach()
620
621 #
622 # Test applications
623 #
624 set(TEST_APP_LIST)
625 if (NOT LWS_WITHOUT_TESTAPPS)
626         #
627         # Helper function for adding a test app.
628         #
629         macro(create_test_app TEST_NAME MAIN_SRC)
630
631                 set(TEST_SRCS ${MAIN_SRC})
632                 set(TEST_HDR)
633
634                 if (WIN32)
635                         list(APPEND TEST_SRCS
636                                 ${WIN32_HELPERS_PATH}/getopt.c
637                                 ${WIN32_HELPERS_PATH}/getopt_long.c
638                                 ${WIN32_HELPERS_PATH}/gettimeofday.c
639                         )
640
641                         list(APPEND TEST_HDR
642                                 ${WIN32_HELPERS_PATH}/getopt.h
643                                 ${WIN32_HELPERS_PATH}/gettimeofday.h
644                         )
645                 endif(WIN32)
646
647                 source_group("Headers Private"   FILES ${TEST_HDR})
648                 source_group("Sources"   FILES ${TEST_SRCS})
649                 add_executable(${TEST_NAME} ${TEST_SRCS} ${TEST_HDR})
650
651                 if (LWS_LINK_TESTAPPS_DYNAMIC)
652                         if (NOT LWS_WITH_SHARED)
653                                 message(FATAL_ERROR "Build of shared library is disabled. LWS_LINK_TESTAPPS_DYNAMIC must be combined with LWS_WITH_SHARED.")
654                         endif()
655                         target_link_libraries(${TEST_NAME} websockets_shared)
656                         add_dependencies(${TEST_NAME} websockets_shared)
657                 else()
658                         if (NOT LWS_WITH_STATIC)
659                                 message(FATAL_ERROR "Build of static library is disabled. Disabled LWS_LINK_TESTAPPS_DYNAMIC must be combined with LWS_WITH_STATIC.")
660                         endif()
661                         target_link_libraries(${TEST_NAME} websockets)
662                         add_dependencies(${TEST_NAME} websockets)
663                 endif()
664
665                 # Set test app specific defines.
666                 set_property(TARGET ${TEST_NAME}
667                                         PROPERTY COMPILE_DEFINITIONS
668                                                 INSTALL_DATADIR="${CMAKE_INSTALL_PREFIX}/share"
669                                         )
670
671                 # Prefix the binary names with libwebsockets.
672                 set_target_properties(${TEST_NAME}
673                         PROPERTIES
674                         OUTPUT_NAME libwebsockets-${TEST_NAME})
675
676                 # Add to the list of tests.
677                 list(APPEND TEST_APP_LIST ${TEST_NAME})
678         endmacro()
679
680         if (LWS_WITH_SSL AND NOT LWS_USE_WOLFSSL)
681                 message("Searching for OpenSSL executable and dlls")
682                 find_package(OpenSSLbins)
683                 message("OpenSSL executable: ${OPENSSL_EXECUTABLE}")
684         endif()
685
686         if (NOT LWS_WITHOUT_SERVER)
687                 #
688                 # test-server
689                 #
690                 if (NOT LWS_WITHOUT_TEST_SERVER)
691                         create_test_app(test-server "test-server/test-server.c")
692                 endif()
693
694                 #
695                 # test-server-extpoll
696                 #
697                 if (NOT LWS_WITHOUT_TEST_SERVER_EXTPOLL)
698                         create_test_app(test-server-extpoll "test-server/test-server.c")
699                         # Set defines for this executable only.
700                         set_property(
701                                 TARGET test-server-extpoll
702                                 PROPERTY COMPILE_DEFINITIONS 
703                                         EXTERNAL_POLL 
704                                         INSTALL_DATADIR="${CMAKE_INSTALL_PREFIX}/share"
705                                 )
706
707                         # We need to link against winsock code.
708                         if (WIN32)
709                                 target_link_libraries(test-server-extpoll ws2_32.lib)
710                         endif(WIN32)
711                 endif()
712
713                 # Data files for running the test server.
714                 set(TEST_SERVER_DATA
715                         "${PROJECT_SOURCE_DIR}/test-server/favicon.ico"
716                         "${PROJECT_SOURCE_DIR}/test-server/leaf.jpg"
717                         "${PROJECT_SOURCE_DIR}/test-server/libwebsockets.org-logo.png"
718                         "${PROJECT_SOURCE_DIR}/test-server/test.html")
719
720                 # Generate self-signed SSL certs for the test-server.
721                 if (LWS_WITH_SSL AND OPENSSL_EXECUTABLE AND NOT LWS_WITHOUT_TEST_SERVER)
722                         message("Generating SSL Certificates for the test-server...")
723
724                         set(TEST_SERVER_SSL_KEY "${PROJECT_BINARY_DIR}/libwebsockets-test-server.key.pem")
725                         set(TEST_SERVER_SSL_CERT "${PROJECT_BINARY_DIR}/libwebsockets-test-server.pem")
726
727                         if (WIN32)
728                                 file(WRITE "${PROJECT_BINARY_DIR}/openssl_input.txt"
729                                         "GB\n"
730                                         "Erewhon\n"
731                                         "All around\n"
732                                         "libwebsockets-test\n"
733                                         "localhost\n"
734                                         "none@invalid.org\n\n"
735                                         )
736
737                                 # The "type" command is a bit picky with paths.
738                                 file(TO_NATIVE_PATH "${PROJECT_BINARY_DIR}/openssl_input.txt" OPENSSL_INPUT_WIN_PATH)
739                                 message("OPENSSL_INPUT_WIN_PATH = ${OPENSSL_INPUT_WIN_PATH}")
740                                 message("cmd = \"${OPENSSL_EXECUTABLE}\" req -new -newkey rsa:1024 -days 10000 -nodes -x509 -keyout \"${TEST_SERVER_SSL_KEY}\" -out \"${TEST_SERVER_SSL_CERT}\"")
741
742                                 execute_process(
743                                         COMMAND cmd /c type "${OPENSSL_INPUT_WIN_PATH}"
744                                         COMMAND "${OPENSSL_EXECUTABLE}" req -new -newkey rsa:1024 -days 10000 -nodes -x509 -keyout "${TEST_SERVER_SSL_KEY}" -out "${TEST_SERVER_SSL_CERT}"
745                                         RESULT_VARIABLE OPENSSL_RETURN_CODE
746                                         OUTPUT_QUIET ERROR_QUIET)
747
748                                 message("\n")
749
750                                 if (OPENSSL_RETURN_CODE)
751                                         message(WARNING "!!! Failed to generate SSL certificate for Test Server using cmd.exe !!!:\nOpenSSL return code = ${OPENSSL_RETURN_CODE}")
752                                 else()
753                                         message("SUCCSESFULLY generated SSL certificate")
754                                 endif()
755                         else()
756                                 # Unix.
757                                 execute_process(
758                                         COMMAND printf "GB\\nErewhon\\nAll around\\nlibwebsockets-test\\n\\nlocalhost\\nnone@invalid.org\\n"
759                                         COMMAND "${OPENSSL_EXECUTABLE}"
760                                                 req -new -newkey rsa:1024 -days 10000 -nodes -x509 -keyout "${TEST_SERVER_SSL_KEY}" -out "${TEST_SERVER_SSL_CERT}"
761                                         RESULT_VARIABLE OPENSSL_RETURN_CODE
762                                         OUTPUT_QUIET ERROR_QUIET)
763
764                                 if (OPENSSL_RETURN_CODE)
765                                         message(WARNING "!!! Failed to generate SSL certificate for Test Server!!!:\nOpenSSL return code = ${OPENSSL_RETURN_CODE}")
766                                 else()
767                                         message("SUCCSESFULLY generated SSL certificate")
768                                 endif()
769                         endif()
770
771                         list(APPEND TEST_SERVER_DATA 
772                                 "${TEST_SERVER_SSL_KEY}"
773                                 "${TEST_SERVER_SSL_CERT}")
774                 endif()
775
776                 add_custom_command(TARGET test-server
777                                                 POST_BUILD 
778                                                 COMMAND "${CMAKE_COMMAND}" -E make_directory "$<TARGET_FILE_DIR:test-server>/../share/libwebsockets-test-server")
779
780                 # Copy the file needed to run the server so that the test apps can
781                 # reach them from their default output location
782                 foreach (TEST_FILE ${TEST_SERVER_DATA})
783                         if (EXISTS ${TEST_FILE})
784                                 add_custom_command(TARGET test-server
785                                                         POST_BUILD 
786                                                         COMMAND "${CMAKE_COMMAND}" -E copy "${TEST_FILE}" "$<TARGET_FILE_DIR:test-server>/../share/libwebsockets-test-server" VERBATIM)
787                         endif()
788                 endforeach()
789         endif(NOT LWS_WITHOUT_SERVER)
790
791         if (NOT LWS_WITHOUT_CLIENT)
792                 #
793                 # test-client
794                 #
795                 if (NOT LWS_WITHOUT_TEST_CLIENT)
796                         create_test_app(test-client "test-server/test-client.c")
797                 endif()
798
799                 #
800                 # test-fraggle
801                 #
802                 if (NOT LWS_WITHOUT_TEST_FRAGGLE)
803                         create_test_app(test-fraggle "test-server/test-fraggle.c")
804                 endif()
805
806                 #
807                 # test-ping
808                 #
809                 if (NOT LWS_WITHOUT_TEST_PING)
810                         create_test_app(test-ping "test-server/test-ping.c")
811                 endif()
812                 #
813                 # test-echo
814                 #
815                 if (NOT WITHOUT_TEST_ECHO)
816                         create_test_app(test-echo "test-server/test-echo.c")
817                 endif()
818
819         endif(NOT LWS_WITHOUT_CLIENT)
820
821         #
822         # Copy OpenSSL dlls to the output directory on Windows.
823         # (Otherwise we'll get an error when trying to run)
824         #
825         if (WIN32 AND LWS_WITH_SSL AND NOT LWS_USE_WOLFSSL)
826                 if(OPENSSL_BIN_FOUND)
827                         message("OpenSSL dlls found:")
828                         message("  Libeay: ${LIBEAY_BIN}")
829                         message("  SSLeay: ${SSLEAY_BIN}")
830
831                         foreach(TARGET_BIN ${TEST_APP_LIST})
832                                 add_custom_command(TARGET ${TARGET_BIN}
833                                         POST_BUILD
834                                         COMMAND "${CMAKE_COMMAND}" -E copy "${LIBEAY_BIN}" "$<TARGET_FILE_DIR:${TARGET_BIN}>" VERBATIM)
835                                 add_custom_command(TARGET ${TARGET_BIN}
836                                         POST_BUILD
837                                         COMMAND "${CMAKE_COMMAND}" -E copy "${SSLEAY_BIN}" "$<TARGET_FILE_DIR:${TARGET_BIN}>" VERBATIM)
838                         endforeach()
839                 endif()
840         endif()
841 endif(NOT LWS_WITHOUT_TESTAPPS)
842
843 if (UNIX)
844         # Generate documentation.
845         # TODO: Fix this on Windows.
846         message("Generating API documentation")
847         file(GLOB C_FILES "${PROJECT_SOURCE_DIR}/lib/*.c")
848         execute_process(COMMAND "${CMAKE_COMMAND}" -E make_directory "${PROJECT_BINARY_DIR}/doc/")
849
850         execute_process(
851                 COMMAND "${PROJECT_SOURCE_DIR}/scripts/kernel-doc" -html ${C_FILES} ${HDR_PUBLIC}
852                 OUTPUT_FILE "${PROJECT_BINARY_DIR}/doc/libwebsockets-api-doc.html"
853                 ERROR_QUIET)
854
855         execute_process(
856                 COMMAND "${PROJECT_SOURCE_DIR}/scripts/kernel-doc" -text ${C_FILES} ${HDR_PUBLIC}
857                 OUTPUT_FILE "${PROJECT_BINARY_DIR}/doc/libwebsockets-api-doc.txt"
858                 ERROR_QUIET)
859
860 # Generate and install pkgconfig.
861 # (This is not indented, because the tabs will be part of the output)
862 file(WRITE "${PROJECT_BINARY_DIR}/libwebsockets.pc"
863 "prefix=\"${CMAKE_INSTALL_PREFIX}\"
864 exec_prefix=\${prefix}
865 libdir=\${exec_prefix}/lib${LIB_SUFFIX}
866 includedir=\${prefix}/include
867
868 Name: libwebsockets
869 Description: Websockets server and client library
870 Version: ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}
871
872 Libs: -L\${libdir} -lwebsockets
873 Cflags: -I\${includedir}"
874 )
875
876         install(FILES "${PROJECT_BINARY_DIR}/libwebsockets.pc"
877                 DESTINATION lib${LIB_SUFFIX}/pkgconfig)
878 endif(UNIX)
879
880 #
881 # Installation preparations.
882 #
883
884 if(WIN32 AND NOT CYGWIN)
885   set(DEF_INSTALL_CMAKE_DIR cmake)
886 else()
887   set(DEF_INSTALL_CMAKE_DIR lib/cmake/libwebsockets)
888 endif()
889
890 set(LWS_INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR} CACHE PATH "Installation directory for CMake files")
891
892 # Export targets (This is used for other CMake projects to easily find the libraries and include files).
893 export(TARGETS ${LWS_LIBRARIES}
894         FILE "${PROJECT_BINARY_DIR}/LibwebsocketsTargets.cmake")
895 export(PACKAGE libwebsockets)
896
897 # Generate the config file for the build-tree.
898 set(LWS__INCLUDE_DIRS 
899     "${PROJECT_SOURCE_DIR}/lib"
900     "${PROJECT_BINARY_DIR}")
901 set(LIBWEBSOCKETS_INCLUDE_DIRS ${LWS__INCLUDE_DIRS} CACHE PATH "Libwebsockets include directories")
902 configure_file(${PROJECT_SOURCE_DIR}/cmake/LibwebsocketsConfig.cmake.in
903                 ${PROJECT_BINARY_DIR}/LibwebsocketsConfig.cmake 
904                 @ONLY)
905
906 # Generate the config file for the installation tree.
907 get_filename_component(LWS_ABSOLUTE_INSTALL_CMAKE_DIR ${LWS_INSTALL_CMAKE_DIR} ABSOLUTE)
908 get_filename_component(LWS_ABSOLUTE_INSTALL_INCLUDE_DIR ${LWS_INSTALL_INCLUDE_DIR} ABSOLUTE)
909 file(RELATIVE_PATH 
910     REL_INCLUDE_DIR 
911     "${LWS_ABSOLUTE_INSTALL_CMAKE_DIR}"
912     "${LWS_ABSOLUTE_INSTALL_INCLUDE_DIR}") # Calculate the relative directory from the cmake dir.
913
914 # Note the EVENT_CMAKE_DIR is defined in JanssonConfig.cmake.in, 
915 # we escape it here so it's evaluated when it is included instead
916 # so that the include dirs are given relative to where the 
917 # config file is located.
918 set(LWS__INCLUDE_DIRS 
919     "\${LWS_CMAKE_DIR}/${REL_INCLUDE_DIR}") 
920 configure_file(${PROJECT_SOURCE_DIR}/cmake/LibwebsocketsConfig.cmake.in
921                 ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/LibwebsocketsConfig.cmake 
922                 @ONLY)
923
924 # Generate version info for both build-tree and install-tree.
925 configure_file(${PROJECT_SOURCE_DIR}/cmake/LibwebsocketsConfigVersion.cmake.in
926                 ${PROJECT_BINARY_DIR}/LibwebsocketsConfigVersion.cmake 
927                 @ONLY)
928
929                         set_target_properties(${LWS_LIBRARIES}
930                                         PROPERTIES PUBLIC_HEADER "${HDR_PUBLIC}")
931
932 #
933 # Installation.
934 #
935
936 # Install libs and headers.
937 install(TARGETS ${LWS_LIBRARIES}
938                 EXPORT LibwebsocketsTargets
939                 LIBRARY DESTINATION "${LWS_INSTALL_LIB_DIR}${LIB_SUFFIX}" COMPONENT libraries
940                 ARCHIVE DESTINATION "${LWS_INSTALL_LIB_DIR}${LIB_SUFFIX}" COMPONENT libraries
941                 RUNTIME DESTINATION "${LWS_INSTALL_BIN_DIR}" COMPONENT libraries # Windows DLLs
942                 PUBLIC_HEADER DESTINATION "${LWS_INSTALL_INCLUDE_DIR}" COMPONENT dev)
943 set(CPACK_COMPONENT_LIBRARIES_DISPLAY_NAME "Libraries")
944 set(CPACK_COMPONENT_DEV_DISPLAY_NAME "Development files")
945
946 # Install test apps.
947 if (NOT LWS_WITHOUT_TESTAPPS AND NOT LWS_WITHOUT_CLIENT)
948         install(TARGETS test-client ${TEST_APP_LIST}
949                         RUNTIME DESTINATION ${LWS_INSTALL_EXAMPLES_DIR}
950                         COMPONENT examples)
951         set(CPACK_COMPONENT_EXAMPLES_DISPLAY_NAME "Example files")
952 endif()
953
954 # Programs shared files used by the test-server.
955 if (NOT LWS_WITHOUT_TESTAPPS AND NOT LWS_WITHOUT_SERVER)
956         install(FILES ${TEST_SERVER_DATA}
957                         DESTINATION share/libwebsockets-test-server
958                         COMPONENT examples)
959 endif()
960
961 # build subdir is not part of sources
962 set(CPACK_SOURCE_IGNORE_FILES $(CPACK_SOURCE_IGNORE_FILES) ".git" "build" "tgz" "tar.gz")
963
964 # Most people are more used to "make dist" compared to "make package_source"
965 add_custom_target(dist COMMAND "${CMAKE_MAKE_PROGRAM}" package_source)
966
967 include(UseRPMTools)
968 if (RPMTools_FOUND)
969         RPMTools_ADD_RPM_TARGETS(libwebsockets libwebsockets.spec)
970 endif()
971
972 message("---------------------------------------------------------------------")
973 message("  Settings:  (For more help do cmake -LH <srcpath>)")
974 message("---------------------------------------------------------------------")
975 message(" LWS_WITH_SSL = ${LWS_WITH_SSL}  (SSL Support)")
976 message(" LWS_SSL_CLIENT_USE_OS_CA_CERTS = ${LWS_SSL_CLIENT_USE_OS_CA_CERTS}")
977 message(" LWS_USE_WOLFSSL = ${LWS_USE_WOLFSSL} (wolfSSL/CyaSSL replacement for OpenSSL)")
978 if (LWS_USE_WOLFSSL)
979         message("   LWS_WOLFSSL_LIBRARIES = ${LWS_WOLFSSL_LIBRARIES}")
980         message("   LWS_WOLFSSL_INCLUDE_DIRS = ${LWS_WOLFSSL_INCLUDE_DIRS}")
981 endif()
982 message(" LWS_WITHOUT_BUILTIN_GETIFADDRS = ${LWS_WITHOUT_BUILTIN_GETIFADDRS}")
983 message(" LWS_WITHOUT_CLIENT = ${LWS_WITHOUT_CLIENT}")
984 message(" LWS_WITHOUT_SERVER = ${LWS_WITHOUT_SERVER}")
985 message(" LWS_LINK_TESTAPPS_DYNAMIC = ${LWS_LINK_TESTAPPS_DYNAMIC}")
986 message(" LWS_WITHOUT_TESTAPPS = ${LWS_WITHOUT_TESTAPPS}")
987 message(" LWS_WITHOUT_TEST_SERVER = ${LWS_WITHOUT_TEST_SERVER}")
988 message(" LWS_WITHOUT_TEST_SERVER_EXTPOLL = ${LWS_WITHOUT_TEST_SERVER_EXTPOLL}")
989 message(" LWS_WITHOUT_TEST_PING = ${LWS_WITHOUT_TEST_PING}")
990 message(" LWS_WITHOUT_TEST_CLIENT = ${LWS_WITHOUT_TEST_CLIENT}")
991 message(" LWS_WITHOUT_TEST_FRAGGLE = ${LWS_WITHOUT_TEST_FRAGGLE}")
992 message(" LWS_WITHOUT_EXTENSIONS = ${LWS_WITHOUT_EXTENSIONS}")
993 message(" LWS_WITH_LATENCY = ${LWS_WITH_LATENCY}")
994 message(" LWS_WITHOUT_DAEMONIZE = ${LWS_WITHOUT_DAEMONIZE}")
995 message(" LWS_USE_LIBEV = ${LWS_USE_LIBEV}")
996 message(" LWS_IPV6 = ${LWS_IPV6}")
997 message(" LWS_WITH_HTTP2 = ${LWS_WITH_HTTP2}")
998 message("---------------------------------------------------------------------")
999
1000 # These will be available to parent projects including libwebsockets using add_subdirectory()
1001 set(LIBWEBSOCKETS_LIBRARIES ${LWS_LIBRARIES} CACHE STRING "Libwebsocket libraries")
1002 if (LWS_WITH_STATIC)
1003         set(LIBWEBSOCKETS_LIBRARIES_STATIC websocket CACHE STRING "Libwebsocket static library")
1004 endif()
1005 if (LWS_WITH_SHARED)
1006         set(LIBWEBSOCKETS_LIBRARIES_SHARED websockets_shared CACHE STRING "Libwebsocket shared library")
1007 endif()
1008
1009 # This must always be last!
1010 include(CPack)