Skip to content
Snippets Groups Projects
CMakeLists.txt 75.5 KiB
Newer Older
  • Learn to ignore specific revisions
  • cmake_minimum_required(VERSION 2.8.9)
    
    # General Advice
    #
    # For selecting between DEBUG / RELEASE, use -DCMAKE_BUILD_TYPE=DEBUG or =RELEASE
    #   debug builds include source level debug info and extra logging
    
    
    set(LWS_WITH_BUNDLED_ZLIB_DEFAULT OFF)
    if(WIN32)
    	set(LWS_WITH_BUNDLED_ZLIB_DEFAULT ON)
    endif()
    
    set(LWS_ROLE_RAW 1)
    
    set(LWS_WITH_POLL 1)
    
    Andy Green's avatar
    Andy Green committed
    #
    # Select features recommended for PC distro packaging
    #
    option(LWS_WITH_DISTRO_RECOMMENDED "Enable features recommended for distro packaging" OFF)
    
    option(LWS_FOR_GITOHASHI "Enable features recommended for use with gitohashi" OFF)
    
    option(LWS_ROLE_H1 "Compile with support for http/1 (needed for ws)" ON)
    
    option(LWS_ROLE_WS "Compile with support for websockets" ON)
    
    Andy Green's avatar
    Andy Green committed
    option(LWS_ROLE_DBUS "Compile with support for DBUS" OFF)
    
    option(LWS_WITH_HTTP2 "Compile with server support for HTTP/2" ON)
    
    option(LWS_WITH_LWSWS "Libwebsockets Webserver" OFF)
    option(LWS_WITH_CGI "Include CGI (spawn process with network-connected stdin/out/err) APIs" OFF)
    option(LWS_IPV6 "Compile with support for ipv6" OFF)
    
    option(LWS_UNIX_SOCK "Compile with support for UNIX domain socket" OFF)
    
    option(LWS_WITH_PLUGINS "Support plugins for protocols and extensions" OFF)
    
    option(LWS_WITH_HTTP_PROXY "Support for HTTP proxying" OFF)
    
    option(LWS_WITH_ZIP_FOPS "Support serving pre-zipped files" OFF)
    
    option(LWS_WITH_SOCKS5 "Allow use of SOCKS5 proxy on client connections" OFF)
    option(LWS_WITH_GENERIC_SESSIONS "With the Generic Sessions plugin" OFF)
    option(LWS_WITH_PEER_LIMITS "Track peers and restrict resources a single peer can allocate" OFF)
    option(LWS_WITH_ACCESS_LOG "Support generating Apache-compatible access logs" OFF)
    
    option(LWS_WITH_RANGES "Support http ranges (RFC7233)" OFF)
    
    option(LWS_WITH_SERVER_STATUS "Support json + jscript server monitoring" OFF)
    
    option(LWS_WITH_THREADPOOL "Managed worker thread pool support (relies on pthreads)" OFF)
    
    Andy Green's avatar
    Andy Green committed
    option(LWS_WITH_HTTP_STREAM_COMPRESSION "Support HTTP stream compression" OFF)
    option(LWS_WITH_HTTP_BROTLI "Also offer brotli http stream compression (requires LWS_WITH_HTTP_STREAM_COMPRESSION)" OFF)
    
    Andy Green's avatar
    Andy Green committed
    option(LWS_WITH_ACME "Enable support for ACME automatic cert acquisition + maintenance (letsencrypt etc)" OFF)
    
    option(LWS_WITH_HUBBUB "Enable libhubbub rewriting support" OFF)
    
    option(LWS_WITH_FTS "Full Text Search support" OFF)
    
    #
    # TLS library options... all except mbedTLS are basically OpenSSL variants.
    #
    option(LWS_WITH_SSL "Include SSL support (defaults to OpenSSL or similar, mbedTLS if LWS_WITH_MBEDTLS is set)" ON)
    option(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)
    option(LWS_WITH_BORINGSSL "Use BoringSSL replacement for OpenSSL" OFF)
    option(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)
    option(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)
    option(LWS_SSL_CLIENT_USE_OS_CA_CERTS "SSL support should make use of the OS-installed CA root certs" ON)
    #
    # Event library options (may select multiple, or none for default poll()
    #
    option(LWS_WITH_LIBEV "Compile with support for libev" OFF)
    option(LWS_WITH_LIBUV "Compile with support for libuv" OFF)
    option(LWS_WITH_LIBEVENT "Compile with support for libevent" OFF)
    #
    # Static / Dynamic build options
    #
    option(LWS_WITH_STATIC "Build the static version of the library" ON)
    option(LWS_WITH_SHARED "Build the shared version of the library" ON)
    option(LWS_LINK_TESTAPPS_DYNAMIC "Link the test apps to the shared version of the library. Default is to link statically" OFF)
    option(LWS_STATIC_PIC "Build the static version of the library with position-independent code" OFF)
    #
    # Specific platforms
    #
    option(LWS_WITH_ESP32 "Build for ESP32" OFF)
    option(LWS_PLAT_OPTEE "Build for OPTEE" OFF)
    #
    # Client / Server / Test Apps build control
    #
    option(LWS_WITHOUT_CLIENT "Don't build the client part of the library" OFF)
    option(LWS_WITHOUT_SERVER "Don't build the server part of the library" OFF)
    option(LWS_WITHOUT_TESTAPPS "Don't build the libwebsocket-test-apps" OFF)
    option(LWS_WITHOUT_TEST_SERVER "Don't build the test server" OFF)
    option(LWS_WITHOUT_TEST_SERVER_EXTPOLL "Don't build the test server version that uses external poll" OFF)
    option(LWS_WITHOUT_TEST_PING "Don't build the ping test application" OFF)
    option(LWS_WITHOUT_TEST_CLIENT "Don't build the client test application" OFF)
    #
    # Extensions (permessage-deflate)
    #
    
    option(LWS_WITHOUT_EXTENSIONS "Don't compile with extensions" ON)
    option(LWS_WITH_ZLIB "Include zlib support (required for extensions)" OFF)
    
    option(LWS_WITH_BUNDLED_ZLIB "Use bundled zlib version (Windows only)" ${LWS_WITH_BUNDLED_ZLIB_DEFAULT})
    #
    # Helpers + misc
    #
    option(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)
    option(LWS_FALLBACK_GETHOSTBYNAME "Also try to do dns resolution using gethostbyname if getaddrinfo fails" OFF)
    option(LWS_WITHOUT_BUILTIN_SHA1 "Don't build the lws sha-1 (eg, because openssl will provide it" OFF)
    option(LWS_WITH_LATENCY "Build latency measuring code into the library" OFF)
    option(LWS_WITHOUT_DAEMONIZE "Don't build the daemonization api" ON)
    option(LWS_SSL_SERVER_WITH_ECDH_CERT "Include SSL server use ECDH certificate" OFF)
    
    option(LWS_WITH_LEJP "With the Lightweight JSON Parser" ON)
    option(LWS_WITH_LEJP_CONF "With LEJP configuration parser as used by lwsws" ON)
    
    option(LWS_WITH_SQLITE3 "Require SQLITE3 support" OFF)
    option(LWS_WITH_SMTP "Provide SMTP support" OFF)
    option(LWS_WITH_NO_LOGS "Disable all logging from being compiled in" OFF)
    option(LWS_AVOID_SIGPIPE_IGN "Android 7+ reportedly needs this" OFF)
    option(LWS_WITH_STATS "Keep statistics of lws internal operations" OFF)
    option(LWS_WITH_JWS "JSON Web Signature (RFC7515) API" OFF)
    
    option(LWS_WITH_GENHASH "Enable support for Generic Hash (SHA1 + SHA2 with api independent of TLS backend)" OFF)
    option(LWS_WITH_GENRSA "Enable support for Generic RSA (RSA with api independent of TLS backend)" OFF)
    
    option(LWS_WITH_SELFTESTS "Selftests run at context creation" OFF)
    
    option(LWS_WITH_GCOV "Build with gcc gcov coverage instrumentation" OFF)
    
    option(LWS_WITH_EXPORT_LWSTARGETS "Export libwebsockets CMake targets.  Disable if they conflict with an outer cmake project." ON)
    
    option(LWS_REPRODUCIBLE "Build libwebsockets reproducible. It removes the build user and hostname from the build" ON)
    
    option(LWS_WITH_MINIMAL_EXAMPLES "Also build the normally standalone minimal examples, for QA" OFF)
    
    Andy Green's avatar
    Andy Green committed
    option(LWS_WITH_LWSAC "lwsac Chunk Allocation api" ON)
    
    option(LWS_WITH_DISKCACHE "Hashed cache directory with lazy LRU deletion to size limit" OFF)
    
    Andy Green's avatar
    Andy Green committed
    option(LWS_WITH_ASAN "Build with gcc runtime sanitizer options enabled (needs libasan)" OFF)
    
    if (LWS_FOR_GITOHASHI)
    	set(LWS_WITH_THREADPOOL 1)
    	set(LWS_WITH_HTTP2 1)
    	set(LWS_UNIX_SOCK 1)
    	set(LWS_WITH_HTTP_PROXY 1)
    	set(LWS_WITH_FTS 1)
    	set(LWS_WITH_DISKCACHE 1)
    	set(LWS_WITH_LWSAC 1)
    	set(LWS_WITH_LEJP_CONF 1)
    endif()
    
    Andy Green's avatar
    Andy Green committed
    
    if(LWS_WITH_DISTRO_RECOMMENDED)
    	set(LWS_WITH_HTTP2 1)
    	set(LWS_WITH_LWSWS 1)
    	set(LWS_WITH_CGI 1)
    	set(LWS_IPV6 1)
    	set(LWS_WITH_ZIP_FOPS 1)
    	set(LWS_WITH_SOCKS5 1)
    	set(LWS_WITH_RANGES 1)
    	set(LWS_WITH_ACME 1)
    	set(LWS_WITH_SERVER_STATUS 1)
    	set(LWS_WITH_LIBUV 1)
    	set(LWS_WITH_LIBEV 1)
    
    	# libev + libevent cannot coexist at build-time
    	set(LWS_WITH_LIBEVENT 0)
    
    Andy Green's avatar
    Andy Green committed
    	set(LWS_WITHOUT_EXTENSIONS 0)
    
    Andy Green's avatar
    Andy Green committed
    	set(LWS_ROLE_DBUS 1)
    
    Andy Green's avatar
    Andy Green committed
    	set(LWS_WITH_FTS 1)
    
    	set(LWS_WITH_THREADPOOL 1)
    	set(LWS_UNIX_SOCK 1)
    	set(LWS_WITH_HTTP_PROXY 1)
    	set(LWS_WITH_DISKCACHE 1)
    	set(LWS_WITH_LWSAC 1)
    
    Andy Green's avatar
    Andy Green committed
    	set(LWS_WITH_LEJP_CONF 1)
    	set(LWS_WITH_PLUGINS 1)
    
    Andy Green's avatar
    Andy Green committed
    # do you care about this?  Then send me a patch where it disables it on travis
    # but allows it on APPLE
    if (APPLE)
    	set(LWS_ROLE_DBUS 0)
    endif()
    
    
    if(NOT DEFINED CMAKE_BUILD_TYPE)
    	set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type")
    endif()
    
    
    # microsoft... that's why you can't have nice things
    
    if (WIN32 OR LWS_WITH_ESP32)
    	set(LWS_UNIX_SOCK 0)
    endif()
    
    
    Andy Green's avatar
    Andy Green committed
    if (LWS_WITH_ESP32)
    	set(LWS_WITH_LWSAC 0)
    
    Andy Green's avatar
    Andy Green committed
    	set(LWS_WITH_FTS 0)
    
    Andy Green's avatar
    Andy Green committed
    endif()
    
    
    project(libwebsockets C)
    
    set(CPACK_PACKAGE_NAME "${PACKAGE}")
    
    Andy Green's avatar
    Andy Green committed
    set(CPACK_PACKAGE_VERSION_MAJOR "3")
    
    Andy Green's avatar
    Andy Green committed
    set(CPACK_PACKAGE_VERSION_MINOR "1")
    set(CPACK_PACKAGE_VERSION_PATCH "0")
    set(CPACK_PACKAGE_RELEASE 1)
    set(CPACK_GENERATOR "RPM")
    
    set(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
    
    set(CPACK_PACKAGE_VENDOR "andy@warmcat.com")
    
    Andy Green's avatar
    Andy Green committed
    set(CPACK_PACKAGE_CONTACT "andy@warmcat.com")
    
    set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${PACKAGE} ${PACKAGE_VERSION}")
    
    Andy Green's avatar
    Andy Green committed
    set(SOVERSION "14")
    
    if(NOT CPACK_GENERATOR)
        if(UNIX)
            set(CPACK_GENERATOR "TGZ")
        else()
            set(CPACK_GENERATOR "ZIP")
        endif()
    endif()
    
    set(CPACK_SOURCE_GENERATOR "TGZ")
    set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}")
    set(VERSION "${CPACK_PACKAGE_VERSION}")
    
    set(LWS_LIBRARY_VERSION ${CPACK_PACKAGE_VERSION})
    
    set(LWS_LIBRARY_VERSION_MAJOR ${CPACK_PACKAGE_VERSION_MAJOR})
    set(LWS_LIBRARY_VERSION_MINOR ${CPACK_PACKAGE_VERSION_MINOR})
    set(LWS_LIBRARY_VERSION_PATCH ${CPACK_PACKAGE_VERSION_PATCH})
    
    
    set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake/")
    
    Andy Green's avatar
    Andy Green committed
    
    
    message(STATUS "CMAKE_TOOLCHAIN_FILE='${CMAKE_TOOLCHAIN_FILE}'")
    
    
    if(WIN32)
    	configure_file(${CMAKE_CURRENT_SOURCE_DIR}/win32port/version.rc.in ${CMAKE_CURRENT_BINARY_DIR}/win32port/version.rc @ONLY)
    	set(RESOURCES ${CMAKE_CURRENT_BINARY_DIR}/win32port/version.rc)
    endif()
    
    
    # Try to find the current Git hash.
    find_package(Git)
    if(GIT_EXECUTABLE)
    	execute_process(
    
    		WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
    
    Andy Green's avatar
    Andy Green committed
    		COMMAND "${GIT_EXECUTABLE}" describe --tags
    
    		OUTPUT_VARIABLE GIT_HASH
    		OUTPUT_STRIP_TRAILING_WHITESPACE
    		)
    	set(LWS_BUILD_HASH ${GIT_HASH})
    
    
    Andy Green's avatar
    Andy Green committed
    	# append the build user and hostname
    
    	if(NOT LWS_REPRODUCIBLE)
    		execute_process(
    			WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
    			COMMAND "whoami"
    			OUTPUT_VARIABLE GIT_USER
    			OUTPUT_STRIP_TRAILING_WHITESPACE
    			)
    		execute_process(
    			WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
    			COMMAND "hostname"
    			OUTPUT_VARIABLE GIT_HOST
    			OUTPUT_STRIP_TRAILING_WHITESPACE
    			)
    		string(REGEX REPLACE "([^\\])[\\]([^\\])" "\\1\\\\\\\\\\2" GIT_USER ${GIT_USER})
    		set(LWS_BUILD_HASH ${GIT_USER}@${GIT_HOST}-${GIT_HASH})
    	endif()
    
    	message("Git commit hash: ${LWS_BUILD_HASH}")
    
    Andy Green's avatar
    Andy Green committed
    # translate old functionality enables to set up ROLE enables so nothing changes
    
    if (LWS_WITH_HTTP2 AND LWS_WITHOUT_SERVER)
    	set(LWS_WITH_HTTP2 0)
    	message("HTTP2 disabled due to LWS_WITHOUT_SERVER")
    endif()
    
    
    Andy Green's avatar
    Andy Green committed
    if (LWS_WITH_HTTP2)
    	set(LWS_ROLE_H2 1)
    endif()
    if (LWS_WITH_CGI)
    	set(LWS_ROLE_CGI 1)
    endif()
    
    
    if (NOT LWS_ROLE_WS)
    	set(LWS_WITHOUT_EXTENSIONS 1)
    endif()
    
    
    Andy Green's avatar
    Andy Green committed
    include_directories(include plugins)
    
    Andy Green's avatar
    Andy Green committed
    if (LWS_WITH_LWSWS)
     message(STATUS "LWS_WITH_LWSWS --> Enabling LWS_WITH_PLUGINS and LWS_WITH_LIBUV")
     set(LWS_WITH_PLUGINS 1)
     set(LWS_WITH_LIBUV 1)
    
     set(LWS_WITH_ACCESS_LOG 1)
    
    Andy Green's avatar
    Andy Green committed
     set(LWS_WITH_SERVER_STATUS 1)
    
    Andy Green's avatar
    Andy Green committed
     set(LWS_WITH_LEJP 1)
    
    Andy Green's avatar
    Andy Green committed
     set(LWS_WITH_LEJP_CONF 1)
    
    Andy Green's avatar
    Andy Green committed
     set(LWS_WITH_PEER_LIMITS 1)
    
    Andy Green's avatar
    Andy Green committed
    endif()
    
    Andy Green's avatar
    Andy Green committed
    if (LWS_WITH_ACME)
     set (LWS_WITHOUT_CLIENT 0)
     set (LWS_WITHOUT_SERVER 0)
     set (LWS_WITH_JWS 1)
    endif()
    
    
    if (LWS_WITH_JWS)
     set(LWS_WITH_LEJP 1)
    
     set(LWS_WITH_GENHASH 1)
     set(LWS_WITH_GENRSA 1)
    
    if (LWS_WITH_PLUGINS AND NOT LWS_WITH_LIBUV)
    message(STATUS "LWS_WITH_PLUGINS --> Enabling LWS_WITH_LIBUV")
     set(LWS_WITH_LIBUV 1)
    endif()
    
    
    Andy Green's avatar
    Andy Green committed
    if (LWS_WITH_SMTP AND NOT LWS_WITH_LIBUV)
    message(STATUS "LWS_WITH_SMTP --> Enabling LWS_WITH_LIBUV")
     set(LWS_WITH_LIBUV 1)
    endif()
    
    
    if (LWS_WITH_PLUGINS OR LWS_WITH_CGI)
    	# sshd plugin
     set(LWS_WITH_GENHASH 1)
     set(LWS_WITH_GENRSA 1)
    endif()
    
    
    Andy Green's avatar
    Andy Green committed
    if (LWS_WITH_GENERIC_SESSIONS)
     set(LWS_WITH_SQLITE3 1)
     set(LWS_WITH_SMTP 1)
    endif()
    
    if (LWS_WITH_SMTP AND NOT LWS_WITH_LIBUV)
    message(STATUS "LWS_WITH_SMTP --> Enabling LWS_WITH_LIBUV")
     set(LWS_WITH_LIBUV 1)
    endif()
    
    
    Andy Green's avatar
    Andy Green committed
    if (LWS_WITH_ESP32)
     set(LWS_WITH_SHARED OFF)
    
     set(LWS_WITH_MBEDTLS ON)
    
      # set(LWS_WITHOUT_CLIENT ON)
    
    Andy Green's avatar
    Andy Green committed
     set(LWS_WITHOUT_TESTAPPS ON)
     set(LWS_WITHOUT_EXTENSIONS ON)
     set(LWS_WITH_PLUGINS OFF)
     set(LWS_WITH_RANGES ON)
     # this implies no pthreads in the lib
     set(LWS_MAX_SMP 1)
     set(LWS_HAVE_MALLOC 1)
     set(LWS_HAVE_REALLOC 1)
     set(LWS_HAVE_GETIFADDRS 1)
    
     set(LWS_WITH_ZIP_FOPS 1)
    
    Andy Green's avatar
    Andy Green committed
    endif()
    
    
    Andy Green's avatar
    Andy Green committed
    if (WIN32)
    set(LWS_MAX_SMP 1)
    
    Andy Green's avatar
    Andy Green committed
    set(LWS_WITH_THREADPOOL 0)
    
    Andy Green's avatar
    Andy Green committed
    endif()
    
    
    
    if (LWS_WITHOUT_SERVER)
    set(LWS_WITH_LWSWS OFF)
    endif()
    
    
    
    # confirm H1 relationships
    
    if (NOT LWS_ROLE_H1 AND LWS_ROLE_H2)
    	message(FATAL_ERROR "H2 requires LWS_ROLE_H1")
    endif()
    
    if (NOT LWS_ROLE_H1 AND LWS_ROLE_WS)
    	message(FATAL_ERROR "WS requires LWS_ROLE_H1")
    endif()
    
    if (NOT LWS_ROLE_H1 AND LWS_ROLE_CGI)
    	message(FATAL_ERROR "CGI requires LWS_ROLE_H1")
    endif()
    
    # confirm HTTP relationships
    
    if (NOT LWS_ROLE_H1 AND NOT LWS_ROLE_H2 AND LWS_WITH_HTTP_PROXY)
    	message(FATAL_ERROR "LWS_WITH_LWSWS requires LWS_ROLE_H1")
    endif()
    
    if (NOT LWS_ROLE_H1 AND NOT LWS_ROLE_H2 AND LWS_WITH_HTTP_PROXY)
    	message(FATAL_ERROR "LWS_WITH_HTTP_PROXY requires LWS_ROLE_H1")
    endif()
    
    if (NOT LWS_ROLE_H1 AND NOT LWS_ROLE_H2 AND LWS_WITH_RANGES)
    	message(FATAL_ERROR "LWS_WITH_RANGES requires LWS_ROLE_H1")
    endif()
    
    if (NOT LWS_ROLE_H1 AND NOT LWS_ROLE_H2 AND LWS_WITH_ACCESS_LOG)
    	message(FATAL_ERROR "LWS_WITH_ACCESS_LOG requires LWS_ROLE_H1")
    endif()
    
    
    
    Andy Green's avatar
    Andy Green committed
    if (LWS_WITH_HTTP_PROXY AND (LWS_WITHOUT_CLIENT OR LWS_WITHOUT_SERVER))
    
    	message("You have to enable both client and server for http proxy")
    	set(LWS_WITH_HTTP_PROXY 0)
    
    Andy Green's avatar
    Andy Green committed
    endif()
    
    
    # Allow the user to override installation directories.
    set(LWS_INSTALL_LIB_DIR       lib CACHE PATH "Installation directory for libraries")
    set(LWS_INSTALL_BIN_DIR       bin CACHE PATH "Installation directory for executables")
    set(LWS_INSTALL_INCLUDE_DIR   include CACHE PATH "Installation directory for header files")
    set(LWS_INSTALL_EXAMPLES_DIR  bin CACHE PATH "Installation directory for example files")
    
    
    # Allow the user to use the old CyaSSL options/library in stead of wolfSSL
    
    if (LWS_WITH_CYASSL AND LWS_WITH_WOLFSSL)
    	message(FATAL_ERROR "LWS_WITH_CYASSL and LWS_WITH_WOLFSSL are mutually exclusive!")
    
    if (LWS_WITH_CYASSL)
    
    	# Copy CyaSSL options to the wolfSSL options
    
    	set(LWS_WITH_WOLFSSL ${LWS_WITH_CYASSL} CACHE BOOL "Use wolfSSL/CyaSSL instead of OpenSSL" FORCE)
    
    	set(LWS_WOLFSSL_LIBRARIES ${LWS_CYASSL_LIBRARIES} CACHE PATH "Path to wolfSSL/CyaSSL libraries" FORCE)
    	set(LWS_WOLFSSL_INCLUDE_DIRS ${LWS_CYASSL_INCLUDE_DIRS} CACHE PATH "Path to wolfSSL/CyaSSL header files" FORCE)
    endif()
    
    
    if (LWS_WITHOUT_CLIENT AND LWS_WITHOUT_SERVER)
    
    	message(FATAL_ERROR "Makes no sense to compile with neither client nor server.")
    
    if (NOT (LWS_WITH_STATIC OR LWS_WITH_SHARED))
    
    	message(FATAL_ERROR "Makes no sense to compile with neither static nor shared libraries.")
    
    if (NOT LWS_WITHOUT_EXTENSIONS OR LWS_WITH_ZIP_FOPS)
    	set(LWS_WITH_ZLIB 1)
    
    endif()
    
    set(LWS_ZLIB_LIBRARIES CACHE PATH "Path to the zlib library")
    set(LWS_ZLIB_INCLUDE_DIRS CACHE PATH "Path to the zlib include directory")
    set(LWS_OPENSSL_LIBRARIES CACHE PATH "Path to the OpenSSL library")
    set(LWS_OPENSSL_INCLUDE_DIRS CACHE PATH "Path to the OpenSSL include directory")
    
    set(LWS_WOLFSSL_LIBRARIES CACHE PATH "Path to the wolfSSL library")
    set(LWS_WOLFSSL_INCLUDE_DIRS CACHE PATH "Path to the wolfSSL include directory")
    
    set(LWS_LIBEV_LIBRARIES CACHE PATH "Path to the libev library")
    
    set(LWS_LIBEV_INCLUDE_DIRS CACHE PATH "Path to the libev include directory")
    
    Andy Green's avatar
    Andy Green committed
    set(LWS_LIBUV_LIBRARIES CACHE PATH "Path to the libuv library")
    
    set(LWS_LIBUV_INCLUDE_DIRS CACHE PATH "Path to the libuv include directory")
    
    Yuchen Xie's avatar
    Yuchen Xie committed
    set(LWS_SQLITE3_LIBRARIES CACHE PATH "Path to the sqlite3 library")
    set(LWS_SQLITE3_INCLUDE_DIRS CACHE PATH "Path to the sqlite3 include directory")
    
    set(LWS_LIBEVENT_INCLUDE_DIRS CACHE PATH "Path to the libevent include directory")
    set(LWS_LIBEVENT_LIBRARIES CACHE PATH "Path to the libevent library")
    
    if (NOT LWS_WITH_SSL)
    	set(LWS_WITHOUT_BUILTIN_SHA1 OFF)
    endif()
    
    
    Andy Green's avatar
    Andy Green committed
    if (LWS_WITH_BORINGSSL)
    	# boringssl deprecated EVP_PKEY
    	set (LWS_WITH_GENHASH OFF)
    endif()
    
    
    if (LWS_WITH_SSL AND NOT LWS_WITH_WOLFSSL AND NOT LWS_WITH_MBEDTLS)
    
    	if ("${LWS_OPENSSL_LIBRARIES}" STREQUAL "" OR "${LWS_OPENSSL_INCLUDE_DIRS}" STREQUAL "")
    	else()
    
    		if (NOT LWS_WITH_ESP32)
    			set(OPENSSL_LIBRARIES ${LWS_OPENSSL_LIBRARIES})
    		endif()
    
    		set(OPENSSL_INCLUDE_DIRS ${LWS_OPENSSL_INCLUDE_DIRS})
    		set(OPENSSL_FOUND 1)
    	endif()
    endif()
    
    
    if (LWS_WITH_SSL AND LWS_WITH_WOLFSSL)
    
    	if ("${LWS_WOLFSSL_LIBRARIES}" STREQUAL "" OR "${LWS_WOLFSSL_INCLUDE_DIRS}" STREQUAL "")
    		if (NOT WOLFSSL_FOUND)
    
    			if (LWS_WITH_CYASSL)
    				message(FATAL_ERROR "You must set LWS_CYASSL_LIBRARIES and LWS_CYASSL_INCLUDE_DIRS when LWS_WITH_CYASSL is turned on.")
    
    				message(FATAL_ERROR "You must set LWS_WOLFSSL_LIBRARIES and LWS_WOLFSSL_INCLUDE_DIRS when LWS_WITH_WOLFSSL is turned on.")
    
    		set(WOLFSSL_LIBRARIES ${LWS_WOLFSSL_LIBRARIES})
    		set(WOLFSSL_INCLUDE_DIRS ${LWS_WOLFSSL_INCLUDE_DIRS})
    		set(WOLFSSL_FOUND 1)
    
    	set(USE_WOLFSSL 1)
    
    kaleb-himes's avatar
    kaleb-himes committed
    	set(LWS_WITH_TLS 1)
    
    	if (LWS_WITH_CYASSL)
    
    		set(USE_OLD_CYASSL 1)
    	endif()
    
    if (LWS_WITH_SSL AND LWS_WITH_MBEDTLS)
    
    	if ("${LWS_MBEDTLS_LIBRARIES}" STREQUAL "" OR "${LWS_MBEDTLS_INCLUDE_DIRS}" STREQUAL "" AND NOT LWS_WITH_ESP32)
    
    
    		find_path(LWS_MBEDTLS_INCLUDE_DIRS mbedtls/ssl.h)
    
    		find_library(MBEDTLS_LIBRARY mbedtls)
    		find_library(MBEDX509_LIBRARY mbedx509)
    		find_library(MBEDCRYPTO_LIBRARY mbedcrypto)
    
    		set(LWS_MBEDTLS_LIBRARIES "${MBEDTLS_LIBRARY}" "${MBEDX509_LIBRARY}" "${MBEDCRYPTO_LIBRARY}")
    
    		include(FindPackageHandleStandardArgs)
    		find_package_handle_standard_args(MBEDTLS DEFAULT_MSG
    			LWS_MBEDTLS_INCLUDE_DIRS MBEDTLS_LIBRARY MBEDX509_LIBRARY MBEDCRYPTO_LIBRARY)
    
    		mark_as_advanced(LWS_MBEDTLS_INCLUDE_DIRS MBEDTLS_LIBRARY MBEDX509_LIBRARY MBEDCRYPTO_LIBRARY)
    
    		if ("${LWS_MBEDTLS_LIBRARIES}" STREQUAL "" OR "${LWS_MBEDTLS_INCLUDE_DIRS}" STREQUAL "")
    
    			message(FATAL_ERROR "You must set LWS_MBEDTLS_LIBRARIES and LWS_MBEDTLS_INCLUDE_DIRS when LWS_WITH_MBEDTLS is turned on.")
    
    	set(MBEDTLS_LIBRARIES ${LWS_MBEDTLS_LIBRARIES})
    	set(MBEDTLS_INCLUDE_DIRS ${LWS_MBEDTLS_INCLUDE_DIRS})
    	set(MBEDTLS_FOUND 1)
    
    Andy Green's avatar
    Andy Green committed
    if (LWS_WITH_HTTP_STREAM_COMPRESSION)
    	set(LWS_WITH_ZLIB 1)
    endif()
    
    
    if (LWS_WITH_ZLIB AND NOT LWS_WITH_BUNDLED_ZLIB)
    
    	if ("${LWS_ZLIB_LIBRARIES}" STREQUAL "" OR "${LWS_ZLIB_INCLUDE_DIRS}" STREQUAL "")
    	else()
    		set(ZLIB_LIBRARIES ${LWS_ZLIB_LIBRARIES})
    		set(ZLIB_INCLUDE_DIRS ${LWS_ZLIB_INCLUDE_DIRS})
    		set(ZLIB_FOUND 1)
    	endif()
    endif()
    
    if (LWS_WITH_LIBEV)
    	if ("${LWS_LIBEV_LIBRARIES}" STREQUAL "" OR "${LWS_LIBEV_INCLUDE_DIRS}" STREQUAL "")
    	else()
    		set(LIBEV_LIBRARIES ${LWS_LIBEV_LIBRARIES})
    		set(LIBEV_INCLUDE_DIRS ${LWS_LIBEV_INCLUDE_DIRS})
    		set(LIBEV_FOUND 1)
    	endif()
    endif()
    
    
    Andy Green's avatar
    Andy Green committed
    if (LWS_WITH_LIBUV)
    	if ("${LWS_LIBUV_LIBRARIES}" STREQUAL "" OR "${LWS_LIBUV_INCLUDE_DIRS}" STREQUAL "")
    	else()
    		set(LIBUV_LIBRARIES ${LWS_LIBUV_LIBRARIES})
    		set(LIBUV_INCLUDE_DIRS ${LWS_LIBUV_INCLUDE_DIRS})
    		set(LIBUV_FOUND 1)
    	endif()
    endif()
    
    
    if (LWS_WITH_LIBEVENT)
    	if ("${LWS_LIBEVENT_LIBRARIES}" STREQUAL "" OR "${LWS_LIBEVENT_INCLUDE_DIRS}" STREQUAL "")
    	else()
    		set(LIBEVENT_LIBRARIES ${LWS_LIBEVENT_LIBRARIES})
    		set(LIBEVENT_INCLUDE_DIRS ${LWS_LIBEVENT_INCLUDE_DIRS})
    		set(LIBEVENT_FOUND 1)
    	endif()
    endif()
    
    
    Andy Green's avatar
    Andy Green committed
    if (LWS_WITH_SQLITE3)
    	if ("${LWS_SQLITE3_LIBRARIES}" STREQUAL "" OR "${LWS_SQLITE3_INCLUDE_DIRS}" STREQUAL "")
    	else()
    		set(SQLITE3_LIBRARIES ${LWS_SQLITE3_LIBRARIES})
    		set(SQLITE3_INCLUDE_DIRS ${LWS_SQLITE3_INCLUDE_DIRS})
    		set(SQLITE3_FOUND 1)
    	endif()
    endif()
    
    
    Andy Green's avatar
    Andy Green committed
    
    
    if (LWS_WITH_LIBEV AND LWS_WITH_LIBEVENT)
    	message(FATAL_ERROR "Sorry libev and libevent conflict with each others' namespace, you can only have one or the other")
    endif()
    
    
    # The base dir where the test-apps look for the SSL certs.
    
    set(LWS_OPENSSL_CLIENT_CERTS ../share CACHE PATH "Server SSL certificate directory")
    if (WIN32)
    	set(LWS_OPENSSL_CLIENT_CERTS . CACHE PATH "Client SSL certificate directory")
    
    	if (LWS_UNIX_SOCK)
    
    Yeonjun Lim's avatar
    Yeonjun Lim committed
    		set(LWS_UNIX_SOCK OFF)
    
    		message(WARNING "Windows does not support UNIX domain sockets")
    
    Yeonjun Lim's avatar
    Yeonjun Lim committed
    	endif()
    
    	set(LWS_OPENSSL_CLIENT_CERTS /etc/pki/tls/certs/ CACHE PATH "Client SSL certificate directory")
    
    Andy Green's avatar
    Andy Green committed
    # LWS_OPENSSL_SUPPORT deprecated... use LWS_WITH_TLS
    if (LWS_WITH_SSL OR LWS_WITH_MBEDTLS)
    
    Andy Green's avatar
    Andy Green committed
    	set(LWS_WITH_TLS 1)
    
    if (LWS_SSL_CLIENT_USE_OS_CA_CERTS)
    	set(LWS_SSL_CLIENT_USE_OS_CA_CERTS 1)
    endif()
    
    
    if (LWS_WITH_LATENCY)
    
    if (LWS_WITHOUT_DAEMONIZE OR WIN32)
    
    if (LWS_WITHOUT_SERVER)
    
    if (LWS_WITHOUT_CLIENT)
    
    Andrew Canaday's avatar
    Andrew Canaday committed
    if (LWS_WITH_LIBEV)
    
    	set(LWS_WITH_LIBEV 1)
    
    Andrew Canaday's avatar
    Andrew Canaday committed
    endif()
    
    
    Andy Green's avatar
    Andy Green committed
    if (LWS_WITH_LIBUV)
    
    	set(LWS_WITH_LIBUV 1)
    
    Andy Green's avatar
    Andy Green committed
    endif()
    
    
    if (LWS_WITH_LIBEVENT)
    
    	set(LWS_WITH_LIBEVENT 1)
    
    Andy Green's avatar
    Andy Green committed
    if (LWS_IPV6)
    
    	set(LWS_WITH_IPV6 1)
    
    James Devine's avatar
    James Devine committed
    endif()
    
    
    Yeonjun Lim's avatar
    Yeonjun Lim committed
    if (LWS_UNIX_SOCK)
    
        set(LWS_WITH_UNIX_SOCK 1)
    
    Yeonjun Lim's avatar
    Yeonjun Lim committed
    endif()
    
    
    if (LWS_WITH_HTTP2)
    
    	set(LWS_WITH_HTTP2 1)
    
    Andy Green's avatar
    Andy Green committed
    if ("${LWS_MAX_SMP}" STREQUAL "")
    
    Andy Green's avatar
    Andy Green committed
    	set(LWS_MAX_SMP 1)
    
    Andy Green's avatar
    Andy Green committed
    endif()
    
    
    if (MINGW)
    	set(LWS_MINGW_SUPPORT 1)
    
    	set(CMAKE_C_FLAGS "-D__USE_MINGW_ANSI_STDIO ${CMAKE_C_FLAGS}")
    
    Ralph Lessmann's avatar
    Ralph Lessmann committed
    	add_definitions(-DWINVER=0x0601 -D_WIN32_WINNT=0x0601)
    
    if (LWS_SSL_SERVER_WITH_ECDH_CERT)
    	set(LWS_SSL_SERVER_WITH_ECDH_CERT 1)
    endif()
    
    
    Markus Elfring's avatar
    Markus Elfring committed
    include_directories("${PROJECT_BINARY_DIR}")
    
    include(CheckCSourceCompiles)
    
    # Check for different inline keyword versions.
    foreach(KEYWORD "inline" "__inline__" "__inline")
    	set(CMAKE_REQUIRED_DEFINITIONS "-DKEYWORD=${KEYWORD}")
    	CHECK_C_SOURCE_COMPILES(
    		"
    		#include <stdio.h>
    
    		static KEYWORD void a() {}
    
    		int main(int argc, char **argv) { a(); return 0; }
    
    		" LWS_HAVE_${KEYWORD})
    
    if (NOT LWS_HAVE_inline)
    	if (LWS_HAVE___inline__)
    
    		set(inline __inline__)
    
    	elseif(LWS_HAVE___inline)
    
    		set(inline __inline)
    	endif()
    endif()
    
    
    # Put the libraries and binaries that get built into directories at the
    
    # top of the build tree rather than in hard-to-find leaf directories. 
    
    Markus Elfring's avatar
    Markus Elfring committed
    SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin")
    SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib")
    SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib")
    
    SET(LWS_INSTALL_PATH "${CMAKE_INSTALL_PREFIX}")
    
    
    # Put absolute path of dynamic libraries into the object code. Some
    # architectures, notably Mac OS X, need this.
    
    SET(CMAKE_INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/${LWS_INSTALL_LIB_DIR}${LIB_SUFFIX}")
    
    include(CheckSymbolExists)
    
    include(CheckIncludeFile)
    include(CheckIncludeFiles)
    include(CheckLibraryExists)
    
    include(CheckTypeSize)
    
    Andy Green's avatar
    Andy Green committed
    include(CheckCSourceCompiles)
    
    Andy Green's avatar
    Andy Green committed
    if (LWS_WITHOUT_BUILTIN_SHA1)
    	set(LWS_SHA1_USE_OPENSSL_NAME 1)
    endif()
    
    
    if (HAIKU)
    	set(CMAKE_REQUIRED_LIBRARIES network)
    endif()
    
    
    CHECK_C_SOURCE_COMPILES(
    	"#include <strings.h>
    
    	int main(int argc, char **argv) { char buf[100]; bzero(buf, 100); return 0; }
    
    	" LWS_HAVE_BZERO)
    
    
    CHECK_FUNCTION_EXISTS(fork LWS_HAVE_FORK)
    CHECK_FUNCTION_EXISTS(getenv LWS_HAVE_GETENV)
    CHECK_FUNCTION_EXISTS(malloc LWS_HAVE_MALLOC)
    CHECK_FUNCTION_EXISTS(memset LWS_HAVE_MEMSET)
    CHECK_FUNCTION_EXISTS(realloc LWS_HAVE_REALLOC)
    CHECK_FUNCTION_EXISTS(socket LWS_HAVE_SOCKET)
    CHECK_FUNCTION_EXISTS(strerror LWS_HAVE_STRERROR)
    CHECK_FUNCTION_EXISTS(vfork LWS_HAVE_VFORK)
    
    Andy Green's avatar
    Andy Green committed
    CHECK_FUNCTION_EXISTS(execvpe LWS_HAVE_EXECVPE)
    
    CHECK_FUNCTION_EXISTS(getifaddrs LWS_HAVE_GETIFADDRS)
    
    CHECK_FUNCTION_EXISTS(snprintf LWS_HAVE_SNPRINTF)
    CHECK_FUNCTION_EXISTS(_snprintf LWS_HAVE__SNPRINTF)
    CHECK_FUNCTION_EXISTS(_vsnprintf LWS_HAVE__VSNPRINTF)
    
    CHECK_FUNCTION_EXISTS(getloadavg LWS_HAVE_GETLOADAVG)
    
    CHECK_FUNCTION_EXISTS(atoll LWS_HAVE_ATOLL)
    CHECK_FUNCTION_EXISTS(_atoi64 LWS_HAVE__ATOI64)
    CHECK_FUNCTION_EXISTS(_stat32i64 LWS_HAVE__STAT32I64)
    
    
    if (NOT LWS_HAVE_GETIFADDRS)
    
    	if (LWS_WITHOUT_BUILTIN_GETIFADDRS)
    		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.")
    
    	endif()
    	set(LWS_BUILTIN_GETIFADDRS 1)
    
    CHECK_INCLUDE_FILE(dlfcn.h LWS_HAVE_DLFCN_H)
    CHECK_INCLUDE_FILE(fcntl.h LWS_HAVE_FCNTL_H)
    CHECK_INCLUDE_FILE(in6addr.h LWS_HAVE_IN6ADDR_H)
    CHECK_INCLUDE_FILE(memory.h LWS_HAVE_MEMORY_H)
    CHECK_INCLUDE_FILE(netinet/in.h LWS_HAVE_NETINET_IN_H)
    CHECK_INCLUDE_FILE(stdint.h LWS_HAVE_STDINT_H)
    CHECK_INCLUDE_FILE(stdlib.h LWS_HAVE_STDLIB_H)
    CHECK_INCLUDE_FILE(strings.h LWS_HAVE_STRINGS_H)
    CHECK_INCLUDE_FILE(string.h LWS_HAVE_STRING_H)
    CHECK_INCLUDE_FILE(sys/prctl.h LWS_HAVE_SYS_PRCTL_H)
    CHECK_INCLUDE_FILE(sys/socket.h LWS_HAVE_SYS_SOCKET_H)
    
    CHECK_INCLUDE_FILE(sys/sockio.h LWS_HAVE_SYS_SOCKIO_H)
    
    CHECK_INCLUDE_FILE(sys/stat.h LWS_HAVE_SYS_STAT_H)
    CHECK_INCLUDE_FILE(sys/types.h LWS_HAVE_SYS_TYPES_H)
    CHECK_INCLUDE_FILE(unistd.h LWS_HAVE_UNISTD_H)
    CHECK_INCLUDE_FILE(vfork.h LWS_HAVE_VFORK_H)
    
    Andy Green's avatar
    Andy Green committed
    CHECK_INCLUDE_FILE(sys/capability.h LWS_HAVE_SYS_CAPABILITY_H)
    
    CHECK_INCLUDE_FILE(malloc.h LWS_HAVE_MALLOC_H)
    
    CHECK_INCLUDE_FILE(pthread.h LWS_HAVE_PTHREAD_H)
    
    Andy Green's avatar
    Andy Green committed
    
    
    Andy Green's avatar
    Andy Green committed
    CHECK_LIBRARY_EXISTS(cap cap_set_flag "" LWS_HAVE_LIBCAP)
    
    if (LWS_ROLE_DBUS)
    
    	if (NOT LWS_DBUS_LIB)
    		set(LWS_DBUS_LIB "dbus-1")
    	endif()
    
    	CHECK_LIBRARY_EXISTS(${LWS_DBUS_LIB} dbus_connection_set_watch_functions "" LWS_HAVE_LIBDBUS)
    
    Andy Green's avatar
    Andy Green committed
    	if (NOT LWS_HAVE_LIBDBUS)
    		message(FATAL_ERROR "Install dbus-devel, or libdbus-1-dev etc")
    	endif()
    
    Andy Green's avatar
    Andy Green committed
    
    	if (NOT LWS_DBUS_INCLUDE1)
    		# look in fedora and debian / ubuntu place
    		if (EXISTS "/usr/include/dbus-1.0")
    			set(LWS_DBUS_INCLUDE1 "/usr/include/dbus-1.0")
    		else()
    			message(FATAL_ERROR "Set LWS_DBUS_INCLUDE1 to /usr/include/dbus-1.0 or wherever the main dbus includes are")
    		endif()
    	endif()
    
    	if (NOT LWS_DBUS_INCLUDE2)
    		# look in fedora... debian / ubuntu has the ARCH in the path...
    		if (EXISTS "/usr/lib64/dbus-1.0/include")
    			set(LWS_DBUS_INCLUDE2 "/usr/lib64/dbus-1.0/include")
    		else()
    			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")
    		endif()
    	endif()
    
    	set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES};${LWS_DBUS_INCLUDE1};${LWS_DBUS_INCLUDE2})
    
    	CHECK_C_SOURCE_COMPILES("#include <dbus/dbus.h>
    	int main(void) {
    		return 0;
    	}" LWS_DBUS_CHECK_OK)
    endif()
    
    Andy Green's avatar
    Andy Green committed
    
    
    if (LWS_WITH_LIBUV)
    CHECK_INCLUDE_FILE(uv-version.h LWS_HAVE_UV_VERSION_H)
    
      # libuv changed the location in 1.21.0. Retain both
      # checks temporarily to ensure a smooth transition.
    
      if (NOT LWS_HAVE_UV_VERSION_H)
    
        CHECK_INCLUDE_FILE(uv/version.h LWS_HAVE_NEW_UV_VERSION_H)
      endif()
    
    if (LWS_WITH_ZLIB AND NOT LWS_WITH_BUNDLED_ZLIB)
    
    Andy Green's avatar
    Andy Green committed
    	CHECK_INCLUDE_FILE(zlib.h LWS_HAVE_ZLIB_H)
    endif()
    
    # TODO: These can also be tested to see whether they actually work...
    
    set(LWS_HAVE_WORKING_FORK LWS_HAVE_FORK)
    set(LWS_HAVE_WORKING_VFORK LWS_HAVE_VFORK)
    
    
    CHECK_INCLUDE_FILES("stdlib.h;stdarg.h;string.h;float.h" STDC_HEADERS)
    
    
    Andy Green's avatar
    Andy Green committed
    CHECK_C_SOURCE_COMPILES("#include <stdint.h> 
    	int main(void) {
    		intptr_t test = 1;
    		return 0;
    	}" LWS_HAS_INTPTR_T)
    
    
    set(CMAKE_REQUIRED_FLAGS "-pthread")	
    CHECK_C_SOURCE_COMPILES("#define _GNU_SOURCE 
    	#include <pthread.h> 
    	int main(void) { 
    		pthread_t th = 0;
    		pthread_setname_np(th, NULL);
    		return 0;
    	}" LWS_HAS_PTHREAD_SETNAME_NP)
    
    
    if (NOT PID_T_SIZE)
    
    endif()
    
    if (NOT SIZE_T_SIZE)
    
    if (NOT LWS_HAVE_MALLOC)
    
    if (NOT LWS_HAVE_REALLOC)
    
    if (MSVC)
    	# Turn off stupid microsoft security warnings.
    	add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE)
    
    Markus Elfring's avatar
    Markus Elfring committed
    include_directories("${PROJECT_SOURCE_DIR}/lib")
    
    # Group headers and sources.
    # Some IDEs use this for nicer file structure.
    
    	"${PROJECT_SOURCE_DIR}/include/libwebsockets.h"
    
    	"${PROJECT_BINARY_DIR}/lws_config.h"
    	"${PROJECT_SOURCE_DIR}/plugins/ssh-base/include/lws-plugin-ssh.h"
    	)
    
    	lib/core/alloc.c
    	lib/core/context.c
    
    	lib/core/dummy-callback.c
    
    	lib/core/libwebsockets.c
    	lib/core/output.c
    
    	lib/core/pollfd.c
    	lib/core/service.c
    	lib/misc/base64-decode.c
    	lib/misc/lws-ring.c
    	lib/roles/pipe/ops-pipe.c)
    
    Andy Green's avatar
    Andy Green committed
    	
    if (LWS_WITH_THREADPOOL AND UNIX AND LWS_HAVE_PTHREAD_H)
    	list(APPEND SOURCES lib/misc/threadpool/threadpool.c)
    endif()
    
    if (LWS_ROLE_H1 OR LWS_ROLE_H2)
    	list(APPEND SOURCES
    		lib/roles/http/header.c
    		lib/roles/http/server/parsers.c)
    
    Andy Green's avatar
    Andy Green committed
    	if (LWS_WITH_HTTP_STREAM_COMPRESSION)
    		list(APPEND SOURCES
    			lib/roles/http/compression/stream.c
    			lib/roles/http/compression/deflate/deflate.c)
    		if (LWS_WITH_HTTP_BROTLI)
    			list(APPEND SOURCES
    				lib/roles/http/compression/brotli/brotli.c)
    		endif()
    	endif()
    
    Andy Green's avatar
    Andy Green committed
    if (LWS_ROLE_H1)
    	list(APPEND SOURCES
    		lib/roles/h1/ops-h1.c)
    endif()
    
    if (LWS_ROLE_WS)
    	list(APPEND SOURCES
    		lib/roles/ws/ops-ws.c)
    	if (NOT LWS_WITHOUT_CLIENT)
    		list(APPEND SOURCES
    			lib/roles/ws/client-ws.c
    
    			lib/roles/ws/client-parser-ws.c)
    
    Andy Green's avatar
    Andy Green committed
    	endif()
    	if (NOT LWS_WITHOUT_SERVER)
    		list(APPEND SOURCES
    			lib/roles/ws/server-ws.c)
    	endif()
    endif()
    
    if (LWS_ROLE_RAW)
    
    	list(APPEND SOURCES
    
    		lib/roles/raw-skt/ops-raw-skt.c
    		lib/roles/raw-file/ops-raw-file.c)
    
    Andy Green's avatar
    Andy Green committed
    endif()
    
    if (LWS_ROLE_CGI)
    	list(APPEND SOURCES
    		lib/roles/cgi/cgi-server.c
    		lib/roles/cgi/ops-cgi.c)
    
    Andy Green's avatar
    Andy Green committed
    if (LWS_ROLE_DBUS)
    	list(APPEND SOURCES
    		lib/roles/dbus/dbus.c)
    endif()
    
    
    if (LWS_WITH_ACCESS_LOG)
    	list(APPEND SOURCES
    
    Andy Green's avatar
    Andy Green committed
    		lib/roles/http/server/access-log.c)
    
    endif()
    
    if (LWS_WITH_PEER_LIMITS)
    	list(APPEND SOURCES
    
    Andy Green's avatar
    Andy Green committed
    		lib/misc/peer-limits.c)
    
    Andy Green's avatar
    Andy Green committed
    if (LWS_WITH_LWSAC)
    	list(APPEND SOURCES
    		lib/misc/lwsac/lwsac.c
    		lib/misc/lwsac/cached-file.c)
    endif()
    
    
    Andy Green's avatar
    Andy Green committed
    if (LWS_WITH_FTS)
    	list(APPEND SOURCES
    		lib/misc/fts/trie.c
    		lib/misc/fts/trie-fd.c)
    endif()
    
    
    if (LWS_WITH_DISKCACHE)
    	list(APPEND SOURCES
    		lib/misc/diskcache.c)
    endif()
    
    
    if (NOT LWS_WITHOUT_CLIENT)
    
    	list(APPEND SOURCES
    
    Andy Green's avatar
    Andy Green committed
    		lib/roles/http/client/client.c
    		lib/roles/http/client/client-handshake.c)
    endif()
    
    if (NOT LWS_WITHOUT_SERVER)
    	list(APPEND SOURCES
    
    Andy Green's avatar
    Andy Green committed
    		lib/roles/listen/ops-listen.c)
    
    Andy Green's avatar
    Andy Green committed
    if (LWS_WITH_MBEDTLS)
    
     	set(LWS_WITH_SSL ON)
    
    	list(APPEND HDR_PRIVATE
    
    		lib/tls/mbedtls/wrapper/include/internal/ssl3.h
    		lib/tls/mbedtls/wrapper/include/internal/ssl_cert.h
    		lib/tls/mbedtls/wrapper/include/internal/ssl_code.h
    		lib/tls/mbedtls/wrapper/include/internal/ssl_dbg.h
    		lib/tls/mbedtls/wrapper/include/internal/ssl_lib.h
    		lib/tls/mbedtls/wrapper/include/internal/ssl_methods.h
    		lib/tls/mbedtls/wrapper/include/internal/ssl_pkey.h
    		lib/tls/mbedtls/wrapper/include/internal/ssl_stack.h
    		lib/tls/mbedtls/wrapper/include/internal/ssl_types.h
    		lib/tls/mbedtls/wrapper/include/internal/ssl_x509.h
    		lib/tls/mbedtls/wrapper/include/internal/tls1.h
    		lib/tls/mbedtls/wrapper/include/internal/x509_vfy.h)
    
    
    	list(APPEND HDR_PRIVATE
    
    		lib/tls/mbedtls/wrapper/include/openssl/ssl.h)
    
    
    	list(APPEND HDR_PRIVATE
    
    		lib/tls/mbedtls/wrapper/include/platform/ssl_pm.h
    		lib/tls/mbedtls/wrapper/include/platform/ssl_port.h)
    
    	include_directories(lib/tls/mbedtls/wrapper/include)
    	include_directories(lib/tls/mbedtls/wrapper/include/platform)
    	include_directories(lib/tls/mbedtls/wrapper/include/internal)
    	include_directories(lib/tls/mbedtls/wrapper/include/openssl)
    
    	list(APPEND SOURCES
    
    		lib/tls/mbedtls/wrapper/library/ssl_cert.c
    		lib/tls/mbedtls/wrapper/library/ssl_lib.c
    		lib/tls/mbedtls/wrapper/library/ssl_methods.c
    		lib/tls/mbedtls/wrapper/library/ssl_pkey.c
    		lib/tls/mbedtls/wrapper/library/ssl_stack.c
    		lib/tls/mbedtls/wrapper/library/ssl_x509.c)
    
    
    	list(APPEND SOURCES
    
    		lib/tls/mbedtls/wrapper/platform/ssl_pm.c
    		lib/tls/mbedtls/wrapper/platform/ssl_port.c)
    
    if (LWS_WITH_SSL)
    	list(APPEND SOURCES
    
    		if (LWS_WITH_MBEDTLS)
    			list(APPEND SOURCES
    
    Andy Green's avatar
    Andy Green committed
    				lib/tls/mbedtls/ssl.c