Fix a bug in Kademlia LAN mode detection which effectively disabled it
[amule.git] / acinclude.m4
blob8fb876609820608e222936f6fc4cc882ea87d239
1 #                                                       -*- Autoconf -*-
2 # This file is part of the aMule Project.
4 # Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org )
6 # Any parts of this program derived from the xMule, lMule or eMule project,
7 # or contributed by third-party developers are copyrighted by their
8 # respective authors.
10 # This program is free software; you can redistribute it and/or modify
11 # it under the terms of the GNU General Public License as published by
12 # the Free Software Foundation; either version 2 of the License, or
13 # (at your option) any later version.
15 # This program is distributed in the hope that it will be useful,
16 # but WITHOUT ANY WARRANTY; without even the implied warranty of
17 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 # GNU General Public License for more details.
20 # You should have received a copy of the GNU General Public License
21 # along with this program; if not, write to the Free Software
22 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA
25 m4_pattern_forbid(MULE_)dnl Check for unexpanded *MULE_* macros
26 m4_pattern_allow(AMULE_)dnl Allow the *AMULE_* names
27 m4_pattern_forbid(__mule_)dnl Check for unexpanded internal macros
30 # -------------------- #
31 # Common useful macros #
32 # -------------------- #
34 dnl MULE_APPEND(VARNAME, VALUE)
35 AC_DEFUN([MULE_APPEND], [$1="$$1 $2"])
37 dnl MULE_PREPEND(VARNAME, VALUE)
38 AC_DEFUN([MULE_PREPEND], [$1="$2 $$1"])
40 dnl MULE_ADDFLAG(FLAGTYPE, VALUE)
41 AC_DEFUN([MULE_ADDFLAG], [MULE_APPEND([MULE[]$1[]FLAGS], [$2])])
43 dnl MULE_ADDCCXXFLAG(VALUE)
44 AC_DEFUN([MULE_ADDCCXXFLAG],
46         MULE_ADDFLAG([C], [$1])
47         MULE_ADDFLAG([CXX], [$1])
50 dnl MULE_BACKUP(VAR)
51 AC_DEFUN([MULE_BACKUP], [mule_backup_$1="$$1"])
53 dnl MULE_RESTORE(VAR)
54 AC_DEFUN([MULE_RESTORE], [$1="$mule_backup_$1"])
57 # ------------------- #
58 # Issuing diagnostics #
59 # ------------------- #
61 # -----------------------------------------------------------------------------
62 # __mule_print_final_warning(section, condition, message)
63 # -----------------------------------------------------------------------------
64 m4_define([__mule_print_final_warning],
65 [m4_divert_push($1)dnl
66 if test [$2]; then
67 cat <<_MULEEOT
69 m4_pushdef([__mule_Prefix1], [* ])dnl
70 m4_pushdef([__mule_Prefix], [  ])dnl
71 m4_foreach([__mule_Line], m4_quote(m4_split([$3], [
72 ])), [m4_text_wrap(m4_defn([__mule_Line]), __mule_Prefix, __mule_Prefix1)
73 m4_define([__mule_Prefix1], __mule_Prefix)dnl
74 ])[]dnl
75 m4_popdef([__mule_Prefix])dnl
76 m4_popdef([__mule_Prefix1])dnl
77 _MULEEOT
79 m4_divert_pop()])
81 dnl ---------------------------------------------------------------------------
82 dnl MULE_WARNING(MESSAGE)
83 dnl
84 dnl Works like AC_MSG_WARN(), but the warning will be reproduced at the end of
85 dnl the configure run. An empty line is prepended at the final output and a
86 dnl newline is appended for free.
87 dnl ---------------------------------------------------------------------------
88 m4_ifndef([_MULE_WARNINGS],[
89 m4_define([_m4_divert(_MULE_WARNINGS)], m4_incr(_m4_divert([BODY])))])
90 m4_define([_MULE_WARNCOUNT], [0])
92 m4_divert_push(_MULE_WARNINGS)dnl
93 if test ${_mule_has_warnings:-no} = yes; then
94 echo ""
95 echo ""
96 echo " *** Warnings during configuration ***"
98 m4_divert_pop()dnl
100 m4_define([MULE_WARNING],
101 [AC_MSG_WARN(
102 m4_pushdef([__mule_Prefix], [        ])dnl
103 m4_foreach([__mule_Line], m4_quote(m4_split([$1], [
104 ])), [
105 m4_text_wrap(m4_defn([__mule_Line]), __mule_Prefix)])[]dnl
106 m4_popdef([__mule_Prefix])dnl
108 _mule_warning_[]_MULE_WARNCOUNT[]=yes
109 _mule_has_warnings=yes
110 __mule_print_final_warning([_MULE_WARNINGS], [${_mule_warning_]_MULE_WARNCOUNT[:-no} = yes], [$1])dnl
111 m4_define([_MULE_WARNCOUNT], incr(_MULE_WARNCOUNT))])
113 dnl ---------------------------------------------------------------------------
114 dnl MULE_DEPRECATED(OLDFLAG [, NEWFLAG])
116 dnl Marks OLDFLAG as deprecated and produces an appropriate warning. If NEWFLAG
117 dnl is specified and is unset the value of OLDFLAG is assigned to NEWFLAG (i.e.
118 dnl if the user specified both OLDFLAG and NEWFLAG, NEWFLAG takes precedence;
119 dnl if only OLDFLAG is specified it will be redirected to NEWFLAG).
121 dnl There should be no AC_ARG_* for the deprecated flag, and if the old flag is
122 dnl deprecated in favour of a new one, MULE_DEPRECATED *MUST* precede the
123 dnl AC_ARG_* definition of the new flag (otherwise redirection may not work).
124 dnl ---------------------------------------------------------------------------
125 m4_define([_MULE_DEPRECATIONWARNINGS], [incr(_MULE_WARNINGS)])
126 m4_define([__mule_display_option_name], [m4_if(m4_substr([$1], 0, 1), [-],, [--])m4_bpatsubst([$1], [_], [-])])
127 m4_define([__mule_ac_option_name], [m4_bpatsubst(m4_bpatsubst(m4_bpatsubst(m4_bpatsubst([$1], [^-+], []), [-], [_]), [^disable], [enable]), [^without], [with])])
129 m4_define([MULE_DEPRECATED],
130 [if test "${__mule_ac_option_name([$1])+set}" = "set"; then
131   _mule_has_warnings=yes
132 m4_ifvaln([$2], [  if test "${__mule_ac_option_name([$2]):-unset}" = "unset"; then
133     __mule_ac_option_name([$2])=$__mule_ac_option_name([$1])
134   fi])fi
135 __mule_print_final_warning([_MULE_DEPRECATIONWARNINGS], ["${]__mule_ac_option_name([$1])[+set}" = set], __mule_display_option_name([$1])[ is now deprecated and ]m4_ifval([$2], [might be removed in the future without further notice. Please use ]__mule_display_option_name([$2])[ instead.], [not supported anymore.]))])
138 # ----------------- #
139 # Argument handling #
140 # ----------------- #
141 m4_define([__mule_arg_default], [__mule_arg_[]m4_translit([$1], [-], [_])[]_default])
142 m4_define([__mule_arg_value], [${enable_[]m4_translit([$1], [-], [_])[]:-[]__mule_arg_default([$1])[]}])
144 dnl ---------------------------------------------------------------------------
145 dnl MULE_ARG_ENABLE(FEATURE, DEFAULT-VALUE, HELP-STRING [, AUTOMAKE-CONDITIONAL])
147 dnl Wrapper around AC_ARG_ENABLE() that supports automatically setting up a
148 dnl conditional variable for automake, remembering default value for
149 dnl conditionals and supplying the help string based on the default value (i.e.
150 dnl it produce "--enable-FEATURE   HELP-STRING" if the default is no, and
151 dnl "--disable-FEATURE    HELP-STRING" if the default is yes. The default value
152 dnl *MUST* be either `yes' or `no'.
153 dnl ---------------------------------------------------------------------------
154 m4_define([MULE_ARG_ENABLE],
155 [m4_if([$2], [yes],, [m4_if([$2], [no],, [m4_fatal([Default value must be either `yes' or `no'!])])])dnl
156 m4_define(__mule_arg_default([$1]), [$2])dnl
157 AC_ARG_ENABLE([$1], [AS_HELP_STRING(m4_if([$2], [yes], [--disable-$1], [--enable-$1]), [$3])])
158 m4_ifvaln([$4], [AM_CONDITIONAL([$4], [test ]__mule_arg_value([$1])[ = yes])])])
160 dnl ---------------------------------------------------------------------------
161 dnl MULE_IS_ENABLED(FEATURE)
163 dnl Used in shell conditionals, tests whether the named feature is enabled or
164 dnl not, considering also the default value. FEATURE *must* have been set up
165 dnl using MULE_ARG_ENABLE().
166 dnl ---------------------------------------------------------------------------
167 m4_define([MULE_IS_ENABLED],
168 [m4_ifdef(__mule_arg_default([$1]), __mule_arg_value([$1])[ = yes], [m4_fatal([Unknown feature `$1'!])])])
170 m4_define([MULE_IS_ENABLED_ANY], [__mule_if_multi([$1], [-o])])
171 m4_define([MULE_IS_ENABLED_ALL], [__mule_if_multi([$1], [-a])])
173 dnl ---------------------------------------------------------------------------
174 dnl MULE_ENABLEVAR(FEATURE)
176 dnl Expands to the name of the shell variable holding the enabled/disabled
177 dnl status of FEATURE. FEATRUE *must* have been set up using MULE_ARG_ENABLE().
178 dnl ---------------------------------------------------------------------------
179 m4_define([MULE_ENABLEVAR],
180 [m4_ifdef(__mule_arg_default([$1]), [enable_[]m4_translit([$1], [-], [_])], [m4_fatal([Unknown feature `$1'!])])])
182 dnl ---------------------------------------------------------------------------
183 dnl MULE_STATUSOF(FEATURE)
185 dnl Expands to the value of the shell variable holding the status of FEATURE,
186 dnl considering default values. FEATURE *must* have been set up using
187 dnl MULE_ARG_ENABLE().
188 dnl ---------------------------------------------------------------------------
189 m4_define([MULE_STATUSOF],
190 [m4_ifdef(__mule_arg_default([$1]), __mule_arg_value([$1]), [m4_fatal([Unknown feature `$1'!])])])
193 # ---------------------- #
194 # Conditional processing #
195 # ---------------------- #
196 m4_define([__mule_if_multi],
197 [m4_define([__mule_if_logic], [])dnl
198 m4_foreach([__mule_condition], [$1], [__mule_if_logic MULE_IS_ENABLED(__mule_condition) ][m4_define([__mule_if_logic], [$2])])dnl
199 m4_undefine([__mule_if_logic])])
201 dnl ---------------------------------------------------------------------------
202 dnl MULE_IF_ENABLED(FEATURE, [ACTION-IF-ENABLED], [ACTION-IF-DISABLED])
204 dnl Basically a wrapper around AS_IF(), the test being if FEATURE is enabled.
205 dnl FEATURE must have been set up by MULE_ARG_ENABLE().
206 dnl ---------------------------------------------------------------------------
207 m4_define([MULE_IF_ENABLED],
208 [AS_IF([test MULE_IS_ENABLED([$1])], [$2], [$3])])
210 m4_define([MULE_IF_ENABLED_ALL],
211 [AS_IF([test]__mule_if_multi([$1], [-a]), [$2], [$3])])
213 m4_define([MULE_IF_ENABLED_ANY],
214 [AS_IF([test]__mule_if_multi([$1], [-o]), [$2], [$3])])
216 dnl ---------------------------------------------------------------------------
217 dnl MULE_IF(CONDITION, [IF-TRUE] [, ELIF-CONDITION, [IF-TRUE]]... [, ELSE-BRANCH])
219 dnl Works like AS_IF(), but allows elif-branches too.
220 dnl ---------------------------------------------------------------------------
221 m4_define([__mule_if_helper],
222 [m4_if( [$#], 0,,
223         [$#], 1, [m4_ifvaln([$1], [m4_n([else])  $1])],
224         [m4_n([elif $1; then])  m4_ifvaln([$2], [$2], :)])dnl
225 m4_if(m4_eval([$# > 2]), 1, [$0(m4_shiftn(2, $@))])])
227 m4_define([MULE_IF],
228 [m4_if( [$#], 0,,
229         [$#], 1,,
230         [m4_n([if $1; then])  m4_ifval([$2],[$2], :)
231 m4_if(m4_eval([$# > 2]), 1, [__mule_if_helper(m4_shiftn(2, $@))])m4_n([fi])])])
234 # ----------------------- #
235 # Other high-level macros #
236 # ----------------------- #
238 dnl ---------------------------------------------------------------------------
239 dnl MULE_CHECK_SYSTEM
241 dnl Checks host system type, and sets system-specific flags accordingly.
242 dnl Sets $SYS to the name of the host os.
243 dnl ---------------------------------------------------------------------------
244 AC_DEFUN([MULE_CHECK_SYSTEM],
245 [AC_REQUIRE([AC_CANONICAL_HOST])dnl
247         case "${host_os}" in
248         darwin*)
249                 SYS=darwin
250                 MULECPPFLAGS="-no-cpp-precomp -D_INTL_REDIRECT_MACROS -DNOPCH";
251                 MULELDFLAGS="-bind_at_load"
252                 touch src/Scanner.cpp
253                 ;;
254         openbsd*) 
255                 SYS=openbsd
256                 LIBS="$LIBS -L/usr/local/lib"
257                 MULECPPFLAGS="-D__OPENBSD__"
258                 ;;
259         *cygwin* | *mingw32*)
260                 SYS=win32
261                 MULECPPFLAGS="-DNOMINMAX"
262                 ;;
263         solaris*)
264                 SYS=solaris
265                 RESOLV_LIB="-lresolv -lnsl"
266                 LIBS="$LIBS -lrt"
267                 ;;
268         *netbsd*)
269                 SYS=netbsd
270                 # Now this is against autoconf recommendation that configure should not modify CPPFLAGS and LDFLAGS
271                 # However, these values in NetBSD are required even to run the tests, and this is the easiest way to do it.
272                 # Still, we prepend them, instead of adding, so the user may override them.
273                 MULE_PREPEND([CPPFLAGS], [-I/usr/pkg/include])
274                 MULE_PREPEND([LDFLAGS], [-R/usr/pkg/lib -L/usr/pkg/lib])
275                 ;;
276         *irix*)
277                 SYS=irix
278                 MULECPPFLAGS="-D__IRIX__"
279                 ;;
280         *)
281                 SYS=unknown
282                 ;;
283         esac
285         # -lpthread is needed by Debian but FreeBSD < 5 doesn't support it
286         AS_IF([test ${SYS:-unknown} != win32],
287         [
288                 AC_MSG_CHECKING([if this is a FreeBSD 4 or earlier system])
289                 AS_IF([test x"`uname -s`" = xFreeBSD && test 0`uname -r | cut -c 1` -lt 5],
290                 [
291                         MULE_ADDFLAG([LD], [-pthread])
292                         AC_MSG_RESULT(yes)
293                 ], [
294                         MULE_ADDFLAG([LD], [-lpthread])
295                         AC_MSG_RESULT(no)
296                 ])
297         ])
299 AC_SUBST([RESOLV_LIB])dnl
300 AC_SUBST([MULECPPFLAGS])dnl
301 AC_SUBST([MULECFLAGS])dnl
302 AC_SUBST([MULECXXFLAGS])dnl
303 AC_SUBST([MULELDFLAGS])dnl
304 AC_SUBST([MULERCFLAGS])dnl
307 dnl ---------------------------------------------------------------------------
308 dnl MULE_COMPILATION_FLAGS
310 dnl Checks type of compilation requested by user, and sets various flags
311 dnl accordingly.
312 dnl ---------------------------------------------------------------------------
313 AC_DEFUN([MULE_COMPILATION_FLAGS],
314 [AC_REQUIRE([MULE_CHECK_GLIBCXX])dnl
316         MULE_ARG_ENABLE([debug],        [yes],  [disable additional debugging output])
317         MULE_ARG_ENABLE([profile],      [no],   [enable code profiling])
318         MULE_ARG_ENABLE([optimize],     [no],   [enable code optimization])
320         MULE_IF_ENABLED([debug],
321         [
322                 MULE_ADDFLAG([CPP], [-D__DEBUG__])
323                 MULE_ADDCCXXFLAG([-g])
324                 AS_IF([test ${GLIBCXX:-no} = yes],      [MULE_ADDFLAG([CPP], [-D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC])])
325                 AS_IF([test ${GCC:-no} = yes],          [MULE_ADDCCXXFLAG([-W -Wall -Wshadow -Wundef -ggdb -fno-inline -fmessage-length=0])])
326                 AS_IF([test ${SYS:-unknown} = win32],   [MULE_ADDFLAG([RC], [-D__DEBUG__])])
327         ], [
328                 AS_IF([test ${GCC:-no} = yes], [MULE_ADDCCXXFLAG([-W -Wall -Wshadow -Wundef])])
329         ])
331         MULE_IF_ENABLED([profile],
332         [
333                 MULE_ADDCCXXFLAG([-pg])
334                 MULE_ADDFLAG([LD], [-pg])
335         ])
337         MULE_IF_ENABLED([optimize],     [MULE_ADDCCXXFLAG([-O2])])
339         MULE_ADDFLAG([CPP], [-DUSE_WX_EXTENSIONS])
342 dnl ---------------------------------------------------------------------------
343 dnl MULE_CHECK_GLIBCXX
345 dnl Checks whether we use the GNU C++ Library.
346 dnl ---------------------------------------------------------------------------
347 AC_DEFUN([MULE_CHECK_GLIBCXX],
348 [dnl
349 AC_REQUIRE([AC_PROG_EGREP])dnl
350 AC_REQUIRE([AC_PROG_CXXCPP])dnl
351 AC_LANG_ASSERT([C++])dnl
353         AC_MSG_CHECKING([if we're using the GNU C++ library])
354         AC_PREPROC_IFELSE([
355                 AC_LANG_SOURCE([[
356                         #include <string>
357                         #ifndef __GLIBCXX__
358                         #error Non-GNU C++ library found.
359                         #endif
360                 ]])
361         ], [GLIBCXX=yes], [GLIBCXX=no])
362         AC_MSG_RESULT([$GLIBCXX])
365 dnl ---------------------------------------------------------------------------
366 dnl MULE_CHECK_WX_SUPPORTS_LARGEFILE
368 dnl Test that wxWidgets is built with support for large-files. If not
369 dnl configure is terminated.
370 dnl ---------------------------------------------------------------------------
371 AC_DEFUN([MULE_CHECK_WX_SUPPORTS_LARGEFILE],
372 [AC_LANG_ASSERT([C++])dnl
374         dnl Backup current flags and setup flags for testing
375         MULE_BACKUP([CPPFLAGS])
376         MULE_APPEND([CPPFLAGS], [$WX_CPPFLAGS])
378         AC_MSG_CHECKING([that wxWidgets has support for large files])
379         AC_PREPROC_IFELSE([
380                 AC_LANG_SOURCE([[
381                         #include <wx/wx.h>
382                         #include <wx/filefn.h>
383                         #ifndef wxHAS_LARGE_FILES
384                                 #error No LargeFile support!
385                         #endif
386                 ]])
387         ], [
388                 AC_MSG_RESULT([yes])
389         ], [
390                 AC_MSG_RESULT([no])
391                 AC_MSG_ERROR([
392         Support for large files in wxWidgets is required by aMule.
393         To continue you must recompile wxWidgets with support for 
394         large files enabled.])
395         ])
397         dnl Restore backup'd flags
398         MULE_RESTORE([CPPFLAGS])
402 dnl --------------------------------------------------------------------------
403 dnl MULE_CHECK_CCACHE
405 dnl Checks if ccache is requested and available, and makes use of it
406 dnl --------------------------------------------------------------------------
407 AC_DEFUN([MULE_CHECK_CCACHE],
409         MULE_ARG_ENABLE([ccache], [no], [enable ccache support for fast recompilation])
411         AC_ARG_WITH([ccache-prefix],
412                 [AS_HELP_STRING([--with-ccache-prefix=PREFIX], [prefix where ccache is installed])])
414         AC_MSG_CHECKING([whether ccache support should be added])
415         AC_MSG_RESULT([MULE_STATUSOF([ccache])])
417         MULE_IF_ENABLED([ccache], [
418                 AC_MSG_CHECKING([for ccache presence])
419                 AS_IF([test -z "$with_ccache_prefix"], [
420                         ccache_full=`which ccache`
421                         with_ccache_prefix=`dirname ${ccache_full}`
422                 ])
423                 AS_IF([$with_ccache_prefix/ccache -V >/dev/null 2>&1], [
424                         CC="$with_ccache_prefix/ccache $CC"
425                         CXX="$with_ccache_prefix/ccache $CXX"
426                         BUILD_CC="$with_ccache_prefix/ccache $BUILD_CC"
427                 ], [MULE_ENABLEVAR([ccache])=no])
428                 AC_MSG_RESULT([MULE_STATUSOF([ccache])])
429         ])
433 dnl ----------------------------------------------------
434 dnl MULE_CHECK_BFD
435 dnl check if bfd.h is on the system and usable
436 dnl ----------------------------------------------------
437 AC_DEFUN([MULE_CHECK_BFD],
438 [AC_REQUIRE([MULE_CHECK_NLS])dnl
440         AC_MSG_CHECKING([for bfd])
441         result=no
442         for bfd_ldadd in "" "${LIBINTL}"; do
443                 MULE_BACKUP([LIBS])
444                 MULE_BACKUP([LDFLAGS])
445                 MULE_PREPEND([LIBS], [-lbfd -liberty ${bfd_ldadd} ${ZLIB_LIBS}])
446                 MULE_APPEND([LDFLAGS], [${ZLIB_LDFLAGS}])
447                 AC_LINK_IFELSE([
448                         AC_LANG_PROGRAM([[
449                                 #include <ansidecl.h>
450                                 #include <bfd.h>
451                         ]], [[
452                                 char *dummy = bfd_errmsg(bfd_get_error());
453                         ]])
454                 ], [
455                         result=yes
456                         BFD_CPPFLAGS="-DHAVE_BFD"
457                         BFD_LIBS="-lbfd -liberty ${bfd_ldadd}"
458                         MULE_RESTORE([LIBS])
459                         MULE_RESTORE([LDFLAGS])
460                         break
461                 ])
462                 MULE_RESTORE([LIBS])
463                 MULE_RESTORE([LDFLAGS])
464         done
466         AC_MSG_RESULT([$result])
468         AS_IF([test $result = no],
469                 [MULE_WARNING([bfd.h not found or unusable, please install binutils development package if you are a developer or want to help testing aMule])])
471 AC_SUBST([BFD_CPPFLAGS])dnl
472 AC_SUBST([BFD_LIBS])dnl
476 dnl ----------------------------------------------------
477 dnl MULE_CHECK_FLEX_EXTENDED
478 dnl check if flex can produce header files
479 dnl ----------------------------------------------------
480 AC_DEFUN([MULE_CHECK_FLEX_EXTENDED],
482         AC_MSG_CHECKING([for extended flex capabilities])
484         extended_flex=`flex --help | grep header-file`
485         AS_IF([test -n "$extended_flex"], [HAVE_FLEX_EXTENDED=yes], [HAVE_FLEX_EXTENDED=no])
486         AC_MSG_RESULT($HAVE_FLEX_EXTENDED)
488         AS_IF([test $HAVE_FLEX_EXTENDED = no], [AC_MSG_NOTICE([Your flex version doesn't support --header-file flag. This is not critical, but an upgrade is recommended])])
492 dnl ----------------------------------------------------
493 dnl MULE_CHECK_EXCEPTIONS
494 dnl Checks for broken exception-handling. This is needed
495 dnl because exception handling is broken for some archs/
496 dnl compilers.
497 dnl ----------------------------------------------------
498 AC_DEFUN([MULE_CHECK_EXCEPTIONS],
499 [AC_LANG_ASSERT([C++])dnl
501         AC_MSG_CHECKING([for exception-handling])
502         AC_RUN_IFELSE([
503                 AC_LANG_PROGRAM(, [[
504                         try {
505                                 throw 1;
506                         } catch (int) {
507                                 return 0;
508                         }
509                         return 1;
510                 ]])
511         ], [
512                 AC_MSG_RESULT([yes])
513         ], [
514                 AC_MSG_RESULT([no])
515                 AC_MSG_ERROR([Exception handling does not work. Broken compiler?])
516         ], [
517                 AC_MSG_RESULT([undeterminable])
518                 MULE_WARNING(
519                         [Cross-compilation detected, so exception handling cannot be tested.
520                         Note that broken exception handling in your compiler may lead to unexpected crashes.])
521         ])
525 dnl ---------------------------------------------------------------------------
526 dnl MULE_CHECK_CXXABI
528 dnl This function will test the header <cxxabi.h> and abi::__cxa_demangle()
529 dnl ---------------------------------------------------------------------------
530 AC_DEFUN([MULE_CHECK_CXXABI],
531 [AC_LANG_ASSERT([C++])dnl
533         AC_MSG_CHECKING([for <cxxabi.h> and __cxa_demangle()])
534         AC_LINK_IFELSE([
535                 AC_LANG_PROGRAM([[
536                         #include <cxxabi.h>
537                 ]], [[
538                         int status;
539                         char * demangled = abi::__cxa_demangle("", 0, 0, &status);
540                         std::type_info *ti = abi::__cxa_current_exception_type();
541                 ]])
542         ], [
543                 AH_TEMPLATE([HAVE_CXXABI], [Define to 1 if you have the <cxxabi.h> header which declares abi::__cxa_demangle()])
544                 AC_DEFINE([HAVE_CXXABI])
545                 AC_MSG_RESULT([yes])
546         ], [
547                 AC_MSG_RESULT([no])
548         ])
552 dnl ---------------------------------------------------------------------------
553 dnl MULE_CHECK_EXECINFO
555 dnl This function will test the header <execinfo.h> and backtrace()
556 dnl ---------------------------------------------------------------------------
557 AC_DEFUN([MULE_CHECK_EXECINFO],
559         AC_MSG_CHECKING([for <execinfo.h> and backtrace()])
560         AC_LINK_IFELSE([
561                 AC_LANG_PROGRAM([[
562                         #include <execinfo.h>
563                 ]], [[
564                         void *bt[1];
565                         int n = backtrace(&bt, 1);
566                         const char **bt_syms = backtrace_symbols(bt, n);
567                 ]])
568         ], [
569                 AH_TEMPLATE([HAVE_EXECINFO], [Define to 1 if you have the <execinfo.h> header which declares backtrace()])
570                 AC_DEFINE([HAVE_EXECINFO])
571                 AC_MSG_RESULT([yes])
572         ], [
573                 AC_MSG_RESULT([no])
574         ])
577 dnl ---------------------------------------------------------------------------
578 dnl MULE_CHECK_MMAP
580 dnl Checks for mmap() and makes use of it when found.
581 dnl ---------------------------------------------------------------------------
582 AC_DEFUN([MULE_CHECK_MMAP],
584         MULE_ARG_ENABLE([mmap], [no], [enable using mapped memory if supported])
586         MULE_IF_ENABLED([mmap], [
587                 AC_CHECK_HEADERS([sys/mman.h])
588                 AC_FUNC_MMAP
589                 AC_CHECK_FUNCS([munmap sysconf])
590                 AS_IF([test $ac_cv_func_sysconf = yes], [
591                         AC_MSG_CHECKING([for pagesize constant for sysconf])
592                         AC_LINK_IFELSE([
593                                 AC_LANG_PROGRAM([[
594                                         #include <unistd.h>
595                                 ]], [[
596                                         return sysconf(_SC_PAGESIZE);
597                                 ]])
598                         ], [
599                                 AC_MSG_RESULT([_SC_PAGESIZE])
600                                 AC_DEFINE([HAVE__SC_PAGESIZE], [1], [Define to 1 if you have the _SC_PAGESIZE constant in <unistd.h>])
601                         ], [
602                                 AC_LINK_IFELSE([
603                                         AC_LANG_PROGRAM([[
604                                                 #include <unistd.h>
605                                         ]], [[
606                                                 return sysconf(_SC_PAGE_SIZE);
607                                         ]])
608                                 ], [
609                                         AC_MSG_RESULT([_SC_PAGE_SIZE])
610                                         AC_DEFINE([HAVE__SC_PAGE_SIZE], [1], [Define to 1 if you have the _SC_PAGE_SIZE constant in <unistd.h>, but not _SC_PAGESIZE])
611                                 ], [
612                                         AC_MSG_RESULT([none])
613                                 ])
614                         ])
615                 ])
616         ], [
617                 # fake the result of the test for munmap() for the gettext macros
618                 ac_cv_func_munmap=no
619         ])
623 dnl ---------------------------------------------------------------------------
624 dnl MULE_DENOISER
626 dnl Test for denoising level and add denoiser commands to config.status
627 dnl ---------------------------------------------------------------------------
628 AC_DEFUN([MULE_DENOISER],
630         AC_ARG_WITH([denoise-level],
631                 [AS_HELP_STRING([--with-denoise-level=<level>], [Specifies denoising level (0-4):])
632                 AS_HELP_STRING([], [0 - Do nothing])
633                 AS_HELP_STRING([], [4 - Suppress all normal output])
634                 AS_HELP_STRING([], [(for more information see src/utils/scripts/denoiser.rules)])
635         ])
637         AC_MSG_CHECKING([denoising level])
638         AS_IF([test ${with_denoise_level:-5} = yes], [with_denoise_level=5])
639         AS_IF([test ${with_denoise_level:-5} = no], [with_denoise_level=0])
640         AS_IF([test ${with_denoise_level:-5} -gt 4],
641                 [AS_IF([test "${svndate:+set}" = "set"], [with_denoise_level=0], [with_denoise_level=4])])
642         AC_MSG_RESULT([$with_denoise_level])
644         AC_CONFIG_COMMANDS([denoiser], [[if test $denoiserlevel -gt 0; then
645                 if test ! -d src/utils/scripts; then mkdir -p src/utils/scripts; fi
646                 sed -e "1{x;s/.*/1/;x;};/^[     ]*\$/d;/^#if /{/level.*$denoiserlevel/{x;s/^/1/;x;b0;};x;s/^/0/;x;:0;d;};/^#else/{x;/^1/{s/1/0/;b1;};s/0/1/;:1;x;d;};/^#endif/{x;s/.//;x;d;};/^[        ]*#/d;x;/^1/{x;b;};x;d" \
647                         $srcdir/src/utils/scripts/denoiser.rules > src/utils/scripts/denoiser.sed
648                 for i in `find . -name 'Makefile' -print`; do
649                         if test -n "`head -n 1 $i | grep '^#'`"; then
650                                 sed -f src/utils/scripts/denoiser.sed $i > $i.tmp && mv $i.tmp $i
651                         fi
652                 done
653         fi]], [denoiserlevel=$with_denoise_level])