diff --git a/CMakeLists.txt b/CMakeLists.txt index f1cd3b13e..bf0b8ac94 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,6 +52,7 @@ include(CheckIncludeFile) include(FeatureSummary) include(GNUInstallDirs) include(GetVersion) +include(FindSymbol) include(CMakeDependentOption) # Compiler flags @@ -90,7 +91,7 @@ find_package(Etherlab) # Check for tools find_program(PASTE NAMES paste) if(NOT PASTE) - message(SEND_ERROR "GNU paste is missing. Please install coreutils") + message(SEND_ERROR "GNU paste is missing. Please install coreutils") endif() # Check programs @@ -124,6 +125,9 @@ if(NOT RE_FOUND) pkg_check_modules(RE IMPORTED_TARGET libre>=0.5.6) endif() +# Check if libwebsockets is build with deflate extension +FindSymbol(${LIBWEBSOCKETS_LINK_LIBRARIES} lws_extension_callback_pm_deflate LWS_DEFLATE_FOUND) + # Build options cmake_dependent_option(WITH_HOOKS "Build with support for processing hook plugins" ON "" OFF) cmake_dependent_option(WITH_WEB "Build with internal webserver" ON "LIBWEBSOCKETS_FOUND" OFF) diff --git a/cmake/FindSymbol.cmake b/cmake/FindSymbol.cmake new file mode 100644 index 000000000..da933e021 --- /dev/null +++ b/cmake/FindSymbol.cmake @@ -0,0 +1,36 @@ +# CMakeLists.txt. +# +# @author Steffen Vogel +# @copyright 2014-2020, Institute for Automation of Complex Power Systems, EONERC +# @license GNU General Public License (version 3) +# +# VILLASnode +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +################################################################################### + +function(FindSymbol LIBRARY SYMBOL FOUND) + find_program(OBJDUMP_EXECUTABLE NAMES objdump) + + execute_process( + COMMAND /bin/sh -c "${OBJDUMP_EXECUTABLE} -T ${LIBRARY} | grep ${SYMBOL} | wc -l" + OUTPUT_VARIABLE OUTPUT + ) + + if(OUTPUT GREATER 0) + set(${FOUND} "${SYMBOL}" PARENT_SCOPE) + else() + set(${FOUND} "${SYMBOL}-NOTFOUND" PARENT_SCOPE) + endif() +endfunction() diff --git a/include/villas/node/config.h.in b/include/villas/node/config.h.in index b2e7b443a..54df6a1f7 100644 --- a/include/villas/node/config.h.in +++ b/include/villas/node/config.h.in @@ -65,3 +65,6 @@ #cmakedefine PROTOBUF_FOUND #cmakedefine LIBNL3_ROUTE_FOUND #cmakedefine IBVERBS_FOUND + +/* Library features */ +#cmakedefine LWS_DEFLATE_FOUND diff --git a/lib/web.cpp b/lib/web.cpp index 96397611b..28aa79704 100644 --- a/lib/web.cpp +++ b/lib/web.cpp @@ -110,6 +110,7 @@ static lws_http_mount mounts[] = { /** List of libwebsockets extensions. */ static const lws_extension extensions[] = { +#ifdef LWS_DEFLATE_FOUND { .name = "permessage-deflate", .callback = lws_extension_callback_pm_deflate, @@ -120,6 +121,7 @@ static const lws_extension extensions[] = { .callback = lws_extension_callback_pm_deflate, .client_offer = "deflate_frame" }, +#endif /* LWS_DEFLATE_FOUND */ { nullptr /* terminator */ } }; diff --git a/src/villas-relay.cpp b/src/villas-relay.cpp index 5e9714671..86f2f6645 100644 --- a/src/villas-relay.cpp +++ b/src/villas-relay.cpp @@ -522,6 +522,7 @@ int Relay::main() { } const std::vector Relay::extensions = { +#ifdef LWS_DEFLATE_FOUND { "permessage-deflate", lws_extension_callback_pm_deflate, @@ -532,6 +533,7 @@ const std::vector Relay::extensions = { lws_extension_callback_pm_deflate, "deflate_frame" }, +#endif /* LWS_DEFLATE_FOUND */ { nullptr /* terminator */ } };