summaryrefslogtreecommitdiff
path: root/m4/websockets.m4
diff options
context:
space:
mode:
Diffstat (limited to 'm4/websockets.m4')
-rw-r--r--m4/websockets.m4234
1 files changed, 234 insertions, 0 deletions
diff --git a/m4/websockets.m4 b/m4/websockets.m4
new file mode 100644
index 0000000..ab1a41d
--- /dev/null
+++ b/m4/websockets.m4
@@ -0,0 +1,234 @@
+# Macro to check if websockets support was enabled. This macro also
+# takes care of detecting older versions of libwebsockets (lacking
+# pkg-config support, no per-context userdata) and propagating this
+# information to config.h and the compilation process.
+#
+
+AC_DEFUN([CHECK_WEBSOCKETS],
+[
+AC_LANG_PUSH([C])
+AC_ARG_ENABLE(websockets,
+ [ --enable-websockets enable websockets support],
+ [enable_websockets=$enableval], [enable_websockets=auto])
+
+# Check if we have properly packaged libwebsockets (json-c is now mandatory
+# and already has been tested for).
+if test "$enable_websockets" != "no"; then
+ PKG_CHECK_MODULES(WEBSOCKETS, [libwebsockets],
+ [have_websockets=yes], [have_websockets=no])
+ if test "$have_websockets" = "yes"; then
+ WEBSOCKETS_CFLAGS="`pkg-config --cflags libwebsockets`"
+ # Check for a couple of recent features we need to adopt to.
+ saved_CFLAGS="$CFLAGS"
+ saved_LDFLAGS="$LDFLAGS"
+ saved_LIBS="$LIBS"
+ # Note that (at least with autoconf 2.69 and gcc 4.7.2), setting
+ # LD_AS_NEEDED to 1 breaks AC_LINK_IFELSE. That macro generates
+ # the compilation command so that the libraries are specified
+ # before the generated C source so all referenced/tested symbols
+ # from any of the libraries end up being undefined. This fools
+ # AC_LINK_IFELSE to consider the test a failure and select the
+ # else branch.
+ # rpmbuild always sets LD_AS_NEEDED to 1. To work around this save
+ # and restore LD_AS_NEEDED for the duration of the AC_LINK_IFELSE
+ # tests.
+ saved_LD_AS_NEEDED="$LD_AS_NEEDED"
+ unset LD_AS_NEEDED
+ CFLAGS="`pkg-config --cflags libwebsockets`"
+ LIBS="`pkg-config --libs libwebsockets`"
+
+ # Check for new context creation API.
+ AC_MSG_CHECKING([for WEBSOCKETS new context creation API])
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <stdlib.h>
+ #include <libwebsockets.h>]],
+ [[struct libwebsocket_context *ctx;
+ ctx = libwebsocket_create_context(NULL);]])],
+ [websockets_cci=yes],
+ [websockets_cci=no])
+ AC_MSG_RESULT([$websockets_cci])
+
+ # Check for new libwebsockets_get_internal_extensions.
+ AC_MSG_CHECKING([for WEBSOCKETS internal extension query API])
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <stdlib.h>
+ #include <libwebsockets.h>]],
+ [[struct libwebsocket_extension *ext;
+ ext = libwebsocket_get_internal_extensions();]])],
+ [websockets_query_ext=yes],
+ [websockets_query_ext=no])
+ AC_MSG_RESULT([$websockets_query_ext])
+
+ # Check for newer lws_set_log_level API.
+ # Note that we cheat heavily here: instead of rolling a proper
+ # test, we blindly assume gcc, turn on the -Werror flag (to catch
+ # calls with a mismatching function pointer) and hope that we will
+ # not get false negatives because of other warnings.
+ no_werror_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -Werror"
+ AC_MSG_CHECKING([for WEBSOCKETS updated logging API.])
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <stdlib.h>
+ #include <libwebsockets.h>
+ static void logger(int level, const char *line) {
+ return;
+ }]],
+ [[lws_set_log_level(LLL_INFO, logger);]])],
+ [websockets_log_with_level=yes],
+ [websockets_log_with_level=no])
+ AC_MSG_RESULT([$websockets_log_with_level])
+
+ # Check whether we have libwebsocket_close_and_free_session.
+ AC_MSG_CHECKING([for WEBSOCKETS close_and_free_session API])
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <stdlib.h>
+ #include <libwebsockets.h>]],
+ [[libwebsocket_close_and_free_session(NULL, NULL, 0);]])],
+ [websockets_close_session=yes],
+ [websockets_close_session=no])
+ AC_MSG_RESULT([$websockets_close_session])
+
+ # Check for LWS_CALLBACK_FILTER_HTTP_CONNECTION.
+ AC_MSG_CHECKING([for WEBSOCKETS LWS_CALLBACK_FILTER_HTTP_CONNECTION])
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <stdlib.h>
+ #include <libwebsockets.h>]],
+ [[int foo = LWS_CALLBACK_FILTER_HTTP_CONNECTION;]])],
+ [websockets_filter_http_connection=yes],
+ [websockets_filter_http_connection=no])
+ AC_MSG_RESULT([$websockets_filter_http_connection])
+
+ # Check for LWS_CALLBACK_CHANGE_MODE_POLL_FD.
+ AC_MSG_CHECKING([for WEBSOCKETS LWS_CALLBACK_CHANGE_MODE_POLL_FD])
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <stdlib.h>
+ #include <libwebsockets.h>]],
+ [[int foo = LWS_CALLBACK_CHANGE_MODE_POLL_FD;]])],
+ [websockets_change_poll=yes],
+ [websockets_change_poll=no])
+ AC_MSG_RESULT([$websockets_change_poll])
+
+ # Check the signature of libwebsockets_serve_http_file to see if
+ # it takes an extra (other_headers) argument.
+ AC_MSG_CHECKING([for WEBSOCKETS libwebsockets_serve_http_file other_headers argument])
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <stdlib.h>
+ #include <libwebsockets.h>]],
+ [[return libwebsockets_serve_http_file(NULL, NULL, "", "", "");]])],
+ [websockets_serve_file_extraarg=yes],
+ [websockets_serve_file_extraarg=no])
+ AC_MSG_RESULT([$websockets_serve_file_extraarg])
+
+ CFLAGS="$saved_CFLAGS"
+ LDFLAGS="$saved_LDFLAGS"
+ LIBS="$saved_LIBS"
+ if test -n "$saved_LD_AS_NEEDED"; then
+ export LD_AS_NEEDED="$saved_LD_AS_NEEDED"
+ fi
+ else
+ WEBSOCKETS_CFLAGS=""
+ fi
+
+ # Check for older websockets.
+ if test "$have_websockets" = "no"; then
+ saved_LDFLAGS="$LDFLAGS"
+ saved_LIBS="$LIBS"
+ LIBS="-lwebsockets"
+ AC_MSG_CHECKING([for WEBSOCKETS without pkg-config support])
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <stdlib.h>
+ #include <libwebsockets.h>]],
+ [[struct libwebsocket_context *ctx;
+ ctx = libwebsocket_create_context(0, NULL, NULL, NULL,
+ NULL, NULL, NULL,
+ -1, -1, 0, NULL);]])],
+ [have_websockets=yes;old_websockets=no],
+ [have_websockets=no])
+ AC_MSG_RESULT([$have_websockets])
+ fi
+
+ # Check if we have a really old libwebsockets, still without
+ # per-context user data.
+ if test "$old_websockets" != "no"; then
+ AC_MSG_CHECKING([for really old WEBSOCKETS])
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <stdlib.h>
+ #include <libwebsockets.h>]],
+ [[struct libwebsocket_context *ctx;
+ ctx = libwebsocket_create_context(0, NULL, NULL, NULL,
+ NULL, NULL,
+ -1, -1, 0);]])],
+ [have_websockets=yes;old_websockets=yes],
+ [old_websockets=no])
+ AC_MSG_RESULT([$old_websockets])
+ fi
+
+ WEBSOCKETS_LIBS="-lwebsockets"
+ if test "$old_websockets" = "yes"; then
+ WEBSOCKETS_CFLAGS="$WEBSOCKETS_CFLAGS -DWEBSOCKETS_OLD"
+ fi
+ if test "$websockets_cci" = "yes"; then
+ WEBSOCKETS_CFLAGS="$WEBSOCKETS_CFLAGS -DWEBSOCKETS_CONTEXT_INFO"
+ fi
+ if test "$websockets_query_ext" = "yes"; then
+ WEBSOCKETS_CFLAGS="$WEBSOCKETS_CFLAGS -DWEBSOCKETS_QUERY_EXTENSIONS"
+ fi
+ if test "$websockets_log_with_level" = "yes"; then
+ WEBSOCKETS_CFLAGS="$WEBSOCKETS_CFLAGS -DWEBSOCKETS_LOG_WITH_LEVEL"
+ fi
+ if test "$websockets_close_session" = "yes"; then
+ WEBSOCKETS_CFLAGS="$WEBSOCKETS_CFLAGS -DWEBSOCKETS_CLOSE_SESSION"
+ fi
+ if test "$websockets_filter_http_connection" = "yes"; then
+ WEBSOCKETS_CFLAGS="$WEBSOCKETS_CFLAGS -DWEBSOCKETS_FILTER_HTTP_CONNECTION"
+ fi
+ if test "$websockets_change_poll" = "yes"; then
+ WEBSOCKETS_CFLAGS="$WEBSOCKETS_CFLAGS -DWEBSOCKETS_CHANGE_MODE_POLL_FD"
+ fi
+ if test "$websockets_serve_file_extraarg" = "yes"; then
+ WEBSOCKETS_CFLAGS="$WEBSOCKETS_CFLAGS -DWEBSOCKETS_SERVE_FILE_EXTRAARG"
+ fi
+
+ LDFLAGS="$saved_LDFLAGS"
+ LIBS="$saved_LIBS"
+else
+ AC_MSG_NOTICE([libwebsockets support is disabled.])
+fi
+
+# Bail out if we lack mandatory support.
+if test "$enable_websockets" = "yes" -a "$have_websockets" = "no"; then
+ AC_MSG_ERROR([libwebsockets development libraries not found.])
+fi
+
+# Enable if found and autosupport requested.
+if test "$enable_websockets" = "auto"; then
+ enable_websockets=$have_websockets
+fi
+
+# If enabled, set up our autoconf variables accordingly.
+if test "$enable_websockets" = "yes"; then
+ AC_DEFINE([WEBSOCKETS_ENABLED], 1, [Enable websockets support ?])
+ if test "$old_websockets" = "yes"; then
+ AC_DEFINE([WEBSOCKETS_OLD], 1, [No per-context userdata ?])
+ fi
+fi
+
+# Finally substitute everything.
+AM_CONDITIONAL(WEBSOCKETS_ENABLED, [test "$enable_websockets" = "yes"])
+AM_CONDITIONAL(WEBSOCKETS_OLD, [test "$old_websockets" = "yes"])
+AC_SUBST(WEBSOCKETS_ENABLED)
+AC_SUBST(WEBSOCKETS_CFLAGS)
+AC_SUBST(WEBSOCKETS_LIBS)
+AC_SUBST(WEBSOCKETS_OLD)
+
+AC_LANG_POP
+])