1 dnl Find the compiler and linker flags for Kerberos v5.
3 dnl Finds the compiler and linker flags for linking with Kerberos v5
4 dnl libraries. Provides the --with-krb5, --with-krb5-include, and
5 dnl --with-krb5-lib configure options to specify non-standard paths to the
6 dnl Kerberos libraries. Uses krb5-config where available unless reduced
7 dnl dependencies is requested.
9 dnl Provides the macro RRA_LIB_KRB5 and sets the substitution variables
10 dnl KRB5_CPPFLAGS, KRB5_LDFLAGS, and KRB5_LIBS. Also provides
11 dnl RRA_LIB_KRB5_SWITCH to set CPPFLAGS, LDFLAGS, and LIBS to include the
12 dnl Kerberos libraries, saving the current values first, and
13 dnl RRA_LIB_KRB5_RESTORE to restore those settings to before the last
14 dnl RRA_LIB_KRB5_SWITCH.
16 dnl If KRB5_CPPFLAGS, KRB5_LDFLAGS, or KRB5_LIBS are set before calling these
17 dnl macros, their values will be added to whatever the macros discover.
19 dnl Provides the RRA_LIB_KRB5_OPTIONAL macro, which should be used if Kerberos
20 dnl support is optional. This macro will still always set the substitution
21 dnl variables, but they'll be empty unless --with-krb5 is given. Also,
22 dnl HAVE_KERBEROS will be defined if --with-krb5 is given and
23 dnl $rra_use_kerberos will be set to "true".
25 dnl Sets the Automake conditional KRB5_USES_COM_ERR saying whether we use
26 dnl com_err, since if we're also linking with AFS libraries, we may have to
27 dnl change library ordering in that case.
29 dnl Depends on RRA_ENABLE_REDUCED_DEPENDS and RRA_SET_LDFLAGS.
31 dnl Also provides RRA_FUNC_KRB5_GET_INIT_CREDS_OPT_FREE_ARGS, which checks
32 dnl whether krb5_get_init_creds_opt_free takes one argument or two. Defines
33 dnl HAVE_KRB5_GET_INIT_CREDS_OPT_FREE_2_ARGS if it takes two arguments.
35 dnl Written by Russ Allbery <rra@stanford.edu>
36 dnl Copyright 2005, 2006, 2007, 2008, 2009, 2010
37 dnl Board of Trustees, Leland Stanford Jr. University
39 dnl See LICENSE for licensing terms.
41 dnl Save the current CPPFLAGS, LDFLAGS, and LIBS settings and switch to
42 dnl versions that include the Kerberos v5 flags. Used as a wrapper, with
43 dnl RRA_LIB_KRB5_RESTORE, around tests.
44 AC_DEFUN([RRA_LIB_KRB5_SWITCH],
45 [rra_krb5_save_CPPFLAGS="$CPPFLAGS"
46 rra_krb5_save_LDFLAGS="$LDFLAGS"
47 rra_krb5_save_LIBS="$LIBS"
48 CPPFLAGS="$KRB5_CPPFLAGS $CPPFLAGS"
49 LDFLAGS="$KRB5_LDFLAGS $LDFLAGS"
50 LIBS="$KRB5_LIBS $LIBS"])
52 dnl Restore CPPFLAGS, LDFLAGS, and LIBS to their previous values (before
53 dnl RRA_LIB_KRB5_SWITCH was called).
54 AC_DEFUN([RRA_LIB_KRB5_RESTORE],
55 [CPPFLAGS="$rra_krb5_save_CPPFLAGS"
56 LDFLAGS="$rra_krb5_save_LDFLAGS"
57 LIBS="$rra_krb5_save_LIBS"])
59 dnl Set KRB5_CPPFLAGS and KRB5_LDFLAGS based on rra_krb5_root,
60 dnl rra_krb5_libdir, and rra_krb5_includedir.
61 AC_DEFUN([_RRA_LIB_KRB5_PATHS],
62 [AS_IF([test x"$rra_krb5_libdir" != x],
63 [KRB5_LDFLAGS="-L$rra_krb5_libdir"],
64 [AS_IF([test x"$rra_krb5_root" != x],
65 [RRA_SET_LDFLAGS([KRB5_LDFLAGS], [$rra_krb5_root])])])
66 AS_IF([test x"$rra_krb5_includedir" != x],
67 [KRB5_CPPFLAGS="-I$rra_krb5_includedir"],
68 [AS_IF([test x"$rra_krb5_root" != x],
69 [AS_IF([test x"$rra_krb5_root" != x/usr],
70 [KRB5_CPPFLAGS="-I${rra_krb5_root}/include"])])])])
72 dnl Does the appropriate library checks for reduced-dependency Kerberos v5
73 dnl linkage. The single argument, if true, says to fail if Kerberos could not
75 AC_DEFUN([_RRA_LIB_KRB5_REDUCED],
77 AC_CHECK_LIB([krb5], [krb5_init_context], [KRB5_LIBS="-lkrb5"],
78 [AS_IF([test x"$1" = xtrue],
79 [AC_MSG_ERROR([cannot find usable Kerberos v5 library])])])
80 LIBS="$KRB5_LIBS $LIBS"
81 AC_CHECK_FUNCS([krb5_get_error_message],
82 [AC_CHECK_FUNCS([krb5_free_error_message])],
83 [AC_CHECK_FUNCS([krb5_get_error_string], ,
84 [AC_CHECK_FUNCS([krb5_get_err_txt], ,
85 [AC_CHECK_LIB([ksvc], [krb5_svc_get_msg],
86 [KRB5_LIBS="$KRB5_LIBS -lksvc"
87 AC_DEFINE([HAVE_KRB5_SVC_GET_MSG], [1])
88 AC_CHECK_HEADERS([ibm_svc/krb5_svc.h])],
89 [AC_CHECK_LIB([com_err], [com_err],
90 [KRB5_LIBS="$KRB5_LIBS -lcom_err"],
91 [AC_MSG_ERROR([cannot find usable com_err library])])
92 AC_CHECK_HEADERS([et/com_err.h])])])])])
93 RRA_LIB_KRB5_RESTORE])
95 dnl Does the appropriate library checks for Kerberos v5 linkage when we don't
96 dnl have krb5-config or reduced dependencies. The single argument, if true,
97 dnl says to fail if Kerberos could not be found.
98 AC_DEFUN([_RRA_LIB_KRB5_MANUAL],
102 AC_SEARCH_LIBS([res_search], [resolv], ,
103 [AC_SEARCH_LIBS([__res_search], [resolv])])
104 AC_SEARCH_LIBS([gethostbyname], [nsl])
105 AC_SEARCH_LIBS([socket], [socket], ,
106 [AC_CHECK_LIB([nsl], [socket], [LIBS="-lnsl -lsocket $LIBS"], ,
108 AC_SEARCH_LIBS([crypt], [crypt])
109 AC_SEARCH_LIBS([rk_simple_execve], [roken])
110 rra_krb5_extra="$LIBS"
111 LIBS="$rra_krb5_save_LIBS"
112 AC_CHECK_LIB([krb5], [krb5_init_context],
113 [KRB5_LIBS="-lkrb5 -lasn1 -lcom_err -lcrypto $rra_krb5_extra"],
114 [AC_CHECK_LIB([krb5support], [krb5int_getspecific],
115 [rra_krb5_extra="-lkrb5support $rra_krb5_extra"],
116 [AC_CHECK_LIB([pthreads], [pthread_setspecific],
117 [rra_krb5_pthread="-lpthreads"],
118 [AC_CHECK_LIB([pthread], [pthread_setspecific],
119 [rra_krb5_pthread="-lpthread"])])
120 AC_CHECK_LIB([krb5support], [krb5int_setspecific],
121 [rra_krb5_extra="-lkrb5support $rra_krb5_extra $rra_krb5_pthread"],
122 , [$rra_krb5_pthread])])
123 AC_CHECK_LIB([com_err], [error_message],
124 [rra_krb5_extra="-lcom_err $rra_krb5_extra"])
125 AC_CHECK_LIB([ksvc], [krb5_svc_get_msg],
126 [rra_krb5_extra="-lksvc $rra_krb5_extra"])
127 AC_CHECK_LIB([k5crypto], [krb5int_hash_md5],
128 [rra_krb5_extra="-lk5crypto $rra_krb5_extra"])
129 AC_CHECK_LIB([k5profile], [profile_get_values],
130 [rra_krb5_extra="-lk5profile $rra_krb5_extra"])
131 AC_CHECK_LIB([krb5], [krb5_cc_default],
132 [KRB5_LIBS="-lkrb5 $rra_krb5_extra"],
133 [AS_IF([test x"$1" = xtrue],
134 [AC_MSG_ERROR([cannot find usable Kerberos v5 library])])],
136 [-lasn1 -lcom_err -lcrypto $rra_krb5_extra])
137 LIBS="$KRB5_LIBS $LIBS"
138 AC_CHECK_FUNCS([krb5_get_error_message],
139 [AC_CHECK_FUNCS([krb5_free_error_message])],
140 [AC_CHECK_FUNCS([krb5_get_error_string], ,
141 [AC_CHECK_FUNCS([krb5_get_err_txt], ,
142 [AC_CHECK_FUNCS([error_message], ,
143 [AC_CHECK_FUNCS([krb5_svc_get_msg],
144 [AC_CHECK_HEADERS([ibm_svc/krb5_svc.h])],
145 [AC_CHECK_HEADERS([et/com_err.h])])])])])])
146 RRA_LIB_KRB5_RESTORE])
148 dnl Sanity-check the results of krb5-config and be sure we can really link a
149 dnl Kerberos program. If that fails, clear KRB5_CPPFLAGS and KRB5_LIBS so
150 dnl that we know we don't have usable flags and fall back on the manual
152 AC_DEFUN([_RRA_LIB_KRB5_CHECK],
154 AC_CHECK_FUNC([krb5_init_context],
155 [RRA_LIB_KRB5_RESTORE],
156 [RRA_LIB_KRB5_RESTORE
160 _RRA_LIB_KRB5_MANUAL([$1])])])
162 dnl The core of the library checking, shared between RRA_LIB_KRB5 and
163 dnl RRA_LIB_KRB5_OPTIONAL. The single argument, if "true", says to fail if
164 dnl Kerberos could not be found.
165 AC_DEFUN([_RRA_LIB_KRB5_INTERNAL],
166 [AC_REQUIRE([RRA_ENABLE_REDUCED_DEPENDS])
167 AS_IF([test x"$rra_reduced_depends" = xtrue],
169 _RRA_LIB_KRB5_REDUCED([$1])],
170 [AC_ARG_VAR([KRB5_CONFIG], [Path to krb5-config])
171 AS_IF([test x"$rra_krb5_root" != x && test -z "$KRB5_CONFIG"],
172 [AS_IF([test -x "${rra_krb5_root}/bin/krb5-config"],
173 [KRB5_CONFIG="${rra_krb5_root}/bin/krb5-config"])],
174 [AC_PATH_PROG([KRB5_CONFIG], [krb5-config], ,
175 [${PATH}:/usr/kerberos/bin])])
176 AS_IF([test x"$KRB5_CONFIG" != x && test -x "$KRB5_CONFIG"],
177 [AC_CACHE_CHECK([for krb5 support in krb5-config],
178 [rra_cv_lib_krb5_config],
179 [AS_IF(["$KRB5_CONFIG" 2>&1 | grep krb5 >/dev/null 2>&1],
180 [rra_cv_lib_krb5_config=yes],
181 [rra_cv_lib_krb5_config=no])])
182 AS_IF([test x"$rra_cv_lib_krb5_config" = xyes],
183 [KRB5_CPPFLAGS=`"$KRB5_CONFIG" --cflags krb5 2>/dev/null`
184 KRB5_LIBS=`"$KRB5_CONFIG" --libs krb5 2>/dev/null`],
185 [KRB5_CPPFLAGS=`"$KRB5_CONFIG" --cflags 2>/dev/null`
186 KRB5_LIBS=`"$KRB5_CONFIG" --libs 2>/dev/null`])
187 KRB5_CPPFLAGS=`echo "$KRB5_CPPFLAGS" | sed 's%-I/usr/include ?%%'`
188 _RRA_LIB_KRB5_CHECK([$1])
190 AC_CHECK_FUNCS([krb5_get_error_message],
191 [AC_CHECK_FUNCS([krb5_free_error_message])],
192 [AC_CHECK_FUNCS([krb5_get_error_string], ,
193 [AC_CHECK_FUNCS([krb5_get_err_txt], ,
194 [AC_CHECK_FUNCS([krb5_svc_get_msg],
195 [AC_CHECK_HEADERS([ibm_svc/krb5_svc.h])],
196 [AC_CHECK_HEADERS([et/com_err.h])])])])])
197 RRA_LIB_KRB5_RESTORE],
199 _RRA_LIB_KRB5_MANUAL([$1])])])
200 rra_krb5_uses_com_err=false
203 rra_krb5_uses_com_err=true
206 AM_CONDITIONAL([KRB5_USES_COM_ERR], [test x"$rra_krb5_uses_com_err" = xtrue])])
208 dnl The main macro for packages with mandatory Kerberos support.
209 AC_DEFUN([RRA_LIB_KRB5],
213 AC_SUBST([KRB5_CPPFLAGS])
214 AC_SUBST([KRB5_LDFLAGS])
215 AC_SUBST([KRB5_LIBS])
218 [AS_HELP_STRING([--with-krb5=DIR],
219 [Location of Kerberos v5 headers and libraries])],
220 [AS_IF([test x"$withval" != xyes && test x"$withval" != xno],
221 [rra_krb5_root="$withval"])])
222 AC_ARG_WITH([krb5-include],
223 [AS_HELP_STRING([--with-krb5-include=DIR],
224 [Location of Kerberos v5 headers])],
225 [AS_IF([test x"$withval" != xyes && test x"$withval" != xno],
226 [rra_krb5_includedir="$withval"])])
227 AC_ARG_WITH([krb5-lib],
228 [AS_HELP_STRING([--with-krb5-lib=DIR],
229 [Location of Kerberos v5 libraries])],
230 [AS_IF([test x"$withval" != xyes && test x"$withval" != xno],
231 [rra_krb5_libdir="$withval"])])
232 _RRA_LIB_KRB5_INTERNAL([true])])
234 dnl The main macro for packages with optional Kerberos support.
235 AC_DEFUN([RRA_LIB_KRB5_OPTIONAL],
240 AC_SUBST([KRB5_CPPFLAGS])
241 AC_SUBST([KRB5_LDFLAGS])
242 AC_SUBST([KRB5_LIBS])
245 [AS_HELP_STRING([--with-krb5@<:@=DIR@:>@],
246 [Location of Kerberos v5 headers and libraries])],
247 [AS_IF([test x"$withval" = xno],
248 [rra_use_kerberos=false],
249 [AS_IF([test x"$withval" != xyes], [rra_krb5_root="$withval"])
250 rra_use_kerberos=true])])
251 AC_ARG_WITH([krb5-include],
252 [AS_HELP_STRING([--with-krb5-include=DIR],
253 [Location of Kerberos v5 headers])],
254 [AS_IF([test x"$withval" != xyes && test x"$withval" != xno],
255 [rra_krb5_includedir="$withval"])])
256 AC_ARG_WITH([krb5-lib],
257 [AS_HELP_STRING([--with-krb5-lib=DIR],
258 [Location of Kerberos v5 libraries])],
259 [AS_IF([test x"$withval" != xyes && test x"$withval" != xno],
260 [rra_krb5_libdir="$withval"])])
262 AS_IF([test x"$rra_use_kerberos" != xfalse],
263 [AS_IF([test x"$rra_use_kerberos" = xtrue],
264 [_RRA_LIB_KRB5_INTERNAL([true])],
265 [_RRA_LIB_KRB5_INTERNAL([false])])])
266 AS_IF([test x"$KRB5_LIBS" != x],
267 [AC_DEFINE([HAVE_KERBEROS], 1, [Define to enable Kerberos features.])])])
269 dnl Check whether krb5_get_init_creds_opt_free takes one argument or two.
270 dnl Early Heimdal used to take a single argument. Defines
271 dnl HAVE_KRB5_GET_INIT_CREDS_OPT_FREE_2_ARGS if it takes two arguments.
273 dnl Should be called with RRA_LIB_KRB5_SWITCH active.
274 AC_DEFUN([RRA_FUNC_KRB5_GET_INIT_CREDS_OPT_FREE_ARGS],
275 [AC_CACHE_CHECK([if krb5_get_init_creds_opt_free takes two arguments],
276 [rra_cv_func_krb5_get_init_creds_opt_free_args],
277 [AC_TRY_COMPILE([#include <krb5.h>],
278 [krb5_get_init_creds_opt *opts; krb5_context c;
279 krb5_get_init_creds_opt_free(c, opts);],
280 [rra_cv_func_krb5_get_init_creds_opt_free_args=yes],
281 [rra_cv_func_krb5_get_init_creds_opt_free_args=no])])
282 AS_IF([test $rra_cv_func_krb5_get_init_creds_opt_free_args = yes],
283 [AC_DEFINE([HAVE_KRB5_GET_INIT_CREDS_OPT_FREE_2_ARGS], 1,
284 [Define if krb5_get_init_creds_opt_free takes two arguments.])])])