[interp] Remove exception checking from pinvoke code
[mono-project.git] / configure.ac
blob54466c983b234fd6a6fad92eb662e541c8185316
1 # Process this file with autoconf to produce a configure script.
2 #AC_PREREQ([2.62])
4 AC_INIT(mono, [5.17.0],
5         [https://github.com/mono/mono/issues/new])
7 AC_CONFIG_SRCDIR([README.md])
8 AC_CONFIG_MACRO_DIR([m4])
9 AC_CANONICAL_SYSTEM
10 AC_CANONICAL_HOST
12 # Gross hack to enable 'make dist' on automake 1.9+tar 1.14.
13 # The extra brackets are to foil regex-based scans.
14 m4_ifdef([_A][M_PROG_TAR],[_A][M_SET_OPTION([tar-ustar])])
16 AM_INIT_AUTOMAKE([1.9 dist-bzip2 tar-ustar no-dist-gzip foreign subdir-objects]
17                  m4_esyscmd([case `automake --version | head -n 1` in    # parallel-tests is default in automake 1.13+, we need to explicitly enable it
18                              *1.11*|*1.12*) echo parallel-tests;;        # for 1.11 and 1.12 but not below as those versions don't recognize the flag
19                              esac]))                                     # TODO: remove this hack once we require automake 1.11+
21 AC_CONFIG_HEADERS([config.h])
22 AM_MAINTAINER_MODE
24 API_VER=2.0
25 AC_SUBST(API_VER)
27 AC_PROG_LN_S
29 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
31 MONO_VERSION_MAJOR=`echo $VERSION | cut -d . -f 1`
32 MONO_VERSION_MINOR=`echo $VERSION | cut -d . -f 2`
33 MONO_VERSION_BUILD=`echo $VERSION | cut -d . -f 3`
35 # This is the version number of the corlib-runtime interface. When
36 # making changes to this interface (by changing the layout
37 # of classes the runtime knows about, changing icall signature or
38 # semantics etc), increment this variable.
40 # This can be reset to 0 when Mono's version number is bumped
41 # since it's part of the corlib version (the prefix '1' in the full
42 # version number is to ensure the number isn't treated as octal in C)
43 MONO_CORLIB_COUNTER=24
44 MONO_CORLIB_VERSION=`printf "1%02d%02d%02d%03d" $MONO_VERSION_MAJOR $MONO_VERSION_MINOR 0 $MONO_CORLIB_COUNTER`
46 AC_DEFINE_UNQUOTED(MONO_CORLIB_VERSION,$MONO_CORLIB_VERSION,[Version of the corlib-runtime interface])
47 AC_SUBST(MONO_CORLIB_VERSION)
49 case $host_os in
50 *cygwin* )
51                  echo "Run configure using ./configure --host=i686-pc-mingw32"
52                  exit 1
53 esac
55 # In case of cygwin, override LN_S, irrespective of what it determines.
56 # The build uses cygwin, but the actual runtime doesn't.
57 case $host_os in
58 *cygwin* ) LN_S='cp -p';;
59 esac
62 # libgc defaults
64 libgc_configure_args=
66 # These variables are the CPPFLAGS/CFLAGS passed to libgc's configure
67 # libgc should inherit the original CFLAGS/CPPFLAGS passed to configure, i.e. -O0
68 CPPFLAGS_FOR_LIBGC=$CPPFLAGS
69 CFLAGS_FOR_LIBGC=$CFLAGS
70 CPPFLAGS_FOR_BTLS=$CPPFLAGS
71 CFLAGS_FOR_BTLS=$CFLAGS
73 # libgc uses some deprecated APIs
74 CFLAGS_FOR_LIBGC="$CFLAGS -Wno-deprecated-declarations"
77 # These are the flags that need to be stored in the mono.pc file for 
78 # compiling code that will embed Mono
80 libmono_cflags=""
81 libmono_ldflags=""
82 AC_SUBST(libmono_cflags)
83 AC_SUBST(libmono_ldflags)
85 # Variable to have relocatable .pc files (lib, or lib64)
86 # realpath isn't always available, and requires that all but the tip of the provided
87 # path exists. Fall back to the old behaviour, but realpath allows depth >1
88 # e.g. Debian puts Mono in /usr/bin and libs in /usr/lib/x86_64-linux-gnu/ which is
89 # too deep for the old method to work
90 reloc_libdir=`realpath --relative-to=${prefix} ${libdir} 2> /dev/null || basename ${libdir}`
91 AC_SUBST(reloc_libdir)
93 # Set to yes if Unix sockets cannot be created in an anonymous namespace
94 need_link_unlink=no
96 #Set to extra linker flags to be passed to the runtime binaries (mono /mono-sgen)
97 extra_runtime_ldflags=""
100 # Hack for WASM
101 # Current autotools (v1.15) doesn't have a triplet we can use for wasm so the kludge we do is to
102 # work around it by using a feature flag instead
103 AC_ARG_ENABLE(wasm,[  --enable-wasm    Hack to set the current runtime to target wasm], enable_wasm=$enableval)
105 # Thread configuration inspired by sleepycat's db
106 AC_MSG_CHECKING([host platform characteristics])
108 libgc_threads=no
109 has_dtrace=no
110 parallel_mark=yes
111 ikvm_native=yes
113 host_win32=no
114 target_win32=no
115 platform_android=no
116 platform_tizen=no
117 platform_ios=no
118 host_darwin=no
119 host_linux=no
122 if test "x$enable_wasm" = "xyes"; then
123 CFLAGS="$CFLAGS -D_REENTRANT -D_GNU_SOURCE -DNO_UNALIGNED_ACCESS -s WASM=1"
124 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DUSE_MMAP -D_GNU_SOURCE -DNO_UNALIGNED_ACCESS -s WASM=1"
125 libdl="-ldl"
126 libgc_threads=pthreads
127 platform_wasm=yes
129 else
131 case "$host" in
132         *-mingw*|*-*-cygwin*)
133                 AC_DEFINE(DISABLE_PORTABILITY,1,[Disable the io-portability layer])
134                 AC_DEFINE(HOST_NO_SYMLINKS,1,[This platform does not support symlinks])
135                 host_win32=yes
136                 mono_cv_clang=no
137                 if test "x$cross_compiling" = "xno"; then
138                         if test "x$host" = "x$build" -a "x$host" = "x$target"; then
139                                 target_win32=yes
140                         fi
141                 else
142                         if test "x$host" = "x$target"; then
143                                 target_win32=yes
144                         fi
145                 fi
146                 HOST_CC="gcc"
147                 # Windows Vista or later is required
148                 CPPFLAGS="$CPPFLAGS -DWINVER=0x0600 -D_WIN32_WINNT=0x0600 -D_WIN32_IE=0x0501 -D_UNICODE -DUNICODE -DWIN32_THREADS -DFD_SETSIZE=1024"
149                 LDFLAGS="$LDFLAGS -lbcrypt -lmswsock -lws2_32 -lole32 -loleaut32 -lpsapi -lversion -ladvapi32 -lwinmm -lkernel32 -liphlpapi"
150                 libmono_cflags="-mms-bitfields -mwindows"
151                 libmono_ldflags="-mms-bitfields -mwindows"
152                 libdl=
153                 libgc_threads=win32
154                 with_sigaltstack=no
155                 with_tls=pthread
156                 with_sgen_default_concurrent=yes
157                 LN_S=cp
158                 # This forces libgc to use the DllMain based thread registration code on win32
159                 libgc_configure_args="$libgc_configure_args --enable-win32-dllmain=yes"
160                 ;;
161         *-*-*netbsd*)
162                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DGC_NETBSD_THREADS -D_GNU_SOURCE"
163                 libmono_cflags="-D_REENTRANT"
164                 LDFLAGS="$LDFLAGS -pthread"
165                 CPPFLAGS="$CPPFLAGS -DHOST_BSD"
166                 libmono_ldflags="-pthread"
167                 need_link_unlink=yes
168                 libdl="-ldl"
169                 libgc_threads=pthreads
170                 with_sigaltstack=no
171                 use_sigposix=yes
172                 with_sgen_default_concurrent=yes
173                 ;;
174         *-*-kfreebsd*-gnu)
175                 CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP -DUSE_MUNMAP -DTHREAD_LOCAL_ALLOC -pthread"
176                 libmono_cflags="-D_REENTRANT -DTHREAD_LOCAL_ALLOC -pthread"
177                 libmono_ldflags="-lpthread -pthread"
178                 libdl="-ldl"
179                 libgc_threads=pthreads
180                 need_link_unlink=yes
181                 with_sigaltstack=no
182                 use_sigposix=yes
183                 with_sgen_default_concurrent=yes
184                 ;;
185         *-*-*freebsd*)
186                 if test "x$PTHREAD_CFLAGS" = "x"; then
187                         CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS"
188                         libmono_cflags=
189                 else
190                         CPPFLAGS="$CPPFLAGS $PTHREAD_CFLAGS -DGC_FREEBSD_THREADS"
191                         libmono_cflags="$PTHREAD_CFLAGS"
192                 fi
193                 if test "x$PTHREAD_LIBS" = "x"; then
194                         LDFLAGS="$LDFLAGS -pthread -L/usr/local/lib"
195                         libmono_ldflags="-pthread"
196                 else
197                         LDFLAGS="$LDFLAGS $PTHREAD_LIBS -L/usr/local/lib"
198                         libmono_ldflags="$PTHREAD_LIBS"
199                 fi
200                 CPPFLAGS="$CPPFLAGS -DHOST_BSD"
201                 need_link_unlink=yes
202                 AC_DEFINE(PTHREAD_POINTER_ID, 1, [pthread is a pointer])
203                 libdl=
204                 libgc_threads=pthreads
205                 use_sigposix=yes
206                 has_dtrace=yes
207                 with_sgen_default_concurrent=yes
208                 ;;
209         *-*-*openbsd*)
210                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_OPENBSD_THREADS -DHOST_BSD -D_REENTRANT -DUSE_MMAP"
211                 LDFLAGS="${LDFLAGS} -Wl,-zwxneeded"
212                 if test "x$disable_munmap" != "xyes"; then
213                 CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
214                 fi
215                 libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
216                 LDFLAGS="$LDFLAGS -pthread"
217                 need_link_unlink=yes
218                 AC_DEFINE(PTHREAD_POINTER_ID)
219                 libdl=
220                 libgc_threads=pthreads
221                 with_tls=pthread
222                 with_sigaltstack=no
223                 use_sigposix=yes
224                 with_sgen_default_concurrent=yes
225                 ;;
226         *-*-linux-android*)
227                 platform_android=yes
228                 AC_DEFINE(HOST_ANDROID,1,[Targeting the Android platform])
229                 AC_DEFINE(TARGET_ANDROID,1,[Targeting the Android platform])
231                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
232                 if test "x$disable_munmap" != "xyes"; then
233                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
234                 fi
235                 libmono_cflags="-D_REENTRANT"
236                 libdl="-ldl"
237                 libgc_threads=pthreads
238                 use_sigposix=yes
240                 with_tls=pthread
241                 with_sigaltstack=no
242                 with_static_mono=no
244                 # Android doesn't support boehm, as it's missing <link.h>
245                 support_boehm=no
246                 with_gc=sgen
248                 # isinf(3) requires -lm; see isinf check below
249                 LDFLAGS="$LDFLAGS -lm"
251                 # Bionic's <pthread.h> sets PTHREAD_STACK_MIN=2*PAGE_SIZE; doesn't define
252                 # PAGE_SIZE; breaks mono/io-layer/collection.c
253                 # Bionic doesn't provide S_IWRITE; breaks io-layer/io.c
254                 CFLAGS="$CFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
255                 CXXFLAGS="$CXXFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
257                 # to bypass the underscore linker check, can't work when cross-compiling
258                 mono_cv_uscore=yes
259                 mono_cv_clang=no
260                 ;;
261         *-*-linux*)
262                 host_linux=yes
263                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
264                 if test "x$disable_munmap" != "xyes"; then
265                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
266                 fi
267                 libmono_cflags="-D_REENTRANT"
268                 libdl="-ldl"
269                 libgc_threads=pthreads
270                 use_sigposix=yes
271                 if test "x$cross_compiling" != "xno"; then
272                         # to bypass the underscore linker check, not
273                         # available during cross-compilation
274                         mono_cv_uscore=no
275                 fi
276                 case "$host" in
277                 *-tizen-linux-*)
278                         platform_tizen=yes
279                         ;;
280                 esac
281                 case "$host" in
282                 aarch64-*)
283                         support_boehm=no
284                         with_gc=sgen
285                         ;;
286                 powerpc*-*-linux*)
287                         # https://bugzilla.novell.com/show_bug.cgi?id=504411
288                         disable_munmap=yes
289                         ;;
290                 esac
291                 with_sgen_default_concurrent=yes
292                 ;;
293         *-*-nacl*)
294                 echo "nacl no longer supported."
295                 exit 1
296                 ;;
297         *-*-hpux*)
298                 CPPFLAGS="$CPPFLAGS -DGC_HPUX_THREADS -D_HPUX_SOURCE -D_XOPEN_SOURCE_EXTENDED -D_REENTRANT"
299                 # +ESdbgasm only valid on bundled cc on RISC
300                 # silently ignored for ia64
301                 if test $GCC != "yes"; then
302                         CFLAGS="$CFLAGS +ESdbgasm"
303                         # Arrange for run-time dereferencing of null
304                         # pointers to produce a SIGSEGV signal.
305                         LDFLAGS="$LDFLAGS -z"
306                 fi
307                 CFLAGS="$CFLAGS +ESdbgasm"
308                 LDFLAGS="$LDFLAGS -z"
309                 libmono_cflags="-D_REENTRANT"
310                 libmono_ldflags="-lpthread"
311                 libgc_threads=pthreads
312                 need_link_unlink=yes
313                 use_sigposix=yes
314                 ;;
315         *-*-solaris*)
316                 CPPFLAGS="$CPPFLAGS -DGC_SOLARIS_THREADS -DGC_SOLARIS_PTHREADS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -DUSE_MMAP -DUSE_MUNMAP -DHOST_SOLARIS"
317                 need_link_unlink=yes
318                 libmono_cflags="-D_REENTRANT"
319                 libgc_threads=pthreads
320                 has_dtrace=yes
321                 use_sigposix=yes
322                 enable_solaris_tar_check=yes
323                 ;;
324         *-*-darwin*)
325                 parallel_mark="Disabled_Currently_Hangs_On_MacOSX"
326                 host_darwin=yes
327                 target_mach=yes
328                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_MACOSX_THREADS -DUSE_MMAP -DUSE_MUNMAP"
329                 libmono_cflags="-D_THREAD_SAFE"
330                 need_link_unlink=yes
331                 AC_DEFINE(PTHREAD_POINTER_ID)
332                 AC_DEFINE(USE_MACH_SEMA, 1, [...])
333                 libdl=
334                 libgc_threads=pthreads
335                 has_dtrace=yes
336                 if test "x$cross_compiling" = "xyes"; then
337                         has_broken_apple_cpp=yes
338                 fi
339                 dnl Snow Leopard is horribly broken -- it reports itself as i386-apple-darwin*, but
340                 dnl its gcc defaults to 64-bit mode.  They have also deprecated the usage of ucontext
341                 dnl we need to set some flags to build our 32-bit binaries on 10.6 properly
342                 case "$host" in
343                         dnl Snow Leopard and newer config.guess reports as this
344                         i*86-*-darwin*)
345                                 BROKEN_DARWIN_FLAGS="-arch i386"
346                                 BROKEN_DARWIN_CPPFLAGS=""
347                                 CPPFLAGS="$CPPFLAGS $BROKEN_DARWIN_CPPFLAGS"
348                                 CFLAGS="$CFLAGS $BROKEN_DARWIN_FLAGS"
349                                 CXXFLAGS="$CXXFLAGS $BROKEN_DARWIN_FLAGS"
350                                 CCASFLAGS="$CCASFLAGS $BROKEN_DARWIN_FLAGS"
351                                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC $BROKEN_DARWIN_CPPFLAGS"
352                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC $BROKEN_DARWIN_FLAGS"
353                                 with_sgen_default_concurrent=yes
354                                 ;;
355                         x*64-*-darwin*)
356                                 with_sgen_default_concurrent=yes
357                                 ;;
358                         arm*-darwin*)
359                                 platform_ios=yes
360                                 has_dtrace=no
361                                 ;;
362                         aarch64*-darwin*)
363                                 platform_ios=yes
364                                 ;;
365                 esac
366                 ;;
367         *-*-haiku*)
368                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -D_THREAD_SAFE"
369                 libmono_cflags="-D_REENTRANT -D_THREAD_SAFE"
370                 libdl=
371                 LIBS="$LIBS -lnetwork -ltextencoding"
372                 need_link_unlink=yes
373                 AC_DEFINE(PTHREAD_POINTER_ID)
374                 dnl Haiku does not support static TLS with __thread
375                 with_tls=pthread
376                 libgc_threads=pthreads
377                 use_sigposix=yes
378                 ;;
379         *-*-aix*|*-*-os400*)
380                 dnl Set up a 64-bit build
381                 CPPFLAGS="$CPPFLAGS -maix64 -DGC_AIX_THREADS -D_ALL_SOURCE -D_THREAD_SAFE -D_LARGE_FILES -D_REENTRANT"
382                 LDFLAGS="-maix64"
383                 libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
384                 dnl Would you believe GNU nm doesn't know how to process AIX libraries?
385                 dnl Hardcode IBM binutils in case GNU ones end up on our path. Also
386                 dnl specifiy 64-bit mode for tools.
387                 AR="/usr/bin/ar -X64"
388                 NM="/usr/bin/nm -X64"
389                 dnl SGen is the future (changes to Boehm support code would be
390                 dnl required if you wish to re-enable Boehm)
391                 support_boehm=no
392                 with_gc=sgen
393                 need_link_unlink=yes
394                 use_sigposix=yes
395                 dnl the valloc call to alloc the guard page bombs out, even with extending the data area
396                 with_sigaltstack=no
397                 dnl use pthread TLS, __thread has issues with the compiler flags we use
398                 with_tls=pthread
399                 dnl ppc Linux is the same? test further
400                 disable_munmap=yes
401                 ;;
402         *)
403                 AC_MSG_WARN([*** Please add $host to configure.ac checks!])
404                 libdl="-ldl"
405                 ;;
406 esac
408 # WASM hack
411 AC_MSG_RESULT(ok)
413 if test x$need_link_unlink = xyes; then
414    AC_DEFINE(NEED_LINK_UNLINK, 1, [Define if Unix sockets cannot be created in an anonymous namespace])
417 if test x$host_win32 = xyes; then
418    AC_DEFINE(HOST_WIN32, 1, [Host Platform is Win32])
421 if test x$target_win32 = xyes; then
422    AC_DEFINE(TARGET_WIN32, 1, [Target Platform is Win32])
425 if test x$host_darwin = xyes; then
426    AC_DEFINE(HOST_DARWIN, 1, [Host Platform is Darwin])
429 # Defined for all targets/platforms using classic Windows API support.
430 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
431 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
433 AC_SUBST(extra_runtime_ldflags)
434 AM_CONDITIONAL(HOST_WIN32, test x$host_win32 = xyes)
435 AM_CONDITIONAL(TARGET_WIN32, test x$target_win32 = xyes)
436 AM_CONDITIONAL(HOST_LINUX, echo x$target_os | grep -q linux)
437 AM_CONDITIONAL(HOST_DARWIN, test x$host_darwin = xyes)
438 AM_CONDITIONAL(HOST_SIGPOSIX, test x$use_sigposix = xyes)
439 AM_CONDITIONAL(HOST_ANDROID, test x$platform_android = xyes)
440 AM_CONDITIONAL(HOST_TIZEN, test x$platform_tizen = xyes)
441 AM_CONDITIONAL(HOST_IOS, test x$platform_ios = xyes)
442 AM_CONDITIONAL(HOST_WASM, test x$platform_wasm = xyes)
444 if test -z "$HOST_DARWIN_TRUE"; then :
445 PLATFORM_AOT_SUFFIX=.dylib
448 if test -z "$HOST_LINUX_TRUE"; then :
449 PLATFORM_AOT_SUFFIX=.so
452 if test -z "$HOST_WIN32_TRUE"; then :
453 PLATFORM_AOT_SUFFIX=.dll
456 AC_SUBST(PLATFORM_AOT_SUFFIX)
458 ## PLATFORM_AOT_SUFFIX not so simple for windows :-)
460 AC_CHECK_TOOL(CC, gcc, gcc)
461 AC_PROG_CC
462 AC_CHECK_TOOL(CXX, g++, g++)
463 AC_PROG_CXX
464 AM_PROG_AS
465 AC_PROG_INSTALL
466 AC_PROG_AWK
467 AM_PROG_CC_C_O
468 dnl We should use AM_PROG_AS, but it's not available on automake/aclocal 1.4
469 : ${CCAS='$(CC)'}
470 # Set ASFLAGS if not already set.
471 : ${CCASFLAGS='$(CFLAGS)'}
472 AC_SUBST(CCAS)
473 AC_SUBST(CCASFLAGS)
475 # AC_PROG_CXX helpfully sets CXX to g++ even if no c++ compiler is found so check
476 # GXX instead. See http://lists.gnu.org/archive/html/bug-autoconf/2002-04/msg00056.html
477 if test "x$CXX" = "xg++"; then
478         if test "x$GXX" != "xyes"; then
479                 # automake/libtool is so broken, it requires g++ even if the c++ sources
480                 # are inside automake conditionals
481                 AC_MSG_ERROR([You need to install g++])
482         fi
485 dnl may require a specific autoconf version
486 dnl AC_PROG_CC_FOR_BUILD
487 dnl CC_FOR_BUILD not automatically detected
488 CC_FOR_BUILD=$CC
489 CFLAGS_FOR_BUILD=$CFLAGS
490 BUILD_EXEEXT=
491 if test "x$cross_compiling" = "xyes"; then
492         CC_FOR_BUILD=cc
493         CFLAGS_FOR_BUILD=
494         BUILD_EXEEXT=""
496 AC_SUBST(CC_FOR_BUILD)
497 AC_SUBST(CFLAGS_FOR_BUILD)
498 AC_SUBST(HOST_CC)
499 AC_SUBST(BUILD_EXEEXT)
501 AM_CONDITIONAL(CROSS_COMPILING, [test x$cross_compiling = xyes])
502 AM_CONDITIONAL(USE_BATCH_FILES, [test x$host_win32 = xyes -a x$cross_compiling = xyes])
504 # Set STDC_HEADERS
505 AC_HEADER_STDC
506 AC_LIBTOOL_WIN32_DLL
507 # This causes monodis to not link correctly
508 #AC_DISABLE_FAST_INSTALL
510 #lookup makedev() header
511 AC_HEADER_MAJOR
513 AM_PROG_LIBTOOL
514 # Use dolt (http://dolt.freedesktop.org/) instead of libtool for building.
515 DOLT
517 export_ldflags=`(./libtool --config; echo eval echo \\$export_dynamic_flag_spec) | sh`
518 AC_SUBST(export_ldflags)
520 # Test whenever ld supports -version-script
521 AC_PROG_LD
522 AC_PROG_LD_GNU
524 AC_CHECK_HEADERS(sys/filio.h sys/sockio.h netdb.h utime.h sys/utime.h semaphore.h sys/un.h linux/rtc.h sys/syscall.h sys/mkdev.h sys/uio.h sys/param.h sys/sysctl.h libproc.h sys/prctl.h)
525 AC_CHECK_HEADERS(sys/param.h sys/socket.h sys/ipc.h sys/utsname.h alloca.h ucontext.h pwd.h sys/select.h netinet/tcp.h netinet/in.h unistd.h sys/types.h link.h asm/sigcontext.h sys/inotify.h arpa/inet.h complex.h unwind.h)
526 AC_CHECK_HEADERS([linux/netlink.h linux/rtnetlink.h],
527                   [], [], [#include <stddef.h>
528                   #include <sys/socket.h>
529                   #include <linux/socket.h>])
531 AC_CHECK_HEADERS(sys/user.h, [], [],
533 #ifdef HAVE_SYS_PARAM_H
534 # include <sys/param.h>
535 #endif
538 AC_CHECK_HEADERS(linux/serial.h)
540 AC_CHECK_HEADER(zlib.h, [have_zlib=yes], [have_zlib=no])
541 if test x$have_zlib = xyes; then
542    AC_TRY_COMPILE([#include <zlib.h>], [
543    #if defined(ZLIB_VERNUM) && (ZLIB_VERNUM >= 0x1230)
544    #else
545    #error No good zlib found
546    #endif
547    ],[
548         AC_MSG_RESULT(Using system zlib)
549         zlib_msg="system zlib"
550         AC_DEFINE(HAVE_SYS_ZLIB,1,[Have system zlib])
551    ],[
552         AC_MSG_RESULT(Using embedded zlib)
553         have_zlib=no
554         zlib_msg="bundled zlib"
555    ])
558 AM_CONDITIONAL(HAVE_ZLIB, test x$have_zlib = xyes)
559 AC_DEFINE(HAVE_ZLIB,1,[Have system zlib])
561 # for mono/metadata/debug-symfile.c
562 AC_CHECK_HEADERS(elf.h)
564 # for support
565 AC_CHECK_HEADERS(poll.h)
566 AC_CHECK_HEADERS(sys/poll.h)
567 AC_CHECK_HEADERS(sys/wait.h)
568 AC_CHECK_HEADERS(grp.h)
569 AC_CHECK_HEADERS(syslog.h)
570 AC_CHECK_FUNCS(vsyslog)
572 # for mono/dis
573 AC_CHECK_HEADERS(wchar.h)
574 AC_CHECK_HEADERS(ieeefp.h)
575 AC_MSG_CHECKING(for isinf)
576 AC_TRY_LINK([#include <math.h>], [
577         int f = isinf (1.0);
578 ], [
579         AC_MSG_RESULT(yes)
580         AC_DEFINE(HAVE_ISINF, 1, [isinf available])
581 ], [
582         # We'll have to use signals
583         AC_MSG_RESULT(no)
585 # mingw
586 AC_CHECK_FUNCS(_finite, , AC_MSG_CHECKING(for _finite in math.h)
587         AC_TRY_LINK([#include <math.h>], 
588         [ _finite(0.0); ], 
589         AC_DEFINE(HAVE__FINITE, 1, [Have _finite in -lm]) AC_MSG_RESULT(yes),
590         AC_MSG_RESULT(no)))
592 # for Linux statfs support
593 AC_CHECK_HEADERS(linux/magic.h)
595 # For Android NDK unified headers
596 if test x$platform_android = xyes; then
597         AC_CHECK_HEADERS(machine/endian.h sys/endian.h)
598         AC_CHECK_HEADERS(android/legacy_signal_inlines.h, [have_android_signal_inlines=yes], [have_android_signal_inlines=no])
600         # Make sure SIGRT{MIN,MAX} work - they will fail to work with unified headers if building for
601         # API level < 21 *and* android/legacy_signal_inlines.h doesn't declare (and define) the required
602         # libc APIs to obtain values for SIGRT{MIN,MAX}. We perform the check only if android/legacy_signal_inlines.h
603         # is found because in other cases the macros will either work (for NDK < 14) or fail if the legacy header
604         # doesn't contain the required definitions (NDK 14)
605         if test x$have_android_signal_inlines = xyes; then
606                 AC_MSG_CHECKING([Whether Android SIGRTMIN/SGRTMAX macros are valid])
607                 AC_COMPILE_IFELSE([
608                         AC_LANG_PROGRAM([#include <android/legacy_signal_inlines.h>],[
609                                 int i;
610                                 for (i = SIGRTMIN + 1; i < SIGRTMAX; ++i) {
611                                 }
612                         ])],[
613                                 AC_MSG_RESULT(yes)
614                                 android_sigrtminmax_work=yes
615                         ],[
616                                 AC_MSG_RESULT(no)
617                                 android_sigrtminmax_work=no
618                         ]
619                 )
621                 if test x$android_sigrtminmax_work = xno; then
622                         AC_MSG_ERROR([Android SIGRTMIN/SIGRTMAX macros don't work in this NDK])
623                 fi
624         fi
626         # Attempt to detect whether we're using Android NDK unified headers
627         AC_CHECK_HEADERS(android/api-level.h, [have_android_api_level=yes], [have_android_api_level=no])
628         AC_CHECK_HEADERS(android/versioning.h, [have_android_versioning=yes], [have_android_versioning=no])
630         android_unified_headers=no
631         if test x$have_android_api_level = xyes; then
632                 if test x$have_android_versioning = xyes; then
633                         AC_MSG_CHECKING([whether using Android NDK unified headers])
635                         # Both macros are defined only in the NDK unified headers
636                         AC_COMPILE_IFELSE([
637                                 AC_LANG_PROGRAM([
638                                         #include <android/api-level.h>
639                                         #include <android/versioning.h>
640                                 ],[
641                                         #if __ANDROID_API_O__ == 26 && defined(__INTRODUCED_IN)
642                                         #else
643                                                 #error __ANDROID_API_O__ != 26 or the __INTRODUCED_IN macro not defined
644                                         #endif
645                                 ])],[
646                                         AC_MSG_RESULT(yes)
647                                         android_unified_headers=yes
648                                 ],[
649                                         AC_MSG_RESULT(no)
650                                         android_unified_headers=no
651                                 ]
652                         )
653                 fi
654         fi
656         if test x$android_unified_headers = xyes; then
657                 AC_DEFINE(ANDROID_UNIFIED_HEADERS, 1, [Whether Android NDK unified headers are used])
658         fi
659 fi # Android
661 # not 64 bit clean in cross-compile
662 if test "x$enable_wasm" = "xyes"; then
663 AC_DEFINE(SIZEOF_VOID_P,4)
664 AC_DEFINE(SIZEOF_LONG,4)
665 ac_cv_sizeof_void_p="4"
666 ac_cv_sizeof_long="4"
667 else
668 AC_CHECK_SIZEOF(void *)
669 AC_CHECK_SIZEOF(long)
672 AC_CHECK_SIZEOF(int)
673 AC_CHECK_SIZEOF(long long)
675 AC_CACHE_CHECK([for clang],
676         mono_cv_clang,[
677         AC_TRY_COMPILE([], [
678                 #ifdef __clang__
679                 #else
680                 #error "FAILED"
681                 #endif
682         ],
683         [mono_cv_clang=yes],
684         [mono_cv_clang=no],
685         [])
688 AC_ARG_ENABLE(visibility-hidden,
689 [  --disable-visibility-hidden    disable usage of -fvisiblity=hidden],
690    disable_visibility_hidden=yes, disable_visibility_hidden=no)
692 WARN=''
693 if test x"$GCC" = xyes; then
694         WARN='-Wall -Wunused -Wmissing-prototypes -Wmissing-declarations -Wstrict-prototypes  -Wmissing-prototypes -Wnested-externs -Wpointer-arith -Wno-cast-qual -Wwrite-strings -Wno-switch -Wno-switch-enum -Wno-unused-value -Wno-attributes -Wno-format-zero-length'
696                 # We require C99 with some GNU extensions, e.g. `linux` macro
697                 CFLAGS="$CFLAGS -std=gnu99"
699                 # The runtime code does not respect ANSI C strict aliasing rules
700                 CFLAGS="$CFLAGS -fno-strict-aliasing"
702                 # We rely on signed overflow to behave
703                 CFLAGS="$CFLAGS -fwrapv"
705                 CFLAGS="$CFLAGS -DMONO_DLL_EXPORT"
706                 if test x"$disable_visibility_hidden" = xno; then
707                    # Don't export any symbols by default
708                    SHARED_CFLAGS="-fvisibility=hidden"
709                    CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
710                 fi
712                 ORIG_CFLAGS=$CFLAGS
713                 # Check for the normal version, since gcc ignores unknown -Wno options
714                 CFLAGS="$CFLAGS -Wunused-but-set-variable -Werror"
715                 AC_MSG_CHECKING(for -Wno-unused-but-set-variable option to gcc)
716                 AC_TRY_COMPILE([],[
717                 ], [
718                    AC_MSG_RESULT(yes)
719                    CFLAGS="$ORIG_CFLAGS -Wno-unused-but-set-variable"
720                 ], [
721                    AC_MSG_RESULT(no)
722                    CFLAGS=$ORIG_CFLAGS
723                 ])
725                 if test "x$mono_cv_clang" = "xyes"; then
726                    # https://bugzilla.samba.org/show_bug.cgi?id=8118
727                    WARN="$WARN -Qunused-arguments"
728                    WARN="$WARN -Wno-unused-function -Wno-tautological-compare -Wno-parentheses-equality -Wno-self-assign -Wno-return-stack-address -Wno-constant-logical-operand"
729                    # We rely on zero length arrays in structs
730                    WARN="$WARN -Wno-zero-length-array"
731                 fi
732 else
733         # The Sun Forte compiler complains about inline functions that access static variables
734         # so disable all inlining.
735         case "$host" in
736         *-*-solaris*)
737                 CFLAGS="$CFLAGS -Dinline="
738                 ;;
739         esac
741 CFLAGS="$WARN $CFLAGS -g"
742 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -g"
743 CPPFLAGS="$WARN $CPPFLAGS -g"
745 # Where's the 'mcs' source tree?
746 if test -d $srcdir/mcs; then
747   mcsdir=mcs
748 else
749   mcsdir=../mcs
752 AC_ARG_WITH(mcs-path, [  --with-mcs-path=/path/to/mcs      Specify an alternate mcs source tree],
753         if test x$with_mcs_path != "x" -a -d $with_mcs_path ; then
754                 mcsdir=$with_mcs_path
755         fi
758 AC_ARG_WITH(jumptables, [  --with-jumptables=yes,no      enable/disable support for jumptables (ARM-only for now) (defaults to no)],[],[with_jumptables=no])
761 # A sanity check to catch cases where the package was unpacked
762 # with an ancient tar program (Solaris)
764 AC_ARG_ENABLE(solaris-tar-check,
765 [  --disable-solaris-tar-check    disable solaris tar check],
766    do_solaris_tar_check=no, do_solaris_tar_check=yes)
768 if test x"$do_solaris_tar_check" = xyes -a x"$enable_solaris_tar_check" = xyes; then
769         AC_MSG_CHECKING(integrity of package)
770         if test -f $mcsdir/class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapTypeMapper.cs
771         then
772                 AC_MSG_RESULT(ok)
773         else
774                 errorm="Your mono distribution is incomplete;  if unpacking from a tar file, make sure you use GNU tar;  see http://www.mono-project.com/IncompletePackage for more details"
775                 AC_MSG_ERROR([$errorm])
776         fi
779 if test "x$with_mcs_path" != "x"; then
780 mcs_topdir=$(cd "$mcsdir" && pwd)
781 mcs_topdir_from_srcdir=$mcs_topdir
782 else
783 mcs_topdir=$(cd "$srcdir/$mcsdir" && pwd)
784 mcs_topdir_from_srcdir='$(top_builddir)'/$mcsdir
787 # Convert mcs_topdir* paths to Windows syntax.
788 if test x$cross_compiling$host_win32 = xnoyes; then
789   mcs_topdir=$(cygpath -m $mcs_topdir)
790   case $mcs_topdir_from_srcdir in
791     /cygdrive/*)
792         mcs_topdir_from_srcdir=$(cygpath -m $mcs_topdir_from_srcdir)
793         ;;
794   esac
797 AC_SUBST([mcs_topdir])
798 AC_SUBST([mcs_topdir_from_srcdir])
800 # gettext: prepare the translation directories. 
801 # we do not configure the full gettext, as we consume it dynamically from C#
802 AM_PO_SUBDIRS
804 if test "x$USE_NLS" = "xyes"; then
805    AC_CHECK_PROG(HAVE_MSGFMT, msgfmt,yes,no)
807    if test "x$HAVE_MSGFMT" = "xno"; then
808           AC_MSG_ERROR([msgfmt not found. You need to install the 'gettext' package, or pass --enable-nls=no to configure.])
809    fi
812 AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
814 pkg_config_path=
815 AC_ARG_WITH(crosspkgdir, [  --with-crosspkgdir=/path/to/pkg-config/dir      Change pkg-config dir to custom dir],
816         if test x$with_crosspkgdir = "x"; then
817                 if test -s $PKG_CONFIG_PATH; then
818                         pkg_config_path=$PKG_CONFIG_PATH
819                 fi
820         else
821                 pkg_config_path=$with_crosspkgdir
822                 PKG_CONFIG_PATH=$pkg_config_path
823                 export PKG_CONFIG_PATH
824         fi
827 AC_ARG_ENABLE(ninja,[  --enable-ninja    Enable using ninja where available], enable_ninja=$enableval)
828 AC_CHECK_PROG(HAVE_NINJA, ninja, yes, no)
829 AM_CONDITIONAL(NINJA, test x$enable_ninja = xyes -a x$HAVE_NINJA != xno)
831 AC_ARG_ENABLE(werror, [  --enable-werror Pass -Werror to the C compiler], werror_flag=$enableval, werror_flag=no)
832 if test x$werror_flag = xyes; then
833         WERROR_CFLAGS="-Werror"
835 AC_SUBST([WERROR_CFLAGS])
836 AC_SUBST([SHARED_CFLAGS])
838 GLIB_CFLAGS='-I$(top_srcdir)/mono/eglib -I$(top_builddir)/mono/eglib'
839   
840 AC_SUBST(GLIB_CFLAGS)
842 # Enable support for fast thread-local storage
843 # Some systems have broken support, so we allow to disable it.
844 AC_ARG_WITH(tls, [  --with-tls=__thread,pthread    select Thread Local Storage implementation (defaults to __thread)],[],[with_tls=__thread])
846 # Enable support for using sigaltstack for SIGSEGV and stack overflow handling
847 # This does not work on some platforms (bug #55253)
848 AC_ARG_WITH(sigaltstack, [  --with-sigaltstack=yes,no      enable/disable support for sigaltstack (defaults to yes)],[],[with_sigaltstack=yes])
850 AC_ARG_WITH(static_mono, [  --with-static_mono=yes,no      link mono statically to libmono (faster) (defaults to yes)],[],[with_static_mono=yes])
851 AC_ARG_WITH(shared_mono, [  --with-shared_mono=yes,no      build a shared libmono library (defaults to yes)],[],[with_shared_mono=yes])
852 # Same as --with-shared_mono=no
853 AC_ARG_ENABLE(libraries, [  --disable-libraries disable the build of libmono], enable_libraries=$enableval, enable_libraries=yes)
855 if test "x$enable_static" = "xno"; then
856    with_static_mono=no
859 if test "x$enable_shared" = "xno"; then
860    with_shared_mono=no
863 if test "x$enable_libraries" = "xno"; then
864    with_shared_mono=no
867 AM_CONDITIONAL(DISABLE_LIBRARIES, test x$enable_libraries = xno)
869 if test "x$host_win32" = "xyes"; then
870    # Boehm GC requires the runtime to be in its own dll
871    with_static_mono=no
874 AM_CONDITIONAL(STATIC_MONO, test x$with_static_mono != xno)
875 AM_CONDITIONAL(SHARED_MONO, test x$with_shared_mono != xno)
876 AC_ARG_ENABLE(mcs-build, [  --disable-mcs-build disable the build of the mcs directory], try_mcs_build=$enableval, enable_mcs_build=yes)
877 AC_ARG_ENABLE(support-build, [  --disable-support-build disable the build of the support directory], try_support_build=$enableval, enable_support_build=yes)
879 AC_ARG_WITH(xen_opt,   [  --with-xen_opt=yes,no          Enable Xen-specific behaviour (defaults to yes)],[],[with_xen_opt=yes])
880 if test "x$with_xen_opt" = "xyes" -a "x$mono_cv_clang" = "xno"; then
881         AC_DEFINE(MONO_XEN_OPT, 1, [Xen-specific behaviour])
882         ORIG_CFLAGS=$CFLAGS
883         CFLAGS="$CFLAGS -mno-tls-direct-seg-refs"
884         AC_MSG_CHECKING(for -mno-tls-direct-seg-refs option to gcc)
885         AC_TRY_COMPILE([], [
886         ], [
887            AC_MSG_RESULT(yes)
888            # Pass it to libgc as well
889            CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -mno-tls-direct-seg-refs"
890         ], [
891            AC_MSG_RESULT(no)
892            CFLAGS=$ORIG_CFLAGS
893         ])
896 AC_ARG_ENABLE(small-config, [  --enable-small-config Enable tweaks to reduce requirements (and capabilities)], enable_small_config=$enableval, enable_small_config=no)
898 if test x$enable_small_config = xyes; then
899         AC_DEFINE(MONO_SMALL_CONFIG,1,[Reduce runtime requirements (and capabilities)])
900         CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DSMALL_CONFIG"
903 AC_ARG_ENABLE(system-aot, [  --enable-system-aot  Enable the Ahead-Of-Time compilation of system assemblies during the build (on by default on some platforms)], enable_system_aot=$enableval, enable_system_aot=default)
905 DISABLED_FEATURES=none
906 csc_compiler=default
907 endian=unknown
908 AC_C_BIGENDIAN([endian=big],[endian=little],[endian=unknown])
909 AC_MSG_CHECKING([CSharp compiler to use])
910 AC_ARG_WITH(csc, [  --with-csc=mcs,roslyn,default      Configures the CSharp compiler to use],[
911    if test x$withval = xmcs; then
912        csc_compiler=mcs
913    elif test x$withval = xroslyn; then
914        csc_compiler=roslyn
915    elif test x$withval = xdefault; then
916        :
917    else
918        AC_MSG_ERROR([You must supply one of "mcs", "roslyn" or "default" to the --with-csc option])
919    fi
920 ],[csc_compiler=default])
922 if test $csc_compiler = default; then
923    if test $endian = big; then
924       csc_compiler=mcs
925    elif test $endian = little; then
926       case "$host" in
927         powerpc*) csc_compiler=mcs ;;
928         *) csc_compiler=roslyn ;;
929       esac
930    else
931       csc_compiler=mcs
932    fi
934 AC_MSG_RESULT($csc_compiler)
936 AC_ARG_WITH(jemalloc,             [  --with-jemalloc=yes,no               If jemalloc is enabled (defaults to no)],                                     [], [with_jemalloc=no])
937 AC_ARG_WITH(jemalloc-always,      [  --with-jemalloc_always=yes,no        If jemalloc is enabled and always used (defaults to yes)],                    [], [with_jemalloc_always=no])
938 AC_ARG_WITH(jemalloc-assert,      [  --with-jemalloc_assert=yes,no        If jemalloc performs runtime checks for memory correctness (defaults to no)], [], [with_jemalloc_assert=no])
941 if test x$target_win32 = xyes; then
942 with_jemalloc=no
943 with_jemalloc_assert=no
944 with_jemalloc_always=no
947 AM_CONDITIONAL(MONO_JEMALLOC_ASSERT, [test "x$with_jemalloc_assert" = "xyes"])
948 if test "x$with_jemalloc_assert" = "xyes"; then
949 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ASSERT"
950 AC_DEFINE(MONO_JEMALLOC_ASSERT, 1, [Make jemalloc assert for mono])
951 AC_SUBST(MONO_JEMALLOC_ASSERT, 1)
954 AM_CONDITIONAL(MONO_JEMALLOC_DEFAULT, [test "x$with_jemalloc_always" = "xyes"])
955 if test "x$with_jemalloc_always" = "xyes"; then
956 with_jemalloc=yes
957 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_DEFAULT"
958 AC_DEFINE(MONO_JEMALLOC_DEFAULT, 1, [Make jemalloc default for mono])
959 AC_SUBST(MONO_JEMALLOC_DEFAULT, 1)
962 AM_CONDITIONAL(MONO_JEMALLOC_ENABLED, [test "x$with_jemalloc" = "xyes"])
963 if test "x$with_jemalloc" = "xyes"; then
964 JEMALLOC_LDFLAGS="-L`pwd`/mono/utils/jemalloc/jemalloc/lib -ljemalloc_pic"
965 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ENABLED -I `pwd`/mono/utils/jemalloc/jemalloc/include"
966 JEMALLOC_AUTOCONF_FLAGS=" --build=$target --host=$host"
968 if test "x$target_mach" = "xyes"; then
969         JEMALLOC_CPPFLAGS=" -stdlib=libc++ "
972 AC_DEFINE(MONO_JEMALLOC_ENABLED, 1, [Enable jemalloc usage for mono])
973 AC_SUBST(MONO_JEMALLOC_ENABLED, 1)
975 AC_SUBST(JEMALLOC_CFLAGS)
976 AC_SUBST(JEMALLOC_CPPFLAGS)
977 AC_SUBST(JEMALLOC_LDFLAGS)
978 AC_SUBST(JEMALLOC_AUTOCONF_FLAGS)
982 # Terminology:
983 # Crash privacy - Attempts to not send identifying information in the crash dump / to protect the obscurity of the program control flow
984 # MERP - The MS telemetry profile. Not for general use.
985 # Structured crashes - crashes at runtime that trigger a stack walk by mono that happens cooperatively
987 # Structured crashes are not merp crashes. Structured crashes are json dumps made by mono during crashes. Merp upload is going to use the dumping code is a very specific way, and is enabled at runtime with an icall.
989 #--with-crash_privacy=yes --with-structured_crashes=no means we don't wanna dump in non-merp-enabled builds, and we want to not send symbol strings. This is going to be the default pair of settings for VS4Mac.
990 #--with-crash_privacy=yes --with-structured_crashes=yes means you want to see crashes on your console, and you want to not see unmanaged symbol names. This is an option for proprietary apps that have manual bugs filed.
991 #--with-crash_privacy=no --with-structured_crashes=no means you want to see no crash dumps on failure and you don't care about privacy. This is how you'd set a "don't want it, don't care" configuration.
992 #--with-crash_privacy=no --with-structured_crashes=yes means you want full crashes and you want to see them in the terminal, not on telemetry. This is going to be how we build for CI.
994 AC_ARG_WITH(crash-privacy,       [  --with-crash_privacy=yes,no         If you want your crashes to not include names of symbols present in the binary. ], [], [with_crash_privacy=no])
995 AC_ARG_WITH(structured-crashes,  [  --with-structured_crashes=yes,no    If you want your unmanaged crashes to result in a small crash dump file. ],        [], [with_structured_crashes=yes])
997 if test "x$with_crash_privacy" = "xno"; then
998 AC_DEFINE(MONO_PRIVATE_CRASHES,1,[Do not include names of unmanaged functions in the crash dump])
1001 if test "x$with_structured_crashes" = "xno"; then
1002 AC_DEFINE(DISABLE_STRUCTURED_CRASH,1,[Do not create structured crash files during unmanaged crashes])
1005 AC_ARG_ENABLE(monodroid, [ --enable-monodroid Enable runtime support for Monodroid (Xamarin.Android)], enable_monodroid=$enableval, enable_monodroid=no)
1006 AM_CONDITIONAL(ENABLE_MONODROID, test x$enable_monodroid = xyes)
1008 AC_ARG_ENABLE(monotouch, [ --enable-monotouch Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)], enable_monotouch=$enableval, enable_monotouch=no)
1009 AM_CONDITIONAL(ENABLE_MONOTOUCH, test x$enable_monotouch = xyes)
1011 if test x$enable_monodroid = xyes; then
1012         AC_DEFINE(ENABLE_MONODROID, 1, [Enable runtime support for Monodroid (Xamarin.Android)])
1015 if test x$enable_monotouch = xyes; then
1016         AC_DEFINE(ENABLE_MONOTOUCH, 1, [Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)])
1020 # Set the build profiles and options before things which use them
1023 AC_ARG_WITH(profile4_x,          [  --with-profile4_x=yes,no            If you want to install the 4.x FX (defaults to yes)],                       [], [with_profile4_x=default])
1024 AC_ARG_WITH(monodroid,           [  --with-monodroid=yes,no             If you want to build the MonoDroid assemblies (defaults to no)],            [], [with_monodroid=default])
1025 AC_ARG_WITH(monotouch,           [  --with-monotouch=yes,no             If you want to build the Xamarin.iOS assemblies (defaults to no)],          [], [with_monotouch=default])
1026 AC_ARG_WITH(monotouch_watch,     [  --with-monotouch_watch=yes,no       If you want to build the Xamarin.WatchOS assemblies (defaults to no)],      [], [with_monotouch_watch=default])
1027 AC_ARG_WITH(monotouch_tv,        [  --with-monotouch_tv=yes,no          If you want to build the Xamarin.TVOS assemblies (defaults to no)],         [], [with_monotouch_tv=default])
1028 AC_ARG_WITH(bitcode,             [  --with-bitcode=yes,no               If bitcode is enabled (defaults to no)],                                    [], [with_bitcode=default])
1029 AC_ARG_WITH(xammac,              [  --with-xammac=yes,no                If you want to build the Xamarin.Mac assemblies (defaults to no)],          [], [with_xammac=default])
1030 AC_ARG_WITH(testing_aot_hybrid,  [  --with-testing_aot_hybrid=yes,no    If you want to build the testing_aot_hybrid assemblies (defaults to no)],   [], [with_testing_aot_hybrid=default])
1031 AC_ARG_WITH(testing_aot_full,    [  --with-testing_aot_full=yes,no      If you want to build the testing_aot_full assemblies (defaults to no)],     [], [with_testing_aot_full=default])
1032 AC_ARG_WITH(winaot,              [  --with-winaot=yes,no                If you want to build the Windows friendly AOT assemblies (defaults to no)], [], [with_winaot=default])
1033 AC_ARG_WITH(orbis,               [  --with-orbis=yes,no                 If you want to build the Orbis assemblies (defaults to no)], [], [with_orbis=default])
1034 AC_ARG_WITH(unreal,              [  --with-unreal=yes,no                If you want to build the Unreal assemblies (defaults to no)], [], [with_unreal=default])
1035 AC_ARG_WITH(wasm,                [  --with-wasm=yes,no                  If you want to build the WebAssembly (defaults to no)], [], [with_wasm=default])
1038 AC_ARG_WITH(runtime-preset, [  --with-runtime-preset=net_4_x,all,aot,aot_llvm,hybridaot,hybridaot_llvm,fullaot,fullaot_llvm,bitcode,unreal   Which default profile to build (defaults to net_4_x)],  [], [with_runtime_preset=net_4_x])
1039 AC_ARG_WITH(spectre-mitigation,             [  --with-spectre-mitigation=yes,no   If you want to build the runtime with compiler flags that enable Spectre mitigation (defaults to no)], [], [with_spectre_mitigation=default])
1040 AC_ARG_WITH(spectre-indirect-branch-choice,   [  --with-spectre-indirect-branch-choice=keep,thunk,inline,extern   Convert indirect branches to the specified kind of thunk (defaults to inline)], [], [with_spectre_indirect_branch_choice=inline])
1041 AC_ARG_WITH(spectre-function-return-choice, [  --with-spectre-function-return-choice=keep,thunk,inline,extern   Convert function return instructions to the specified kind of thunk (defaults to inline)], [], [with_spectre_function_return_choice=inline])
1044 dnl Spectre compiler mitigation flag checks
1046 if test "x$with_spectre_mitigation" = "xyes"; then
1047    AC_MSG_NOTICE([Compiler Spectre mitigation support checks])
1048    SPECTRE_CFLAGS=
1049    SPECTRE_INDIRECT_BRANCH_KIND=
1050    case "x$with_spectre_indirect_branch_choice" in
1051        xkeep) SPECTRE_INDIRECT_BRANCH_KIND=keep ;;
1052        xthunk) SPECTRE_INDIRECT_BRANCH_KIND=thunk ;;
1053        xinline) SPECTRE_INDIRECT_BRANCH_KIND=thunk-inline ;;
1054        xextern) SPECTRE_INDIRECT_BRANCH_KIND=thunk-extern ;;
1055        *) AC_MSG_ERROR([Invalid indirect jump thunk kind ($with_spectre_indirect_branch_choice)]) ;;
1056    esac
1058    SPECTRE_FUNCTION_RETURN_KIND=""
1059    case "x$with_spectre_function_return_choice" in
1060        xkeep) SPECTRE_FUNCTION_RETURN_KIND=keep ;;
1061        xthunk) SPECTRE_FUNCTION_RETURN_KIND=thunk ;;
1062        xinline) SPECTRE_FUNCTION_RETURN_KIND=thunk-inline ;;
1063        xextern) SPECTRE_FUNCTION_RETURN_KIND=thunk-extern ;;
1064        *) AC_MSG_ERROR([Invalid function return thunk kind ($with_spectre_function_return_choice)]) ;;
1065    esac
1067    AX_CHECK_COMPILE_FLAG(
1068         [ -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND ],
1069         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND" ]
1070    )
1072    AX_CHECK_COMPILE_FLAG(
1073         [ -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND ],
1074         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND" ]
1075    )
1077    if test "x$SPECTRE_CFLAGS" != "x" ; then
1078         CFLAGS="$CFLAGS $SPECTRE_CFLAGS"
1079         CXXFLAGS="$CXXFLAGS $SPECTRE_CFLAGS"
1080         spectre_mitigation_status="mitigation enabled"
1081    fi
1082 else
1083         spectre_mitigation_status="no mitigation"
1087 dnl Profile defaults
1089 TEST_PROFILE=default
1090 enable_llvm_default=no
1092 with_profile4_x_default=no
1093 with_monodroid_default=no
1094 with_monotouch_default=no
1095 with_monotouch_watch_default=no
1096 with_monotouch_tv_default=no
1097 with_xammac_default=no
1098 with_testing_aot_hybrid_default=no
1099 with_testing_aot_full_default=no
1100 with_winaot_default=no
1101 with_orbis_default=no
1102 with_unreal_default=no
1103 with_wasm_default=no
1105 with_bitcode_default=no
1106 enable_cooperative_suspend_default=no
1107 enable_hybrid_suspend_default=no
1109 INVARIANT_AOT_OPTIONS=nimt-trampolines=2000,ntrampolines=10000,nrgctx-fetch-trampolines=256,ngsharedvt-trampolines=4000
1111 AOT_BUILD_ATTRS=$INVARIANT_AOT_OPTIONS
1113 if test x$cross_compiling = xyes -o x$enable_mcs_build = xno; then
1114    DISABLE_MCS_DOCS_default=yes
1115 elif test x$with_runtime_preset = xnet_4_x; then
1116    with_profile4_x_default=yes
1117 elif test x$with_runtime_preset = xall; then
1118    with_profile4_x_default=yes
1119    with_monodroid_default=yes
1120    with_monotouch_default=yes
1121    with_monotouch_watch_default=yes
1122    with_monotouch_tv_default=yes
1123    with_xammac_default=yes
1124    with_winaot_default=yes
1125    with_orbis_default=yes
1126    with_unreal_default=yes
1127    with_wasm_default=yes
1128    with_testing_aot_hybrid_default=yes
1129    with_testing_aot_full_default=yes
1130 elif test x$with_runtime_preset = xbitcode; then
1131    DISABLE_MCS_DOCS_default=yes
1132    with_testing_aot_full_default=yes
1133    with_bitcode_default=yes
1134    enable_cooperative_suspend_default=yes
1135    TEST_PROFILE=testing_aot_full
1136    enable_llvm_default=yes
1138    mono_feature_disable_com='yes'
1139    mono_feature_disable_remoting='yes'
1140    mono_feature_disable_reflection_emit_save='yes'
1141    mono_feature_disable_reflection_emit='yes'
1142    mono_feature_disable_appdomains='yes'
1144    AOT_BUILD_FLAGS="--runtime=mobile --aot=llvmonly,$INVARIANT_AOT_OPTIONS"
1145    AOT_RUN_FLAGS="--runtime=mobile --llvmonly"
1146    AOT_MODE="llvmonly"
1147 elif test x$with_runtime_preset = xfullaot; then
1148    DISABLE_MCS_DOCS_default=yes
1149    with_testing_aot_full_default=yes
1150    TEST_PROFILE=testing_aot_full
1152    mono_feature_disable_com='yes'
1153    mono_feature_disable_remoting='yes'
1154    mono_feature_disable_reflection_emit_save='yes'
1155    mono_feature_disable_reflection_emit='yes'
1156    mono_feature_disable_appdomains='yes'
1158    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1159    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1160    AOT_MODE="full"
1161 elif test x$with_runtime_preset = xfullaot_llvm; then
1162    DISABLE_MCS_DOCS_default=yes
1163    with_testing_aot_full_default=yes
1164    TEST_PROFILE=testing_aot_full
1166    mono_feature_disable_com='yes'
1167    mono_feature_disable_remoting='yes'
1168    mono_feature_disable_reflection_emit_save='yes'
1169    mono_feature_disable_reflection_emit='yes'
1170    mono_feature_disable_appdomains='yes'
1172    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1173    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1174    AOT_MODE="full"
1175 elif test x$with_runtime_preset = xhybridaot; then
1176    DISABLE_MCS_DOCS_default=yes
1177    with_testing_aot_hybrid_default=yes
1178    TEST_PROFILE=testing_aot_hybrid 
1180    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1181    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1182 elif test x$with_runtime_preset = xhybridaot_llvm; then
1183    DISABLE_MCS_DOCS_default=yes
1184    with_testing_aot_hybrid_default=yes
1185    TEST_PROFILE=testing_aot_hybrid
1187    AOT_BUILD_FLAGS="--runtime=mobile --llvm --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1188    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1189 elif test x$with_runtime_preset = xaot; then
1190    with_profile4_x_default=yes
1192    AOT_BUILD_FLAGS="--aot=$INVARIANT_AOT_OPTIONS"
1193    AOT_RUN_FLAGS=""
1195    DISABLE_MCS_DOCS_default=yes
1196 elif test x$with_runtime_preset = xaot_llvm; then
1197    with_profile4_x_default=yes
1199    AOT_BUILD_FLAGS="--llvm --aot=$INVARIANT_AOT_OPTIONS"
1200    AOT_RUN_FLAGS=""
1202    DISABLE_MCS_DOCS_default=yes
1203 elif test x$with_runtime_preset = xwinaot; then
1204    DISABLE_MCS_DOCS_default=yes
1205    with_winaot_default=yes
1206    TEST_PROFILE=winaot
1208    mono_feature_disable_com='yes'
1209    mono_feature_disable_remoting='yes'
1210    mono_feature_disable_reflection_emit_save='yes'
1211    mono_feature_disable_reflection_emit='yes'
1212    mono_feature_disable_appdomains='yes'
1214    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1215    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1216    AOT_MODE="llvmonly"
1217 elif test x$with_runtime_preset = xorbis; then
1218    DISABLE_MCS_DOCS_default=yes
1219    with_orbis_default=yes
1220    TEST_PROFILE=orbis
1222    mono_feature_disable_com='yes'
1223    mono_feature_disable_remoting='yes'
1224    mono_feature_disable_reflection_emit_save='yes'
1225    mono_feature_disable_reflection_emit='yes'
1226    mono_feature_disable_appdomains='yes'
1228    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1229    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1230    AOT_MODE="full"
1231 elif test x$with_runtime_preset = xunreal; then
1232    DISABLE_MCS_DOCS_default=yes
1233    with_unreal_default=yes
1234    TEST_PROFILE=unreal
1236    mono_feature_disable_com='yes'
1237    mono_feature_disable_remoting='yes'
1238    mono_feature_disable_appdomains='no'
1240    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1241    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1242 elif test x$with_runtime_preset = xwasm; then
1243    DISABLE_MCS_DOCS_default=yes
1244    with_wasm_default=yes
1245    TEST_PROFILE=wasm
1247    mono_feature_disable_com='yes'
1248    mono_feature_disable_remoting='yes'
1249    mono_feature_disable_reflection_emit_save='yes'
1250    mono_feature_disable_reflection_emit='yes'
1251    mono_feature_disable_appdomains='yes'
1253    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1254    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1255 else
1256    with_profile4_x_default=yes
1259 if test "x$AOT_BUILD_FLAGS" != "x"; then :
1260    AC_SUBST(AOT_BUILD_FLAGS)
1261    AC_SUBST(AOT_RUN_FLAGS)
1262    # For llvmonlycheck + fullaotcheck
1263    AC_SUBST(INVARIANT_AOT_OPTIONS)
1266 AC_SUBST(TEST_PROFILE)
1268 if test "x$with_profile4_x" = "xdefault"; then
1269    with_profile4_x=$with_profile4_x_default
1271 if test "x$with_monodroid" = "xdefault"; then
1272    with_monodroid=$with_monodroid_default
1274 if test "x$with_monotouch" = "xdefault"; then
1275    with_monotouch=$with_monotouch_default
1277 if test "x$with_monotouch_watch" = "xdefault"; then
1278    with_monotouch_watch=$with_monotouch_watch_default
1280 if test "x$with_monotouch_tv" = "xdefault"; then
1281    with_monotouch_tv=$with_monotouch_tv_default
1283 if test "x$with_bitcode" = "xdefault"; then
1284    with_bitcode=$with_bitcode_default
1286 if test "x$with_xammac" = "xdefault"; then
1287    with_xammac=$with_xammac_default
1289 if test "x$with_testing_aot_hybrid" = "xdefault"; then
1290    with_testing_aot_hybrid=$with_testing_aot_hybrid_default
1292 if test "x$with_testing_aot_full" = "xdefault"; then
1293    with_testing_aot_full=$with_testing_aot_full_default
1295 if test "x$with_winaot" = "xdefault"; then
1296    with_winaot=$with_winaot_default
1298 if test "x$with_orbis" = "xdefault"; then
1299    with_orbis=$with_orbis_default
1301 if test "x$with_unreal" = "xdefault"; then
1302    with_unreal=$with_unreal_default
1304 if test "x$with_wasm" = "xdefault"; then
1305    with_wasm=$with_wasm_default
1309 AM_CONDITIONAL(INSTALL_4_x, [test "x$with_profile4_x" = "xyes"])
1310 AM_CONDITIONAL(INSTALL_MONODROID, [test "x$with_monodroid" != "xno"])
1311 AM_CONDITIONAL(INSTALL_MONOTOUCH, [test "x$with_monotouch" != "xno"])
1312 AM_CONDITIONAL(INSTALL_MONOTOUCH_WATCH, [test "x$with_monotouch_watch" != "xno"])
1313 AM_CONDITIONAL(INSTALL_MONOTOUCH_TV, [test "x$with_monotouch_tv" != "xno"])
1314 AM_CONDITIONAL(BITCODE, test "x$with_bitcode" = "xyes")
1315 AM_CONDITIONAL(INSTALL_XAMMAC, [test "x$with_xammac" != "xno"])
1316 AM_CONDITIONAL(INSTALL_TESTING_AOT_HYBRID, [test "x$with_testing_aot_hybrid" != "xno"])
1317 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL, [test "x$with_testing_aot_full" != "xno"])
1318 AM_CONDITIONAL(INSTALL_WINAOT, [test "x$with_winaot" != "xno"])
1319 AM_CONDITIONAL(INSTALL_ORBIS, [test "x$with_orbis" != "xno"])
1320 AM_CONDITIONAL(INSTALL_UNREAL, [test "x$with_unreal" != "xno"])
1321 AM_CONDITIONAL(INSTALL_WASM, [test "x$with_wasm" != "xno"])
1322 AM_CONDITIONAL(FULL_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full"] || [test "x$TEST_PROFILE" = "xwinaot"] || [test "x$TEST_PROFILE" = "xorbis"] || [test "x$TEST_PROFILE" = "xwasm"])
1323 AM_CONDITIONAL(HYBRID_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_hybrid"] || [test "x$TEST_PROFILE" = "xunreal"])
1325 default_profile=net_4_x
1326 if test -z "$INSTALL_MONODROID_TRUE"; then :
1327    default_profile=monodroid
1329 if test -z "$INSTALL_MONOTOUCH_TRUE"; then :
1330    default_profile=monotouch
1332 if test -z "$INSTALL_XAMMAC_TRUE"; then :
1333    default_profile=xammac
1335 if test -z "$INSTALL_TESTING_AOT_HYBRID_TRUE"; then :
1336    default_profile=testing_aot_hybrid
1338 if test -z "$INSTALL_TESTING_AOT_FULL_TRUE"; then :
1339    default_profile=testing_aot_full
1341 if test -z "$INSTALL_WINAOT_TRUE"; then :
1342    default_profile=winaot
1344 if test -z "$INSTALL_ORBIS_TRUE"; then :
1345    default_profile=orbis
1347 if test -z "$INSTALL_UNREAL_TRUE"; then :
1348    default_profile=unreal
1350 if test -z "$INSTALL_WASM_TRUE"; then :
1351    default_profile=wasm
1353 if test -z "$INSTALL_4_x_TRUE"; then :
1354    default_profile=net_4_x
1356 DEFAULT_PROFILE=$default_profile
1357 AC_SUBST(DEFAULT_PROFILE)
1360 # End build profile configuration
1363 if test x$USE_NLS = xprofile_default; then
1365         AC_MSG_CHECKING([NLS used])
1367         # We make the default value for USE_NLS
1368         # "no" on OSX because it isn't available on most
1369         # default OSX installs. The most common configurations will
1370         # all disable it, so this saves us typing.
1371         if test x$host_darwin = xyes; then
1372                 USE_NLS=no;
1373         else
1374                 USE_NLS=yes;
1375         fi
1377         AC_SUBST([USE_NLS])
1378         AC_MSG_RESULT([$USE_NLS])
1381 AC_ARG_ENABLE(minimal, [  --enable-minimal=LIST      drop support for LIST subsystems.
1382      LIST is a comma-separated list from: aot, profiler, decimal, pinvoke, debug, appdomains, verifier, 
1383      reflection_emit, reflection_emit_save, large_code, logging, com, ssa, generics, attach, jit, interpreter, simd, soft_debug, perfcounters, normalization, desktop_loader, shared_perfcounters, remoting,
1384          security, lldb, mdb, sgen_marksweep_conc, sgen_split_nursery, sgen_gc_bridge, sgen_debug_helpers.],
1386         for feature in `echo "$enable_minimal" | sed -e "s/,/ /g"`; do
1387                 eval "mono_feature_disable_$feature='yes'"
1388         done
1389         DISABLED_FEATURES=$enable_minimal
1390         disabled="Disabled:      $enable_minimal"
1391 ],[])
1393 AC_DEFINE_UNQUOTED(DISABLED_FEATURES, "$DISABLED_FEATURES", [String of disabled features])
1395 if test "x$mono_feature_disable_aot" = "xyes"; then
1396         AC_DEFINE(DISABLE_AOT, 1, [Disable AOT Compiler])
1397         enable_system_aot=no
1398         AC_MSG_NOTICE([Disabled AOT compiler])
1401 if test "x$mono_feature_disable_profiler" = "xyes"; then
1402         AC_DEFINE(DISABLE_PROFILER, 1, [Disable default profiler support])
1403         AC_MSG_NOTICE([Disabled support for the profiler])
1405 AM_CONDITIONAL(DISABLE_PROFILER, test x$mono_feature_disable_profiler = xyes)
1407 if test "x$mono_feature_disable_decimal" = "xyes"; then
1408         AC_DEFINE(DISABLE_DECIMAL, 1, [Disable System.Decimal support])
1409         AC_MSG_NOTICE([Disabled support for decimal])
1412 if test "x$mono_feature_disable_pinvoke" = "xyes"; then
1413         AC_DEFINE(DISABLE_PINVOKE, 1, [Disable P/Invoke support])
1414         AC_MSG_NOTICE([Disabled support for P/Invoke])
1417 if test "x$mono_feature_disable_debug" = "xyes"; then
1418         AC_DEFINE(DISABLE_DEBUG, 1, [Disable runtime debugging support])
1419         AC_MSG_NOTICE([Disabled support for runtime debugging])
1422 if test "x$mono_feature_disable_reflection_emit" = "xyes"; then
1423         AC_DEFINE(DISABLE_REFLECTION_EMIT, 1, [Disable reflection emit support])
1424         mono_feature_disable_reflection_emit_save=yes
1425         AC_MSG_NOTICE([Disabled support for Reflection.Emit])
1428 if test "x$mono_feature_disable_reflection_emit_save" = "xyes"; then
1429         AC_DEFINE(DISABLE_REFLECTION_EMIT_SAVE, 1, [Disable assembly saving support in reflection emit])
1430         AC_MSG_NOTICE([Disabled support for Reflection.Emit.Save])
1433 if test "x$mono_feature_disable_large_code" = "xyes"; then
1434         AC_DEFINE(DISABLE_LARGE_CODE, 1, [Disable support for huge assemblies])
1435         AC_MSG_NOTICE([Disabled support for large assemblies])
1438 if test "x$mono_feature_disable_logging" = "xyes"; then
1439         AC_DEFINE(DISABLE_LOGGING, 1, [Disable support debug logging])
1440         AC_MSG_NOTICE([Disabled support for logging])
1443 if test "x$mono_feature_disable_com" = "xyes"; then
1444         AC_DEFINE(DISABLE_COM, 1, [Disable COM support])
1445         AC_MSG_NOTICE([Disabled COM support])
1448 if test "x$mono_feature_disable_ssa" = "xyes"; then
1449         AC_DEFINE(DISABLE_SSA, 1, [Disable advanced SSA JIT optimizations])
1450         AC_MSG_NOTICE([Disabled SSA JIT optimizations])
1453 if test "x$mono_feature_disable_generics" = "xyes"; then
1454         AC_DEFINE(DISABLE_GENERICS, 1, [Disable generics support])
1455         AC_MSG_NOTICE([Disabled Generics Support])
1458 if test "x$mono_feature_disable_shadowcopy" = "xyes"; then
1459         AC_DEFINE(DISABLE_SHADOW_COPY, 1, [Disable Shadow Copy for AppDomains])
1460         AC_MSG_NOTICE([Disabled Shadow copy for AppDomains])
1463 if test "x$mono_feature_disable_portability" = "xyes"; then
1464         AC_DEFINE(DISABLE_PORTABILITY, 1, [Disables the IO portability layer])
1465         AC_MSG_NOTICE([Disabled IO Portability layer])
1468 if test "x$mono_feature_disable_attach" = "xyes"; then
1469         AC_DEFINE(DISABLE_ATTACH, 1, [Disable agent attach support])
1470         AC_MSG_NOTICE([Disabled agent attach])
1473 if test "x$mono_feature_disable_verifier" = "xyes"; then
1474         AC_DEFINE(DISABLE_VERIFIER, 1, [Disables the verifier])
1475         AC_MSG_NOTICE([Disabled the metadata and IL verifiers])
1478 if test "x$mono_feature_disable_jit" = "xyes"; then
1479         AC_DEFINE(DISABLE_JIT, 1, [Disable the JIT, only full-aot mode or interpreter will be supported by the runtime.])
1480         AC_MSG_NOTICE([Disabled the JIT engine, only full AOT or interpreter will be supported])
1483 AM_CONDITIONAL(DISABLE_JIT, test x$mono_feature_disable_jit = xyes)
1485 if test "x$mono_feature_disable_interpreter" = "xyes"; then
1486         AC_DEFINE(DISABLE_INTERPRETER, 1, [Disable the interpreter.])
1487         AC_MSG_NOTICE([Disabled the interpreter])
1490 AM_CONDITIONAL(DISABLE_INTERPRETER, test x$mono_feature_disable_interpreter = xyes)
1492 if test "x$mono_feature_disable_interpreter" != "xyes" -o "x$mono_feature_disable_jit" != "xyes"; then
1493         AC_DEFINE(ENABLE_ILGEN, 1, [Some VES is available at runtime])
1496 AM_CONDITIONAL(ENABLE_ILGEN, test x$mono_feature_disable_interpreter != xyes -o x$mono_feature_disable_jit != xyes)
1498 if test "x$mono_feature_disable_simd" = "xyes"; then
1499         AC_DEFINE(DISABLE_SIMD, 1, [Disable SIMD intrinsics related optimizations.])
1500         AC_MSG_NOTICE([Disabled SIMD support])
1503 if test "x$mono_feature_disable_soft_debug" = "xyes"; then
1504         AC_DEFINE(DISABLE_DEBUGGER_AGENT, 1, [Disable Soft Debugger Agent.])
1505         AC_MSG_NOTICE([Disabled Soft Debugger.])
1508 AM_CONDITIONAL(DISABLE_DEBUGGER_AGENT, test x$mono_feature_disable_debugger_agent = xyes)
1510 if test "x$mono_feature_disable_perfcounters" = "xyes"; then
1511         AC_DEFINE(DISABLE_PERFCOUNTERS, 1, [Disable Performance Counters.])
1512         AC_MSG_NOTICE([Disabled Performance Counters.])
1514 if test "x$mono_feature_disable_normalization" = "xyes"; then
1515         AC_DEFINE(DISABLE_NORMALIZATION, 1, [Disable String normalization support.])
1516         AC_MSG_NOTICE([Disabled String normalization support.])
1519 #TODO: remove assembly_remapping feature name once everyone is using desktop_loader
1520 if test "x$mono_feature_disable_assembly_remapping" = "xyes" || test "x$mono_feature_disable_desktop_loader" = "xyes"; then
1521         AC_DEFINE(DISABLE_DESKTOP_LOADER, 1, [Disable desktop assembly loader semantics.])
1522         AC_MSG_NOTICE([Disabled desktop assembly loader semantics.])
1525 if test "x$mono_feature_disable_shared_perfcounters" = "xyes"; then
1526         AC_DEFINE(DISABLE_SHARED_PERFCOUNTERS, 1, [Disable shared perfcounters.])
1527         AC_MSG_NOTICE([Disabled Shared perfcounters.])
1530 if test "x$mono_feature_disable_appdomains" = "xyes"; then
1531         AC_DEFINE(DISABLE_APPDOMAINS, 1, [Disable support for multiple appdomains.])
1532         AC_MSG_NOTICE([Disabled support for multiple appdomains.])
1535 if test "x$mono_feature_disable_remoting" = "xyes"; then
1536         AC_DEFINE(DISABLE_REMOTING, 1, [Disable remoting support (This disables type proxies and make com non-functional)])
1537         AC_MSG_NOTICE([Disabled remoting])
1540 if test "x$mono_feature_disable_security" = "xyes"; then
1541         AC_DEFINE(DISABLE_SECURITY, 1, [Disable CAS/CoreCLR security])
1542         AC_MSG_NOTICE([Disabled CAS/CoreCLR security manager (used e.g. for Moonlight)])
1545 if test "x$mono_feature_disable_lldb" = "xyes"; then
1546         AC_DEFINE(DISABLE_LLDB, 1, [Disable support code for the LLDB plugin.])
1547         AC_MSG_NOTICE([Disabled LLDB plugin support code.])
1550 if test "x$mono_feature_disable_mdb" = "xyes"; then
1551         AC_DEFINE(DISABLE_MDB, 1, [Disable support for .mdb symbol files.])
1552         AC_MSG_NOTICE([Disabled support for .mdb symbol files.])
1555 if test "x$mono_feature_disable_sgen_marksweep_conc" = "xyes"; then
1556         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_CONC, 1, [Disable concurrent gc support in SGEN.])
1557         AC_MSG_NOTICE([Disabled concurrent gc support in SGEN.])
1561 if test "x$mono_feature_disable_sgen_split_nursery" = "xyes"; then
1562         AC_DEFINE(DISABLE_SGEN_SPLIT_NURSERY, 1, [Disable minor=split support in SGEN.])
1563         AC_MSG_NOTICE([Disabled minor=split support in SGEN.])
1566 if test "x$mono_feature_disable_sgen_gc_bridge" = "xyes"; then
1567         AC_DEFINE(DISABLE_SGEN_GC_BRIDGE, 1, [Disable gc bridge support in SGEN.])
1568         AC_MSG_NOTICE([Disabled gc bridge support in SGEN.])
1571 if test "x$mono_feature_disable_sgen_debug_helpers" = "xyes"; then
1572         AC_DEFINE(DISABLE_SGEN_DEBUG_HELPERS, 1, [Disable debug helpers in SGEN.])
1573         AC_MSG_NOTICE([Disabled debug helpers in SGEN.])
1576 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
1577 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
1579 has_extension_module=no
1580 AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
1582         for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
1583                 if test x$extension = xdefault ; then
1584                         has_extension_module=yes;
1585                 fi
1586         done
1587         if test x$enable_extension_module = xyes; then
1588                 has_extension_module=yes;
1589         fi
1590 ], [])
1592 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
1594 if test x$has_extension_module != xno ; then
1595         AC_DEFINE([ENABLE_EXTENSION_MODULE], 1, [Extension module enabled])
1596         AC_MSG_NOTICE([Enabling mono extension module.])
1599 # Deprecated
1600 AC_ARG_ENABLE(gsharedvt, [  --enable-gsharedvt Enable generic valuetype sharing (Deprecated)], enable_gsharedvt=$enableval, enable_gsharedvt=no)
1602 AC_MSG_CHECKING(for visibility __attribute__)
1603 AC_COMPILE_IFELSE([
1604         AC_LANG_SOURCE([[
1605                 void __attribute__ ((visibility ("hidden"))) doit (void) {}
1606                 int main () { doit (); return 0; }
1607         ]])
1608 ], [
1609    have_visibility_hidden=yes
1610    AC_MSG_RESULT(yes)
1611 ], [
1612    have_visibility_hidden=no
1613    AC_MSG_RESULT(no)
1617 dnl Boehm GC configuration
1620 AC_ARG_WITH(libgc,   [  --with-libgc=included,none  Controls the Boehm GC config, default=included],[libgc=$with_libgc],[libgc=included])
1622 AC_ARG_ENABLE(boehm, [  --disable-boehm            Disable the Boehm GC.], support_boehm=$enableval,support_boehm=${support_boehm:-yes})
1623 AM_CONDITIONAL(SUPPORT_BOEHM, test x$support_boehm = xyes)
1625 if test "x$support_boehm" = "xyes"; then
1627         AC_ARG_ENABLE(parallel-mark, [  --enable-parallel-mark     Enables Boehm GC Parallel Marking], enable_parallel_mark=$enableval, enable_parallel_mark=$parallel_mark)
1628         if test x$enable_parallel_mark = xyes; then
1629                 libgc_configure_args="$libgc_configure_args --enable-parallel-mark"
1630         fi
1632         gc_msg=""
1633         LIBGC_CPPFLAGS=
1634         LIBGC_LIBS=
1635         LIBGC_STATIC_LIBS=
1636         libgc_dir=
1637         case "x$libgc" in
1638                 xincluded)
1639                         if test "x$support_boehm" = "xyes"; then
1640                                 libgc_dir=libgc
1641                         fi
1643                         LIBGC_CPPFLAGS='-I$(top_srcdir)/libgc/include'
1644                         LIBGC_LIBS='$(top_builddir)/libgc/libmonogc.la'
1645                         LIBGC_STATIC_LIBS='$(top_builddir)/libgc/libmonogc-static.la'
1647                         BOEHM_DEFINES="-DHAVE_BOEHM_GC"
1649                         if test x$target_win32 = xyes; then
1650                                 BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
1651                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
1652                         fi
1654                         gc_msg="Included Boehm GC with typed GC"
1655                         if test x$enable_parallel_mark = xyes; then
1656                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
1657                                 gc_msg="$gc_msg and parallel mark"
1658                         else
1659                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC)", [GC description])
1660                         fi
1661                         ;;
1663                 xboehm|xbohem|xyes)
1664                         AC_MSG_WARN("External Boehm is no longer supported")
1665                         ;;
1667                 xsgen)
1668                         AC_MSG_WARN("Use --with-sgen instead, --with-libgc= controls Boehm configuration")
1669                         ;;
1671                 xnone)
1672                         AC_MSG_WARN("Compiling mono without GC.")
1673                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description])
1674                         AC_DEFINE(HAVE_NULL_GC,1,[No GC support.])
1675                         gc_msg="none"
1676                         ;;
1677                 *)
1678                         AC_MSG_ERROR([Invalid argument $libgc to --with-libgc.])
1679                         ;;
1680         esac
1682         AC_ARG_WITH(large-heap, [  --with-large-heap=yes,no       Enable support for GC heaps larger than 3GB (defaults to no)], [large_heap=$withval], [large_heap=no])
1683         if test "x$large_heap" = "xyes"; then
1684            CPPFLAGS="$CPPFLAGS -DLARGE_CONFIG"
1685         fi
1687         AC_SUBST(LIBGC_CPPFLAGS)
1688         AC_SUBST(LIBGC_LIBS)
1689         AC_SUBST(LIBGC_STATIC_LIBS)
1690         AC_SUBST(libgc_dir)
1691         AC_SUBST(BOEHM_DEFINES)
1694 AM_CONDITIONAL(SUPPORT_NULLGC, test "x$libgc" = "xnone")
1697 dnl End of Boehm GC Configuration
1700 dnl *************************************
1701 dnl *** Checks for zero length arrays ***
1702 dnl *************************************
1703 AC_MSG_CHECKING(whether $CC supports zero length arrays)
1704 AC_TRY_COMPILE([
1705         struct s {
1706                 int  length;
1707                 char data [0];
1708         };
1709 ], [], [
1710         AC_MSG_RESULT(yes)
1711         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 0, [Length of zero length arrays])
1712 ], [
1713         AC_MSG_RESULT(no)
1714         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
1717 dnl ***********************************
1718 dnl *** Checks for signals
1719 dnl ***********************************
1720 AC_CHECK_HEADERS(signal.h)
1721 AC_CHECK_FUNCS(sigaction)
1722 AC_CHECK_FUNCS(kill)
1723 AC_CHECK_FUNCS(signal)
1725 # signal() is declared inline in Android headers
1726 # so we need to workaround it by overriding the check.
1727 if test x$platform_android = xyes; then
1728         AC_DEFINE(HAVE_SIGNAL,1)
1731 if test x$host_win32 = xno; then
1732         dnl *************************************
1733         dnl *** Checks for time capabilities ***
1734         dnl *************************************
1736         AC_MSG_CHECKING(for CLOCK_MONOTONIC)
1737         AC_TRY_COMPILE([#include <time.h>], [
1738                 const int foo = CLOCK_MONOTONIC;
1739         ],[
1740                 AC_MSG_RESULT(yes)
1741                 AC_DEFINE(HAVE_CLOCK_MONOTONIC, 1, [CLOCK_MONOTONIC])
1742         ], [
1743                 AC_MSG_RESULT(no)
1744         ])
1746         AC_MSG_CHECKING(for CLOCK_MONOTONIC_COARSE)
1747         AC_TRY_COMPILE([#include <time.h>], [
1748                 const int foo = CLOCK_MONOTONIC_COARSE;
1749         ],[
1750                 AC_MSG_RESULT(yes)
1751                 AC_DEFINE(HAVE_CLOCK_MONOTONIC_COARSE, 1, [CLOCK_MONOTONIC_COARSE])
1752         ], [
1753                 AC_MSG_RESULT(no)
1754         ])
1756         AC_MSG_CHECKING(for CLOCK_REALTIME)
1757         AC_TRY_COMPILE([#include <time.h>], [
1758                 const int foo = CLOCK_REALTIME;
1759         ],[
1760                 AC_MSG_RESULT(yes)
1761                 AC_DEFINE(HAVE_CLOCK_REALTIME, 1, [CLOCK_REALTIME])
1762         ], [
1763                 AC_MSG_RESULT(no)
1764         ])
1766         AC_CHECK_FUNC(mach_absolute_time, [AC_DEFINE(HAVE_MACH_ABSOLUTE_TIME, 1, [mach_absolute_time])])
1767         AC_CHECK_FUNC(gethrtime, [AC_DEFINE(HAVE_GETHRTIME, 1, [gethrtime])])
1768         AC_CHECK_FUNC(read_real_time, [AC_DEFINE(HAVE_READ_REAL_TIME, 1, [read_real_time])])
1769         AC_CHECK_FUNC(mach_timebase_info, [AC_DEFINE(HAVE_MACH_TIMEBASE_INFO, 1, [mach_timebase_info])])
1770         AC_CHECK_FUNC(futimes,            [AC_DEFINE(HAVE_FUTIMES, 1, [futimes])])
1771         AC_CHECK_FUNC(futimens,           [AC_DEFINE(HAVE_FUTIMENS, 1, [futimens])])
1773         dnl hires monotonic clock support
1774         AC_SEARCH_LIBS(clock_gettime, rt)
1775         AC_CHECK_FUNCS(clock_nanosleep)
1777         dnl dynamic loader support
1778         AC_CHECK_FUNC(dlopen, DL_LIB="",
1779                 AC_CHECK_LIB(dl, dlopen, DL_LIB="-ldl", dl_support=no)
1780         )
1781         if test x$dl_support = xno; then
1782                 AC_MSG_WARN([No dynamic loading support available])
1783         else
1784                 LIBS="$LIBS $DL_LIB"
1785                 AC_DEFINE(HAVE_DL_LOADER,1,[dlopen-based dynamic loader available])
1786                 dnl from glib's configure.ac
1787                 AC_CACHE_CHECK([for preceeding underscore in symbols],
1788                         mono_cv_uscore,[
1789                         AC_TRY_RUN([#include <dlfcn.h>
1790                         int mono_underscore_test (void) { return 42; }
1791                         int main() {
1792                           void *f1 = (void*)0, *f2 = (void*)0, *handle;
1793                           handle = dlopen ((void*)0, 0);
1794                           if (handle) {
1795                             f1 = dlsym (handle, "mono_underscore_test");
1796                             f2 = dlsym (handle, "_mono_underscore_test");
1797                           } return (!f2 || f1);
1798                         }],
1799                                 [mono_cv_uscore=yes],
1800                                 [mono_cv_uscore=no],
1801                         [])
1802                 ])
1803                 if test "x$mono_cv_uscore" = "xyes"; then
1804                         MONO_DL_NEED_USCORE=1
1805                 else
1806                         MONO_DL_NEED_USCORE=0
1807                 fi
1808                 AC_SUBST(MONO_DL_NEED_USCORE)
1809                 AC_CHECK_FUNC(dlerror)
1810         fi
1812         dnl ******************************************************************
1813         dnl *** Checks for the IKVM JNI interface library                  ***
1814         dnl ******************************************************************
1815         AC_ARG_WITH(ikvm-native, [  --with-ikvm-native=yes,no      build the IKVM JNI interface library (defaults to yes)],[with_ikvm_native=$withval],[with_ikvm_native=$ikvm_native])
1817         ikvm_native_dir=
1818         if test x$with_ikvm_native = xyes; then
1819                 ikvm_native_dir=ikvm-native
1820                 jdk_headers_found="IKVM Native"
1821         fi
1823         AC_SUBST(ikvm_native_dir)
1825         AC_CHECK_HEADERS(execinfo.h)
1827         AC_CHECK_HEADERS(sys/auxv.h sys/resource.h)
1829         AC_CHECK_FUNCS(getgrgid_r)
1830         AC_CHECK_FUNCS(getgrnam_r)
1831         AC_CHECK_FUNCS(getresuid)
1832         AC_CHECK_FUNCS(setresuid)
1833         AC_CHECK_FUNCS(kqueue)
1834         AC_CHECK_FUNCS(backtrace_symbols)
1835         AC_CHECK_FUNCS(mkstemp)
1836         AC_CHECK_FUNCS(mmap)
1837         AC_CHECK_FUNCS(madvise)
1838         AC_CHECK_FUNCS(getrusage)
1839         AC_CHECK_FUNCS(getpriority)
1840         AC_CHECK_FUNCS(setpriority)
1841         AC_CHECK_FUNCS(dl_iterate_phdr)
1842         AC_CHECK_FUNCS(dladdr)
1843         AC_CHECK_FUNCS(sysconf)
1844         AC_CHECK_FUNCS(getrlimit)
1845         AC_CHECK_FUNCS(prctl)
1846         AC_CHECK_FUNCS(arc4random)
1848         AC_CHECK_FUNCS(sched_getaffinity)
1849         AC_CHECK_FUNCS(sched_setaffinity)
1850         AC_CHECK_FUNCS(sched_getcpu)
1852         if test x$platform_android != xyes; then
1853                 AC_CHECK_FUNCS(getpwnam_r)
1854                 AC_CHECK_FUNCS(getpwuid_r)
1855         fi
1857         AC_FUNC_STRERROR_R()
1859         dnl ****************************************************************
1860         dnl *** Check for sched_setaffinity from glibc versions before   ***
1861         dnl *** 2.3.4. The older versions of the function only take 2    ***
1862         dnl *** parameters, not 3.                                       ***
1863         dnl ***                                                          ***
1864         dnl *** Because the interface change was not made in a minor     ***
1865         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
1866         dnl *** won't always indicate the interface sched_affinity has.  ***
1867         dnl ****************************************************************
1868         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
1869         AC_TRY_COMPILE([#include <sched.h>], [
1870             int mask = 1; 
1871             sched_setaffinity(0, &mask);
1872         ], [
1873                 # Yes, we have it...
1874                 AC_MSG_RESULT(yes)
1875                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
1876         ], [
1877                 # We have the new, three-parameter version
1878                 AC_MSG_RESULT(no)
1879         ])
1880         AC_TRY_COMPILE([#include <sched.h>], [
1881              CPU_COUNT((void *) 0);
1882         ], [
1883                 AC_MSG_RESULT(yes)
1884                 AC_DEFINE(GLIBC_HAS_CPU_COUNT, 1, [GLIBC has CPU_COUNT macro in sched.h])
1885         ], [
1886                 # We have the new, three-parameter version
1887                 AC_MSG_RESULT(no)
1888         ])
1890         dnl ******************************************************************
1891         dnl *** Check for large file support                               ***
1892         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
1893         dnl ******************************************************************
1894         
1895         # Check that off_t can represent 2**63 - 1 correctly, working around
1896         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
1897         # CPPFLAGS and sets $large_offt to yes if the test succeeds
1898         large_offt=no
1899         AC_DEFUN([LARGE_FILES], [
1900                 large_CPPFLAGS=$CPPFLAGS
1901                 CPPFLAGS="$CPPFLAGS $1"
1902                 AC_TRY_COMPILE([
1903                         #include <sys/types.h>
1904                         #include <limits.h>
1905                 ], [
1906                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
1907                         #define COMPILE_TIME_ASSERT(pred) \
1908                                 switch(0){case 0:case pred:;}
1909                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
1910                 ], [
1911                         AC_MSG_RESULT(ok)
1912                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
1913                         large_CPPFLAGS="$large_CPPFLAGS $1"
1914                         large_offt=yes
1915                 ], [
1916                         AC_MSG_RESULT(no)
1917                 ])
1918                 CPPFLAGS=$large_CPPFLAGS
1919         ])
1921         AC_MSG_CHECKING(if off_t is 64 bits wide)
1922         LARGE_FILES("")
1923         if test $large_offt = no; then
1924                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
1925                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
1926         fi
1927         if test $large_offt = no; then
1928                 AC_MSG_WARN([No 64 bit file size support available])
1929         fi
1930         
1931         dnl *****************************
1932         dnl *** Checks for libsocket  ***
1933         dnl *****************************
1934         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
1936         case "$host" in
1937                 *-*-*freebsd*)
1938                         dnl *****************************
1939                         dnl *** Checks for libinotify ***
1940                         dnl *****************************
1941                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
1942         esac
1944         dnl *******************************
1945         dnl *** Checks for MSG_NOSIGNAL ***
1946         dnl *******************************
1947         AC_MSG_CHECKING(for MSG_NOSIGNAL)
1948         AC_TRY_COMPILE([#include <sys/socket.h>], [
1949                 int f = MSG_NOSIGNAL;
1950         ], [
1951                 # Yes, we have it...
1952                 AC_MSG_RESULT(yes)
1953                 AC_DEFINE(HAVE_MSG_NOSIGNAL, 1, [Have MSG_NOSIGNAL])
1954         ], [
1955                 # We'll have to use signals
1956                 AC_MSG_RESULT(no)
1957         ])
1959         dnl *****************************
1960         dnl *** Checks for IPPROTO_IP ***
1961         dnl *****************************
1962         AC_MSG_CHECKING(for IPPROTO_IP)
1963         AC_TRY_COMPILE([#include <netinet/in.h>], [
1964                 int level = IPPROTO_IP;
1965         ], [
1966                 # Yes, we have it...
1967                 AC_MSG_RESULT(yes)
1968                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
1969         ], [
1970                 # We'll have to use getprotobyname
1971                 AC_MSG_RESULT(no)
1972         ])
1974         dnl *******************************
1975         dnl *** Checks for IPPROTO_IPV6 ***
1976         dnl *******************************
1977         AC_MSG_CHECKING(for IPPROTO_IPV6)
1978         AC_TRY_COMPILE([#include <netinet/in.h>], [
1979                 int level = IPPROTO_IPV6;
1980         ], [
1981                 # Yes, we have it...
1982                 AC_MSG_RESULT(yes)
1983                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
1984         ], [
1985                 # We'll have to use getprotobyname
1986                 AC_MSG_RESULT(no)
1987         ])
1989         dnl ******************************
1990         dnl *** Checks for IPPROTO_TCP ***
1991         dnl ******************************
1992         AC_MSG_CHECKING(for IPPROTO_TCP)
1993         AC_TRY_COMPILE([#include <netinet/in.h>], [
1994                 int level = IPPROTO_TCP;
1995         ], [
1996                 # Yes, we have it...
1997                 AC_MSG_RESULT(yes)
1998                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
1999         ], [
2000                 # We'll have to use getprotobyname
2001                 AC_MSG_RESULT(no)
2002         ])
2004         dnl *****************************
2005         dnl *** Checks for SOL_IP     ***
2006         dnl *****************************
2007         AC_MSG_CHECKING(for SOL_IP)
2008         AC_TRY_COMPILE([#include <netdb.h>], [
2009                 int level = SOL_IP;
2010         ], [
2011                 # Yes, we have it...
2012                 AC_MSG_RESULT(yes)
2013                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
2014         ], [
2015                 # We'll have to use getprotobyname
2016                 AC_MSG_RESULT(no)
2017         ])
2019         dnl *****************************
2020         dnl *** Checks for SOL_IPV6     ***
2021         dnl *****************************
2022         AC_MSG_CHECKING(for SOL_IPV6)
2023         AC_TRY_COMPILE([#include <netdb.h>], [
2024                 int level = SOL_IPV6;
2025         ], [
2026                 # Yes, we have it...
2027                 AC_MSG_RESULT(yes)
2028                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
2029         ], [
2030                 # We'll have to use getprotobyname
2031                 AC_MSG_RESULT(no)
2032         ])
2034         dnl *****************************
2035         dnl *** Checks for SOL_TCP    ***
2036         dnl *****************************
2037         AC_MSG_CHECKING(for SOL_TCP)
2038         AC_TRY_COMPILE([#include <netdb.h>], [
2039                 int level = SOL_TCP;
2040         ], [
2041                 # Yes, we have it...
2042                 AC_MSG_RESULT(yes)
2043                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
2044         ], [
2045                 # We'll have to use getprotobyname
2046                 AC_MSG_RESULT(no)
2047         ])
2049         dnl *****************************
2050         dnl *** Checks for IP_PKTINFO ***
2051         dnl *****************************
2052         AC_MSG_CHECKING(for IP_PKTINFO)
2053         AC_TRY_COMPILE([#include <linux/in.h>], [
2054                 int level = IP_PKTINFO;
2055         ], [
2056                 # Yes, we have it...
2057                 AC_MSG_RESULT(yes)
2058                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
2059         ], [
2060                 AC_MSG_RESULT(no)
2061         ])
2063         dnl *****************************
2064         dnl *** Checks for IPV6_PKTINFO ***
2065         dnl *****************************
2066         AC_MSG_CHECKING(for IPV6_PKTINFO)
2067         AC_TRY_COMPILE([#include <netdb.h>], [
2068                 int level = IPV6_PKTINFO;
2069         ], [
2070                 # Yes, we have it...
2071                 AC_MSG_RESULT(yes)
2072                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
2073         ], [
2074                 AC_MSG_RESULT(no)
2075         ])
2077         dnl **********************************
2078         dnl *** Checks for IP_DONTFRAG     ***
2079         dnl **********************************
2080         AC_MSG_CHECKING(for IP_DONTFRAG)
2081         AC_TRY_COMPILE([#include <netinet/in.h>], [
2082                 int level = IP_DONTFRAG;
2083         ], [
2084                 # Yes, we have it...
2085                 AC_MSG_RESULT(yes)
2086                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
2087         ], [
2088                 AC_MSG_RESULT(no)
2089         ])
2091         dnl **********************************
2092         dnl *** Checks for IP_DONTFRAGMENT ***
2093         dnl **********************************
2094         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
2095         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
2096                 int level = IP_DONTFRAGMENT;
2097         ], [
2098                 # Yes, we have it...
2099                 AC_MSG_RESULT(yes)
2100                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
2101         ], [
2102                 AC_MSG_RESULT(no)
2103         ])
2105         dnl **********************************
2106         dnl *** Checks for IP_MTU_DISCOVER ***
2107         dnl **********************************
2108         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
2109         AC_TRY_COMPILE([#include <linux/in.h>], [
2110                 int level = IP_MTU_DISCOVER;
2111         ], [
2112                 # Yes, we have it...
2113                 AC_MSG_RESULT(yes)
2114                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
2115         ], [
2116                 AC_MSG_RESULT(no)
2117         ])
2119         dnl **********************************
2120         dnl *** Checks for  IP_PMTUDISC_DO ***
2121         dnl **********************************
2122         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
2123         AC_TRY_COMPILE([#include <linux/in.h>], [
2124                 int level = IP_PMTUDISC_DO;
2125         ], [
2126                 # Yes, we have it...
2127                 AC_MSG_RESULT(yes)
2128                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
2129         ], [
2130                 AC_MSG_RESULT(no)
2131         ])
2133         dnl *********************************
2134         dnl *** Check for struct ip_mreqn ***
2135         dnl *********************************
2136         AC_MSG_CHECKING(for struct ip_mreqn)
2137         AC_TRY_COMPILE([#include <netinet/in.h>], [
2138                 struct ip_mreqn mreq;
2139                 mreq.imr_address.s_addr = 0;
2140         ], [
2141                 # Yes, we have it...
2142                 AC_MSG_RESULT(yes)
2143                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
2144         ], [
2145                 # We'll just have to try and use struct ip_mreq
2146                 AC_MSG_RESULT(no)
2147                 AC_MSG_CHECKING(for struct ip_mreq)
2148                 AC_TRY_COMPILE([#include <netinet/in.h>], [
2149                         struct ip_mreq mreq;
2150                         mreq.imr_interface.s_addr = 0;
2151                 ], [
2152                         # Yes, we have it...
2153                         AC_MSG_RESULT(yes)
2154                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
2155                 ], [
2156                         # No multicast support
2157                         AC_MSG_RESULT(no)
2158                 ])
2159         ])
2160         
2161         dnl **********************************
2162         dnl *** Check for getaddrinfo ***
2163         dnl **********************************
2164         AC_MSG_CHECKING(for getaddrinfo)
2165                 AC_TRY_LINK([
2166                 #include <stdio.h>
2167                 #include <netdb.h>
2168         ], [
2169                 getaddrinfo(NULL,NULL,NULL,NULL);
2170         ], [
2171                 # Yes, we have it...
2172                 AC_MSG_RESULT(yes)
2173                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2174         ], [
2175                 AC_MSG_RESULT(no)
2176         ])
2178         dnl **********************************
2179         dnl *** Check for gethostbyname2_r ***
2180         dnl **********************************
2181         AC_MSG_CHECKING(for gethostbyname2_r)
2182                 AC_TRY_LINK([
2183                 #include <stdio.h>
2184                 #include <netdb.h>
2185         ], [
2187                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
2188         ], [
2189                 # Yes, we have it...
2190                 AC_MSG_RESULT(yes)
2191                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
2192         ], [
2193                 AC_MSG_RESULT(no)
2194         ])
2196         dnl **********************************
2197         dnl *** Check for gethostbyname2 ***
2198         dnl **********************************
2199         AC_MSG_CHECKING(for gethostbyname2)
2200                 AC_TRY_LINK([
2201                 #include <stdio.h>
2202                 #include <netdb.h>
2203         ], [
2204                 gethostbyname2(NULL,0);
2205         ], [
2206                 # Yes, we have it...
2207                 AC_MSG_RESULT(yes)
2208                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
2209         ], [
2210                 AC_MSG_RESULT(no)
2211         ])
2213         dnl **********************************
2214         dnl *** Check for gethostbyname ***
2215         dnl **********************************
2216         AC_MSG_CHECKING(for gethostbyname)
2217                 AC_TRY_LINK([
2218                 #include <stdio.h>
2219                 #include <netdb.h>
2220         ], [
2221                 gethostbyname(NULL);
2222         ], [
2223                 # Yes, we have it...
2224                 AC_MSG_RESULT(yes)
2225                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2226         ], [
2227                 AC_MSG_RESULT(no)
2228         ])
2230         dnl **********************************
2231         dnl *** Check for getprotobyname ***
2232         dnl **********************************
2233         AC_MSG_CHECKING(for getprotobyname)
2234                 AC_TRY_LINK([
2235                 #include <stdio.h>
2236                 #include <netdb.h>
2237         ], [
2238                 getprotobyname(NULL);
2239         ], [
2240                 # Yes, we have it...
2241                 AC_MSG_RESULT(yes)
2242                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2243         ], [
2244                 AC_MSG_RESULT(no)
2245         ])
2247         dnl **********************************
2248         dnl *** Check for getnameinfo ***
2249         dnl **********************************
2250         AC_MSG_CHECKING(for getnameinfo)
2251                 AC_TRY_LINK([
2252                 #include <stdio.h>
2253                 #include <netdb.h>
2254         ], [
2255                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2256         ], [
2257                 # Yes, we have it...
2258                 AC_MSG_RESULT(yes)
2259                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2260         ], [
2261                 AC_MSG_RESULT(no)
2262         ])
2265         dnl **********************************
2266         dnl *** Check for inet_ntop ***
2267         dnl **********************************
2268         AC_MSG_CHECKING(for inet_ntop)
2269                 AC_TRY_LINK([
2270                 #include <stdio.h>
2271                 #include <arpa/inet.h>
2272         ], [
2273                 inet_ntop (0, NULL, NULL, 0);
2274         ], [
2275                 # Yes, we have it...
2276                 AC_MSG_RESULT(yes)
2277                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2278         ], [
2279                 AC_MSG_RESULT(no)
2280         ])
2282         dnl *****************************
2283         dnl *** Checks for libnsl     ***
2284         dnl *****************************
2285         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
2287         AC_CHECK_FUNCS(inet_pton inet_aton)
2289         dnl *****************************
2290         dnl *** Checks for libxnet    ***
2291         dnl *****************************
2292         case "${host}" in
2293                 *solaris* )
2294                         AC_MSG_CHECKING(for Solaris XPG4 support)
2295                         if test -f /usr/lib/libxnet.so; then
2296                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
2297                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
2298                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
2299                                 LIBS="$LIBS -lxnet"
2300                                 AC_MSG_RESULT(yes)
2301                         else
2302                                 AC_MSG_RESULT(no)
2303                         fi
2305                         if test "$GCC" = "yes"; then
2306                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
2307                         fi
2308                 ;;
2309         esac
2311         dnl *****************************
2312         dnl *** Checks for libpthread ***
2313         dnl *****************************
2314 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
2315 # and libpthread does not exist
2317         case "${host}" in
2318                 *-*-*haiku*)
2319                         dnl Haiku has pthread in libroot (libc equiv)
2320                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS")
2321                 ;;
2322                 *-*-*freebsd*)
2323                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2324                 ;;
2325                 *-*-*openbsd*)
2326                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2327                 ;;
2328                 *)
2329                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
2330                 ;;
2331         esac
2332         AC_CHECK_HEADERS(pthread.h)
2333         AC_CHECK_HEADERS(pthread_np.h)
2334         AC_CHECK_FUNCS(pthread_mutex_timedlock)
2335         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_setname_np pthread_cond_timedwait_relative_np)
2336         AC_CHECK_FUNCS(pthread_kill)
2337         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
2338         AC_TRY_COMPILE([ #include <pthread.h>], [
2339                 pthread_mutexattr_t attr;
2340                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
2341         ], [
2342                 AC_MSG_RESULT(ok)
2343         ], [
2344                 AC_MSG_RESULT(no)
2345                 AC_ERROR(Posix system lacks support for recursive mutexes)
2346         ])
2347         AC_CHECK_FUNCS(pthread_attr_setstacksize)
2348         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
2349         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
2351         dnl **********************************
2352         dnl *** Check for mincore ***
2353         dnl **********************************
2354         AC_MSG_CHECKING(for mincore)
2355                 AC_TRY_LINK([
2356                 #include <stdio.h>
2357                 #include <sys/types.h>
2358                 #include <sys/mman.h>
2359         ], [
2360                 mincore(NULL, 0, NULL);
2361         ], [
2362                 # Yes, we have it...
2363                 AC_MSG_RESULT(yes)
2364                 AC_DEFINE(HAVE_MINCORE, 1, [Have mincore])
2365         ], [
2366                 AC_MSG_RESULT(no)
2367         ])
2369         dnl ***********************************
2370         dnl *** Checks for working __thread ***
2371         dnl ***********************************
2372         AC_MSG_CHECKING(for working __thread)
2373         if test "x$with_tls" != "x__thread"; then
2374                 AC_MSG_RESULT(disabled)
2375         elif test "x$cross_compiling" = "xyes"; then
2376                 AC_MSG_RESULT(cross compiling, assuming yes)
2377         else
2378                 AC_TRY_RUN([
2379                         #if defined(__APPLE__) && defined(__clang__)
2380                         #error "__thread does not currently work with clang on Mac OS X"
2381                         #endif
2382                         
2383                         #include <pthread.h>
2384                         __thread int i;
2385                         static int res1, res2;
2387                         void thread_main (void *arg)
2388                         {
2389                                 i = arg;
2390                                 sleep (1);
2391                                 if (arg == 1)
2392                                         res1 = (i == arg);
2393                                 else
2394                                         res2 = (i == arg);
2395                         }
2397                         int main () {
2398                                 pthread_t t1, t2;
2400                                 i = 5;
2402                                 pthread_create (&t1, NULL, thread_main, 1);
2403                                 pthread_create (&t2, NULL, thread_main, 2);
2405                                 pthread_join (t1, NULL);
2406                                 pthread_join (t2, NULL);
2408                                 return !(res1 + res2 == 2);
2409                         }
2410                 ], [
2411                                 AC_MSG_RESULT(yes)
2412                 ], [
2413                                 AC_MSG_RESULT(no)
2414                                 with_tls=pthread
2415                 ])
2416         fi
2418         dnl **************************************
2419         dnl *** Checks for working sigaltstack ***
2420         dnl **************************************
2421         AC_MSG_CHECKING(for working sigaltstack)
2422         if test "x$with_sigaltstack" != "xyes"; then
2423                 AC_MSG_RESULT(disabled)
2424         elif test "x$cross_compiling" = "xyes"; then
2425                 AC_MSG_RESULT(cross compiling, assuming yes)
2426         else
2427                 AC_TRY_RUN([
2428                         #include <stdio.h>
2429                         #include <stdlib.h>
2430                         #include <unistd.h>
2431                         #include <signal.h>
2432                         #include <pthread.h>
2433                         #include <sys/wait.h>
2434                         #if defined(__FreeBSD__) || defined(__NetBSD__)
2435                         #define SA_STACK SA_ONSTACK
2436                         #endif
2437                         static void
2438                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
2439                         {
2440                                 exit (0);
2441                         }
2443                         volatile char*__ptr = NULL;
2444                         static void *
2445                         loop (void *ignored)
2446                         {
2447                                 *__ptr = 0;
2448                                 return NULL;
2449                         }
2451                         static void
2452                         child ()
2453                         {
2454                                 struct sigaction sa;
2455                                 stack_t sas;
2456                                 pthread_t id;
2457                                 pthread_attr_t attr;
2459                                 sa.sa_sigaction = sigsegv_signal_handler;
2460                                 sigemptyset (&sa.sa_mask);
2461                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
2462                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
2463                                         perror ("sigaction");
2464                                         return;
2465                                 }
2467                                 /* x86 darwin deliver segfaults using SIGBUS */
2468                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
2469                                         perror ("sigaction");
2470                                         return;
2471                                 }
2472                                 sas.ss_sp = malloc (SIGSTKSZ);
2473                                 sas.ss_size = SIGSTKSZ;
2474                                 sas.ss_flags = 0;
2475                                 if (sigaltstack (&sas, NULL) == -1) {
2476                                         perror ("sigaltstack");
2477                                         return;
2478                                 }
2480                                 pthread_attr_init (&attr);
2481                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
2482                                         printf ("pthread_create\n");
2483                                         return;
2484                                 }
2486                                 sleep (100);
2487                         }
2489                         int
2490                         main ()
2491                         {
2492                                 pid_t son;
2493                                 int status;
2494                                 int i;
2496                                 son = fork ();
2497                                 if (son == -1) {
2498                                         return 1;
2499                                 }
2501                                 if (son == 0) {
2502                                         child ();
2503                                         return 0;
2504                                 }
2506                                 for (i = 0; i < 300; ++i) {
2507                                         waitpid (son, &status, WNOHANG);
2508                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
2509                                                 return 0;
2510                                         usleep (10000);
2511                                 }
2513                                 kill (son, SIGKILL);
2514                                 return 1;
2515                         }
2517                 ], [
2518                                 AC_MSG_RESULT(yes)
2519                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
2520                 ], [
2521                                 with_sigaltstack=no
2522                                 AC_MSG_RESULT(no)
2523                 ])
2524         fi
2526         dnl ********************************
2527         dnl *** Checks for semaphore lib ***
2528         dnl ********************************
2529         # 'Real Time' functions on Solaris
2530         # posix4 on Solaris 2.6
2531         # pthread (first!) on Linux
2532         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
2534         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
2535         AC_CHECK_FUNCS(shm_open)
2537         dnl ********************************
2538         dnl *** Checks for timezone stuff **
2539         dnl ********************************
2540         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
2541                 AC_TRY_COMPILE([
2542                         #include <time.h>
2543                         ], [
2544                         struct tm tm;
2545                         tm.tm_gmtoff = 1;
2546                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
2547         if test $ac_cv_struct_tm_gmtoff = yes; then
2548                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
2549         else
2550                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
2551                         AC_TRY_COMPILE([
2552                                 #include <time.h>
2553                         ], [
2554                                 timezone = 1;
2555                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
2556                 if test $ac_cv_var_timezone = yes; then
2557                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
2558                 else
2559                         AC_ERROR(unable to find a way to determine timezone)
2560                 fi
2561         fi
2563         dnl *********************************
2564         dnl *** Checks for math functions ***
2565         dnl *********************************
2566         AC_SEARCH_LIBS(sqrtf, m)
2567         if test "x$has_broken_apple_cpp" != "xyes"; then
2568                 AC_CHECK_FUNCS(finite, , AC_MSG_CHECKING(for finite in math.h)
2569                         AC_TRY_LINK([#include <math.h>], 
2570                         [ finite(0.0); ], 
2571                         AC_DEFINE(HAVE_FINITE, 1, [Have finite in -lm]) AC_MSG_RESULT(yes),
2572                         AC_MSG_RESULT(no)))
2573         fi
2574         AC_CHECK_FUNCS(isfinite, , AC_MSG_CHECKING(for isfinite in math.h)
2575                 AC_TRY_LINK([#include <math.h>], 
2576                 [ isfinite(0.0); ], 
2577                 AC_DEFINE(HAVE_ISFINITE, 1, [Have isfinite]) AC_MSG_RESULT(yes),
2578                 AC_MSG_RESULT(no)))
2580         dnl ****************************************************************
2581         dnl *** Checks for working poll() (macosx defines it but doesn't ***
2582         dnl *** have it in the library (duh))                            ***
2583         dnl ****************************************************************
2584         AC_CHECK_FUNCS(poll)
2586         dnl *************************
2587         dnl *** Check for signbit ***
2588         dnl *************************
2589         AC_MSG_CHECKING(for signbit)
2590         AC_TRY_LINK([#include <math.h>], [
2591                 int s = signbit(1.0);
2592         ], [
2593                 AC_MSG_RESULT(yes)
2594                 AC_DEFINE(HAVE_SIGNBIT, 1, [Have signbit])
2595         ], [
2596                 AC_MSG_RESULT(no)
2597         ]) 
2599         dnl **********************************
2600         dnl *** epoll                      ***
2601         dnl **********************************
2602         AC_CHECK_HEADERS(sys/epoll.h)
2603         haveepoll=no
2604         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
2605         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
2606                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
2607         fi
2609         havekqueue=no
2611         AC_CHECK_HEADERS(sys/event.h)
2612         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
2614         dnl **************************************
2615         dnl * Darwin has a race that prevents us from using reliably:
2616         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
2617         dnl * Since kqueue is mostly used for scaling large web servers, 
2618         dnl * and very few folks run Mono on large web servers on OSX, falling
2619         dnl * back 
2620         dnl **************************************
2621         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
2622                 if test "x$host_darwin" = "xno"; then
2623                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
2624                 fi
2625         fi
2627         dnl ******************************
2628         dnl *** Checks for SIOCGIFCONF ***
2629         dnl ******************************
2630         AC_CHECK_HEADERS(sys/ioctl.h)
2631         AC_CHECK_HEADERS(net/if.h, [], [],
2632            [
2633            #ifdef HAVE_SYS_TYPES_H
2634            # include <sys/types.h>
2635            #endif
2636            #ifdef HAVE_SYS_SOCKET_H
2637            # include <sys/socket.h>
2638            #endif
2639            ])
2640         AC_MSG_CHECKING(for ifreq)
2641         AC_TRY_COMPILE([
2642                 #include <stdio.h>
2643                 #include <sys/ioctl.h>
2644                 #include <net/if.h>
2645                 ], [
2646                 struct ifconf ifc;
2647                 struct ifreq *ifr;
2648                 void *x;
2649                 ifc.ifc_len = 0;
2650                 ifc.ifc_buf = NULL;
2651                 x = (void *) &ifr->ifr_addr;
2652                 ],[
2653                         AC_MSG_RESULT(yes)
2654                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
2655                 ], [
2656                         AC_MSG_RESULT(no)
2657                 ])
2658         dnl **********************************
2659         dnl ***     Checks for sin_len     ***
2660         dnl **********************************
2661         AC_MSG_CHECKING(for sockaddr_in.sin_len)
2662         AC_TRY_COMPILE([
2663                 #include <netinet/in.h>
2664                 ], [
2665                 struct sockaddr_in saddr;
2666                 saddr.sin_len = sizeof (saddr);
2667                 ],[
2668                         AC_MSG_RESULT(yes)
2669                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
2670                 ], [
2671                         AC_MSG_RESULT(no)
2672                 ])      
2673         dnl **********************************
2674         dnl ***    Checks for sin6_len     ***
2675         dnl **********************************
2676         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
2677         AC_TRY_COMPILE([
2678                 #include <netinet/in.h>
2679                 ], [
2680                 struct sockaddr_in6 saddr6;
2681                 saddr6.sin6_len = sizeof (saddr6);
2682                 ],[
2683                         AC_MSG_RESULT(yes)
2684                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
2685                 ], [
2686                         AC_MSG_RESULT(no)
2687                 ])
2688         dnl **********************************
2689         dnl *** Check for getifaddrs       ***
2690         dnl **********************************
2691         AC_MSG_CHECKING(for getifaddrs)
2692                 AC_TRY_LINK([
2693                 #include <stdio.h>
2694                 #include <sys/types.h>
2695                 #include <sys/socket.h>
2696                 #include <ifaddrs.h>
2697         ], [
2698                 getifaddrs(NULL);
2699         ], [
2700                 # Yes, we have it...
2701                 AC_MSG_RESULT(yes)
2702                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
2703         ], [
2704                 AC_MSG_RESULT(no)
2705         ])
2706         dnl **********************************
2707         dnl *** Check for if_nametoindex   ***
2708         dnl **********************************
2709         AC_MSG_CHECKING(for if_nametoindex)
2710                 AC_TRY_LINK([
2711                 #include <stdio.h>
2712                 #include <sys/types.h>
2713                 #include <sys/socket.h>
2714                 #include <net/if.h>
2715         ], [
2716                 if_nametoindex(NULL);
2717         ], [
2718                 # Yes, we have it...
2719                 AC_MSG_RESULT(yes)
2720                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
2721         ], [
2722                 AC_MSG_RESULT(no)
2723         ])
2724         dnl **********************************
2725         dnl *** Check for access ***
2726         dnl **********************************
2727         AC_MSG_CHECKING(for access)
2728                 AC_TRY_LINK([
2729                 #include <unistd.h>
2730         ], [
2731                 access(NULL,0);
2732         ], [
2733                 # Yes, we have it...
2734                 AC_MSG_RESULT(yes)
2735                 AC_DEFINE(HAVE_ACCESS, 1, [Have access])
2736         ], [
2737                 AC_MSG_RESULT(no)
2738         ])
2739                         
2740         dnl **********************************
2741         dnl *** Checks for proclib         ***
2742         dnl **********************************
2743         AC_CHECK_HEADER(sys/errno.h, [AC_DEFINE(HAVE_SYS_ERRNO_H, 1, Define to 1 if you have the <sys/errno.h> header file.)])
2744         dnl **********************************
2745         dnl *** Checks for MonoPosixHelper ***
2746         dnl **********************************
2747         AC_CHECK_HEADERS(checklist.h)
2748         AC_CHECK_HEADERS(pathconf.h)
2749         AC_CHECK_HEADERS(fstab.h)
2750         AC_CHECK_HEADERS(attr/xattr.h)
2751         AC_CHECK_HEADERS(sys/extattr.h)
2752         AC_CHECK_HEADERS(sys/sendfile.h)
2753         AC_CHECK_HEADERS(sys/statvfs.h)
2754         AC_CHECK_HEADERS(sys/statfs.h)
2755         AC_CHECK_HEADERS(sys/vfstab.h)
2756         AC_CHECK_HEADERS(sys/xattr.h)
2757         AC_CHECK_HEADERS(sys/mman.h)
2758         AC_CHECK_HEADERS(sys/param.h)
2759         AC_CHECK_HEADERS(sys/mount.h, [], [],
2760                 [
2761                 #ifdef HAVE_SYS_PARAM_H
2762                 # include <sys/param.h>
2763                 #endif
2764                 ])
2765         AC_CHECK_HEADERS(sys/mount.h)
2766         AC_CHECK_FUNCS(confstr)
2767         AC_CHECK_FUNCS(seekdir telldir)
2768         AC_CHECK_FUNCS(getdomainname)
2769         AC_CHECK_FUNCS(setdomainname)
2770         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
2771         AC_CHECK_FUNCS(setgroups)
2772         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
2773         AC_CHECK_FUNCS(getfsstat)
2774         AC_CHECK_FUNCS(lutimes futimes)
2775         AC_CHECK_FUNCS(mremap)
2776         AC_CHECK_FUNCS(remap_file_pages)
2777         AC_CHECK_FUNCS(posix_fadvise)
2778         AC_CHECK_FUNCS(posix_fallocate)
2779         AC_CHECK_FUNCS(posix_madvise)
2780         AC_CHECK_FUNCS(vsnprintf)
2781         AC_CHECK_FUNCS(sendfile)
2782         AC_CHECK_FUNCS(gethostid sethostid)
2783         AC_CHECK_FUNCS(sethostname)
2784         AC_CHECK_FUNCS(statfs)
2785         AC_CHECK_FUNCS(fstatfs)
2786         AC_CHECK_FUNCS(statvfs)
2787         AC_CHECK_FUNCS(fstatvfs)
2788         AC_CHECK_FUNCS(stime)
2789         AC_CHECK_FUNCS(ttyname_r)
2790         AC_CHECK_FUNCS(psignal)
2791         AC_CHECK_FUNCS(getlogin_r)
2792         AC_CHECK_FUNCS(lockf)
2793         AC_CHECK_FUNCS(swab)
2794         AC_CHECK_FUNCS(setusershell endusershell)
2795         AC_CHECK_FUNCS(futimens utimensat)
2796         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
2797         AC_CHECK_FUNCS(readv writev preadv pwritev)
2798         AC_CHECK_FUNCS(setpgid)
2799         AC_CHECK_FUNCS(system)
2800         AC_CHECK_FUNCS(fork execv execve)
2801         AC_CHECK_FUNCS(accept4)
2802         AC_CHECK_FUNCS(localtime_r)
2803         AC_CHECK_FUNCS(mkdtemp)
2804         AC_CHECK_SIZEOF(size_t)
2805         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
2806                 [#include <sys/types.h>
2807                  #include <sys/stat.h>
2808                  #include <unistd.h>])
2809         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
2810                 [#include <sys/types.h>
2811                  #include <sys/stat.h>
2812                  #include <unistd.h>])
2813         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
2814                 [#include <sys/time.h>])
2815         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
2816                 [#include <sys/socket.h>])
2817         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
2818                 [#include <unistd.h>
2819                  #include <fcntl.h>])
2820         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
2821                 [#include <sys/uio.h>])
2822         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
2823                 [#include <sys/socket.h>])
2824         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
2825                 [#include <sys/poll.h>])
2826         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
2827                 [#include <sys/socket.h>])
2828         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
2829                 [#include <sys/socket.h>])
2830         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
2831                 [#include <netinet/in.h>])
2832         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
2833                 [#include <netinet/in.h>])
2834         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
2835                 [#include <sys/un.h>])
2836         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
2837                 [#include <sys/types.h>
2838                  #include <sys/stat.h>
2839                  #include <unistd.h>])
2840         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
2841                 [#include <time.h>])
2842         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
2843                 [#include <sys/time.h>
2844                  #include <sys/types.h>
2845                  #include <utime.h>])
2846         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
2847                 [#include <sys/time.h>])
2848         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
2849                 [#include <sys/types.h>
2850                  #include <utime.h>])
2851         AC_CHECK_MEMBERS(
2852                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
2853                 [#include <sys/types.h>
2854                  #include <dirent.h>])
2855         AC_CHECK_MEMBERS(
2856                 [struct passwd.pw_gecos],,, 
2857                 [#include <sys/types.h>
2858                  #include <pwd.h>])
2859         AC_CHECK_MEMBERS(
2860                 [struct statfs.f_flags],,, 
2861                 [#include <sys/types.h>
2862                  #include <sys/vfs.h>])
2863         AC_CHECK_MEMBERS(
2864                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
2865                 [#include <sys/types.h>
2866                  #include <sys/stat.h>
2867                  #include <unistd.h>])
2869         dnl Favour xattr through glibc, but use libattr if we have to
2870         AC_CHECK_FUNC(lsetxattr, ,
2871                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
2872         )
2873         AC_SUBST(XATTR_LIB)
2875         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
2876         AC_CHECK_MEMBERS(
2877                 [struct kinfo_proc.kp_proc],,, 
2878                 [#include <sys/types.h>
2879                  #include <sys/param.h>
2880                  #include <sys/sysctl.h>
2881                  #include <sys/proc.h>
2882                  ])
2884         dnl *********************************
2885         dnl *** Checks for Windows compilation ***
2886         dnl *********************************
2887         AC_CHECK_HEADERS(sys/time.h)
2888         AC_CHECK_HEADERS(sys/param.h)
2889         AC_CHECK_HEADERS(dirent.h)
2891         dnl ******************************************
2892         dnl *** Checks for OSX and iOS compilation ***
2893         dnl ******************************************
2894         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
2896         dnl *********************************
2897         dnl *** Check for Console 2.0 I/O ***
2898         dnl *********************************
2899         AC_CHECK_HEADERS([curses.h])
2900         AC_CHECK_HEADERS([term.h], [], [],
2901         [#if HAVE_CURSES_H
2902          #include <curses.h>
2903          #endif
2904         ])
2905         AC_CHECK_HEADERS([termios.h])
2907         dnl *********************************
2908         dnl *** Checks for random         ***
2909         dnl *********************************
2910         if test x$host_darwin = xno; then
2911                 AC_CHECK_HEADERS(sys/random.h)
2912                 AC_CHECK_FUNCS(getrandom getentropy)
2913         fi
2915         dnl *********************************
2916         dnl *** Checks for System.Native  ***
2917         dnl *********************************
2919         AC_MSG_CHECKING(for linux/in.h)
2920         AC_TRY_COMPILE([
2921                 #include <sys/socket.h>
2922                 #include <linux/in.h>
2923         ], [
2924         ],[
2925                 AC_MSG_RESULT(yes)
2926                 AC_DEFINE(HAVE_LINUX_IN_H, 1, [linux/in.h])
2927         ], [
2928                 AC_MSG_RESULT(no)
2929         ])
2931         AC_MSG_CHECKING(for struct in_pktinfo)
2932         AC_TRY_COMPILE([
2933                 #ifdef HAVE_LINUX_IN_H
2934                 #include <sys/socket.h>
2935                 #include <linux/in.h>
2936                 #else
2937                 #include <netinet/in.h>
2938                 #endif
2939         ], [
2940                 struct in_pktinfo pktinfo;
2941         ],[
2942                 AC_MSG_RESULT(yes)
2943                 AC_DEFINE(HAVE_IN_PKTINFO, 1, [struct in_pktinfo])
2944         ], [
2945                 AC_MSG_RESULT(no)
2946         ])
2948         AC_MSG_CHECKING(for struct ip_mreqn)
2949         AC_TRY_COMPILE([
2950                 #if HAVE_LINUX_IN_H
2951                 #include <sys/socket.h>
2952                 #include <linux/in.h>
2953                 #else
2954                 #include <netinet/in.h>
2955                 #endif
2956         ], [
2957                 struct ip_mreqn mreqn;
2958         ],[
2959                 AC_MSG_RESULT(yes)
2960                 AC_DEFINE(HAVE_IP_MREQN, 1, struct ip_mreqn)
2961         ], [
2962                 AC_MSG_RESULT(no)
2963         ])
2965         if test x$host_darwin = xno; then
2966                 AC_MSG_CHECKING(for struct flock64)
2967                 AC_TRY_COMPILE([
2968                         #include <fcntl.h>
2969                 ], [
2970                         struct flock64;
2971                 ],[
2972                         AC_MSG_RESULT(yes)
2973                         AC_DEFINE(HAVE_FLOCK64, 1, struct flock64)
2974                 ], [
2975                         AC_MSG_RESULT(no)
2976                 ])
2977         fi
2979         AC_CHECK_FUNC(lseek64,           [AC_DEFINE(HAVE_LSEEK64, 1, [lseek64])])
2980         AC_CHECK_FUNC(mmap64,            [AC_DEFINE(HAVE_MMAP64, 1, [mmap64])])
2981         AC_CHECK_FUNC(ftruncate64,       [AC_DEFINE(HAVE_FTRUNCATE64, 1, [ftruncate64])])
2982         AC_CHECK_FUNC(posix_fadvise64,   [AC_DEFINE(HAVE_POSIX_FADVISE64, 1, [posix_fadvise64])])
2983         AC_CHECK_FUNC(stat64,            [AC_DEFINE(HAVE_STAT64, 1, [stat64])])
2984         AC_CHECK_DECL(pipe2,             [AC_DEFINE(HAVE_PIPE2, 1, [pipe2])])
2985         AC_CHECK_FUNC(getmntinfo,        [AC_DEFINE(HAVE_GETMNTINFO, 1, [getmntinfo])], [], [[#include <unistd.h>]])
2986         AC_CHECK_FUNC(strcpy_s,          [AC_DEFINE(HAVE_STRCPY_S, 1, [strcpy_s])])
2987         AC_CHECK_FUNC(strlcpy,           [AC_DEFINE(HAVE_STRLCPY, 1, [strlcpy])])
2988         AC_CHECK_FUNC(posix_fadvise,     [AC_DEFINE(HAVE_POSIX_FADVISE, 1, [posix_fadvise])])
2989         AC_CHECK_FUNC(ioctl,             [AC_DEFINE(HAVE_IOCTL, 1, [ioctl])])
2990         AC_CHECK_FUNC(sched_getaffinity, [AC_DEFINE(HAVE_SCHED_GETAFFINITY, 1, [sched_getaffinity])])
2991         AC_CHECK_FUNC(sched_setaffinity, [AC_DEFINE(HAVE_SCHED_SETAFFINITY, 1, [sched_setaffinity])])
2992         AC_CHECK_DECL(TIOCGWINSZ,        [AC_DEFINE(HAVE_TIOCGWINSZ, 1, [TIOCGWINSZ])], [], [[#include <sys/ioctl.h>]])
2993         AC_CHECK_FUNC(tcgetattr,         [AC_DEFINE(HAVE_TCGETATTR, 1, [tcgetattr])])
2994         AC_CHECK_FUNC(tcsetattr,         [AC_DEFINE(HAVE_TCSETATTR, 1, [tcsetattr])])
2995         AC_CHECK_FUNC(arc4random,        [AC_DEFINE(HAVE_ARC4RANDOM, 1, [arc4random])])
2996         AC_CHECK_DECL(ECHO,              [AC_DEFINE(HAVE_ECHO, 1, [ECHO])], [], [[#include <termios.h>]])
2997         AC_CHECK_DECL(ICANON,            [AC_DEFINE(HAVE_ICANON, 1, [ICANON])], [], [[#include <termios.h>]])
2998         AC_CHECK_DECL(TCSANOW,           [AC_DEFINE(HAVE_TCSANOW, 1, [TCSANOW])], [], [[#include <termios.h>]])
3000         AC_CHECK_DECL(O_CLOEXEC,         [AC_DEFINE(HAVE_O_CLOEXEC, 1, [O_CLOEXEC])], [], [[#include <fcntl.h>]])
3001         AC_CHECK_DECL(F_DUPFD_CLOEXEC,   [AC_DEFINE(HAVE_F_DUPFD_CLOEXEC, 1, [F_DUPFD_CLOEXEC])], [], [[#include <fcntl.h>]])
3003         AC_CHECK_MEMBER(struct stat.st_birthtimespec, [AC_DEFINE(HAVE_STAT_BIRTHTIME, 1, [struct stat.st_birthtime])], [], [[#include <sys/types.h>], [#include <sys/stat.h>]])
3004         AC_CHECK_MEMBER(struct stat.st_atimespec,     [AC_DEFINE(HAVE_STAT_TIMESPEC, 1, [struct stat.st_atimespec])], [], [[#include <sys/types.h>], [#include <sys/stat.h>]])
3005         AC_CHECK_MEMBER(struct stat.st_atim,          [AC_DEFINE(HAVE_STAT_TIM, 1, [struct stat.st_atim])], [], [[#include <sys/types.h>], [#include <sys/stat.h>]])
3006         AC_CHECK_MEMBER(struct stat.st_atimensec,     [AC_DEFINE(HAVE_STAT_NSEC, 1, [struct stat.st_atimensec])], [], [[#include <sys/types.h>], [#include <sys/stat.h>]])
3007         AC_CHECK_MEMBER(struct dirent.d_namlen,       [AC_DEFINE(HAVE_DIRENT_NAME_LEN, 1, [struct dirent.d_namlen])], [], [[#include <dirent.h>]])
3008         AC_CHECK_MEMBER(struct statfs.f_fstypename,   [AC_DEFINE(HAVE_STATFS_FSTYPENAME, 1, [struct statfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3009         AC_CHECK_MEMBER(struct statvfs.f_fstypename,  [AC_DEFINE(HAVE_STATVFS_FSTYPENAME, 1, [struct statvfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3011         AC_MSG_CHECKING(for struct statfs)
3012         AC_TRY_COMPILE([
3013                 #if defined(HAVE_STATFS_FSTYPENAME) || defined(HAVE_STATVFS_FSTYPENAME)
3014                 #include <sys/mount.h>
3015                 #else
3016                 #include <sys/statfs.h>
3017                 #endif
3018         ], [
3019                 struct statfs;
3020         ],[
3021                 AC_MSG_RESULT(yes)
3022                 AC_DEFINE(HAVE_STATFS, 1, [struct statfs])
3023         ], [
3024                 AC_MSG_RESULT(no)
3025         ])
3027         if test "x$ac_cv_func_strerror_r_char_p" = "xyes" ; then
3028                 AC_DEFINE(HAVE_GNU_STRERROR_R, 1, [char* strerror(int errnum, char *buf, size_t buflen)])
3029         fi
3031         AC_MSG_CHECKING(for readdir_r)
3032         AC_TRY_COMPILE([
3033                 #include <dirent.h>
3034         ], [
3035                 DIR* dir;
3036                 struct dirent* entry;
3037                 struct dirent* result;
3038                 readdir_r(dir, entry, &result);
3039         ],[
3040                 AC_MSG_RESULT(yes)
3041                 AC_DEFINE(HAVE_READDIR_R, 1, [readdir_r])
3042         ], [
3043                 AC_MSG_RESULT(no)
3044         ])
3046         AC_MSG_CHECKING(for kevent with void *data)
3047         AC_TRY_COMPILE([
3048                 #include <sys/types.h>
3049                 #include <sys/event.h>
3050         ], [
3051                 struct kevent event;
3052                 void* data;
3053                 EV_SET(&event, 0, EVFILT_READ, 0, 0, 0, data);
3054         ],[
3055                 AC_MSG_RESULT(yes)
3056                 AC_DEFINE(KEVENT_HAS_VOID_UDATA, 1, [kevent with void *data])
3057         ], [
3058                 AC_MSG_RESULT(no)
3059         ])
3061         AC_CHECK_MEMBER(struct fd_set.fds_bits,   [AC_DEFINE(HAVE_FDS_BITS, 1, [struct fd_set.fds_bits])], [], [[#include <sys/select.h>]])
3062         AC_CHECK_MEMBER(struct fd_set.__fds_bits, [AC_DEFINE(HAVE_PRIVATE_FDS_BITS, 1, [struct fd_set.__fds_bits])], [], [[#include <sys/select.h>]])
3064         AC_MSG_CHECKING(for sendfile with 4 arguments)
3065         AC_TRY_COMPILE([
3066                 #include <sys/sendfile.h>
3067         ], [
3068                 int result = sendfile(0, 0, 0, 0);
3069         ],[
3070                 AC_MSG_RESULT(yes)
3071                 AC_DEFINE(HAVE_SENDFILE_4, 1, [sendfile with 4 arguments])
3072         ], [
3073                 AC_MSG_RESULT(no)
3074         ])
3076         AC_MSG_CHECKING(for sendfile with 6 arguments)
3077         AC_TRY_LINK([
3078                 #include <stdlib.h>
3079                 #include <sys/types.h>
3080                 #include <sys/socket.h>
3081                 #include <sys/uio.h>
3082         ], [
3083                 int result = sendfile(0, 0, 0, NULL, NULL, 0);
3084         ],[
3085                 AC_MSG_RESULT(yes)
3086                 AC_DEFINE(HAVE_SENDFILE_6, 1, [sendfile with 6 arguments])
3087         ], [
3088                 AC_MSG_RESULT(no)
3089         ])
3091         AC_CHECK_FUNC(fcopyfile,     [AC_DEFINE(HAVE_FCOPYFILE, 1, [fcopyfile])])
3092         AC_CHECK_FUNC(epoll_create1, [AC_DEFINE(HAVE_EPOLL, 1, [epoll_create1])])
3093         AC_CHECK_FUNC(accept4,       [AC_DEFINE(HAVE_ACCEPT4, 1, [accept4])])
3094         AC_CHECK_FUNC(kqueue,        [AC_DEFINE(HAVE_KQUEUE, 1, [kqueue])])
3096         ORIG_CFLAGS="$CFLAGS"
3097         CFLAGS="-Werror -Wsign-conversion"
3099         AC_MSG_CHECKING(for getnameinfo with signed flags)
3100         AC_TRY_COMPILE([
3101                 #include <sys/types.h>
3102                 #include <netdb.h>
3103         ], [
3104                 const struct sockaddr *addr;
3105                 socklen_t addrlen;
3106                 char *host;
3107                 socklen_t hostlen;
3108                 char *serv;
3109                 socklen_t servlen;
3110                 int flags;
3111                 int result = getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags);
3112         ],[
3113                 AC_MSG_RESULT(yes)
3114                 AC_DEFINE(HAVE_GETNAMEINFO_SIGNED_FLAGS, 1, [getnameinfo with signed flags])
3115         ], [
3116                 AC_MSG_RESULT(no)
3117         ])
3119         CFLAGS="$ORIG_CFLAGS"
3121         if test "x$host_linux" = "xyes"; then
3122                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 1, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3123         else
3124                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 0, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3125         fi
3127         ORIG_CFLAGS="$CFLAGS"
3128         CFLAGS="-Werror -Wsign-conversion"
3130         AC_MSG_CHECKING(for bind with unsigned addrlen)
3131         AC_TRY_COMPILE([
3132                 #include <sys/socket.h>
3133         ], [
3134                 int fd;
3135                 struct sockaddr* addr;
3136                 socklen_t addrLen;
3137                 bind(fd, addr, addrLen);
3138         ],[
3139                 AC_MSG_RESULT(yes)
3140                 AC_DEFINE(BIND_ADDRLEN_UNSIGNED, 1, [bind with unsigned addrlen])
3141         ], [
3142                 AC_MSG_RESULT(no)
3143         ])
3145         AC_MSG_CHECKING(for struct ipv6_mreq with unsigned ipv6mr_interface)
3146         AC_TRY_COMPILE([
3147                 #include <netinet/in.h>
3148                 #include <netinet/tcp.h>
3149         ], [
3150                 struct ipv6_mreq opt;
3151                 unsigned int index = 0;
3152                 opt.ipv6mr_interface = index;
3153         ],[
3154                 AC_MSG_RESULT(yes)
3155                 AC_DEFINE(IPV6MR_INTERFACE_UNSIGNED, 1, [struct ipv6_mreq with unsigned ipv6mr_interface])
3156         ], [
3157                 AC_MSG_RESULT(no)
3158         ])
3160         AC_MSG_CHECKING(for inotify_rm_watch with unsigned wd)
3161         AC_TRY_COMPILE([
3162                 #include <sys/inotify.h>
3163         ], [
3164                 intptr_t fd;
3165                 uint32_t wd;
3166                 int result = inotify_rm_watch(fd, wd);
3167         ],[
3168                 AC_MSG_RESULT(yes)
3169                 AC_DEFINE(INOTIFY_RM_WATCH_WD_UNSIGNED, 1, [inotify_rm_watch with unsigned wd])
3170         ], [
3171                 AC_MSG_RESULT(no)
3172         ])
3174         CFLAGS="$ORIG_CFLAGS"
3176         AC_MSG_CHECKING(for shm_open that works well enough with mmap)
3177         if test "x$ac_cv_func_shm_open" = "xno" -o "x$ac_cv_func_shm_open_working_with_mmap" = "xno" ; then
3178                 AC_MSG_RESULT(no)
3179         else
3180                 AC_TRY_RUN([
3181                         #include <sys/mman.h>
3182                         #include <fcntl.h>
3183                         #include <unistd.h>
3185                         int main ()
3186                         {
3187                                 int fd = shm_open("/mono_configure_shm_open", O_CREAT | O_RDWR, 0777);
3188                                 if (fd == -1)
3189                                         return -1;
3191                                 shm_unlink("/mono_configure_shm_open");
3193                                 // NOTE: PROT_EXEC and MAP_PRIVATE don't work well with shm_open
3194                                 //       on at least the current version of Mac OS X
3196                                 if (mmap(NULL, 1, PROT_EXEC, MAP_PRIVATE, fd, 0) == MAP_FAILED)
3197                                         return -1;
3199                                 return 0;
3200                         }
3201                 ],[
3202                         AC_MSG_RESULT(yes)
3203                         AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3204                 ], [
3205                         AC_MSG_RESULT(no)
3206                 ])
3207         fi
3209         AC_MSG_CHECKING(for getpriority with int who)
3210         AC_TRY_COMPILE([
3211                 #include <sys/resource.h>
3212         ], [
3213                 int which;
3214                 int who;
3215                 int result = getpriority(which, who);
3216         ],[
3217                 AC_MSG_RESULT(yes)
3218                 AC_DEFINE(PRIORITY_REQUIRES_INT_WHO, 1, [getpriority with int who])
3219         ], [
3220                 AC_MSG_RESULT(no)
3221         ])
3223         AC_MSG_CHECKING(for kevent with int parameters)
3224         AC_TRY_COMPILE([
3225                 #include <sys/types.h>
3226                 #include <sys/event.h>
3227         ], [
3228                 int kg;
3229                 const struct kevent* chagelist;
3230                 int nchanges;
3231                 struct kevent* eventlist;
3232                 int nevents;
3233                 const struct timespec* timeout;
3234                 int result = kevent(kg, chagelist, nchanges, eventlist, nevents, timeout);
3235         ],[
3236                 AC_MSG_RESULT(yes)
3237                 AC_DEFINE(KEVENT_REQUIRES_INT_PARAMS, 1, [kevent with int parameters])
3238         ], [
3239                 AC_MSG_RESULT(no)
3240         ])
3242         ORIG_CFLAGS="$CFLAGS"
3243         CFLAGS="-Werror -Wimplicit-function-declaration"
3245         AC_MSG_CHECKING(for mkstemps)
3246         AC_TRY_COMPILE([
3247                 #include <stdlib.h>
3248                 #include <unistd.h>
3249                 #include <string.h>
3250         ], [
3251                 char *template;
3252                 int suffixlen;
3253                 int result = mkstemps(template, suffixlen);
3254         ],[
3255                 AC_MSG_RESULT(yes)
3256                 AC_DEFINE(HAVE_MKSTEMPS, 1, [mkstemps])
3257                 have_mkstemps=yes
3258         ], [
3259                 AC_MSG_RESULT(no)
3260         ])
3262         CFLAGS="$ORIG_CFLAGS"
3264         if test "x$have_mkstemps" != "xyes" -a "x$ac_cv_func_mkstemp" != "xyes"; then
3265                 AC_MSG_ERROR([Cannot find mkstemps or mkstemp on this platform])
3266         fi
3268         AC_MSG_CHECKING(for tcp/var.h)
3269         AC_TRY_COMPILE([
3270                 #include <sys/types.h>
3271                 #include <sys/socketvar.h>
3272                 #include <netinet/ip.h>
3273                 #include <netinet/tcp.h>
3274                 #include <netinet/tcp_var.h>
3275         ], [
3276         ],[
3277                 AC_MSG_RESULT(yes)
3278                 AC_DEFINE(HAVE_TCP_VAR_H, 1, [tcp/var.h])
3279         ], [
3280                 AC_MSG_RESULT(no)
3281         ])
3283         AC_CHECK_HEADERS([sys/cdefs.h])
3285         AC_MSG_CHECKING(for TCPSTATE enum in netinet/tcp.h)
3286         AC_TRY_COMPILE([
3287                 #ifdef HAVE_SYS_CDEFS_H
3288                 #include <sys/cdefs.h>
3289                 #endif
3290                 #include <netinet/tcp.h>
3291         ], [
3292                 int result = TCP_ESTABLISHED;
3293         ],[
3294                 AC_MSG_RESULT(yes)
3295                 AC_DEFINE(HAVE_TCP_H_TCPSTATE_ENUM, 1, [TCPSTATE enum in netinet/tcp.h])
3296         ], [
3297                 AC_MSG_RESULT(no)
3298         ])
3300         AC_CHECK_DECL(TCPS_ESTABLISHED, [AC_DEFINE(HAVE_TCP_FSM_H, 1, [HAVE_TCP_FSM_H])], [], [[#include <netinet/tcp_fsm.h>]])
3302         AC_MSG_CHECKING(for struct rt_msghdr)
3303         AC_TRY_COMPILE([
3304                 #include <sys/types.h>
3305                 #include <net/route.h>
3306         ], [
3307                 struct rt_msghdr;
3308         ],[
3309                 AC_MSG_RESULT(yes)
3310                 AC_DEFINE(HAVE_RT_MSGHDR, 1, [struct rt_msghdr])
3311         ], [
3312                 AC_MSG_RESULT(no)
3313         ])
3315         AC_CHECK_HEADERS([sys/sysctl.h])
3316         AC_CHECK_HEADERS([linux/rtnetlink.h])
3318         AC_CHECK_FUNC(getpeereid,    [AC_DEFINE(HAVE_GETPEEREID, 1, [getpeereid])])
3319         AC_CHECK_FUNC(getdomainname, [AC_DEFINE(HAVE_GETDOMAINNAME, 1, [getdomainname])])
3320         AC_CHECK_FUNC(uname,         [AC_DEFINE(HAVE_UNAME, 1, [uname])])
3322         ORIG_CFLAGS="$CFLAGS"
3323         CFLAGS="-Werror -Weverything"
3325         AC_MSG_CHECKING(for getdomainname with size_t namelen)
3326         AC_TRY_COMPILE([
3327                 #include <unistd.h>
3328         ], [
3329                 size_t namelen = 20;
3330                 char name[20];
3331                 int result = getdomainname(name, namelen);
3332         ],[
3333                 AC_MSG_RESULT(yes)
3334                 AC_DEFINE(HAVE_GETDOMAINNAME_SIZET, 1, [getdomainname with size_t namelen])
3335         ], [
3336                 AC_MSG_RESULT(no)
3337         ])
3339         CFLAGS="$ORIG_CFLAGS"
3341         AC_CHECK_FUNC(inotify_init, [AC_DEFINE(HAVE_INOTIFY_INIT, 1, [inotify_init])])
3342         AC_CHECK_FUNC(inotify_add_watch, [AC_DEFINE(HAVE_INOTIFY_ADD_WATCH, 1, [inotify_add_watch])])
3343         AC_CHECK_FUNC(inotify_rm_watch, [AC_DEFINE(HAVE_INOTIFY_RM_WATCH, 1, [inotify_rm_watch])])
3345         if test "x$ac_cv_func_inotify_init" = "xyes" -a "x$ac_cv_func_inotify_add_watch" = "xyes" -a "x$ac_cv_func_inotify_rm_watch" = "xyes"; then
3346                 AC_DEFINE(HAVE_INOTIFY, 1, [HAVE_INOTIFY])
3347         elif test "x$host_linux" = "xyes"; then
3348                 AC_MSG_ERROR([Cannot find inotify functions on a Linux platform.])
3349         fi
3351         AC_CHECK_HEADERS([crt_externs.h])
3353         AC_MSG_CHECKING(for _NSGetEnviron)
3354         AC_TRY_COMPILE([
3355                 #include <crt_externs.h>
3356         ], [
3357                 char **result = *(_NSGetEnviron());
3358         ],[
3359                 AC_MSG_RESULT(yes)
3360                 AC_DEFINE(HAVE_NSGETENVIRON, 1, [_NSGetEnviron])
3361         ], [
3362                 AC_MSG_RESULT(no)
3363         ])
3365         AC_CHECK_DECL(IN_EXCL_UNLINK, [AC_DEFINE(HAVE_IN_EXCL_UNLINK, 1, [IN_EXCL_UNLINK])], [], [[#include <sys/inotify.h>]])
3367 else
3368         dnl *********************************
3369         dnl *** Checks for Windows compilation ***
3370         dnl *********************************
3371         AC_CHECK_HEADERS(winternl.h)
3373         jdk_headers_found=no
3374         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
3375         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
3376         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
3377         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
3378         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
3379         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
3380         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
3382         dnl *********************************
3383         dnl *** Check for struct ip_mreqn ***
3384         dnl *********************************
3385         AC_MSG_CHECKING(for struct ip_mreqn)
3386         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3387                 struct ip_mreqn mreq;
3388                 mreq.imr_address.s_addr = 0;
3389         ], [
3390                 # Yes, we have it...
3391                 AC_MSG_RESULT(yes)
3392                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
3393         ], [
3394                 # We'll just have to try and use struct ip_mreq
3395                 AC_MSG_RESULT(no)
3396                 AC_MSG_CHECKING(for struct ip_mreq)
3397                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3398                         struct ip_mreq mreq;
3399                         mreq.imr_interface.s_addr = 0;
3400                 ], [
3401                         # Yes, we have it...
3402                         AC_MSG_RESULT(yes)
3403                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
3404                 ], [
3405                         # No multicast support
3406                         AC_MSG_RESULT(no)
3407                 ])
3408         ])
3410         dnl **********************************
3411         dnl *** Check for getaddrinfo ***
3412         dnl **********************************
3413         AC_MSG_CHECKING(for getaddrinfo)
3414                 AC_TRY_LINK([
3415                 #include <stdio.h>
3416                 #include <winsock2.h>
3417                 #include <ws2tcpip.h>
3418         ], [
3419                 getaddrinfo(NULL,NULL,NULL,NULL);
3420         ], [
3421                 # Yes, we have it...
3422                 AC_MSG_RESULT(yes)
3423                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
3424         ], [
3425                 AC_MSG_RESULT(no)
3426         ])
3428         dnl **********************************
3429         dnl *** Check for gethostbyname ***
3430         dnl **********************************
3431         AC_MSG_CHECKING(for gethostbyname)
3432                 AC_TRY_LINK([
3433                 #include <stdio.h>
3434                 #include <winsock2.h>
3435                 #include <ws2tcpip.h>
3436         ], [
3437                 gethostbyname(NULL);
3438         ], [
3439                 # Yes, we have it...
3440                 AC_MSG_RESULT(yes)
3441                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
3442         ], [
3443                 AC_MSG_RESULT(no)
3444         ])
3446         dnl **********************************
3447         dnl *** Check for getprotobyname ***
3448         dnl **********************************
3449         AC_MSG_CHECKING(for getprotobyname)
3450                 AC_TRY_LINK([
3451                 #include <stdio.h>
3452                 #include <winsock2.h>
3453                 #include <ws2tcpip.h>
3454         ], [
3455                 getprotobyname(NULL);
3456         ], [
3457                 # Yes, we have it...
3458                 AC_MSG_RESULT(yes)
3459                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
3460         ], [
3461                 AC_MSG_RESULT(no)
3462         ])
3464         dnl **********************************
3465         dnl *** Check for getnameinfo ***
3466         dnl **********************************
3467         AC_MSG_CHECKING(for getnameinfo)
3468                 AC_TRY_LINK([
3469                 #include <stdio.h>
3470                 #include <winsock2.h>
3471                 #include <ws2tcpip.h>
3472         ], [
3473                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
3474         ], [
3475                 # Yes, we have it...
3476                 AC_MSG_RESULT(yes)
3477                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
3478         ], [
3479                 AC_MSG_RESULT(no)
3480         ])
3482         dnl **********************************
3483         dnl *** Check for inet_ntop ***
3484         dnl **********************************
3485         AC_MSG_CHECKING(for inet_ntop)
3486                 AC_TRY_LINK([
3487                 #include <stdio.h>
3488                 #include <winsock2.h>
3489                 #include <ws2tcpip.h>
3490         ], [
3491                 inet_ntop (0, NULL, NULL, 0);
3492         ], [
3493                 # Yes, we have it...
3494                 AC_MSG_RESULT(yes)
3495                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
3496         ], [
3497                 AC_MSG_RESULT(no)
3498         ])
3500         dnl **********************************
3501         dnl *** Check for inet_pton ***
3502         dnl **********************************
3503         AC_MSG_CHECKING(for inet_pton)
3504                 AC_TRY_LINK([
3505                 #include <stdio.h>
3506                 #include <winsock2.h>
3507                 #include <ws2tcpip.h>
3508         ], [
3509                 #ifndef inet_pton
3510                 (void) inet_pton;
3511                 #endif
3512                 inet_pton (0, NULL, NULL);
3513         ], [
3514                 # Yes, we have it...
3515                 AC_MSG_RESULT(yes)
3516                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
3517         ], [
3518                 AC_MSG_RESULT(no)
3519         ])
3521         AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
3522         AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
3523         AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
3524         AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
3525         AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
3526         AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
3527         AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
3530 dnl socklen_t check
3531 AC_MSG_CHECKING(for socklen_t)
3532 AC_TRY_COMPILE([
3533 #include <sys/types.h>
3534 #include <sys/socket.h>
3536   socklen_t foo;
3538 ac_cv_c_socklen_t=yes
3539         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
3540         AC_MSG_RESULT(yes)
3542         AC_MSG_RESULT(no)
3545 AC_MSG_CHECKING(for array element initializer support)
3546 AC_TRY_COMPILE([#include <sys/socket.h>], [
3547         const int array[] = {[1] = 2,};
3548 ], [
3549         # Yes, we have it...
3550         AC_MSG_RESULT(yes)
3551         AC_DEFINE(HAVE_ARRAY_ELEM_INIT,1,[Supports C99 array initialization])
3552 ], [
3553         # We'll have to use signals
3554         AC_MSG_RESULT(no)
3557 AC_CHECK_FUNCS(trunc, , AC_MSG_CHECKING(for trunc in math.h)
3558         # Simply calling trunc (0.0) is no good since gcc will optimize the call away
3559         AC_TRY_LINK([#include <math.h>], 
3560         [ static void *p = &trunc; ],
3561         [
3562                 AC_DEFINE(HAVE_TRUNC) 
3563                 AC_MSG_RESULT(yes)
3564                 ac_cv_trunc=yes
3565         ],
3566         AC_MSG_RESULT(no)))
3568 if test "x$ac_cv_truncl" != "xyes"; then
3569    AC_CHECK_LIB(sunmath, aintl, [ AC_DEFINE(HAVE_AINTL, 1, [Has the 'aintl' function]) LIBS="$LIBS -lsunmath"])
3572 AC_CHECK_FUNCS(execvp)
3574 dnl ****************************
3575 dnl *** Look for /dev/random ***
3576 dnl ****************************
3578 AC_MSG_CHECKING([if usage of random device is requested])
3579 AC_ARG_ENABLE(dev-random,
3580 [  --disable-dev-random    disable the use of the random device (enabled by default)],
3581 try_dev_random=$enableval, try_dev_random=yes)
3583 AC_MSG_RESULT($try_dev_random)
3585 case "{$build}" in
3587 dnl IBM i does not have /dev/random, use unblocking only
3589     *-*-os400*)
3590     NAME_DEV_RANDOM="/dev/urandom"
3591     ;;
3593 dnl Win32 does not have /dev/random, they have their own method...
3595     *-mingw*|*-*-cygwin*)
3596     ac_cv_have_dev_random=no
3597     ;;
3599 dnl Everywhere else, it's /dev/random
3601     *)
3602     NAME_DEV_RANDOM="/dev/random"
3603     ;;
3604 esac
3606 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
3608 dnl Now check if the device actually exists
3610 if test "x$try_dev_random" = "xyes"; then
3611     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
3612     [if test -r "$NAME_DEV_RANDOM" ; then
3613         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
3614     if test "x$ac_cv_have_dev_random" = "xyes"; then
3615         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
3616     fi
3617 else
3618     AC_MSG_CHECKING(for random device)
3619     ac_cv_have_dev_random=no
3620     AC_MSG_RESULT(has been disabled)
3623 if test "x$host_win32" = "xyes"; then
3624     AC_DEFINE(HAVE_CRYPT_RNG)
3627 if test "x$ac_cv_have_dev_random" = "xno" \
3628     && test "x$host_win32" = "xno"; then
3629     AC_MSG_WARN([[
3631 *** A system-provided entropy source was not found on this system.
3632 *** Because of this, the System.Security.Cryptography random number generator
3633 *** will throw a NotImplemented exception.
3635 *** If you are seeing this message, and you know your system DOES have an
3636 *** entropy collection in place, please report an issue on GitHub and
3637 *** provide information about the system and how to access the random device.
3639 *** Otherwise you can install either egd or prngd and set the environment
3640 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
3641 ***]])
3644 AC_ARG_ENABLE(bcl-opt, [  --disable-bcl-opt     BCL is compiled with no optimizations (allows accurate BCL debugging)], test_bcl_opt=$enableval, test_bcl_opt=yes)
3646 AC_MSG_CHECKING([if big-arrays are to be enabled])
3647 AC_ARG_ENABLE(big-arrays,  [  --enable-big-arrays       Enable the allocation and indexing of arrays greater than Int32.MaxValue], enable_big_arrays=$enableval, enable_big_arrays=no)
3648 if test "x$enable_big_arrays" = "xyes" ; then
3649     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
3650         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
3651     else
3652         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
3653     fi
3655 AC_MSG_RESULT($enable_big_arrays)
3657 dnl **************
3658 dnl *** DTRACE ***
3659 dnl **************
3661 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
3663 if test "x$enable_dtrace" = "xyes"; then
3664    if test "x$has_dtrace" = "xno"; then
3665           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
3666    fi
3667    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
3668    if test "x$DTRACE" = "xno"; then
3669           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
3670           enable_dtrace=no
3671    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
3672           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
3673           enable_dtrace=no
3674    fi
3677 dtrace_g=no
3678 if test "x$enable_dtrace" = "xyes"; then
3679         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
3680         DTRACEFLAGS=
3681         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3682                 case "$host" in
3683                         powerpc-*-darwin*)
3684                         DTRACEFLAGS="-arch ppc64"
3685                         ;;
3686                         i*86-*-darwin*)
3687                         DTRACEFLAGS="-arch x86_64"
3688                         ;;
3689                         *)
3690                         DTRACEFLAGS=-64
3691                         ;;
3692                 esac
3693         else
3694                 case "$host" in
3695                         powerpc-*-darwin*)
3696                         DTRACEFLAGS="-arch ppc"
3697                         ;;
3698                         i*86-*-darwin*)
3699                         DTRACEFLAGS="-arch i386"
3700                         ;;
3701                         *)
3702                         DTRACEFLAGS=-32
3703                         ;;
3704                 esac
3705         fi
3706         AC_SUBST(DTRACEFLAGS)
3707         case "$host" in
3708                 *-*-solaris*)
3709                 dtrace_g=yes
3710                 ;;
3711         esac
3712         AC_CHECK_HEADERS([sys/sdt.h])
3714 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
3715 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
3717 dnl **************************
3718 dnl *** AOT cross offsets  ***
3719 dnl **************************
3721 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
3722     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
3724 dnl **************
3725 dnl ***  LLVM  ***
3726 dnl **************
3728 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
3729 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
3730 AC_ARG_ENABLE(llvm-version-check,[  --enable-llvm-version-check Check that the LLVM matches the version expected by mono], enable_llvm_version_check=$enableval, enable_llvm_version_check=no)
3731 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
3732 AC_ARG_ENABLE(llvm-asserts,[  --enable-llvm-asserts Enable llvm asserts (option to LLVM in CMake)], enable_llvm_asserts=$enableval, enable_llvm_asserts=no)
3734 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
3736 if test "x$enable_llvm" = "xdefault"; then
3737    enable_llvm=$enable_llvm_default
3740 internal_llvm="no"
3741 if test "x$enable_llvm" = "xyes"; then
3742         if test "x$with_llvm" != "x"; then
3743                 EXTERNAL_LLVM_CONFIG=$with_llvm/bin/llvm-config
3744                 if test ! -x $EXTERNAL_LLVM_CONFIG; then
3745                         AC_MSG_ERROR([LLVM executable $EXTERNAL_LLVM_CONFIG not found.])
3746                 fi
3747         else
3748                 AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config, no)
3749                 if test "x$EXTERNAL_LLVM_CONFIG" = "xno"; then
3750                         internal_llvm=yes
3751                 else
3752                         with_llvm=`$EXTERNAL_LLVM_CONFIG --prefix`
3753                 fi
3754         fi
3755           
3756         if test "x$host_win32" != "xyes"; then
3757                 LLVM_CODEGEN_LIBS="x86codegen"
3758                 case "$target" in
3759                 arm*)
3760                         LLVM_CODEGEN_LIBS="armcodegen"
3761                         ;;
3762                 aarch64*)
3763                         LLVM_CODEGEN_LIBS="aarch64codegen"
3764                         ;;
3765                 powerpc*)
3766                         LLVM_CODEGEN_LIBS="powerpccodegen"
3767                         ;;
3768                 esac
3769                 if test "x$host" != "x$target"; then
3770                         # No need for jit libs
3771                         LLVM_CODEGEN_LIBS=
3772                 fi
3774                 AC_SUBST(LLVM_CODEGEN_LIBS)
3775                 AC_SUBST(EXTERNAL_LLVM_CONFIG)
3776         else # is win32
3777                 AC_MSG_ERROR([LLVM for Windows only supported using Visual Studio build mono runtime, see http://www.mono-project.com/docs/advanced/mono-llvm/ for more details.])
3778         fi # win32
3779         
3780         AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
3781 fi # ENABLE_LLVM
3783 # AC_DEFINE necessary for correct restore behavior on Linux
3784 AM_CONDITIONAL(INTERNAL_LLVM, [test "x$internal_llvm" != "xno"])
3785 if test "x$internal_llvm" != "xno"; then
3786    AC_DEFINE(INTERNAL_LLVM, 1, [LLVM used is being build during mono build])
3789 AM_CONDITIONAL(INTERNAL_LLVM_ASSERTS, [test "x$enable_llvm_asserts" != "xno"])
3790 if test "x$internal_llvm_asserts" != "xno"; then
3791    AC_DEFINE(INTERNAL_LLVM_ASSERTS, 1, [Build LLVM with assertions])
3794 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes])
3796 if test "x$enable_loadedllvm" = "xyes"; then
3797    AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
3799 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes])
3801 if test "x$enable_llvm" = "xyes"; then
3802    enable_llvm_runtime=yes
3804 if test "x$enable_llvm_runtime" = "xyes"; then
3805    AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
3807 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes])
3809 TARGET="unknown"
3810 ACCESS_UNALIGNED="yes"
3812 LIBC="libc.so.6"
3813 INTL="libc.so.6"
3814 SQLITE="libsqlite.so.0"
3815 SQLITE3="libsqlite3.so.0"
3816 X11="libX11.so"
3817 GDKX11="libgdk-x11-2.0.so.0"
3818 GTKX11="libgtk-x11-2.0.so.0"
3819 XINERAMA="libXinerama.so.1"
3821 sizeof_register="SIZEOF_VOID_P"
3823 jit_wanted=true
3824 boehm_supported=true
3825 BTLS_SUPPORTED=no
3826 BTLS_PLATFORM=
3828 if test "x$enable_wasm" = "xyes"; then
3829 TARGET=WASM
3830 HOST=WASM
3831 arch_target=wasm
3832 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
3833 AC_DEFINE(HOST_WASM, 1, [Host wasm])
3834 BTLS_SUPPORTED=no
3835 with_tls=pthread
3836 target_mach=no
3838 else
3840 case "$host" in
3841         mips*)
3842                 TARGET=MIPS;
3843                 arch_target=mips;
3844                 with_tls=pthread;
3845                 ACCESS_UNALIGNED="no"
3847                 AC_MSG_CHECKING(for mips n32)
3848                 AC_TRY_COMPILE([],[
3849                 #if _MIPS_SIM != _ABIN32
3850                 #error Not mips n32
3851                 #endif
3852                 ],[
3853                 AC_MSG_RESULT(yes)
3854                 sizeof_register=8
3855                 ],[
3856                 AC_MSG_RESULT(no)
3857                 ])
3858                 ;;
3859         i*86-*-*)
3860                 TARGET=X86;
3861                 arch_target=x86;
3862                 case $host_os in
3863                   solaris*)
3864                         LIBC="libc.so"
3865                         INTL="libintl.so"
3866                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3867                                 TARGET=AMD64
3868                                 arch_target=amd64
3869                         fi
3871                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
3872                         # int astruct __attribute__ ((visibility ("hidden")));
3873                         # void foo ()
3874                         # {
3875                         #       void *p = &astruct;
3876                         # }
3877                         # gcc -fPIC --shared -o libfoo.so foo.c
3878                         # yields:
3879                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
3880                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
3881                         have_visibility_hidden=no
3882                         ;;
3883                   mingw*|cygwin*)
3884                         have_visibility_hidden=no                 
3885                         ;;
3886                   haiku*)
3887                         LIBC=libroot.so
3888                         ;;
3889                   linux*)
3890                         AOT_SUPPORTED="yes"
3891                         BTLS_SUPPORTED=yes
3892                         BTLS_PLATFORM=i386
3893                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3894                         ;;
3895                   darwin*)
3896                         AOT_SUPPORTED="yes"
3897                         BTLS_SUPPORTED=yes
3898                         BTLS_PLATFORM=i386
3899                         ;;
3900                   openbsd*|freebsd*|kfreebsd-gnu*)
3901                         AOT_SUPPORTED="yes"
3902                         BTLS_SUPPORTED=yes
3903                         BTLS_PLATFORM=i386
3904                         ;;
3905                 esac
3906                 ;;
3907         x86_64-*-* | amd64-*-*)
3908                 TARGET=AMD64;
3909                 arch_target=amd64;
3910                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
3911                         AC_DEFINE(__mono_ilp32__, 1, [64 bit mode with 4 byte longs and pointers])
3912                         sizeof_register=8
3913                 fi
3914                 case $host_os in
3915                   linux*)
3916                         AOT_SUPPORTED="yes"
3917                         BTLS_SUPPORTED=yes
3918                         BTLS_PLATFORM=x86_64
3919                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3920                         ;;
3921                   darwin*)
3922                         AOT_SUPPORTED="yes"
3923                         BTLS_SUPPORTED=yes
3924                         BTLS_PLATFORM=x86_64
3925                         boehm_supported=false
3926                         ;;
3927                   openbsd*|freebsd*|kfreebsd-gnu*)
3928                         AOT_SUPPORTED="yes"
3929                         BTLS_SUPPORTED=yes
3930                         BTLS_PLATFORM=x86_64
3931                         ;;
3932                   mingw*)
3933                         ;;
3934                 esac
3935                 ;;
3936         sparc*-*-*)
3937                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
3938                    TARGET=SPARC64
3939                 else
3940                         TARGET=SPARC
3941                 fi
3942                 arch_target=sparc;
3943                 ACCESS_UNALIGNED="no"
3944                 case $host_os in
3945                   linux*) ;;
3946                   *)
3947                         LIBC="libc.so"
3948                         INTL="libintl.so"
3949                 esac
3950                 if test x"$GCC" = xyes; then
3951                         # We don't support v8 cpus
3952                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
3953                 fi
3954                 if test x"$AR" = xfalse; then
3955                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
3956                 fi
3957                 ;;
3958         *-mingw*|*-*-cygwin*)
3959                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
3960                 have_visibility_hidden=no
3961                 INTL="intl"
3962                 ;;
3963         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
3964         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
3965         powerpc-*-freebsd* | powerpc-*-aix* | powerpc-*-os400* )
3966                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
3967                         TARGET=POWERPC64;
3968                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
3969                         if ! (echo $CC | grep -q -- 'clang'); then
3970                                 CFLAGS="$CFLAGS -mminimal-toc"
3971                         fi
3972                 else
3973                         TARGET=POWERPC;
3974                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
3975                 fi
3976                 arch_target=ppc;
3977                 case $host_os in
3978                   aix*|os400*)
3979                         BTLS_SUPPORTED=yes
3980                         BTLS_PLATFORM=powerpc
3981                         dnl on AIX/PASE, shared libraries can be inside archives
3982                         dnl if they are, we specify them by lib.a(lib.so)
3983                         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX, so
3984                         LIBC="libc.a(shr_64.o)"
3985                         INTL="libintl.a(libintl.so.8)"
3986                         ;;
3987                   linux*)
3988                         BTLS_SUPPORTED=yes
3989                         BTLS_PLATFORM=powerpc
3990                         ;;
3991                 esac
3992                 ;;
3993         armv7k-*-darwin*)
3994                 TARGET=ARM;
3995                 TARGET_SYS=WATCHOS
3996                 arch_target=arm;
3997                 arm_fpu=VFP_HARD
3998                 ACCESS_UNALIGNED="no"
3999                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4000                 ;;
4002         arm*-darwin*)
4003                 TARGET=ARM;
4004                 arch_target=arm;
4005                 ACCESS_UNALIGNED="no"
4006                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4007                 ;;
4008         arm*-linux*)
4009                 TARGET=ARM;
4010                 arch_target=arm;
4011                 ACCESS_UNALIGNED="no"
4012                 AOT_SUPPORTED="yes"
4013                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4014                 BTLS_SUPPORTED=yes
4015                 BTLS_PLATFORM=arm
4016                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4017                 case "$target" in
4018                 arm*-linux*-gnueabi)
4019                         BTLS_PLATFORM=armsoft
4020                         ;;
4021                 esac
4022                 ;;
4023         arm*-netbsd*-eabi*)
4024                 TARGET=ARM;
4025                 arch_target=arm;
4026                 ACCESS_UNALIGNED="no"
4027                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4028                 ;;
4029         aarch64-*)
4030                 # https://lkml.org/lkml/2012/7/15/133
4031                 TARGET=ARM64
4032                 arch_target=arm64
4033                 boehm_supported=false
4034                 AOT_SUPPORTED="yes"
4035                 BTLS_SUPPORTED=yes
4036                 BTLS_PLATFORM=aarch64
4037                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4038                 ;;
4039         s390x-*-linux*)
4040                 TARGET=S390X;
4041                 arch_target=s390x;
4042                 ACCESS_UNALIGNED="yes"
4043                 BTLS_SUPPORTED=yes
4044                 BTLS_PLATFORM=s390x
4045                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
4046                 ;;
4047 esac
4049 HOST=$TARGET
4051 if test "x$host" != "x$target"; then
4052    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
4053    enable_mcs_build=no
4054    enable_support_build=no
4055    BTLS_SUPPORTED=no
4056    case "$target" in
4057    arm*-darwin*)
4058                 TARGET=ARM;
4059                 arch_target=arm;
4060                 ACCESS_UNALIGNED="no"
4061                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4062                 # Can't use tls, since it depends on the runtime detection of tls offsets
4063                 # in mono-compiler.h
4064                 with_tls=pthread
4065                 case "$target" in
4066                 armv7k-*)
4067                         arm_fpu=VFP_HARD
4068                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
4069                         ;;
4070                 esac            
4071                 ;;
4072    powerpc64-ps3-linux-gnu)
4073                 TARGET=POWERPC64
4074                 arch_target=powerpc64
4075                 AC_DEFINE(TARGET_PS3, 1, [...])
4076                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4077                 # uses this define
4078                 AC_DEFINE(__mono_ppc64__, 1, [...])
4079                 AC_DEFINE(__mono_ilp32__, 1, [64 bit mode with 4 byte longs and pointers])
4080                 sizeof_register=8
4081                 target_byte_order=G_BIG_ENDIAN
4082                 ;;
4083    powerpc64-xbox360-linux-gnu)
4084                 TARGET=POWERPC64
4085                 arch_target=powerpc64
4086                 AC_DEFINE(TARGET_XBOX360, 1, [...])
4087                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4088                 # uses this define
4089                 sizeof_register=8
4090                 target_byte_order=G_BIG_ENDIAN
4091                 ;;
4092    arm*-linux-*)
4093                 TARGET=ARM;
4094                 arch_target=arm;
4095                 AC_DEFINE(TARGET_ARM, 1, [...])
4096                 ACCESS_UNALIGNED="no"
4097                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4098                 # Can't use tls, since it depends on the runtime detection of tls offsets
4099                 # in mono-compiler.h
4100                 with_tls=pthread
4101                 target_mach=no
4102                 case "$target" in
4103                 armv7l-unknown-linux-gnueabi*)
4104                         # TEGRA
4105                         CPPFLAGS="$CPPFLAGS"
4106                         ;;
4107                 armv5-*-linux-androideabi*)
4108                         AC_DEFINE(TARGET_ANDROID, 1, [...])
4109                         CPPFLAGS="$CPPFLAGS"
4110                         ;;
4111                 *-linux-androideabi*)
4112                         AC_DEFINE(TARGET_ANDROID, 1, [...])
4113                         CPPFLAGS="$CPPFLAGS"
4114                         ;;
4115                 esac
4116                 ;;
4117    arm*-netbsd*-eabi*)
4118                 TARGET=ARM;
4119                 arch_target=arm;
4120                 AC_DEFINE(TARGET_ARM, 1, [...])
4121                 ACCESS_UNALIGNED="no"
4122                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4123                 # Can't use tls, since it depends on the runtime detection of tls offsets
4124                 # in mono-compiler.h
4125                 with_tls=pthread
4126                 target_mach=no
4127                 ;;
4128    i686*-linux-*)
4129                 TARGET=X86;
4130                 arch_target=x86;
4131                 AC_DEFINE(TARGET_X86, 1, [...])
4132                 CPPFLAGS="$CPPFLAGS"
4133                 # Can't use tls, since it depends on the runtime detection of tls offsets
4134                 # in mono-compiler.h            
4135                 with_tls=pthread
4136                 target_mach=no
4138                 case "$target" in
4139                 *-linux-android*)
4140                         AC_DEFINE(TARGET_ANDROID, 1, [...])
4141                         ;;
4142                 esac
4143                 ;;
4144    x86_64*-linux-*)
4145                 TARGET=AMD64;
4146                 arch_target=amd64;
4147                 AC_DEFINE(TARGET_AMD64, 1, [...])
4148                 CPPFLAGS="$CPPFLAGS"
4149                 # Can't use tls, since it depends on the runtime detection of tls offsets
4150                 # in mono-compiler.h
4151                 with_tls=pthread
4152                 target_mach=no
4154                 case "$target" in
4155                 *-linux-android*)
4156                         AC_DEFINE(TARGET_ANDROID, 1, [...])
4157                         ;;
4158                 esac
4159                 ;;
4160    x86_64-ps4-freebsd)
4161                 TARGET=AMD64;
4162                 arch_target=amd64;
4163                 AC_DEFINE(TARGET_AMD64, 1, [...])
4164                 AC_DEFINE(TARGET_PS4, 1, [...])
4165                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
4166                 CPPFLAGS="$CPPFLAGS"
4167                 # Can't use tls, since it depends on the runtime detection of tls offsets
4168                 # in mono-compiler.h
4169                 with_tls=pthread
4170                 target_mach=no
4171                 target_win32=no
4172                 ;;
4173    aarch64*-linux-*)
4174                 TARGET=ARM64;
4175                 arch_target=arm64;
4176                 AC_DEFINE(TARGET_ARM64, 1, [...])
4177                 CPPFLAGS="$CPPFLAGS"
4178                 # Can't use tls, since it depends on the runtime detection of tls offsets
4179                 # in mono-compiler.h
4180                 with_tls=pthread
4181                 target_mach=no
4182                 case "$target" in
4183                 *-linux-android*)
4184                         AC_DEFINE(TARGET_ANDROID, 1, [...])
4185                         ;;
4186                 esac
4187                 ;;
4188         aarch64-*)
4189                 TARGET=ARM64
4190                 ;;
4191         *)
4192                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
4193         esac
4196 case "$TARGET" in
4197 X86)
4198         AC_DEFINE(TARGET_X86, 1, [...])
4199         ;;
4200 AMD64)
4201         AC_DEFINE(TARGET_AMD64, 1, [...])
4202         ;;
4203 ARM)
4204         AC_DEFINE(TARGET_ARM, 1, [...])
4205         ;;
4206 ARM64)
4207         AC_DEFINE(TARGET_ARM64, 1, [...])
4208         ;;
4209 POWERPC)
4210         AC_DEFINE(TARGET_POWERPC, 1, [...])
4211         ;;
4212 POWERPC64)
4213         AC_DEFINE(TARGET_POWERPC, 1, [...])
4214         AC_DEFINE(TARGET_POWERPC64, 1, [...])
4215         ;;
4216 S390X)
4217         AC_DEFINE(TARGET_S390X, 1, [...])
4218         ;;
4219 MIPS)
4220         AC_DEFINE(TARGET_MIPS, 1, [...])
4221         ;;
4222 SPARC)
4223         AC_DEFINE(TARGET_SPARC, 1, [...])
4224         ;;
4225 SPARC64)
4226         AC_DEFINE(TARGET_SPARC64, 1, [...])
4227         ;;
4228 esac
4230 case "$HOST" in
4231 X86)
4232         AC_DEFINE(HOST_X86, 1, [...])
4233         ;;
4234 AMD64)
4235         AC_DEFINE(HOST_AMD64, 1, [...])
4236         ;;
4237 ARM)
4238         AC_DEFINE(HOST_ARM, 1, [...])
4239         ;;
4240 ARM64)
4241         AC_DEFINE(HOST_ARM64, 1, [...])
4242         ;;
4243 POWERPC)
4244         AC_DEFINE(HOST_POWERPC, 1, [...])
4245         ;;
4246 POWERPC64)
4247         AC_DEFINE(HOST_POWERPC, 1, [...])
4248         AC_DEFINE(HOST_POWERPC64, 1, [...])
4249         ;;
4250 S390X)
4251         AC_DEFINE(HOST_S390X, 1, [...])
4252         ;;
4253 MIPS)
4254         AC_DEFINE(HOST_MIPS, 1, [...])
4255         ;;
4256 SPARC)
4257         AC_DEFINE(HOST_SPARC, 1, [...])
4258         ;;
4259 SPARC64)
4260         AC_DEFINE(HOST_SPARC64, 1, [...])
4261         ;;
4262 esac
4264 #WASM hack
4267 MONO_ARCH_GSHAREDVT_SUPPORTED=0
4268 case "$HOST" in
4269 X86 | AMD64 | ARM | ARM64)
4270         MONO_ARCH_GSHAREDVT_SUPPORTED=1 # keep in sync with mini-{x86,amd64,arm,arm64}.h
4271         ;;
4272 esac
4274 AM_CONDITIONAL(MONO_ARCH_GSHAREDVT_SUPPORTED, test $MONO_ARCH_GSHAREDVT_SUPPORTED = 1)
4276 dnl *************
4277 dnl *** VTUNE ***
4278 dnl *************
4280 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
4281 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
4283 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
4285 if test "x$enable_vtune" = "xyes"; then
4286         if test "x$with_vtune" = "x"; then
4287                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
4288         else
4289                 VTUNE_PATH=$with_vtune
4290         fi
4291         VTUNE_INCLUDE=$VTUNE_PATH/include
4292         case "$TARGET" in
4293         X86)
4294                 VTUNE_LIB=$VTUNE_PATH/lib32
4295                 ;;
4296         AMD64)
4297                 VTUNE_LIB=$VTUNE_PATH/lib64
4298                 ;;
4299         *)
4300                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
4301                 ;;
4302         esac
4303         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
4304                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
4305         fi
4306         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
4307                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
4308         fi
4310         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
4311         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
4313         AC_SUBST(VTUNE_LIBS)
4314         AC_SUBST(VTUNE_CFLAGS)
4316 dnl Use GCC atomic ops if they work on the target.
4317 if test x$GCC = "xyes"; then
4318         case $TARGET in
4319         X86 | AMD64 | ARM | ARM64 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64)
4320                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
4321                 ;;
4322         esac
4325 if test "x$target_mach" = "xyes"; then
4327    if test "x$TARGET_SYS" = "xWATCHOS"; then
4328           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
4329           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4330           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4331           BTLS_SUPPORTED=no
4332    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64"; then
4333           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4334           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4335           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4336           BTLS_SUPPORTED=no
4337    else
4338        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
4339        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
4340        #error fail this for ios
4341        #endif
4342        ], [
4343                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
4344           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
4345           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
4346           target_osx=yes
4347        ], [
4348           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4349           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4350           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4351           BTLS_SUPPORTED=no
4352                   target_ios=yes
4353        ])
4354         fi
4355    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
4358 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
4360 if test "x$sizeof_register" = "x4"; then
4361    AC_DEFINE(SIZEOF_REGISTER,4,[size of machine integer registers])
4362 elif test "x$sizeof_register" = "x8"; then
4363    AC_DEFINE(SIZEOF_REGISTER,8,[size of machine integer registers])
4364 else
4365    AC_DEFINE(SIZEOF_REGISTER,SIZEOF_VOID_P,[size of machine integer registers])
4368 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
4370 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
4371    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
4372 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
4373    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
4374 else
4375    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
4378 if test "x$have_visibility_hidden" = "xyes"; then
4379    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
4382 if test "x$have_deprecated" = "xyes"; then
4383    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
4386 dnl 
4387 dnl Simple Generational checks (sgen)
4389 SGEN_DEFINES=
4390 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
4391 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
4392 if test x$buildsgen = xyes; then
4393    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
4394    SGEN_DEFINES="-DHAVE_SGEN_GC"
4396         conc_gc_msg=""
4397    if test x$with_sgen_default_concurrent != xno; then
4398        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
4399            conc_gc_msg=" (concurrent by default)"
4400    fi
4402    if test "x$gc_msg" = "x"; then
4403       gc_msg="sgen$conc_gc_msg"
4404    else
4405       gc_msg="sgen$conc_gc_msg and $gc_msg"
4406    fi
4408 AC_SUBST(SGEN_DEFINES)
4409 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
4411 jit_status="Building and using the JIT"
4413 libsuffix=".so"
4415 case "$host" in
4416      *-*-darwin*)
4417         libsuffix=".dylib"
4418         LIBC="libc.dylib"
4419         INTL="libintl.dylib"
4420         SQLITE="libsqlite.0.dylib"
4421         SQLITE3="libsqlite3.0.dylib"
4422         X11="libX11.dylib"
4423         GDKX11="libgdk-x11-2.0.dylib"
4424         GTKX11="libgtk-x11-2.0.dylib"
4425         ;;
4426      *-*-*netbsd*)
4427         LIBC="libc.so"
4428         INTL="libintl.so"
4429         SQLITE="libsqlite.so"
4430         SQLITE3="libsqlite3.so"
4431         ;;
4432      *-*-kfreebsd*-gnu)
4433         LIBC="libc.so.0.1"
4434         INTL="libc.so.0.1"
4435         X11="libX11.so.6"
4436         ;;
4437     *-*-*freebsd*)
4438         LIBC="libc.so.7"
4439         INTL="libintl.so"
4440         SQLITE="libsqlite.so"
4441         SQLITE3="libsqlite3.so"
4442         ;;
4443     *-*-*openbsd*)
4444         LIBC="libc.so"
4445         INTL="libintl.so"
4446         SQLITE="libsqlite.so"
4447         SQLITE3="libsqlite3.so"
4448         ;;
4449     *-*-*linux*)
4450         AC_PATH_X
4451         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
4452         AC_MSG_CHECKING(for the soname of libX11.so)
4453         for i in $x_libraries $dlsearch_path; do
4454                 for r in 4 5 6; do
4455                         if test -f $i/libX11.so.$r; then
4456                                 X11=libX11.so.$r
4457                                 AC_MSG_RESULT($X11)
4458                         fi
4459                 done
4460         done
4461         
4462         if test "x$X11" = "xlibX11.so"; then
4463                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
4464                 X11=libX11.so.6
4465         fi
4466         ;;
4467 esac
4469 AC_SUBST(libsuffix)
4471 ######################################
4472 # EGLIB CHECKS
4473 ######################################
4475 GNUC_PRETTY=
4476 GNUC_UNUSED=
4477 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
4478 if test x$GCC = xyes; then
4479    GNUC_UNUSED='__attribute__((__unused__))'
4480    GNUC_NORETURN='__attribute__((__noreturn__))'
4481    case $host_cpu in
4482      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
4483    esac
4485 AC_SUBST(GNUC_PRETTY)
4486 AC_SUBST(GNUC_UNUSED)
4487 AC_SUBST(GNUC_NORETURN)
4488 AC_SUBST(BREAKPOINT)
4490 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
4492 case $host in
4493 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
4494     PATHSEP='\\'
4495     SEARCHSEP=';'
4496     OS="WIN32"
4497     PIDTYPE='void *'
4498     ;;
4500     PATHSEP='/'
4501     SEARCHSEP=':'
4502     OS="UNIX"
4503     PIDTYPE='int'
4504     ;;
4505 esac
4507 case $host in
4508         *-*-solaris*)
4509         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
4510         ;;
4511 esac
4513 case $target in
4514 arm*-darwin*|aarch64*-*)
4515     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
4516     ;;
4517 i*86-*-darwin*)
4518     ORDER=G_LITTLE_ENDIAN
4519     ;;
4520 *-*-haiku*)
4521     LDFLAGS="$LDFLAGS -ltextencoding"
4522     ;;
4523 *-*-openbsd*)
4524     CFLAGS="$CFLAGS -pthread"
4525     LDFLAGS="$LDFLAGS -pthread"
4526     ;;
4527 esac
4529 AC_SUBST(ORDER)
4530 AC_SUBST(CFLAGS)
4531 AC_SUBST(PATHSEP)
4532 AC_SUBST(SEARCHSEP)
4533 AC_SUBST(OS)
4534 AC_SUBST(PIDTYPE)
4536 # Defined for all targets/platforms using classic Windows API support.
4537 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
4538 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
4540 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf)
4541 AC_CHECK_FUNCS(getrlimit)
4542 AC_CHECK_FUNCS(fork execv execve)
4544 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
4546 if test x$with_overridable_allocators = xyes; then
4547         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
4548   AC_MSG_NOTICE([Overridable allocator support enabled])
4549 else
4550   AC_MSG_NOTICE([Overridable allocator support disabled])
4554 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
4555 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
4556 # removed once support for 10.6 is dropped.
4558 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
4560 if test x$target_osx = xyes; then
4561 AC_CHECK_FUNCS(getpwuid_r)
4562 elif test x$target_ios = xno; then
4563 AC_CHECK_FUNCS(strndup getpwuid_r)
4566 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
4568 AC_SEARCH_LIBS(sqrtf, m)
4570 # nanosleep may not be part of libc, also search it in other libraries
4571 AC_SEARCH_LIBS(nanosleep, rt)
4573 AC_SEARCH_LIBS(dlopen, dl)
4574 old_ldflags="${LDFLAGS}"
4575 # GNU specific option, this confuses IBM ld, but do offer alternatives when possible
4576 if test $lt_cv_prog_gnu_ld = yes; then
4577         LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4578 else
4579         case $host in
4580         *-*-aix*|*-*-os400*)
4581                 ;;
4582         *)
4583                 dnl Try to use export-dynamic anyways
4584                 LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4585                 ;;
4586         esac
4588 AC_TRY_LINK(, [int i;], found_export_dynamic=yes, found_export_dynamic=no)
4589 if test $found_export_dynamic = no; then
4590         LDFLAGS="${old_ldflags}"
4593 AC_CHECK_HEADERS(getopt.h sys/select.h sys/time.h sys/wait.h pwd.h iconv.h localcharset.h sys/types.h sys/resource.h)
4594 AC_CHECK_LIB([iconv], [locale_charset],[],[AC_CHECK_LIB([charset], [locale_charset],[LIBS+=" -liconv -lcharset"])])
4595 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
4596 AC_SUBST(HAVE_ALLOCA_H)
4598 # Get the exact type of size_t, not just its size.
4599 # This is so we can find an exact printf format among u, lu, llu, I64u.
4600 # To avoid warnings about slight mismatches.
4601 # C99 runtime "zu" dependency is being avoided here.
4603 # We have to compile as C++ because C is too lenient
4604 # and lets the wrong thing compile, with warnings.
4606 # Note: "zu" or ifdef <something> have the advantage
4607 # of producing installable "biarch" headers. i.e. one Mac header
4608 # for Mac/x86 and Mac/amd64.
4610 AC_LANG_PUSH(C++)
4612 # Check long before int because it is the overwhelming Unix answer,
4613 # across 32bit and 64bit systems -- fewer compiler invocations in autoconf.
4615 # long ahead of int also tends to produce biarch-compatible headers except Windows.
4617 AC_MSG_CHECKING(if size_t is unsigned long)
4618 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4619         #include <stddef.h>
4620         unsigned long *a = (size_t*)0;
4621 ])], [
4622         AC_MSG_RESULT(yes)
4623         AC_SUBST(GSIZE_FORMAT, '"%lu"')
4624 ], [
4625         AC_MSG_RESULT(no)
4626         AC_MSG_CHECKING(if size_t is unsigned int)
4627         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4628                 #include <stddef.h>
4629                 unsigned *a = (size_t*)0;
4630         ])], [
4631                 AC_MSG_RESULT(yes)
4632                 AC_SUBST(GSIZE_FORMAT, '"%u"')
4633         ], [
4634 # At this point the majority of systems have their answer,
4635 # and we descend into non-standard or new-standard territory.
4637 # Check __int64 first because I64 on some systems predates ll, enabling
4638 # new compiler/old runtime interop, and the types always have the same size.
4639                 AC_MSG_RESULT(no)
4640                 AC_MSG_CHECKING(if size_t is unsigned __int64)
4641                 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4642                         #include <stddef.h>
4643                         unsigned __int64 *a = (size_t*)0;
4644                 ])], [
4645                         AC_MSG_RESULT(yes)
4646                         AC_SUBST(GSIZE_FORMAT, '"%I64u"')
4647                 ], [
4648                         AC_MSG_RESULT(no)
4649                         AC_MSG_CHECKING(if size_t is unsigned long long)
4650                         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4651                                 #include <stddef.h>
4652                                 unsigned long long *a = (size_t*)0;
4653                         ])], [
4654                                 AC_MSG_RESULT(yes)
4655                                 AC_SUBST(GSIZE_FORMAT, '"%llu"')
4656                         ], [
4657                                 AC_MSG_RESULT(no)
4658                                 AC_MSG_ERROR(Unable to determine size_t among unsigned long, int, __int64, long long)
4659                         ] )
4660                 ] )
4661         ] )
4662 ] )
4664 AC_LANG_POP
4666 # If size_t/ptrdiff_t is correct, use it. Otherwise C99 [u]intptr_t.
4667 # This provides for an exact match with functions that
4668 # take size_t like malloc and pthread_attr_getstacksize, avoiding warnings.
4669 # uintptr_t is not necessarily the same.
4671 # ptrdiff_t is preferred over ssize_t as it is C89 vs. new Posix.
4672 # ssize_t looks nicer but ptrdiff_t is wrapped up as gssize anyway.
4674 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_size_t; then
4675    GSIZE="size_t"
4676    GSSIZE="ptrdiff_t"
4677 else
4678    GSIZE="uintptr_t"
4679    GSSIZE="intptr_t"
4682 AC_SUBST(GSIZE)
4683 AC_SUBST(GSSIZE)
4684 AC_SUBST(GSIZE_FORMAT)
4687 # END OF EGLIB CHECKS
4690 AC_ARG_WITH([libgdiplus],
4691         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
4692         [], [with_libgdiplus=installed])
4694 # default install location
4695 libgdiplus_install_loc=libgdiplus${libsuffix}
4696 case "$host" in
4697     *-*-*linux*)
4698     libgdiplus_install_loc=libgdiplus${libsuffix}.0
4699     ;;
4700 esac
4702 case $with_libgdiplus in
4703     no)
4704     libgdiplus_loc=
4705     ;;
4707     installed)
4708     libgdiplus_loc=
4709     if test x$cross_compiling = xno; then
4710         if test x$host_darwin = xyes; then
4711             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
4712             if test -x $a; then
4713               libgdiplus_install_loc=$a
4714               libgdiplus_loc=$a
4715             fi
4716         fi
4717     fi
4718     ;;
4720     yes|sibling)
4721     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
4722     ;;
4724     /*) # absolute path, assume it is an install location
4725     libgdiplus_loc=$with_libgdiplus
4726     libgdiplus_install_loc=$with_libgdiplus
4727     ;;
4729     *)
4730     libgdiplus_loc=`pwd`/$with_libgdiplus
4731     ;;
4732 esac
4733 AC_SUBST(libgdiplus_loc)
4734 AC_SUBST(libgdiplus_install_loc)
4736 AC_ARG_ENABLE(icall-symbol-map,[  --enable-icall-symbol-map Generate tables which map icall functions to their C symbols], icall_symbol_map=$enableval, icall_symbol_map=no)
4737 if test "x$icall_symbol_map" = "xyes"; then
4738    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
4741 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
4742 if test "x$icall_export" = "xyes"; then
4743    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
4746 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
4747 if test "x$icall_tables" = "xno"; then
4748    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
4751 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
4753 if test "x$with_tls" = "x__thread"; then
4754         AC_DEFINE(HAVE_KW_THREAD, 1, [Have __thread keyword])
4755         # Pass the information to libgc
4756         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
4757         AC_MSG_CHECKING(if the tls_model attribute is supported)
4758         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
4759                 ], [
4760                         AC_MSG_RESULT(yes)
4761                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
4762                 ], [
4763                         AC_MSG_RESULT(no)
4764         ])
4767 if test ${TARGET} = ARM; then
4768         dnl ******************************************
4769         dnl *** Check to see what FPU is available ***
4770         dnl ******************************************
4771         AC_MSG_CHECKING(which FPU to use)
4773         #
4774         # This is a bit tricky:
4775         #
4776         # if (__ARM_PCS_VFP) {
4777         #       /* mfloat-abi=hard == VFP with hard ABI */
4778         # } elif (!__SOFTFP__) {
4779         #       /* mfloat-abi=softfp == VFP with soft ABI */
4780         # } else {
4781         #       /* mfloat-abi=soft == no VFP */
4782         # }
4783         #
4784         # The exception is iOS (w/ GCC) where none of the above
4785         # are defined (but iOS always uses the 'softfp' ABI).
4786         #
4787         # No support for FPA.
4788         #
4790         fpu=NONE
4792         # iOS GCC always uses the 'softfp' ABI.
4793         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
4794                 fpu=VFP
4795         fi
4797         # Are we using the 'hard' ABI?
4798         if test x$fpu = xNONE; then
4799                 AC_TRY_COMPILE([], [
4800                         #ifndef __ARM_PCS_VFP
4801                         #error "Float ABI is not 'hard'"
4802                         #endif
4803                 ], [
4804                         fpu=VFP_HARD
4805                 ], [
4806                         fpu=NONE
4807                 ])
4808         fi
4810         # No 'hard' ABI. 'soft' or 'softfp'?
4811         if test x$fpu = xNONE; then
4812                 AC_TRY_COMPILE([], [
4813                         #ifdef __SOFTFP__
4814                         #error "Float ABI is not 'softfp'"
4815                         #endif
4816                 ], [
4817                         fpu=VFP
4818                 ], [
4819                         fpu=NONE
4820                 ])
4821         fi
4823         if test x$arm_fpu != x; then
4824            fpu=$arm_fpu
4825         fi
4827         AC_MSG_RESULT($fpu)
4828         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
4829         unset fpu
4831         dnl *********************************************
4832         dnl *** Check which ARM version(s) we can use ***
4833         dnl *********************************************
4834         AC_MSG_CHECKING(which ARM version to use)
4836         AC_TRY_COMPILE([], [
4837                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
4838                 #error Not on ARM v5.
4839                 #endif
4840         ], [
4841                 arm_v5=yes
4843                 arm_ver=ARMv5
4844         ], [])
4846         AC_TRY_COMPILE([], [
4847                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
4848                 #error Not on ARM v6.
4849                 #endif
4850         ], [
4851                 arm_v5=yes
4852                 arm_v6=yes
4854                 arm_ver=ARMv6
4855         ], [])
4857         AC_TRY_COMPILE([], [
4858                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
4859                 #error Not on ARM v7.
4860                 #endif
4861         ], [
4862                 arm_v5=yes
4863                 arm_v6=yes
4864                 arm_v7=yes
4866                 arm_ver=ARMv7
4867         ], [])
4869         AC_MSG_RESULT($arm_ver)
4871         if test x$arm_v5 = xyes; then
4872                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
4873                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
4874         fi
4876         if test x$arm_v6 = xyes; then
4877                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
4878                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
4879         fi
4881         if test x$arm_v7 = xyes; then
4882                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
4883                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
4884         fi
4887 if test ${TARGET} = unknown; then
4888         CPPFLAGS="$CPPFLAGS -DNO_PORT"
4889         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
4892 if test "x$platform_android" = "xyes"; then
4893         case "x${TARGET}" in
4894         xARM)
4895                 case "x$arm_ver" in
4896                 xARMv5)
4897                         BTLS_SUPPORTED=yes
4898                         BTLS_PLATFORM=android-armv5
4899                         ;;
4900                 xARMv6)
4901                         BTLS_SUPPORTED=yes
4902                         BTLS_PLATFORM=android-armv6
4903                         ;;
4904                 xARMv7)
4905                         BTLS_SUPPORTED=yes
4906                         BTLS_PLATFORM=android-armv7
4907                         ;;
4908                 *)
4909                         BTLS_SUPPORTED=no
4910                         ;;
4911                 esac
4912                 ;;
4913         xARM64)
4914                 BTLS_SUPPORTED=yes
4915                 BTLS_PLATFORM=android-v8a
4916                 ;;
4917         xX86)
4918                 BTLS_SUPPORTED=yes
4919                 BTLS_PLATFORM=android-x86
4920                 ;;
4921         xAMD64)
4922                 BTLS_SUPPORTED=yes
4923                 BTLS_PLATFORM=android-x64
4924                 ;;
4925         *)
4926                 BTLS_SUPPORTED=no
4927                 ;;
4928         esac
4931 if test ${ACCESS_UNALIGNED} = no; then
4932         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
4935 if test x$host_darwin = xyes; then
4936         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
4937         AS_IF(
4938                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
4939                 [AC_MSG_RESULT([no])],
4940                 [
4941                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
4942                         AR_FLAGS="Scru"
4943                         RANLIB="$RANLIB -no_warning_for_no_symbols"
4944                         AC_MSG_RESULT([yes])
4945                 ]
4946         )
4949 case "x$libgc" in
4950         xincluded)
4951                 # Pass CPPFLAGS to libgc configure
4952                 # We should use a separate variable for this to avoid passing useless and
4953                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
4954                 # This should be executed late so we pick up the final version of CPPFLAGS
4955                 # The problem with this approach, is that during a reconfigure, the main
4956                 # configure scripts gets invoked with these arguments, so we use separate
4957                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
4958                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
4959                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
4960                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
4961                 fi
4962                 # Don't pass -finstrument-for-thread-suspension in, 
4963                 # if these are instrumented it will be very bad news 
4964                 # (infinite recursion, undefined parking behavior, etc)
4965                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
4966                 ac_configure_args="$ac_configure_args --disable-embed-check --with-libgc-threads=$libgc_threads $libgc_configure_args \"CPPFLAGS_FOR_LIBGC=$TMP_CPPFLAGS\" \"CFLAGS_FOR_LIBGC=$CFLAGS_FOR_LIBGC\""
4967                 if test "x$support_boehm" = "xyes"; then
4968                         AC_CONFIG_SUBDIRS(libgc)
4969                 fi
4970                 ;;
4971 esac
4973 MALLOC_MEMPOOLS=no
4974 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
4975         if test x$with_malloc_mempools = xyes; then
4976                 MALLOC_MEMPOOLS=yes
4977                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
4978         fi
4982 DISABLE_MCS_DOCS=default
4983 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
4984         if test x$with_mcs_docs != xyes; then
4985                 DISABLE_MCS_DOCS=yes
4986         fi
4988 if test -n "$INSTALL_4_x_TRUE"; then :
4989         DISABLE_MCS_DOCS=yes
4991 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
4992    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
4995 AC_ARG_WITH(lazy_gc_thread_creation, [  --with-lazy-gc-thread-creation=yes|no      Enable lazy runtime thread creation, embedding host must do it explicitly (defaults to no)],[
4996         if test x$with_lazy_gc_thread_creation != xno ; then
4997                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
4998         fi
4999 ], [with_lazy_gc_thread_creation=no])
5001 AC_ARG_WITH(cooperative_gc,        [  --with-cooperative-gc=yes|no        Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [AC_MSG_WARN([--with-cooperative-gc is deprecated, use --enable-cooperative-suspend instead])], [with_cooperative_gc=default])
5002 AC_ARG_ENABLE(cooperative_suspend, [  --enable-cooperative-suspend      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [], [enable_cooperative_suspend=default])
5004 if test x$enable_cooperative_suspend = xdefault -a x$with_cooperative_gc != xdefault; then
5005         enable_cooperative_suspend=$with_cooperative_gc
5008 if test x$enable_cooperative_suspend = xdefault; then
5009         enable_cooperative_suspend=$enable_cooperative_suspend_default
5012 if test x$enable_cooperative_suspend != xno; then
5013         AC_DEFINE(ENABLE_COOP_SUSPEND,1,[Enable cooperative stop-the-world garbage collection.])
5016 AM_CONDITIONAL([ENABLE_COOP_SUSPEND], [test x$enable_cooperative_suspend != xno])
5018 AC_ARG_ENABLE(hybrid_suspend, [ --enable-hybrid-suspend     Enable hybrid stop-the-world garbage collection (sgen only) - cooperative suspend for threads running managed and runtime code, and preemptive suspend for threads running native and P/Invoke code (defaults to no)], [], [enable_hybrid_suspend=default])
5020 if test x$enable_hybrid_suspend = xdefault; then
5021    enable_hybrid_suspend=$enable_hybrid_suspend_default
5024 if test x$enable_hybrid_suspend != xno -a x$enable_cooperative_suspend != xno ; then
5025         AC_MSG_ERROR([Hybrid suspend and Cooperative suspend cannot be both enabled.])
5028 if test x$enable_hybrid_suspend != xno ; then
5029         AC_DEFINE(ENABLE_HYBRID_SUSPEND,1,[Enable hybrid suspend for GC stop-the-world])
5032 AM_CONDITIONAL([ENABLE_HYBRID_SUSPEND], [test x$enable_hybrid_suspend != xno])
5034 AC_ARG_ENABLE(checked_build, [  --enable-checked-build=LIST      To enable checked build (expensive asserts), configure with a comma-separated LIST of checked build modules and then include that same list in the environment variable MONO_CHECK_MODE at runtime. Recognized checked build modules: all, gc, metadata, thread, private_types],[
5036         if test x$enable_checked_build != x ; then
5037                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
5038         fi
5039         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
5040                 eval "mono_checked_build_test_enable_$feature='yes'"
5041         done
5043         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
5044                 eval "mono_checked_build_test_enable_gc='yes'"
5045                 eval "mono_checked_build_test_enable_metadata='yes'"
5046                 eval "mono_checked_build_test_enable_thread='yes'"
5047                 eval "mono_checked_build_test_enable_private_types='yes'"
5048         fi
5050         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
5051                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
5052         fi
5054         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
5055                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
5056         fi
5058         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
5059                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
5060         fi
5062         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
5063                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
5064         fi
5065 ], [])
5067 AC_CHECK_HEADER([malloc.h], 
5068                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
5069                         [Define to 1 if you have /usr/include/malloc.h.])],,)
5071 if test x"$GCC" = xyes; then
5072         # Implicit function declarations are not 64 bit safe
5073         # Do this late, since this causes lots of configure tests to fail
5074         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
5075         # jay has a lot of implicit declarations
5076         JAY_CFLAGS="-Wno-implicit-function-declaration"
5079 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
5080 # instead of libmono-static.a
5081 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
5082    LIBMONO_LA=libmini-static.la
5083 else
5084    if test x$buildsgen = xyes; then
5085       LIBMONO_LA=libmonosgen-$API_VER.la
5086    else
5087       LIBMONO_LA=libmonoboehm-$API_VER.la
5088    fi
5090 AC_SUBST(LIBMONO_LA)
5092 dnl **************
5093 dnl ***  Btls  ***
5094 dnl **************
5096 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
5097 AC_ARG_ENABLE(btls-lib, [  --disable-btls-lib             Disable building the BTLS native library], enable_btls_lib=$enableval, enable_btls_lib=$BTLS_SUPPORTED)
5098 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
5100 if test "x$enable_btls" = "xno"; then
5101    enable_btls_lib=no
5104 AM_CONDITIONAL(BTLS, test x$enable_btls_lib = xyes)
5106 btls_android=no
5107 if test "x$enable_btls" = "xyes"; then
5108         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
5109         if test "x$CMAKE" = "xno"; then
5110                 AC_MSG_ERROR("cmake not found")
5111         fi
5113         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
5114         AC_SUBST(BTLS_ROOT)
5116         btls_arch=
5117         btls_cflags=
5118         BTLS_CMAKE_ARGS=
5120         case "$BTLS_PLATFORM" in
5121         i386)
5122                 btls_arch=i386
5123                 btls_cflags="-m32"
5124                 case $host_os in
5125                         darwin*)
5126                                 btls_cflags="$btls_cflags -arch i386"
5127                 esac
5128                 ;;
5129         x86_64)
5130                 btls_arch=x86_64
5131                 ;;
5132         arm)
5133                 btls_arch=arm
5134                 btls_cflags="-DOPENSSL_NO_ASM=1"
5135                 ;;
5136         armsoft)
5137                 btls_arch=arm
5138                 btls_cflags="-DOPENSSL_NO_ASM=1"
5139                 ;;
5140         aarch64)
5141                 btls_arch=aarch64
5142                 btls_cflags="-march=armv8-a+crypto"
5143                 ;;
5144         s390x)
5145                 btls_arch=s390x
5146                 ;;
5147         powerpc)
5148                 btls_arch=powerpc
5149                 case $host_os in
5150                         aix*|os400*)
5151                                 btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
5152                                 BTLS_CMAKE_ARGS="-DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
5153                 esac
5154                 ;;
5155         android-armv5)
5156                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
5157                 ;;
5158         android-armv6)
5159                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
5160                 ;;
5161         android-armv7)
5162                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=14"
5163                 ;;
5164         android-v8a)
5165                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=21"
5166                 ;;
5167         android-x86)
5168                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=14"
5169                 ;;
5170         android-x64)
5171                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=21"
5172                 ;;
5173         *)
5174                 AC_MSG_ERROR(Invalid BTLS platform)
5175         esac
5177         if test "x$platform_android" = "xyes"; then
5178                 btls_android=yes
5179                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
5180                 if test "x$with_btls_android_ndk" != "x"; then
5181                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
5182                 else
5183                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
5184                 fi
5185         fi
5187         if test "x$btls_arch" != "x"; then
5188                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
5189         fi
5191         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
5192         AC_SUBST(BTLS_ARCH)
5193         AC_SUBST(BTLS_CFLAGS)
5194         AC_SUBST(BTLS_PLATFORM)
5195         AC_SUBST(BTLS_CMAKE_ARGS)
5197         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
5198 else
5199         enable_btls=no
5202 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
5204 if test x$DISABLE_MCS_DOCS = xyes; then
5205    docs_dir=""
5206 else
5207    docs_dir=docs
5209 AC_SUBST(docs_dir)
5211 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
5212 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
5213 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
5215 libmono_ldflags="$libmono_ldflags $LIBS"
5217 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
5218 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
5219 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
5220 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
5221 AM_CONDITIONAL(X86, test x$TARGET = xX86)
5222 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
5223 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
5224 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
5225 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
5226 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
5227 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64)
5228 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
5229 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
5230 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
5231 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
5232 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
5233 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
5234 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
5236 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
5238 AC_SUBST(LIBC)
5239 AC_SUBST(INTL)
5240 AC_SUBST(SQLITE)
5241 AC_SUBST(SQLITE3)
5242 AC_SUBST(X11)
5243 AC_SUBST(GDKX11)
5244 AC_SUBST(GTKX11)
5245 AC_SUBST(XINERAMA)
5246 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
5247 AC_SUBST(arch_target)
5248 AC_SUBST(CFLAGS)
5249 AC_SUBST(CPPFLAGS)
5250 AC_SUBST(LDFLAGS)
5252 #This must always be defined when building the runtime
5253 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
5255 mono_build_root=`pwd`
5256 AC_SUBST(mono_build_root)
5258 mono_runtime=mono/mini/mono
5259 AC_SUBST(mono_runtime)
5261 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/Microsoft.Net.Compilers.2.8.2/tools/csc.exe
5263 if test $csc_compiler = mcs; then
5264   CSC=$mcs_topdir/class/lib/build/mcs.exe
5265 else
5266   CSC=$CSC_LOCATION
5269 AM_CONDITIONAL([CSC_IS_ROSLYN], [test x$csc_compiler != xmcs])
5271 mono_cfg_root=$mono_build_root/runtime
5272 if test x$host_win32 = xyes; then
5273   if test "x$cross_compiling" = "xno"; then
5274     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
5275     CSC=`cygpath -m -a $CSC`
5276     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
5277   else
5278     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
5279   fi
5280 else
5281   mono_cfg_dir=$mono_cfg_root/etc
5283 AC_SUBST(mono_cfg_dir)
5285 AC_SUBST(CSC)
5287 AC_CONFIG_FILES([po/mcs/Makefile.in])
5289 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
5290 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
5292 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
5293 [   depth=../../../..
5294     case $srcdir in
5295     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5296     .) reldir=$depth ;;
5297     *) reldir=$depth/$srcdir ;;
5298     esac
5299     $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
5300     cd runtime/etc/mono/1.0
5301     rm -f machine.config
5302     $LN_S $reldir/data/net_1_1/machine.config machine.config
5303     cd $depth
5304 ],[LN_S='$LN_S'])
5306 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
5307 [   depth=../../../..
5308     case $srcdir in
5309     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5310     .) reldir=$depth ;;
5311     *) reldir=$depth/$srcdir ;;
5312     esac
5313     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5314     cd runtime/etc/mono/2.0
5315     rm -f machine.config
5316     $LN_S $reldir/data/net_2_0/machine.config machine.config
5317     cd $depth
5318 ],[LN_S='$LN_S'])
5320 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
5321 [   depth=../../../..
5322     case $srcdir in
5323     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5324     .) reldir=$depth ;;
5325     *) reldir=$depth/$srcdir ;;
5326     esac
5327     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5328     cd runtime/etc/mono/2.0
5329     rm -f web.config
5330     $LN_S $reldir/data/net_2_0/web.config web.config
5331     cd $depth
5332 ],[LN_S='$LN_S'])
5334 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
5335 [   depth=../../..
5336     case $srcdir in
5337     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5338     .) reldir=$depth ;;
5339     *) reldir=$depth/$srcdir ;;
5340     esac
5341     $ac_aux_dir/install-sh -d runtime/etc/mono/
5342     cd runtime/etc/mono/
5343     rm -f browscap.ini
5344     $LN_S $reldir/data/browscap.ini browscap.ini
5345     cd $depth
5346 ],[LN_S='$LN_S'])
5348 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
5349 [   depth=../../../../..
5350     case $srcdir in
5351     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5352     .) reldir=$depth ;;
5353     *) reldir=$depth/$srcdir ;;
5354     esac
5355     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
5356     cd runtime/etc/mono/2.0/Browsers
5357     rm -f Compat.browser
5358     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5359     cd $depth
5360 ],[LN_S='$LN_S'])
5362 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
5363 [   depth=../../../../..
5364     case $srcdir in
5365     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5366     .) reldir=$depth ;;
5367     *) reldir=$depth/$srcdir ;;
5368     esac
5369     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
5370     cd runtime/etc/mono/4.0/Browsers
5371     rm -f Compat.browser
5372     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5373     cd $depth
5374 ],[LN_S='$LN_S'])
5376 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
5377 [   depth=../../../../..
5378     case $srcdir in
5379     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5380     .) reldir=$depth ;;
5381     *) reldir=$depth/$srcdir ;;
5382     esac
5383     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
5384     cd runtime/etc/mono/4.5/Browsers
5385     rm -f Compat.browser
5386     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5387     cd $depth
5388 ],[LN_S='$LN_S'])
5390 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
5391 [   depth=../../../..
5392     case $srcdir in
5393     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5394     .) reldir=$depth ;;
5395     *) reldir=$depth/$srcdir ;;
5396     esac
5397     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5398     cd runtime/etc/mono/4.0
5399     rm -f machine.config
5400     $LN_S $reldir/data/net_4_0/machine.config machine.config
5401     cd $depth
5402 ],[LN_S='$LN_S'])
5404 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
5405 [   depth=../../../..
5406     case $srcdir in
5407     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5408     .) reldir=$depth ;;
5409     *) reldir=$depth/$srcdir ;;
5410     esac
5411     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5412     cd runtime/etc/mono/4.0
5413     rm -f web.config
5414     $LN_S $reldir/data/net_4_0/web.config web.config
5415     cd $depth
5416 ],[LN_S='$LN_S'])
5418 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
5419 [   depth=../../../..
5420     case $srcdir in
5421     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5422     .) reldir=$depth ;;
5423     *) reldir=$depth/$srcdir ;;
5424     esac
5425     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5426     cd runtime/etc/mono/4.5
5427     rm -f machine.config
5428     $LN_S $reldir/data/net_4_5/machine.config machine.config
5429     cd $depth
5430 ],[LN_S='$LN_S'])
5432 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
5433 [   depth=../../../..
5434     case $srcdir in
5435     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5436     .) reldir=$depth ;;
5437     *) reldir=$depth/$srcdir ;;
5438     esac
5439     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5440     cd runtime/etc/mono/4.5
5441     rm -f web.config
5442     $LN_S $reldir/data/net_4_5/web.config web.config
5443     cd $depth
5444 ],[LN_S='$LN_S'])
5446 AC_CONFIG_COMMANDS([quiet-libtool], [sed -e 's/echo "copying selected/# "copying selected/g' < libtool > libtool.tmp && mv libtool.tmp libtool && chmod a+x libtool; sed -e 's/$ECHO "copying selected/# "copying selected/g' < libtool > libtool.tmp && mv libtool.tmp libtool && chmod a+x libtool])
5447 AC_CONFIG_COMMANDS([nolock-libtool], [sed -e 's/lock_old_archive_extraction=yes/lock_old_archive_extraction=no/g' < libtool > libtool.tmp && mv libtool.tmp libtool && chmod a+x libtool])
5449 # Anything involving -Werror must be done late because autoconf depends on compiling with warnings to be success.
5450 if test x"$GCC" = xyes; then
5452         # incompatible-pointer-types requires gcc circa 5.x
5454         ORIG_CFLAGS=$CFLAGS
5455         CFLAGS="$CFLAGS -Wincompatible-pointer-types -Werror"
5456         AC_MSG_CHECKING(for -Wincompatible-pointer-types option to gcc)
5457         AC_TRY_COMPILE([],[
5458         ], [
5459                 AC_MSG_RESULT(yes)
5460                 CFLAGS="$ORIG_CFLAGS -Werror=incompatible-pointer-types"
5461         ], [
5462                 AC_MSG_RESULT(no)
5463                 CFLAGS=$ORIG_CFLAGS
5464         ])
5467 AC_OUTPUT([
5468 Makefile
5469 mono-uninstalled.pc
5470 acceptance-tests/Makefile
5471 llvm/Makefile
5472 scripts/mono-find-provides
5473 scripts/mono-find-requires
5474 mk/Makefile
5475 mono/Makefile
5476 mono/btls/Makefile
5477 mono/utils/Makefile
5478 mono/utils/jemalloc/Makefile
5479 mono/metadata/Makefile
5480 mono/dis/Makefile
5481 mono/cil/Makefile
5482 mono/arch/Makefile
5483 mono/arch/x86/Makefile
5484 mono/arch/amd64/Makefile
5485 mono/arch/ppc/Makefile
5486 mono/arch/sparc/Makefile
5487 mono/arch/s390x/Makefile
5488 mono/arch/arm/Makefile
5489 mono/arch/arm64/Makefile
5490 mono/arch/mips/Makefile
5491 mono/sgen/Makefile
5492 mono/tests/Makefile
5493 mono/tests/tests-config
5494 mono/tests/gc-descriptors/Makefile
5495 mono/tests/testing_gac/Makefile
5496 mono/unit-tests/Makefile
5497 mono/benchmark/Makefile
5498 mono/mini/Makefile
5499 mono/profiler/Makefile
5500 mono/eglib/Makefile
5501 mono/eglib/eglib-config.h
5502 m4/Makefile
5503 ikvm-native/Makefile
5504 scripts/Makefile
5505 man/Makefile
5506 docs/Makefile
5507 data/Makefile
5508 data/net_2_0/Makefile
5509 data/net_4_0/Makefile
5510 data/net_4_5/Makefile
5511 data/net_2_0/Browsers/Makefile
5512 data/net_4_0/Browsers/Makefile
5513 data/net_4_5/Browsers/Makefile
5514 data/mint.pc
5515 data/mono-2.pc
5516 data/monosgen-2.pc
5517 data/mono.pc
5518 data/mono-cairo.pc
5519 data/mono-nunit.pc
5520 data/mono-options.pc
5521 data/mono-lineeditor.pc
5522 data/monodoc.pc
5523 data/dotnet.pc
5524 data/dotnet35.pc
5525 data/wcf.pc
5526 data/cecil.pc
5527 data/system.web.extensions_1.0.pc
5528 data/system.web.extensions.design_1.0.pc
5529 data/system.web.mvc.pc
5530 data/system.web.mvc2.pc
5531 data/system.web.mvc3.pc
5532 data/aspnetwebstack.pc
5533 data/reactive.pc
5534 samples/Makefile
5535 support/Makefile
5536 data/config
5537 tools/Makefile
5538 tools/locale-builder/Makefile
5539 tools/sgen/Makefile
5540 tools/monograph/Makefile
5541 tools/pedump/Makefile
5542 runtime/Makefile
5543 msvc/Makefile
5544 po/Makefile
5547 # Update all submodules recursively to ensure everything is checked out
5548 $srcdir/scripts/update_submodules.sh
5550 if test x$host_win32 = xyes; then
5551    # Get rid of 'cyg' prefixes in library names
5552    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
5553    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
5554    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
5555    # executable doesn't work...
5556    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
5559 if test x$host_darwin = xyes; then
5560    # This doesn't seem to be required and it slows down parallel builds
5561    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
5565   case $prefix in
5566   NONE) prefix=$ac_default_prefix ;;
5567   esac
5568   case $exec_prefix in
5569   NONE) exec_prefix='${prefix}' ;;
5570   esac
5572   #
5573   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
5574   # any existing config.make.  This allows people to share the same source tree
5575   # with different build directories, one native and one cross
5576   #
5577   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
5579     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
5581     echo "prefix=$prefix" > $mcs_topdir/build/config.make
5582     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
5583     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
5584     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
5585     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
5586     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
5587     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
5588     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
5589     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
5591     case $INSTALL in
5592     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
5593     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
5594     esac
5596     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
5598     export VERSION
5599     [myver=$($AWK 'BEGIN {
5600       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
5601       if(length(vsplit [1]) > 4) {
5602         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
5603       }
5604       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
5605     }')]
5607     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
5608     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
5610     if test x$host_darwin = xyes; then
5611       echo "BUILD_PLATFORM = macos" >> $mcs_topdir/build/config.make
5612       echo "HOST_PLATFORM ?= macos" >> $mcs_topdir/build/config.make
5613       echo "XTEST_PLATFORM ?= osx" >> $mcs_topdir/build/config.make
5614     elif test x$host_win32 = xyes; then
5615       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
5616       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
5617       echo "XTEST_PLATFORM ?= windows" >> $mcs_topdir/build/config.make
5618     elif test x$host_linux = xyes; then
5619       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
5620       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
5621       echo "XTEST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
5622     else
5623       echo "BUILD_PLATFORM = unix" >> $mcs_topdir/build/config.make
5624       echo "HOST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
5625       echo "XTEST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
5626     fi
5628     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
5629       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
5630     fi
5632         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
5633            enable_system_aot=yes
5634         fi
5636     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
5637       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
5638     fi
5640     if test x$DISABLE_MCS_DOCS = xyes; then
5641       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
5642     fi
5644     if test x$has_extension_module != xno; then
5645         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
5646     fi
5647     
5648     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
5649     
5650     if test "x$test_bcl_opt" = "xyes"; then    
5651       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
5652     fi
5654     echo "CSC_LOCATION = $CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
5656     if test $csc_compiler = mcs; then
5657       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
5658     fi
5660     if test "x$AOT_BUILD_FLAGS" != "x" ; then
5661       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
5662       echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
5663       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
5664     fi
5666     if test "x$AOT_MODE" != "x" ; then
5667       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
5668     fi
5670     if test "x$enable_btls" = "xyes"; then
5671       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
5672     fi
5674   fi
5678 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
5680 btls_platform_string=
5681 if test x$enable_btls = xyes; then
5682         if test x$btls_android = xyes; then
5683                 btls_platform_string=" (android:$BTLS_PLATFORM)"
5684         else
5685                 btls_platform_string=" ($BTLS_PLATFORM)"
5686         fi
5689 thread_suspend_msg=
5690 if test x$buildsgen = xyes; then
5691         if test x$enable_cooperative_suspend = xyes; then
5692                 thread_suspend_msg="Suspend:       Cooperative"
5693         elif test x$enable_hybrid_suspend = xyes; then
5694                 thread_suspend_msg="Suspend:       Hybrid"
5695         else
5696                 thread_suspend_msg="Suspend:       Preemptive"
5697         fi
5699         
5700 echo "
5701         mcs source:    $mcsdir
5702         C# Compiler:   $csc_compiler
5704    Engine:
5705         Host:          $host
5706         Target:        $target
5707         GC:            $gc_msg 
5708         $thread_suspend_msg
5709         TLS:           $with_tls
5710         SIGALTSTACK:   $with_sigaltstack
5711         Engine:        $jit_status
5712         BigArrays:     $enable_big_arrays
5713         DTrace:        $enable_dtrace
5714         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm, built in-tree: $internal_llvm, assertions: $enable_llvm_asserts)
5715         Spectre:       $spectre_mitigation_status
5717    Libraries:
5718         .NET 4.x:        $with_profile4_x
5719         Xamarin.Android: $with_monodroid
5720         Xamarin.iOS:     $with_monotouch
5721         Xamarin.WatchOS: $with_monotouch_watch
5722         Xamarin.TVOS:    $with_monotouch_tv
5723         Xamarin.Mac:     $with_xammac
5724         Windows AOT:     $with_winaot
5725         Orbis:           $with_orbis
5726         Unreal:          $with_unreal
5727         WebAssembly:     $with_wasm
5728         Test profiles:   AOT Full ($with_testing_aot_full), AOT Hybrid ($with_testing_aot_hybrid)
5729         JNI support:     $jdk_headers_found
5730         libgdiplus:      $libgdiplus_msg
5731         zlib:            $zlib_msg
5732         BTLS:            $enable_btls$btls_platform_string
5733         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
5734         $disabled
5736 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
5737    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)