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