summaryrefslogtreecommitdiff
path: root/m4/gssapi.m4
blob: 2d36e433f3dcf3c947814f07a3410cf80ad59e60 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
dnl gssapi.m4 -- Find the compiler and linker flags for GSS-API.
dnl $Id$
dnl
dnl Finds the compiler and linker flags for linking with GSS-API libraries
dnl and sets the substitution variables GSSAPI_CPPFLAGS, GSSAPI_LDFLAGS, and
dnl GSSAPI_LIBS.  Provides the --with-gssapi configure option to specify a
dnl non-standard path to the GSS-API libraries.  Uses krb5-config where
dnl available unless reduced dependencies is requested.
dnl
dnl Provides the macro RRA_LIB_GSSAPI and sets the substitution variables
dnl GSSAPI_CPPFLAGS, GSSAPI_LDFLAGS, and GSSAPI_LIBS.  Also provides
dnl RRA_LIB_GSSAPI_SET to set CPPFLAGS, LDFLAGS, and LIBS to include the
dnl GSS-API libraries; RRA_LIB_GSSAPI_SWITCH to do the same but save the
dnl current values first; and RRA_LIB_GSSAPI_RESTORE to restore those settings
dnl to before the last RRA_LIB_GSSAPI_SWITCH.
dnl
dnl Written by Russ Allbery <rra@stanford.edu>
dnl Copyright 2005, 2006, 2007, 2008
dnl     Board of Trustees, Leland Stanford Jr. University
dnl
dnl See LICENSE for licensing terms.

dnl Set CPPFLAGS, LDFLAGS, and LIBS to values including the GSS-API settings.
AC_DEFUN([RRA_LIB_GSSAPI_SET],
[CPPFLAGS="$GSSAPI_CPPFLAGS $CPPFLAGS"
 LDFLAGS="$GSSAPI_LDFLAGS $LDFLAGS"
 LIBS="$GSSAPI_LIBS $LIBS"])

dnl Save the current CPPFLAGS, LDFLAGS, and LIBS settings and switch to
dnl versions that include the GSS-API flags.  Used as a wrapper, with
dnl RRA_LIB_GSSAPI_RESTORE, around tests.
AC_DEFUN([RRA_LIB_GSSAPI_SWITCH],
[rra_gssapi_save_CPPFLAGS="$CPPFLAGS"
 rra_gssapi_save_LDFLAGS="$LDFLAGS"
 rra_gssapi_save_LIBS="$LIBS"
 RRA_LIB_GSSAPI_SET])

dnl Restore CPPFLAGS, LDFLAGS, and LIBS to their previous values (before
dnl RRA_LIB_GSSAPI_SWITCH was called).
AC_DEFUN([RRA_LIB_GSSAPI_RESTORE],
[CPPFLAGS="$rra_gssapi_save_CPPFLAGS"
 LDFLAGS="$rra_gssapi_save_LDFLAGS"
 LIBS="$rra_gssapi_save_LIBS"])

dnl Set GSSAPI_CPPFLAGS and GSSAPI_LDFLAGS based on rra_gssapi_root.
AC_DEFUN([_RRA_LIB_GSSAPI_PATHS],
[AS_IF([test x"$rra_gssapi_root" != x],
    [AS_IF([test x"$rra_gssapi_root" != x/usr],
        [GSSAPI_CPPFLAGS="-I${rra_gssapi_root}/include"])
     GSSAPI_LDFLAGS="-L${rra_gssapi_root}/lib"])])

dnl Does the appropriate library checks for reduced-dependency GSS-API
dnl linkage.
AC_DEFUN([_RRA_LIB_GSSAPI_REDUCED],
[RRA_LIB_GSSAPI_SWITCH
 AC_CHECK_LIB([gssapi_krb5], [gss_import_name], [GSSAPI_LIBS="-lgssapi_krb5"],
     [AC_CHECK_LIB([gssapi], [gss_import_name], [GSSAPI_LIBS="-lgssapi"],
         [AC_MSG_ERROR([cannot find usable GSS-API library])])])])

dnl Does the appropriate library checks for GSS-API linkage when we don't
dnl have krb5-config or reduced dependencies.
AC_DEFUN([_RRA_LIB_GSSAPI_MANUAL],
[RRA_LIB_GSSAPI_SWITCH
 rra_gssapi_extra=
 LIBS=
 AC_SEARCH_LIBS([res_search], [resolv], ,
    [AC_SEARCH_LIBS([__res_search], [resolv])])
 AC_SEARCH_LIBS([gethostbyname], [nsl])
 AC_SEARCH_LIBS([socket], [socket], ,
    [AC_CHECK_LIB([nsl], [socket], [LIBS="-lnsl -lsocket $LIBS"], ,
        [-lsocket])])
 AC_SEARCH_LIBS([crypt], [crypt])
 rra_gssapi_extra="$LIBS"
 LIBS="$rra_gssapi_save_LIBS"
 AC_CHECK_LIB([gssapi], [gss_import_name],
    [GSSAPI_LIBS="-lgssapi -lkrb5 -lasn1 -lroken -lcrypto -lcom_err"
     GSSAPI_LIBS="$GSSAPI_LIBS $rra_gssapi_extra"],
    [AC_CHECK_LIB([krb5support], [krb5int_getspecific],
        [rra_gssapi_extra="-lkrb5support $rra_gssapi_extra"],
        [AC_CHECK_LIB([pthreads], [pthread_setspecific],
            [rra_gssapi_pthread="-lpthreads"],
            [AC_CHECK_LIB([pthread], [pthread_setspecific],
                [rra_gssapi_pthread="-lpthread"])])
         AC_CHECK_LIB([krb5support], [krb5int_setspecific],
            [rra_gssapi_extra="-lkrb5support $rra_gssapi_extra"
             rra_gssapi_extra="$rra_gssapi_extra $rra_gssapi_pthread"], ,
            [$rra_gssapi_pthread])])
     AC_CHECK_LIB([com_err], [error_message],
        [rra_gssapi_extra="-lcom_err $rra_gssapi_extra"])
     AC_CHECK_LIB([k5crypto], [krb5int_hash_md5],
        [rra_gssapi_extra="-lk5crypto $rra_gssapi_extra"])
     rra_gssapi_extra="-lkrb5 $rra_gssapi_extra"
     AC_CHECK_LIB([gssapi_krb5], [gss_import_name],
        [GSSAPI_LIBS="-lgssapi_krb5 $rra_gssapi_extra"],
        [AC_MSG_ERROR([cannot find usable GSS-API library])],
        [$rra_gssapi_extra])],
    [-lkrb5 -lasn1 -lroken -lcrypto -lcom_err $rra_gssapi_extra])
 RRA_LIB_GSSAPI_RESTORE])

dnl The main macro.
AC_DEFUN([RRA_LIB_GSSAPI],
[AC_REQUIRE([RRA_ENABLE_REDUCED_DEPENDS])
 rra_gssapi_root=
 GSSAPI_CPPFLAGS=
 GSSAPI_LDFLAGS=
 GSSAPI_LIBS=
 AC_SUBST([GSSAPI_CPPFLAGS])
 AC_SUBST([GSSAPI_LDFLAGS])
 AC_SUBST([GSSAPI_LIBS])
 AC_ARG_WITH([gssapi],
    [AC_HELP_STRING([--with-gssapi=DIR],
        [Location of GSS-API headers and libraries])],
    [AS_IF([test x"$withval" != xyes && test x"$withval" != xno],
        [rra_gssapi_root="$withval"])])
 AS_IF([test x"$rra_reduced_depends" = xtrue],
    [_RRA_LIB_GSSAPI_PATHS
     _RRA_LIB_GSSAPI_REDUCED],
    [AC_ARG_VAR([KRB5_CONFIG], [Path to krb5-config])
     AS_IF([test x"$rra_gssapi_root" != x],
         [AS_IF([test -x "${rra_gssapi_root}/bin/krb5-config"],
             [KRB5_CONFIG="${rra_gssapi_root}/bin/krb5-config"])],
         [AC_PATH_PROG([KRB5_CONFIG], [krb5-config])])
     AS_IF([test x"$KRB5_CONFIG" != x],
         [AC_CACHE_CHECK([for gssapi support in krb5-config],
             [rra_cv_lib_gssapi_config],
             [AS_IF(["$KRB5_CONFIG" | grep gssapi > /dev/null 2>&1],
                 [rra_cv_lib_gssapi_config=yes],
                 [rra_cv_lib_gssapi_config=no])])
          AS_IF([test "$rra_cv_lib_gssapi_config" = yes],
              [GSSAPI_CPPFLAGS=`"$KRB5_CONFIG" --cflags gssapi`
               GSSAPI_LIBS=`"$KRB5_CONFIG" --libs gssapi`],
              [GSSAPI_CPPFLAGS=`"$KRB5_CONFIG" --cflags`
               GSSAPI_LIBS=`"$KRB5_CONFIG" --libs`])
          GSSAPI_CPPFLAGS=`echo "$GSSAPI_CPPFLAGS" \
              | sed 's%-I/usr/include ?%%'`],
         [_RRA_LIB_GSSAPI_PATHS
          _RRA_LIB_GSSAPI_MANUAL])])])