1cmake_minimum_required(VERSION 2.8.9) 2 3# General Advice 4# 5# For selecting between DEBUG / RELEASE, use -DCMAKE_BUILD_TYPE=DEBUG or =RELEASE 6# debug builds include source level debug info and extra logging 7 8set(LWS_WITH_BUNDLED_ZLIB_DEFAULT OFF) 9if(WIN32) 10 set(LWS_WITH_BUNDLED_ZLIB_DEFAULT ON) 11endif() 12 13set(LWS_ROLE_RAW 1) 14set(LWS_WITH_POLL 1) 15 16# it's at this point any toolchain file is brought in 17project(libwebsockets C) 18 19# 20# Select features recommended for PC distro packaging 21# 22option(LWS_WITH_DISTRO_RECOMMENDED "Enable features recommended for distro packaging" OFF) 23option(LWS_FOR_GITOHASHI "Enable features recommended for use with gitohashi" OFF) 24 25# variables for libwebsockets build as x86-64 host library in Android 26include(CMakeAndroidLists.txt) 27# end of variables for libwebsockets build as x86-64 host library in Android 28 29# 30# Major individual features 31# 32option(LWS_WITH_NETWORK "Compile with network-related code" ON) 33option(LWS_ROLE_H1 "Compile with support for http/1 (needed for ws)" ON) 34option(LWS_ROLE_WS "Compile with support for websockets" ON) 35option(LWS_ROLE_MQTT "Build with support for MQTT client" OFF) 36option(LWS_ROLE_DBUS "Compile with support for DBUS" OFF) 37option(LWS_ROLE_RAW_PROXY "Raw packet proxy" OFF) 38option(LWS_ROLE_RAW_FILE "Compile with support for raw files" ON) 39option(LWS_WITH_HTTP2 "Compile with server support for HTTP/2" ON) 40option(LWS_WITH_LWSWS "Libwebsockets Webserver" OFF) 41option(LWS_WITH_CGI "Include CGI (spawn process with network-connected stdin/out/err) APIs" OFF) 42option(LWS_IPV6 "Compile with support for ipv6" OFF) 43option(LWS_UNIX_SOCK "Compile with support for UNIX domain socket" OFF) 44option(LWS_WITH_PLUGINS "Support plugins for protocols and extensions" OFF) 45option(LWS_WITH_HTTP_PROXY "Support for active HTTP proxying" OFF) 46option(LWS_WITH_ZIP_FOPS "Support serving pre-zipped files" OFF) 47option(LWS_WITH_SOCKS5 "Allow use of SOCKS5 proxy on client connections" OFF) 48option(LWS_WITH_GENERIC_SESSIONS "With the Generic Sessions plugin" OFF) 49option(LWS_WITH_PEER_LIMITS "Track peers and restrict resources a single peer can allocate" OFF) 50option(LWS_WITH_ACCESS_LOG "Support generating Apache-compatible access logs" OFF) 51option(LWS_WITH_RANGES "Support http ranges (RFC7233)" OFF) 52option(LWS_WITH_SERVER_STATUS "Support json + jscript server monitoring" OFF) 53option(LWS_WITH_THREADPOOL "Managed worker thread pool support (relies on pthreads)" OFF) 54option(LWS_WITH_HTTP_STREAM_COMPRESSION "Support HTTP stream compression" OFF) 55option(LWS_WITH_HTTP_BROTLI "Also offer brotli http stream compression (requires LWS_WITH_HTTP_STREAM_COMPRESSION)" OFF) 56option(LWS_WITH_ACME "Enable support for ACME automatic cert acquisition + maintenance (letsencrypt etc)" OFF) 57option(LWS_WITH_HUBBUB "Enable libhubbub rewriting support" OFF) 58option(LWS_WITH_ALSA "Enable alsa audio example" OFF) 59option(LWS_WITH_GTK "Enable gtk example" OFF) 60option(LWS_WITH_FTS "Full Text Search support" OFF) 61option(LWS_WITH_SYS_ASYNC_DNS "Nonblocking internal IPv4 + IPv6 DNS resolver" OFF) 62option(LWS_WITH_SYS_NTPCLIENT "Build in tiny ntpclient good for tls date validation and run via lws_system" OFF) 63option(LWS_WITH_SYS_DHCP_CLIENT "Build in tiny DHCP client" OFF) 64option(LWS_WITH_HTTP_BASIC_AUTH "Support Basic Auth" ON) 65option(LWS_WITH_HTTP_UNCOMMON_HEADERS "Include less common http header support" ON) 66 67# 68# Secure Streams 69# 70option(LWS_WITH_SECURE_STREAMS "Secure Streams protocol-agnostic API" OFF) 71option(LWS_WITH_SECURE_STREAMS_PROXY_API "Secure Streams support to work across processes" OFF) 72option(LWS_WITH_SECURE_STREAMS_SYS_AUTH_API_AMAZON_COM "Auth support for api.amazon.com" OFF) 73 74# 75# TLS library options... all except mbedTLS are basically OpenSSL variants. 76# 77option(LWS_WITH_SSL "Include SSL support (defaults to OpenSSL or similar, mbedTLS if LWS_WITH_MBEDTLS is set)" ON) 78option(LWS_WITH_MBEDTLS "Use mbedTLS (>=2.0) replacement for OpenSSL. When setting this, you also may need to specify LWS_MBEDTLS_LIBRARIES and LWS_MBEDTLS_INCLUDE_DIRS" OFF) 79option(LWS_WITH_BORINGSSL "Use BoringSSL replacement for OpenSSL" ON) 80option(LWS_WITH_CYASSL "Use CyaSSL replacement for OpenSSL. When setting this, you also need to specify LWS_CYASSL_LIBRARIES and LWS_CYASSL_INCLUDE_DIRS" OFF) 81option(LWS_WITH_WOLFSSL "Use wolfSSL replacement for OpenSSL. When setting this, you also need to specify LWS_WOLFSSL_LIBRARIES and LWS_WOLFSSL_INCLUDE_DIRS" OFF) 82option(LWS_SSL_CLIENT_USE_OS_CA_CERTS "SSL support should make use of the OS-installed CA root certs" ON) 83# 84# Event library options (may select multiple, or none for default poll() 85# 86option(LWS_WITH_LIBEV "Compile with support for libev" OFF) 87option(LWS_WITH_LIBUV "Compile with support for libuv" OFF) 88option(LWS_WITH_LIBEVENT "Compile with support for libevent" OFF) 89option(LWS_WITH_GLIB "Compile with support for glib event loop" OFF) 90 91# 92# Static / Dynamic build options 93# 94option(LWS_WITH_STATIC "Build the static version of the library" ON) 95option(LWS_WITH_SHARED "Build the shared version of the library" OFF) 96option(LWS_LINK_TESTAPPS_DYNAMIC "Link the test apps to the shared version of the library. Default is to link statically" OFF) 97option(LWS_STATIC_PIC "Build the static version of the library with position-independent code" OFF) 98# 99# Specific platforms 100# 101option(LWS_WITH_ESP32 "Build for ESP32" OFF) 102option(LWS_WITH_ESP32_HELPER "Build ESP32 helper" OFF) 103option(LWS_PLAT_OPTEE "Build for OPTEE" OFF) 104option(LWS_PLAT_FREERTOS "Build for FreeRTOS" OFF) 105option(LWS_PLAT_ANDROID "Android flavour of unix platform" OFF) 106 107# 108# Client / Server / Test Apps build control 109# 110option(LWS_WITHOUT_CLIENT "Don't build the client part of the library" OFF) 111option(LWS_WITHOUT_SERVER "Don't build the server part of the library" OFF) 112option(LWS_WITHOUT_TESTAPPS "Don't build the libwebsocket-test-apps" ON) 113option(LWS_WITHOUT_TEST_SERVER "Don't build the test server" OFF) 114option(LWS_WITHOUT_TEST_SERVER_EXTPOLL "Don't build the test server version that uses external poll" OFF) 115option(LWS_WITHOUT_TEST_PING "Don't build the ping test application" OFF) 116option(LWS_WITHOUT_TEST_CLIENT "Don't build the client test application" OFF) 117# 118# Extensions (permessage-deflate) 119# 120option(LWS_WITHOUT_EXTENSIONS "Don't compile with extensions" ON) 121# 122# Helpers + misc 123# 124option(LWS_WITHOUT_BUILTIN_GETIFADDRS "Don't use the BSD getifaddrs implementation from libwebsockets if it is missing (this will result in a compilation error) ... The default is to assume that your libc provides it. On some systems such as uclibc it doesn't exist." OFF) 125option(LWS_FALLBACK_GETHOSTBYNAME "Also try to do dns resolution using gethostbyname if getaddrinfo fails" OFF) 126option(LWS_WITHOUT_BUILTIN_SHA1 "Don't build the lws sha-1 (eg, because openssl will provide it" OFF) 127option(LWS_WITHOUT_DAEMONIZE "Don't build the daemonization api" ON) 128option(LWS_SSL_SERVER_WITH_ECDH_CERT "Include SSL server use ECDH certificate" OFF) 129option(LWS_WITH_LEJP "With the Lightweight JSON Parser" ON) 130option(LWS_WITH_SQLITE3 "Require SQLITE3 support" OFF) 131option(LWS_WITH_STRUCT_JSON "Generic struct serialization to and from JSON" OFF) 132option(LWS_WITH_STRUCT_SQLITE3 "Generic struct serialization to and from SQLITE3" OFF) 133# broken atm 134#option(LWS_WITH_SMTP "Provide SMTP support" OFF) 135if (WIN32 OR LWS_WITH_ESP32) 136option(LWS_WITH_DIR "Directory scanning api support" OFF) 137option(LWS_WITH_LEJP_CONF "With LEJP configuration parser as used by lwsws" OFF) 138else() 139option(LWS_WITH_DIR "Directory scanning api support" ON) 140option(LWS_WITH_LEJP_CONF "With LEJP configuration parser as used by lwsws" ON) 141endif() 142option(LWS_WITH_NO_LOGS "Disable all logging from being compiled in" OFF) 143option(LWS_LOGS_TIMESTAMP "Timestamp at start of logs" ON) 144option(LWS_AVOID_SIGPIPE_IGN "Android 7+ reportedly needs this" OFF) 145option(LWS_WITH_STATS "Keep statistics of lws internal operations" OFF) 146option(LWS_WITH_JOSE "JSON Web Signature / Encryption / Keys (RFC7515/6/) API" OFF) 147option(LWS_WITH_GENCRYPTO "Enable support for Generic Crypto apis independent of TLS backend" OFF) 148option(LWS_WITH_SELFTESTS "Selftests run at context creation" OFF) 149option(LWS_WITH_GCOV "Build with gcc gcov coverage instrumentation" OFF) 150option(LWS_WITH_EXPORT_LWSTARGETS "Export libwebsockets CMake targets. Disable if they conflict with an outer cmake project." ON) 151option(LWS_REPRODUCIBLE "Build libwebsockets reproducible. It removes the build user and hostname from the build" ON) 152option(LWS_WITH_MINIMAL_EXAMPLES "Also build the normally standalone minimal examples, for QA" OFF) 153option(LWS_WITH_LWSAC "lwsac Chunk Allocation api" ON) 154option(LWS_WITH_CUSTOM_HEADERS "Store and allow querying custom HTTP headers (H1 only)" ON) 155option(LWS_WITH_DISKCACHE "Hashed cache directory with lazy LRU deletion to size limit" OFF) 156option(LWS_WITH_ASAN "Build with gcc runtime sanitizer options enabled (needs libasan)" OFF) 157option(LWS_WITH_DIR "Directory scanning api support" OFF) 158option(LWS_WITH_LEJP_CONF "With LEJP configuration parser as used by lwsws" OFF) 159option(LWS_WITH_ZLIB "Include zlib support (required for extensions)" OFF) 160option(LWS_WITH_BUNDLED_ZLIB "Use bundled zlib version (Windows only)" ${LWS_WITH_BUNDLED_ZLIB_DEFAULT}) 161option(LWS_WITH_MINIZ "Use miniz instead of zlib" OFF) 162option(LWS_WITH_DEPRECATED_LWS_DLL "Migrate to lws_dll2 instead ASAP" OFF) 163option(LWS_WITH_SEQUENCER "lws_seq_t support" ON) 164option(LWS_WITH_EXTERNAL_POLL "Support external POLL integration using callback messages (not recommended)" OFF) 165option(LWS_WITH_LWS_DSH "Support lws_dsh_t Disordered Shared Heap" OFF) 166option(LWS_CLIENT_HTTP_PROXYING "Support external http proxies for client connections" ON) 167option(LWS_WITH_FILE_OPS "Support file operations vfs" ON) 168option(LWS_WITH_DETAILED_LATENCY "Record detailed latency stats for each read and write" OFF) 169option(LWS_WITH_UDP "Platform supports UDP" ON) 170option(LWS_WITH_SPAWN "Spawn subprocesses with piped stdin/out/stderr" OFF) 171option(LWS_WITH_FSMOUNT "Overlayfs and fallback mounting apis" OFF) 172 173 174# 175# to use miniz, enable both LWS_WITH_ZLIB and LWS_WITH_MINIZ 176# 177# End of user settings 178# 179 180# Workaround for ESP-IDF 181# Detect ESP_PLATFORM environment flag, if exist, set LWS_WITH_ESP32. 182# Otherwise the user may not be able to run configuration ESP-IDF in the first time. 183if(ESP_PLATFORM) 184 message(STATUS "ESP-IDF enabled") 185 set(LWS_WITH_ESP32 ON) 186else() 187 set(LWS_WITH_ESP32_HELPER OFF) 188endif() 189 190if (LWS_WITH_ESP32) 191 set(LWS_PLAT_FREERTOS 1) 192endif() 193 194if (LWS_PLAT_FREERTOS OR LWS_PLAT_OPTEE) 195 set(LWS_WITH_UDP 0) 196endif() 197 198if (WIN32 OR LWS_PLAT_FREERTOS) 199 message(STATUS "No LWS_WITH_DIR or LWS_WITH_LEJP_CONF") 200 set(LWS_WITH_DIR OFF) 201 set(LWS_WITH_LEJP_CONF OFF) 202 message("LWS_WITH_DIR ${LWS_WITH_DIR}") 203else() 204 message(STATUS "Compiled with LWS_WITH_DIR and LWS_WITH_LEJP_CONF") 205 set(LWS_WITH_DIR ON) 206 set(LWS_WITH_LEJP_CONF ON) 207endif() 208 209if (LWS_FOR_GITOHASHI) 210 set(LWS_WITH_THREADPOOL 1) 211 set(LWS_WITH_HTTP2 1) 212 set(LWS_UNIX_SOCK 1) 213 set(LWS_WITH_HTTP_PROXY 1) 214 set(LWS_WITH_FTS 1) 215 set(LWS_WITH_DISKCACHE 1) 216 set(LWS_WITH_LWSAC 1) 217 set(LWS_WITH_LEJP_CONF 1) 218 set(LWS_WITH_SPAWN 1) 219 set(LWS_WITH_FSMOUNT 1) 220 set(LWS_WITH_STRUCT_JSON 1) 221 set(LWS_WITH_STRUCT_SQLITE3 1) 222endif() 223 224if(LWS_WITH_DISTRO_RECOMMENDED) 225 set(LWS_WITH_HTTP2 1) 226 set(LWS_WITH_LWSWS 1) 227 set(LWS_WITH_CGI 1) 228 set(LWS_IPV6 1) 229 set(LWS_WITH_ZIP_FOPS 1) 230 set(LWS_WITH_SOCKS5 1) 231 set(LWS_WITH_RANGES 1) 232 set(LWS_WITH_ACME 1) 233 set(LWS_WITH_SERVER_STATUS 1) 234 set(LWS_WITH_GLIB 1) 235 set(LWS_WITH_LIBUV 1) 236 set(LWS_WITH_LIBEV 1) 237 # libev + libevent cannot coexist at build-time 238 set(LWS_WITH_LIBEVENT 0) 239 set(LWS_WITHOUT_EXTENSIONS 0) 240 set(LWS_ROLE_DBUS 1) 241 set(LWS_WITH_FTS 1) 242 set(LWS_WITH_THREADPOOL 1) 243 set(LWS_UNIX_SOCK 1) 244 set(LWS_WITH_HTTP_PROXY 1) 245 set(LWS_WITH_DISKCACHE 1) 246 set(LWS_WITH_LWSAC 1) 247 set(LWS_WITH_LEJP_CONF 1) 248 set(LWS_WITH_PLUGINS 1) 249 set(LWS_ROLE_RAW_PROXY 1) 250 set(LWS_WITH_GENCRYPTO 1) 251 set(LWS_WITH_JOSE 1) 252 set(LWS_WITH_STRUCT_JSON 1) 253 set(LWS_WITH_STRUCT_SQLITE3 1) 254 set(LWS_WITH_SPAWN 1) 255 set(LWS_WITH_FSMOUNT 1) 256 set(LWS_ROLE_MQTT 1) 257endif() 258 259if (LWS_WITH_SECURE_STREAMS_PROXY_API) 260 set(LWS_WITH_LWS_DSH 1) 261 set(LWS_WITH_UNIX_SOCK 1) 262endif() 263 264if (NOT LWS_WITH_NETWORK) 265 set(LWS_ROLE_MQTT 0) 266 set(LWS_ROLE_H1 0) 267 set(LWS_ROLE_WS 0) 268 set(LWS_ROLE_RAW 0) 269 set(LWS_WITHOUT_EXTENSIONS 1) 270 set(LWS_WITHOUT_SERVER 1) 271 set(LWS_WITHOUT_CLIENT 1) 272 set(LWS_WITH_HTTP2 0) 273 set(LWS_WITH_SOCKS5 0) 274 set(LWS_UNIX_SOCK 0) 275 set(LWS_WITH_HTTP_PROXY 0) 276 set(LWS_WITH_PLUGINS 0) 277 set(LWS_WITH_LWSWS 0) 278 set(LWS_WITH_CGI 0) 279 set(LWS_ROLE_RAW_PROXY 0) 280 set(LWS_WITH_PEER_LIMITS 0) 281 set(LWS_WITH_GENERIC_SESSIONS 0) 282 set(LWS_WITH_HTTP_STREAM_COMPRESSION 0) 283 set(LWS_WITH_HTTP_BROTLI 0) 284 set(LWS_WITH_POLL 0) 285 set(LWS_WITH_SEQUENCER 0) 286 set(LWS_ROLE_DBUS 0) 287 set(LWS_WITH_LWS_DSH 0) 288 set(LWS_WITH_THREADPOOL 0) 289endif() 290 291if (LWS_WITH_CGI) 292 set(LWS_WITH_SPAWN 1) 293endif() 294 295if (LWS_WITH_STRUCT_SQLITE3) 296 set(LWS_WITH_SQLITE3 1) 297endif() 298 299# do you care about this? Then send me a patch where it disables it on travis 300# but allows it on APPLE 301if (APPLE) 302 set(LWS_ROLE_DBUS 0) 303endif() 304 305if(NOT DEFINED CMAKE_BUILD_TYPE) 306 set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type") 307endif() 308 309# microsoft... that's why you can't have nice things 310 311if (WIN32 OR LWS_PLAT_FREERTOS) 312 set(LWS_UNIX_SOCK 0) 313endif() 314 315if (LWS_PLAT_FREERTOS) 316 set(LWS_WITH_LWSAC 0) 317 set(LWS_WITH_FTS 0) 318endif() 319 320set(PACKAGE "libwebsockets") 321set(CPACK_PACKAGE_NAME "${PACKAGE}") 322set(CPACK_PACKAGE_VERSION_MAJOR "4") 323set(CPACK_PACKAGE_VERSION_MINOR "0") 324set(CPACK_PACKAGE_VERSION_PATCH "1") 325set(CPACK_PACKAGE_RELEASE 1) 326set(CPACK_GENERATOR "RPM") 327set(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}") 328set(CPACK_PACKAGE_VENDOR "andy@warmcat.com") 329set(CPACK_PACKAGE_CONTACT "andy@warmcat.com") 330set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${PACKAGE} ${PACKAGE_VERSION}") 331set(SOVERSION "16") 332if(NOT CPACK_GENERATOR) 333 if(UNIX) 334 set(CPACK_GENERATOR "TGZ") 335 else() 336 set(CPACK_GENERATOR "ZIP") 337 endif() 338endif() 339set(CPACK_SOURCE_GENERATOR "TGZ") 340set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}") 341set(VERSION "${CPACK_PACKAGE_VERSION}") 342 343set(LWS_LIBRARY_VERSION ${CPACK_PACKAGE_VERSION}) 344set(LWS_LIBRARY_VERSION_MAJOR ${CPACK_PACKAGE_VERSION_MAJOR}) 345set(LWS_LIBRARY_VERSION_MINOR ${CPACK_PACKAGE_VERSION_MINOR}) 346set(LWS_LIBRARY_VERSION_PATCH ${CPACK_PACKAGE_VERSION_PATCH}) 347 348set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake/") 349 350 351message(STATUS "CMAKE_TOOLCHAIN_FILE='${CMAKE_TOOLCHAIN_FILE}'") 352 353if(WIN32) 354 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/win32port/version.rc.in ${CMAKE_CURRENT_BINARY_DIR}/win32port/version.rc @ONLY) 355 set(RESOURCES ${CMAKE_CURRENT_BINARY_DIR}/win32port/version.rc) 356endif() 357 358# Try to find the current Git hash. 359find_package(Git) 360if(GIT_EXECUTABLE) 361 execute_process( 362 WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" 363 COMMAND "${GIT_EXECUTABLE}" describe --tags 364 OUTPUT_VARIABLE GIT_HASH 365 OUTPUT_STRIP_TRAILING_WHITESPACE 366 ) 367 set(LWS_BUILD_HASH ${GIT_HASH}) 368 369 # append the build user and hostname 370 if(NOT LWS_REPRODUCIBLE) 371 execute_process( 372 WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" 373 COMMAND "whoami" 374 OUTPUT_VARIABLE GIT_USER 375 OUTPUT_STRIP_TRAILING_WHITESPACE 376 ) 377 execute_process( 378 WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" 379 COMMAND "hostname" 380 OUTPUT_VARIABLE GIT_HOST 381 OUTPUT_STRIP_TRAILING_WHITESPACE 382 ) 383 string(REGEX REPLACE "([^\\])[\\]([^\\])" "\\1\\\\\\\\\\2" GIT_USER ${GIT_USER}) 384 set(LWS_BUILD_HASH ${GIT_USER}@${GIT_HOST}-${GIT_HASH}) 385 endif() 386 387 message("Git commit hash: ${LWS_BUILD_HASH}") 388endif() 389 390# translate old functionality enables to set up ROLE enables so nothing changes 391if (LWS_WITH_HTTP2 AND LWS_WITHOUT_SERVER) 392 set(LWS_WITH_HTTP2 0) 393 message("HTTP2 disabled due to LWS_WITHOUT_SERVER") 394endif() 395 396if (LWS_WITH_HTTP2) 397 set(LWS_ROLE_H2 1) 398endif() 399if (LWS_WITH_CGI) 400 set(LWS_ROLE_CGI 1) 401endif() 402 403if (NOT LWS_ROLE_WS) 404 set(LWS_WITHOUT_EXTENSIONS 1) 405endif() 406 407if (LWS_WITH_MBEDTLS) 408 include_directories(lib/tls/mbedtls/wrapper/include) 409endif() 410 411include_directories(include plugins lib/core lib/core-net lib/event-libs include/abstract lib/tls lib/roles lib/event-libs/libuv lib/event-libs/poll lib/event-libs/libevent lib/event-libs/glib lib/event-libs/libev lib/jose/jwe lib/jose/jws lib/jose lib/misc lib/roles/http lib/roles/http/compression lib/roles/h1 lib/roles/h2 lib/roles/ws lib/roles/cgi lib/roles/dbus lib/roles/raw-proxy lib/abstract lib/system/async-dns lib/roles/mqtt) 412 413if (LWS_WITH_SECURE_STREAMS) 414 set(LWS_WITH_SECURE_STREAMS_SYS_AUTH_API_AMAZON_COM 1) 415endif() 416 417if (LWS_PLAT_FREERTOS) 418 include_directories(lib/plat/freertos lib/plat/freertos/esp32) 419else() 420 if (WIN32) 421 include_directories(lib/plat/windows) 422 else() 423 if (LWS_WITH_OPTEE) 424 include_directories(lib/plat/optee) 425 else() 426 include_directories(lib/plat/unix) 427 endif() 428 endif() 429endif() 430 431 432if (LWS_WITH_LWSWS) 433 message(STATUS "LWS_WITH_LWSWS --> Enabling LWS_WITH_PLUGINS and LWS_WITH_LIBUV") 434 set(LWS_WITH_PLUGINS 1) 435 set(LWS_WITH_LIBUV 1) 436 set(LWS_WITH_ACCESS_LOG 1) 437 set(LWS_WITH_SERVER_STATUS 1) 438 set(LWS_WITH_LEJP 1) 439 set(LWS_WITH_LEJP_CONF 1) 440 set(LWS_WITH_PEER_LIMITS 1) 441 set(LWS_ROLE_RAW_PROXY 1) 442endif() 443 444# sshd plugin 445if (LWS_WITH_PLUGINS) 446 set(LWS_WITH_GENCRYPTO 1) 447endif() 448 449if (LWS_ROLE_RAW_PROXY) 450 set (LWS_WITH_CLIENT 1) 451 set (LWS_WITH_SERVER 1) 452endif() 453 454if (LWS_WITH_ACME) 455 set (LWS_WITH_CLIENT 1) 456 set (LWS_WITH_SERVER 1) 457 set (LWS_WITH_JOSE 1) 458endif() 459 460if (LWS_WITH_JOSE) 461 set(LWS_WITH_LEJP 1) 462 set(LWS_WITH_GENCRYPTO 1) 463endif() 464 465if (LWS_WITH_PLUGINS AND NOT LWS_WITH_LIBUV) 466message(STATUS "LWS_WITH_PLUGINS --> Enabling LWS_WITH_LIBUV") 467 set(LWS_WITH_LIBUV 1) 468endif() 469 470if (LWS_WITH_PLUGINS OR LWS_WITH_CGI) 471 # sshd plugin 472 set(LWS_WITH_GENCRYPTO 1) 473endif() 474 475if (LWS_WITH_GENERIC_SESSIONS) 476 set(LWS_WITH_SQLITE3 1) 477 # set(LWS_WITH_SMTP 1) 478 set(LWS_WITH_STRUCT_SQLITE3 1) 479endif() 480 481if (LWS_PLAT_FREERTOS) 482 set(LWS_WITH_SHARED OFF) 483 set(LWS_WITH_MBEDTLS ON) 484 # set(LWS_WITHOUT_CLIENT ON) 485 set(LWS_WITHOUT_TESTAPPS ON) 486 set(LWS_WITHOUT_EXTENSIONS ON) 487 set(LWS_WITH_PLUGINS OFF) 488 set(LWS_WITH_RANGES ON) 489 # this implies no pthreads in the lib 490 set(LWS_MAX_SMP 1) 491 set(LWS_HAVE_MALLOC 1) 492 set(LWS_HAVE_REALLOC 1) 493 set(LWS_HAVE_GETIFADDRS 1) 494 set(LWS_WITH_CUSTOM_HEADERS 0) 495endif() 496 497if (LWS_WITH_ESP32) 498 set(LWS_WITH_ZIP_FOPS 1) 499endif() 500 501if (WIN32) 502set(LWS_MAX_SMP 1) 503set(LWS_WITH_THREADPOOL 0) 504endif() 505 506if (LWS_WITHOUT_SERVER) 507set(LWS_WITH_LWSWS OFF) 508endif() 509 510if (LWS_WITH_LEJP_CONF) 511 set(LWS_WITH_DIR 1) 512endif() 513 514# confirm H1 relationships 515 516if (NOT LWS_ROLE_H1 AND LWS_ROLE_H2) 517 message(FATAL_ERROR "H2 requires LWS_ROLE_H1") 518endif() 519 520if (NOT LWS_ROLE_H1 AND LWS_ROLE_WS) 521 message(FATAL_ERROR "WS requires LWS_ROLE_H1") 522endif() 523 524if (NOT LWS_ROLE_H1 AND LWS_ROLE_CGI) 525 message(FATAL_ERROR "CGI requires LWS_ROLE_H1") 526endif() 527 528# confirm HTTP relationships 529 530if (NOT LWS_ROLE_H1 AND NOT LWS_ROLE_H2 AND LWS_WITH_HTTP_PROXY) 531 message(FATAL_ERROR "LWS_WITH_LWSWS requires LWS_ROLE_H1") 532endif() 533 534if (NOT LWS_ROLE_H1 AND NOT LWS_ROLE_H2 AND LWS_WITH_HTTP_PROXY) 535 message(FATAL_ERROR "LWS_WITH_HTTP_PROXY requires LWS_ROLE_H1") 536endif() 537 538if (NOT LWS_ROLE_H1 AND NOT LWS_ROLE_H2 AND LWS_WITH_RANGES) 539 message(FATAL_ERROR "LWS_WITH_RANGES requires LWS_ROLE_H1") 540endif() 541 542if (NOT LWS_ROLE_H1 AND NOT LWS_ROLE_H2 AND LWS_WITH_ACCESS_LOG) 543 message(FATAL_ERROR "LWS_WITH_ACCESS_LOG requires LWS_ROLE_H1") 544endif() 545 546 547if (LWS_WITH_HTTP_PROXY AND (LWS_WITHOUT_CLIENT OR LWS_WITHOUT_SERVER)) 548 message("You have to enable both client and server for http proxy") 549 set(LWS_WITH_HTTP_PROXY 0) 550endif() 551 552# Allow the user to override installation directories. 553set(LWS_INSTALL_LIB_DIR lib CACHE PATH "Installation directory for libraries") 554set(LWS_INSTALL_BIN_DIR bin CACHE PATH "Installation directory for executables") 555set(LWS_INSTALL_INCLUDE_DIR include CACHE PATH "Installation directory for header files") 556set(LWS_INSTALL_EXAMPLES_DIR bin CACHE PATH "Installation directory for example files") 557 558# Allow the user to use the old CyaSSL options/library in stead of wolfSSL 559if (LWS_WITH_CYASSL AND LWS_WITH_WOLFSSL) 560 message(FATAL_ERROR "LWS_WITH_CYASSL and LWS_WITH_WOLFSSL are mutually exclusive!") 561endif() 562if (LWS_WITH_CYASSL) 563 # Copy CyaSSL options to the wolfSSL options 564 set(LWS_WITH_WOLFSSL ${LWS_WITH_CYASSL} CACHE BOOL "Use wolfSSL/CyaSSL instead of OpenSSL" FORCE) 565 set(LWS_WOLFSSL_LIBRARIES ${LWS_CYASSL_LIBRARIES} CACHE PATH "Path to wolfSSL/CyaSSL libraries" FORCE) 566 set(LWS_WOLFSSL_INCLUDE_DIRS ${LWS_CYASSL_INCLUDE_DIRS} CACHE PATH "Path to wolfSSL/CyaSSL header files" FORCE) 567endif() 568 569if (NOT (LWS_WITH_STATIC OR LWS_WITH_SHARED)) 570 message(FATAL_ERROR "Makes no sense to compile with neither static nor shared libraries.") 571endif() 572 573if (NOT LWS_WITHOUT_EXTENSIONS OR LWS_WITH_ZIP_FOPS) 574 set(LWS_WITH_ZLIB 1) 575endif() 576 577# if you gave LWS_WITH_MINIZ, point to MINIZ here if not found 578# automatically 579 580set(LWS_ZLIB_LIBRARIES CACHE PATH "Path to the zlib/miniz library") 581set(LWS_ZLIB_INCLUDE_DIRS CACHE PATH "Path to the zlib/miniz include directory") 582set(LWS_OPENSSL_LIBRARIES CACHE PATH "Path to the OpenSSL library") 583set(LWS_OPENSSL_INCLUDE_DIRS CACHE PATH "Path to the OpenSSL include directory") 584set(LWS_WOLFSSL_LIBRARIES CACHE PATH "Path to the wolfSSL library") 585set(LWS_WOLFSSL_INCLUDE_DIRS CACHE PATH "Path to the wolfSSL include directory") 586set(LWS_LIBEV_LIBRARIES CACHE PATH "Path to the libev library") 587set(LWS_LIBEV_INCLUDE_DIRS CACHE PATH "Path to the libev include directory") 588set(LWS_LIBUV_LIBRARIES CACHE PATH "Path to the libuv library") 589set(LWS_LIBUV_INCLUDE_DIRS CACHE PATH "Path to the libuv include directory") 590set(LWS_SQLITE3_LIBRARIES CACHE PATH "Path to the sqlite3 library") 591set(LWS_SQLITE3_INCLUDE_DIRS CACHE PATH "Path to the sqlite3 include directory") 592set(LWS_LIBEVENT_INCLUDE_DIRS CACHE PATH "Path to the libevent include directory") 593set(LWS_LIBEVENT_LIBRARIES CACHE PATH "Path to the libevent library") 594set(LWS_GLIB_INCLUDE_DIRS CACHE PATH "Path to the glib include directory") 595set(LWS_GLIB_LIBRARIES CACHE PATH "Path to the glib library") 596set(LWS_LIBMOUNT_INCLUDE_DIRS CACHE PATH "Path to the libmount include directory") 597set(LWS_LIBMOUNT_LIBRARIES CACHE PATH "Path to the libmount library") 598 599 600if (NOT LWS_WITH_SSL) 601 set(LWS_WITHOUT_BUILTIN_SHA1 OFF) 602endif() 603 604if (LWS_WITH_BORINGSSL) 605 # boringssl deprecated EVP_PKEY 606 set (LWS_WITH_GENHASH OFF) 607endif() 608 609if (LWS_WITH_SSL AND NOT LWS_WITH_WOLFSSL AND NOT LWS_WITH_MBEDTLS) 610 if ("${LWS_OPENSSL_LIBRARIES}" STREQUAL "" OR "${LWS_OPENSSL_INCLUDE_DIRS}" STREQUAL "") 611 else() 612 if (NOT LWS_PLAT_FREERTOS) 613 set(OPENSSL_LIBRARIES ${LWS_OPENSSL_LIBRARIES}) 614 endif() 615 set(OPENSSL_INCLUDE_DIRS ${LWS_OPENSSL_INCLUDE_DIRS}) 616 set(OPENSSL_FOUND 1) 617 endif() 618endif() 619 620if (LWS_WITH_SSL AND LWS_WITH_WOLFSSL) 621 if ("${LWS_WOLFSSL_LIBRARIES}" STREQUAL "" OR "${LWS_WOLFSSL_INCLUDE_DIRS}" STREQUAL "") 622 if (NOT WOLFSSL_FOUND) 623 if (LWS_WITH_CYASSL) 624 message(FATAL_ERROR "You must set LWS_CYASSL_LIBRARIES and LWS_CYASSL_INCLUDE_DIRS when LWS_WITH_CYASSL is turned on.") 625 else() 626 message(FATAL_ERROR "You must set LWS_WOLFSSL_LIBRARIES and LWS_WOLFSSL_INCLUDE_DIRS when LWS_WITH_WOLFSSL is turned on.") 627 endif() 628 endif() 629 else() 630 set(WOLFSSL_LIBRARIES ${LWS_WOLFSSL_LIBRARIES}) 631 set(WOLFSSL_INCLUDE_DIRS ${LWS_WOLFSSL_INCLUDE_DIRS}) 632 set(WOLFSSL_FOUND 1) 633 endif() 634 set(USE_WOLFSSL 1) 635 set(LWS_WITH_TLS 1) 636 if (LWS_WITH_CYASSL) 637 set(USE_OLD_CYASSL 1) 638 endif() 639endif() 640 641if (LWS_WITH_SSL AND LWS_WITH_MBEDTLS) 642 if ("${LWS_MBEDTLS_LIBRARIES}" STREQUAL "" OR "${LWS_MBEDTLS_INCLUDE_DIRS}" STREQUAL "" AND NOT LWS_PLAT_FREERTOS) 643 644 find_path(LWS_MBEDTLS_INCLUDE_DIRS mbedtls/ssl.h) 645 646 find_library(MBEDTLS_LIBRARY mbedtls) 647 find_library(MBEDX509_LIBRARY mbedx509) 648 find_library(MBEDCRYPTO_LIBRARY mbedcrypto) 649 650 set(LWS_MBEDTLS_LIBRARIES "${MBEDTLS_LIBRARY}" "${MBEDX509_LIBRARY}" "${MBEDCRYPTO_LIBRARY}") 651 652 include(FindPackageHandleStandardArgs) 653 find_package_handle_standard_args(MBEDTLS DEFAULT_MSG 654 LWS_MBEDTLS_INCLUDE_DIRS MBEDTLS_LIBRARY MBEDX509_LIBRARY MBEDCRYPTO_LIBRARY) 655 656 mark_as_advanced(LWS_MBEDTLS_INCLUDE_DIRS MBEDTLS_LIBRARY MBEDX509_LIBRARY MBEDCRYPTO_LIBRARY) 657 658 if ("${LWS_MBEDTLS_LIBRARIES}" STREQUAL "" OR "${LWS_MBEDTLS_INCLUDE_DIRS}" STREQUAL "") 659 message(FATAL_ERROR "You must set LWS_MBEDTLS_LIBRARIES and LWS_MBEDTLS_INCLUDE_DIRS when LWS_WITH_MBEDTLS is turned on.") 660 endif() 661 endif() 662 set(MBEDTLS_LIBRARIES ${LWS_MBEDTLS_LIBRARIES}) 663 set(MBEDTLS_INCLUDE_DIRS ${LWS_MBEDTLS_INCLUDE_DIRS}) 664 set(MBEDTLS_FOUND 1) 665 set(USE_MBEDTLS 1) 666endif() 667 668if (LWS_WITH_HTTP_STREAM_COMPRESSION) 669 set(LWS_WITH_ZLIB 1) 670endif() 671 672if (LWS_WITH_FSMOUNT AND ${CMAKE_SYSTEM_NAME} STREQUAL "Linux") 673 if ("${LWS_LIBMOUNT_LIBRARIES}" STREQUAL "" OR "${LWS_LIBMOUNT_INCLUDE_DIRS}" STREQUAL "") 674 675 # libmount paths (this is only on Linux) 676 # 677 find_path( LIBMOUNT_INC_PATH NAMES "libmount/libmount.h") 678 find_library(LIBMOUNT_LIB_PATH NAMES "mount") 679 else() 680 set(LIBMOUNT_INC_PATH ${LWS_LIBMOUNT_INCLUDE_DIRS}) 681 set(LIBMOUNT_LIB_PATH ${LWS_LIBMOUNT_LIBRARIES}) 682 endif() 683 684 if (NOT LIBMOUNT_INC_PATH OR NOT LIBMOUNT_LIB_PATH) 685 message(FATAL_ERROR " Unable to find libmount") 686 endif() 687endif() 688 689if (LWS_WITH_ZLIB AND NOT LWS_WITH_BUNDLED_ZLIB) 690 if ("${LWS_ZLIB_LIBRARIES}" STREQUAL "" OR "${LWS_ZLIB_INCLUDE_DIRS}" STREQUAL "") 691 else() 692 set(ZLIB_LIBRARIES ${LWS_ZLIB_LIBRARIES}) 693 set(ZLIB_INCLUDE_DIRS ${LWS_ZLIB_INCLUDE_DIRS}) 694 set(ZLIB_FOUND 1) 695 endif() 696endif() 697 698if (LWS_WITH_LIBEV) 699 if ("${LWS_LIBEV_LIBRARIES}" STREQUAL "" OR "${LWS_LIBEV_INCLUDE_DIRS}" STREQUAL "") 700 else() 701 set(LIBEV_LIBRARIES ${LWS_LIBEV_LIBRARIES}) 702 set(LIBEV_INCLUDE_DIRS ${LWS_LIBEV_INCLUDE_DIRS}) 703 set(LIBEV_FOUND 1) 704 endif() 705endif() 706 707if (LWS_WITH_LIBUV) 708 if ("${LWS_LIBUV_LIBRARIES}" STREQUAL "" OR "${LWS_LIBUV_INCLUDE_DIRS}" STREQUAL "") 709 else() 710 set(LIBUV_LIBRARIES ${LWS_LIBUV_LIBRARIES}) 711 set(LIBUV_INCLUDE_DIRS ${LWS_LIBUV_INCLUDE_DIRS}) 712 set(LIBUV_FOUND 1) 713 endif() 714endif() 715 716if (LWS_WITH_LIBEVENT) 717 if ("${LWS_LIBEVENT_LIBRARIES}" STREQUAL "" OR "${LWS_LIBEVENT_INCLUDE_DIRS}" STREQUAL "") 718 else() 719 set(LIBEVENT_LIBRARIES ${LWS_LIBEVENT_LIBRARIES}) 720 set(LIBEVENT_INCLUDE_DIRS ${LWS_LIBEVENT_INCLUDE_DIRS}) 721 set(LIBEVENT_FOUND 1) 722 endif() 723endif() 724 725if (LWS_WITH_GLIB) 726 if ("${LWS_GLIB_LIBRARIES}" STREQUAL "" OR "${LWS_GLIB_INCLUDE_DIRS}" STREQUAL "") 727 else() 728 set(LIBGLIB_LIBRARIES ${LWS_GLIB_LIBRARIES}) 729 set(LIBGLIB_INCLUDE_DIRS ${LWS_GLIB_INCLUDE_DIRS}) 730 set(LIBGLIB_FOUND 1) 731 endif() 732endif() 733 734if (LWS_WITH_SQLITE3) 735 if ("${LWS_SQLITE3_LIBRARIES}" STREQUAL "" OR "${LWS_SQLITE3_INCLUDE_DIRS}" STREQUAL "") 736 else() 737 set(SQLITE3_LIBRARIES ${LWS_SQLITE3_LIBRARIES}) 738 set(SQLITE3_INCLUDE_DIRS ${LWS_SQLITE3_INCLUDE_DIRS}) 739 set(SQLITE3_FOUND 1) 740 endif() 741endif() 742 743 744if (LWS_WITH_LIBEV AND LWS_WITH_LIBEVENT) 745 message(FATAL_ERROR "Sorry libev and libevent conflict with each others' namespace, you can only have one or the other") 746endif() 747 748# The base dir where the test-apps look for the SSL certs. 749set(LWS_OPENSSL_CLIENT_CERTS ../share CACHE PATH "Server SSL certificate directory") 750if (WIN32) 751 set(LWS_OPENSSL_CLIENT_CERTS . CACHE PATH "Client SSL certificate directory") 752 753 if (LWS_UNIX_SOCK) 754 set(LWS_UNIX_SOCK OFF) 755 message(WARNING "Windows does not support UNIX domain sockets") 756 endif() 757else() 758 set(LWS_OPENSSL_CLIENT_CERTS /etc/pki/tls/certs/ CACHE PATH "Client SSL certificate directory") 759endif() 760 761# LWS_OPENSSL_SUPPORT deprecated... use LWS_WITH_TLS 762if (LWS_WITH_SSL OR LWS_WITH_MBEDTLS) 763 set(LWS_OPENSSL_SUPPORT 1) 764 set(LWS_WITH_TLS 1) 765endif() 766 767if (LWS_SSL_CLIENT_USE_OS_CA_CERTS) 768 set(LWS_SSL_CLIENT_USE_OS_CA_CERTS 1) 769endif() 770 771if (LWS_WITHOUT_DAEMONIZE OR WIN32) 772 set(LWS_NO_DAEMONIZE 1) 773endif() 774 775if (LWS_WITH_LIBEV) 776 set(LWS_WITH_LIBEV 1) 777endif() 778 779if (LWS_WITH_LIBUV) 780 set(LWS_WITH_LIBUV 1) 781endif() 782 783if (LWS_WITH_LIBEVENT) 784 set(LWS_WITH_LIBEVENT 1) 785endif() 786 787if (LWS_IPV6) 788 set(LWS_WITH_IPV6 1) 789endif() 790 791if (LWS_UNIX_SOCK) 792 set(LWS_WITH_UNIX_SOCK 1) 793endif() 794 795if (LWS_WITH_HTTP2) 796 set(LWS_WITH_HTTP2 1) 797endif() 798 799if ("${LWS_MAX_SMP}" STREQUAL "") 800 set(LWS_MAX_SMP 1) 801endif() 802 803set(LWS_WITH_CLIENT 1) 804if (LWS_WITHOUT_CLIENT) 805 set(LWS_WITH_CLIENT) 806endif() 807set(LWS_WITH_SERVER 1) 808if (LWS_WITHOUT_SERVER) 809 set(LWS_WITH_SERVER) 810endif() 811 812# using any abstract protocol enables LWS_WITH_ABSTRACT 813 814#if (LWS_WITH_SMTP) 815# set(LWS_WITH_ABSTRACT 1) 816#endif() 817 818 819 820if (MINGW) 821 set(LWS_MINGW_SUPPORT 1) 822 set(CMAKE_C_FLAGS "-D__USE_MINGW_ANSI_STDIO ${CMAKE_C_FLAGS}") 823 add_definitions(-DWINVER=0x0601 -D_WIN32_WINNT=0x0601) 824endif() 825 826if (LWS_SSL_SERVER_WITH_ECDH_CERT) 827 set(LWS_SSL_SERVER_WITH_ECDH_CERT 1) 828endif() 829 830include_directories("${PROJECT_BINARY_DIR}") 831 832include(CheckCSourceCompiles) 833 834# Check for different inline keyword versions. 835foreach(KEYWORD "inline" "__inline__" "__inline") 836 set(CMAKE_REQUIRED_DEFINITIONS "-DKEYWORD=${KEYWORD}") 837 CHECK_C_SOURCE_COMPILES( 838 " 839 #include <stdio.h> 840 static KEYWORD void a() {} 841 int main(int argc, char **argv) { a(); return 0; } 842 " LWS_HAVE_${KEYWORD}) 843endforeach() 844 845if (NOT LWS_HAVE_inline) 846 if (LWS_HAVE___inline__) 847 set(inline __inline__) 848 elseif(LWS_HAVE___inline) 849 set(inline __inline) 850 endif() 851endif() 852 853# Put the libraries and binaries that get built into directories at the 854# top of the build tree rather than in hard-to-find leaf directories. 855SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin") 856SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib") 857SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib") 858 859SET(LWS_INSTALL_PATH "${CMAKE_INSTALL_PREFIX}") 860 861# Put absolute path of dynamic libraries into the object code. Some 862# architectures, notably Mac OS X, need this. 863SET(CMAKE_INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/${LWS_INSTALL_LIB_DIR}${LIB_SUFFIX}") 864 865include(CheckFunctionExists) 866include(CheckSymbolExists) 867include(CheckIncludeFile) 868include(CheckIncludeFiles) 869include(CheckLibraryExists) 870include(CheckTypeSize) 871include(CheckCSourceCompiles) 872 873if (LWS_WITHOUT_BUILTIN_SHA1) 874 set(LWS_SHA1_USE_OPENSSL_NAME 1) 875endif() 876 877if (HAIKU) 878 set(CMAKE_REQUIRED_LIBRARIES network) 879endif() 880 881CHECK_C_SOURCE_COMPILES( 882 "#include <malloc.h> 883 int main(int argc, char **argv) { return malloc_trim(0); } 884 " LWS_HAVE_MALLOC_TRIM) 885CHECK_C_SOURCE_COMPILES( 886 "#include <malloc.h> 887 int main(int argc, char **argv) { return (int)malloc_usable_size((void *)0); } 888 " LWS_HAVE_MALLOC_USABLE_SIZE) 889 890CHECK_FUNCTION_EXISTS(fork LWS_HAVE_FORK) 891CHECK_FUNCTION_EXISTS(getenv LWS_HAVE_GETENV) 892CHECK_FUNCTION_EXISTS(malloc LWS_HAVE_MALLOC) 893CHECK_FUNCTION_EXISTS(memset LWS_HAVE_MEMSET) 894CHECK_FUNCTION_EXISTS(realloc LWS_HAVE_REALLOC) 895CHECK_FUNCTION_EXISTS(socket LWS_HAVE_SOCKET) 896CHECK_FUNCTION_EXISTS(strerror LWS_HAVE_STRERROR) 897CHECK_FUNCTION_EXISTS(vfork LWS_HAVE_VFORK) 898CHECK_FUNCTION_EXISTS(execvpe LWS_HAVE_EXECVPE) 899CHECK_FUNCTION_EXISTS(getifaddrs LWS_HAVE_GETIFADDRS) 900CHECK_FUNCTION_EXISTS(snprintf LWS_HAVE_SNPRINTF) 901CHECK_FUNCTION_EXISTS(_snprintf LWS_HAVE__SNPRINTF) 902CHECK_FUNCTION_EXISTS(_vsnprintf LWS_HAVE__VSNPRINTF) 903CHECK_FUNCTION_EXISTS(getloadavg LWS_HAVE_GETLOADAVG) 904CHECK_FUNCTION_EXISTS(atoll LWS_HAVE_ATOLL) 905CHECK_FUNCTION_EXISTS(_atoi64 LWS_HAVE__ATOI64) 906CHECK_FUNCTION_EXISTS(_stat32i64 LWS_HAVE__STAT32I64) 907CHECK_FUNCTION_EXISTS(clock_gettime LWS_HAVE_CLOCK_GETTIME) 908CHECK_FUNCTION_EXISTS(eventfd LWS_HAVE_EVENTFD) 909 910if (NOT LWS_HAVE_GETIFADDRS) 911 if (LWS_WITHOUT_BUILTIN_GETIFADDRS) 912 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.") 913 endif() 914 set(LWS_BUILTIN_GETIFADDRS 1) 915endif() 916 917CHECK_INCLUDE_FILE(dlfcn.h LWS_HAVE_DLFCN_H) 918CHECK_INCLUDE_FILE(fcntl.h LWS_HAVE_FCNTL_H) 919CHECK_INCLUDE_FILE(in6addr.h LWS_HAVE_IN6ADDR_H) 920CHECK_INCLUDE_FILE(memory.h LWS_HAVE_MEMORY_H) 921CHECK_INCLUDE_FILE(netinet/in.h LWS_HAVE_NETINET_IN_H) 922CHECK_INCLUDE_FILE(stdint.h LWS_HAVE_STDINT_H) 923CHECK_INCLUDE_FILE(stdlib.h LWS_HAVE_STDLIB_H) 924CHECK_INCLUDE_FILE(strings.h LWS_HAVE_STRINGS_H) 925CHECK_INCLUDE_FILE(string.h LWS_HAVE_STRING_H) 926CHECK_INCLUDE_FILE(sys/prctl.h LWS_HAVE_SYS_PRCTL_H) 927CHECK_INCLUDE_FILE(sys/socket.h LWS_HAVE_SYS_SOCKET_H) 928CHECK_INCLUDE_FILE(sys/sockio.h LWS_HAVE_SYS_SOCKIO_H) 929CHECK_INCLUDE_FILE(sys/stat.h LWS_HAVE_SYS_STAT_H) 930CHECK_INCLUDE_FILE(sys/types.h LWS_HAVE_SYS_TYPES_H) 931CHECK_INCLUDE_FILE(unistd.h LWS_HAVE_UNISTD_H) 932CHECK_INCLUDE_FILE(vfork.h LWS_HAVE_VFORK_H) 933CHECK_INCLUDE_FILE(sys/capability.h LWS_HAVE_SYS_CAPABILITY_H) 934CHECK_INCLUDE_FILE(malloc.h LWS_HAVE_MALLOC_H) 935CHECK_INCLUDE_FILE(pthread.h LWS_HAVE_PTHREAD_H) 936CHECK_INCLUDE_FILE(inttypes.h LWS_HAVE_INTTYPES_H) 937 938CHECK_LIBRARY_EXISTS(cap cap_set_flag "" LWS_HAVE_LIBCAP) 939 940if (LWS_ROLE_DBUS) 941 942 if (NOT LWS_DBUS_LIB) 943 set(LWS_DBUS_LIB "dbus-1") 944 endif() 945 946 CHECK_LIBRARY_EXISTS(${LWS_DBUS_LIB} dbus_connection_set_watch_functions "" LWS_HAVE_LIBDBUS) 947 if (NOT LWS_HAVE_LIBDBUS) 948 message(FATAL_ERROR "Install dbus-devel, or libdbus-1-dev etc") 949 endif() 950 951 if (NOT LWS_DBUS_INCLUDE1) 952 # look in fedora and debian / ubuntu place 953 if (EXISTS "/usr/include/dbus-1.0") 954 set(LWS_DBUS_INCLUDE1 "/usr/include/dbus-1.0") 955 else() 956 message(FATAL_ERROR "Set LWS_DBUS_INCLUDE1 to /usr/include/dbus-1.0 or wherever the main dbus includes are") 957 endif() 958 endif() 959 960 if (NOT LWS_DBUS_INCLUDE2) 961 # look in fedora... debian / ubuntu has the ARCH in the path... 962 if (EXISTS "/usr/lib64/dbus-1.0/include") 963 set(LWS_DBUS_INCLUDE2 "/usr/lib64/dbus-1.0/include") 964 else() 965 message(FATAL_ERROR "Set LWS_DBUS_INCLUDE2 to /usr/lib/ARCH-linux-gnu/dbus-1.0/include or wherever dbus-arch-deps.h is on your system") 966 endif() 967 endif() 968 969 set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES};${LWS_DBUS_INCLUDE1};${LWS_DBUS_INCLUDE2}) 970 971 CHECK_C_SOURCE_COMPILES("#include <dbus/dbus.h> 972 int main(void) { 973 return 0; 974 }" LWS_DBUS_CHECK_OK) 975endif() 976 977if (LWS_WITH_LIBUV) 978CHECK_INCLUDE_FILE(uv-version.h LWS_HAVE_UV_VERSION_H) 979 # libuv changed the location in 1.21.0. Retain both 980 # checks temporarily to ensure a smooth transition. 981 if (NOT LWS_HAVE_UV_VERSION_H) 982 CHECK_INCLUDE_FILE(uv/version.h LWS_HAVE_NEW_UV_VERSION_H) 983 endif() 984endif() 985 986if (LWS_WITH_LIBEV) 987 CHECK_C_SOURCE_COMPILES( 988 "#include <ev.h> 989 int main(int argc, char **argv) { return EVBACKEND_LINUXAIO; } 990 " LWS_HAVE_EVBACKEND_LINUXAIO) 991 CHECK_C_SOURCE_COMPILES( 992 "#include <ev.h> 993 int main(int argc, char **argv) { return EVBACKEND_IOURING; } 994 " LWS_HAVE_EVBACKEND_IOURING) 995 996endif() 997 998 999if (LWS_WITH_ZLIB AND NOT LWS_WITH_BUNDLED_ZLIB) 1000 if (LWS_WITH_MINIZ) 1001 CHECK_INCLUDE_FILE(miniz.h LWS_HAVE_ZLIB_H) 1002 else() 1003 CHECK_INCLUDE_FILE(zlib.h LWS_HAVE_ZLIB_H) 1004 endif() 1005endif() 1006 1007# TODO: These can also be tested to see whether they actually work... 1008set(LWS_HAVE_WORKING_FORK LWS_HAVE_FORK) 1009set(LWS_HAVE_WORKING_VFORK LWS_HAVE_VFORK) 1010 1011CHECK_INCLUDE_FILES("stdlib.h;stdarg.h;string.h;float.h" STDC_HEADERS) 1012 1013CHECK_C_SOURCE_COMPILES("#include <stdint.h> 1014 int main(void) { 1015 intptr_t test = 1; 1016 return 0; 1017 }" LWS_HAS_INTPTR_T) 1018 1019if (LWS_HAVE_PTHREAD_H) 1020 if ((CMAKE_C_COMPILER_ID MATCHES "Clang") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang")) 1021 set(CMAKE_REQUIRED_FLAGS "-pthread -Wno-error=unused-command-line-argument") 1022 else() 1023 set(CMAKE_REQUIRED_FLAGS "-pthread") 1024 endif() 1025 1026 CHECK_C_SOURCE_COMPILES("#define _GNU_SOURCE 1027 #include <pthread.h> 1028 int main(void) { 1029 pthread_t th = 0; 1030 pthread_setname_np(th, NULL); 1031 return 0; 1032 }" LWS_HAS_PTHREAD_SETNAME_NP) 1033endif() 1034 1035CHECK_C_SOURCE_COMPILES("#include <stddef.h> 1036 #include <getopt.h> 1037 int main(void) { 1038 void *p = (void *)getopt_long; 1039 return p != NULL; 1040 }" LWS_HAS_GETOPT_LONG) 1041 1042 1043if (NOT PID_T_SIZE) 1044 set(pid_t int) 1045endif() 1046 1047if (NOT SIZE_T_SIZE) 1048 set(size_t "unsigned int") 1049endif() 1050 1051if (NOT LWS_HAVE_MALLOC) 1052 set(malloc rpl_malloc) 1053endif() 1054 1055if (NOT LWS_HAVE_REALLOC) 1056 set(realloc rpl_realloc) 1057endif() 1058 1059if (UNIX) 1060 execute_process( COMMAND grep -c illumos /lib/ld.so.1 1061 OUTPUT_VARIABLE ILLUMOS ERROR_QUIET ) 1062 # Chomp the \n at end of output. 1063 string(REGEX REPLACE "[\n]+" "" ILLUMOS "${ILLUMOS}") 1064 1065 if(NOT ${ILLUMOS} MATCHES "0") 1066 add_definitions( "-D__illumos__" ) 1067 set(ILLUMOS 1) 1068 endif() 1069endif() 1070 1071if (MSVC) 1072 # Turn off stupid microsoft security warnings. 1073 add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE) 1074endif(MSVC) 1075 1076include_directories("${PROJECT_SOURCE_DIR}/lib") 1077 1078# Group headers and sources. 1079# Some IDEs use this for nicer file structure. 1080set(HDR_PRIVATE 1081 lib/core/private-lib-core.h) 1082 1083set(HDR_PUBLIC 1084 "${PROJECT_SOURCE_DIR}/include/libwebsockets.h" 1085 "${PROJECT_BINARY_DIR}/lws_config.h" 1086 "${PROJECT_SOURCE_DIR}/plugins/ssh-base/include/lws-plugin-ssh.h" 1087 ) 1088 1089set(SOURCES 1090 lib/core/alloc.c 1091 lib/core/buflist.c 1092 lib/core/context.c 1093 lib/core/lws_dll2.c 1094 lib/core/libwebsockets.c 1095 lib/core/logs.c 1096 lib/system/system.c 1097 lib/misc/base64-decode.c 1098 lib/misc/lws-ring.c 1099) 1100 1101if (LWS_WITH_SPAWN) 1102 list(APPEND SOURCES lib/misc/spawn.c) 1103endif() 1104 1105if (LWS_WITH_FSMOUNT AND ${CMAKE_SYSTEM_NAME} STREQUAL "Linux") 1106 list(APPEND SOURCES lib/misc/fsmount.c) 1107endif() 1108 1109 1110 1111if (LWS_WITH_FILE_OPS) 1112 list(APPEND SOURCES lib/core/vfs.c) 1113endif() 1114 1115if (LWS_WITH_DEPRECATED_LWS_DLL) 1116 list(APPEND SOURCES 1117 lib/core/lws_dll.c) 1118endif() 1119 1120if (LWS_WITH_NETWORK) 1121 list(APPEND SOURCES 1122 lib/core-net/dummy-callback.c 1123 lib/core-net/output.c 1124 lib/core-net/close.c 1125 lib/core-net/network.c 1126 lib/core-net/vhost.c 1127 lib/core-net/pollfd.c 1128 lib/core-net/service.c 1129 lib/core-net/sorted-usec-list.c 1130 lib/core-net/state.c 1131 lib/core-net/stats.c 1132 lib/core-net/wsi.c 1133 lib/core-net/wsi-timeout.c 1134 lib/core-net/adopt.c 1135 lib/roles/pipe/ops-pipe.c 1136 ) 1137 1138 if (LWS_WITH_SYS_ASYNC_DNS) 1139 list(APPEND SOURCES 1140 lib/system/async-dns/async-dns.c 1141 lib/system/async-dns/async-dns-parse.c) 1142 endif() 1143 1144 if (LWS_WITH_SYS_NTPCLIENT) 1145 list(APPEND SOURCES 1146 lib/system/ntpclient/ntpclient.c) 1147 endif() 1148 1149 if (LWS_WITH_SYS_DHCP_CLIENT) 1150 list(APPEND SOURCES 1151 lib/system/dhcpclient/dhcpclient.c) 1152 endif() 1153 1154 1155 if (LWS_WITH_DETAILED_LATENCY) 1156 list(APPEND SOURCES 1157 lib/core-net/detailed-latency.c) 1158 endif() 1159 1160 if (LWS_WITH_LWS_DSH) 1161 list(APPEND SOURCES 1162 lib/core-net/lws-dsh.c) 1163 endif() 1164 1165 if (LWS_WITH_SEQUENCER) 1166 list(APPEND SOURCES 1167 lib/core-net/sequencer.c) 1168 endif() 1169 1170 if (LWS_WITH_ABSTRACT) 1171 list(APPEND SOURCES 1172 lib/abstract/abstract.c 1173 ) 1174 if (LWS_WITH_SEQUENCER) 1175 list(APPEND SOURCES 1176 lib/abstract/test-sequencer.c) 1177 endif() 1178 endif() 1179 1180 if (LWS_WITH_SECURE_STREAMS) 1181 list(APPEND SOURCES 1182 lib/secure-streams/secure-streams.c 1183 lib/secure-streams/policy.c 1184 lib/secure-streams/system/fetch-policy/fetch-policy.c 1185 ) 1186 if (LWS_ROLE_H1) 1187 list(APPEND SOURCES 1188 lib/secure-streams/protocols/ss-h1.c 1189 ) 1190 endif() 1191 if (LWS_ROLE_H2) 1192 list(APPEND SOURCES 1193 lib/secure-streams/protocols/ss-h2.c 1194 ) 1195 endif() 1196 if (LWS_ROLE_WS) 1197 list(APPEND SOURCES 1198 lib/secure-streams/protocols/ss-ws.c 1199 ) 1200 endif() 1201 if (LWS_ROLE_MQTT) 1202 list(APPEND SOURCES 1203 lib/secure-streams/protocols/ss-mqtt.c 1204 ) 1205 endif() 1206 1207 if (LWS_WITH_SECURE_STREAMS_PROXY_API) 1208 list(APPEND SOURCES 1209 lib/secure-streams/secure-streams-serialize.c 1210 lib/secure-streams/secure-streams-client.c 1211 ) 1212 endif() 1213 1214 if (LWS_WITH_SECURE_STREAMS_PROXY_API) 1215 list(APPEND SOURCES 1216 lib/secure-streams/secure-streams-process.c 1217 ) 1218 endif() 1219 1220 if (LWS_WITH_SECURE_STREAMS_SYS_AUTH_API_AMAZON_COM) 1221 list(APPEND SOURCES 1222 lib/secure-streams/system/auth-api.amazon.com/auth.c 1223 ) 1224 endif() 1225 endif() 1226 1227 if (LWS_WITH_STATS) 1228 list(APPEND SOURCES 1229 lib/core-net/stats.c 1230 ) 1231 endif() 1232endif() 1233 1234if (LWS_WITH_DIR) 1235 list(APPEND SOURCES lib/misc/dir.c) 1236endif() 1237 1238if (LWS_ROLE_MQTT AND LWS_WITH_CLIENT) 1239 list(APPEND SOURCES 1240 lib/roles/mqtt/mqtt.c 1241 lib/roles/mqtt/ops-mqtt.c 1242 lib/roles/mqtt/primitives.c 1243 lib/roles/mqtt/client/client-mqtt.c 1244 lib/roles/mqtt/client/client-mqtt-handshake.c 1245 ) 1246endif() 1247 1248if (LWS_WITH_THREADPOOL AND UNIX AND LWS_HAVE_PTHREAD_H) 1249 list(APPEND SOURCES lib/misc/threadpool/threadpool.c) 1250endif() 1251 1252if (LWS_ROLE_H1 OR LWS_ROLE_H2) 1253 list(APPEND SOURCES 1254 lib/roles/http/header.c 1255 lib/roles/http/parsers.c) 1256 if (LWS_WITH_HTTP_STREAM_COMPRESSION) 1257 list(APPEND SOURCES 1258 lib/roles/http/compression/stream.c 1259 lib/roles/http/compression/deflate/deflate.c) 1260 if (LWS_WITH_HTTP_BROTLI) 1261 list(APPEND SOURCES 1262 lib/roles/http/compression/brotli/brotli.c) 1263 endif() 1264 endif() 1265endif() 1266 1267if (LWS_ROLE_H1) 1268 list(APPEND SOURCES 1269 lib/roles/h1/ops-h1.c) 1270endif() 1271 1272if (LWS_ROLE_WS) 1273 list(APPEND SOURCES 1274 lib/roles/ws/ops-ws.c) 1275 if (NOT LWS_WITHOUT_CLIENT) 1276 list(APPEND SOURCES 1277 lib/roles/ws/client-ws.c 1278 lib/roles/ws/client-parser-ws.c) 1279 endif() 1280 if (NOT LWS_WITHOUT_SERVER) 1281 list(APPEND SOURCES 1282 lib/roles/ws/server-ws.c) 1283 endif() 1284endif() 1285 1286if (LWS_ROLE_RAW) 1287 list(APPEND SOURCES 1288 lib/roles/raw-skt/ops-raw-skt.c) 1289 if (LWS_ROLE_RAW_FILE) 1290 list(APPEND SOURCES lib/roles/raw-file/ops-raw-file.c) 1291 endif() 1292 1293 if (LWS_WITH_ABSTRACT) 1294 list(APPEND SOURCES 1295 lib/abstract/transports/raw-skt.c) 1296 endif() 1297endif() 1298 1299if (LWS_ROLE_RAW_PROXY) 1300 list(APPEND SOURCES 1301 lib/roles/raw-proxy/ops-raw-proxy.c) 1302endif() 1303 1304if (LWS_ROLE_CGI) 1305 list(APPEND SOURCES 1306 lib/roles/cgi/cgi-server.c 1307 lib/roles/cgi/ops-cgi.c) 1308endif() 1309 1310if (LWS_ROLE_DBUS) 1311 list(APPEND SOURCES 1312 lib/roles/dbus/dbus.c) 1313endif() 1314 1315if (LWS_WITH_ACCESS_LOG) 1316 list(APPEND SOURCES 1317 lib/roles/http/server/access-log.c) 1318endif() 1319 1320if (LWS_WITH_PEER_LIMITS) 1321 list(APPEND SOURCES 1322 lib/misc/peer-limits.c) 1323endif() 1324 1325if (LWS_WITH_LWSAC) 1326 list(APPEND SOURCES 1327 lib/misc/lwsac/lwsac.c 1328 lib/misc/lwsac/cached-file.c) 1329endif() 1330 1331if (LWS_WITH_FTS) 1332 list(APPEND SOURCES 1333 lib/misc/fts/trie.c 1334 lib/misc/fts/trie-fd.c) 1335endif() 1336 1337if (LWS_WITH_DISKCACHE) 1338 list(APPEND SOURCES 1339 lib/misc/diskcache.c) 1340endif() 1341 1342if (LWS_WITH_STRUCT_JSON) 1343 list(APPEND SOURCES 1344 lib/misc/lws-struct-lejp.c) 1345endif() 1346 1347if (LWS_WITH_STRUCT_SQLITE3) 1348 list(APPEND SOURCES 1349 lib/misc/lws-struct-sqlite.c) 1350endif() 1351 1352if (NOT LWS_WITHOUT_CLIENT) 1353 list(APPEND SOURCES 1354 lib/core-net/connect.c 1355 lib/core-net/client.c 1356 lib/roles/http/client/client-http.c 1357 lib/roles/http/client/client-handshake.c) 1358endif() 1359 1360if (NOT LWS_WITHOUT_SERVER) 1361 list(APPEND SOURCES 1362 lib/core-net/server.c) 1363endif() 1364 1365if (NOT LWS_WITHOUT_SERVER OR LWS_WITH_SECURE_STREAMS_PROCESS_API) 1366 list(APPEND SOURCES 1367 lib/roles/listen/ops-listen.c) 1368endif() 1369 1370if (LWS_WITH_MBEDTLS) 1371 set(LWS_WITH_SSL ON) 1372 1373 include_directories(lib/tls/mbedtls/wrapper/include) 1374 include_directories(lib/tls/mbedtls/wrapper/include/platform) 1375 include_directories(lib/tls/mbedtls/wrapper/include/internal) 1376 include_directories(lib/tls/mbedtls/wrapper/include/openssl) 1377 1378 if (LWS_WITH_NETWORK) 1379 list(APPEND HDR_PRIVATE 1380 lib/tls/mbedtls/wrapper/include/internal/ssl3.h 1381 lib/tls/mbedtls/wrapper/include/internal/ssl_cert.h 1382 lib/tls/mbedtls/wrapper/include/internal/ssl_code.h 1383 lib/tls/mbedtls/wrapper/include/internal/ssl_dbg.h 1384 lib/tls/mbedtls/wrapper/include/internal/ssl_lib.h 1385 lib/tls/mbedtls/wrapper/include/internal/ssl_methods.h 1386 lib/tls/mbedtls/wrapper/include/internal/ssl_pkey.h 1387 lib/tls/mbedtls/wrapper/include/internal/ssl_stack.h 1388 lib/tls/mbedtls/wrapper/include/internal/ssl_types.h 1389 lib/tls/mbedtls/wrapper/include/internal/ssl_x509.h 1390 lib/tls/mbedtls/wrapper/include/internal/tls1.h 1391 lib/tls/mbedtls/wrapper/include/internal/x509_vfy.h) 1392 1393 list(APPEND HDR_PRIVATE 1394 lib/tls/mbedtls/wrapper/include/openssl/ssl.h) 1395 1396 list(APPEND HDR_PRIVATE 1397 lib/tls/mbedtls/wrapper/include/platform/ssl_pm.h 1398 lib/tls/mbedtls/wrapper/include/platform/ssl_port.h) 1399 1400 list(APPEND SOURCES 1401 lib/tls/mbedtls/wrapper/library/ssl_cert.c 1402 lib/tls/mbedtls/wrapper/library/ssl_lib.c 1403 lib/tls/mbedtls/wrapper/library/ssl_methods.c 1404 lib/tls/mbedtls/wrapper/library/ssl_pkey.c 1405 lib/tls/mbedtls/wrapper/library/ssl_stack.c 1406 lib/tls/mbedtls/wrapper/library/ssl_x509.c) 1407 1408 list(APPEND SOURCES 1409 lib/tls/mbedtls/wrapper/platform/ssl_pm.c 1410 lib/tls/mbedtls/wrapper/platform/ssl_port.c) 1411 endif() 1412endif() 1413 1414if (LWS_WITH_SSL) 1415 list(APPEND SOURCES 1416 lib/tls/tls.c 1417 ) 1418 if (LWS_WITH_NETWORK) 1419 list(APPEND SOURCES 1420 lib/tls/tls-network.c 1421 ) 1422 endif() 1423 1424 if (LWS_WITH_MBEDTLS) 1425 list(APPEND SOURCES 1426 lib/tls/mbedtls/mbedtls-tls.c 1427 lib/tls/mbedtls/mbedtls-x509.c 1428 ) 1429 if (LWS_WITH_NETWORK) 1430 list(APPEND SOURCES 1431 lib/tls/mbedtls/mbedtls-ssl.c 1432 ) 1433 endif() 1434 if (LWS_WITH_GENCRYPTO) 1435 list(APPEND SOURCES 1436 lib/tls/mbedtls/lws-genhash.c 1437 lib/tls/mbedtls/lws-genrsa.c 1438 lib/tls/mbedtls/lws-genaes.c 1439 lib/tls/lws-genec-common.c 1440 lib/tls/mbedtls/lws-genec.c 1441 lib/tls/mbedtls/lws-gencrypto.c 1442 ) 1443 endif() 1444 else() 1445 list(APPEND SOURCES 1446 lib/tls/openssl/openssl-tls.c 1447 lib/tls/openssl/openssl-x509.c 1448 ) 1449 if (LWS_WITH_NETWORK) 1450 list(APPEND SOURCES 1451 lib/tls/openssl/openssl-ssl.c 1452 ) 1453 endif() 1454 if (LWS_WITH_GENCRYPTO) 1455 list(APPEND SOURCES 1456 lib/tls/openssl/lws-genhash.c 1457 lib/tls/openssl/lws-genrsa.c 1458 lib/tls/openssl/lws-genaes.c 1459 lib/tls/lws-genec-common.c 1460 lib/tls/openssl/lws-genec.c 1461 lib/tls/openssl/lws-gencrypto.c 1462 ) 1463 endif() 1464 endif() 1465 1466 if (NOT LWS_WITHOUT_SERVER) 1467 list(APPEND SOURCES 1468 lib/tls/tls-server.c) 1469 if (LWS_WITH_MBEDTLS) 1470 list(APPEND SOURCES 1471 lib/tls/mbedtls/mbedtls-server.c) 1472 else() 1473 list(APPEND SOURCES 1474 lib/tls/openssl/openssl-server.c) 1475 endif() 1476 endif() 1477 if (NOT LWS_WITHOUT_CLIENT) 1478 list(APPEND SOURCES 1479 lib/tls/tls-client.c) 1480 if (LWS_WITH_MBEDTLS) 1481 list(APPEND SOURCES 1482 lib/tls/mbedtls/mbedtls-client.c) 1483 else() 1484 list(APPEND SOURCES 1485 lib/tls/openssl/openssl-client.c) 1486 endif() 1487 1488 endif() 1489endif() 1490 1491if (NOT LWS_WITHOUT_BUILTIN_SHA1) 1492 list(APPEND SOURCES 1493 lib/misc/sha-1.c) 1494endif() 1495 1496if (LWS_WITH_HTTP2 AND NOT LWS_WITHOUT_SERVER) 1497 list(APPEND SOURCES 1498 lib/roles/h2/http2.c 1499 lib/roles/h2/hpack.c 1500 lib/roles/h2/ops-h2.c) 1501endif() 1502# select the active platform files 1503 1504if (WIN32) 1505 list(APPEND SOURCES 1506 lib/plat/windows/windows-fds.c 1507 lib/plat/windows/windows-file.c 1508 lib/plat/windows/windows-init.c 1509 lib/plat/windows/windows-misc.c 1510 lib/plat/windows/windows-pipe.c 1511 lib/plat/windows/windows-plugins.c 1512 lib/plat/windows/windows-service.c 1513 lib/plat/windows/windows-sockets.c 1514 ) 1515else() 1516 1517 if (LWS_PLAT_OPTEE) 1518 list(APPEND SOURCES 1519 lib/plat/optee/lws-plat-optee.c 1520 ) 1521 if (LWS_WITH_NETWORK) 1522 list(APPEND SOURCES 1523 lib/plat/optee/network.c 1524 ) 1525 endif() 1526 else() 1527 if (LWS_PLAT_FREERTOS) 1528 list(APPEND SOURCES 1529 lib/plat/freertos/freertos-fds.c 1530 lib/plat/freertos/freertos-init.c 1531 lib/plat/freertos/freertos-misc.c 1532 lib/plat/freertos/freertos-pipe.c 1533 lib/plat/freertos/freertos-service.c 1534 lib/plat/freertos/freertos-sockets.c 1535 lib/misc/romfs.c) 1536 if (LWS_WITH_ESP32_HELPER) 1537 list(APPEND SOURCES lib/plat/freertos/esp32/esp32-helpers.c) 1538 endif() 1539 if (LWS_WITH_FILE_OPS) 1540 list(APPEND SOURCES lib/plat/freertos/freertos-file.c) 1541 endif() 1542 if (LWS_WITH_SYS_ASYNC_DNS) 1543 list(APPEND SOURCES lib/plat/freertos/freertos-resolv.c) 1544 endif() 1545 else() 1546 set(LWS_PLAT_UNIX 1) 1547 list(APPEND SOURCES 1548 lib/plat/unix/unix-caps.c 1549 lib/plat/unix/unix-misc.c 1550 lib/plat/unix/unix-init.c 1551 ) 1552 if (LWS_WITH_FILE_OPS) 1553 list(APPEND SOURCES lib/plat/unix/unix-file.c) 1554 endif() 1555 if (LWS_WITH_NETWORK) 1556 list(APPEND SOURCES 1557 lib/plat/unix/unix-pipe.c 1558 lib/plat/unix/unix-service.c 1559 lib/plat/unix/unix-sockets.c 1560 lib/plat/unix/unix-fds.c 1561 ) 1562 if (LWS_WITH_SYS_ASYNC_DNS) 1563 if (LWS_PLAT_ANDROID) 1564 list(APPEND SOURCES lib/plat/unix/android/android-resolv.c) 1565 else() 1566 list(APPEND SOURCES lib/plat/unix/unix-resolv.c) 1567 endif() 1568 endif() 1569 endif() 1570 1571 if (LWS_WITH_PLUGINS AND LWS_WITH_LIBUV) 1572 list(APPEND SOURCES lib/plat/unix/unix-plugins.c) 1573 endif() 1574 endif() 1575 endif() 1576endif() 1577 1578if (LWS_WITH_SOCKS5 AND NOT LWS_WITHOUT_CLIENT) 1579 list(APPEND SOURCES 1580 lib/core-net/socks5-client.c) 1581endif() 1582 1583if ((LWS_ROLE_H1 OR LWS_ROLE_H2) AND NOT LWS_WITHOUT_SERVER) 1584 list(APPEND SOURCES 1585 lib/roles/http/server/server.c 1586 lib/roles/http/server/lws-spa.c) 1587endif() 1588 1589if (LWS_ROLE_WS AND NOT LWS_WITHOUT_EXTENSIONS) 1590 list(APPEND HDR_PRIVATE 1591 lib/roles/ws/ext/extension-permessage-deflate.h) 1592 list(APPEND SOURCES 1593 lib/roles/ws/ext/extension.c 1594 lib/roles/ws/ext/extension-permessage-deflate.c) 1595endif() 1596 1597if (LWS_WITH_HTTP_PROXY) 1598 list(APPEND SOURCES 1599 lib/roles/http/server/rewrite.c) 1600endif() 1601 1602if (LWS_WITH_POLL AND LWS_WITH_NETWORK) 1603 list(APPEND SOURCES 1604 lib/event-libs/poll/poll.c) 1605endif() 1606 1607if (LWS_WITH_LIBUV AND LWS_WITH_NETWORK) 1608 list(APPEND SOURCES 1609 lib/event-libs/libuv/libuv.c) 1610endif() 1611 1612if (LWS_WITH_LIBEVENT AND LWS_WITH_NETWORK) 1613 list(APPEND SOURCES 1614 lib/event-libs/libevent/libevent.c) 1615endif() 1616 1617if (LWS_WITH_GLIB AND LWS_WITH_NETWORK) 1618 list(APPEND SOURCES 1619 lib/event-libs/glib/glib.c) 1620endif() 1621 1622 1623if (LWS_WITH_LIBEV AND LWS_WITH_NETWORK) 1624 list(APPEND SOURCES 1625 lib/event-libs/libev/libev.c) 1626 # libev generates a big mess of warnings with gcc, maintainer claims gcc to blame 1627 set_source_files_properties( lib/event-libs/libev/libev.c PROPERTIES COMPILE_FLAGS "-Wno-error" ) 1628endif() 1629 1630if (LWS_WITH_LEJP) 1631 list(APPEND SOURCES 1632 lib/misc/lejp.c) 1633endif() 1634if (LWS_WITH_LEJP_CONF AND LWS_WITH_NETWORK AND NOT LWS_PLAT_OPTEE) 1635 list(APPEND SOURCES 1636 "lib/roles/http/server/lejp-conf.c" 1637 ) 1638endif() 1639 1640if (LWS_WITH_ABSTRACT) 1641 list(APPEND SOURCES 1642 lib/abstract/transports/unit-test.c) 1643endif() 1644 1645#if (LWS_WITH_SMTP) 1646# list(APPEND SOURCES 1647# lib/abstract/protocols/smtp/smtp.c 1648# lib/abstract/protocols/smtp/smtp-sequencer.c 1649# ) 1650#endif() 1651 1652if (LWS_WITH_RANGES) 1653 list(APPEND SOURCES 1654 lib/roles/http/server/ranges.c) 1655endif() 1656 1657if (LWS_WITH_ZIP_FOPS) 1658 if (LWS_WITH_ZLIB) 1659 list(APPEND SOURCES 1660 lib/roles/http/server/fops-zip.c) 1661 else() 1662 message(FATAL_ERROR "Pre-zipped file support (LWS_WITH_ZIP_FOPS) requires ZLIB (LWS_WITH_ZLIB)") 1663 endif() 1664endif() 1665 1666if (LWS_WITH_JOSE) 1667 list(APPEND SOURCES 1668 lib/jose/jwk/jwk.c 1669 lib/jose/jws/jose.c 1670 lib/jose/jws/jws.c 1671 lib/jose/jwe/jwe.c 1672 lib/jose/jwe/enc/aescbc.c 1673 lib/jose/jwe/enc/aesgcm.c 1674 lib/jose/jwe/enc/aeskw.c 1675 lib/jose/jwe/jwe-rsa-aescbc.c 1676 lib/jose/jwe/jwe-rsa-aesgcm.c 1677 lib/jose/jwe/jwe-ecdh-es-aeskw.c 1678 ) 1679endif() 1680 1681if (LWS_WITH_TLS AND (LWS_WITH_JOSE OR LWS_WITH_GENCRYPTO)) 1682 list(APPEND SOURCES 1683 lib/tls/lws-gencrypto-common.c) 1684endif() 1685 1686# Add helper files for Windows. 1687if (WIN32) 1688 set(WIN32_HELPERS_PATH win32port/win32helpers) 1689 include_directories(${WIN32_HELPERS_PATH}) 1690 1691 if (WIN32) 1692 list(APPEND SOURCES 1693 ${WIN32_HELPERS_PATH}/gettimeofday.c 1694 ) 1695 1696 list(APPEND HDR_PRIVATE 1697 ${WIN32_HELPERS_PATH}/gettimeofday.h 1698 ) 1699 endif(WIN32) 1700 1701else() 1702 # Unix. 1703 if (NOT LWS_WITHOUT_DAEMONIZE) 1704 list(APPEND SOURCES 1705 lib/misc/daemonize.c) 1706 endif() 1707endif() 1708 1709if (UNIX) 1710 if (NOT LWS_HAVE_GETIFADDRS) 1711 list(APPEND HDR_PRIVATE lib/misc/getifaddrs.h) 1712 list(APPEND SOURCES lib/misc/getifaddrs.c) 1713 endif() 1714endif() 1715 1716if ((CMAKE_C_COMPILER_ID MATCHES "Clang") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang")) 1717 set(COMPILER_IS_CLANG ON) 1718endif() 1719 1720if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR COMPILER_IS_CLANG) 1721 include (CheckCCompilerFlag) 1722 CHECK_C_COMPILER_FLAG(-fvisibility=hidden LWS_HAVE_VISIBILITY) 1723 if (LWS_HAVE_VISIBILITY) 1724 set(VISIBILITY_FLAG -fvisibility=hidden) 1725 endif() 1726 if (LWS_WITH_GCOV) 1727 set (GCOV_FLAGS "-fprofile-arcs -ftest-coverage ") 1728 endif() 1729 1730 if (LWS_WITH_ASAN) 1731 set (ASAN_FLAGS "-fsanitize=address -fsanitize=undefined -fsanitize-address-use-after-scope -fsanitize-undefined-trap-on-error") 1732 if (NOT COMPILER_IS_CLANG) 1733 set (ASAN_FLAGS "${ASAN_FLAGS} -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=leak") 1734 endif() 1735 message("Enabling ASAN") 1736 endif() 1737 1738 check_c_compiler_flag("-Wignored-qualifiers" LWS_GCC_HAS_IGNORED_QUALIFIERS) 1739 check_c_compiler_flag("-Wtype-limits" LWS_GCC_HAS_TYPE_LIMITS) 1740 1741 if (LWS_GCC_HAS_IGNORED_QUALIFIERS) 1742 set(CMAKE_C_FLAGS "-Wignored-qualifiers ${CMAKE_C_FLAGS}" ) 1743 endif() 1744 1745 if (LWS_GCC_HAS_TYPE_LIMITS) 1746 set(CMAKE_C_FLAGS "-Wtype-limits ${CMAKE_C_FLAGS}" ) 1747 endif() 1748 1749 if (UNIX AND NOT LWS_PLAT_FREERTOS) 1750 set(CMAKE_C_FLAGS "-Wall -Wsign-compare -Wstrict-aliasing -Wuninitialized -Werror ${VISIBILITY_FLAG} -Wundef ${GCOV_FLAGS} ${CMAKE_C_FLAGS} ${ASAN_FLAGS}" ) 1751 else() 1752 set(CMAKE_C_FLAGS "-Wall -Wsign-compare -Wuninitialized -Werror ${VISIBILITY_FLAG} ${GCOV_FLAGS} ${CMAKE_C_FLAGS}" ) 1753 endif() 1754endif () 1755 1756if (LWS_PLAT_OPTEE) 1757 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --sysroot ../../../../lib/libutils/isoc/include -I../../../../lib/libutils/isoc/include -I../../../../lib/libutils/ext/include" ) 1758endif() 1759 1760if ((CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) AND NOT LWS_WITHOUT_TESTAPPS) 1761 if (UNIX AND LWS_HAVE_PTHREAD_H) 1762 # jeez clang understands -pthread but dies if he sees it at link time! 1763 # http://stackoverflow.com/questions/2391194/what-is-gs-pthread-equiv-in-clang 1764 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread" ) 1765 endif() 1766endif() 1767 1768if (COMPILER_IS_CLANG) 1769 1770 # otherwise osx blows a bunch of openssl deprecated api errors 1771 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations" ) 1772 if (UNIX AND LWS_HAVE_PTHREAD_H) 1773 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread -Wno-error=unused-command-line-argument" ) 1774 endif() 1775endif() 1776 1777source_group("Headers Private" FILES ${HDR_PRIVATE}) 1778source_group("Headers Public" FILES ${HDR_PUBLIC}) 1779source_group("Sources" FILES ${SOURCES}) 1780source_group("Resources" FILES ${RESOURCES}) 1781 1782# 1783# Create the lib. 1784# 1785set(LWS_LIBRARIES) 1786 1787if (LWS_WITH_STATIC) 1788 if (LWS_STATIC_PIC) 1789 set(CMAKE_POSITION_INDEPENDENT_CODE ON) 1790 endif() 1791 add_library(websockets STATIC 1792 ${HDR_PRIVATE} 1793 ${HDR_PUBLIC} 1794 ${SOURCES}) 1795 list(APPEND LWS_LIBRARIES websockets) 1796 1797 if (WIN32) 1798 # Windows uses the same .lib ending for static libraries and shared 1799 # library linker files, so rename the static library. 1800 set_target_properties(websockets 1801 PROPERTIES 1802 OUTPUT_NAME websockets_static) 1803 endif() 1804 add_custom_command( 1805 TARGET websockets 1806 COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/include/libwebsockets.h 1807 ${CMAKE_CURRENT_BINARY_DIR}/include/libwebsockets.h 1808 ) 1809 1810 add_custom_command( 1811 TARGET websockets 1812 COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/include/libwebsockets/ 1813 ${CMAKE_CURRENT_BINARY_DIR}/include/libwebsockets 1814 ) 1815 1816 add_custom_command( 1817 TARGET websockets 1818 COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/lws_config.h 1819 ${CMAKE_CURRENT_BINARY_DIR}/include/lws_config.h 1820 ) 1821 1822endif() 1823 1824if (LWS_WITH_SHARED) 1825 add_library(websockets_shared SHARED 1826 ${HDR_PRIVATE} 1827 ${HDR_PUBLIC} 1828 ${SOURCES} 1829 ${RESOURCES}) 1830 list(APPEND LWS_LIBRARIES websockets_shared) 1831 1832 # We want the shared lib to be named "libwebsockets" 1833 # not "libwebsocket_shared". 1834 set_target_properties(websockets_shared 1835 PROPERTIES 1836 OUTPUT_NAME websockets) 1837 1838 if (WIN32) 1839 # Compile as DLL (export function declarations) 1840 set_property( 1841 TARGET websockets_shared 1842 PROPERTY COMPILE_DEFINITIONS 1843 LWS_DLL 1844 LWS_INTERNAL) 1845 endif() 1846 1847 if (APPLE) 1848 set_property(TARGET websockets_shared PROPERTY MACOSX_RPATH YES) 1849 endif() 1850 1851 add_custom_command( 1852 TARGET websockets_shared 1853 COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/include/libwebsockets.h 1854 ${CMAKE_CURRENT_BINARY_DIR}/include/libwebsockets.h 1855 ) 1856 1857 add_custom_command( 1858 TARGET websockets 1859 COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/include/libwebsockets 1860 ${CMAKE_CURRENT_BINARY_DIR}/include/libwebsockets 1861 ) 1862 1863 add_custom_command( 1864 TARGET websockets_shared 1865 COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/lws_config.h 1866 ${CMAKE_CURRENT_BINARY_DIR}/include/lws_config.h 1867 ) 1868 1869 1870endif() 1871 1872# Set the so version of the lib. 1873# Equivalent to LDFLAGS=-version-info x:x:x 1874if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR COMPILER_IS_CLANG) 1875 foreach(lib ${LWS_LIBRARIES}) 1876 set_target_properties(${lib} 1877 PROPERTIES 1878 SOVERSION ${SOVERSION}) 1879 endforeach() 1880endif() 1881 1882set(LIB_LIST) 1883 1884# 1885# Find libraries. 1886# 1887 1888# 1889# ZLIB (needed for deflate extension and if LWS_WITH_HTTP_STREAM_COMPRESSION) 1890# 1891if (LWS_WITH_ZLIB) 1892 if (LWS_WITH_BUNDLED_ZLIB) 1893 if (WIN32) 1894 set(WIN32_ZLIB_PATH "win32port/zlib") 1895 set(ZLIB_SRCS 1896 ${WIN32_ZLIB_PATH}/adler32.c 1897 ${WIN32_ZLIB_PATH}/compress.c 1898 ${WIN32_ZLIB_PATH}/crc32.c 1899 ${WIN32_ZLIB_PATH}/deflate.c 1900 ${WIN32_ZLIB_PATH}/gzlib.c 1901 ${WIN32_ZLIB_PATH}/gzread.c 1902 ${WIN32_ZLIB_PATH}/gzwrite.c 1903 ${WIN32_ZLIB_PATH}/infback.c 1904 ${WIN32_ZLIB_PATH}/inffast.c 1905 ${WIN32_ZLIB_PATH}/inflate.c 1906 ${WIN32_ZLIB_PATH}/inftrees.c 1907 ${WIN32_ZLIB_PATH}/trees.c 1908 ${WIN32_ZLIB_PATH}/uncompr.c 1909 ${WIN32_ZLIB_PATH}/zutil.c) 1910 add_library(zlib_internal STATIC ${ZLIB_SRCS}) 1911 set(ZLIB_INCLUDE_DIRS ${WIN32_ZLIB_PATH}) 1912 get_property(ZLIB_LIBRARIES TARGET zlib_internal PROPERTY LOCATION) 1913 set(ZLIB_FOUND 1) 1914 # Make sure zlib_internal is compiled before the libs. 1915 foreach (lib ${LWS_LIBRARIES}) 1916 add_dependencies(${lib} zlib_internal) 1917 endforeach() 1918 else() 1919 message(FATAL_ERROR "Don't have bundled zlib for that platform") 1920 endif() 1921 elseif (NOT ZLIB_FOUND) 1922 if (LWS_WITH_MINIZ) 1923 find_package(Miniz REQUIRED) 1924 set(ZLIB_INCLUDE_DIRS ${MINIZ_INCLUDE_DIRS}) 1925 set(ZLIB_LIBRARIES ${MINIZ_LIBRARIES}) 1926 else() 1927 find_package(ZLIB REQUIRED) 1928 endif() 1929 endif() 1930 message("zlib/miniz include dirs: ${ZLIB_INCLUDE_DIRS}") 1931 message("zlib/miniz libraries: ${ZLIB_LIBRARIES}") 1932 include_directories(${ZLIB_INCLUDE_DIRS}) 1933 # done later at end of link list 1934 # list(APPEND LIB_LIST ${ZLIB_LIBRARIES}) 1935endif() 1936 1937if (LWS_WITH_HTTP_BROTLI) 1938 list(APPEND LIB_LIST brotlienc brotlidec brotlidec) 1939endif() 1940 1941# 1942# OpenSSL 1943# 1944if (LWS_WITH_SSL) 1945 message("Compiling with SSL support") 1946 set(chose_ssl 0) 1947 if (LWS_WITH_WOLFSSL) 1948 # Use wolfSSL as OpenSSL replacement. 1949 # TODO: Add a find_package command for this also. 1950 message("wolfSSL include dir: ${WOLFSSL_INCLUDE_DIRS}") 1951 message("wolfSSL libraries: ${WOLFSSL_LIBRARIES}") 1952 1953 # Additional to the root directory we need to include 1954 # the wolfssl/ subdirectory which contains the OpenSSL 1955 # compatibility layer headers. 1956 1957 if (LWS_WITH_CYASSL) 1958 foreach(inc ${WOLFSSL_INCLUDE_DIRS}) 1959 set(OPENSSL_INCLUDE_DIRS ${OPENSSL_INCLUDE_DIRS} ${inc} ${inc}/cyassl) 1960 include_directories("${inc}" "${inc}/cyassl") 1961 endforeach() 1962 else() 1963 foreach(inc ${WOLFSSL_INCLUDE_DIRS}) 1964 set(OPENSSL_INCLUDE_DIRS ${OPENSSL_INCLUDE_DIRS} ${inc} ${inc}/wolfssl) 1965 include_directories("${inc}" "${inc}/wolfssl") 1966 endforeach() 1967 endif() 1968 set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIRS}) 1969 set(VARIA wolfSSL_) 1970 1971 list(APPEND LIB_LIST "${WOLFSSL_LIBRARIES}") 1972 set(chose_ssl 1) 1973 endif() 1974 1975 if (LWS_WITH_MBEDTLS) 1976 message("MBEDTLS include dir: ${MBEDTLS_INCLUDE_DIRS}") 1977 message("MBEDTLS libraries: ${MBEDTLS_LIBRARIES}") 1978 1979 foreach(inc ${MBEDTLS_INCLUDE_DIRS}) 1980 include_directories("${inc}" "${inc}/mbedtls") 1981 endforeach() 1982 1983 list(APPEND LIB_LIST "${MBEDTLS_LIBRARIES}") 1984 set(chose_ssl 1) 1985 endif() 1986 1987 if (NOT chose_ssl) 1988 if (NOT OPENSSL_FOUND AND NOT LWS_WITH_BORINGSSL) 1989 # TODO: Add support for STATIC also. 1990 if (NOT LWS_PLAT_FREERTOS) 1991 find_package(PkgConfig QUIET) 1992 pkg_check_modules(PC_OPENSSL openssl QUIET) 1993 find_package(OpenSSL REQUIRED) 1994 list(APPEND OPENSSL_LIBRARIES ${PC_OPENSSL_LIBRARIES}) 1995 endif() 1996 set(OPENSSL_INCLUDE_DIRS "${OPENSSL_INCLUDE_DIRS}") 1997 endif() 1998 1999 if (LWS_WITH_BORINGSSL) 2000 list(APPEND OPENSSL_LIBRARIES "${BUILD_LIBSSL_DIR}/libssl.a") 2001 list(APPEND OPENSSL_LIBRARIES "${BUILD_LIBCRYPTO_DIR}/libcrypto.a") 2002 list(APPEND OPENSSL_LIBRARIES "${BUILD_LIBCAP_DIR}/libcap.a") 2003 set(OPENSSL_INCLUDE_DIRS "${BUILD_BORINGSSL_INCDIR}" ${OPENSSL_INCLUDE_DIRS}) 2004 endif() 2005 2006 message("OpenSSL include dir: ${OPENSSL_INCLUDE_DIRS}") 2007 if (NOT LWS_PLAT_FREERTOS) 2008 message("OpenSSL libraries: ${OPENSSL_LIBRARIES}") 2009 endif() 2010 2011 include_directories("${OPENSSL_INCLUDE_DIRS}") 2012 if (NOT LWS_PLAT_FREERTOS) 2013 list(APPEND LIB_LIST ${OPENSSL_LIBRARIES}) 2014 endif() 2015 2016 if (NOT LWS_WITH_MBEDTLS) 2017 # older (0.98) Openssl lacks this 2018 set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIRS}) 2019 check_include_file(openssl/ecdh.h LWS_HAVE_OPENSSL_ECDH_H) 2020 2021 if (LWS_SSL_SERVER_WITH_ECDH_CERT AND NOT LWS_HAVE_OPENSSL_ECDH_H) 2022 message(FATAL_ERROR "Missing openssl/ecdh.h, so cannot use LWS_SSL_SERVER_WITH_ECDH_CERT") 2023 endif() 2024 else() 2025 unset(LWS_HAVE_OPENSSL_ECDH_H) 2026 endif(NOT LWS_WITH_MBEDTLS) 2027 endif() 2028 2029endif(LWS_WITH_SSL) 2030 2031if (LWS_WITH_LIBEV) 2032 if (NOT LIBEV_FOUND) 2033 find_path(LIBEV_INCLUDE_DIRS NAMES ev.h) 2034 find_library(LIBEV_LIBRARIES NAMES ev) 2035 if(LIBEV_INCLUDE_DIRS AND LIBEV_LIBRARIES) 2036 set(LIBEV_FOUND 1) 2037 endif() 2038 endif() 2039 message("libev include dir: ${LIBEV_INCLUDE_DIRS}") 2040 message("libev libraries: ${LIBEV_LIBRARIES}") 2041 include_directories("${LIBEV_INCLUDE_DIRS}") 2042 list(APPEND LIB_LIST ${LIBEV_LIBRARIES}) 2043endif(LWS_WITH_LIBEV) 2044 2045if (LWS_WITH_LIBUV) 2046 if (NOT LIBUV_FOUND) 2047 find_path(LIBUV_INCLUDE_DIRS NAMES uv.h) 2048 find_library(LIBUV_LIBRARIES NAMES uv) 2049 if(LIBUV_INCLUDE_DIRS AND LIBUV_LIBRARIES) 2050 set(LIBUV_FOUND 1) 2051 endif() 2052 endif() 2053 message("libuv include dir: ${LIBUV_INCLUDE_DIRS}") 2054 message("libuv libraries: ${LIBUV_LIBRARIES}") 2055 include_directories("${LIBUV_INCLUDE_DIRS}") 2056 list(APPEND LIB_LIST ${LIBUV_LIBRARIES}) 2057endif() 2058 2059if (LWS_WITH_LIBEVENT) 2060 if (NOT LIBEVENT_FOUND) 2061 find_path(LIBEVENT_INCLUDE_DIRS NAMES event2/event.h) 2062 find_library(LIBEVENT_LIBRARIES NAMES event) 2063 if(LIBEVENT_INCLUDE_DIRS AND LIBEVENT_LIBRARIES) 2064 set(LIBEVENT_FOUND 1) 2065 endif() 2066 endif() 2067 message("libevent include dir: ${LIBEVENT_INCLUDE_DIRS}") 2068 message("libevent libraries: ${LIBEVENT_LIBRARIES}") 2069 include_directories("${LIBEVENT_INCLUDE_DIRS}") 2070 list(APPEND LIB_LIST ${LIBEVENT_LIBRARIES}) 2071endif(LWS_WITH_LIBEVENT) 2072 2073if (LWS_WITH_GLIB) 2074 include (FindPkgConfig) 2075 if (NOT GLIB_FOUND) 2076 find_path(GLIB_INCLUDE_DIRS NAMES glib-2.0/glib.h) 2077 find_library(GLIB_LIBRARIES NAMES glib-2.0) 2078 if(GLIB_INCLUDE_DIRS AND GLIB_LIBRARIES) 2079 set(GLIB_FOUND 1) 2080 endif() 2081 if (GLIB_INCLUDE_DIRS) 2082 set(GLIB_INCLUDE_DIRS "${GLIB_INCLUDE_DIRS}/glib-2.0") 2083 endif() 2084 endif() 2085 PKG_SEARCH_MODULE(LWS_GLIB2 glib-2.0) 2086 if (LWS_GLIB2_FOUND) 2087 list(APPEND GLIB_INCLUDE_DIRS "${LWS_GLIB2_INCLUDE_DIRS}") 2088 endif() 2089 message("glib include dir: ${GLIB_INCLUDE_DIRS}") 2090 message("glib libraries: ${GLIB_LIBRARIES}") 2091 include_directories("${GLIB_INCLUDE_DIRS}") 2092 list(APPEND LIB_LIST ${GLIB_LIBRARIES}) 2093endif(LWS_WITH_GLIB) 2094 2095if (LWS_WITH_FSMOUNT AND ${CMAKE_SYSTEM_NAME} STREQUAL "Linux") 2096 message("libmount include dir: ${LIBMOUNT_INC_PATH}") 2097 message("libmount libraries: ${LIBMOUNT_LIB_PATH}") 2098 2099 include_directories("${LIBMOUNT_INC_PATH}") 2100 list(APPEND LIB_LIST ${LIBMOUNT_LIB_PATH}) 2101endif() 2102 2103 2104if (LWS_WITH_SQLITE3) 2105 if (NOT SQLITE3_FOUND) 2106 find_path(SQLITE3_INCLUDE_DIRS NAMES sqlite3.h) 2107 find_library(SQLITE3_LIBRARIES NAMES sqlite3) 2108 if(SQLITE3_INCLUDE_DIRS AND SQLITE3_LIBRARIES) 2109 set(SQLITE3_FOUND 1) 2110 endif() 2111 endif() 2112 message("sqlite3 include dir: ${SQLITE3_INCLUDE_DIRS}") 2113 message("sqlite3 libraries: ${SQLITE3_LIBRARIES}") 2114 include_directories("${SQLITE3_INCLUDE_DIRS}") 2115 list(APPEND LIB_LIST ${SQLITE3_LIBRARIES}) 2116endif() 2117 2118 2119if (LWS_WITH_HUBBUB) 2120 find_library(LIBHUBBUB_LIBRARIES NAMES hubbub) 2121 list(APPEND LIB_LIST ${LIBHUBBUB_LIBRARIES} ) 2122endif() 2123 2124if (LWS_ROLE_DBUS) 2125 message("dbus include dir 1: ${LWS_DBUS_INCLUDE1}") 2126 message("dbus include dir 2: ${LWS_DBUS_INCLUDE2}") 2127 include_directories("${LWS_DBUS_INCLUDE1}") 2128 include_directories("${LWS_DBUS_INCLUDE2}") 2129 list(APPEND LIB_LIST ${LWS_DBUS_LIB}) 2130endif() 2131 2132# 2133# Platform specific libs. 2134# 2135if (WINCE) 2136 list(APPEND LIB_LIST ws2.lib) 2137elseif (WIN32) 2138 list(APPEND LIB_LIST ws2_32.lib userenv.lib psapi.lib iphlpapi.lib) 2139endif() 2140 2141if (${CMAKE_SYSTEM_NAME} MATCHES "QNX") 2142 list(APPEND LIB_LIST socket) 2143endif() 2144 2145# 2146# add libs here that need to be at the end of the link order 2147# 2148 2149if (UNIX) 2150 list(APPEND LIB_LIST m) 2151endif() 2152 2153if(ILLUMOS) 2154 list(APPEND LIB_LIST socket) 2155endif() 2156 2157if (HAIKU) 2158 list(APPEND LIB_LIST network) 2159endif() 2160 2161if (LWS_HAVE_LIBCAP) 2162 list(APPEND LIB_LIST cap ) 2163endif() 2164 2165if (UNIX) 2166 list(APPEND LIB_LIST dl) 2167endif() 2168 2169if (LWS_WITH_ZLIB AND NOT LWS_WITH_BUNDLED_ZLIB) 2170 list(APPEND LIB_LIST "${ZLIB_LIBRARIES}") 2171endif() 2172 2173# Setup the linking for all libs. 2174foreach (lib ${LWS_LIBRARIES}) 2175 target_link_libraries(${lib} ${LIB_LIST}) 2176endforeach() 2177 2178set (temp ${CMAKE_REQUIRED_LIBRARIES}) 2179set(CMAKE_REQUIRED_LIBRARIES ${LIB_LIST}) 2180 2181if (LWS_WITH_ZLIB) 2182 if (LWS_WITH_BUNDLED_ZLIB) 2183 if (WIN32) 2184 # it's trying to delete internal zlib entry 2185 LIST(REMOVE_AT CMAKE_REQUIRED_LIBRARIES 0 ) 2186 endif() 2187 endif() 2188endif() 2189 2190CHECK_FUNCTION_EXISTS(${VARIA}SSL_CTX_set1_param LWS_HAVE_SSL_CTX_set1_param) 2191CHECK_FUNCTION_EXISTS(${VARIA}SSL_set_info_callback LWS_HAVE_SSL_SET_INFO_CALLBACK) 2192CHECK_FUNCTION_EXISTS(${VARIA}X509_VERIFY_PARAM_set1_host LWS_HAVE_X509_VERIFY_PARAM_set1_host) 2193CHECK_FUNCTION_EXISTS(${VARIA}RSA_set0_key LWS_HAVE_RSA_SET0_KEY) 2194CHECK_FUNCTION_EXISTS(${VARIA}X509_get_key_usage LWS_HAVE_X509_get_key_usage) 2195CHECK_FUNCTION_EXISTS(${VARIA}EVP_PKEY_new_raw_private_key LWS_HAVE_SSL_CTX_EVP_PKEY_new_raw_private_key) 2196CHECK_FUNCTION_EXISTS(${VARIA}SSL_CTX_get0_certificate LWS_HAVE_SSL_CTX_get0_certificate) 2197CHECK_FUNCTION_EXISTS(${VARIA}SSL_get0_alpn_selected LWS_HAVE_SSL_get0_alpn_selected) 2198CHECK_FUNCTION_EXISTS(${VARIA}SSL_set_alpn_protos LWS_HAVE_SSL_set_alpn_protos) 2199CHECK_FUNCTION_EXISTS(${VARIA}EVP_aes_128_cfb8 LWS_HAVE_EVP_aes_128_cfb8) 2200CHECK_FUNCTION_EXISTS(${VARIA}EVP_aes_128_cfb128 LWS_HAVE_EVP_aes_128_cfb128) 2201CHECK_FUNCTION_EXISTS(${VARIA}EVP_aes_192_cfb8 LWS_HAVE_EVP_aes_192_cfb8) 2202CHECK_FUNCTION_EXISTS(${VARIA}EVP_aes_192_cfb128 LWS_HAVE_EVP_aes_192_cfb128) 2203CHECK_FUNCTION_EXISTS(${VARIA}EVP_aes_256_cfb8 LWS_HAVE_EVP_aes_256_cfb8) 2204CHECK_FUNCTION_EXISTS(${VARIA}EVP_aes_256_cfb128 LWS_HAVE_EVP_aes_256_cfb128) 2205CHECK_FUNCTION_EXISTS(${VARIA}EVP_aes_128_xts LWS_HAVE_EVP_aes_128_xts) 2206CHECK_FUNCTION_EXISTS(${VARIA}RSA_verify_pss_mgf1 LWS_HAVE_RSA_verify_pss_mgf1) 2207CHECK_FUNCTION_EXISTS(${VARIA}HMAC_CTX_new LWS_HAVE_HMAC_CTX_new) 2208CHECK_FUNCTION_EXISTS(${VARIA}SSL_CTX_set_ciphersuites LWS_HAVE_SSL_CTX_set_ciphersuites) 2209if (LWS_WITH_SSL AND NOT LWS_WITH_MBEDTLS) 2210 if (UNIX) 2211 set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} dl) 2212 endif() 2213CHECK_C_SOURCE_COMPILES("#include <openssl/ssl.h>\nint main(void) { STACK_OF(X509) *c = NULL; SSL_CTX *ctx = NULL; return (int)SSL_CTX_get_extra_chain_certs_only(ctx, &c); }\n" LWS_HAVE_SSL_EXTRA_CHAIN_CERTS) 2214CHECK_C_SOURCE_COMPILES("#include <openssl/ssl.h>\nint main(void) { EVP_MD_CTX *md_ctx = NULL; EVP_MD_CTX_free(md_ctx); return 0; }\n" LWS_HAVE_EVP_MD_CTX_free) 2215CHECK_FUNCTION_EXISTS(${VARIA}ECDSA_SIG_set0 LWS_HAVE_ECDSA_SIG_set0) 2216CHECK_FUNCTION_EXISTS(${VARIA}BN_bn2binpad LWS_HAVE_BN_bn2binpad) 2217CHECK_FUNCTION_EXISTS(${VARIA}EVP_aes_128_wrap LWS_HAVE_EVP_aes_128_wrap) 2218CHECK_FUNCTION_EXISTS(${VARIA}EC_POINT_get_affine_coordinates LWS_HAVE_EC_POINT_get_affine_coordinates) 2219endif() 2220if (LWS_WITH_MBEDTLS) 2221 set(LWS_HAVE_TLS_CLIENT_METHOD 1) 2222 if (NOT LWS_PLAT_FREERTOS) 2223 # not supported in esp-idf openssl wrapper yet, but is in our version 2224 set(LWS_HAVE_X509_VERIFY_PARAM_set1_host 1) 2225 endif() 2226 2227 CHECK_FUNCTION_EXISTS(mbedtls_ssl_conf_alpn_protocols LWS_HAVE_mbedtls_ssl_conf_alpn_protocols) 2228 CHECK_FUNCTION_EXISTS(mbedtls_ssl_get_alpn_protocol LWS_HAVE_mbedtls_ssl_get_alpn_protocol) 2229 CHECK_FUNCTION_EXISTS(mbedtls_ssl_conf_sni LWS_HAVE_mbedtls_ssl_conf_sni) 2230 CHECK_FUNCTION_EXISTS(mbedtls_ssl_set_hs_ca_chain LWS_HAVE_mbedtls_ssl_set_hs_ca_chain) 2231 CHECK_FUNCTION_EXISTS(mbedtls_ssl_set_hs_own_cert LWS_HAVE_mbedtls_ssl_set_hs_own_cert) 2232 CHECK_FUNCTION_EXISTS(mbedtls_ssl_set_hs_authmode LWS_HAVE_mbedtls_ssl_set_hs_authmode) 2233 CHECK_FUNCTION_EXISTS(mbedtls_net_init LWS_HAVE_mbedtls_net_init) 2234 2235else() 2236CHECK_FUNCTION_EXISTS(${VARIA}TLS_client_method LWS_HAVE_TLS_CLIENT_METHOD) 2237CHECK_FUNCTION_EXISTS(${VARIA}TLSv1_2_client_method LWS_HAVE_TLSV1_2_CLIENT_METHOD) 2238endif() 2239 2240# ideally we want to use pipe2() 2241 2242CHECK_C_SOURCE_COMPILES("#define _GNU_SOURCE\n#include <unistd.h>\nint main(void) {int fd[2];\n return pipe2(fd, 0);\n}\n" LWS_HAVE_PIPE2) 2243 2244# old mbedtls has everything in mbedtls/net.h 2245 2246CHECK_C_SOURCE_COMPILES("#include <mbedtls/net_sockets.h>\nint main(void) { return 0;}\n" LWS_HAVE_MBEDTLS_NET_SOCKETS) 2247 2248# tcp keepalive needs this on linux to work practically... but it only exists 2249# after kernel 2.6.37 2250 2251CHECK_C_SOURCE_COMPILES("#include <netinet/tcp.h>\nint main(void) { return TCP_USER_TIMEOUT; }\n" LWS_HAVE_TCP_USER_TIMEOUT) 2252 2253set(CMAKE_REQUIRED_LIBRARIES ${temp}) 2254# Generate the lws_config.h that includes all the public compilation settings. 2255configure_file( 2256 "${PROJECT_SOURCE_DIR}/cmake/lws_config.h.in" 2257 "${PROJECT_BINARY_DIR}/lws_config.h") 2258 2259# Generate the lws_config.h that includes all the private compilation settings. 2260configure_file( 2261 "${PROJECT_SOURCE_DIR}/cmake/lws_config_private.h.in" 2262 "${PROJECT_BINARY_DIR}/lws_config_private.h") 2263 2264# Generate self-signed SSL certs for the test-server. 2265 2266if (LWS_WITH_SSL AND NOT LWS_WITH_WOLFSSL) 2267 message("Searching for OpenSSL executable and dlls") 2268 find_package(OpenSSLbins) 2269 message("OpenSSL executable: ${OPENSSL_EXECUTABLE}") 2270 if (OPENSSL_EXECUTABLE MATCHES "^$") 2271 set(OPENSSL_EXECUTABLE openssl) 2272 endif() 2273 if (NOT OPENSSL_EXECUTABLE) 2274 set(OPENSSL_EXECUTABLE openssl) 2275 endif() 2276 2277endif() 2278 2279set(GENCERTS 0) 2280 2281if (LWS_WITH_SSL AND OPENSSL_EXECUTABLE AND NOT LWS_WITHOUT_TEST_SERVER AND NOT LWS_WITHOUT_SERVER AND NOT LWS_WITHOUT_TESTAPPS) 2282 set(GENCERTS 1) 2283endif() 2284if (LWS_PLAT_FREERTOS) 2285 set(GENCERTS 1) 2286endif() 2287message(" GENCERTS = ${GENCERTS}") 2288if (GENCERTS) 2289 message("Generating SSL Certificates for the test-server...") 2290 2291 set(TEST_SERVER_SSL_KEY "${PROJECT_BINARY_DIR}/libwebsockets-test-server.key.pem") 2292 set(TEST_SERVER_SSL_CERT "${PROJECT_BINARY_DIR}/libwebsockets-test-server.pem") 2293 2294 if (WIN32) 2295 if (MINGW) 2296 message("cmd = \"${OPENSSL_EXECUTABLE}\" req -new -newkey rsa:1024 -days 10000 -nodes -x509 -subj \"/C=GB/ST=Erewhon/L=All around/O=libwebsockets-test/CN=localhost\" -keyout \"${TEST_SERVER_SSL_KEY}\" -out \"${TEST_SERVER_SSL_CERT}\"") 2297 execute_process( 2298 COMMAND "${OPENSSL_EXECUTABLE}" req -new -newkey rsa:1024 -days 10000 -nodes -x509 -subj "/C=GB/ST=Erewhon/L=All around/O=libwebsockets-test/CN=localhost" -keyout "${TEST_SERVER_SSL_KEY}" -out "${TEST_SERVER_SSL_CERT}" 2299 RESULT_VARIABLE OPENSSL_RETURN_CODE) 2300 else() 2301 file(WRITE "${PROJECT_BINARY_DIR}/openssl_input.txt" 2302 "GB\n" 2303 "Erewhon\n" 2304 "All around\n" 2305 "libwebsockets-test\n" 2306 "localhost\n" 2307 "none@invalid.org\n\n" 2308 ) 2309 2310 # The "type" command is a bit picky with paths. 2311 file(TO_NATIVE_PATH "${PROJECT_BINARY_DIR}/openssl_input.txt" OPENSSL_INPUT_WIN_PATH) 2312 message("OPENSSL_INPUT_WIN_PATH = ${OPENSSL_INPUT_WIN_PATH}") 2313 message("cmd = \"${OPENSSL_EXECUTABLE}\" req -new -newkey rsa:1024 -days 10000 -nodes -x509 -keyout \"${TEST_SERVER_SSL_KEY}\" -out \"${TEST_SERVER_SSL_CERT}\"") 2314 2315 execute_process( 2316 COMMAND cmd /c type "${OPENSSL_INPUT_WIN_PATH}" 2317 COMMAND "${OPENSSL_EXECUTABLE}" req -new -newkey rsa:1024 -days 10000 -nodes -x509 -keyout "${TEST_SERVER_SSL_KEY}" -out "${TEST_SERVER_SSL_CERT}" 2318 RESULT_VARIABLE OPENSSL_RETURN_CODE 2319 OUTPUT_QUIET ERROR_QUIET) 2320 2321 message("\n") 2322 endif() 2323 2324 if (OPENSSL_RETURN_CODE) 2325 message(WARNING "!!! Failed to generate SSL certificate for Test Server using cmd.exe !!!:\nOpenSSL return code = ${OPENSSL_RETURN_CODE}") 2326 else() 2327 message("SUCCSESFULLY generated SSL certificate") 2328 endif() 2329 else() 2330 # Unix. 2331 execute_process( 2332 COMMAND printf "GB\\nErewhon\\nAll around\\nlibwebsockets-test\\n\\nlocalhost\\nnone@invalid.org\\n" 2333 COMMAND "${OPENSSL_EXECUTABLE}" 2334 req -new -newkey rsa:1024 -days 10000 -nodes -x509 -keyout "${TEST_SERVER_SSL_KEY}" -out "${TEST_SERVER_SSL_CERT}" 2335 RESULT_VARIABLE OPENSSL_RETURN_CODE 2336 # OUTPUT_QUIET ERROR_QUIET 2337 ) 2338 2339 if (OPENSSL_RETURN_CODE) 2340 message(WARNING "!!! Failed to generate SSL certificate for Test Server!!!:\nOpenSSL return code = ${OPENSSL_RETURN_CODE}") 2341 else() 2342 message("SUCCESSFULLY generated SSL certificate") 2343 endif() 2344 endif() 2345 2346 list(APPEND TEST_SERVER_DATA 2347 "${TEST_SERVER_SSL_KEY}" 2348 "${TEST_SERVER_SSL_CERT}") 2349endif() 2350 2351 2352 2353 2354# 2355# Test applications 2356# 2357set(TEST_APP_LIST) 2358if ((LWS_ROLE_H1 OR LWS_ROLE_H2) AND NOT LWS_WITHOUT_TESTAPPS) 2359 # 2360 # Helper function for adding a test app. 2361 # 2362 macro(create_test_app TEST_NAME MAIN_SRC S2 S3 S4 S5 S6) 2363 2364 set(TEST_SRCS ${MAIN_SRC}) 2365 set(TEST_HDR) 2366 if ("${S2}" STREQUAL "") 2367 else() 2368 list(APPEND TEST_SRCS ${S2}) 2369 endif() 2370 if ("${S3}" STREQUAL "") 2371 else() 2372 list(APPEND TEST_SRCS ${S3}) 2373 endif() 2374 if ("${S4}" STREQUAL "") 2375 else() 2376 list(APPEND TEST_SRCS ${S4}) 2377 endif() 2378 if ("${S5}" STREQUAL "") 2379 else() 2380 list(APPEND TEST_SRCS ${S5}) 2381 endif() 2382 if ("${S6}" STREQUAL "") 2383 else() 2384 list(APPEND TEST_SRCS ${S6}) 2385 endif() 2386 if (WIN32) 2387 list(APPEND TEST_SRCS 2388 ${WIN32_HELPERS_PATH}/getopt.c 2389 ${WIN32_HELPERS_PATH}/getopt_long.c 2390 ${WIN32_HELPERS_PATH}/gettimeofday.c 2391 ) 2392 2393 list(APPEND TEST_HDR 2394 ${WIN32_HELPERS_PATH}/getopt.h 2395 ${WIN32_HELPERS_PATH}/gettimeofday.h 2396 ) 2397 endif(WIN32) 2398 2399 source_group("Headers Private" FILES ${TEST_HDR}) 2400 source_group("Sources" FILES ${TEST_SRCS}) 2401 add_executable(${TEST_NAME} ${TEST_SRCS} ${TEST_HDR}) 2402 2403 if (LWS_LINK_TESTAPPS_DYNAMIC) 2404 if (NOT LWS_WITH_SHARED) 2405 message(FATAL_ERROR "Build of the shared library is disabled. LWS_LINK_TESTAPPS_DYNAMIC must be combined with LWS_WITH_SHARED.") 2406 endif() 2407 target_link_libraries(${TEST_NAME} websockets_shared) 2408 add_dependencies(${TEST_NAME} websockets_shared) 2409 else() 2410 if (NOT LWS_WITH_STATIC) 2411 message(FATAL_ERROR "Build of the static library is disabled. Disabled LWS_LINK_TESTAPPS_DYNAMIC must be combined with LWS_WITH_STATIC.") 2412 endif() 2413 target_link_libraries(${TEST_NAME} websockets) 2414 add_dependencies(${TEST_NAME} websockets) 2415 if (UNIX AND LWS_WITH_SSL AND NOT LWS_WITH_MBEDTLS) 2416 target_link_libraries(${TEST_NAME} dl) 2417 endif() 2418 endif() 2419 2420 if (LWS_WITH_HTTP_STREAM_COMPRESSION) 2421 target_link_libraries(${TEST_NAME} z) 2422 endif() 2423 2424 # Set test app specific defines. 2425 set_property(TARGET ${TEST_NAME} 2426 PROPERTY COMPILE_DEFINITIONS 2427 INSTALL_DATADIR="${CMAKE_INSTALL_PREFIX}/share" 2428 ) 2429 2430 # Prefix the binary names with libwebsockets. 2431 set_target_properties(${TEST_NAME} 2432 PROPERTIES 2433 OUTPUT_NAME libwebsockets-${TEST_NAME}) 2434 2435 # Add to the list of tests. 2436 list(APPEND TEST_APP_LIST ${TEST_NAME}) 2437 endmacro() 2438 2439 if (UNIX AND LWS_WITH_PLUGINS) 2440 set(CMAKE_C_FLAGS "-fPIC ${CMAKE_C_FLAGS}") 2441 if(NOT((${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") OR (${CMAKE_SYSTEM_NAME} MATCHES "QNX"))) 2442 target_link_libraries(websockets dl) 2443 endif() 2444 endif() 2445 2446 if (NOT LWS_WITHOUT_SERVER) 2447 # 2448 # test-server 2449 # 2450 if (NOT LWS_WITHOUT_TEST_SERVER) 2451 create_test_app(test-server "test-apps/test-server.c" 2452 "" 2453 "" 2454 "" 2455 "" 2456 "") 2457 2458 if (LWS_WITH_CGI AND LWS_WITH_TLS) 2459 create_test_app(test-sshd "test-apps/test-sshd.c" 2460 "" 2461 "" 2462 "" 2463 "" 2464 "") 2465 target_include_directories(test-sshd PRIVATE "${PROJECT_SOURCE_DIR}/plugins/ssh-base/include") 2466 2467 endif() 2468 2469 endif() 2470 2471 # 2472 # test-server-extpoll 2473 # 2474 if (NOT LWS_WITHOUT_TEST_SERVER_EXTPOLL AND NOT WIN32) 2475 create_test_app(test-server-extpoll 2476 "test-apps/test-server.c" 2477 "" 2478 "" 2479 "" 2480 "" 2481 "") 2482 # Set defines for this executable only. 2483 set_property( 2484 TARGET test-server-extpoll 2485 PROPERTY COMPILE_DEFINITIONS 2486 EXTERNAL_POLL 2487 INSTALL_DATADIR="${CMAKE_INSTALL_PREFIX}/share" 2488 ) 2489 2490 # We need to link against winsock code. 2491 if (WIN32) 2492 target_link_libraries(test-server-extpoll ws2_32.lib) 2493 endif(WIN32) 2494 endif() 2495 2496 if (LWS_WITH_LEJP) 2497 create_test_app( 2498 test-lejp 2499 "test-apps/test-lejp.c" 2500 "" 2501 "" 2502 "" 2503 "" 2504 "") 2505 endif() 2506 2507 # Data files for running the test server. 2508 list(APPEND TEST_SERVER_DATA 2509 "${PROJECT_SOURCE_DIR}/test-apps/favicon.ico" 2510 "${PROJECT_SOURCE_DIR}/test-apps/leaf.jpg" 2511 "${PROJECT_SOURCE_DIR}/test-apps/candide.zip" 2512 "${PROJECT_SOURCE_DIR}/test-apps/libwebsockets.org-logo.svg" 2513 "${PROJECT_SOURCE_DIR}/test-apps/http2.png" 2514 "${PROJECT_SOURCE_DIR}/test-apps/wss-over-h2.png" 2515 "${PROJECT_SOURCE_DIR}/test-apps/lws-common.js" 2516 "${PROJECT_SOURCE_DIR}/test-apps/test.html" 2517 "${PROJECT_SOURCE_DIR}/test-apps/test.css" 2518 "${PROJECT_SOURCE_DIR}/test-apps/test.js") 2519 2520 add_custom_command(TARGET test-server 2521 POST_BUILD 2522 COMMAND "${CMAKE_COMMAND}" -E make_directory "$<TARGET_FILE_DIR:test-server>/../share/libwebsockets-test-server") 2523 2524 # Copy the file needed to run the server so that the test apps can 2525 # reach them from their default output location 2526 foreach (TEST_FILE ${TEST_SERVER_DATA}) 2527 if (EXISTS ${TEST_FILE}) 2528 add_custom_command(TARGET test-server 2529 POST_BUILD 2530 COMMAND "${CMAKE_COMMAND}" -E copy "${TEST_FILE}" "$<TARGET_FILE_DIR:test-server>/../share/libwebsockets-test-server" VERBATIM) 2531 endif() 2532 endforeach() 2533 endif(NOT LWS_WITHOUT_SERVER) 2534 2535 if (NOT LWS_WITHOUT_CLIENT) 2536 # 2537 # test-client 2538 # 2539 if (NOT LWS_WITHOUT_TEST_CLIENT) 2540 create_test_app(test-client "test-apps/test-client.c" "" "" "" "" "") 2541 endif() 2542 2543 endif(NOT LWS_WITHOUT_CLIENT) 2544 2545 2546 if (LWS_WITH_PLUGINS AND LWS_WITH_SHARED) 2547 macro(create_plugin PLUGIN_NAME PLUGIN_INCLUDE MAIN_SRC S2 S3) 2548 2549 set(PLUGIN_SRCS ${MAIN_SRC}) 2550 2551 if ("${S2}" STREQUAL "") 2552 else() 2553 list(APPEND PLUGIN_SRCS ${S2}) 2554 endif() 2555 if ("${S3}" STREQUAL "") 2556 else() 2557 list(APPEND PLUGIN_SRCS ${S3}) 2558 endif() 2559 2560 if (WIN32) 2561 list(APPEND PLUGIN_SRCS 2562 ${WIN32_HELPERS_PATH}/getopt.c 2563 ${WIN32_HELPERS_PATH}/getopt_long.c 2564 ${WIN32_HELPERS_PATH}/gettimeofday.c 2565 ) 2566 2567 list(APPEND PLUGIN_HDR 2568 ${WIN32_HELPERS_PATH}/getopt.h 2569 ${WIN32_HELPERS_PATH}/gettimeofday.h 2570 ) 2571 endif(WIN32) 2572 2573 source_group("Headers Private" FILES ${PLUGIN_HDR}) 2574 source_group("Sources" FILES ${PLUGIN_SRCS}) 2575 add_library(${PLUGIN_NAME} SHARED ${PLUGIN_SRCS} ${PLUGIN_HDR}) 2576 2577 target_link_libraries(${PLUGIN_NAME} websockets_shared) 2578 add_dependencies(${PLUGIN_NAME} websockets_shared) 2579 include_directories(${PLUGIN_INCLUDE}) 2580 2581 # Set test app specific defines. 2582 set_property(TARGET ${PLUGIN_NAME} 2583 PROPERTY COMPILE_DEFINITIONS 2584 INSTALL_DATADIR="${CMAKE_INSTALL_PREFIX}/plugins" 2585 ) 2586 2587 SET_TARGET_PROPERTIES(${PLUGIN_NAME} 2588 PROPERTIES COMPILE_FLAGS ${CMAKE_C_FLAGS}) 2589 2590# set_target_properties(${PLUGIN_NAME} 2591# PROPERTIES 2592# OUTPUT_NAME ${PLUGIN_NAME}) 2593 2594 list(APPEND PLUGINS_LIST ${PLUGIN_NAME}) 2595 2596 endmacro() 2597 2598if (LWS_ROLE_WS) 2599 create_plugin(protocol_dumb_increment "" 2600 "plugins/protocol_dumb_increment.c" "" "") 2601 create_plugin(protocol_lws_mirror "" 2602 "plugins/protocol_lws_mirror.c" "" "") 2603 create_plugin(protocol_lws_status "" 2604 "plugins/protocol_lws_status.c" "" "") 2605 create_plugin(protocol_lws_table_dirlisting "" 2606 "plugins/generic-table/protocol_table_dirlisting.c" "" "") 2607 if (NOT WIN32) 2608 create_plugin(protocol_lws_raw_test "" 2609 "plugins/protocol_lws_raw_test.c" "" "") 2610 2611 if (UNIX AND LWS_HAVE_PTHREAD_H) 2612 create_plugin(protocol_deaddrop "" 2613 "plugins/deaddrop/protocol_lws_deaddrop.c" "" "") 2614 endif() 2615 endif() 2616 2617 if (LWS_WITH_SERVER_STATUS) 2618 create_plugin(protocol_lws_server_status "" 2619 "plugins/protocol_lws_server_status.c" "" "") 2620 endif() 2621 2622 if (NOT LWS_WITHOUT_CLIENT) 2623 create_plugin(protocol_client_loopback_test "" 2624 "plugins/protocol_client_loopback_test.c" "" "") 2625 endif() 2626 2627endif(LWS_ROLE_WS) 2628 2629 create_plugin(protocol_post_demo "" 2630 "plugins/protocol_post_demo.c" "" "") 2631 2632if (LWS_ROLE_RAW_PROXY) 2633 create_plugin(protocol_lws_raw_proxy "" 2634 "plugins/raw-proxy/protocol_lws_raw_proxy.c" "" "") 2635endif() 2636 2637if (LWS_WITH_FTS) 2638 create_plugin(protocol_fulltext_demo "" 2639 "plugins/protocol_fulltext_demo.c" "" "") 2640endif() 2641 2642 2643if (LWS_WITH_SSL) 2644 create_plugin(protocol_lws_ssh_base "plugins/ssh-base/include" 2645 "plugins/ssh-base/sshd.c;plugins/ssh-base/telnet.c;plugins/ssh-base/kex-25519.c" "plugins/ssh-base/crypto/chacha.c;plugins/ssh-base/crypto/ed25519.c;plugins/ssh-base/crypto/fe25519.c;plugins/ssh-base/crypto/ge25519.c;plugins/ssh-base/crypto/poly1305.c;plugins/ssh-base/crypto/sc25519.c;plugins/ssh-base/crypto/smult_curve25519_ref.c" "") 2646 create_plugin(protocol_lws_sshd_demo "plugins/ssh-base/include" "plugins/protocol_lws_sshd_demo.c" "" "") 2647 2648 include_directories("${PROJECT_SOURCE_DIR}/plugins/ssh-base/include") 2649endif() 2650 2651 2652 2653if (LWS_WITH_ACME) 2654 create_plugin(protocol_lws_acme_client "" 2655 "plugins/acme-client/protocol_lws_acme_client.c" "" "") 2656endif() 2657 2658if (LWS_WITH_GENERIC_SESSIONS AND LWS_ROLE_WS AND LWS_WITH_TLS) 2659 create_plugin(protocol_generic_sessions "" 2660 "plugins/generic-sessions/protocol_generic_sessions.c" 2661 "plugins/generic-sessions/utils.c" 2662 "plugins/generic-sessions/handlers.c") 2663 2664 if (WIN32) 2665 target_link_libraries(protocol_generic_sessions ${LWS_SQLITE3_LIBRARIES}) 2666 else() 2667 target_link_libraries(protocol_generic_sessions sqlite3 ) 2668 endif(WIN32) 2669 2670 create_plugin(protocol_lws_messageboard "" 2671 "plugins/generic-sessions/protocol_lws_messageboard.c" "" "") 2672 if (WIN32) 2673 target_link_libraries(protocol_lws_messageboard ${LWS_SQLITE3_LIBRARIES}) 2674 else() 2675 target_link_libraries(protocol_lws_messageboard sqlite3 ) 2676 endif(WIN32) 2677 2678endif(LWS_WITH_GENERIC_SESSIONS AND LWS_ROLE_WS AND LWS_WITH_TLS) 2679 2680 2681 endif(LWS_WITH_PLUGINS AND LWS_WITH_SHARED) 2682 2683 # 2684 # Copy OpenSSL dlls to the output directory on Windows. 2685 # (Otherwise we'll get an error when trying to run) 2686 # 2687 if (WIN32 AND LWS_WITH_SSL AND NOT LWS_WITH_WOLFSSL) 2688 if(OPENSSL_BIN_FOUND) 2689 message("OpenSSL dlls found:") 2690 message(" Libeay: ${LIBEAY_BIN}") 2691 message(" SSLeay: ${SSLEAY_BIN}") 2692 2693 foreach(TARGET_BIN ${TEST_APP_LIST}) 2694 add_custom_command(TARGET ${TARGET_BIN} 2695 POST_BUILD 2696 COMMAND "${CMAKE_COMMAND}" -E copy "${LIBEAY_BIN}" "$<TARGET_FILE_DIR:${TARGET_BIN}>" VERBATIM) 2697 add_custom_command(TARGET ${TARGET_BIN} 2698 POST_BUILD 2699 COMMAND "${CMAKE_COMMAND}" -E copy "${SSLEAY_BIN}" "$<TARGET_FILE_DIR:${TARGET_BIN}>" VERBATIM) 2700 2701 # 2702 # Win32: if we are using libuv, also need to copy it in the output dir 2703 # 2704 if (WIN32 AND LWS_WITH_LIBUV) 2705 STRING(REPLACE ".lib" ".dll" LIBUV_BIN ${LIBUV_LIBRARIES}) 2706 add_custom_command(TARGET ${TARGET_BIN} 2707 POST_BUILD 2708 COMMAND "${CMAKE_COMMAND}" -E copy "${LIBUV_BIN}" "$<TARGET_FILE_DIR:${TARGET_BIN}>" VERBATIM) 2709 endif() 2710 endforeach() 2711 endif() 2712 endif() 2713endif((LWS_ROLE_H1 OR LWS_ROLE_H2) AND NOT LWS_WITHOUT_TESTAPPS) 2714 2715if (LWS_WITH_LWSWS) 2716 list(APPEND LWSWS_SRCS 2717 "lwsws/main.c" 2718 ) 2719 2720 if (WIN32) 2721 list(APPEND LWSWS_SRCS 2722 ${WIN32_HELPERS_PATH}/getopt.c 2723 ${WIN32_HELPERS_PATH}/getopt_long.c 2724 ${WIN32_HELPERS_PATH}/gettimeofday.c 2725 ) 2726 2727 list(APPEND LWSWS_HDR 2728 ${WIN32_HELPERS_PATH}/getopt.h 2729 ${WIN32_HELPERS_PATH}/gettimeofday.h 2730 ) 2731 endif(WIN32) 2732 2733 source_group("Headers Private" FILES ${LWSWS_HDR}) 2734 source_group("Sources" FILES ${LWSWS_SRCS}) 2735 add_executable("lwsws" ${LWSWS_SRCS} ${LWSWS_HDR}) 2736 2737 target_link_libraries("lwsws" websockets_shared) 2738 add_dependencies("lwsws" websockets_shared) 2739 2740 # Set test app specific defines. 2741 set_property(TARGET "lwsws" 2742 PROPERTY COMPILE_DEFINITIONS 2743 INSTALL_DATADIR="${CMAKE_INSTALL_PREFIX}/share" 2744 ) 2745endif (LWS_WITH_LWSWS) 2746 2747# secure streams plugins 2748 2749if (LWS_WITH_SECURE_STREAMS) 2750 # 2751 # Helper function for adding a secure stream plugin 2752 # 2753 macro(create_ss_plugin NAME S2 S3 S4 S5 S6) 2754 2755 set(SSP_SRCS) 2756 set(SSP_PUBLIC_HDR) 2757 set(SSP_HDR) 2758 2759 if ("${S2}" STREQUAL "") 2760 else() 2761 list(APPEND SSP_SRCS 2762 lib/secure-streams/plugins/${NAME}/${S2}) 2763 endif() 2764 if ("${S3}" STREQUAL "") 2765 else() 2766 list(APPEND SSP_SRCS 2767 lib/secure-streams/plugins/${NAME}/${S3}) 2768 endif() 2769 if ("${S4}" STREQUAL "") 2770 else() 2771 list(APPEND SSP_SRCS 2772 lib/secure-streams/plugins/${NAME}/${S4}) 2773 endif() 2774 if ("${S5}" STREQUAL "") 2775 else() 2776 list(APPEND SSP_SRCS 2777 lib/secure-streams/plugins/${NAME}/${S5}) 2778 endif() 2779 if ("${S6}" STREQUAL "") 2780 else() 2781 list(APPEND SSP_SRCS 2782 lib/secure-streams/plugins/${NAME}/${S6}) 2783 endif() 2784 2785 source_group("Headers Private" FILES ${SSP_HDR}) 2786 source_group("Sources" FILES ${SSP_SRCS}) 2787 2788 add_library( ${NAME} STATIC 2789 ${SSP_HDR} ${SSP_PUBLIC_HDR} ${SSP_SRCS} ) 2790 2791 add_dependencies(${NAME} websockets_shared) 2792 list(APPEND SS_PLUGINS_LIST ${NAME}) 2793 endmacro() 2794 2795 include_directories(lib/secure-streams) 2796 2797 create_ss_plugin(ssp-h1url "h1url.c" "" "" "" "") 2798endif() 2799 2800if (UNIX) 2801 2802# Generate and install pkgconfig. 2803# (This is not indented, because the tabs will be part of the output) 2804file(WRITE "${PROJECT_BINARY_DIR}/libwebsockets.pc" 2805"prefix=\"${CMAKE_INSTALL_PREFIX}\" 2806exec_prefix=\${prefix} 2807libdir=\${exec_prefix}/lib${LIB_SUFFIX} 2808includedir=\${prefix}/include 2809 2810Name: libwebsockets 2811Description: Websockets server and client library 2812Version: ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH} 2813 2814Libs: -L\${libdir} -lwebsockets 2815Cflags: -I\${includedir}" 2816) 2817 2818 install(FILES "${PROJECT_BINARY_DIR}/libwebsockets.pc" 2819 DESTINATION lib${LIB_SUFFIX}/pkgconfig) 2820 2821file(WRITE "${PROJECT_BINARY_DIR}/libwebsockets_static.pc" 2822"prefix=\"${CMAKE_INSTALL_PREFIX}\" 2823exec_prefix=\${prefix} 2824libdir=\${exec_prefix}/lib${LIB_SUFFIX} 2825includedir=\${prefix}/include 2826 2827Name: libwebsockets_static 2828Description: Websockets server and client static library 2829Version: ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH} 2830 2831Libs: -L\${libdir} -lwebsockets_static 2832Libs.private: 2833Cflags: -I\${includedir}" 2834) 2835 2836 install(FILES "${PROJECT_BINARY_DIR}/libwebsockets_static.pc" 2837 DESTINATION lib${LIB_SUFFIX}/pkgconfig) 2838 2839 2840endif(UNIX) 2841 2842# 2843# Installation preparations. 2844# 2845 2846if(WIN32 AND NOT CYGWIN) 2847 set(DEF_INSTALL_CMAKE_DIR cmake) 2848else() 2849 set(DEF_INSTALL_CMAKE_DIR lib${LIB_SUFFIX}/cmake/libwebsockets) 2850endif() 2851 2852set(LWS_INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR} CACHE PATH "Installation directory for CMake files") 2853 2854# Export targets (This is used for other CMake projects to easily find the libraries and include files). 2855if (LWS_WITH_EXPORT_LWSTARGETS) 2856 export(TARGETS ${LWS_LIBRARIES} 2857 FILE "${PROJECT_BINARY_DIR}/LibwebsocketsTargets.cmake") 2858endif() 2859 2860export(PACKAGE libwebsockets) 2861 2862# Generate the config file for the build-tree. 2863set(LWS__INCLUDE_DIRS 2864 "${PROJECT_SOURCE_DIR}/lib" 2865 "${PROJECT_BINARY_DIR}") 2866set(LIBWEBSOCKETS_INCLUDE_DIRS ${LWS__INCLUDE_DIRS} CACHE PATH "Libwebsockets include directories") 2867configure_file(${PROJECT_SOURCE_DIR}/cmake/LibwebsocketsConfig.cmake.in 2868 ${PROJECT_BINARY_DIR}/LibwebsocketsConfig.cmake 2869 @ONLY) 2870 2871# Generate the config file for the installation tree. 2872get_filename_component(LWS_ABSOLUTE_INSTALL_CMAKE_DIR ${LWS_INSTALL_CMAKE_DIR} ABSOLUTE) 2873get_filename_component(LWS_ABSOLUTE_INSTALL_INCLUDE_DIR ${LWS_INSTALL_INCLUDE_DIR} ABSOLUTE) 2874file(RELATIVE_PATH 2875 REL_INCLUDE_DIR 2876 "${LWS_ABSOLUTE_INSTALL_CMAKE_DIR}" 2877 "${LWS_ABSOLUTE_INSTALL_INCLUDE_DIR}") # Calculate the relative directory from the cmake dir. 2878 2879# Note the EVENT_CMAKE_DIR is defined in JanssonConfig.cmake.in, 2880# we escape it here so it's evaluated when it is included instead 2881# so that the include dirs are given relative to where the 2882# config file is located. 2883set(LWS__INCLUDE_DIRS 2884 "\${LWS_CMAKE_DIR}/${REL_INCLUDE_DIR}") 2885configure_file(${PROJECT_SOURCE_DIR}/cmake/LibwebsocketsConfig.cmake.in 2886 ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/LibwebsocketsConfig.cmake 2887 @ONLY) 2888 2889# Generate version info for both build-tree and install-tree. 2890configure_file(${PROJECT_SOURCE_DIR}/cmake/LibwebsocketsConfigVersion.cmake.in 2891 ${PROJECT_BINARY_DIR}/LibwebsocketsConfigVersion.cmake 2892 @ONLY) 2893 2894 set_target_properties(${LWS_LIBRARIES} 2895 PROPERTIES PUBLIC_HEADER "${HDR_PUBLIC}") 2896 2897# 2898# Installation. 2899# 2900 2901install(DIRECTORY include/libwebsockets 2902 DESTINATION "${LWS_INSTALL_INCLUDE_DIR}" COMPONENT dev_headers) 2903 2904# Install libs and headers. 2905install(TARGETS ${LWS_LIBRARIES} 2906 EXPORT LibwebsocketsTargets 2907 LIBRARY DESTINATION "${LWS_INSTALL_LIB_DIR}${LIB_SUFFIX}" COMPONENT libraries 2908 ARCHIVE DESTINATION "${LWS_INSTALL_LIB_DIR}${LIB_SUFFIX}" COMPONENT libraries 2909 RUNTIME DESTINATION "${LWS_INSTALL_BIN_DIR}" COMPONENT libraries # Windows DLLs 2910 PUBLIC_HEADER DESTINATION "${LWS_INSTALL_INCLUDE_DIR}" COMPONENT dev) 2911 2912set(CPACK_COMPONENT_LIBRARIES_DISPLAY_NAME "Libraries") 2913set(CPACK_COMPONENT_DEV_DISPLAY_NAME "Development files") 2914 2915# Install test apps. 2916if (NOT LWS_WITHOUT_TESTAPPS) 2917 install(TARGETS ${TEST_APP_LIST} 2918 RUNTIME DESTINATION ${LWS_INSTALL_EXAMPLES_DIR} 2919 COMPONENT examples) 2920 set(CPACK_COMPONENT_EXAMPLES_DISPLAY_NAME "Example files") 2921endif() 2922 2923# lwsws 2924if (LWS_WITH_LWSWS) 2925 install(TARGETS lwsws 2926 RUNTIME DESTINATION "${LWS_INSTALL_BIN_DIR}" COMPONENT lwsws ) 2927endif() 2928 2929# Programs shared files used by the test-server. 2930if (NOT LWS_WITHOUT_TESTAPPS AND NOT LWS_WITHOUT_SERVER) 2931 install(FILES ${TEST_SERVER_DATA} 2932 DESTINATION share/libwebsockets-test-server 2933 COMPONENT examples) 2934 2935 install(FILES "${PROJECT_SOURCE_DIR}/test-apps/private/index.html" 2936 DESTINATION share/libwebsockets-test-server/private 2937 COMPONENT examples) 2938if (LWS_WITH_CGI) 2939 set(CGI_TEST_SCRIPT "${PROJECT_SOURCE_DIR}/test-apps/lws-cgi-test.sh") 2940 install(FILES ${CGI_TEST_SCRIPT} 2941 PERMISSIONS OWNER_EXECUTE GROUP_EXECUTE WORLD_EXECUTE OWNER_READ GROUP_READ WORLD_READ 2942 DESTINATION share/libwebsockets-test-server 2943 COMPONENT examples) 2944 endif() 2945endif() 2946 2947 2948if (NOT LWS_WITHOUT_TEST_SERVER AND NOT LWS_WITHOUT_SERVER AND NOT LWS_WITHOUT_TESTAPPS) 2949 install(FILES test-apps/lws-ssh-test-keys;test-apps/lws-ssh-test-keys.pub 2950 DESTINATION share/libwebsockets-test-server 2951 COMPONENT examples) 2952endif() 2953 2954# plugins 2955 2956if (LWS_WITH_PLUGINS) 2957 install(TARGETS ${PLUGINS_LIST} 2958 PERMISSIONS OWNER_WRITE OWNER_EXECUTE GROUP_EXECUTE WORLD_EXECUTE OWNER_READ GROUP_READ WORLD_READ 2959 DESTINATION share/libwebsockets-test-server/plugins 2960 COMPONENT plugins) 2961 2962 if (NOT WIN32) 2963 install(FILES plugins/deaddrop/assets/index.html;plugins/deaddrop/assets/deaddrop.js;plugins/deaddrop/assets/deaddrop.css;plugins/deaddrop/assets/drop.svg 2964 DESTINATION share/libwebsockets-test-server/deaddrop 2965 COMPONENT plugins) 2966 endif() 2967 2968 2969if (LWS_WITH_SERVER_STATUS) 2970 install(FILES plugins/server-status.html;plugins/server-status.js;plugins/server-status.css;plugins/lwsws-logo.png 2971 DESTINATION share/libwebsockets-test-server/server-status 2972 COMPONENT examples) 2973endif() 2974if (LWS_WITH_GENERIC_SESSIONS) 2975 install(FILES 2976 plugins/generic-sessions/assets/lwsgs-logo.png 2977 plugins/generic-sessions/assets/seats.jpg 2978 plugins/generic-sessions/assets/failed-login.html 2979 plugins/generic-sessions/assets/lwsgs.js 2980 plugins/generic-sessions/assets/lwsgs.css 2981 plugins/generic-sessions/assets/post-register-fail.html 2982 plugins/generic-sessions/assets/post-register-ok.html 2983 plugins/generic-sessions/assets/post-verify-ok.html 2984 plugins/generic-sessions/assets/post-verify-fail.html 2985 plugins/generic-sessions/assets/sent-forgot-ok.html 2986 plugins/generic-sessions/assets/sent-forgot-fail.html 2987 plugins/generic-sessions/assets/post-forgot-ok.html 2988 plugins/generic-sessions/assets/post-forgot-fail.html 2989 plugins/generic-sessions/assets/index.html 2990 DESTINATION share/libwebsockets-test-server/generic-sessions 2991 COMPONENT examples) 2992 install(FILES plugins/generic-sessions/assets/successful-login.html 2993 DESTINATION share/libwebsockets-test-server/generic-sessions/needauth 2994 COMPONENT examples) 2995 install(FILES plugins/generic-sessions/assets/admin-login.html 2996 DESTINATION share/libwebsockets-test-server/generic-sessions/needadmin 2997 COMPONENT examples) 2998endif() 2999 3000 install(FILES 3001 plugins/generic-table/assets/lwsgt.js 3002 plugins/generic-table/assets/index.html 3003 DESTINATION share/libwebsockets-test-server/generic-table 3004 COMPONENT examples) 3005 3006endif() 3007 3008# Install the LibwebsocketsConfig.cmake and LibwebsocketsConfigVersion.cmake 3009install(FILES 3010 "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/LibwebsocketsConfig.cmake" 3011 "${PROJECT_BINARY_DIR}/LibwebsocketsConfigVersion.cmake" 3012 DESTINATION "${LWS_INSTALL_CMAKE_DIR}" COMPONENT dev) 3013 3014# Install exports for the install-tree. 3015if (LWS_WITH_EXPORT_LWSTARGETS) 3016 install(EXPORT LibwebsocketsTargets 3017 DESTINATION "${LWS_INSTALL_CMAKE_DIR}" COMPONENT dev) 3018endif() 3019 3020# build subdir is not part of sources 3021set(CPACK_SOURCE_IGNORE_FILES $(CPACK_SOURCE_IGNORE_FILES) "/.git/" "/build/" "\\\\.tgz$" "\\\\.tar\\\\.gz$") 3022 3023# Most people are more used to "make dist" compared to "make package_source" 3024add_custom_target(dist COMMAND "${CMAKE_MAKE_PROGRAM}" package_source) 3025 3026include(UseRPMTools) 3027if (RPMTools_FOUND) 3028 RPMTools_ADD_RPM_TARGETS(libwebsockets scripts/libwebsockets.spec) 3029endif() 3030 3031message("---------------------------------------------------------------------") 3032message(" Settings: (For more help do cmake -LH <srcpath>)") 3033message("---------------------------------------------------------------------") 3034message(" LWS_WITH_STATIC = ${LWS_WITH_STATIC}") 3035message(" LWS_WITH_SHARED = ${LWS_WITH_SHARED}") 3036message(" LWS_WITH_SSL = ${LWS_WITH_SSL} (SSL Support)") 3037message(" LWS_SSL_CLIENT_USE_OS_CA_CERTS = ${LWS_SSL_CLIENT_USE_OS_CA_CERTS}") 3038message(" LWS_WITH_WOLFSSL = ${LWS_WITH_WOLFSSL} (wolfSSL/CyaSSL replacement for OpenSSL)") 3039if (LWS_WITH_WOLFSSL) 3040 message(" LWS_WOLFSSL_LIBRARIES = ${LWS_WOLFSSL_LIBRARIES}") 3041 message(" LWS_WOLFSSL_INCLUDE_DIRS = ${LWS_WOLFSSL_INCLUDE_DIRS}") 3042endif() 3043message(" LWS_WITH_MBEDTLS = ${LWS_WITH_MBEDTLS} (mbedTLS replacement for OpenSSL)") 3044message(" LWS_WITHOUT_BUILTIN_SHA1 = ${LWS_WITHOUT_BUILTIN_SHA1}") 3045message(" LWS_WITHOUT_BUILTIN_GETIFADDRS = ${LWS_WITHOUT_BUILTIN_GETIFADDRS}") 3046message(" LWS_WITHOUT_CLIENT = ${LWS_WITHOUT_CLIENT}") 3047message(" LWS_WITHOUT_SERVER = ${LWS_WITHOUT_SERVER}") 3048message(" LWS_LINK_TESTAPPS_DYNAMIC = ${LWS_LINK_TESTAPPS_DYNAMIC}") 3049message(" LWS_WITHOUT_TESTAPPS = ${LWS_WITHOUT_TESTAPPS}") 3050message(" LWS_WITHOUT_TEST_SERVER = ${LWS_WITHOUT_TEST_SERVER}") 3051message(" LWS_WITHOUT_TEST_SERVER_EXTPOLL = ${LWS_WITHOUT_TEST_SERVER_EXTPOLL}") 3052message(" LWS_WITHOUT_TEST_PING = ${LWS_WITHOUT_TEST_PING}") 3053message(" LWS_WITHOUT_TEST_CLIENT = ${LWS_WITHOUT_TEST_CLIENT}") 3054message(" LWS_WITHOUT_EXTENSIONS = ${LWS_WITHOUT_EXTENSIONS}") 3055message(" LWS_WITHOUT_DAEMONIZE = ${LWS_WITHOUT_DAEMONIZE}") 3056message(" LWS_WITH_LIBEV = ${LWS_WITH_LIBEV}") 3057message(" LWS_WITH_LIBUV = ${LWS_WITH_LIBUV}") 3058message(" LWS_WITH_LIBEVENT = ${LWS_WITH_LIBEVENT}") 3059message(" LWS_WITH_GLIB = ${LWS_WITH_GLIB}") 3060message(" LWS_IPV6 = ${LWS_IPV6}") 3061message(" LWS_UNIX_SOCK = ${LWS_UNIX_SOCK}") 3062message(" LWS_WITH_HTTP2 = ${LWS_WITH_HTTP2}") 3063message(" LWS_ROLE_MQTT = ${LWS_ROLE_MQTT}") 3064message(" LWS_SSL_SERVER_WITH_ECDH_CERT = ${LWS_SSL_SERVER_WITH_ECDH_CERT}") 3065message(" LWS_MAX_SMP = ${LWS_MAX_SMP}") 3066message(" LWS_HAVE_PTHREAD_H = ${LWS_HAVE_PTHREAD_H}") 3067message(" LWS_WITH_CGI = ${LWS_WITH_CGI}") 3068message(" LWS_HAVE_OPENSSL_ECDH_H = ${LWS_HAVE_OPENSSL_ECDH_H}") 3069message(" LWS_HAVE_SSL_CTX_set1_param = ${LWS_HAVE_SSL_CTX_set1_param}") 3070message(" LWS_HAVE_RSA_SET0_KEY = ${LWS_HAVE_RSA_SET0_KEY}") 3071message(" LWS_WITH_HTTP_PROXY = ${LWS_WITH_HTTP_PROXY}") 3072message(" LIBHUBBUB_LIBRARIES = ${LIBHUBBUB_LIBRARIES}") 3073message(" PLUGINS = ${PLUGINS_LIST}") 3074message(" LWS_WITH_ACCESS_LOG = ${LWS_WITH_ACCESS_LOG}") 3075message(" LWS_WITH_SERVER_STATUS = ${LWS_WITH_SERVER_STATUS}") 3076message(" LWS_WITH_LEJP = ${LWS_WITH_LEJP}") 3077message(" LWS_WITH_LEJP_CONF = ${LWS_WITH_LEJP_CONF}") 3078# this is broken atm 3079#message(" LWS_WITH_SMTP = ${LWS_WITH_SMTP}") 3080message(" LWS_WITH_GENERIC_SESSIONS = ${LWS_WITH_GENERIC_SESSIONS}") 3081message(" LWS_STATIC_PIC = ${LWS_STATIC_PIC}") 3082message(" LWS_WITH_RANGES = ${LWS_WITH_RANGES}") 3083message(" LWS_PLAT_OPTEE = ${LWS_PLAT_OPTEE}") 3084message(" LWS_PLAT_FREERTOS = ${LWS_PLAT_FREERTOS}") 3085message(" LWS_WITH_ZIP_FOPS = ${LWS_WITH_ZIP_FOPS}") 3086message(" LWS_AVOID_SIGPIPE_IGN = ${LWS_AVOID_SIGPIPE_IGN}") 3087message(" LWS_WITH_STATS = ${LWS_WITH_STATS}") 3088message(" LWS_WITH_SOCKS5 = ${LWS_WITH_SOCKS5}") 3089message(" LWS_HAVE_SYS_CAPABILITY_H = ${LWS_HAVE_SYS_CAPABILITY_H}") 3090message(" LWS_HAVE_LIBCAP = ${LWS_HAVE_LIBCAP}") 3091message(" LWS_WITH_PEER_LIMITS = ${LWS_WITH_PEER_LIMITS}") 3092message(" LWS_HAVE_ATOLL = ${LWS_HAVE_ATOLL}") 3093message(" LWS_HAVE__ATOI64 = ${LWS_HAVE__ATOI64}") 3094message(" LWS_HAVE_STAT32I64 = ${LWS_HAVE_STAT32I64}") 3095message(" LWS_HAS_INTPTR_T = ${LWS_HAS_INTPTR_T}") 3096message(" LWS_WITH_EXPORT_LWSTARGETS = ${LWS_WITH_EXPORT_LWSTARGETS}") 3097message(" LWS_WITH_ABSTRACT = ${LWS_WITH_ABSTRACT}") 3098 3099message("---------------------------------------------------------------------") 3100 3101# These will be available to parent projects including libwebsockets using add_subdirectory() 3102set(LIBWEBSOCKETS_LIBRARIES ${LWS_LIBRARIES} CACHE STRING "Libwebsocket libraries") 3103if (LWS_WITH_STATIC) 3104 set(LIBWEBSOCKETS_LIBRARIES_STATIC websockets CACHE STRING "Libwebsocket static library") 3105endif() 3106if (LWS_WITH_SHARED) 3107 set(LIBWEBSOCKETS_LIBRARIES_SHARED websockets_shared CACHE STRING "Libwebsocket shared library") 3108endif() 3109 3110if (LWS_WITH_MINIMAL_EXAMPLES) 3111 MACRO(SUBDIRLIST result curdir) 3112 FILE(GLOB children RELATIVE ${curdir} ${curdir}/*) 3113 SET(dirlist "") 3114 3115 FOREACH(child ${children}) 3116 IF(IS_DIRECTORY ${curdir}/${child}) 3117 LIST(APPEND dirlist ${child}) 3118 ENDIF() 3119 ENDFOREACH() 3120 3121 SET(${result} ${dirlist}) 3122 ENDMACRO() 3123 3124 SUBDIRLIST(SUBDIRS "${PROJECT_SOURCE_DIR}/minimal-examples") 3125 FOREACH(subdir ${SUBDIRS}) 3126 3127 SUBDIRLIST(SUBDIRS2 "${PROJECT_SOURCE_DIR}/minimal-examples/${subdir}") 3128 FOREACH(subdir2 ${SUBDIRS2}) 3129 if (EXISTS "${PROJECT_SOURCE_DIR}/minimal-examples/${subdir}/${subdir2}/CMakeLists.txt") 3130 message("Processing ${PROJECT_SOURCE_DIR}/minimal-examples/${subdir}/${subdir2}") 3131 add_subdirectory("${PROJECT_SOURCE_DIR}/minimal-examples/${subdir}/${subdir2}") 3132 endif() 3133 ENDFOREACH() 3134 ENDFOREACH() 3135ENDIF() 3136 3137# This must always be last! 3138include(CPack) 3139