1 # sasl2.m4--sasl2 libraries and includes
3 # $Id: sasl2.m4,v 1.52 2006/05/18 19:25:00 murch Exp $
7 AC_DEFUN([SASL_GSSAPI_CHK],
8 [AC_REQUIRE([SASL2_CRYPT_CHK])
9 AC_REQUIRE([CMU_SOCKETS])
10 AC_ARG_ENABLE([gssapi],
11 [AC_HELP_STRING([--enable-gssapi=<DIR>],
12 [enable GSSAPI authentication [yes]])],
15 AC_ARG_WITH([gss_impl],
16 [AC_HELP_STRING([--with-gss_impl={heimdal|mit|cybersafe|seam|auto}],
17 [choose specific GSSAPI implementation [[auto]]])],
21 if test "$gssapi" != no; then
34 # When should we use __sunos?
42 AC_WARN([The system type is not recognized. If you believe that CyberSafe GSSAPI works on this platform, please update the configure script])
43 if test "$gss_impl" = "cybersafe"; then
44 AC_ERROR([CyberSafe was forced, cannot continue as platform is not supported])
49 cmu_saved_CPPFLAGS=$CPPFLAGS
51 if test -d ${gssapi}; then
52 CPPFLAGS="$CPPFLAGS -I$gssapi/include"
53 # We want to keep -I in our CPPFLAGS, but only if we succeed
54 cmu_saved_CPPFLAGS=$CPPFLAGS
55 ### I am not sure how useful is this (and whether this is required at all
56 ### especially when we have to provide two -L flags for new CyberSafe
57 LDFLAGS="$LDFLAGS -L$gssapi/lib"
59 if test -n "$platform"; then
60 if test "$gss_impl" = "auto" -o "$gss_impl" = "cybersafe"; then
61 CPPFLAGS="$CPPFLAGS -D$platform"
62 if test -d "${gssapi}/appsec-sdk/include"; then
63 CPPFLAGS="$CPPFLAGS -I${gssapi}/appsec-sdk/include"
68 AC_CHECK_HEADER([gssapi.h],
69 [AC_DEFINE(HAVE_GSSAPI_H,,
70 [Define if you have the gssapi.h header file])],
71 [AC_CHECK_HEADER([gssapi/gssapi.h],,
72 [AC_WARN([Disabling GSSAPI - no include files found]); gssapi=no])])
74 CPPFLAGS=$cmu_saved_CPPFLAGS
78 if test "$gssapi" != no; then
79 # We need to find out which gssapi implementation we are
80 # using. Supported alternatives are: MIT Kerberos 5,
81 # Heimdal Kerberos 5 (http://www.pdc.kth.se/heimdal),
82 # CyberSafe Kerberos 5 (http://www.cybersafe.com/)
83 # and Sun SEAM (http://wwws.sun.com/software/security/kerberos/)
85 # The choice is reflected in GSSAPIBASE_LIBS
87 AC_CHECK_LIB(resolv,res_search)
88 if test -d ${gssapi}; then
89 gssapi_dir="${gssapi}/lib"
90 GSSAPIBASE_LIBS="-L$gssapi_dir"
91 GSSAPIBASE_STATIC_LIBS="-L$gssapi_dir"
93 # FIXME: This is only used for building cyrus, and then only as
94 # a real hack. it needs to be fixed.
95 gssapi_dir="/usr/local/lib"
98 # Check a full link against the Heimdal libraries.
99 # If this fails, check a full link against the MIT libraries.
100 # If this fails, check a full link against the CyberSafe libraries.
101 # If this fails, check a full link against the Solaris 8 and up libgss.
103 if test "$gss_impl" = "auto" -o "$gss_impl" = "heimdal"; then
105 AC_CHECK_LIB(gssapi,gss_unwrap,gss_impl="heimdal",gss_failed=1,
106 ${GSSAPIBASE_LIBS} -lgssapi -lkrb5 -lasn1 -lroken ${LIB_CRYPT} ${LIB_DES} -lcom_err ${LIB_SOCKET})
107 if test "$gss_impl" != "auto" -a "$gss_failed" = "1"; then
112 if test "$gss_impl" = "auto" -o "$gss_impl" = "mit"; then
113 # check for libkrb5support first
114 AC_CHECK_LIB(krb5support,krb5int_getspecific,K5SUP=-lkrb5support K5SUPSTATIC=$gssapi_dir/libkrb5support.a,,${LIB_SOCKET})
117 AC_CHECK_LIB(gssapi_krb5,gss_unwrap,gss_impl="mit",gss_failed=1,
118 ${GSSAPIBASE_LIBS} -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err ${K5SUP} ${LIB_SOCKET})
119 if test "$gss_impl" != "auto" -a "$gss_failed" = "1"; then
124 # For Cybersafe one has to set a platform define in order to make compilation work
125 if test "$gss_impl" = "auto" -o "$gss_impl" = "cybersafe"; then
127 cmu_saved_CPPFLAGS=$CPPFLAGS
128 cmu_saved_GSSAPIBASE_LIBS=$GSSAPIBASE_LIBS
129 # FIXME - Note that the libraries are in .../lib64 for 64bit kernels
130 if test -d "${gssapi}/appsec-rt/lib"; then
131 GSSAPIBASE_LIBS="$GSSAPIBASE_LIBS -L${gssapi}/appsec-rt/lib"
133 CPPFLAGS="$CPPFLAGS -D$platform"
134 if test -d "${gssapi}/appsec-sdk/include"; then
135 CPPFLAGS="$CPPFLAGS -I${gssapi}/appsec-sdk/include"
140 # Check for CyberSafe with two libraries first, than fall back to a single
141 # library (older CyberSafe)
143 unset ac_cv_lib_gss_csf_gss_acq_user
144 AC_CHECK_LIB(gss,csf_gss_acq_user,gss_impl="cybersafe03",
145 [unset ac_cv_lib_gss_csf_gss_acq_user;
146 AC_CHECK_LIB(gss,csf_gss_acq_user,gss_impl="cybersafe",
147 gss_failed=1,$GSSAPIBASE_LIBS -lgss)],
148 [${GSSAPIBASE_LIBS} -lgss -lcstbk5])
150 if test "$gss_failed" = "1"; then
152 GSSAPIBASE_LIBS=$cmu_saved_GSSAPIBASE_LIBS
153 CPPFLAGS=$cmu_saved_CPPFLAGS
155 if test "$gss_impl" != "auto"; then
161 if test "$gss_impl" = "auto" -o "$gss_impl" = "seam"; then
163 AC_CHECK_LIB(gss,gss_unwrap,gss_impl="seam",gss_failed=1,-lgss)
164 if test "$gss_impl" != "auto" -a "$gss_failed" = "1"; then
169 if test "$gss_impl" = "mit"; then
170 GSSAPIBASE_LIBS="$GSSAPIBASE_LIBS -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err ${K5SUP}"
171 GSSAPIBASE_STATIC_LIBS="$GSSAPIBASE_LIBS $gssapi_dir/libgssapi_krb5.a $gssapi_dir/libkrb5.a $gssapi_dir/libk5crypto.a $gssapi_dir/libcom_err.a ${K5SUPSTATIC}"
172 elif test "$gss_impl" = "heimdal"; then
173 CPPFLAGS="$CPPFLAGS -DKRB5_HEIMDAL"
174 GSSAPIBASE_LIBS="$GSSAPIBASE_LIBS -lgssapi -lkrb5 -lasn1 -lroken ${LIB_CRYPT} ${LIB_DES} -lcom_err"
175 GSSAPIBASE_STATIC_LIBS="$GSSAPIBASE_STATIC_LIBS $gssapi_dir/libgssapi.a $gssapi_dir/libkrb5.a $gssapi_dir/libasn1.a $gssapi_dir/libroken.a $gssapi_dir/libcom_err.a ${LIB_CRYPT}"
176 elif test "$gss_impl" = "cybersafe03"; then
177 # Version of CyberSafe with two libraries
178 CPPFLAGS="$CPPFLAGS -D$platform -I${gssapi}/appsec-sdk/include"
179 GSSAPIBASE_LIBS="$GSSAPIBASE_LIBS -lgss -lcstbk5"
180 # there is no static libgss for CyberSafe
181 GSSAPIBASE_STATIC_LIBS=none
182 elif test "$gss_impl" = "cybersafe"; then
183 CPPFLAGS="$CPPFLAGS -D$platform -I${gssapi}/appsec-sdk/include"
184 GSSAPIBASE_LIBS="$GSSAPIBASE_LIBS -lgss"
185 # there is no static libgss for CyberSafe
186 GSSAPIBASE_STATIC_LIBS=none
187 elif test "$gss_impl" = "seam"; then
188 GSSAPIBASE_LIBS=-lgss
189 # there is no static libgss on Solaris 8 and up
190 GSSAPIBASE_STATIC_LIBS=none
191 elif test "$gss_impl" = "failed"; then
194 GSSAPIBASE_STATIC_LIBS=
195 AC_WARN([Disabling GSSAPI - specified library not found])
199 GSSAPIBASE_STATIC_LIBS=
200 AC_WARN([Disabling GSSAPI - no library])
205 # Cybersafe defines both GSS_C_NT_HOSTBASED_SERVICE and GSS_C_NT_USER_NAME
206 # in gssapi\rfckrb5.h
208 if test "$gssapi" != "no"; then
209 if test "$gss_impl" = "cybersafe" -o "$gss_impl" = "cybersafe03"; then
210 AC_EGREP_CPP(hostbased_service_gss_nt_yes,
211 [#include <gssapi/gssapi.h>
212 #ifdef GSS_C_NT_HOSTBASED_SERVICE
213 hostbased_service_gss_nt_yes
215 [AC_DEFINE(HAVE_GSS_C_NT_HOSTBASED_SERVICE,,
216 [Define if your GSSAPI implimentation defines GSS_C_NT_HOSTBASED_SERVICE])],
217 [AC_WARN([Cybersafe define not found])])
219 elif test "$ac_cv_header_gssapi_h" = "yes"; then
220 AC_EGREP_HEADER(GSS_C_NT_HOSTBASED_SERVICE, gssapi.h,
221 [AC_DEFINE(HAVE_GSS_C_NT_HOSTBASED_SERVICE,,
222 [Define if your GSSAPI implimentation defines GSS_C_NT_HOSTBASED_SERVICE])])
223 elif test "$ac_cv_header_gssapi_gssapi_h"; then
224 AC_EGREP_HEADER(GSS_C_NT_HOSTBASED_SERVICE, gssapi/gssapi.h,
225 [AC_DEFINE(HAVE_GSS_C_NT_HOSTBASED_SERVICE,,
226 [Define if your GSSAPI implimentation defines GSS_C_NT_HOSTBASED_SERVICE])])
229 if test "$gss_impl" = "cybersafe" -o "$gss_impl" = "cybersafe03"; then
230 AC_EGREP_CPP(user_name_yes_gss_nt,
231 [#include <gssapi/gssapi.h>
232 #ifdef GSS_C_NT_USER_NAME
235 [AC_DEFINE(HAVE_GSS_C_NT_USER_NAME,,
236 [Define if your GSSAPI implimentation defines GSS_C_NT_USER_NAME])],
237 [AC_WARN([Cybersafe define not found])])
238 elif test "$ac_cv_header_gssapi_h" = "yes"; then
239 AC_EGREP_HEADER(GSS_C_NT_USER_NAME, gssapi.h,
240 [AC_DEFINE(HAVE_GSS_C_NT_USER_NAME,,
241 [Define if your GSSAPI implimentation defines GSS_C_NT_USER_NAME])])
242 AC_EGREP_HEADER(gss_inquire_attrs_for_mech, gssapi.h, rfc5587=yes)
243 elif test "$ac_cv_header_gssapi_gssapi_h"; then
244 AC_EGREP_HEADER(GSS_C_NT_USER_NAME, gssapi/gssapi.h,
245 [AC_DEFINE(HAVE_GSS_C_NT_USER_NAME,,
246 [Define if your GSSAPI implimentation defines GSS_C_NT_USER_NAME])])
247 AC_EGREP_HEADER(gss_inquire_attrs_for_mech, gssapi/gssapi.h, rfc5587=yes)
252 AC_MSG_CHECKING([GSSAPI])
253 if test "$gssapi" != no; then
254 AC_MSG_RESULT([with implementation ${gss_impl}])
255 AC_CHECK_LIB(resolv,res_search,GSSAPIBASE_LIBS="$GSSAPIBASE_LIBS -lresolv")
256 SASL_MECHS="$SASL_MECHS libgssapiv2.la"
257 SASL_STATIC_OBJS="$SASL_STATIC_OBJS gssapi.o"
258 SASL_STATIC_SRCS="$SASL_STATIC_SRCS ../plugins/gssapi.c"
259 if test "$rfc5587" = "yes"; then
260 SASL_MECHS="$SASL_MECHS libgs2.la"
261 SASL_STATIC_OBJS="$SASL_STATIC_OBJS gs2.o"
262 SASL_STATIC_SRCS="$SASL_STATIC_SRCS ../plugins/gs2.c"
264 cmu_save_LIBS="$LIBS"
265 LIBS="$LIBS $GSSAPIBASE_LIBS"
266 AC_CHECK_FUNCS(gsskrb5_register_acceptor_identity)
267 LIBS="$cmu_save_LIBS"
269 AC_MSG_RESULT([disabled])
271 AC_SUBST(GSSAPI_LIBS)
272 AC_SUBST(GSSAPIBASE_LIBS)
276 # SASL_SET_GSSAPI_LIBS
277 # --------------------
278 AC_DEFUN([SASL_SET_GSSAPI_LIBS],
279 [SASL_GSSAPI_LIBS_SET="yes"
285 # What we want to do here is setup LIB_SASL with what one would
286 # generally want to have (e.g. if static is requested, make it that,
287 # otherwise make it dynamic.
289 # We also want to create LIB_DYN_SASL and DYNSASLFLAGS.
291 # Also sets using_static_sasl to "no" "static" or "staticonly"
293 AC_DEFUN([CMU_SASL2],
294 [AC_REQUIRE([SASL_GSSAPI_CHK])
297 [AC_HELP_STRING([--with-sasl=DIR],[Compile with libsasl2 in <DIR>])],
298 with_sasl="$withval",
301 AC_ARG_WITH(staticsasl,
302 [AC_HELP_STRING([--with-staticsasl=DIR],
303 [Compile with staticly linked libsasl2 in <DIR>])],
304 [with_staticsasl="$withval";
305 if test $with_staticsasl != "no"; then
306 using_static_sasl="static"
308 [with_staticsasl="no"; using_static_sasl="no"])
313 cmu_saved_CPPFLAGS=$CPPFLAGS
314 cmu_saved_LDFLAGS=$LDFLAGS
317 if test ${with_staticsasl} != "no"; then
318 if test -d ${with_staticsasl}; then
319 if test -d ${with_staticsasl}/lib64 ; then
320 ac_cv_sasl_where_lib=${with_staticsasl}/lib64
322 ac_cv_sasl_where_lib=${with_staticsasl}/lib
324 ac_cv_sasl_where_lib=${with_staticsasl}/lib
325 ac_cv_sasl_where_inc=${with_staticsasl}/include
327 SASLFLAGS="-I$ac_cv_sasl_where_inc"
328 LIB_SASL="-L$ac_cv_sasl_where_lib"
329 CPPFLAGS="${cmu_saved_CPPFLAGS} -I${ac_cv_sasl_where_inc}"
330 LDFLAGS="${cmu_saved_LDFLAGS} -L${ac_cv_sasl_where_lib}"
332 with_staticsasl="/usr"
335 AC_CHECK_HEADER(sasl/sasl.h,
336 [AC_CHECK_HEADER(sasl/saslutil.h,
337 [for i42 in lib64 lib; do
338 if test -r ${with_staticsasl}/$i42/libsasl2.a; then
340 AC_MSG_CHECKING([for static libsasl])
341 LIB_SASL="$LIB_SASL ${with_staticsasl}/$i42/libsasl2.a"
344 if test ! "$ac_cv_found_sasl" = "yes"; then
345 AC_MSG_CHECKING([for static libsasl])
346 AC_ERROR([Could not find ${with_staticsasl}/lib*/libsasl2.a])
349 AC_MSG_RESULT([found])
351 if test "x$SASL_GSSAPI_LIBS_SET" = "x"; then
352 LIB_SASL="$LIB_SASL $GSSAPIBASE_STATIC_LIBS"
354 SASL_GSSAPI_LIBS_SET=""
355 cmu_saved_LIBS="$GSSAPIBASE_STATIC_LIBS $cmu_saved_LIBS"
359 if test -d ${with_sasl}; then
360 ac_cv_sasl_where_lib=${with_sasl}/lib
361 ac_cv_sasl_where_inc=${with_sasl}/include
363 DYNSASLFLAGS="-I$ac_cv_sasl_where_inc"
364 if test "$ac_cv_sasl_where_lib" != ""; then
365 CMU_ADD_LIBPATH_TO($ac_cv_sasl_where_lib, LIB_DYN_SASL)
367 LIB_DYN_SASL="$LIB_DYN_SASL -lsasl2"
368 CPPFLAGS="${cmu_saved_CPPFLAGS} -I${ac_cv_sasl_where_inc}"
369 LDFLAGS="${cmu_saved_LDFLAGS} -L${ac_cv_sasl_where_lib}"
372 # be sure to check for a SASLv2 specific function
373 AC_CHECK_HEADER(sasl/sasl.h,
374 [AC_CHECK_HEADER(sasl/saslutil.h,
375 [AC_CHECK_LIB(sasl2, prop_get,
376 ac_cv_found_sasl=yes,
377 ac_cv_found_sasl=no)],
378 ac_cv_found_sasl=no)],
381 if test "$ac_cv_found_sasl" = "yes"; then
382 if test "$ac_cv_sasl_where_lib" != ""; then
383 CMU_ADD_LIBPATH_TO($ac_cv_sasl_where_lib, DYNLIB_SASL)
385 DYNLIB_SASL="$DYNLIB_SASL -lsasl2"
386 if test "$using_static_sasl" != "static"; then
387 LIB_SASL=$DYNLIB_SASL
388 SASLFLAGS=$DYNSASLFLAGS
393 using_static_sasl="staticonly"
396 if test "x$SASL_GSSAPI_LIBS_SET" != "x"; then
397 SASL_GSSAPI_LIBS_SET=""
398 cmu_saved_LIBS="$GSSAPIBASE_LIBS $cmu_saved_LIBS"
401 LIBS="$cmu_saved_LIBS"
402 LDFLAGS="$cmu_saved_LDFLAGS"
403 CPPFLAGS="$cmu_saved_CPPFLAGS"
405 AC_SUBST(LIB_DYN_SASL)
406 AC_SUBST(DYNSASLFLAGS)
414 AC_DEFUN([CMU_SASL2_REQUIRED],
415 [AC_REQUIRE([CMU_SASL2])
416 if test "$ac_cv_found_sasl" != "yes"; then
417 AC_ERROR([Cannot continue without libsasl2.
418 Get it from ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/.])
422 # CMU_SASL2_REQUIRE_VER
423 # ---------------------
424 AC_DEFUN([CMU_SASL2_REQUIRE_VER],
425 [AC_REQUIRE([CMU_SASL2_REQUIRED])
427 cmu_saved_CPPFLAGS=$CPPFLAGS
428 CPPFLAGS="$CPPFLAGS $SASLFLAGS"
431 #include <sasl/sasl.h>
433 #ifndef SASL_VERSION_MAJOR
434 #error SASL_VERSION_MAJOR not defined
436 #ifndef SASL_VERSION_MINOR
437 #error SASL_VERSION_MINOR not defined
439 #ifndef SASL_VERSION_STEP
440 #error SASL_VERSION_STEP not defined
443 #if SASL_VERSION_MAJOR < $1 || SASL_VERSION_MINOR < $2 || SASL_VERSION_STEP < $3
444 #error SASL version is less than $1.$2.$3
447 [AC_ERROR([Incorrect SASL headers found. This package requires SASL $1.$2.$3 or newer.])])
449 CPPFLAGS=$cmu_saved_CPPFLAGS
450 ])# CMU_SASL2_REQUIRE_VER
453 # CMU_SASL2_CHECKAPOP_REQUIRED
454 # ----------------------------
455 AC_DEFUN([CMU_SASL2_CHECKAPOP_REQUIRED],
456 [AC_REQUIRE([CMU_SASL2_REQUIRED])
458 cmu_saved_LDFLAGS=$LDFLAGS
460 LDFLAGS="$LDFLAGS $LIB_SASL"
462 AC_CHECK_LIB(sasl2, sasl_checkapop,
463 [AC_DEFINE(HAVE_APOP,[],[Does SASL support APOP?])],
464 [AC_MSG_ERROR([libsasl2 without working sasl_checkapop. Cannot continue.])])
466 LDFLAGS=$cmu_saved_LDFLAGS
467 ])# CMU_SASL2_CHECKAPOP_REQUIRED
472 AC_DEFUN([SASL2_CRYPT_CHK],
473 [AC_CHECK_FUNC(crypt, cmu_have_crypt=yes,
474 [AC_CHECK_LIB(crypt, crypt,
475 LIB_CRYPT="-lcrypt"; cmu_have_crypt=yes,