commit 7f03b8e78620d4ff20dbbea32d309ea6ec57f9d1 Author: Zack Weinberg zackw@panix.com Date: Mon Jul 11 16:43:39 2011 -0700
Revise detection of libcrypto and winsock. --- Makefile.am | 4 ++-- configure.ac | 29 +++++++++++++---------------- m4/winsock.m4 | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 18 deletions(-)
diff --git a/Makefile.am b/Makefile.am index a78d7d0..1c2d89b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,7 +1,7 @@
ACLOCAL_AMFLAGS = -I m4 -AM_CFLAGS = -DDEBUG -Wall -Werror @libevent_CFLAGS@ @openssl_CFLAGS@ -LDADD = libobfsproxy.a @libevent_LIBS@ @openssl_LIBS@ @ws32_LIBS@ +AM_CFLAGS = -DDEBUG -Wall -Werror @libevent_CFLAGS@ @libcrypto_CFLAGS@ +LDADD = libobfsproxy.a @libevent_LIBS@ @libcrypto_LIBS@ @ws32_LIBS@
bin_PROGRAMS = obfsproxy noinst_LIBRARIES = libobfsproxy.a diff --git a/configure.ac b/configure.ac index 025589f..32b7138 100644 --- a/configure.ac +++ b/configure.ac @@ -5,32 +5,29 @@ AC_CONFIG_SRCDIR([src/main.c]) AM_INIT_AUTOMAKE([foreign])
AC_PROG_CC -AC_PROG_CPP AC_PROG_RANLIB PKG_PROG_PKG_CONFIG
PKG_CHECK_MODULES([libevent], [libevent >= 2.0]) -PKG_CHECK_MODULES([openssl], [openssl >= 0.9.7]) - -AC_CACHE_CHECK([for winsock], [ac_cv_lib_winsock], - [AC_PREPROC_IFELSE( - [#ifndef _WIN32 - #error "not windows" - #endif - ], - [ac_cv_lib_winsock=yes], [ac_cv_lib_winsock=no]) -]) -AS_IF([test "x$ac_cv_lib_winsock" = xyes], - [ws32_LIBS=-lws2_32], - [ws32_LIBS=]) -AC_SUBST(ws32_LIBS) +# Presently no need for libssl, only libcrypto. +PKG_CHECK_MODULES([libcrypto], [libcrypto >= 0.9.7])
+# We permit the use of openssl 0.9.7, which doesn't have sha256. +# Check whether a replacement is required. save_LIBS="$LIBS" -LIBS="$openssl_LIBS" +LIBS="$libcrypto_LIBS" AC_CHECK_FUNC(SHA256_Init, [:], [:]) LIBS="$save_LIBS" AM_CONDITIONAL(NEED_SHA256, [test x$ac_cv_func_SHA256_Init = xno])
+# ntohl and a bunch of related functions require a special library on Windows. +# It is possible that libevent or libcrypto has hooked us up already. +# This can't be done with AC_SEARCH_LIBS -- see m4/winsock.m4 for gory details. +save_LIBS="$LIBS" +LIBS="$libevent_LIBS $libcrypto_LIBS" +AX_LIB_WINSOCK2 +LIBS="$save_LIBS" + AC_CONFIG_FILES([Makefile]) AC_CONFIG_HEADERS([config.h]) AC_OUTPUT diff --git a/m4/winsock.m4 b/m4/winsock.m4 new file mode 100644 index 0000000..a90cc50 --- /dev/null +++ b/m4/winsock.m4 @@ -0,0 +1,56 @@ +# Copyright © 2011 Zack Weinberg zackw@panix.com +# +# Copying and distribution of this software, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. This software is offered as-is, +# without any warranty. + +# The socket API requires a special library on Windows, but +# AC_SEARCH_LIBS cannot be used to find it, because it will +# mis-declare 'ntohl' on windows and cause the link to fail. +# +# This macro sets the substitution @ws2_LIBS@ to "-lws2_32" +# if you need that, and "" otherwise. It does not provide +# any #defines for the differences in socket headers between +# Windows and Unix -- just use #ifdef _WIN32. +# +# Implementation note: we use the same _cv_ variable that +# AC_SEARCH_LIBS would, because the test is what AC_SEARCH_LIBS +# *should* have done in this situation. +AC_DEFUN([AX_LIB_WINSOCK2], + [AC_CACHE_CHECK([for library containing ntohl], [ac_cv_search_ntohl], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([ + #ifdef _WIN32 + #include <winsock2.h> + #else + #include <arpa/inet.h> + #endif + ], [ + return (int)ntohl(42);]) + ]) + + ax_lib_winsock2_save_LIBS="$LIBS" + for ac_lib in '' -lws2_32; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=$ac_lib + fi + LIBS="$ac_lib $ax_lib_winsock2_save_LIBS" + AC_LINK_IFELSE([], [AS_VAR_SET([ac_cv_search_ntohl], [$ac_res])]) + AS_VAR_SET_IF([ac_cv_search_ntohl], [break]) + done + AS_VAR_SET_IF([ac_cv_search_ntohl], , + [AS_VAR_SET([ac_cv_search_ntohl], [no])]) + rm conftest.$ac_ext + LIBS="$ax_lib_winsock2_save_LIBS" + ]) + + ws32_LIBS= + if test "x$ac_cv_search_ntohl" == "xno"; then + AC_MSG_ERROR([could not find ntohl]) + elif test "x$ac_cv_search_ntohl" != "xnone required"; then + ws32_LIBS="$ac_cv_search_ntohl" + fi + AC_SUBST(ws32_LIBS) +])