diff --git a/CMakeLists.txt b/CMakeLists.txt index f23c0613a..9cbd27377 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -89,8 +89,6 @@ 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 # @@ -128,6 +126,11 @@ option(LWS_WITH_DISKCACHE "Hashed cache directory with lazy LRU deletion to size option(LWS_WITH_ASAN "Build with gcc runtime sanitizer options enabled (needs libasan)" OFF) option(LWS_WITH_DIR "Directory scanning api support" OFF) option(LWS_WITH_LEJP_CONF "With LEJP configuration parser as used by lwsws" OFF) +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}) +option(LWS_WITH_MINIZ "Use miniz instead of zlib" OFF) +# +# to use miniz, enable both LWS_WITH_ZLIB and LWS_WITH_MINIZ # # End of user settings # @@ -474,8 +477,11 @@ 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") +# if you gave LWS_WITH_MINIZ, point to MINIZ here if not found +# automatically + +set(LWS_ZLIB_LIBRARIES CACHE PATH "Path to the zlib/miniz library") +set(LWS_ZLIB_INCLUDE_DIRS CACHE PATH "Path to the zlib/miniz 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") @@ -852,7 +858,11 @@ endif() if (LWS_WITH_ZLIB AND NOT LWS_WITH_BUNDLED_ZLIB) - CHECK_INCLUDE_FILE(zlib.h LWS_HAVE_ZLIB_H) + if (LWS_WITH_MINIZ) + CHECK_INCLUDE_FILE(miniz.h LWS_HAVE_ZLIB_H) + else() + CHECK_INCLUDE_FILE(zlib.h LWS_HAVE_ZLIB_H) + endif() endif() # TODO: These can also be tested to see whether they actually work... @@ -1604,10 +1614,16 @@ if (LWS_WITH_ZLIB) message(FATAL_ERROR "Don't have bundled zlib for that platform") endif() elseif (NOT ZLIB_FOUND) - find_package(ZLIB REQUIRED) + if (LWS_WITH_MINIZ) + find_package(Miniz REQUIRED) + set(ZLIB_INCLUDE_DIRS ${MINIZ_INCLUDE_DIRS}) + set(ZLIB_LIBRARIES ${MINIZ_LIBRARIES}) + else() + find_package(ZLIB REQUIRED) + endif() endif() - message("zlib include dirs: ${ZLIB_INCLUDE_DIRS}") - message("zlib libraries: ${ZLIB_LIBRARIES}") + message("zlib/miniz include dirs: ${ZLIB_INCLUDE_DIRS}") + message("zlib/miniz libraries: ${ZLIB_LIBRARIES}") include_directories(${ZLIB_INCLUDE_DIRS}) list(APPEND LIB_LIST ${ZLIB_LIBRARIES}) endif() diff --git a/READMEs/README.build.md b/READMEs/README.build.md index 43ed88772..17044f6ff 100644 --- a/READMEs/README.build.md +++ b/READMEs/README.build.md @@ -367,6 +367,21 @@ this to work. **NOTE**: On windows use the .lib file extension for `LWS_CYASSL_LIBRARIES` instead. +@section gzip Selecting GZIP or MINIZ + +By default lws supports gzip when compression is needed. But you can tell it to use +MINIZ instead by using `-DLWS_WITH_MINIZ=1`. + +For native build cmake will try to find an existing libminiz.so or .a and build +against that and the found includes automatically. + +For cross-build or building against local miniz, you need the following kind of +cmake to tell it where to get miniz + +``` +cmake .. -DLWS_WITH_MINIZ=1 -DLWS_WITH_ZIP_FOPS=1 -DMINIZ_INCLUDE_DIRS="/projects/miniz;/projects/miniz/build" -DMINIZ_LIBRARIES=/projects/miniz/build/libminiz.so.2.1.0 +``` + @section esp32 Building for ESP32 Building for ESP32 requires the ESP-IDF framework. It can be built under Linux, OSX or Windows (MSYS2). diff --git a/cmake/FindMiniz.cmake b/cmake/FindMiniz.cmake new file mode 100644 index 000000000..105cee490 --- /dev/null +++ b/cmake/FindMiniz.cmake @@ -0,0 +1,35 @@ +# This module tries to find miniz library and include files +# +# MINIZ_INCLUDE_DIR, path where to find miniz.h +# MINIZ_LIBRARY_DIR, path where to find libminiz.so +# MINIZ_LIBRARIES, the library to link against +# MINIZ_FOUND, If false, do not try to use miniz +# +# This currently works probably only for Linux + +FIND_PATH ( MINIZ_INCLUDE_DIR miniz.h + /usr/local/include + /usr/include +) + +FIND_LIBRARY ( MINIZ_LIBRARIES libminiz.so libminiz.a libminiz.so.2 libminiz.so.0.1 + /usr/local/lib + /usr/local/lib64 + /usr/lib + /usr/lib64 +) + +GET_FILENAME_COMPONENT( MINIZ_LIBRARY_DIR ${MINIZ_LIBRARIES} PATH ) + +SET ( MINIZ_FOUND "NO" ) +IF ( MINIZ_INCLUDE_DIR ) + IF ( MINIZ_LIBRARIES ) + SET ( MINIZ_FOUND "YES" ) + ENDIF ( MINIZ_LIBRARIES ) +ENDIF ( MINIZ_INCLUDE_DIR ) + +MARK_AS_ADVANCED( + MINIZ_LIBRARY_DIR + MINIZ_INCLUDE_DIR + MINIZ_LIBRARIES +) diff --git a/cmake/lws_config.h.in b/cmake/lws_config.h.in index 0e1650805..3e6c22060 100644 --- a/cmake/lws_config.h.in +++ b/cmake/lws_config.h.in @@ -102,6 +102,7 @@ #cmakedefine LWS_WITH_LIBUV #cmakedefine LWS_WITH_LWSAC #cmakedefine LWS_WITH_MBEDTLS +#cmakedefine LWS_WITH_MINIZ #cmakedefine LWS_WITH_NETWORK #cmakedefine LWS_WITH_NO_LOGS #cmakedefine LWS_WITHOUT_CLIENT diff --git a/lib/roles/cgi/private.h b/lib/roles/cgi/private.h index b49f54504..53e5f7251 100644 --- a/lib/roles/cgi/private.h +++ b/lib/roles/cgi/private.h @@ -22,8 +22,12 @@ */ #if defined(LWS_WITH_ZLIB) +#if defined(LWS_WITH_MINIZ) +#include +#else #include #endif +#endif extern struct lws_role_ops role_ops_cgi; diff --git a/lib/roles/http/compression/private.h b/lib/roles/http/compression/private.h index 26aeaf348..97b5d7b0b 100644 --- a/lib/roles/http/compression/private.h +++ b/lib/roles/http/compression/private.h @@ -21,7 +21,11 @@ * This is included from core/private.h if LWS_WITH_HTTP_STREAM_COMPRESSION */ +#if defined(LWS_WITH_MINIZ) +#include +#else #include +#endif #if defined(LWS_WITH_HTTP_BROTLI) #include #include diff --git a/lib/roles/http/server/fops-zip.c b/lib/roles/http/server/fops-zip.c index 4db83ce62..5c1d4820e 100644 --- a/lib/roles/http/server/fops-zip.c +++ b/lib/roles/http/server/fops-zip.c @@ -53,7 +53,11 @@ #include "core/private.h" +#if defined(LWS_WITH_MINIZ) +#include +#else #include +#endif /* * This code works with zip format containers which may have files compressed diff --git a/lib/roles/ws/ext/extension-permessage-deflate.h b/lib/roles/ws/ext/extension-permessage-deflate.h index 85456bacd..7c5602023 100644 --- a/lib/roles/ws/ext/extension-permessage-deflate.h +++ b/lib/roles/ws/ext/extension-permessage-deflate.h @@ -1,5 +1,9 @@ +#if defined(LWS_WITH_MINIZ) +#include +#else #include +#endif #define DEFLATE_FRAME_COMPRESSION_LEVEL_SERVER 1 #define DEFLATE_FRAME_COMPRESSION_LEVEL_CLIENT Z_DEFAULT_COMPRESSION