mirror of
https://github.com/warmcat/libwebsockets.git
synced 2025-03-30 00:00:16 +01:00

LWS_EXTERN needs to be empty for windows when declaring functions in the headers. But for data, it needs the explicit extern otherwise on windows or mingw based builds, it thinks we are redeclaring the data each time.
321 lines
10 KiB
CMake
321 lines
10 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()
|
|
|
|
#
|
|
# 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)
|
|
add_subdir_include_dirs(event-libs)
|
|
|
|
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()
|
|
|
|
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 libraries
|
|
ARCHIVE DESTINATION "${LWS_INSTALL_LIB_DIR}${LIB_SUFFIX}" COMPONENT libraries
|
|
RUNTIME DESTINATION "${LWS_INSTALL_BIN_DIR}" COMPONENT libraries # 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)
|
|
|
|
# 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}"
|
|
)
|
|
|
|
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}"
|
|
)
|
|
|
|
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)
|
|
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()
|