audit: Support multiple audit interfaces and interface options
[openafs.git] / src / cf / roken.m4
index 662cf0e..a5ab2ef 100644 (file)
@@ -4,43 +4,76 @@ AC_DEFUN([_OPENAFS_ROKEN_INTERNAL], [
   CPPFLAGS_roken=
   LDFLAGS_roken="-L\$(TOP_LIBDIR)"
   LIB_roken=-lrokenafs
+  buildtool_roken="\$(TOP_OBJDIR)/src/roken/librokenafs.a"
 ])
 
-dnl _OPENAFS_ROKEN_CHECK($path,
-dnl                     $action-if-found,
-dnl                     $action-if-not-found)
-dnl Find a roken library at $path.
+dnl _OPENAFS_ROKEN_PATHS()
+dnl Set CPPFLAGS_roken, LDFLAGS_roken, and LIB_roken based on the values
+dnl of roken_root, roken_libdir, and roken_includedir.
+AC_DEFUN([_OPENAFS_ROKEN_PATHS], [
+  AS_IF([test x"$roken_libdir" != x],
+    [LDFLAGS_roken="-L$roken_libdir"],
+    [AS_IF([test x"$roken_root" != x],
+      [LDFLAGS_roken="-L$roken_root/lib"])])
+  AS_IF([test x"$roken_includedir" != x],
+    [CPPFLAGS_roken="-I$roken_includedir"],
+    [AS_IF([test x"$roken_root" != x],
+      [CPPFLAGS_roken="-I$roken_root/include"])])
+  LIB_roken="-lroken"
+  buildtool_roken="\$(LDFLAGS_roken) \$(LIB_roken)"])
+
+dnl _OPENAFS_ROKEN_CHECK($action-if-found,
+dnl                          $action-if-not-found)
+dnl Find a roken library using $roken_root, $roken_libdir, and $roken_includedir
 dnl
-dnl If $path is not specified,
+dnl If none of the three paths are specified,
 dnl try to find one in the standard locations on the system.
 dnl
-dnl If we fail, and $path was given, then error out. Otherwise,
-dnl fall back to the internal roken implementation
+dnl If we fail, and at least one path was given, then error out. Otherwise,
+dnl fall back to the internal roken implementation.
 AC_DEFUN([_OPENAFS_ROKEN_CHECK], [
-  roken_path=$1
 
+  _OPENAFS_ROKEN_PATHS
   save_CPPFLAGS=$CPPFLAGS
   save_LDFLAGS=$LDFLAGS
   save_LIBS=$LIBS
-  AS_IF([test x"$roken_path" != x],
-       [CPPFLAGS="-I$roken_path/include $CPPFLAGS"
-        LDFLAGS="-L$roken_path/lib $LDFLAGS"])
+  AS_IF([test x"$CPPFLAGS_roken" != x],
+        [CPPFLAGS="$CPPFLAGS_roken $CPPFLAGS"])
+  AS_IF([test x"$LDFLAGS_roken" != x],
+        [LDFLAGS="$LDFLAGS_roken $LDFLAGS"])
+  AS_IF([test x"$roken_libdir" != x || test x"$roken_includedir" != x],
+        [checkstr=" with specified include and lib paths"],
+        [AS_IF([test x"$roken_root" != x],
+                [checkstr=" in $roken_root"])])
+
+  AC_MSG_CHECKING([for usable system libroken$checkstr])
 
+  LIBS="$LIBS $LIB_roken"
   dnl Need to be careful what we check for here, as libroken contains
-  dnl different symbols on different platforms.
-  AC_CHECK_LIB([roken], [ct_memcmp], [roken_foundlib=true])
-  AC_CHECK_HEADER([roken.h], [roken_foundheader=true])
+  dnl different symbols on different platforms. We cannot simply check
+  dnl if e.g. rk_rename is a symbol or not, since on most platforms it
+  dnl will be a preprocessor define, but on others it will be a symbol.
+  dnl
+  dnl Also note that we need to check for the specific functionality in
+  dnl roken that we use, not just the existence of the library itself,
+  dnl since older versions of roken do not contain all of the functions
+  dnl we need. It may not be practical to check everything we use, so
+  dnl just add functions to check here as we find installations where
+  dnl this breaks.
+  AC_LINK_IFELSE(
+   [AC_LANG_PROGRAM(
+    [[#include <roken.h>]],
+    [[ct_memcmp(NULL, NULL, 0); rk_rename(NULL, NULL);]])],
+   [roken_found=true
+    AC_MSG_RESULT([yes])],
+   [AC_MSG_RESULT([no])])
+
   CPPFLAGS=$save_CPPFLAGS
   LDFLAGS=$save_LDFLAGS
   LIBS=$save_LIBS
 
-  AS_IF([test x"$roken_foundlib" = xtrue && test x"$roken_foundheader" = xtrue],
-        [AS_IF([test x"$roken_path" != x],
-              [CPPFLAGS_roken="-I$roken_path/include"
-               LDFLAGS_roken="-L$roken_path/lib"
-               LIB_roken="-lroken"])
-        $2],
-       [$3])
+  AS_IF([test x"$roken_found" = xtrue],
+         [$1], [$2])
 ])
 
 AC_DEFUN([OPENAFS_ROKEN], [
@@ -49,24 +82,122 @@ AC_DEFUN([OPENAFS_ROKEN], [
   AC_SUBST(CPPFLAGS_roken)
   AC_SUBST(LDFLAGS_roken)
   AC_SUBST(DIR_roken)
+  AC_SUBST(buildtool_roken)
 
   AC_ARG_WITH([roken],
     [AS_HELP_STRING([--with-roken=DIR],
-       [Location of the roken library, or 'internal'])],
+        [Location of the roken library, or 'internal'])],
     [AS_IF([test x"$withval" = xno],
-          [AC_ERROR("OpenAFS requires roken to build")],
-          [AS_IF([test x"$withval" != xyes],
-                 [roken_root="$withval"])
-          ])
+           [AC_MSG_ERROR("OpenAFS requires roken to build")],
+           [AS_IF([test x"$withval" != xyes],
+                  [roken_root="$withval"])
+           ])
     ])
+  AC_ARG_WITH([roken-include],
+    [AS_HELP_STRING([--with-roken-include=DIR],
+        [Location of roken headers])],
+    [AS_IF([test x"$withval" != xyes && test x"$withval" != xno],
+        [roken_includedir="$withval"])])
+  AC_ARG_WITH([roken-lib],
+    [AS_HELP_STRING([--with-roken-lib=DIR],
+        [Location of roken libraries])],
+    [AS_IF([test x"$withval" != xyes && test x"$withval" != xno],
+        [roken_libdir="$withval"])])
+
+  AS_IF([test x"$roken_root" = xinternal],
+        [_OPENAFS_ROKEN_INTERNAL()],
+        [AS_IF([test x"$roken_root" = x && test x"$roken_libdir" = x &&
+                test x"$roken_includedir" = x],
+            [_OPENAFS_ROKEN_CHECK([], [_OPENAFS_ROKEN_INTERNAL()])],
+            [_OPENAFS_ROKEN_CHECK([],
+                [AC_MSG_ERROR([Cannot find roken at that location])])
+            ])
+        ])
+])
+
+AC_DEFUN([OPENAFS_MORE_ROKEN_CHECKS],[
+dnl Functions that Heimdal's libroken provides, but that we
+dnl haven't found a need for yet, and so haven't imported
+AC_CHECK_FUNCS([ \
+        chown \
+        fchown \
+        gethostname \
+        lstat \
+        inet_aton \
+        putenv \
+        readv \
+        setenv \
+        strdup \
+        strftime \
+        strndup \
+        strsep \
+        unsetenv \
+])
+
+dnl Functions that are in objects that we always build from libroken
+AC_CHECK_FUNCS([ \
+        asprintf \
+        asnprintf \
+        vasprintf \
+        vasnprintf \
+        vsnprintf \
+        snprintf \
+])
+
+dnl Functions that we're going to try and get from libroken
+AC_REPLACE_FUNCS([ \
+        daemon \
+        ecalloc \
+        emalloc \
+        erealloc \
+        err \
+        errx \
+        flock \
+        freeaddrinfo \
+        gai_strerror \
+        getaddrinfo \
+        getdtablesize \
+        getnameinfo \
+        getopt \
+        getprogname \
+        gettimeofday \
+        inet_ntop \
+        inet_pton \
+        localtime_r \
+        mkstemp \
+        setenv \
+        setprogname \
+        strcasecmp \
+        strlcat \
+        strnlen \
+        strlcpy \
+        strsep \
+        strtok_r \
+        tdelete \
+        tfind \
+        tsearch \
+        twalk \
+        unsetenv \
+        verr \
+        verrx \
+        vsyslog \
+        vwarn \
+        vwarnx \
+        warn \
+        warnx \
+])
+
+dnl Headers that we're going to try and get from libroken
+AC_CHECK_HEADERS([ \
+        err.h \
+        search.h \
+])
+])
 
-  AS_IF([test x"$roken_root" = xinteral],
-       [_OPENAFS_ROKEN_INTERNAL()],
-       [AS_IF([test x"$roken_root" = x],
-           [_OPENAFS_ROKEN_CHECK([], [], [_OPENAFS_ROKEN_INTERNAL()])],
-           [_OPENAFS_ROKEN_CHECK($roken_root,
-               [],
-               [AC_MSG_ERROR([Cannot find roken at that location])])
-           ])
-       ])
+AC_DEFUN([OPENAFS_ROKEN_HEADERS],[
+ROKEN_HEADERS=
+AS_IF([test "$ac_cv_header_err_h" != "yes" ],
+      [ROKEN_HEADERS="$ROKEN_HEADERS \$(TOP_INCDIR)/err.h"],
+      [])
+AC_SUBST(ROKEN_HEADERS)
 ])