diff options
Diffstat (limited to 'sntp/m4/ntp_openssl.m4')
-rw-r--r-- | sntp/m4/ntp_openssl.m4 | 372 |
1 files changed, 372 insertions, 0 deletions
diff --git a/sntp/m4/ntp_openssl.m4 b/sntp/m4/ntp_openssl.m4 new file mode 100644 index 0000000..9d9189c --- /dev/null +++ b/sntp/m4/ntp_openssl.m4 @@ -0,0 +1,372 @@ +dnl #################################################################### +dnl OpenSSL support shared by top-level and sntp/configure.ac +dnl +dnl Provides command-line option --with-crypto, as well as deprecated +dnl options --with-openssl-incdir, --with-openssl-libdir, and the +dnl latter's suboption --with-rpath. +dnl +dnl Specifying --with-openssl-libdir or --with-openssl-incdir causes any +dnl pkg-config openssl information to be ignored in favor of the legacy +dnl manual search for directories and specified library names. +dnl +dnl Output AC_DEFINEs (for config.h) +dnl OPENSSL defined only if using OpenSSL +dnl +dnl Output variables: +dnl ntp_openssl yes if using OpenSSL, no otherwise +dnl +dnl Output substitutions: +dnl CFLAGS_NTP OpenSSL-specific flags added as needed, and +dnl -Wstrict-prototypes for gcc if it does not +dnl trigger a flood of warnings for each file +dnl including OpenSSL headers. +dnl CPPFLAGS_NTP OpenSSL -Iincludedir flags added as needed. +dnl LDADD_NTP OpenSSL -L and -l flags added as needed. +dnl LDFLAGS_NTP Other OpenSSL link flags added as needed. +dnl +dnl #################################################################### +AC_DEFUN([NTP_OPENSSL], [ +AC_REQUIRE([NTP_PKG_CONFIG])dnl +AC_REQUIRE([NTP_VER_SUFFIX])dnl + +AC_ARG_WITH( + [crypto], + [AS_HELP_STRING( + [--with-crypto], + [+ =openssl,libcrypto] + )] +) +AC_ARG_WITH( + [openssl-libdir], + [AS_HELP_STRING( + [--with-openssl-libdir], + [+ =/something/reasonable] + )] +) +AC_ARG_WITH( + [openssl-incdir], + [AS_HELP_STRING( + [--with-openssl-incdir], + [+ =/something/reasonable] + )] +) +AC_ARG_WITH( + [rpath], + [AS_HELP_STRING( + [--without-rpath], + [s Disable auto-added -R linker paths] + )] +) +ntp_openssl=no +ntp_openssl_from_pkg_config=no +with_crypto=${with_crypto:-openssl,libcrypto} +case "$with_crypto" in + yes) + with_crypto=openssl,libcrypto +esac +case "$with_crypto:${PKG_CONFIG:+notempty}:${with_openssl_libdir-notgiven}:${with_openssl_incdir-notgiven}" in + no:*) ;; + *:notempty:notgiven:notgiven) + for pkg in `echo $with_crypto | sed -e 's/,/ /'`; do + AC_MSG_CHECKING([pkg-config for $pkg]) + if $PKG_CONFIG --exists $pkg ; then + CPPFLAGS_NTP="$CPPFLAGS_NTP `$PKG_CONFIG --cflags-only-I $pkg`" + CFLAGS_NTP="$CFLAGS_NTP `$PKG_CONFIG --cflags-only-other $pkg`" + LDADD_NTP="$LDADD_NTP `$PKG_CONFIG --libs-only-L $pkg`" + LDADD_NTP="$LDADD_NTP `$PKG_CONFIG --libs-only-l $pkg`" + LDFLAGS_NTP="$LDFLAGS_NTP `$PKG_CONFIG --libs-only-other $pkg`" + VER_SUFFIX=o + ntp_openssl=yes + ntp_openssl_from_pkg_config=yes + AC_MSG_RESULT([yes]) + + break + fi + AC_MSG_RESULT([no]) + done +esac +case "$with_crypto:$ntp_openssl" in + no:*) ;; + *:no) + need_dash_r= + need_dash_Wlrpath= + case "${with_rpath-notgiven}" in + yes) + # Lame - what to do if we need -Wl... but not -R? + need_dash_r=1 + ;; + notgiven) + case "$host" in + *-*-linux*) + # This may really only be true for gcc + need_dash_Wlrpath=1 + ;; + *-*-netbsd*) + need_dash_r=1 + ;; + *-*-solaris*) + need_dash_r=1 + ;; + esac + ;; + esac + + AC_MSG_CHECKING([for openssl library directory]) + with_openssl_libdir=${with_openssl_libdir-notgiven} + case "$with_openssl_libdir" in + notgiven) + case "$build" in + $host) + with_openssl_libdir=default + ;; + *) + with_openssl_libdir=no + ;; + esac + esac + case "$with_openssl_libdir" in + default) + # Look in: + with_openssl_libdir="/usr/lib /usr/lib/openssl /usr/sfw/lib" + with_openssl_libdir="$with_openssl_libdir /usr/local/lib" + with_openssl_libdir="$with_openssl_libdir /usr/local/ssl/lib /lib" + esac + case "$with_openssl_libdir" in + no) + ;; + *) # Look for libcrypto.a and libssl.a: + for i in $with_openssl_libdir no + do + case "$host" in + *-*-darwin*) + test -f $i/libcrypto.dylib -a -f $i/libssl.dylib && break + ;; + *) + test -f $i/libcrypto.so -a -f $i/libssl.so && break + test -f $i/libcrypto.a -a -f $i/libssl.a && break + ;; + esac + done + openssl_libdir=$i + ;; + esac + AC_MSG_RESULT([$openssl_libdir]) + case "$openssl_libdir" in + no) + openssl_libdir= + AC_MSG_WARN([libcrypto and libssl not found in any of $with_openssl_libdir]) + esac + + AC_MSG_CHECKING([for openssl include directory]) + with_openssl_incdir=${with_openssl_incdir-notgiven} + case "$with_openssl_incdir" in + notgiven) + # Look in: + with_openssl_incdir="/usr/include /usr/sfw/include" + with_openssl_incdir="$with_openssl_incdir /usr/local/include" + with_openssl_incdir="$with_openssl_incdir /usr/local/ssl/include" + esac + case "$with_openssl_incdir" in + no) + ;; + *) # look for openssl/evp.h: + for i in $with_openssl_incdir no + do + test -f $i/openssl/evp.h && break + done + openssl_incdir=$i + ;; + esac + AS_UNSET([i]) + AC_MSG_RESULT([$openssl_incdir]) + case "$openssl_incdir" in + no) + openssl_incdir= + AC_MSG_WARN([did not find openssl/evp.h in any of $with_openssl_incdir]) + esac + if test -z "$openssl_libdir" -o -z "$openssl_incdir" + then + ntp_openssl=no + else + ntp_openssl=yes + VER_SUFFIX=o + fi + case "$ntp_openssl" in + yes) + # We have OpenSSL inc/lib dirs - use them. + case "$openssl_incdir" in + /usr/include) + ;; + *) + CPPFLAGS_NTP="$CPPFLAGS_NTP -I$openssl_incdir" + ;; + esac + case "$openssl_libdir" in + /usr/lib) + ;; + *) + LDADD_NTP="$LDADD_NTP -L$openssl_libdir" + case "$need_dash_r" in + 1) + LDFLAGS_NTP="$LDFLAGS_NTP -R$openssl_libdir" + esac + case "$need_dash_Wlrpath" in + 1) + LDFLAGS_NTP="$LDFLAGS_NTP -Wl,-rpath,$openssl_libdir" + esac + ;; + esac + LDADD_NTP="$LDADD_NTP -lcrypto" + esac +esac + +AC_MSG_CHECKING([if we will use crypto]) +AC_MSG_RESULT([$ntp_openssl]) + +case "$ntp_openssl" in + yes) + AC_DEFINE([OPENSSL], [], [Use OpenSSL?]) + case "$VER_SUFFIX" in + *o*) ;; + *) AC_MSG_ERROR([OPENSSL set but no 'o' in VER_SUFFIX!]) ;; + esac + ;; +esac + +NTPO_SAVED_CPPFLAGS="$CPPFLAGS" +CPPFLAGS="$CPPFLAGS $CPPFLAGS_NTP" +NTPO_SAVED_LIBS="$LIBS" + +# +# check for linking with -lcrypto failure, and try -lcrypto -lz. +# Helps m68k-atari-mint +# +case "$ntp_openssl:$ntp_openssl_from_pkg_config" in + yes:no) + LIBS="$NTPO_SAVED_LIBS $LDADD_NTP" + AC_CACHE_CHECK( + [if linking with -lcrypto alone works], + [ntp_cv_bare_lcrypto], + [AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[ + #include "openssl/err.h" + #include "openssl/evp.h" + ]], + [[ + ERR_load_crypto_strings(); + OpenSSL_add_all_algorithms(); + ]] + )], + [ntp_cv_bare_lcrypto=yes], + [ntp_cv_bare_lcrypto=no] + )] + ) + case "$ntp_cv_bare_lcrypto" in + no) + LIBS="$NTPO_SAVED_LIBS $LDADD_NTP -lz" + AC_CACHE_CHECK( + [if linking with -lcrypto -lz works], + [ntp_cv_lcrypto_lz], + [AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[ + #include "openssl/err.h" + #include "openssl/evp.h" + ]], + [[ + ERR_load_crypto_strings(); + OpenSSL_add_all_algorithms(); + ]] + )], + [ntp_cv_lcrypto_lz=yes], + [ntp_cv_lcrypto_lz=no] + )] + ) + case "$ntp_cv_lcrypto_lz" in + yes) + LDADD_NTP="$LDADD_NTP -lz" + esac + esac +esac + +# +# Older OpenSSL headers have a number of callback prototypes inside +# other function prototypes which trigger copious warnings with gcc's +# -Wstrict-prototypes, which is included in -Wall. +# +# An example: +# +# int i2d_RSA_NET(const RSA *a, unsigned char **pp, +# int (*cb)(), int sgckey); +# ^^^^^^^^^^^ +# +# +# +openssl_triggers_warnings=unknown +NTPO_SAVED_CFLAGS="$CFLAGS" + +case "$ntp_openssl:$GCC" in + yes:yes) + CFLAGS="$CFLAGS -Werror" + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[ + ]], + [[ + /* see if -Werror breaks gcc */ + ]] + )], + [gcc_handles_Werror=yes], + [gcc_handles_Werror=no] + ) + case "$gcc_handles_Werror" in + no) + # if this gcc doesn't do -Werror go ahead and use + # -Wstrict-prototypes. + openssl_triggers_warnings=yes + ;; + yes) + CFLAGS="$CFLAGS -Wstrict-prototypes" + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[ + #include "openssl/asn1_mac.h" + #include "openssl/bn.h" + #include "openssl/err.h" + #include "openssl/evp.h" + #include "openssl/pem.h" + #include "openssl/rand.h" + #include "openssl/x509v3.h" + ]], + [[ + /* empty body */ + ]] + )], + [openssl_triggers_warnings=no], + [openssl_triggers_warnings=yes] + ) + esac + case "$openssl_triggers_warnings" in + yes) + CFLAGS_NTP="$CFLAGS_NTP -Wno-strict-prototypes" + ;; + *) + CFLAGS_NTP="$CFLAGS_NTP -Wstrict-prototypes" + esac + ;; + no:yes) + # gcc without OpenSSL + CFLAGS_NTP="$CFLAGS_NTP -Wstrict-prototypes" +esac + +CFLAGS="$NTPO_SAVED_CFLAGS" +CPPFLAGS="$NTPO_SAVED_CPPFLAGS" +LIBS="$NTPO_SAVED_LIBS" +AS_UNSET([NTPO_SAVED_CFLAGS]) +AS_UNSET([NTPO_SAVED_CPPFLAGS]) +AS_UNSET([NTPO_SAVED_LIBS]) +AS_UNSET([openssl_triggers_warnings]) +AS_UNSET([ntp_openssl_from_pkg_config]) +]) +dnl ====================================================================== |