blob: 47491e24ce0a51205f5e77b2c15b7495cfc06a17 [file] [log] [blame]
# -*- autoconf -*-
#########################################
##
# Checks for libraries that are run
# after the agent module tests.
##
#########################################
# HAVE_LIB Definitions used in the Net-SNMP code base:
#
# HAVE_LIBCRYPTO: apps
# HAVE_LIBRPM: agent
#
##
# Simple checks:
##
# AC_CHECK_LIB(des, main)
# AC_CHECK_LIB(m, asin)
# dmalloc
#
if test "${with_dmalloc+set}" = set; then
if test "$with_dmalloc" = yes -a -d $with_dmalloc ; then
AC_ADD_SEARCH_PATH($with_dmalloc)
fi
AC_CHECK_HEADERS([dmalloc.h])
AC_SEARCH_LIBS([dmalloc_message], [dmalloc])
fi
# EFence
# (This used to be on by default for developer checkout)
#
if test "x$use_efence" = "xyes"; then
AC_SEARCH_LIBS([EF_Exit], [efence])
fi
# ELF libraries
# Typically used for 'nlist' (needed for uptime)
#
if test "x$with_elf" != "xno"; then
case $target_os in
linux*) # add hosts which don't use nlist here
;;
irix*) # Check for nlist in mld (irix)
AC_CHECK_LIB(elf, nlist)
AC_CHECK_LIB(elf, nlist64)
AC_CHECK_LIB(mld, nlist)
;;
*) # default
AC_CHECK_LIB(elf, nlist)
;;
esac
fi
# libsocket
# Needed for 'socket(2)' (Solaris)
# Possibly also for 'gethostname(3)' (non-Solaris)
# (alternatively in libnsl (Solaris)
# or in libws2_32) (MinGW)
#
case x$with_socklib in
xwinsock2)
# libws2_w32 (MinGW)
#
netsnmp_save_LIBS="$LIBS"
LIBS="$LIBS -lws2_32"
AC_LINK_IFELSE([AC_LANG_PROGRAM([
#include <winsock2.h>
], [
socket(0, 0, 0);
gethostbyname(0);
])], [
# Keep LIBS.
true
], [
# Restore LIBS and complain.
LIBS="$netsnmp_save_LIBS"
AC_MSG_ERROR([libws2_32 not found.])
])
;;
*)
AC_SEARCH_LIBS(socket, socket,,AC_MSG_ERROR([socket(2) not found.]))
AC_SEARCH_LIBS(gethostbyname, [nsl socket])
AC_CHECK_FUNCS(gethostbyname)
AC_SEARCH_LIBS(gethostbyaddr, [nsl socket])
AC_CHECK_FUNCS(gethostbyaddr)
;;
esac
# libiphlpapi (Cygwin and MinGW)
#
netsnmp_save_LIBS="$LIBS"
LIBS="$LIBS -liphlpapi"
AC_LINK_IFELSE([AC_LANG_PROGRAM([
#include <winsock2.h>
#include <iphlpapi.h>
], [
IpRenewAddress(0);
])], [
# Keep LIBS.
true
], [
# Restore LIBS and complain.
LIBS="$netsnmp_save_LIBS"
case x$with_socklib in
xwinsock2)
AC_MSG_ERROR([libiphlpapi not found.])
;;
esac
])
# libregex (MinGW)
#
netsnmp_save_LIBS="$LIBS"
LIBS="$LIBS -lregex"
AC_LINK_IFELSE([AC_LANG_PROGRAM([
#include <sys/types.h>
#include <regex.h>
], [
regcomp(0, 0, 0);
])], [
# Keep LIBS.
true
], [
# Restore LIBS.
LIBS="$netsnmp_save_LIBS"
])
# libsnmpapi (MinGW)
#
netsnmp_save_LIBS="$LIBS"
LIBS="$LIBS -lsnmpapi"
AC_LINK_IFELSE([AC_LANG_PROGRAM([
#include <snmp.h>
], [
SnmpUtilMemAlloc(0);
])], [
# Keep LIBS.
true
], [
# Restore LIBS.
LIBS="$netsnmp_save_LIBS"
])
# kstat library (Solaris)
#
NETSNMP_SEARCH_LIBS(kstat_lookup, kstat,
AC_DEFINE(HAVE_LIBKSTAT, 1,
[Define to 1 if you have the `kstat' library (-lkstat).]),,,
LNETSNMPLIBS)
#
# librt
#
NETSNMP_SEARCH_LIBS(clock_gettime, rt,
AC_DEFINE(HAVE_CLOCK_GETTIME, 1,
[Define to 1 if you have the `clock_gettime' library]),,,
LNETSNMPLIBS)
##
# MIB-module-specific checks
##
# libdevstat
# (for diskIO MIB)
#
# Not-Used: HAVE_GETDEVS/HAVE_DEVSTAT_GETDEVS
#
echo " $module_list " | $GREP " ucd-snmp/diskio " >/dev/null
if test $? -eq 0 ; then
NETSNMP_SEARCH_LIBS(getdevs, devstat,
AC_DEFINE(HAVE_GETDEVS, 1,
[define if you have getdevs()]),,,LMIBLIBS)
NETSNMP_SEARCH_LIBS(devstat_getdevs, devstat,
AC_DEFINE(HAVE_DEVSTAT_GETDEVS, 1,
[define if you have devstat_getdevs()]),,,LMIBLIBS)
fi
# libpci
# (for if-mib description)
#
NETSNMP_SEARCH_LIBS(pci_lookup_name, pci,
AC_DEFINE(HAVE_PCI_LOOKUP_NAME, 1,
[define if you have pci_lookup_name()]),,,LMIBLIBS)
# LM-SENSORS-MIB support
#
echo " $module_list " | $GREP -i "ucd-snmp/lmsensor" > /dev/null
if test $? -eq 0 ; then
AC_MSG_CHECKING([for sensors support])
case $target_os in
solaris*)
# Agent: HAVE_PICL_H
#
AC_CHECK_HEADER(picl.h, LMIBLIBS="${LMIBLIBS} -lpicl",)
AC_CHECK_HEADERS(picl.h)
;;
*)
# Not-Used: HAVE_SENSORS_SENSORS_H
#
AC_CHECK_HEADER(sensors/sensors.h,,
[AC_MSG_ERROR([asked to use lm_sensors but I couldn't find sensors/sensors.h])])
NETSNMP_SEARCH_LIBS(sensors_get_detected_chips, sensors,,
[AC_MSG_ERROR([asked to use lm_sensors but I couldn't find -lsensors])],,
LMIBLIBS)
;;
esac
fi
#
# libnl (netlink)
#
if test "x$with_nl" != "xno"; then
case $target_os in
linux*) # Check for libnl (linux)
netsnmp_save_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="-I/usr/include/libnl3 $CPPFLAGS"
NETSNMP_SEARCH_LIBS(nl_connect, nl-3,
[AC_CHECK_HEADERS(netlink/netlink.h)
EXTERNAL_MIBGROUP_INCLUDES="$EXTERNAL_MIBGROUP_INCLUDES -I/usr/include/libnl3"],
[CPPFLAGS="$netsnmp_save_CPPFLAGS"], [], [], [LMIBLIBS])
if test "x$ac_cv_header_netlink_netlink_h" != xyes; then
NETSNMP_SEARCH_LIBS(nl_connect, nl, [
AC_CHECK_HEADERS(netlink/netlink.h)], [], [], LMIBLIBS)
fi
if test "x$ac_cv_header_netlink_netlink_h" = xyes; then
AC_EGREP_HEADER([nl_socket_free], [netlink/socket.h],
[AC_DEFINE([HAVE_LIBNL3], [1],
[Define to 1 if <netlink/netlink.h> provides the
libnl3 API])])
fi
;;
esac
fi
##
# More complex checks:
##
# Security related functions
#
NONAGENTLIBS=$LIBS # save old libraries
SSHPROG=no
TLSPROG=no
if test "x$tryopenssl" != "xno" -a "x$tryopenssl" != "xinternal"; then
# check for libpkcs11 if asked
if test "x$askedopenssl" != "xyes" -a "x$askedpkcs" = "xyes"; then
AC_CHECK_LIB(pkcs11, C_Initialize,
AC_DEFINE(HAVE_LIBPKCS11, 1,
[Define to 1 if you have the `pkcs11' library (-lpkcs11).])
LIBPKCS11="-lpkcs11")
else
if test "x$tryrsaref" != "xno"; then
AC_CHECK_LIB(rsaref, RSAPrivateDecrypt)
AC_CHECK_LIB(RSAglue, RSA_PKCS1_RSAref)
fi
AC_MSG_CHECKING([for -leay32])
netsnmp_save_LIBS="$LIBS"
LIBS="-leay32"
AC_LINK_IFELSE([AC_LANG_PROGRAM([
#include <openssl/evp.h>],
[return EVP_md5();])],
[AC_MSG_RESULT(yes); ac_cv_lib_eay32_EVP_md5=yes; CRYPTO="eay32"],
[AC_MSG_RESULT(no)]
)
LIBS="$netsnmp_save_LIBS"
if test x$CRYPTO = x; then
AC_CHECK_LIB([crypto], [EVP_md5], [CRYPTO="crypto"])
fi
if test x$CRYPTO != x; then
AC_DEFINE(HAVE_LIBCRYPTO, 1,
[Define to 1 if you have the OpenSSL library (-lcrypto or -leay32).])
LIBCRYPTO="-l${CRYPTO}"
AC_CHECK_LIB(${CRYPTO}, AES_cfb128_encrypt,
AC_DEFINE(HAVE_AES_CFB128_ENCRYPT, 1,
[Define to 1 if you have the `AES_cfb128_encrypt' function.]))
AC_CHECK_LIB(${CRYPTO}, EVP_MD_CTX_create,
AC_DEFINE([HAVE_EVP_MD_CTX_CREATE], [],
[Define to 1 if you have the `EVP_MD_CTX_create' function.])
AC_DEFINE([HAVE_EVP_MD_CTX_DESTROY], [],
[Define to 1 if you have the `EVP_MD_CTX_destroy' function.]))
fi
if echo " $transport_result_list " | $GREP "DTLS" > /dev/null; then
AC_CHECK_LIB(ssl, DTLSv1_method,
AC_DEFINE(HAVE_LIBSSL_DTLS, 1,
[Define to 1 if your `ssl' library supports DTLS (-lssl).])
LIBCRYPTO=" -lssl $LIBCRYPTO",
AC_MSG_ERROR([The DTLS based transports require the libssl library from OpenSSL to be available and support DTLS]) ,-lcrypto)
TLSPROG=yes
fi
if echo " $transport_result_list " | $GREP "TLS" > /dev/null; then
AC_CHECK_LIB(ssl, SSL_library_init,
AC_DEFINE(HAVE_LIBSSL, 1,
[Define to 1 if you have the `ssl' library (-lssl).])
LIBCRYPTO=" -lssl $LIBCRYPTO",
AC_MSG_ERROR([The DTLS based transports require the libssl library from OpenSSL to be available]) ,-lcrypto)
TLSPROG=yes
fi
if echo " $transport_result_list " | $GREP " SSH " > /dev/null; then
AC_CHECK_LIB(ssh2, libssh2_session_startup,
AC_DEFINE(HAVE_LIBSSH2, 1,
[Define to 1 if you have the `ssh2' library (-lssh2).])
LIBCRYPTO=" -lssh2 $LIBCRYPTO",
AC_MSG_ERROR([The SSH transport requires the libssh2 library to be available]),)
SSHPROG=yes
fi
fi
elif test "x$askedpkcs" = "xyes"; then
AC_CHECK_LIB(pkcs11, C_Initialize,
AC_DEFINE(HAVE_LIBPKCS11)
LIBPKCS11="-lpkcs11")
fi
if test "x$TLSPROG" = "xyes"; then
AC_CHECK_DECL([EVP_sha224],
AC_DEFINE([HAVE_EVP_SHA224], [], [Define if you have EVP_sha224/256 in openssl]),
: ,
[[#include <openssl/evp.h>]])
AC_CHECK_DECL([EVP_sha384],
AC_DEFINE([HAVE_EVP_SHA384], [], [Define if you have EVP_sha384/256 in openssl]),
: ,
[[#include <openssl/evp.h>]])
fi
LIBS=$NONAGENTLIBS # restore old libraries
if test "x$SSHPROG" = "xyes"; then
NETSNMP_BUILD_SSH_PROG_TRUE=''
NETSNMP_BUILD_SSH_PROG_FALSE='#'
else
NETSNMP_BUILD_SSH_PROG_TRUE='#'
NETSNMP_BUILD_SSH_PROG_FALSE=''
fi
if test "x$TLSPROG" = "xyes" -a "x$enable_read_only" != "xyes" ; then
NETSNMP_BUILD_TLS_PROG_TRUE=''
NETSNMP_BUILD_TLS_PROG_FALSE='#'
else
NETSNMP_BUILD_TLS_PROG_TRUE='#'
NETSNMP_BUILD_TLS_PROG_FALSE=''
fi
if echo " ${security_mod_list} " | grep ' usm ' ; then
if test "x$enable_read_only" != "xyes" ; then
NETSNMP_BUILD_USM_PROG_TRUE=''
NETSNMP_BUILD_USM_PROG_FALSE='#'
else
NETSNMP_BUILD_USM_PROG_TRUE='#'
NETSNMP_BUILD_USM_PROG_FALSE=''
fi
else
NETSNMP_BUILD_USM_PROG_TRUE='#'
NETSNMP_BUILD_USM_PROG_FALSE=''
fi
if test "x$enable_read_only" != "xyes" ; then
NETSNMP_BUILD_SET_PROG_TRUE=""
NETSNMP_BUILD_SET_PROG_FALSE="#"
else
NETSNMP_BUILD_SET_PROG_TRUE="#"
NETSNMP_BUILD_SET_PROG_FALSE=""
fi
AC_SUBST(NETSNMP_BUILD_SSH_PROG_TRUE)
AC_SUBST(NETSNMP_BUILD_SSH_PROG_FALSE)
AC_SUBST(NETSNMP_BUILD_TLS_PROG_TRUE)
AC_SUBST(NETSNMP_BUILD_TLS_PROG_FALSE)
AC_SUBST(NETSNMP_BUILD_USM_PROG_TRUE)
AC_SUBST(NETSNMP_BUILD_USM_PROG_FALSE)
AC_SUBST(NETSNMP_BUILD_SET_PROG_TRUE)
AC_SUBST(NETSNMP_BUILD_SET_PROG_FALSE)
#
# If we're using internal crypto support we need to compile in extra files
#
crypto_files_c=""
crypto_files_o=""
crypto_files_lo=""
if test "x$tryopenssl" != "xno" -a "x$CRYPTO" = "x"; then
# If we:
# 1) couldn't find needed openssl support
# 2) OR were asked to use internal support
# 3) AND we have the needed files
# then use it
CRYPTO="internal"
crypto_files_c="openssl/openssl_sha1.c openssl/openssl_md5.c openssl/openssl_set_key.c openssl/openssl_des_enc.c openssl/openssl_cbc_enc.c openssl/openssl_aes_cfb.c openssl/openssl_aes_core.c openssl/openssl_cfb128.c"
crypto_files_o="openssl/openssl_sha1.o openssl/openssl_md5.o openssl/openssl_set_key.o openssl/openssl_des_enc.o openssl/openssl_cbc_enc.o openssl/openssl_aes_cfb.o openssl/openssl_aes_core.oo openssl/openssl_cfb128.o"
crypto_files_lo="openssl/openssl_sha1.lo openssl/openssl_md5.lo openssl/openssl_set_key.lo openssl/openssl_des_enc.lo openssl/openssl_cbc_enc.lo openssl/openssl_aes_cfb.lo openssl/openssl_aes_core.lo openssl/openssl_cfb128.lo"
AC_DEFINE(HAVE_AES_CFB128_ENCRYPT)
fi
AC_SUBST(crypto_files_c)
AC_SUBST(crypto_files_o)
AC_SUBST(crypto_files_lo)
#
# if we can do any sort of crypto then note it
#
if test "x$CRYPTO" != "x" ; then
AC_DEFINE(NETSNMP_CAN_DO_CRYPTO, 1, "Define if crytography support is possible")
fi
# TCP wrapper support
#
_cppflags="${CPPFLAGS}"
_ldflags="${LDFLAGS}"
if test "$with_libwrap" != "no"; then
if test "$with_libwrap" != "yes"; then
CPPFLAGS="${CPPFLAGS} -I$with_libwrap/include"
LDFLAGS="${LDFLAGS} -L$with_libwrap/lib"
fi
_libs=${LIBS}
AC_CHECK_HEADER(tcpd.h, ,
AC_MSG_ERROR([Asked to use libwrap but I couldn't find tcpd.h.]))
LIBS="$LIBS -lwrap"
AC_MSG_CHECKING([for TCP wrappers library -lwrap])
# XXX: should check for hosts_ctl
AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
#include <tcpd.h>
int allow_severity = 0;
int deny_severity = 0;]],
[[hosts_access((void *)0)]])],
[AC_MSG_RESULT([yes])
AC_DEFINE(NETSNMP_USE_LIBWRAP)
test "$with_libwrap" != no -a "$with_libwrap" != yes && _wraplibs="-L$with_libwrap/lib"
_wraplibs="$_wraplibs -lwrap"],
[AC_MSG_RESULT([no])
# Linux RedHat 6.1 won't link libwrap without libnsl
AC_CHECK_FUNC(yp_get_default_domain, ,
AC_CHECK_LIB(nsl, yp_get_default_domain))
AC_MSG_CHECKING([for TCP wrappers library -lwrap linked with -lnsl])
AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
#include <tcpd.h>
int allow_severity = 0;
int deny_severity = 0;]],
[[hosts_access((void *)0)]])],
[AC_MSG_RESULT(yes)
AC_DEFINE(NETSNMP_USE_LIBWRAP)
test "$with_libwrap" != no -a "$with_libwrap" != yes && _wraplibs="-L$with_libwrap/lib"
_wraplibs="$_wraplibs -lwrap -lnsl"],
[AC_MSG_RESULT(no)
AC_MSG_ERROR(Asked to use libwrap but I couldn't find it.)])])
LAGENTLIBS="$_wraplibs"
CPPFLAGS=${_cppflags}
LDFLAGS=${_ldflags}
LIBS=${_libs}
fi
##
# mysql
##
if test "x$with_mysql" = "xyes" ; then
AC_PATH_PROGS(MYSQLCONFIG,mysql_config)
test -x "$MYSQLCONFIG" \
|| AC_MSG_ERROR([Could not find mysql_config and was specifically asked to use MySQL support])
MYSQL_LIBS=`$MYSQLCONFIG --libs`
MYSQL_INCLUDES=`$MYSQLCONFIG --include`
_libs="${LIBS}"
_cppflags="${CPPFLAGS}"
LIBS="${LIBS} ${MYSQL_LIBS}"
CPPFLAGS="${CPPFLAGS} ${MYSQL_INCLUDES}"
AC_CHECK_HEADER(mysql.h,,
[AC_MSG_ERROR([Could not find mysql.h and was specifically asked to use MySQL support])])
AC_MSG_CHECKING([whether MY_INIT() works])
AC_LINK_IFELSE([
AC_LANG_PROGRAM(
[[#include <my_global.h>
#include <my_sys.h>]],
[[MY_INIT("my_init_test")]])],
[AC_MSG_RESULT(yes)],
[AC_MSG_RESULT(no)
AC_DEFINE([HAVE_BROKEN_LIBMYSQLCLIENT], 1,
[Define if using MY_INIT() causes a linker error])])
CPPFLAGS="${_cppflags}"
LIBS="${_libs}"
AC_MSG_CACHE_ADD(MYSQL Trap Logging: enabled)
else
AC_MSG_CACHE_ADD(MYSQL Trap Logging: unavailable)
fi
AC_SUBST(MYSQL_LIBS)
AC_SUBST(MYSQL_INCLUDES)
##
# Non-library checks
##
# nlist
AC_CHECK_FUNCS(nlist nlist64 knlist)