>From 86c1ed0823152bfbf8f0593734eea73652234f27 Mon Sep 17 00:00:00 2001
From: Nikos Mavrogiannopoulos <nmav@gnutls.org>
Date: Sun, 3 Mar 2013 11:33:29 +0100
Subject: [PATCH] Added option to enable static linking of libraries.

Signed-off-by: Nikos Mavrogiannopoulos <nmav@gnutls.org>
---
 Makefile.am  |   19 +++++++++---
 configure.ac |   93 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----
 2 files changed, 102 insertions(+), 10 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index 463df52..679b685 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -7,6 +7,13 @@ if USE_NLS
 SUBDIRS += po
 endif
 
+OLIBS = $(SSL_LIBS) $(DTLS_SSL_LIBS) $(LIBXML2_LIBS) $(LIBPROXY_LIBS) $(TSS_LIBS) $(LIBINTL) $(LIBSTOKEN_LIBS) $(ZLIB_LIBS)
+if USE_STATIC_LINK
+OLIBS_F = -static-libtool-libs
+else
+OLIBS_F = 
+endif
+
 lib_LTLIBRARIES = libopenconnect.la
 sbin_PROGRAMS = openconnect
 man8_MANS = openconnect.8
@@ -14,8 +21,9 @@ man8_MANS = openconnect.8
 AM_CPPFLAGS = -DLOCALEDIR="\"$(localedir)\""
 openconnect_SOURCES = xml.c main.c dtls.c cstp.c mainloop.c tun.c
 
-openconnect_CFLAGS = $(SSL_CFLAGS) $(DTLS_SSL_CFLAGS) $(LIBXML2_CFLAGS) $(LIBPROXY_CFLAGS) $(ZLIB_CFLAGS) $(LIBSTOKEN_CFLAGS)
-openconnect_LDADD = libopenconnect.la $(SSL_LIBS) $(DTLS_SSL_LIBS) $(LIBXML2_LIBS) $(LIBPROXY_LIBS) $(ZLIB_LIBS) $(LIBINTL) $(LIBSTOKEN_LIBS)
+openconnect_LDFLAGS = $(OLIBS_F)
+openconnect_LDADD = libopenconnect.la $(OLIBS)
+openconnect_CFLAGS = $(SSL_CFLAGS) $(LIBXML2_CFLAGS) $(LIBPROXY_CFLAGS) $(P11KIT_CFLAGS) $(TSS_CFLAGS) $(LIBSTOKEN_CFLAGS)
 
 library_srcs = ssl.c http.c auth.c library.c compat.c
 lib_srcs_gnutls = gnutls.c gnutls_pkcs12.c gnutls_tpm.c
@@ -31,7 +39,10 @@ library_srcs += $(lib_srcs_openssl)
 endif
 libopenconnect_la_SOURCES = version.c $(library_srcs)
 libopenconnect_la_CFLAGS = $(SSL_CFLAGS) $(LIBXML2_CFLAGS) $(LIBPROXY_CFLAGS) $(P11KIT_CFLAGS) $(TSS_CFLAGS) $(LIBSTOKEN_CFLAGS)
-libopenconnect_la_LIBADD = $(SSL_LIBS) $(LIBXML2_LIBS) $(LIBPROXY_LIBS) $(LIBINTL) $(P11KIT_LIBS) $(TSS_LIBS) $(LIBSTOKEN_LIBS)
+
+libopenconnect_la_LDFLAGS = $(OLIBS_F)
+libopenconnect_la_LIBADD = $(OLIBS)
+
 if OPENBSD_LIBTOOL
 # OpenBSD's libtool doesn't have -version-number, but its -version-info arg
 # does what GNU libtool's -version-number does. Which arguably is what the
@@ -40,7 +51,7 @@ LT_VER_ARG = -version-info
 else
 LT_VER_ARG = -version-number
 endif
-libopenconnect_la_LDFLAGS = $(LT_VER_ARG) @APIMAJOR@:@APIMINOR@
+libopenconnect_la_LDFLAGS += $(LT_VER_ARG) @APIMAJOR@:@APIMINOR@
 noinst_HEADERS = openconnect-internal.h openconnect.h gnutls.h
 include_HEADERS = openconnect.h
 if HAVE_SYMBOL_VERSIONING
diff --git a/configure.ac b/configure.ac
index 89887f5..a0e9156 100644
--- a/configure.ac
+++ b/configure.ac
@@ -24,6 +24,77 @@ m4_ifdef([PKG_INSTALLDIR], [PKG_INSTALLDIR],
 			[],[with_pkgconfigdir='$(libdir)/pkgconfig'])
 	   AC_SUBST([pkgconfigdir], [${with_pkgconfigdir}])])
 
+# PKG_CHECK_STATIC_MODULES(VARIABLE-PREFIX, MODULES, STATIC, [ACTION-IF-FOUND],
+# [ACTION-IF-NOT-FOUND])
+#
+# STATIC should be yes|no
+#
+# Note that if there is a possibility the first call to
+# PKG_CHECK_STATIC_MODULES might not happen, you should be sure to include an
+# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
+#
+#
+# --------------------------------------------------------------
+AC_DEFUN([PKG_CHECK_STATIC_MODULES],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
+AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
+
+pkg_failed=no
+AC_MSG_CHECKING([for $1])
+
+_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
+if test "$$3" = "yes"; then
+_PKG_CONFIG([$1][_LIBS], [libs], [$2])
+else
+_PKG_CONFIG([$1][_LIBS], [libs --static], [$2])
+fi
+
+m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
+and $1[]_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.])
+
+if test $pkg_failed = yes; then
+   	AC_MSG_RESULT([no])
+        _PKG_SHORT_ERRORS_SUPPORTED
+        if test $_pkg_short_errors_supported = yes; then
+	        $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1`
+        else 
+	        $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
+
+	m4_default([$5], [AC_MSG_ERROR(
+[Package requirements ($2) were not met:
+
+$$1_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+_PKG_TEXT])[]dnl
+        ])
+elif test $pkg_failed = untried; then
+     	AC_MSG_RESULT([no])
+	m4_default([$5], [AC_MSG_FAILURE(
+[The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+_PKG_TEXT
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.])[]dnl
+        ])
+else
+	$1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
+	$1[]_LIBS=$pkg_cv_[]$1[]_LIBS
+        AC_MSG_RESULT([yes])
+	$4
+fi[]dnl
+])# PKG_CHECK_STATIC_MODULES
+
+
 AC_ARG_WITH([vpnc-script],
 	[AS_HELP_STRING([--with-vpnc-script],
 	  [default location of vpnc-script helper])])
@@ -147,6 +218,12 @@ AC_CHECK_FUNC(__android_log_vprint, [], AC_CHECK_LIB(log, __android_log_vprint,
 AC_ENABLE_SHARED
 AC_DISABLE_STATIC
 
+AC_ARG_ENABLE([static-link],
+	[  --enable-static-link    link statically as many libraries as possible],
+	[USE_STATIC_LINK=$enableval], [USE_STATIC_LINK=no])
+
+AM_CONDITIONAL(USE_STATIC_LINK, [test "$USE_STATIC_LINK" = "yes"])
+
 AC_ARG_ENABLE([nls],
 	[  --disable-nls           do not use Native Language Support],
 	[USE_NLS=$enableval], [USE_NLS=yes])
@@ -223,7 +300,7 @@ AC_ARG_WITH([openssl],
 ssl_library=
 
 if test "$with_gnutls" = "yes" || test "$with_gnutls" = ""; then
-    PKG_CHECK_MODULES(GNUTLS, gnutls, [found_gnutls=yes], [found_gnutls=no])
+    PKG_CHECK_STATIC_MODULES(GNUTLS, gnutls, $USE_STATIC_LINK, [found_gnutls=yes], [found_gnutls=no])
     if test "$found_gnutls" = "yes"; then
         if ! $PKG_CONFIG --atleast-version=2.12.16 gnutls; then
 	    found_gnutls=old
@@ -339,7 +416,7 @@ if test "$with_gnutls" = "yes"; then
     LIBS="$oldlibs"
 fi
 if test "$with_openssl" = "yes" || test "$with_openssl" = "" || test "$ssl_library" = "both"; then
-    PKG_CHECK_MODULES(OPENSSL, openssl, [],
+    PKG_CHECK_STATIC_MODULES(OPENSSL, openssl, $USE_STATIC_LINK, [],
 	[oldLIBS="$LIBS"
 	 LIBS="$LIBS -lssl -lcrypto"
 	 AC_MSG_CHECKING([for OpenSSL without pkg-config])
@@ -441,9 +518,9 @@ if test "$enable_shared" = "yes" ; then
 fi
 AM_CONDITIONAL(HAVE_SYMBOL_VERSIONING, [test "${symvers}" != "no"])
 
-PKG_CHECK_MODULES(LIBXML2, libxml-2.0)
+PKG_CHECK_STATIC_MODULES(LIBXML2, libxml-2.0, $USE_STATIC_LINK)
 
-PKG_CHECK_MODULES(ZLIB, zlib, [AC_SUBST(ZLIB_PC, [zlib])],
+PKG_CHECK_STATIC_MODULES(ZLIB, zlib, $USE_STATIC_LINK, [AC_SUBST(ZLIB_PC, [zlib])],
 		  [oldLIBS="$LIBS"
 		  LIBS="$LIBS -lz" 
 		  AC_MSG_CHECKING([for zlib without pkg-config])
@@ -459,7 +536,7 @@ PKG_CHECK_MODULES(ZLIB, zlib, [AC_SUBST(ZLIB_PC, [zlib])],
 		   AC_ERROR([Could not build against zlib])])
 		  LIBS="$oldLIBS"])
 
-PKG_CHECK_MODULES(LIBPROXY, libproxy-1.0,
+PKG_CHECK_STATIC_MODULES(LIBPROXY, libproxy-1.0, $USE_STATIC_LINK,
 		[AC_SUBST(LIBPROXY_PC, libproxy-1.0)
 		 AC_DEFINE([LIBPROXY_HDR], ["proxy.h"])
 		 libproxy_pkg=yes],
@@ -484,7 +561,7 @@ if (test "$libproxy_pkg" = "no"); then
    LIBS="$oldLIBS"
 fi
 
-PKG_CHECK_MODULES(LIBSTOKEN, stoken,
+PKG_CHECK_STATIC_MODULES(LIBSTOKEN, stoken, $USE_STATIC_LINK,
 		[AC_SUBST(LIBSTOKEN_PC, stoken)
 		 AC_DEFINE([LIBSTOKEN_HDR], ["stoken.h"])
 		 libstoken_pkg=yes],
@@ -558,3 +635,7 @@ AC_SUBST(GITVERSIONDEPS)
 
 AC_OUTPUT(Makefile openconnect.pc po/Makefile www/Makefile libopenconnect.map \
 	  openconnect.8 www/styles/Makefile www/inc/Makefile www/images/Makefile)
+
+AC_MSG_NOTICE([
+  Static link:          $USE_STATIC_LINK
+])
-- 
1.7.10.4

