1
0
Fork 0
mirror of https://github.com/warmcat/libwebsockets.git synced 2025-03-30 00:00:16 +01:00
libwebsockets/lib/CMakeLists.txt
Andy Green c6c7ab2b44 event libs: default to building as dynamically loaded plugins
Event lib support as it has been isn't scaling well, at the low level
libevent and libev headers have a namespace conflict so they can't
both be built into the same image, and at the distro level, binding
all the event libs to libwebsockets.so makes a bloaty situation for
packaging, lws will drag in all the event libs every time.

This patch implements the plan discussed here

https://github.com/warmcat/libwebsockets/issues/1980

and refactors the event lib support so they are built into isolated
plugins and bound at runtime according to what the application says
it wants to use.  The event lib plugins can be packaged individually
so that only the needed sets of support are installed (perhaps none
of them if the user code is OK with the default poll() loop).  And
dependent user code can mark the specific event loop plugin package
as required so pieces are added as needed.

The eventlib-foreign example is also refactored to build the selected
lib support isolated.

A readme is added detailing the changes and how to use them.

https://libwebsockets.org/git/libwebsockets/tree/READMEs/README.event-libs.md
2020-08-31 16:51:37 +01:00

357 lines
11 KiB
CMake

#
# libwebsockets - small server side websockets and web server implementation
#
# Copyright (C) 2010 - 2020 Andy Green <andy@warmcat.com>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to
# deal in the Software without restriction, including without limitation the
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
# sell copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
# IN THE SOFTWARE.
#
include_directories(.)
macro(add_subdir_include_dirs arg1)
add_subdirectory(${arg1})
list(APPEND LWS_LIB_BUILD_INC_PATHS ${_CMAKE_INC_LIST})
endmacro()
set(LWS_LIB_INCLUDES "")
#
# Plat specific build items
#
if (LWS_PLAT_FREERTOS)
add_subdir_include_dirs(plat/freertos)
if (ESP_PLATFORM)
include_directories($ENV{IDF_PATH}/components/freertos/include
$ENV{IDF_PATH}/components/freertos/xtensa/include
$ENV{IDF_PATH}/components/xtensa/include
$ENV{IDF_PATH}/components/xtensa/esp32/include
$ENV{IDF_PATH}/components/esp_common/include
$ENV{IDF_PATH}/components/esp_timer/include
$ENV{IDF_PATH}/components/soc/include
$ENV{IDF_PATH}/components/soc/src/esp32/include
$ENV{IDF_PATH}/components/lwip/port/esp32/include
$ENV{IDF_PATH}/components/lwip/lwip/src/include
$ENV{IDF_PATH}/components/lwip/port/esp32/include
${CMAKE_BINARY_DIR}/config
$ENV{IDF_PATH}/components/esp_rom/include
$ENV{IDF_PATH}/components/esp_system/include
$ENV{IDF_PATH}/components/lwip/include/apps/sntp
$ENV{IDF_PATH}/components/soc/soc/esp32/include
$ENV{IDF_PATH}/components/heap/include
$ENV{IDF_PATH}/components/mbedtls/mbedtls/include
$ENV{IDF_PATH}/components/mbedtls/port/include
$ENV{IDF_PATH}/components/esp_wifi/include
$ENV{IDF_PATH}/components/esp_event/include
$ENV{IDF_PATH}/components/esp_netif/include
$ENV{IDF_PATH}/components/esp_eth/include
$ENV{IDF_PATH}/components/driver/include
$ENV{IDF_PATH}/components/soc/soc/include
$ENV{IDF_PATH}/components/tcpip_adapter/include
$ENV{IDF_PATH}/components/lwip/include/apps
$ENV{IDF_PATH}/components/nvs_flash/include
$ENV{IDF_PATH}/components/esp32/include
$ENV{IDF_PATH}/components/spi_flash/include
$ENV{IDF_PATH}/components/mdns/include
$ENV{IDF_PATH}/components/lwip/lwip/src/include/lwip
$ENV{IDF_PATH}/components/lwip/lwip/src/include
$ENV{IDF_PATH}/components/lwip/lwip/src/include/lwip
$ENV{IDF_PATH}/components/newlib/platform_include )
endif()
else()
if (LWS_PLAT_OPTEE)
add_subdir_include_dirs(plat/optee)
else()
if (WIN32)
add_subdir_include_dirs(plat/windows)
else()
add_subdir_include_dirs(plat/unix)
endif()
endif()
endif()
if (LIB_LIST)
set(CMAKE_REQUIRED_LIBRARIES ${LIB_LIST} ${CMAKE_REQUIRED_LIBRARIES})
endif()
if (LWS_WITH_ZLIB)
if (LWS_WITH_BUNDLED_ZLIB)
if (WIN32)
# it's trying to delete internal zlib entry
LIST(REMOVE_AT CMAKE_REQUIRED_LIBRARIES 0 )
endif()
endif()
endif()
# ideally we want to use pipe2()
CHECK_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)
# tcp keepalive needs this on linux to work practically... but it only exists
# after kernel 2.6.37
CHECK_C_SOURCE_COMPILES("#include <netinet/tcp.h>\nint main(void) { return TCP_USER_TIMEOUT; }\n" LWS_HAVE_TCP_USER_TIMEOUT)
if (LWS_WITH_TLS)
add_subdir_include_dirs(tls)
endif()
# Generate the lws_config.h that includes all the private compilation settings.
configure_file(
"${PROJECT_SOURCE_DIR}/cmake/lws_config_private.h.in"
"${PROJECT_BINARY_DIR}/lws_config_private.h")
add_subdir_include_dirs(core)
add_subdir_include_dirs(misc)
add_subdir_include_dirs(system)
if (LWS_WITH_DRIVERS)
add_subdir_include_dirs(drivers)
endif()
if (LWS_WITH_NETWORK)
add_subdir_include_dirs(core-net)
if (LWS_WITH_ABSTRACT)
add_subdir_include_dirs(abstract)
endif()
add_subdir_include_dirs(roles)
endif()
if (LWS_WITH_JOSE)
add_subdir_include_dirs(jose)
endif()
if (LWS_WITH_SECURE_STREAMS)
add_subdir_include_dirs(secure-streams)
endif()
add_subdir_include_dirs(event-libs)
if (LWS_WITH_STATIC)
if (LWS_STATIC_PIC)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
endif()
add_library(websockets STATIC ${SOURCES})# ${HDR_PUBLIC})
set_target_properties(websockets PROPERTIES LINKER_LANGUAGE C)
list(APPEND LWS_LIBRARIES websockets)
target_include_directories(websockets PRIVATE ${LWS_LIB_BUILD_INC_PATHS})
if (WIN32)
# Windows uses the same .lib ending for static libraries and shared
# library linker files, so rename the static library.
set_target_properties(websockets
PROPERTIES
OUTPUT_NAME websockets_static)
endif()
if (UNIX AND LWS_WITH_PLUGINS)
set (CMAKE_POSITION_INDEPENDENT_CODE ON)
if (NOT((${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") OR
(${CMAKE_SYSTEM_NAME} MATCHES "QNX")))
if (LWS_WITH_STATIC)
target_link_libraries(websockets dl)
endif()
endif()
endif()
endif()
if (LWS_WITH_SHARED)
if (NOT RESOURCES)
set(RESOURCES "")
endif()
add_library(websockets_shared SHARED ${SOURCES})# ${RESOURCES} ${HDR_PUBLIC})
set_target_properties(websockets_shared PROPERTIES LINKER_LANGUAGE C)
list(APPEND LWS_LIBRARIES websockets_shared)
target_include_directories(websockets_shared PRIVATE ${LWS_LIB_BUILD_INC_PATHS})
# We want the shared lib to be named "libwebsockets"
# not "libwebsocket_shared".
set_target_properties(websockets_shared
PROPERTIES
OUTPUT_NAME websockets)
if (WIN32)
# Compile as DLL (export function declarations)
set_property(
TARGET websockets_shared
PROPERTY COMPILE_DEFINITIONS
LWS_DLL
LWS_INTERNAL)
endif()
if (APPLE)
set_property(TARGET websockets_shared PROPERTY MACOSX_RPATH YES)
endif()
endif()
#
# expose the library private include dirs to plugins, test apps etc that are
# part of the lib build but different targets
#
if (LWS_WITH_SHARED)
get_target_property(LWS_LIB_INCLUDES websockets_shared INCLUDE_DIRECTORIES)
else()
get_target_property(LWS_LIB_INCLUDES websockets INCLUDE_DIRECTORIES)
endif()
# Set the so version of the lib.
# Equivalent to LDFLAGS=-version-info x:x:x
if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR COMPILER_IS_CLANG)
foreach(lib ${LWS_LIBRARIES})
set_target_properties(${lib}
PROPERTIES
SOVERSION ${SOVERSION})
endforeach()
endif()
# Setup the linking for all libs.
foreach (lib ${LWS_LIBRARIES})
target_link_libraries(${lib} ${LIB_LIST})
endforeach()
#
# These will be available to parent projects including libwebsockets
# using add_subdirectory()
#
set(LIBWEBSOCKETS_LIBRARIES ${LWS_LIBRARIES} CACHE STRING "Libwebsocket libraries")
if (LWS_WITH_STATIC)
set(LIBWEBSOCKETS_LIBRARIES_STATIC websockets CACHE STRING "Libwebsocket static library")
endif()
if (LWS_WITH_SHARED)
set(LIBWEBSOCKETS_LIBRARIES_SHARED websockets_shared CACHE STRING "Libwebsocket shared library")
endif()
# Install libs and headers.
install(TARGETS ${LWS_LIBRARIES}
EXPORT LibwebsocketsTargets
LIBRARY DESTINATION "${LWS_INSTALL_LIB_DIR}${LIB_SUFFIX}" COMPONENT core
ARCHIVE DESTINATION "${LWS_INSTALL_LIB_DIR}${LIB_SUFFIX}" COMPONENT core
RUNTIME DESTINATION "${LWS_INSTALL_BIN_DIR}" COMPONENT core # Windows DLLs
PUBLIC_HEADER DESTINATION "${LWS_INSTALL_INCLUDE_DIR}" COMPONENT dev)
#set(CPACK_COMPONENT_LIBRARIES_DISPLAY_NAME "Libraries" PARENT_SCOPE)
set(CPACK_COMPONENT_DEV_DISPLAY_NAME "Development files" PARENT_SCOPE)
if (UNIX)
# figure out pkfcfg required libs here
set(lws_requires "")
if (LWS_HAVE_LIBCAP)
if (NOT lws_requires STREQUAL "")
set(lws_requires "${lws_requires},libcap")
else()
set(lws_requires "libcap")
endif()
endif()
# Generate and install pkgconfig.
# (This is not indented, because the tabs will be part of the output)
file(WRITE "${PROJECT_BINARY_DIR}/libwebsockets.pc"
"prefix=\"${CMAKE_INSTALL_PREFIX}\"
exec_prefix=\${prefix}
libdir=\${exec_prefix}/lib${LIB_SUFFIX}
includedir=\${prefix}/include
Name: libwebsockets
Description: Websockets server and client library
Version: ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}
Libs: -L\${libdir} -lwebsockets
Cflags: -I\${includedir}
"
)
if (NOT ${lws_requires} STREQUAL "")
file(APPEND "${PROJECT_BINARY_DIR}/libwebsockets.pc" "Requires: ${lws_requires}")
endif()
install(FILES "${PROJECT_BINARY_DIR}/libwebsockets.pc"
DESTINATION lib${LIB_SUFFIX}/pkgconfig)
file(WRITE "${PROJECT_BINARY_DIR}/libwebsockets_static.pc"
"prefix=\"${CMAKE_INSTALL_PREFIX}\"
exec_prefix=\${prefix}
libdir=\${exec_prefix}/lib${LIB_SUFFIX}
includedir=\${prefix}/include
Name: libwebsockets_static
Description: Websockets server and client static library
Version: ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}
Libs: -L\${libdir} -lwebsockets_static
Libs.private:
Cflags: -I\${includedir}
"
)
if (NOT ${lws_requires} STREQUAL "")
file(APPEND "${PROJECT_BINARY_DIR}/libwebsockets_static.pc" "Requires: ${lws_requires}")
endif()
install(FILES "${PROJECT_BINARY_DIR}/libwebsockets_static.pc"
DESTINATION lib${LIB_SUFFIX}/pkgconfig)
endif(UNIX)
# Keep explicit parent scope exports at end
#
export_to_parent_intermediate()
if (DEFINED LWS_PLAT_UNIX)
set(LWS_PLAT_UNIX ${LWS_PLAT_UNIX} PARENT_SCOPE)
if (ILLUMOS)
add_definitions("-D__illumos__")
endif()
endif()
set(LWS_HAVE_MBEDTLS_NET_SOCKETS ${LWS_HAVE_MBEDTLS_NET_SOCKETS} PARENT_SCOPE)
set(TEST_SERVER_SSL_KEY "${TEST_SERVER_SSL_KEY}" PARENT_SCOPE)
set(TEST_SERVER_SSL_CERT "${TEST_SERVER_SSL_CERT}" PARENT_SCOPE)
set(TEST_SERVER_DATA ${TEST_SERVER_DATA} PARENT_SCOPE)
set(LWS_HAVE_PIPE2 ${LWS_HAVE_PIPE2} PARENT_SCOPE)
set(LWS_LIBRARIES ${LWS_LIBRARIES} PARENT_SCOPE)
if (DEFINED WIN32_HELPERS_PATH)
set(WIN32_HELPERS_PATH ${WIN32_HELPERS_PATH} PARENT_SCOPE)
endif()
if (DEFINED HDR_PRIVATE)
set(HDR_PRIVATE ${HDR_PRIVATE} PARENT_SCOPE)
endif()
if (DEFINED ZLIB_FOUND)
set(ZLIB_FOUND ${ZLIB_FOUND} PARENT_SCOPE)
endif()
if (DEFINED LIB_LIST_AT_END)
set(LIB_LIST_AT_END ${LIB_LIST_AT_END} PARENT_SCOPE)
endif()
set(USE_WOLFSSL ${USE_WOLFSSL} PARENT_SCOPE)
set(LWS_DEPS_LIB_PATHS ${LWS_DEPS_LIB_PATHS} PARENT_SCOPE)