The new option replaces the previous backend-specific options and
fixes several problems while at it:
* libgcrypt and mbedtls would be used if either was found, even if
--without-libgcrypt or --without-mbedtls were on the command line.
* If --with-$backend was on the command line, configure would not
fail when the library could not be found, but would instead use
the first successfully detected crypto library.
* Copypasted code in configure.ac and acinclude.m4 had replicated
the above bugs for multiple crypto backends.
The new option requires specifying only a backend name in configure.ac.
All crypto backend names are automatically displayed and recognized
as valid --with-crypto= choices, and an uppercase name AM_CONDITIONAL
is automatically created for each name.
acinclude.m4 needs one case stanza within LIBSSH2_CRYPTO_CHECK to
test availability of each library, which must set LIBS as neccessary.
src/Makefile.am still needs an if-block using the AM_CONDITIONAL to
include a backend-specific Makefile.
---
acinclude.m4 | 150 ++++++++++++++++++++++++++++----------------------------
configure.ac | 137 ++++++++++++++++++++++++++++-----------------------
src/Makefile.am | 8 +--
3 files changed, 155 insertions(+), 140 deletions(-)
diff --git a/acinclude.m4 b/acinclude.m4
index 734ef07..18a2929 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -382,86 +382,86 @@ AC_DEFUN([CURL_CONFIGURE_REENTRANT], [
#
])
-AC_DEFUN([LIBSSH2_CHECKFOR_MBEDTLS], [
-
- old_LDFLAGS=$LDFLAGS
- old_CFLAGS=$CFLAGS
- if test -n "$use_mbedtls" && test "$use_mbedtls" != "no"; then
- LDFLAGS="$LDFLAGS -L$use_mbedtls/lib"
- CFLAGS="$CFLAGS -I$use_mbedtls/include"
- fi
-
- AC_LIB_HAVE_LINKFLAGS([mbedtls], [], [
- #include <mbedtls/version.h>
- ])
-
- if test "$ac_cv_libmbedtls" = "yes"; then
- AC_DEFINE(LIBSSH2_MBEDTLS, 1, [Use mbedtls])
- LIBSREQUIRED= # mbedtls doesn't provide a .pc file
- LIBS="$LIBS -lmbedtls -lmbedcrypto"
- found_crypto=libmbedtls
- support_clear_memory=yes
- else
- # restore
- LDFLAGS=$old_LDFLAGS
- CFLAGS=$old_CFLAGS
- fi
-])
-
-AC_DEFUN([LIBSSH2_CHECKFOR_GCRYPT], [
-
- old_LDFLAGS=$LDFLAGS
- old_CFLAGS=$CFLAGS
- if test -n "$use_libgcrypt" && test "$use_libgcrypt" != "no"; then
- LDFLAGS="$LDFLAGS -L$use_libgcrypt/lib"
- CFLAGS="$CFLAGS -I$use_libgcrypt/include"
- fi
- AC_LIB_HAVE_LINKFLAGS([gcrypt], [], [
- #include <gcrypt.h>
- ])
+AC_DEFUN([LIBSSH2_CHECK_CRYPTO], [
+if test "$use_crypto" = "auto" && test "$found_crypto" = "none" || test "$use_crypto" = "$1"; then
+ case "$1" in
+ openssl)
+ AC_LIB_HAVE_LINKFLAGS([ssl], [crypto], [#include <openssl/ssl.h>])
+
+ if test "$ac_cv_libssl" = "yes"; then
+ AC_DEFINE(LIBSSH2_OPENSSL, 1, [Use OpenSSL])
+ LIBSREQUIRED=libssl,libcrypto
+ LIBS="$LIBS $LIBSSL"
+
+ # Not all OpenSSL have AES-CTR functions.
+ AC_CHECK_FUNCS(EVP_aes_128_ctr)
+
+ found_crypto="$1"
+ found_crypto_str="OpenSSL (AES-CTR: ${ac_cv_func_EVP_aes_128_ctr:-N/A})"
+ fi
+ ;;
- if test "$ac_cv_libgcrypt" = "yes"; then
- AC_DEFINE(LIBSSH2_LIBGCRYPT, 1, [Use libgcrypt])
- LIBSREQUIRED= # libgcrypt doesn't provide a .pc file. sad face.
- LIBS="$LIBS -lgcrypt"
- found_crypto=libgcrypt
- else
- # restore
- LDFLAGS=$old_LDFLAGS
- CFLAGS=$old_CFLAGS
- fi
-])
+ libgcrypt)
+ AC_LIB_HAVE_LINKFLAGS([gcrypt], [], [#include <gcrypt.h>])
+ if test "$ac_cv_libgcrypt" = "yes"; then
+ AC_DEFINE(LIBSSH2_LIBGCRYPT, 1, [Use libgcrypt])
+ LIBSREQUIRED= # libgcrypt doesn't provide a .pc file. sad face.
+ LIBS="$LIBS -lgcrypt"
+ found_crypto="$1"
+ fi
+ ;;
-AC_DEFUN([LIBSSH2_CHECKFOR_WINCNG], [
+ mbedtls)
+ AC_LIB_HAVE_LINKFLAGS([mbedtls], [], [#include <mbedtls/version.h>])
- # Look for Windows Cryptography API: Next Generation
+ if test "$ac_cv_libmbedtls" = "yes"; then
+ AC_DEFINE(LIBSSH2_MBEDTLS, 1, [Use mbedtls])
+ LIBSREQUIRED= # mbedtls doesn't provide a .pc file
+ LIBS="$LIBS -lmbedtls -lmbedcrypto"
+ found_crypto="$1"
+ support_clear_memory=yes
+ fi
+ ;;
- AC_LIB_HAVE_LINKFLAGS([bcrypt], [], [
- #include <windows.h>
- #include <bcrypt.h>
- ])
- AC_LIB_HAVE_LINKFLAGS([crypt32], [], [
- #include <windows.h>
- #include <wincrypt.h>
- ])
- AC_CHECK_HEADERS([ntdef.h ntstatus.h], [], [], [
- #include <windows.h>
- ])
- AC_CHECK_DECLS([SecureZeroMemory], [], [], [
- #include <windows.h>
- ])
+ wincng)
+ # Look for Windows Cryptography API: Next Generation
+
+ AC_LIB_HAVE_LINKFLAGS([bcrypt], [], [
+ #include <windows.h>
+ #include <bcrypt.h>
+ ])
+ AC_LIB_HAVE_LINKFLAGS([crypt32], [], [
+ #include <windows.h>
+ #include <wincrypt.h>
+ ])
+ AC_CHECK_HEADERS([ntdef.h ntstatus.h], [], [], [
+ #include <windows.h>
+ ])
+ AC_CHECK_DECLS([SecureZeroMemory], [], [], [
+ #include <windows.h>
+ ])
+
+ if test "$ac_cv_libbcrypt" = "yes"; then
+ AC_DEFINE(LIBSSH2_WINCNG, 1, [Use Windows CNG])
+ LIBSREQUIRED= # wincng doesn't provide a .pc file. sad face.
+ LIBS="$LIBS -lbcrypt"
+ if test "$ac_cv_libcrypt32" = "yes"; then
+ LIBS="$LIBS -lcrypt32"
+ fi
+ found_crypto="$1"
+ found_crypto_str="Windows Cryptography API: Next Generation"
+ if test "$ac_cv_have_decl_SecureZeroMemory" = "yes"; then
+ support_clear_memory=yes
+ fi
+ fi
+ ;;
+ esac
- if test "$ac_cv_libbcrypt" = "yes"; then
- AC_DEFINE(LIBSSH2_WINCNG, 1, [Use Windows CNG])
- LIBSREQUIRED= # wincng doesn't provide a .pc file. sad face.
- LIBS="$LIBS -lbcrypt"
- if test "$ac_cv_libcrypt32" = "yes"; then
- LIBS="$LIBS -lcrypt32"
- fi
- found_crypto="Windows Cryptography API: Next Generation"
- if test "$ac_cv_have_decl_SecureZeroMemory" = "yes"; then
- support_clear_memory=yes
- fi
+ if test "$found_crypto" = "none"; then
+ test "${crypto_errors}" != "" && crypto_errors="${crypto_errors}
+"
+ crypto_errors="${crypto_errors}No $1 crypto library found!"
fi
+fi
])
diff --git a/configure.ac b/configure.ac
index f7fe247..ba84ddf 100644
--- a/configure.ac
+++ b/configure.ac
@@ -83,81 +83,84 @@ AC_C_BIGENDIAN
dnl check for how to do large files
AC_SYS_LARGEFILE
-found_crypto=none
-
# Configure parameters
-AC_ARG_WITH(openssl,
- AC_HELP_STRING([--with-openssl],[Use OpenSSL for crypto]),
- use_openssl=$withval,use_openssl=auto)
-AC_ARG_WITH(libgcrypt,
- AC_HELP_STRING([--with-libgcrypt],[Use libgcrypt for crypto]),
- [ use_libgcrypt=$withval
- LIBSSH2_CHECKFOR_GCRYPT
- ], use_libgcrypt=auto)
-AC_ARG_WITH(wincng,
- AC_HELP_STRING([--with-wincng],[Use Windows CNG for crypto]),
- [ use_wincng=$withval
- LIBSSH2_CHECKFOR_WINCNG
- ] ,use_wincng=auto)
-AC_ARG_WITH([mbedtls],
- AC_HELP_STRING([--with-mbedtls],[Use mbedTLS for crypto]),
- [ use_mbedtls=$withval
- LIBSSH2_CHECKFOR_MBEDTLS
- ], use_mbedtls=auto
-)
-AC_ARG_WITH(libz,
- AC_HELP_STRING([--with-libz],[Use zlib for compression]),
- use_libz=$withval,use_libz=auto)
-
-support_clear_memory=no
-# Look for OpenSSL
-if test "$found_crypto" = "none" && test "$use_openssl" != "no"; then
- AC_LIB_HAVE_LINKFLAGS([ssl], [crypto], [#include <openssl/ssl.h>])
-fi
-if test "$ac_cv_libssl" = "yes"; then
- AC_DEFINE(LIBSSH2_OPENSSL, 1, [Use OpenSSL])
- LIBSREQUIRED=libssl,libcrypto
-
- # Not all OpenSSL have AES-CTR functions.
- save_LIBS="$LIBS"
- LIBS="$LIBS $LIBSSL"
- AC_CHECK_FUNCS(EVP_aes_128_ctr)
- LIBS="$save_LIBS"
+# libz
- found_crypto="OpenSSL (AES-CTR: ${ac_cv_func_EVP_aes_128_ctr:-N/A})"
-fi
+AC_ARG_WITH([libz],
+ AC_HELP_STRING([--with-libz],[Use libz for compression]),
+ use_libz=$withval,
+ use_libz=auto)
-AM_CONDITIONAL(OPENSSL, test "$ac_cv_libssl" = "yes")
-AM_CONDITIONAL(WINCNG, test "$ac_cv_libbcrypt" = "yes")
-AM_CONDITIONAL(LIBGCRYPT, test "$ac_cv_libgcrypt" = "yes")
-AM_CONDITIONAL(MBEDTLS, test "$ac_cv_libmbedtls" = "yes")
-
-# Check if crypto library was found
-if test "$found_crypto" = "none"; then
- AC_MSG_ERROR([No crypto library found!
-Try --with-libssl-prefix=PATH
- or --with-libgcrypt-prefix=PATH
- or --with-libmbedtls-prefix=PATH
- or --with-wincng on Windows\
-])
-fi
+found_libz=no
+libz_errors=""
-# Look for Libz
-if test "$use_libz" != "no"; then
+if test "$use_libz" != no; then
AC_LIB_HAVE_LINKFLAGS([z], [], [#include <zlib.h>])
if test "$ac_cv_libz" != yes; then
- AC_MSG_NOTICE([Cannot find zlib, disabling compression])
- AC_MSG_NOTICE([Try --with-libz-prefix=PATH if you know you have it])
+ if test "$use_libz" = auto; then
+ AC_MSG_NOTICE([Cannot find libz, disabling compression])
+ found_libz="disabled; no libz found"
+ else
+ libz_errors="No libz found!
+Try --with-libz-prefix=PATH if you know that you have it."
+ AS_MESSAGE([ERROR: $libz_errors])
+ fi
else
AC_DEFINE(LIBSSH2_HAVE_ZLIB, 1, [Compile in zlib support])
if test "${LIBSREQUIRED}" != ""; then
LIBSREQUIRED="${LIBSREQUIRED},"
fi
LIBSREQUIRED="${LIBSREQUIRED}zlib"
+ found_libz="yes"
fi
fi
+
+# Crypto backends
+
+found_crypto=none
+found_crypto_str=""
+support_clear_memory=no
+crypto_errors=""
+
+m4_set_add([crypto_backends], [openssl])
+m4_set_add([crypto_backends], [libgcrypt])
+m4_set_add([crypto_backends], [mbedtls])
+m4_set_add([crypto_backends], [wincng])
+
+AC_ARG_WITH([crypto],
+ AC_HELP_STRING([--with-crypto=auto|]m4_set_contents([crypto_backends], [|]),
+ [Select crypto backend (default: auto)]),
+ use_crypto=$withval,
+ use_crypto=auto
+)
+
+case "${use_crypto}" in
+ auto|m4_set_contents([crypto_backends], [|]))
+ m4_set_map([crypto_backends], [LIBSSH2_CHECK_CRYPTO])
+ ;;
+ *)
+ crypto_errors="Unknown crypto backend '${use_crypto}' specified!"
+ ;;
+esac
+
+if test "$found_crypto" = "none"; then
+ crypto_errors="${crypto_errors}
+Please specify --with-crypto and/or the neccessary library search prefix.
+
+Run configure --help to see all crypto library options."
+ AS_MESSAGE([ERROR: ${crypto_errors}])
+else
+ if test "$found_crypto_str" = ""; then
+ found_crypto_str="$found_crypto"
+ fi
+fi
+
+m4_set_foreach([crypto_backends], [c_backend],
+ [AM_CONDITIONAL(m4_toupper(c_backend), test "$found_crypto" = "c_backend")]
+)
+
AC_SUBST(LIBSREQUIRED)
#
@@ -351,6 +354,18 @@ AC_C_INLINE
CURL_CHECK_NONBLOCKING_SOCKET
+if test "${libz_errors}" != ""; then
+ AS_MESSAGE([ERROR: ${libz_errors}])
+fi
+
+if test "${crypto_errors}" != ""; then
+ AS_MESSAGE([ERROR: ${crypto_errors}])
+fi
+
+if test "${libz_errors}${crypto_errors}" != ""; then
+ AC_MSG_ERROR([Required dependencies are missing!])
+fi
+
AC_CONFIG_FILES([Makefile
src/Makefile
tests/Makefile
@@ -367,10 +382,10 @@ AC_MSG_NOTICE([summary of build options:
Compiler: ${CC}
Compiler flags: ${CFLAGS}
Library types: Shared=${enable_shared}, Static=${enable_static}
- Crypto library: ${found_crypto}
+ Crypto library: ${found_crypto_str}
Clear memory: $enable_clear_memory
Debug build: $enable_debug
Build examples: $build_examples
Path to sshd: $ac_cv_path_SSHD (only for self-tests)
- zlib compression: $ac_cv_libz
+ zlib compression: ${found_libz}
])
diff --git a/src/Makefile.am b/src/Makefile.am
index 1fa0751..3532b81 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -8,12 +8,12 @@ endif
if LIBGCRYPT
include ../Makefile.libgcrypt.inc
endif
-if WINCNG
-include ../Makefile.WinCNG.inc
-endif
if MBEDTLS
include ../Makefile.mbedTLS.inc
endif
+if WINCNG
+include ../Makefile.WinCNG.inc
+endif
# Makefile.inc provides the CSOURCES and HHEADERS defines
include ../Makefile.inc
@@ -62,4 +62,4 @@ VERSION=-version-info 1:1:0
libssh2_la_LDFLAGS = $(VERSION) -no-undefined \
-export-symbols-regex '^libssh2_.*' \
- $(LTLIBGCRYPT) $(LTLIBSSL) $(LTLIBZ)
+ $(LIBS) $(LTLIBZ)
--
_______________________________________________
libssh2-devel https://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel
Received on 2016-10-28