6c8c9b651a55de234daeb33738fe51610e49a4b4
[openafs.git] / src / cf / gssapi.m4
1 dnl Find the compiler and linker flags for GSS-API.
2 dnl
3 dnl Finds the compiler and linker flags for linking with GSS-API libraries.
4 dnl Provides the --with-gssapi, --with-gssapi-include, and --with-gssapi-lib
5 dnl configure option to specify a non-standard path to the GSS-API libraries.
6 dnl Uses krb5-config where available unless reduced dependencies is requested.
7 dnl
8 dnl Provides the macro RRA_LIB_GSSAPI and sets the substitution variables
9 dnl GSSAPI_CPPFLAGS, GSSAPI_LDFLAGS, and GSSAPI_LIBS.  Also provides
10 dnl RRA_LIB_GSSAPI_SWITCH to set CPPFLAGS, LDFLAGS, and LIBS to include the
11 dnl GSS-API libraries, saving the ecurrent values, and RRA_LIB_GSSAPI_RESTORE
12 dnl to restore those settings to before the last RRA_LIB_GSSAPI_SWITCH.
13 dnl
14 dnl Depends on RRA_ENABLE_REDUCED_DEPENDS and RRA_SET_LDFLAGS.
15 dnl
16 dnl Written by Russ Allbery <rra@stanford.edu>
17 dnl Copyright 2005, 2006, 2007, 2008, 2009, 2011
18 dnl     The Board of Trustees of the Leland Stanford Junior University
19 dnl
20 dnl This file is free software; the authors give unlimited permission to copy
21 dnl and/or distribute it, with or without modifications, as long as this
22 dnl notice is preserved.
23
24 dnl Save the current CPPFLAGS, LDFLAGS, and LIBS settings and switch to
25 dnl versions that include the GSS-API flags.  Used as a wrapper, with
26 dnl RRA_LIB_GSSAPI_RESTORE, around tests.
27 AC_DEFUN([RRA_LIB_GSSAPI_SWITCH],
28 [rra_gssapi_save_CPPFLAGS="$CPPFLAGS"
29  rra_gssapi_save_LDFLAGS="$LDFLAGS"
30  rra_gssapi_save_LIBS="$LIBS"
31  CPPFLAGS="$GSSAPI_CPPFLAGS $CPPFLAGS"
32  LDFLAGS="$GSSAPI_LDFLAGS $LDFLAGS"
33  LIBS="$GSSAPI_LIBS $LIBS"])
34
35 dnl Restore CPPFLAGS, LDFLAGS, and LIBS to their previous values (before
36 dnl RRA_LIB_GSSAPI_SWITCH was called).
37 AC_DEFUN([RRA_LIB_GSSAPI_RESTORE],
38 [CPPFLAGS="$rra_gssapi_save_CPPFLAGS"
39  LDFLAGS="$rra_gssapi_save_LDFLAGS"
40  LIBS="$rra_gssapi_save_LIBS"])
41
42 dnl Set GSSAPI_CPPFLAGS and GSSAPI_LDFLAGS based on rra_gssapi_root,
43 dnl rra_gssapi_libdir, and rra_gssapi_includedir.
44 AC_DEFUN([_RRA_LIB_GSSAPI_PATHS],
45 [AS_IF([test x"$rra_gssapi_libdir" != x],
46     [GSSAPI_LDFLAGS="-L$rra_gssapi_libdir"],
47     [AS_IF([test x"$rra_gssapi_root" != x],
48         [RRA_SET_LDFLAGS([GSSAPI_LDFLAGS], [$rra_gssapi_root])])])
49  AS_IF([test x"$rra_gssapi_includedir" != x],
50     [GSSAPI_CPPFLAGS="-I$rra_gssapi_includedir"],
51     [AS_IF([test x"$rra_gssapi_root" != x],
52         [AS_IF([test x"$rra_gssapi_root" != x/usr],
53             [GSSAPI_CPPFLAGS="-I${rra_gssapi_root}/include"])])])])
54
55 dnl Does the appropriate library checks for reduced-dependency GSS-API
56 dnl linkage.
57 AC_DEFUN([_RRA_LIB_GSSAPI_REDUCED],
58 [RRA_LIB_GSSAPI_SWITCH
59  AC_CHECK_LIB([gssapi_krb5], [gss_import_name], [GSSAPI_LIBS="-lgssapi_krb5"],
60      [AC_CHECK_LIB([gssapi], [gss_import_name], [GSSAPI_LIBS="-lgssapi"],
61          [AC_CHECK_LIB([gss], [gss_import_name], [GSSAPI_LIBS="-lgss"],
62              [AC_MSG_ERROR([cannot find usable GSS-API library])])])])
63  RRA_LIB_GSSAPI_RESTORE])
64
65 dnl Does the appropriate library checks for GSS-API linkage when we don't
66 dnl have krb5-config or reduced dependencies.  libgss is used as a last
67 dnl resort, since it may be a non-functional mech-independent wrapper, but
68 dnl it's the right choice on Solaris 10.
69 AC_DEFUN([_RRA_LIB_GSSAPI_MANUAL],
70 [RRA_LIB_GSSAPI_SWITCH
71  rra_gssapi_extra=
72  LIBS=
73  AC_SEARCH_LIBS([res_search], [resolv], [],
74     [AC_SEARCH_LIBS([__res_search], [resolv])])
75  AC_SEARCH_LIBS([gethostbyname], [nsl])
76  AC_SEARCH_LIBS([socket], [socket], [],
77     [AC_CHECK_LIB([nsl], [socket], [LIBS="-lnsl -lsocket $LIBS"], [],
78         [-lsocket])])
79  AC_SEARCH_LIBS([crypt], [crypt])
80  AC_SEARCH_LIBS([rk_simple_execve], [roken])
81  rra_gssapi_extra="$LIBS"
82  LIBS="$rra_gssapi_save_LIBS"
83  AC_CHECK_LIB([gssapi], [gss_import_name],
84     [GSSAPI_LIBS="-lgssapi -lkrb5 -lasn1 -lcrypto -lcom_err $rra_gssapi_extra"],
85     [AC_CHECK_LIB([krb5support], [krb5int_getspecific],
86         [rra_gssapi_extra="-lkrb5support $rra_gssapi_extra"],
87         [AC_CHECK_LIB([pthreads], [pthread_setspecific],
88             [rra_gssapi_pthread="-lpthreads"],
89             [AC_CHECK_LIB([pthread], [pthread_setspecific],
90                 [rra_gssapi_pthread="-lpthread"])])
91          AC_CHECK_LIB([krb5support], [krb5int_setspecific],
92             [rra_gssapi_extra="-lkrb5support $rra_gssapi_extra"
93              rra_gssapi_extra="$rra_gssapi_extra $rra_gssapi_pthread"], [],
94             [$rra_gssapi_pthread])])
95      AC_CHECK_LIB([com_err], [error_message],
96         [rra_gssapi_extra="-lcom_err $rra_gssapi_extra"])
97      AC_CHECK_LIB([k5crypto], [krb5int_hash_md5],
98         [rra_gssapi_extra="-lk5crypto $rra_gssapi_extra"])
99      rra_gssapi_extra="-lkrb5 $rra_gssapi_extra"
100      AC_CHECK_LIB([gssapi_krb5], [gss_import_name],
101         [GSSAPI_LIBS="-lgssapi_krb5 $rra_gssapi_extra"],
102         [AC_CHECK_LIB([gss], [gss_import_name],
103             [GSSAPI_LIBS="-lgss"],
104             [AC_MSG_ERROR([cannot find usable GSS-API library])])],
105         [$rra_gssapi_extra])],
106     [-lkrb5 -lasn1 -lcrypto -lcom_err $rra_gssapi_extra])
107  RRA_LIB_GSSAPI_RESTORE])
108
109 dnl Sanity-check the results of krb5-config and be sure we can really link a
110 dnl GSS-API program.  If not, fall back on the manual check.
111 AC_DEFUN([_RRA_LIB_GSSAPI_CHECK],
112 [RRA_LIB_GSSAPI_SWITCH
113  AC_CHECK_FUNC([gss_import_name],
114     [RRA_LIB_GSSAPI_RESTORE],
115     [RRA_LIB_GSSAPI_RESTORE
116      GSSAPI_CPPFLAGS=
117      GSSAPI_LIBS=
118      _RRA_LIB_GSSAPI_PATHS
119      _RRA_LIB_GSSAPI_MANUAL])])
120
121 dnl The main macro.
122 AC_DEFUN([RRA_LIB_GSSAPI],
123 [AC_REQUIRE([RRA_ENABLE_REDUCED_DEPENDS])
124  rra_gssapi_root=
125  rra_gssapi_libdir=
126  rra_gssapi_includedir=
127  GSSAPI_CPPFLAGS=
128  GSSAPI_LDFLAGS=
129  GSSAPI_LIBS=
130  AC_SUBST([GSSAPI_CPPFLAGS])
131  AC_SUBST([GSSAPI_LDFLAGS])
132  AC_SUBST([GSSAPI_LIBS])
133
134  AC_ARG_WITH([gssapi],
135     [AS_HELP_STRING([--with-gssapi=DIR],
136         [Location of GSS-API headers and libraries])],
137     [AS_IF([test x"$withval" != xyes && test x"$withval" != xno],
138         [rra_gssapi_root="$withval"])])
139  AC_ARG_WITH([gssapi-include],
140     [AS_HELP_STRING([--with-gssapi-include=DIR],
141         [Location of GSS-API headers])],
142     [AS_IF([test x"$withval" != xyes && test x"$withval" != xno],
143         [rra_gssapi_includedir="$withval"])])
144  AC_ARG_WITH([gssapi-lib],
145     [AS_HELP_STRING([--with-gssapi-lib=DIR],
146         [Location of GSS-API libraries])],
147     [AS_IF([test x"$withval" != xyes && test x"$withval" != xno],
148         [rra_gssapi_libdir="$withval"])])
149
150  AS_IF([test x"$rra_reduced_depends" = xtrue],
151     [_RRA_LIB_GSSAPI_PATHS
152      _RRA_LIB_GSSAPI_REDUCED],
153     [AC_ARG_VAR([KRB5_CONFIG], [Path to krb5-config])
154      AS_IF([test x"$rra_gssapi_root" != x && test -z "$KRB5_CONFIG"],
155          [AS_IF([test -x "${rra_gssapi_root}/bin/krb5-config"],
156              [KRB5_CONFIG="${rra_gssapi_root}/bin/krb5-config"])],
157          [AC_PATH_PROG([KRB5_CONFIG], [krb5-config], [],
158              [${PATH}:/usr/kerberos/bin])])
159      AS_IF([test x"$KRB5_CONFIG" != x && test -x "$KRB5_CONFIG"],
160          [AC_CACHE_CHECK([for gssapi support in krb5-config],
161              [rra_cv_lib_gssapi_config],
162              [AS_IF(["$KRB5_CONFIG" 2>&1 | grep gssapi >/dev/null 2>&1],
163                  [rra_cv_lib_gssapi_config=yes],
164                  [rra_cv_lib_gssapi_config=no])])
165           AS_IF([test "$rra_cv_lib_gssapi_config" = yes],
166               [GSSAPI_CPPFLAGS=`"$KRB5_CONFIG" --cflags gssapi 2>/dev/null`
167                GSSAPI_LIBS=`"$KRB5_CONFIG" --libs gssapi 2>/dev/null`],
168               [GSSAPI_CPPFLAGS=`"$KRB5_CONFIG" --cflags 2>/dev/null`
169                GSSAPI_LIBS=`"$KRB5_CONFIG" --libs 2>/dev/null`])
170           GSSAPI_CPPFLAGS=`echo "$GSSAPI_CPPFLAGS" \
171               | sed 's%-I/usr/include ?%%'`
172           _RRA_LIB_GSSAPI_CHECK],
173          [_RRA_LIB_GSSAPI_PATHS
174           _RRA_LIB_GSSAPI_MANUAL])])])