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 elif test "$ac_cv_header_gssapi_gssapi_h"; then
243 AC_EGREP_HEADER(GSS_C_NT_USER_NAME, gssapi/gssapi.h,
244 [AC_DEFINE(HAVE_GSS_C_NT_USER_NAME,,
245 [Define if your GSSAPI implimentation defines GSS_C_NT_USER_NAME])])
250 AC_MSG_CHECKING([GSSAPI])
251 if test "$gssapi" != no; then
252 AC_MSG_RESULT([with implementation ${gss_impl}])
253 AC_CHECK_LIB(resolv,res_search,GSSAPIBASE_LIBS="$GSSAPIBASE_LIBS -lresolv")
254 SASL_MECHS="$SASL_MECHS libgs2.la libgssapiv2.la"
255 SASL_STATIC_OBJS="$SASL_STATIC_OBJS gs2.o gssapi.o"
256 SASL_STATIC_SRCS="$SASL_STATIC_SRCS ../plugins/gs2.c ../plugins/gssapi.c"
258 cmu_save_LIBS="$LIBS"
259 LIBS="$LIBS $GSSAPIBASE_LIBS"
260 AC_CHECK_FUNCS(gsskrb5_register_acceptor_identity)
261 LIBS="$cmu_save_LIBS"
263 AC_MSG_RESULT([disabled])
265 AC_SUBST(GSSAPI_LIBS)
266 AC_SUBST(GSSAPIBASE_LIBS)
270 # SASL_SET_GSSAPI_LIBS
271 # --------------------
272 AC_DEFUN([SASL_SET_GSSAPI_LIBS],
273 [SASL_GSSAPI_LIBS_SET="yes"
279 # What we want to do here is setup LIB_SASL with what one would
280 # generally want to have (e.g. if static is requested, make it that,
281 # otherwise make it dynamic.
283 # We also want to create LIB_DYN_SASL and DYNSASLFLAGS.
285 # Also sets using_static_sasl to "no" "static" or "staticonly"
287 AC_DEFUN([CMU_SASL2],
288 [AC_REQUIRE([SASL_GSSAPI_CHK])
291 [AC_HELP_STRING([--with-sasl=DIR],[Compile with libsasl2 in <DIR>])],
292 with_sasl="$withval",
295 AC_ARG_WITH(staticsasl,
296 [AC_HELP_STRING([--with-staticsasl=DIR],
297 [Compile with staticly linked libsasl2 in <DIR>])],
298 [with_staticsasl="$withval";
299 if test $with_staticsasl != "no"; then
300 using_static_sasl="static"
302 [with_staticsasl="no"; using_static_sasl="no"])
307 cmu_saved_CPPFLAGS=$CPPFLAGS
308 cmu_saved_LDFLAGS=$LDFLAGS
311 if test ${with_staticsasl} != "no"; then
312 if test -d ${with_staticsasl}; then
313 if test -d ${with_staticsasl}/lib64 ; then
314 ac_cv_sasl_where_lib=${with_staticsasl}/lib64
316 ac_cv_sasl_where_lib=${with_staticsasl}/lib
318 ac_cv_sasl_where_lib=${with_staticsasl}/lib
319 ac_cv_sasl_where_inc=${with_staticsasl}/include
321 SASLFLAGS="-I$ac_cv_sasl_where_inc"
322 LIB_SASL="-L$ac_cv_sasl_where_lib"
323 CPPFLAGS="${cmu_saved_CPPFLAGS} -I${ac_cv_sasl_where_inc}"
324 LDFLAGS="${cmu_saved_LDFLAGS} -L${ac_cv_sasl_where_lib}"
326 with_staticsasl="/usr"
329 AC_CHECK_HEADER(sasl/sasl.h,
330 [AC_CHECK_HEADER(sasl/saslutil.h,
331 [for i42 in lib64 lib; do
332 if test -r ${with_staticsasl}/$i42/libsasl2.a; then
334 AC_MSG_CHECKING([for static libsasl])
335 LIB_SASL="$LIB_SASL ${with_staticsasl}/$i42/libsasl2.a"
338 if test ! "$ac_cv_found_sasl" = "yes"; then
339 AC_MSG_CHECKING([for static libsasl])
340 AC_ERROR([Could not find ${with_staticsasl}/lib*/libsasl2.a])
343 AC_MSG_RESULT([found])
345 if test "x$SASL_GSSAPI_LIBS_SET" = "x"; then
346 LIB_SASL="$LIB_SASL $GSSAPIBASE_STATIC_LIBS"
348 SASL_GSSAPI_LIBS_SET=""
349 cmu_saved_LIBS="$GSSAPIBASE_STATIC_LIBS $cmu_saved_LIBS"
353 if test -d ${with_sasl}; then
354 ac_cv_sasl_where_lib=${with_sasl}/lib
355 ac_cv_sasl_where_inc=${with_sasl}/include
357 DYNSASLFLAGS="-I$ac_cv_sasl_where_inc"
358 if test "$ac_cv_sasl_where_lib" != ""; then
359 CMU_ADD_LIBPATH_TO($ac_cv_sasl_where_lib, LIB_DYN_SASL)
361 LIB_DYN_SASL="$LIB_DYN_SASL -lsasl2"
362 CPPFLAGS="${cmu_saved_CPPFLAGS} -I${ac_cv_sasl_where_inc}"
363 LDFLAGS="${cmu_saved_LDFLAGS} -L${ac_cv_sasl_where_lib}"
366 # be sure to check for a SASLv2 specific function
367 AC_CHECK_HEADER(sasl/sasl.h,
368 [AC_CHECK_HEADER(sasl/saslutil.h,
369 [AC_CHECK_LIB(sasl2, prop_get,
370 ac_cv_found_sasl=yes,
371 ac_cv_found_sasl=no)],
372 ac_cv_found_sasl=no)],
375 if test "$ac_cv_found_sasl" = "yes"; then
376 if test "$ac_cv_sasl_where_lib" != ""; then
377 CMU_ADD_LIBPATH_TO($ac_cv_sasl_where_lib, DYNLIB_SASL)
379 DYNLIB_SASL="$DYNLIB_SASL -lsasl2"
380 if test "$using_static_sasl" != "static"; then
381 LIB_SASL=$DYNLIB_SASL
382 SASLFLAGS=$DYNSASLFLAGS
387 using_static_sasl="staticonly"
390 if test "x$SASL_GSSAPI_LIBS_SET" != "x"; then
391 SASL_GSSAPI_LIBS_SET=""
392 cmu_saved_LIBS="$GSSAPIBASE_LIBS $cmu_saved_LIBS"
395 LIBS="$cmu_saved_LIBS"
396 LDFLAGS="$cmu_saved_LDFLAGS"
397 CPPFLAGS="$cmu_saved_CPPFLAGS"
399 AC_SUBST(LIB_DYN_SASL)
400 AC_SUBST(DYNSASLFLAGS)
408 AC_DEFUN([CMU_SASL2_REQUIRED],
409 [AC_REQUIRE([CMU_SASL2])
410 if test "$ac_cv_found_sasl" != "yes"; then
411 AC_ERROR([Cannot continue without libsasl2.
412 Get it from ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/.])
416 # CMU_SASL2_REQUIRE_VER
417 # ---------------------
418 AC_DEFUN([CMU_SASL2_REQUIRE_VER],
419 [AC_REQUIRE([CMU_SASL2_REQUIRED])
421 cmu_saved_CPPFLAGS=$CPPFLAGS
422 CPPFLAGS="$CPPFLAGS $SASLFLAGS"
425 #include <sasl/sasl.h>
427 #ifndef SASL_VERSION_MAJOR
428 #error SASL_VERSION_MAJOR not defined
430 #ifndef SASL_VERSION_MINOR
431 #error SASL_VERSION_MINOR not defined
433 #ifndef SASL_VERSION_STEP
434 #error SASL_VERSION_STEP not defined
437 #if SASL_VERSION_MAJOR < $1 || SASL_VERSION_MINOR < $2 || SASL_VERSION_STEP < $3
438 #error SASL version is less than $1.$2.$3
441 [AC_ERROR([Incorrect SASL headers found. This package requires SASL $1.$2.$3 or newer.])])
443 CPPFLAGS=$cmu_saved_CPPFLAGS
444 ])# CMU_SASL2_REQUIRE_VER
447 # CMU_SASL2_CHECKAPOP_REQUIRED
448 # ----------------------------
449 AC_DEFUN([CMU_SASL2_CHECKAPOP_REQUIRED],
450 [AC_REQUIRE([CMU_SASL2_REQUIRED])
452 cmu_saved_LDFLAGS=$LDFLAGS
454 LDFLAGS="$LDFLAGS $LIB_SASL"
456 AC_CHECK_LIB(sasl2, sasl_checkapop,
457 [AC_DEFINE(HAVE_APOP,[],[Does SASL support APOP?])],
458 [AC_MSG_ERROR([libsasl2 without working sasl_checkapop. Cannot continue.])])
460 LDFLAGS=$cmu_saved_LDFLAGS
461 ])# CMU_SASL2_CHECKAPOP_REQUIRED
466 AC_DEFUN([SASL2_CRYPT_CHK],
467 [AC_CHECK_FUNC(crypt, cmu_have_crypt=yes,
468 [AC_CHECK_LIB(crypt, crypt,
469 LIB_CRYPT="-lcrypt"; cmu_have_crypt=yes,