[Coop] Convert System.CLRConfig to coop. (#8606)
[mono-project.git] / configure.ac
blob5a04c4df1be6602ee90792f47e43beaab6f805e9
1 # Process this file with autoconf to produce a configure script.
2 #AC_PREREQ([2.62])
4 AC_INIT(mono, [5.15.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=3
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
121 if test "x$enable_wasm" = "xyes"; then
122 CFLAGS="$CFLAGS -D_REENTRANT -D_GNU_SOURCE -DNO_UNALIGNED_ACCESS -s WASM=1"
123 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DUSE_MMAP -D_GNU_SOURCE -DNO_UNALIGNED_ACCESS -s WASM=1"
124 libdl="-ldl"
125 libgc_threads=pthreads
126 platform_wasm=yes
128 else
130 case "$host" in
131         *-mingw*|*-*-cygwin*)
132                 AC_DEFINE(DISABLE_PORTABILITY,1,[Disable the io-portability layer])
133                 AC_DEFINE(HOST_NO_SYMLINKS,1,[This platform does not support symlinks])
134                 host_win32=yes
135                 mono_cv_clang=no
136                 if test "x$cross_compiling" = "xno"; then
137                         if test "x$host" = "x$build" -a "x$host" = "x$target"; then
138                                 target_win32=yes
139                         fi
140                 else
141                         if test "x$host" = "x$target"; then
142                                 target_win32=yes
143                         fi
144                 fi
145                 HOST_CC="gcc"
146                 # Windows Vista or later is required
147                 CPPFLAGS="$CPPFLAGS -DWINVER=0x0600 -D_WIN32_WINNT=0x0600 -D_WIN32_IE=0x0501 -D_UNICODE -DUNICODE -DWIN32_THREADS -DFD_SETSIZE=1024"
148                 LDFLAGS="$LDFLAGS -lmswsock -lws2_32 -lole32 -loleaut32 -lpsapi -lversion -ladvapi32 -lwinmm -lkernel32 -liphlpapi"
149                 libmono_cflags="-mms-bitfields -mwindows"
150                 libmono_ldflags="-mms-bitfields -mwindows"
151                 libdl=
152                 libgc_threads=win32
153                 with_sigaltstack=no
154                 with_tls=pthread
155                 with_sgen_default_concurrent=yes
156                 LN_S=cp
157                 # This forces libgc to use the DllMain based thread registration code on win32
158                 libgc_configure_args="$libgc_configure_args --enable-win32-dllmain=yes"
159                 ;;
160         *-*-*netbsd*)
161                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DGC_NETBSD_THREADS -D_GNU_SOURCE"
162                 libmono_cflags="-D_REENTRANT"
163                 LDFLAGS="$LDFLAGS -pthread"
164                 CPPFLAGS="$CPPFLAGS -DHOST_BSD"
165                 libmono_ldflags="-pthread"
166                 need_link_unlink=yes
167                 libdl="-ldl"
168                 libgc_threads=pthreads
169                 with_sigaltstack=no
170                 use_sigposix=yes
171                 with_sgen_default_concurrent=yes
172                 ;;
173         *-*-kfreebsd*-gnu)
174                 CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP -DUSE_MUNMAP -DTHREAD_LOCAL_ALLOC -pthread"
175                 libmono_cflags="-D_REENTRANT -DTHREAD_LOCAL_ALLOC -pthread"
176                 libmono_ldflags="-lpthread -pthread"
177                 libdl="-ldl"
178                 libgc_threads=pthreads
179                 need_link_unlink=yes
180                 with_sigaltstack=no
181                 use_sigposix=yes
182                 with_sgen_default_concurrent=yes
183                 ;;
184         *-*-*freebsd*)
185                 if test "x$PTHREAD_CFLAGS" = "x"; then
186                         CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS"
187                         libmono_cflags=
188                 else
189                         CPPFLAGS="$CPPFLAGS $PTHREAD_CFLAGS -DGC_FREEBSD_THREADS"
190                         libmono_cflags="$PTHREAD_CFLAGS"
191                 fi
192                 if test "x$PTHREAD_LIBS" = "x"; then
193                         LDFLAGS="$LDFLAGS -pthread -L/usr/local/lib"
194                         libmono_ldflags="-pthread"
195                 else
196                         LDFLAGS="$LDFLAGS $PTHREAD_LIBS -L/usr/local/lib"
197                         libmono_ldflags="$PTHREAD_LIBS"
198                 fi
199                 CPPFLAGS="$CPPFLAGS -DHOST_BSD"
200                 need_link_unlink=yes
201                 AC_DEFINE(PTHREAD_POINTER_ID, 1, [pthread is a pointer])
202                 libdl=
203                 libgc_threads=pthreads
204                 use_sigposix=yes
205                 has_dtrace=yes
206                 with_sgen_default_concurrent=yes
207                 ;;
208         *-*-*openbsd*)
209                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_OPENBSD_THREADS -DHOST_BSD -D_REENTRANT -DUSE_MMAP"
210                 LDFLAGS="${LDFLAGS} -Wl,-zwxneeded"
211                 if test "x$disable_munmap" != "xyes"; then
212                 CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
213                 fi
214                 libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
215                 LDFLAGS="$LDFLAGS -pthread"
216                 need_link_unlink=yes
217                 AC_DEFINE(PTHREAD_POINTER_ID)
218                 libdl=
219                 libgc_threads=pthreads
220                 with_tls=pthread
221                 with_sigaltstack=no
222                 use_sigposix=yes
223                 with_sgen_default_concurrent=yes
224                 ;;
225         *-*-linux-android*)
226                 platform_android=yes
227                 AC_DEFINE(HOST_ANDROID,1,[Targeting the Android platform])
228                 AC_DEFINE(TARGET_ANDROID,1,[Targeting the Android platform])
230                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
231                 if test "x$disable_munmap" != "xyes"; then
232                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
233                 fi
234                 libmono_cflags="-D_REENTRANT"
235                 libdl="-ldl"
236                 libgc_threads=pthreads
237                 use_sigposix=yes
239                 with_tls=pthread
240                 with_sigaltstack=no
241                 with_static_mono=no
243                 # Android doesn't support boehm, as it's missing <link.h>
244                 support_boehm=no
245                 with_gc=sgen
247                 # isinf(3) requires -lm; see isinf check below
248                 LDFLAGS="$LDFLAGS -lm"
250                 # Bionic's <pthread.h> sets PTHREAD_STACK_MIN=2*PAGE_SIZE; doesn't define
251                 # PAGE_SIZE; breaks mono/io-layer/collection.c
252                 # Bionic doesn't provide S_IWRITE; breaks io-layer/io.c
253                 CFLAGS="$CFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
254                 CXXFLAGS="$CXXFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
256                 # to bypass the underscore linker check, can't work when cross-compiling
257                 mono_cv_uscore=yes
258                 mono_cv_clang=no
259                 ;;
260         *-*-linux*)
261                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
262                 if test "x$disable_munmap" != "xyes"; then
263                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
264                 fi
265                 libmono_cflags="-D_REENTRANT"
266                 libdl="-ldl"
267                 libgc_threads=pthreads
268                 use_sigposix=yes
269                 if test "x$cross_compiling" != "xno"; then
270                         # to bypass the underscore linker check, not
271                         # available during cross-compilation
272                         mono_cv_uscore=no
273                 fi
274                 case "$host" in
275                 *-tizen-linux-*)
276                         platform_tizen=yes
277                         ;;
278                 esac
279                 case "$host" in
280                 aarch64-*)
281                         support_boehm=no
282                         with_gc=sgen
283                         ;;
284                 powerpc*-*-linux*)
285                         # https://bugzilla.novell.com/show_bug.cgi?id=504411
286                         disable_munmap=yes
287                         ;;
288                 esac
289                 with_sgen_default_concurrent=yes
290                 ;;
291         *-*-nacl*)
292                 echo "nacl no longer supported."
293                 exit 1
294                 ;;
295         *-*-hpux*)
296                 CPPFLAGS="$CPPFLAGS -DGC_HPUX_THREADS -D_HPUX_SOURCE -D_XOPEN_SOURCE_EXTENDED -D_REENTRANT"
297                 # +ESdbgasm only valid on bundled cc on RISC
298                 # silently ignored for ia64
299                 if test $GCC != "yes"; then
300                         CFLAGS="$CFLAGS +ESdbgasm"
301                         # Arrange for run-time dereferencing of null
302                         # pointers to produce a SIGSEGV signal.
303                         LDFLAGS="$LDFLAGS -z"
304                 fi
305                 CFLAGS="$CFLAGS +ESdbgasm"
306                 LDFLAGS="$LDFLAGS -z"
307                 libmono_cflags="-D_REENTRANT"
308                 libmono_ldflags="-lpthread"
309                 libgc_threads=pthreads
310                 need_link_unlink=yes
311                 use_sigposix=yes
312                 ;;
313         *-*-solaris*)
314                 CPPFLAGS="$CPPFLAGS -DGC_SOLARIS_THREADS -DGC_SOLARIS_PTHREADS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -DUSE_MMAP -DUSE_MUNMAP -DHOST_SOLARIS"
315                 need_link_unlink=yes
316                 libmono_cflags="-D_REENTRANT"
317                 libgc_threads=pthreads
318                 has_dtrace=yes
319                 use_sigposix=yes
320                 enable_solaris_tar_check=yes
321                 ;;
322         *-*-darwin*)
323                 parallel_mark="Disabled_Currently_Hangs_On_MacOSX"
324                 host_darwin=yes
325                 target_mach=yes
326                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_MACOSX_THREADS -DUSE_MMAP -DUSE_MUNMAP"
327                 libmono_cflags="-D_THREAD_SAFE"
328                 need_link_unlink=yes
329                 AC_DEFINE(PTHREAD_POINTER_ID)
330                 AC_DEFINE(USE_MACH_SEMA, 1, [...])
331                 libdl=
332                 libgc_threads=pthreads
333                 has_dtrace=yes
334                 if test "x$cross_compiling" = "xyes"; then
335                         has_broken_apple_cpp=yes
336                 fi
337                 dnl Snow Leopard is horribly broken -- it reports itself as i386-apple-darwin*, but
338                 dnl its gcc defaults to 64-bit mode.  They have also deprecated the usage of ucontext
339                 dnl we need to set some flags to build our 32-bit binaries on 10.6 properly
340                 case "$host" in
341                         dnl Snow Leopard and newer config.guess reports as this
342                         i*86-*-darwin*)
343                                 BROKEN_DARWIN_FLAGS="-arch i386 -D_XOPEN_SOURCE"
344                                 BROKEN_DARWIN_CPPFLAGS="-D_XOPEN_SOURCE"
345                                 CPPFLAGS="$CPPFLAGS $BROKEN_DARWIN_CPPFLAGS"
346                                 CFLAGS="$CFLAGS $BROKEN_DARWIN_FLAGS"
347                                 CXXFLAGS="$CXXFLAGS $BROKEN_DARWIN_FLAGS"
348                                 CCASFLAGS="$CCASFLAGS $BROKEN_DARWIN_FLAGS"
349                                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC $BROKEN_DARWIN_CPPFLAGS"
350                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC $BROKEN_DARWIN_FLAGS"
351                                 with_sgen_default_concurrent=yes
352                                 ;;
353                         x*64-*-darwin*)
354                                 with_sgen_default_concurrent=yes
355                                 ;;
356                         arm*-darwin*)
357                                 platform_ios=yes
358                                 has_dtrace=no
359                                 ;;
360                         aarch64*-darwin*)
361                                 platform_ios=yes
362                                 ;;
363                 esac
364                 ;;
365         *-*-haiku*)
366                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -D_THREAD_SAFE"
367                 libmono_cflags="-D_REENTRANT -D_THREAD_SAFE"
368                 libdl=
369                 LIBS="$LIBS -lnetwork -ltextencoding"
370                 need_link_unlink=yes
371                 AC_DEFINE(PTHREAD_POINTER_ID)
372                 dnl Haiku does not support static TLS with __thread
373                 with_tls=pthread
374                 libgc_threads=pthreads
375                 use_sigposix=yes
376                 ;;
377         *-*-aix*|*-*-os400*)
378                 dnl Set up a 64-bit build
379                 CPPFLAGS="$CPPFLAGS -maix64 -DGC_AIX_THREADS -D_ALL_SOURCE -D_THREAD_SAFE -D_LARGE_FILES -D_REENTRANT"
380                 LDFLAGS="-maix64"
381                 libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
382                 dnl Would you believe GNU nm doesn't know how to process AIX libraries?
383                 dnl Hardcode IBM binutils in case GNU ones end up on our path. Also
384                 dnl specifiy 64-bit mode for tools.
385                 AR="/usr/bin/ar -X64"
386                 NM="/usr/bin/nm -X64"
387                 dnl SGen is the future (changes to Boehm support code would be
388                 dnl required if you wish to re-enable Boehm)
389                 support_boehm=no
390                 with_gc=sgen
391                 need_link_unlink=yes
392                 use_sigposix=yes
393                 dnl the valloc call to alloc the guard page bombs out, even with extending the data area
394                 with_sigaltstack=no
395                 dnl use pthread TLS, __thread has issues with the compiler flags we use
396                 with_tls=pthread
397                 dnl ppc Linux is the same? test further
398                 disable_munmap=yes
399                 ;;
400         *)
401                 AC_MSG_WARN([*** Please add $host to configure.ac checks!])
402                 libdl="-ldl"
403                 ;;
404 esac
406 # WASM hack
409 AC_MSG_RESULT(ok)
411 if test x$need_link_unlink = xyes; then
412    AC_DEFINE(NEED_LINK_UNLINK, 1, [Define if Unix sockets cannot be created in an anonymous namespace])
415 if test x$host_win32 = xyes; then
416    AC_DEFINE(HOST_WIN32, 1, [Host Platform is Win32])
419 if test x$target_win32 = xyes; then
420    AC_DEFINE(TARGET_WIN32, 1, [Target Platform is Win32])
423 if test x$host_darwin = xyes; then
424    AC_DEFINE(HOST_DARWIN, 1, [Host Platform is Darwin])
427 # Defined for all targets/platforms using classic Windows API support.
428 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
429 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
431 AC_SUBST(extra_runtime_ldflags)
432 AM_CONDITIONAL(HOST_WIN32, test x$host_win32 = xyes)
433 AM_CONDITIONAL(TARGET_WIN32, test x$target_win32 = xyes)
434 AM_CONDITIONAL(HOST_LINUX, echo x$target_os | grep -q linux)
435 AM_CONDITIONAL(HOST_DARWIN, test x$host_darwin = xyes)
436 AM_CONDITIONAL(HOST_SIGPOSIX, test x$use_sigposix = xyes)
437 AM_CONDITIONAL(HOST_ANDROID, test x$platform_android = xyes)
438 AM_CONDITIONAL(HOST_TIZEN, test x$platform_tizen = xyes)
439 AM_CONDITIONAL(HOST_IOS, test x$platform_ios = xyes)
440 AM_CONDITIONAL(HOST_WASM, test x$platform_wasm = xyes)
442 if test -z "$HOST_DARWIN_TRUE"; then :
443 PLATFORM_AOT_SUFFIX=.dylib
446 if test -z "$HOST_LINUX_TRUE"; then :
447 PLATFORM_AOT_SUFFIX=.so
450 if test -z "$HOST_WIN32_TRUE"; then :
451 PLATFORM_AOT_SUFFIX=.dll
454 AC_SUBST(PLATFORM_AOT_SUFFIX)
456 ## PLATFORM_AOT_SUFFIX not so simple for windows :-)
458 AC_CHECK_TOOL(CC, gcc, gcc)
459 AC_PROG_CC
460 AC_CHECK_TOOL(CXX, g++, g++)
461 AC_PROG_CXX
462 AM_PROG_AS
463 AC_PROG_INSTALL
464 AC_PROG_AWK
465 AM_PROG_CC_C_O
466 dnl We should use AM_PROG_AS, but it's not available on automake/aclocal 1.4
467 : ${CCAS='$(CC)'}
468 # Set ASFLAGS if not already set.
469 : ${CCASFLAGS='$(CFLAGS)'}
470 AC_SUBST(CCAS)
471 AC_SUBST(CCASFLAGS)
473 # AC_PROG_CXX helpfully sets CXX to g++ even if no c++ compiler is found so check
474 # GXX instead. See http://lists.gnu.org/archive/html/bug-autoconf/2002-04/msg00056.html
475 if test "x$CXX" = "xg++"; then
476         if test "x$GXX" != "xyes"; then
477                 # automake/libtool is so broken, it requires g++ even if the c++ sources
478                 # are inside automake conditionals
479                 AC_MSG_ERROR([You need to install g++])
480         fi
483 dnl may require a specific autoconf version
484 dnl AC_PROG_CC_FOR_BUILD
485 dnl CC_FOR_BUILD not automatically detected
486 CC_FOR_BUILD=$CC
487 CFLAGS_FOR_BUILD=$CFLAGS
488 BUILD_EXEEXT=
489 if test "x$cross_compiling" = "xyes"; then
490         CC_FOR_BUILD=cc
491         CFLAGS_FOR_BUILD=
492         BUILD_EXEEXT=""
494 AC_SUBST(CC_FOR_BUILD)
495 AC_SUBST(CFLAGS_FOR_BUILD)
496 AC_SUBST(HOST_CC)
497 AC_SUBST(BUILD_EXEEXT)
499 AM_CONDITIONAL(CROSS_COMPILING, [test x$cross_compiling = xyes])
500 AM_CONDITIONAL(USE_BATCH_FILES, [test x$host_win32 = xyes -a x$cross_compiling = xyes])
502 # Set STDC_HEADERS
503 AC_HEADER_STDC
504 AC_LIBTOOL_WIN32_DLL
505 # This causes monodis to not link correctly
506 #AC_DISABLE_FAST_INSTALL
508 #lookup makedev() header
509 AC_HEADER_MAJOR
511 AM_PROG_LIBTOOL
512 # Use dolt (http://dolt.freedesktop.org/) instead of libtool for building.
513 DOLT
515 export_ldflags=`(./libtool --config; echo eval echo \\$export_dynamic_flag_spec) | sh`
516 AC_SUBST(export_ldflags)
518 # Test whenever ld supports -version-script
519 AC_PROG_LD
520 AC_PROG_LD_GNU
522 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)
523 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)
524 AC_CHECK_HEADERS([linux/netlink.h linux/rtnetlink.h],
525                   [], [], [#include <stddef.h>
526                   #include <sys/socket.h>
527                   #include <linux/socket.h>])
529 AC_CHECK_HEADERS(sys/user.h, [], [],
531 #ifdef HAVE_SYS_PARAM_H
532 # include <sys/param.h>
533 #endif
536 AC_CHECK_HEADERS(linux/serial.h)
538 AC_CHECK_HEADER(zlib.h, [have_zlib=yes], [have_zlib=no])
539 if test x$have_zlib = xyes; then
540    AC_TRY_COMPILE([#include <zlib.h>], [
541    #if defined(ZLIB_VERNUM) && (ZLIB_VERNUM >= 0x1230)
542    #else
543    #error No good zlib found
544    #endif
545    ],[
546         AC_MSG_RESULT(Using system zlib)
547         zlib_msg="system zlib"
548         AC_DEFINE(HAVE_SYS_ZLIB,1,[Have system zlib])
549    ],[
550         AC_MSG_RESULT(Using embedded zlib)
551         have_zlib=no
552         zlib_msg="bundled zlib"
553    ])
556 AM_CONDITIONAL(HAVE_ZLIB, test x$have_zlib = xyes)
557 AC_DEFINE(HAVE_ZLIB,1,[Have system zlib])
559 # for mono/metadata/debug-symfile.c
560 AC_CHECK_HEADERS(elf.h)
562 # for support
563 AC_CHECK_HEADERS(poll.h)
564 AC_CHECK_HEADERS(sys/poll.h)
565 AC_CHECK_HEADERS(sys/wait.h)
566 AC_CHECK_HEADERS(grp.h)
567 AC_CHECK_HEADERS(syslog.h)
568 AC_CHECK_FUNCS(vsyslog)
570 # for mono/dis
571 AC_CHECK_HEADERS(wchar.h)
572 AC_CHECK_HEADERS(ieeefp.h)
573 AC_MSG_CHECKING(for isinf)
574 AC_TRY_LINK([#include <math.h>], [
575         int f = isinf (1.0);
576 ], [
577         AC_MSG_RESULT(yes)
578         AC_DEFINE(HAVE_ISINF, 1, [isinf available])
579 ], [
580         # We'll have to use signals
581         AC_MSG_RESULT(no)
583 # mingw
584 AC_CHECK_FUNCS(_finite, , AC_MSG_CHECKING(for _finite in math.h)
585         AC_TRY_LINK([#include <math.h>], 
586         [ _finite(0.0); ], 
587         AC_DEFINE(HAVE__FINITE, 1, [Have _finite in -lm]) AC_MSG_RESULT(yes),
588         AC_MSG_RESULT(no)))
590 # for Linux statfs support
591 AC_CHECK_HEADERS(linux/magic.h)
593 # For Android NDK unified headers
594 if test x$platform_android = xyes; then
595         AC_CHECK_HEADERS(machine/endian.h sys/endian.h)
596         AC_CHECK_HEADERS(android/legacy_signal_inlines.h, [have_android_signal_inlines=yes], [have_android_signal_inlines=no])
598         # Make sure SIGRT{MIN,MAX} work - they will fail to work with unified headers if building for
599         # API level < 21 *and* android/legacy_signal_inlines.h doesn't declare (and define) the required
600         # libc APIs to obtain values for SIGRT{MIN,MAX}. We perform the check only if android/legacy_signal_inlines.h
601         # is found because in other cases the macros will either work (for NDK < 14) or fail if the legacy header
602         # doesn't contain the required definitions (NDK 14)
603         if test x$have_android_signal_inlines = xyes; then
604                 AC_MSG_CHECKING([Whether Android SIGRTMIN/SGRTMAX macros are valid])
605                 AC_COMPILE_IFELSE([
606                         AC_LANG_PROGRAM([#include <android/legacy_signal_inlines.h>],[
607                                 int i;
608                                 for (i = SIGRTMIN + 1; i < SIGRTMAX; ++i) {
609                                 }
610                         ])],[
611                                 AC_MSG_RESULT(yes)
612                                 android_sigrtminmax_work=yes
613                         ],[
614                                 AC_MSG_RESULT(no)
615                                 android_sigrtminmax_work=no
616                         ]
617                 )
619                 if test x$android_sigrtminmax_work = xno; then
620                         AC_MSG_ERROR([Android SIGRTMIN/SIGRTMAX macros don't work in this NDK])
621                 fi
622         fi
624         # Attempt to detect whether we're using Android NDK unified headers
625         AC_CHECK_HEADERS(android/api-level.h, [have_android_api_level=yes], [have_android_api_level=no])
626         AC_CHECK_HEADERS(android/versioning.h, [have_android_versioning=yes], [have_android_versioning=no])
628         android_unified_headers=no
629         if test x$have_android_api_level = xyes; then
630                 if test x$have_android_versioning = xyes; then
631                         AC_MSG_CHECKING([whether using Android NDK unified headers])
633                         # Both macros are defined only in the NDK unified headers
634                         AC_COMPILE_IFELSE([
635                                 AC_LANG_PROGRAM([
636                                         #include <android/api-level.h>
637                                         #include <android/versioning.h>
638                                 ],[
639                                         #if __ANDROID_API_O__ == 26 && defined(__INTRODUCED_IN)
640                                         #else
641                                                 #error __ANDROID_API_O__ != 26 or the __INTRODUCED_IN macro not defined
642                                         #endif
643                                 ])],[
644                                         AC_MSG_RESULT(yes)
645                                         android_unified_headers=yes
646                                 ],[
647                                         AC_MSG_RESULT(no)
648                                         android_unified_headers=no
649                                 ]
650                         )
651                 fi
652         fi
654         if test x$android_unified_headers = xyes; then
655                 AC_DEFINE(ANDROID_UNIFIED_HEADERS, 1, [Whether Android NDK unified headers are used])
656         fi
657 fi # Android
659 # not 64 bit clean in cross-compile
660 if test "x$enable_wasm" = "xyes"; then
661 AC_DEFINE(SIZEOF_VOID_P,4)
662 AC_DEFINE(SIZEOF_LONG,4)
663 ac_cv_sizeof_void_p="4"
664 ac_cv_sizeof_long="4"
665 else
666 AC_CHECK_SIZEOF(void *)
667 AC_CHECK_SIZEOF(long)
670 AC_CHECK_SIZEOF(int)
671 AC_CHECK_SIZEOF(long long)
673 AC_CACHE_CHECK([for clang],
674         mono_cv_clang,[
675         AC_TRY_COMPILE([], [
676                 #ifdef __clang__
677                 #else
678                 #error "FAILED"
679                 #endif
680         ],
681         [mono_cv_clang=yes],
682         [mono_cv_clang=no],
683         [])
686 AC_ARG_ENABLE(visibility-hidden,
687 [  --disable-visibility-hidden    disable usage of -fvisiblity=hidden],
688    disable_visibility_hidden=yes, disable_visibility_hidden=no)
690 WARN=''
691 if test x"$GCC" = xyes; then
692         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'
694                 # We require C99 with some GNU extensions, e.g. `linux` macro
695                 CFLAGS="$CFLAGS -std=gnu99"
697                 # The runtime code does not respect ANSI C strict aliasing rules
698                 CFLAGS="$CFLAGS -fno-strict-aliasing"
700                 # We rely on signed overflow to behave
701                 CFLAGS="$CFLAGS -fwrapv"
703                 CFLAGS="$CFLAGS -DMONO_DLL_EXPORT"
704                 if test x"$disable_visibility_hidden" = xno; then
705                    # Don't export any symbols by default
706                    SHARED_CFLAGS="-fvisibility=hidden"
707                    CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
708                 fi
710                 ORIG_CFLAGS=$CFLAGS
711                 # Check for the normal version, since gcc ignores unknown -Wno options
712                 CFLAGS="$CFLAGS -Wunused-but-set-variable -Werror"
713                 AC_MSG_CHECKING(for -Wno-unused-but-set-variable option to gcc)
714                 AC_TRY_COMPILE([],[
715                 ], [
716                    AC_MSG_RESULT(yes)
717                    CFLAGS="$ORIG_CFLAGS -Wno-unused-but-set-variable"
718                 ], [
719                    AC_MSG_RESULT(no)
720                    CFLAGS=$ORIG_CFLAGS
721                 ])
723                 if test "x$mono_cv_clang" = "xyes"; then
724                    # https://bugzilla.samba.org/show_bug.cgi?id=8118
725                    WARN="$WARN -Qunused-arguments"
726                    WARN="$WARN -Wno-unused-function -Wno-tautological-compare -Wno-parentheses-equality -Wno-self-assign -Wno-return-stack-address -Wno-constant-logical-operand"
727                    # We rely on zero length arrays in structs
728                    WARN="$WARN -Wno-zero-length-array"
729                 fi
730 else
731         # The Sun Forte compiler complains about inline functions that access static variables
732         # so disable all inlining.
733         case "$host" in
734         *-*-solaris*)
735                 CFLAGS="$CFLAGS -Dinline="
736                 ;;
737         esac
739 CFLAGS="$CFLAGS -g $WARN"
740 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -g"
741 CPPFLAGS="$CPPFLAGS -g $WARN"
743 # Where's the 'mcs' source tree?
744 if test -d $srcdir/mcs; then
745   mcsdir=mcs
746 else
747   mcsdir=../mcs
750 AC_ARG_WITH(mcs-path, [  --with-mcs-path=/path/to/mcs      Specify an alternate mcs source tree],
751         if test x$with_mcs_path != "x" -a -d $with_mcs_path ; then
752                 mcsdir=$with_mcs_path
753         fi
756 AC_ARG_WITH(jumptables, [  --with-jumptables=yes,no      enable/disable support for jumptables (ARM-only for now) (defaults to no)],[],[with_jumptables=no])
759 # A sanity check to catch cases where the package was unpacked
760 # with an ancient tar program (Solaris)
762 AC_ARG_ENABLE(solaris-tar-check,
763 [  --disable-solaris-tar-check    disable solaris tar check],
764    do_solaris_tar_check=no, do_solaris_tar_check=yes)
766 if test x"$do_solaris_tar_check" = xyes -a x"$enable_solaris_tar_check" = xyes; then
767         AC_MSG_CHECKING(integrity of package)
768         if test -f $mcsdir/class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapTypeMapper.cs
769         then
770                 AC_MSG_RESULT(ok)
771         else
772                 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"
773                 AC_MSG_ERROR([$errorm])
774         fi
777 if test "x$with_mcs_path" != "x"; then
778 mcs_topdir=$(cd "$mcsdir" && pwd)
779 mcs_topdir_from_srcdir=$mcs_topdir
780 else
781 mcs_topdir=$(cd "$srcdir/$mcsdir" && pwd)
782 mcs_topdir_from_srcdir='$(top_builddir)'/$mcsdir
785 # Convert mcs_topdir* paths to Windows syntax.
786 if test x$cross_compiling$host_win32 = xnoyes; then
787   mcs_topdir=$(cygpath -m $mcs_topdir)
788   case $mcs_topdir_from_srcdir in
789     /cygdrive/*)
790         mcs_topdir_from_srcdir=$(cygpath -m $mcs_topdir_from_srcdir)
791         ;;
792   esac
795 AC_SUBST([mcs_topdir])
796 AC_SUBST([mcs_topdir_from_srcdir])
798 # gettext: prepare the translation directories. 
799 # we do not configure the full gettext, as we consume it dynamically from C#
800 AM_PO_SUBDIRS
802 if test "x$USE_NLS" = "xyes"; then
803    AC_CHECK_PROG(HAVE_MSGFMT, msgfmt,yes,no)
805    if test "x$HAVE_MSGFMT" = "xno"; then
806           AC_MSG_ERROR([msgfmt not found. You need to install the 'gettext' package, or pass --enable-nls=no to configure.])
807    fi
810 AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
812 pkg_config_path=
813 AC_ARG_WITH(crosspkgdir, [  --with-crosspkgdir=/path/to/pkg-config/dir      Change pkg-config dir to custom dir],
814         if test x$with_crosspkgdir = "x"; then
815                 if test -s $PKG_CONFIG_PATH; then
816                         pkg_config_path=$PKG_CONFIG_PATH
817                 fi
818         else
819                 pkg_config_path=$with_crosspkgdir
820                 PKG_CONFIG_PATH=$pkg_config_path
821                 export PKG_CONFIG_PATH
822         fi
825 AC_ARG_ENABLE(ninja,[  --enable-ninja    Enable using ninja where available], enable_ninja=$enableval)
826 AC_CHECK_PROG(HAVE_NINJA, ninja, yes, no)
827 AM_CONDITIONAL(NINJA, test x$enable_ninja = xyes -a x$HAVE_NINJA != xno)
829 AC_ARG_ENABLE(werror, [  --enable-werror Pass -Werror to the C compiler], werror_flag=$enableval, werror_flag=no)
830 if test x$werror_flag = xyes; then
831         WERROR_CFLAGS="-Werror"
833 AC_SUBST([WERROR_CFLAGS])
834 AC_SUBST([SHARED_CFLAGS])
836 GLIB_CFLAGS='-I$(top_srcdir)/mono/eglib -I$(top_builddir)/mono/eglib'
837   
838 AC_SUBST(GLIB_CFLAGS)
840 # Enable support for fast thread-local storage
841 # Some systems have broken support, so we allow to disable it.
842 AC_ARG_WITH(tls, [  --with-tls=__thread,pthread    select Thread Local Storage implementation (defaults to __thread)],[],[with_tls=__thread])
844 # Enable support for using sigaltstack for SIGSEGV and stack overflow handling
845 # This does not work on some platforms (bug #55253)
846 AC_ARG_WITH(sigaltstack, [  --with-sigaltstack=yes,no      enable/disable support for sigaltstack (defaults to yes)],[],[with_sigaltstack=yes])
848 AC_ARG_WITH(static_mono, [  --with-static_mono=yes,no      link mono statically to libmono (faster) (defaults to yes)],[],[with_static_mono=yes])
849 AC_ARG_WITH(shared_mono, [  --with-shared_mono=yes,no      build a shared libmono library (defaults to yes)],[],[with_shared_mono=yes])
850 # Same as --with-shared_mono=no
851 AC_ARG_ENABLE(libraries, [  --disable-libraries disable the build of libmono], enable_libraries=$enableval, enable_libraries=yes)
853 if test "x$enable_static" = "xno"; then
854    with_static_mono=no
857 if test "x$enable_shared" = "xno"; then
858    with_shared_mono=no
861 if test "x$enable_libraries" = "xno"; then
862    with_shared_mono=no
865 AM_CONDITIONAL(DISABLE_LIBRARIES, test x$enable_libraries = xno)
867 if test "x$host_win32" = "xyes"; then
868    # Boehm GC requires the runtime to be in its own dll
869    with_static_mono=no
872 AM_CONDITIONAL(STATIC_MONO, test x$with_static_mono != xno)
873 AM_CONDITIONAL(SHARED_MONO, test x$with_shared_mono != xno)
874 AC_ARG_ENABLE(mcs-build, [  --disable-mcs-build disable the build of the mcs directory], try_mcs_build=$enableval, enable_mcs_build=yes)
875 AC_ARG_ENABLE(support-build, [  --disable-support-build disable the build of the support directory], try_support_build=$enableval, enable_support_build=yes)
877 AC_ARG_WITH(xen_opt,   [  --with-xen_opt=yes,no          Enable Xen-specific behaviour (defaults to yes)],[],[with_xen_opt=yes])
878 if test "x$with_xen_opt" = "xyes" -a "x$mono_cv_clang" = "xno"; then
879         AC_DEFINE(MONO_XEN_OPT, 1, [Xen-specific behaviour])
880         ORIG_CFLAGS=$CFLAGS
881         CFLAGS="$CFLAGS -mno-tls-direct-seg-refs"
882         AC_MSG_CHECKING(for -mno-tls-direct-seg-refs option to gcc)
883         AC_TRY_COMPILE([], [
884         ], [
885            AC_MSG_RESULT(yes)
886            # Pass it to libgc as well
887            CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -mno-tls-direct-seg-refs"
888         ], [
889            AC_MSG_RESULT(no)
890            CFLAGS=$ORIG_CFLAGS
891         ])
894 AC_ARG_ENABLE(small-config, [  --enable-small-config Enable tweaks to reduce requirements (and capabilities)], enable_small_config=$enableval, enable_small_config=no)
896 if test x$enable_small_config = xyes; then
897         AC_DEFINE(MONO_SMALL_CONFIG,1,[Reduce runtime requirements (and capabilities)])
898         CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DSMALL_CONFIG"
901 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)
903 DISABLED_FEATURES=none
904 csc_compiler=default
905 endian=unknown
906 AC_C_BIGENDIAN([endian=big],[endian=little],[endian=unknown])
907 AC_MSG_CHECKING([CSharp compiler to use])
908 AC_ARG_WITH(csc, [  --with-csc=mcs,roslyn,default      Configures the CSharp compiler to use],[
909    if test x$withval = xmcs; then
910        csc_compiler=mcs
911    elif test x$withval = xroslyn; then
912        csc_compiler=roslyn
913    elif test x$withval = xdefault; then
914        :
915    else
916        AC_MSG_ERROR([You must supply one of "mcs", "roslyn" or "default" to the --with-csc option])
917    fi
918 ],[csc_compiler=default])
920 if test $csc_compiler = default; then
921    if test $endian = big; then
922       csc_compiler=mcs
923    elif test $endian = little; then
924       case "$host" in
925         powerpc*) csc_compiler=mcs ;;
926         *) csc_compiler=roslyn ;;
927       esac
928    else
929       csc_compiler=mcs
930    fi
932 AC_MSG_RESULT($csc_compiler)
934 AC_ARG_WITH(jemalloc,             [  --with-jemalloc=yes,no               If jemalloc is enabled (defaults to no)],                                     [], [with_jemalloc=no])
935 AC_ARG_WITH(jemalloc-always,      [  --with-jemalloc_always=yes,no        If jemalloc is enabled and always used (defaults to yes)],                    [], [with_jemalloc_always=no])
936 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])
939 if test x$target_win32 = xyes; then
940 with_jemalloc=no
941 with_jemalloc_assert=no
942 with_jemalloc_always=no
945 AM_CONDITIONAL(MONO_JEMALLOC_ASSERT, [test "x$with_jemalloc_assert" = "xyes"])
946 if test "x$with_jemalloc_assert" = "xyes"; then
947 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ASSERT"
948 AC_DEFINE(MONO_JEMALLOC_ASSERT, 1, [Make jemalloc assert for mono])
949 AC_SUBST(MONO_JEMALLOC_ASSERT, 1)
952 AM_CONDITIONAL(MONO_JEMALLOC_DEFAULT, [test "x$with_jemalloc_always" = "xyes"])
953 if test "x$with_jemalloc_always" = "xyes"; then
954 with_jemalloc=yes
955 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_DEFAULT"
956 AC_DEFINE(MONO_JEMALLOC_DEFAULT, 1, [Make jemalloc default for mono])
957 AC_SUBST(MONO_JEMALLOC_DEFAULT, 1)
960 AM_CONDITIONAL(MONO_JEMALLOC_ENABLED, [test "x$with_jemalloc" = "xyes"])
961 if test "x$with_jemalloc" = "xyes"; then
962 JEMALLOC_LDFLAGS="-L`pwd`/mono/utils/jemalloc/jemalloc/lib -ljemalloc_pic"
963 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ENABLED -I `pwd`/mono/utils/jemalloc/jemalloc/include"
964 JEMALLOC_AUTOCONF_FLAGS=" --build=$target --host=$host"
966 if test "x$target_mach" = "xyes"; then
967         JEMALLOC_CPPFLAGS=" -stdlib=libc++ "
970 AC_DEFINE(MONO_JEMALLOC_ENABLED, 1, [Enable jemalloc usage for mono])
971 AC_SUBST(MONO_JEMALLOC_ENABLED, 1)
973 AC_SUBST(JEMALLOC_CFLAGS)
974 AC_SUBST(JEMALLOC_CPPFLAGS)
975 AC_SUBST(JEMALLOC_LDFLAGS)
976 AC_SUBST(JEMALLOC_AUTOCONF_FLAGS)
980 # Set the build profiles and options before things which use them
983 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])
984 AC_ARG_WITH(monodroid,           [  --with-monodroid=yes,no             If you want to build the MonoDroid assemblies (defaults to no)],            [], [with_monodroid=default])
985 AC_ARG_WITH(monotouch,           [  --with-monotouch=yes,no             If you want to build the Xamarin.iOS assemblies (defaults to no)],          [], [with_monotouch=default])
986 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])
987 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])
988 AC_ARG_WITH(bitcode,             [  --with-bitcode=yes,no               If bitcode is enabled (defaults to no)],                                    [], [with_bitcode=default])
989 AC_ARG_WITH(xammac,              [  --with-xammac=yes,no                If you want to build the Xamarin.Mac assemblies (defaults to no)],          [], [with_xammac=default])
990 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])
991 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])
992 AC_ARG_WITH(winaot,              [  --with-winaot=yes,no                If you want to build the Windows friendly AOT assemblies (defaults to no)], [], [with_winaot=default])
993 AC_ARG_WITH(orbis,               [  --with-orbis=yes,no                 If you want to build the Orbis assemblies (defaults to no)], [], [with_orbis=default])
994 AC_ARG_WITH(unreal,              [  --with-unreal=yes,no                If you want to build the Unreal assemblies (defaults to no)], [], [with_unreal=default])
995 AC_ARG_WITH(wasm,                [  --with-wasm=yes,no                  If you want to build the WebAssembly (defaults to no)], [], [with_wasm=default])
998 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])
999 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])
1000 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])
1001 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])
1004 dnl Spectre compiler mitigation flag checks
1006 if test "x$with_spectre_mitigation" = "xyes"; then
1007    AC_MSG_NOTICE([Compiler Spectre mitigation support checks])
1008    SPECTRE_CFLAGS=
1009    SPECTRE_INDIRECT_BRANCH_KIND=
1010    case "x$with_spectre_indirect_branch_choice" in
1011        xkeep) SPECTRE_INDIRECT_BRANCH_KIND=keep ;;
1012        xthunk) SPECTRE_INDIRECT_BRANCH_KIND=thunk ;;
1013        xinline) SPECTRE_INDIRECT_BRANCH_KIND=thunk-inline ;;
1014        xextern) SPECTRE_INDIRECT_BRANCH_KIND=thunk-extern ;;
1015        *) AC_MSG_ERROR([Invalid indirect jump thunk kind ($with_spectre_indirect_branch_choice)]) ;;
1016    esac
1018    SPECTRE_FUNCTION_RETURN_KIND=""
1019    case "x$with_spectre_function_return_choice" in
1020        xkeep) SPECTRE_FUNCTION_RETURN_KIND=keep ;;
1021        xthunk) SPECTRE_FUNCTION_RETURN_KIND=thunk ;;
1022        xinline) SPECTRE_FUNCTION_RETURN_KIND=thunk-inline ;;
1023        xextern) SPECTRE_FUNCTION_RETURN_KIND=thunk-extern ;;
1024        *) AC_MSG_ERROR([Invalid function return thunk kind ($with_spectre_function_return_choice)]) ;;
1025    esac
1027    AX_CHECK_COMPILE_FLAG(
1028         [ -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND ],
1029         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND" ]
1030    )
1032    AX_CHECK_COMPILE_FLAG(
1033         [ -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND ],
1034         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND" ]
1035    )
1037    if test "x$SPECTRE_CFLAGS" != "x" ; then
1038         CFLAGS="$CFLAGS $SPECTRE_CFLAGS"
1039         CXXFLAGS="$CXXFLAGS $SPECTRE_CFLAGS"
1040         spectre_mitigation_status="mitigation enabled"
1041    fi
1042 else
1043         spectre_mitigation_status="no mitigation"
1047 dnl Profile defaults
1049 TEST_PROFILE=default
1050 enable_llvm_default=no
1052 with_profile4_x_default=no
1053 with_monodroid_default=no
1054 with_monotouch_default=no
1055 with_monotouch_watch_default=no
1056 with_monotouch_tv_default=no
1057 with_xammac_default=no
1058 with_testing_aot_hybrid_default=no
1059 with_testing_aot_full_default=no
1060 with_winaot_default=no
1061 with_orbis_default=no
1062 with_unreal_default=no
1063 with_wasm_default=no
1065 with_bitcode_default=no
1066 enable_cooperative_suspend_default=no
1068 INVARIANT_AOT_OPTIONS=nimt-trampolines=2000,ntrampolines=10000,nrgctx-fetch-trampolines=256,ngsharedvt-trampolines=4000
1070 AOT_BUILD_ATTRS=$INVARIANT_AOT_OPTIONS
1072 if test x$cross_compiling = xyes -o x$enable_mcs_build = xno; then
1073    DISABLE_MCS_DOCS_default=yes
1074 elif test x$with_runtime_preset = xnet_4_x; then
1075    with_profile4_x_default=yes
1076 elif test x$with_runtime_preset = xall; then
1077    with_profile4_x_default=yes
1078    with_monodroid_default=yes
1079    with_monotouch_default=yes
1080    with_monotouch_watch_default=yes
1081    with_monotouch_tv_default=yes
1082    with_xammac_default=yes
1083    with_winaot_default=yes
1084    with_orbis_default=yes
1085    with_unreal_default=yes
1086    with_wasm_default=yes
1087    with_testing_aot_hybrid_default=yes
1088    with_testing_aot_full_default=yes
1089 elif test x$with_runtime_preset = xbitcode; then
1090    DISABLE_MCS_DOCS_default=yes
1091    with_testing_aot_full_default=yes
1092    with_bitcode_default=yes
1093    enable_cooperative_suspend_default=yes
1094    TEST_PROFILE=testing_aot_full
1095    enable_llvm_default=yes
1097    mono_feature_disable_com='yes'
1098    mono_feature_disable_remoting='yes'
1099    mono_feature_disable_reflection_emit_save='yes'
1100    mono_feature_disable_reflection_emit='yes'
1101    mono_feature_disable_appdomains='yes'
1103    AOT_BUILD_FLAGS="--runtime=mobile --aot=llvmonly,$INVARIANT_AOT_OPTIONS"
1104    AOT_RUN_FLAGS="--runtime=mobile --llvmonly"
1105    AOT_MODE="llvmonly"
1106 elif test x$with_runtime_preset = xfullaot; then
1107    DISABLE_MCS_DOCS_default=yes
1108    with_testing_aot_full_default=yes
1109    TEST_PROFILE=testing_aot_full
1111    mono_feature_disable_com='yes'
1112    mono_feature_disable_remoting='yes'
1113    mono_feature_disable_reflection_emit_save='yes'
1114    mono_feature_disable_reflection_emit='yes'
1115    mono_feature_disable_appdomains='yes'
1117    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1118    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1119    AOT_MODE="full"
1120 elif test x$with_runtime_preset = xfullaot_llvm; then
1121    DISABLE_MCS_DOCS_default=yes
1122    with_testing_aot_full_default=yes
1123    TEST_PROFILE=testing_aot_full
1125    mono_feature_disable_com='yes'
1126    mono_feature_disable_remoting='yes'
1127    mono_feature_disable_reflection_emit_save='yes'
1128    mono_feature_disable_reflection_emit='yes'
1129    mono_feature_disable_appdomains='yes'
1131    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1132    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1133    AOT_MODE="full"
1134 elif test x$with_runtime_preset = xhybridaot; then
1135    DISABLE_MCS_DOCS_default=yes
1136    with_testing_aot_hybrid_default=yes
1137    TEST_PROFILE=testing_aot_hybrid 
1139    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1140    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1141 elif test x$with_runtime_preset = xhybridaot_llvm; then
1142    DISABLE_MCS_DOCS_default=yes
1143    with_testing_aot_hybrid_default=yes
1144    TEST_PROFILE=testing_aot_hybrid
1146    AOT_BUILD_FLAGS="--runtime=mobile --llvm --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1147    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1148 elif test x$with_runtime_preset = xaot; then
1149    with_profile4_x_default=yes
1151    AOT_BUILD_FLAGS="--aot=$INVARIANT_AOT_OPTIONS"
1152    AOT_RUN_FLAGS=""
1154    DISABLE_MCS_DOCS_default=yes
1155 elif test x$with_runtime_preset = xaot_llvm; then
1156    with_profile4_x_default=yes
1158    AOT_BUILD_FLAGS="--llvm --aot=$INVARIANT_AOT_OPTIONS"
1159    AOT_RUN_FLAGS=""
1161    DISABLE_MCS_DOCS_default=yes
1162 elif test x$with_runtime_preset = xwinaot; then
1163    DISABLE_MCS_DOCS_default=yes
1164    with_winaot_default=yes
1165    TEST_PROFILE=winaot
1167    mono_feature_disable_com='yes'
1168    mono_feature_disable_remoting='yes'
1169    mono_feature_disable_reflection_emit_save='yes'
1170    mono_feature_disable_reflection_emit='yes'
1171    mono_feature_disable_appdomains='yes'
1173    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1174    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1175    AOT_MODE="llvmonly"
1176 elif test x$with_runtime_preset = xorbis; then
1177    DISABLE_MCS_DOCS_default=yes
1178    with_orbis_default=yes
1179    TEST_PROFILE=orbis
1181    mono_feature_disable_com='yes'
1182    mono_feature_disable_remoting='yes'
1183    mono_feature_disable_reflection_emit_save='yes'
1184    mono_feature_disable_reflection_emit='yes'
1185    mono_feature_disable_appdomains='yes'
1187    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1188    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1189    AOT_MODE="full"
1190 elif test x$with_runtime_preset = xunreal; then
1191    DISABLE_MCS_DOCS_default=yes
1192    with_unreal_default=yes
1193    TEST_PROFILE=unreal
1195    mono_feature_disable_com='yes'
1196    mono_feature_disable_remoting='yes'
1197    mono_feature_disable_appdomains='no'
1199    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1200    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1201 elif test x$with_runtime_preset = xwasm; then
1202    DISABLE_MCS_DOCS_default=yes
1203    with_wasm_default=yes
1204    TEST_PROFILE=wasm
1206    mono_feature_disable_com='yes'
1207    mono_feature_disable_remoting='yes'
1208    mono_feature_disable_reflection_emit_save='yes'
1209    mono_feature_disable_reflection_emit='yes'
1210    mono_feature_disable_appdomains='yes'
1212    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1213    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1214 else
1215    with_profile4_x_default=yes
1218 if test "x$AOT_BUILD_FLAGS" != "x"; then :
1219    AC_SUBST(AOT_BUILD_FLAGS)
1220    AC_SUBST(AOT_RUN_FLAGS)
1221    # For llvmonlycheck + fullaotcheck
1222    AC_SUBST(INVARIANT_AOT_OPTIONS)
1225 AC_SUBST(TEST_PROFILE)
1227 if test "x$with_profile4_x" = "xdefault"; then
1228    with_profile4_x=$with_profile4_x_default
1230 if test "x$with_monodroid" = "xdefault"; then
1231    with_monodroid=$with_monodroid_default
1233 if test "x$with_monotouch" = "xdefault"; then
1234    with_monotouch=$with_monotouch_default
1236 if test "x$with_monotouch_watch" = "xdefault"; then
1237    with_monotouch_watch=$with_monotouch_watch_default
1239 if test "x$with_monotouch_tv" = "xdefault"; then
1240    with_monotouch_tv=$with_monotouch_tv_default
1242 if test "x$with_bitcode" = "xdefault"; then
1243    with_bitcode=$with_bitcode_default
1245 if test "x$with_xammac" = "xdefault"; then
1246    with_xammac=$with_xammac_default
1248 if test "x$with_testing_aot_hybrid" = "xdefault"; then
1249    with_testing_aot_hybrid=$with_testing_aot_hybrid_default
1251 if test "x$with_testing_aot_full" = "xdefault"; then
1252    with_testing_aot_full=$with_testing_aot_full_default
1254 if test "x$with_winaot" = "xdefault"; then
1255    with_winaot=$with_winaot_default
1257 if test "x$with_orbis" = "xdefault"; then
1258    with_orbis=$with_orbis_default
1260 if test "x$with_unreal" = "xdefault"; then
1261    with_unreal=$with_unreal_default
1263 if test "x$with_wasm" = "xdefault"; then
1264    with_wasm=$with_wasm_default
1268 AM_CONDITIONAL(INSTALL_4_x, [test "x$with_profile4_x" = "xyes"])
1269 AM_CONDITIONAL(INSTALL_MONODROID, [test "x$with_monodroid" != "xno"])
1270 AM_CONDITIONAL(INSTALL_MONOTOUCH, [test "x$with_monotouch" != "xno"])
1271 AM_CONDITIONAL(INSTALL_MONOTOUCH_WATCH, [test "x$with_monotouch_watch" != "xno"])
1272 AM_CONDITIONAL(INSTALL_MONOTOUCH_TV, [test "x$with_monotouch_tv" != "xno"])
1273 AM_CONDITIONAL(BITCODE, test "x$with_bitcode" = "xyes")
1274 AM_CONDITIONAL(INSTALL_XAMMAC, [test "x$with_xammac" != "xno"])
1275 AM_CONDITIONAL(INSTALL_TESTING_AOT_HYBRID, [test "x$with_testing_aot_hybrid" != "xno"])
1276 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL, [test "x$with_testing_aot_full" != "xno"])
1277 AM_CONDITIONAL(INSTALL_WINAOT, [test "x$with_winaot" != "xno"])
1278 AM_CONDITIONAL(INSTALL_ORBIS, [test "x$with_orbis" != "xno"])
1279 AM_CONDITIONAL(INSTALL_UNREAL, [test "x$with_unreal" != "xno"])
1280 AM_CONDITIONAL(INSTALL_WASM, [test "x$with_wasm" != "xno"])
1281 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"])
1282 AM_CONDITIONAL(HYBRID_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_hybrid"] || [test "x$TEST_PROFILE" = "xunreal"])
1284 default_profile=net_4_x
1285 if test -z "$INSTALL_MONODROID_TRUE"; then :
1286    default_profile=monodroid
1288 if test -z "$INSTALL_MONOTOUCH_TRUE"; then :
1289    default_profile=monotouch
1291 if test -z "$INSTALL_XAMMAC_TRUE"; then :
1292    default_profile=xammac
1294 if test -z "$INSTALL_TESTING_AOT_HYBRID_TRUE"; then :
1295    default_profile=testing_aot_hybrid
1297 if test -z "$INSTALL_TESTING_AOT_FULL_TRUE"; then :
1298    default_profile=testing_aot_full
1300 if test -z "$INSTALL_WINAOT_TRUE"; then :
1301    default_profile=winaot
1303 if test -z "$INSTALL_ORBIS_TRUE"; then :
1304    default_profile=orbis
1306 if test -z "$INSTALL_UNREAL_TRUE"; then :
1307    default_profile=unreal
1309 if test -z "$INSTALL_WASM_TRUE"; then :
1310    default_profile=wasm
1312 if test -z "$INSTALL_4_x_TRUE"; then :
1313    default_profile=net_4_x
1315 DEFAULT_PROFILE=$default_profile
1316 AC_SUBST(DEFAULT_PROFILE)
1319 # End build profile configuration
1322 if test x$USE_NLS = xprofile_default; then
1324         AC_MSG_CHECKING([NLS used])
1326         # We make the default value for USE_NLS
1327         # "no" on OSX because it isn't available on most
1328         # default OSX installs. The most common configurations will
1329         # all disable it, so this saves us typing.
1330         if test x$host_darwin = xyes; then
1331                 USE_NLS=no;
1332         else
1333                 USE_NLS=yes;
1334         fi
1336         AC_SUBST([USE_NLS])
1337         AC_MSG_RESULT([$USE_NLS])
1340 AC_ARG_ENABLE(minimal, [  --enable-minimal=LIST      drop support for LIST subsystems.
1341      LIST is a comma-separated list from: aot, profiler, decimal, pinvoke, debug, appdomains, verifier, 
1342      reflection_emit, reflection_emit_save, large_code, logging, com, ssa, generics, attach, jit, interpreter, simd, soft_debug, perfcounters, normalization, desktop_loader, shared_perfcounters, remoting,
1343          security, lldb, mdb, sgen_marksweep_conc, sgen_split_nursery, sgen_gc_bridge, sgen_debug_helpers.],
1345         for feature in `echo "$enable_minimal" | sed -e "s/,/ /g"`; do
1346                 eval "mono_feature_disable_$feature='yes'"
1347         done
1348         DISABLED_FEATURES=$enable_minimal
1349         disabled="Disabled:      $enable_minimal"
1350 ],[])
1352 AC_DEFINE_UNQUOTED(DISABLED_FEATURES, "$DISABLED_FEATURES", [String of disabled features])
1354 if test "x$mono_feature_disable_aot" = "xyes"; then
1355         AC_DEFINE(DISABLE_AOT, 1, [Disable AOT Compiler])
1356         enable_system_aot=no
1357         AC_MSG_NOTICE([Disabled AOT compiler])
1360 if test "x$mono_feature_disable_profiler" = "xyes"; then
1361         AC_DEFINE(DISABLE_PROFILER, 1, [Disable default profiler support])
1362         AC_MSG_NOTICE([Disabled support for the profiler])
1364 AM_CONDITIONAL(DISABLE_PROFILER, test x$mono_feature_disable_profiler = xyes)
1366 if test "x$mono_feature_disable_decimal" = "xyes"; then
1367         AC_DEFINE(DISABLE_DECIMAL, 1, [Disable System.Decimal support])
1368         AC_MSG_NOTICE([Disabled support for decimal])
1371 if test "x$mono_feature_disable_pinvoke" = "xyes"; then
1372         AC_DEFINE(DISABLE_PINVOKE, 1, [Disable P/Invoke support])
1373         AC_MSG_NOTICE([Disabled support for P/Invoke])
1376 if test "x$mono_feature_disable_debug" = "xyes"; then
1377         AC_DEFINE(DISABLE_DEBUG, 1, [Disable runtime debugging support])
1378         AC_MSG_NOTICE([Disabled support for runtime debugging])
1381 if test "x$mono_feature_disable_reflection_emit" = "xyes"; then
1382         AC_DEFINE(DISABLE_REFLECTION_EMIT, 1, [Disable reflection emit support])
1383         mono_feature_disable_reflection_emit_save=yes
1384         AC_MSG_NOTICE([Disabled support for Reflection.Emit])
1387 if test "x$mono_feature_disable_reflection_emit_save" = "xyes"; then
1388         AC_DEFINE(DISABLE_REFLECTION_EMIT_SAVE, 1, [Disable assembly saving support in reflection emit])
1389         AC_MSG_NOTICE([Disabled support for Reflection.Emit.Save])
1392 if test "x$mono_feature_disable_large_code" = "xyes"; then
1393         AC_DEFINE(DISABLE_LARGE_CODE, 1, [Disable support for huge assemblies])
1394         AC_MSG_NOTICE([Disabled support for large assemblies])
1397 if test "x$mono_feature_disable_logging" = "xyes"; then
1398         AC_DEFINE(DISABLE_LOGGING, 1, [Disable support debug logging])
1399         AC_MSG_NOTICE([Disabled support for logging])
1402 if test "x$mono_feature_disable_com" = "xyes"; then
1403         AC_DEFINE(DISABLE_COM, 1, [Disable COM support])
1404         AC_MSG_NOTICE([Disabled COM support])
1407 if test "x$mono_feature_disable_ssa" = "xyes"; then
1408         AC_DEFINE(DISABLE_SSA, 1, [Disable advanced SSA JIT optimizations])
1409         AC_MSG_NOTICE([Disabled SSA JIT optimizations])
1412 if test "x$mono_feature_disable_generics" = "xyes"; then
1413         AC_DEFINE(DISABLE_GENERICS, 1, [Disable generics support])
1414         AC_MSG_NOTICE([Disabled Generics Support])
1417 if test "x$mono_feature_disable_shadowcopy" = "xyes"; then
1418         AC_DEFINE(DISABLE_SHADOW_COPY, 1, [Disable Shadow Copy for AppDomains])
1419         AC_MSG_NOTICE([Disabled Shadow copy for AppDomains])
1422 if test "x$mono_feature_disable_portability" = "xyes"; then
1423         AC_DEFINE(DISABLE_PORTABILITY, 1, [Disables the IO portability layer])
1424         AC_MSG_NOTICE([Disabled IO Portability layer])
1427 if test "x$mono_feature_disable_attach" = "xyes"; then
1428         AC_DEFINE(DISABLE_ATTACH, 1, [Disable agent attach support])
1429         AC_MSG_NOTICE([Disabled agent attach])
1432 if test "x$mono_feature_disable_verifier" = "xyes"; then
1433         AC_DEFINE(DISABLE_VERIFIER, 1, [Disables the verifier])
1434         AC_MSG_NOTICE([Disabled the metadata and IL verifiers])
1437 if test "x$mono_feature_disable_jit" = "xyes"; then
1438         AC_DEFINE(DISABLE_JIT, 1, [Disable the JIT, only full-aot mode or interpreter will be supported by the runtime.])
1439         AC_MSG_NOTICE([Disabled the JIT engine, only full AOT or interpreter will be supported])
1442 AM_CONDITIONAL(DISABLE_JIT, test x$mono_feature_disable_jit = xyes)
1444 if test "x$mono_feature_disable_interpreter" = "xyes"; then
1445         AC_DEFINE(DISABLE_INTERPRETER, 1, [Disable the interpreter.])
1446         AC_MSG_NOTICE([Disabled the interpreter])
1449 AM_CONDITIONAL(DISABLE_INTERPRETER, test x$mono_feature_disable_interpreter = xyes)
1451 if test "x$mono_feature_disable_interpreter" != "xyes" -o "x$mono_feature_disable_jit" != "xyes"; then
1452         AC_DEFINE(ENABLE_ILGEN, 1, [Some VES is available at runtime])
1455 AM_CONDITIONAL(ENABLE_ILGEN, test x$mono_feature_disable_interpreter != xyes -o x$mono_feature_disable_jit != xyes)
1457 if test "x$mono_feature_disable_simd" = "xyes"; then
1458         AC_DEFINE(DISABLE_SIMD, 1, [Disable SIMD intrinsics related optimizations.])
1459         AC_MSG_NOTICE([Disabled SIMD support])
1462 if test "x$mono_feature_disable_soft_debug" = "xyes"; then
1463         AC_DEFINE(DISABLE_DEBUGGER_AGENT, 1, [Disable Soft Debugger Agent.])
1464         AC_MSG_NOTICE([Disabled Soft Debugger.])
1467 AM_CONDITIONAL(DISABLE_DEBUGGER_AGENT, test x$mono_feature_disable_debugger_agent = xyes)
1469 if test "x$mono_feature_disable_perfcounters" = "xyes"; then
1470         AC_DEFINE(DISABLE_PERFCOUNTERS, 1, [Disable Performance Counters.])
1471         AC_MSG_NOTICE([Disabled Performance Counters.])
1473 if test "x$mono_feature_disable_normalization" = "xyes"; then
1474         AC_DEFINE(DISABLE_NORMALIZATION, 1, [Disable String normalization support.])
1475         AC_MSG_NOTICE([Disabled String normalization support.])
1478 #TODO: remove assembly_remapping feature name once everyone is using desktop_loader
1479 if test "x$mono_feature_disable_assembly_remapping" = "xyes" || test "x$mono_feature_disable_desktop_loader" = "xyes"; then
1480         AC_DEFINE(DISABLE_DESKTOP_LOADER, 1, [Disable desktop assembly loader semantics.])
1481         AC_MSG_NOTICE([Disabled desktop assembly loader semantics.])
1484 if test "x$mono_feature_disable_shared_perfcounters" = "xyes"; then
1485         AC_DEFINE(DISABLE_SHARED_PERFCOUNTERS, 1, [Disable shared perfcounters.])
1486         AC_MSG_NOTICE([Disabled Shared perfcounters.])
1489 if test "x$mono_feature_disable_appdomains" = "xyes"; then
1490         AC_DEFINE(DISABLE_APPDOMAINS, 1, [Disable support for multiple appdomains.])
1491         AC_MSG_NOTICE([Disabled support for multiple appdomains.])
1494 if test "x$mono_feature_disable_remoting" = "xyes"; then
1495         AC_DEFINE(DISABLE_REMOTING, 1, [Disable remoting support (This disables type proxies and make com non-functional)])
1496         AC_MSG_NOTICE([Disabled remoting])
1499 if test "x$mono_feature_disable_security" = "xyes"; then
1500         AC_DEFINE(DISABLE_SECURITY, 1, [Disable CAS/CoreCLR security])
1501         AC_MSG_NOTICE([Disabled CAS/CoreCLR security manager (used e.g. for Moonlight)])
1504 if test "x$mono_feature_disable_lldb" = "xyes"; then
1505         AC_DEFINE(DISABLE_LLDB, 1, [Disable support code for the LLDB plugin.])
1506         AC_MSG_NOTICE([Disabled LLDB plugin support code.])
1509 if test "x$mono_feature_disable_mdb" = "xyes"; then
1510         AC_DEFINE(DISABLE_MDB, 1, [Disable support for .mdb symbol files.])
1511         AC_MSG_NOTICE([Disabled support for .mdb symbol files.])
1514 if test "x$mono_feature_disable_sgen_marksweep_conc" = "xyes"; then
1515         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_CONC, 1, [Disable concurrent gc support in SGEN.])
1516         AC_MSG_NOTICE([Disabled concurrent gc support in SGEN.])
1520 if test "x$mono_feature_disable_sgen_split_nursery" = "xyes"; then
1521         AC_DEFINE(DISABLE_SGEN_SPLIT_NURSERY, 1, [Disable minor=split support in SGEN.])
1522         AC_MSG_NOTICE([Disabled minor=split support in SGEN.])
1525 if test "x$mono_feature_disable_sgen_gc_bridge" = "xyes"; then
1526         AC_DEFINE(DISABLE_SGEN_GC_BRIDGE, 1, [Disable gc bridge support in SGEN.])
1527         AC_MSG_NOTICE([Disabled gc bridge support in SGEN.])
1530 if test "x$mono_feature_disable_sgen_debug_helpers" = "xyes"; then
1531         AC_DEFINE(DISABLE_SGEN_DEBUG_HELPERS, 1, [Disable debug helpers in SGEN.])
1532         AC_MSG_NOTICE([Disabled debug helpers in SGEN.])
1535 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
1536 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
1538 has_extension_module=no
1539 AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
1541         for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
1542                 if test x$extension = xdefault ; then
1543                         has_extension_module=yes;
1544                 fi
1545         done
1546         if test x$enable_extension_module = xyes; then
1547                 has_extension_module=yes;
1548         fi
1549 ], [])
1551 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
1553 if test x$has_extension_module != xno ; then
1554         AC_DEFINE([ENABLE_EXTENSION_MODULE], 1, [Extension module enabled])
1555         AC_MSG_NOTICE([Enabling mono extension module.])
1558 # Deprecated
1559 AC_ARG_ENABLE(gsharedvt, [  --enable-gsharedvt Enable generic valuetype sharing (Deprecated)], enable_gsharedvt=$enableval, enable_gsharedvt=no)
1561 AC_MSG_CHECKING(for visibility __attribute__)
1562 AC_COMPILE_IFELSE([
1563         AC_LANG_SOURCE([[
1564                 void __attribute__ ((visibility ("hidden"))) doit (void) {}
1565                 int main () { doit (); return 0; }
1566         ]])
1567 ], [
1568    have_visibility_hidden=yes
1569    AC_MSG_RESULT(yes)
1570 ], [
1571    have_visibility_hidden=no
1572    AC_MSG_RESULT(no)
1576 dnl Boehm GC configuration
1579 AC_ARG_WITH(libgc,   [  --with-libgc=included,none  Controls the Boehm GC config, default=included],[libgc=$with_libgc],[libgc=included])
1581 AC_ARG_ENABLE(boehm, [  --disable-boehm            Disable the Boehm GC.], support_boehm=$enableval,support_boehm=${support_boehm:-yes})
1582 AM_CONDITIONAL(SUPPORT_BOEHM, test x$support_boehm = xyes)
1584 if test "x$support_boehm" = "xyes"; then
1586         AC_ARG_ENABLE(parallel-mark, [  --enable-parallel-mark     Enables Boehm GC Parallel Marking], enable_parallel_mark=$enableval, enable_parallel_mark=$parallel_mark)
1587         if test x$enable_parallel_mark = xyes; then
1588                 libgc_configure_args="$libgc_configure_args --enable-parallel-mark"
1589         fi
1591         gc_msg=""
1592         LIBGC_CPPFLAGS=
1593         LIBGC_LIBS=
1594         LIBGC_STATIC_LIBS=
1595         libgc_dir=
1596         case "x$libgc" in
1597                 xincluded)
1598                         if test "x$support_boehm" = "xyes"; then
1599                                 libgc_dir=libgc
1600                         fi
1602                         LIBGC_CPPFLAGS='-I$(top_srcdir)/libgc/include'
1603                         LIBGC_LIBS='$(top_builddir)/libgc/libmonogc.la'
1604                         LIBGC_STATIC_LIBS='$(top_builddir)/libgc/libmonogc-static.la'
1606                         BOEHM_DEFINES="-DHAVE_BOEHM_GC"
1608                         if test x$target_win32 = xyes; then
1609                                 BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
1610                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
1611                         fi
1613                         gc_msg="Included Boehm GC with typed GC"
1614                         if test x$enable_parallel_mark = xyes; then
1615                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
1616                                 gc_msg="$gc_msg and parallel mark"
1617                         else
1618                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC)", [GC description])
1619                         fi
1620                         ;;
1622                 xboehm|xbohem|xyes)
1623                         AC_MSG_WARN("External Boehm is no longer supported")
1624                         ;;
1626                 xsgen)
1627                         AC_MSG_WARN("Use --with-sgen instead, --with-libgc= controls Boehm configuration")
1628                         ;;
1630                 xnone)
1631                         AC_MSG_WARN("Compiling mono without GC.")
1632                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description])
1633                         AC_DEFINE(HAVE_NULL_GC,1,[No GC support.])
1634                         gc_msg="none"
1635                         ;;
1636                 *)
1637                         AC_MSG_ERROR([Invalid argument $libgc to --with-libgc.])
1638                         ;;
1639         esac
1641         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])
1642         if test "x$large_heap" = "xyes"; then
1643            CPPFLAGS="$CPPFLAGS -DLARGE_CONFIG"
1644         fi
1646         AC_SUBST(LIBGC_CPPFLAGS)
1647         AC_SUBST(LIBGC_LIBS)
1648         AC_SUBST(LIBGC_STATIC_LIBS)
1649         AC_SUBST(libgc_dir)
1650         AC_SUBST(BOEHM_DEFINES)
1653 AM_CONDITIONAL(SUPPORT_NULLGC, test "x$libgc" = "xnone")
1656 dnl End of Boehm GC Configuration
1659 dnl *************************************
1660 dnl *** Checks for zero length arrays ***
1661 dnl *************************************
1662 AC_MSG_CHECKING(whether $CC supports zero length arrays)
1663 AC_TRY_COMPILE([
1664         struct s {
1665                 int  length;
1666                 char data [0];
1667         };
1668 ], [], [
1669         AC_MSG_RESULT(yes)
1670         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 0, [Length of zero length arrays])
1671 ], [
1672         AC_MSG_RESULT(no)
1673         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
1676 dnl ***********************************
1677 dnl *** Checks for signals
1678 dnl ***********************************
1679 AC_CHECK_HEADERS(signal.h)
1680 AC_CHECK_FUNCS(sigaction)
1681 AC_CHECK_FUNCS(kill)
1682 AC_CHECK_FUNCS(signal)
1684 # signal() is declared inline in Android headers
1685 # so we need to workaround it by overriding the check.
1686 if test x$platform_android = xyes; then
1687         AC_DEFINE(HAVE_SIGNAL,1)
1690 if test x$host_win32 = xno; then
1691         dnl *************************************
1692         dnl *** Checks for time capabilities ***
1693         dnl *************************************
1695         AC_MSG_CHECKING(for CLOCK_MONOTONIC)
1696         AC_TRY_COMPILE([#include <time.h>], [
1697                 const int foo = CLOCK_MONOTONIC;
1698         ],[
1699                 AC_MSG_RESULT(yes)
1700                 AC_DEFINE(HAVE_CLOCK_MONOTONIC, 1, [CLOCK_MONOTONIC])
1701         ], [
1702                 AC_MSG_RESULT(no)
1703         ])
1705         AC_MSG_CHECKING(for CLOCK_MONOTONIC_COARSE)
1706         AC_TRY_COMPILE([#include <time.h>], [
1707                 const int foo = CLOCK_MONOTONIC_COARSE;
1708         ],[
1709                 AC_MSG_RESULT(yes)
1710                 AC_DEFINE(HAVE_CLOCK_MONOTONIC_COARSE, 1, [CLOCK_MONOTONIC_COARSE])
1711         ], [
1712                 AC_MSG_RESULT(no)
1713         ])
1715         AC_CHECK_FUNC(mach_absolute_time, [AC_DEFINE(HAVE_MACH_ABSOLUTE_TIME, 1, [mach_absolute_time])])
1716         AC_CHECK_FUNC(gethrtime, [AC_DEFINE(HAVE_GETHRTIME, 1, [gethrtime])])
1717         AC_CHECK_FUNC(read_real_time, [AC_DEFINE(HAVE_READ_REAL_TIME, 1, [read_real_time])])
1719         dnl hires monotonic clock support
1720         AC_SEARCH_LIBS(clock_gettime, rt)
1721         AC_CHECK_FUNCS(clock_nanosleep)
1723         dnl dynamic loader support
1724         AC_CHECK_FUNC(dlopen, DL_LIB="",
1725                 AC_CHECK_LIB(dl, dlopen, DL_LIB="-ldl", dl_support=no)
1726         )
1727         if test x$dl_support = xno; then
1728                 AC_MSG_WARN([No dynamic loading support available])
1729         else
1730                 LIBS="$LIBS $DL_LIB"
1731                 AC_DEFINE(HAVE_DL_LOADER,1,[dlopen-based dynamic loader available])
1732                 dnl from glib's configure.ac
1733                 AC_CACHE_CHECK([for preceeding underscore in symbols],
1734                         mono_cv_uscore,[
1735                         AC_TRY_RUN([#include <dlfcn.h>
1736                         int mono_underscore_test (void) { return 42; }
1737                         int main() {
1738                           void *f1 = (void*)0, *f2 = (void*)0, *handle;
1739                           handle = dlopen ((void*)0, 0);
1740                           if (handle) {
1741                             f1 = dlsym (handle, "mono_underscore_test");
1742                             f2 = dlsym (handle, "_mono_underscore_test");
1743                           } return (!f2 || f1);
1744                         }],
1745                                 [mono_cv_uscore=yes],
1746                                 [mono_cv_uscore=no],
1747                         [])
1748                 ])
1749                 if test "x$mono_cv_uscore" = "xyes"; then
1750                         MONO_DL_NEED_USCORE=1
1751                 else
1752                         MONO_DL_NEED_USCORE=0
1753                 fi
1754                 AC_SUBST(MONO_DL_NEED_USCORE)
1755                 AC_CHECK_FUNC(dlerror)
1756         fi
1758         dnl ******************************************************************
1759         dnl *** Checks for the IKVM JNI interface library                  ***
1760         dnl ******************************************************************
1761         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])
1763         ikvm_native_dir=
1764         if test x$with_ikvm_native = xyes; then
1765                 ikvm_native_dir=ikvm-native
1766                 jdk_headers_found="IKVM Native"
1767         fi
1769         AC_SUBST(ikvm_native_dir)
1771         AC_CHECK_HEADERS(execinfo.h)
1773         AC_CHECK_HEADERS(sys/auxv.h sys/resource.h)
1775         AC_CHECK_FUNCS(getgrgid_r)
1776         AC_CHECK_FUNCS(getgrnam_r)
1777         AC_CHECK_FUNCS(getresuid)
1778         AC_CHECK_FUNCS(setresuid)
1779         AC_CHECK_FUNCS(kqueue)
1780         AC_CHECK_FUNCS(backtrace_symbols)
1781         AC_CHECK_FUNCS(mkstemp)
1782         AC_CHECK_FUNCS(mmap)
1783         AC_CHECK_FUNCS(madvise)
1784         AC_CHECK_FUNCS(getrusage)
1785         AC_CHECK_FUNCS(getpriority)
1786         AC_CHECK_FUNCS(setpriority)
1787         AC_CHECK_FUNCS(dl_iterate_phdr)
1788         AC_CHECK_FUNCS(dladdr)
1789         AC_CHECK_FUNCS(sysconf)
1790         AC_CHECK_FUNCS(getrlimit)
1791         AC_CHECK_FUNCS(prctl)
1793         AC_CHECK_FUNCS(sched_getaffinity)
1794         AC_CHECK_FUNCS(sched_setaffinity)
1795         AC_CHECK_FUNCS(sched_getcpu)
1797         if test x$platform_android != xyes; then
1798                 AC_CHECK_FUNCS(getpwnam_r)
1799                 AC_CHECK_FUNCS(getpwuid_r)
1800         fi
1802         AC_FUNC_STRERROR_R()
1804         dnl ****************************************************************
1805         dnl *** Check for sched_setaffinity from glibc versions before   ***
1806         dnl *** 2.3.4. The older versions of the function only take 2    ***
1807         dnl *** parameters, not 3.                                       ***
1808         dnl ***                                                          ***
1809         dnl *** Because the interface change was not made in a minor     ***
1810         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
1811         dnl *** won't always indicate the interface sched_affinity has.  ***
1812         dnl ****************************************************************
1813         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
1814         AC_TRY_COMPILE([#include <sched.h>], [
1815             int mask = 1; 
1816             sched_setaffinity(0, &mask);
1817         ], [
1818                 # Yes, we have it...
1819                 AC_MSG_RESULT(yes)
1820                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
1821         ], [
1822                 # We have the new, three-parameter version
1823                 AC_MSG_RESULT(no)
1824         ])
1825         AC_TRY_COMPILE([#include <sched.h>], [
1826              CPU_COUNT((void *) 0);
1827         ], [
1828                 AC_MSG_RESULT(yes)
1829                 AC_DEFINE(GLIBC_HAS_CPU_COUNT, 1, [GLIBC has CPU_COUNT macro in sched.h])
1830         ], [
1831                 # We have the new, three-parameter version
1832                 AC_MSG_RESULT(no)
1833         ])
1835         dnl ******************************************************************
1836         dnl *** Check for large file support                               ***
1837         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
1838         dnl ******************************************************************
1839         
1840         # Check that off_t can represent 2**63 - 1 correctly, working around
1841         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
1842         # CPPFLAGS and sets $large_offt to yes if the test succeeds
1843         large_offt=no
1844         AC_DEFUN([LARGE_FILES], [
1845                 large_CPPFLAGS=$CPPFLAGS
1846                 CPPFLAGS="$CPPFLAGS $1"
1847                 AC_TRY_COMPILE([
1848                         #include <sys/types.h>
1849                         #include <limits.h>
1850                 ], [
1851                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
1852                         #define COMPILE_TIME_ASSERT(pred) \
1853                                 switch(0){case 0:case pred:;}
1854                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
1855                 ], [
1856                         AC_MSG_RESULT(ok)
1857                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
1858                         large_CPPFLAGS="$large_CPPFLAGS $1"
1859                         large_offt=yes
1860                 ], [
1861                         AC_MSG_RESULT(no)
1862                 ])
1863                 CPPFLAGS=$large_CPPFLAGS
1864         ])
1866         AC_MSG_CHECKING(if off_t is 64 bits wide)
1867         LARGE_FILES("")
1868         if test $large_offt = no; then
1869                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
1870                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
1871         fi
1872         if test $large_offt = no; then
1873                 AC_MSG_WARN([No 64 bit file size support available])
1874         fi
1875         
1876         dnl *****************************
1877         dnl *** Checks for libsocket  ***
1878         dnl *****************************
1879         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
1881         case "$host" in
1882                 *-*-*freebsd*)
1883                         dnl *****************************
1884                         dnl *** Checks for libinotify ***
1885                         dnl *****************************
1886                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
1887         esac
1889         dnl *******************************
1890         dnl *** Checks for MSG_NOSIGNAL ***
1891         dnl *******************************
1892         AC_MSG_CHECKING(for MSG_NOSIGNAL)
1893         AC_TRY_COMPILE([#include <sys/socket.h>], [
1894                 int f = MSG_NOSIGNAL;
1895         ], [
1896                 # Yes, we have it...
1897                 AC_MSG_RESULT(yes)
1898                 AC_DEFINE(HAVE_MSG_NOSIGNAL, 1, [Have MSG_NOSIGNAL])
1899         ], [
1900                 # We'll have to use signals
1901                 AC_MSG_RESULT(no)
1902         ])
1904         dnl *****************************
1905         dnl *** Checks for IPPROTO_IP ***
1906         dnl *****************************
1907         AC_MSG_CHECKING(for IPPROTO_IP)
1908         AC_TRY_COMPILE([#include <netinet/in.h>], [
1909                 int level = IPPROTO_IP;
1910         ], [
1911                 # Yes, we have it...
1912                 AC_MSG_RESULT(yes)
1913                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
1914         ], [
1915                 # We'll have to use getprotobyname
1916                 AC_MSG_RESULT(no)
1917         ])
1919         dnl *******************************
1920         dnl *** Checks for IPPROTO_IPV6 ***
1921         dnl *******************************
1922         AC_MSG_CHECKING(for IPPROTO_IPV6)
1923         AC_TRY_COMPILE([#include <netinet/in.h>], [
1924                 int level = IPPROTO_IPV6;
1925         ], [
1926                 # Yes, we have it...
1927                 AC_MSG_RESULT(yes)
1928                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
1929         ], [
1930                 # We'll have to use getprotobyname
1931                 AC_MSG_RESULT(no)
1932         ])
1934         dnl ******************************
1935         dnl *** Checks for IPPROTO_TCP ***
1936         dnl ******************************
1937         AC_MSG_CHECKING(for IPPROTO_TCP)
1938         AC_TRY_COMPILE([#include <netinet/in.h>], [
1939                 int level = IPPROTO_TCP;
1940         ], [
1941                 # Yes, we have it...
1942                 AC_MSG_RESULT(yes)
1943                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
1944         ], [
1945                 # We'll have to use getprotobyname
1946                 AC_MSG_RESULT(no)
1947         ])
1949         dnl *****************************
1950         dnl *** Checks for SOL_IP     ***
1951         dnl *****************************
1952         AC_MSG_CHECKING(for SOL_IP)
1953         AC_TRY_COMPILE([#include <netdb.h>], [
1954                 int level = SOL_IP;
1955         ], [
1956                 # Yes, we have it...
1957                 AC_MSG_RESULT(yes)
1958                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
1959         ], [
1960                 # We'll have to use getprotobyname
1961                 AC_MSG_RESULT(no)
1962         ])
1964         dnl *****************************
1965         dnl *** Checks for SOL_IPV6     ***
1966         dnl *****************************
1967         AC_MSG_CHECKING(for SOL_IPV6)
1968         AC_TRY_COMPILE([#include <netdb.h>], [
1969                 int level = SOL_IPV6;
1970         ], [
1971                 # Yes, we have it...
1972                 AC_MSG_RESULT(yes)
1973                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
1974         ], [
1975                 # We'll have to use getprotobyname
1976                 AC_MSG_RESULT(no)
1977         ])
1979         dnl *****************************
1980         dnl *** Checks for SOL_TCP    ***
1981         dnl *****************************
1982         AC_MSG_CHECKING(for SOL_TCP)
1983         AC_TRY_COMPILE([#include <netdb.h>], [
1984                 int level = SOL_TCP;
1985         ], [
1986                 # Yes, we have it...
1987                 AC_MSG_RESULT(yes)
1988                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
1989         ], [
1990                 # We'll have to use getprotobyname
1991                 AC_MSG_RESULT(no)
1992         ])
1994         dnl *****************************
1995         dnl *** Checks for IP_PKTINFO ***
1996         dnl *****************************
1997         AC_MSG_CHECKING(for IP_PKTINFO)
1998         AC_TRY_COMPILE([#include <linux/in.h>], [
1999                 int level = IP_PKTINFO;
2000         ], [
2001                 # Yes, we have it...
2002                 AC_MSG_RESULT(yes)
2003                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
2004         ], [
2005                 AC_MSG_RESULT(no)
2006         ])
2008         dnl *****************************
2009         dnl *** Checks for IPV6_PKTINFO ***
2010         dnl *****************************
2011         AC_MSG_CHECKING(for IPV6_PKTINFO)
2012         AC_TRY_COMPILE([#include <netdb.h>], [
2013                 int level = IPV6_PKTINFO;
2014         ], [
2015                 # Yes, we have it...
2016                 AC_MSG_RESULT(yes)
2017                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
2018         ], [
2019                 AC_MSG_RESULT(no)
2020         ])
2022         dnl **********************************
2023         dnl *** Checks for IP_DONTFRAG     ***
2024         dnl **********************************
2025         AC_MSG_CHECKING(for IP_DONTFRAG)
2026         AC_TRY_COMPILE([#include <netinet/in.h>], [
2027                 int level = IP_DONTFRAG;
2028         ], [
2029                 # Yes, we have it...
2030                 AC_MSG_RESULT(yes)
2031                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
2032         ], [
2033                 AC_MSG_RESULT(no)
2034         ])
2036         dnl **********************************
2037         dnl *** Checks for IP_DONTFRAGMENT ***
2038         dnl **********************************
2039         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
2040         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
2041                 int level = IP_DONTFRAGMENT;
2042         ], [
2043                 # Yes, we have it...
2044                 AC_MSG_RESULT(yes)
2045                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
2046         ], [
2047                 AC_MSG_RESULT(no)
2048         ])
2050         dnl **********************************
2051         dnl *** Checks for IP_MTU_DISCOVER ***
2052         dnl **********************************
2053         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
2054         AC_TRY_COMPILE([#include <linux/in.h>], [
2055                 int level = IP_MTU_DISCOVER;
2056         ], [
2057                 # Yes, we have it...
2058                 AC_MSG_RESULT(yes)
2059                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
2060         ], [
2061                 AC_MSG_RESULT(no)
2062         ])
2064         dnl **********************************
2065         dnl *** Checks for  IP_PMTUDISC_DO ***
2066         dnl **********************************
2067         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
2068         AC_TRY_COMPILE([#include <linux/in.h>], [
2069                 int level = IP_PMTUDISC_DO;
2070         ], [
2071                 # Yes, we have it...
2072                 AC_MSG_RESULT(yes)
2073                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
2074         ], [
2075                 AC_MSG_RESULT(no)
2076         ])
2078         dnl *********************************
2079         dnl *** Check for struct ip_mreqn ***
2080         dnl *********************************
2081         AC_MSG_CHECKING(for struct ip_mreqn)
2082         AC_TRY_COMPILE([#include <netinet/in.h>], [
2083                 struct ip_mreqn mreq;
2084                 mreq.imr_address.s_addr = 0;
2085         ], [
2086                 # Yes, we have it...
2087                 AC_MSG_RESULT(yes)
2088                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
2089         ], [
2090                 # We'll just have to try and use struct ip_mreq
2091                 AC_MSG_RESULT(no)
2092                 AC_MSG_CHECKING(for struct ip_mreq)
2093                 AC_TRY_COMPILE([#include <netinet/in.h>], [
2094                         struct ip_mreq mreq;
2095                         mreq.imr_interface.s_addr = 0;
2096                 ], [
2097                         # Yes, we have it...
2098                         AC_MSG_RESULT(yes)
2099                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
2100                 ], [
2101                         # No multicast support
2102                         AC_MSG_RESULT(no)
2103                 ])
2104         ])
2105         
2106         dnl **********************************
2107         dnl *** Check for getaddrinfo ***
2108         dnl **********************************
2109         AC_MSG_CHECKING(for getaddrinfo)
2110                 AC_TRY_LINK([
2111                 #include <stdio.h>
2112                 #include <netdb.h>
2113         ], [
2114                 getaddrinfo(NULL,NULL,NULL,NULL);
2115         ], [
2116                 # Yes, we have it...
2117                 AC_MSG_RESULT(yes)
2118                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2119         ], [
2120                 AC_MSG_RESULT(no)
2121         ])
2123         dnl **********************************
2124         dnl *** Check for gethostbyname2_r ***
2125         dnl **********************************
2126         AC_MSG_CHECKING(for gethostbyname2_r)
2127                 AC_TRY_LINK([
2128                 #include <stdio.h>
2129                 #include <netdb.h>
2130         ], [
2132                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
2133         ], [
2134                 # Yes, we have it...
2135                 AC_MSG_RESULT(yes)
2136                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
2137         ], [
2138                 AC_MSG_RESULT(no)
2139         ])
2141         dnl **********************************
2142         dnl *** Check for gethostbyname2 ***
2143         dnl **********************************
2144         AC_MSG_CHECKING(for gethostbyname2)
2145                 AC_TRY_LINK([
2146                 #include <stdio.h>
2147                 #include <netdb.h>
2148         ], [
2149                 gethostbyname2(NULL,0);
2150         ], [
2151                 # Yes, we have it...
2152                 AC_MSG_RESULT(yes)
2153                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
2154         ], [
2155                 AC_MSG_RESULT(no)
2156         ])
2158         dnl **********************************
2159         dnl *** Check for gethostbyname ***
2160         dnl **********************************
2161         AC_MSG_CHECKING(for gethostbyname)
2162                 AC_TRY_LINK([
2163                 #include <stdio.h>
2164                 #include <netdb.h>
2165         ], [
2166                 gethostbyname(NULL);
2167         ], [
2168                 # Yes, we have it...
2169                 AC_MSG_RESULT(yes)
2170                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2171         ], [
2172                 AC_MSG_RESULT(no)
2173         ])
2175         dnl **********************************
2176         dnl *** Check for getprotobyname ***
2177         dnl **********************************
2178         AC_MSG_CHECKING(for getprotobyname)
2179                 AC_TRY_LINK([
2180                 #include <stdio.h>
2181                 #include <netdb.h>
2182         ], [
2183                 getprotobyname(NULL);
2184         ], [
2185                 # Yes, we have it...
2186                 AC_MSG_RESULT(yes)
2187                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2188         ], [
2189                 AC_MSG_RESULT(no)
2190         ])
2192         dnl **********************************
2193         dnl *** Check for getnameinfo ***
2194         dnl **********************************
2195         AC_MSG_CHECKING(for getnameinfo)
2196                 AC_TRY_LINK([
2197                 #include <stdio.h>
2198                 #include <netdb.h>
2199         ], [
2200                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2201         ], [
2202                 # Yes, we have it...
2203                 AC_MSG_RESULT(yes)
2204                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2205         ], [
2206                 AC_MSG_RESULT(no)
2207         ])
2210         dnl **********************************
2211         dnl *** Check for inet_ntop ***
2212         dnl **********************************
2213         AC_MSG_CHECKING(for inet_ntop)
2214                 AC_TRY_LINK([
2215                 #include <stdio.h>
2216                 #include <arpa/inet.h>
2217         ], [
2218                 inet_ntop (0, NULL, NULL, 0);
2219         ], [
2220                 # Yes, we have it...
2221                 AC_MSG_RESULT(yes)
2222                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2223         ], [
2224                 AC_MSG_RESULT(no)
2225         ])
2227         dnl *****************************
2228         dnl *** Checks for libnsl     ***
2229         dnl *****************************
2230         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
2232         AC_CHECK_FUNCS(inet_pton inet_aton)
2234         dnl *****************************
2235         dnl *** Checks for libxnet    ***
2236         dnl *****************************
2237         case "${host}" in
2238                 *solaris* )
2239                         AC_MSG_CHECKING(for Solaris XPG4 support)
2240                         if test -f /usr/lib/libxnet.so; then
2241                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
2242                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
2243                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
2244                                 LIBS="$LIBS -lxnet"
2245                                 AC_MSG_RESULT(yes)
2246                         else
2247                                 AC_MSG_RESULT(no)
2248                         fi
2250                         if test "$GCC" = "yes"; then
2251                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
2252                         fi
2253                 ;;
2254         esac
2256         dnl *****************************
2257         dnl *** Checks for libpthread ***
2258         dnl *****************************
2259 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
2260 # and libpthread does not exist
2262         case "${host}" in
2263                 *-*-*haiku*)
2264                         dnl Haiku has pthread in libroot (libc equiv)
2265                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS")
2266                 ;;
2267                 *-*-*freebsd*)
2268                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2269                 ;;
2270                 *-*-*openbsd*)
2271                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2272                 ;;
2273                 *)
2274                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
2275                 ;;
2276         esac
2277         AC_CHECK_HEADERS(pthread.h)
2278         AC_CHECK_HEADERS(pthread_np.h)
2279         AC_CHECK_FUNCS(pthread_mutex_timedlock)
2280         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_setname_np pthread_cond_timedwait_relative_np)
2281         AC_CHECK_FUNCS(pthread_kill)
2282         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
2283         AC_TRY_COMPILE([ #include <pthread.h>], [
2284                 pthread_mutexattr_t attr;
2285                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
2286         ], [
2287                 AC_MSG_RESULT(ok)
2288         ], [
2289                 AC_MSG_RESULT(no)
2290                 AC_ERROR(Posix system lacks support for recursive mutexes)
2291         ])
2292         AC_CHECK_FUNCS(pthread_attr_setstacksize)
2293         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
2294         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
2296         dnl **********************************
2297         dnl *** Check for mincore ***
2298         dnl **********************************
2299         AC_MSG_CHECKING(for mincore)
2300                 AC_TRY_LINK([
2301                 #include <stdio.h>
2302                 #include <sys/types.h>
2303                 #include <sys/mman.h>
2304         ], [
2305                 mincore(NULL, 0, NULL);
2306         ], [
2307                 # Yes, we have it...
2308                 AC_MSG_RESULT(yes)
2309                 AC_DEFINE(HAVE_MINCORE, 1, [Have mincore])
2310         ], [
2311                 AC_MSG_RESULT(no)
2312         ])
2314         dnl ***********************************
2315         dnl *** Checks for working __thread ***
2316         dnl ***********************************
2317         AC_MSG_CHECKING(for working __thread)
2318         if test "x$with_tls" != "x__thread"; then
2319                 AC_MSG_RESULT(disabled)
2320         elif test "x$cross_compiling" = "xyes"; then
2321                 AC_MSG_RESULT(cross compiling, assuming yes)
2322         else
2323                 AC_TRY_RUN([
2324                         #if defined(__APPLE__) && defined(__clang__)
2325                         #error "__thread does not currently work with clang on Mac OS X"
2326                         #endif
2327                         
2328                         #include <pthread.h>
2329                         __thread int i;
2330                         static int res1, res2;
2332                         void thread_main (void *arg)
2333                         {
2334                                 i = arg;
2335                                 sleep (1);
2336                                 if (arg == 1)
2337                                         res1 = (i == arg);
2338                                 else
2339                                         res2 = (i == arg);
2340                         }
2342                         int main () {
2343                                 pthread_t t1, t2;
2345                                 i = 5;
2347                                 pthread_create (&t1, NULL, thread_main, 1);
2348                                 pthread_create (&t2, NULL, thread_main, 2);
2350                                 pthread_join (t1, NULL);
2351                                 pthread_join (t2, NULL);
2353                                 return !(res1 + res2 == 2);
2354                         }
2355                 ], [
2356                                 AC_MSG_RESULT(yes)
2357                 ], [
2358                                 AC_MSG_RESULT(no)
2359                                 with_tls=pthread
2360                 ])
2361         fi
2363         dnl **************************************
2364         dnl *** Checks for working sigaltstack ***
2365         dnl **************************************
2366         AC_MSG_CHECKING(for working sigaltstack)
2367         if test "x$with_sigaltstack" != "xyes"; then
2368                 AC_MSG_RESULT(disabled)
2369         elif test "x$cross_compiling" = "xyes"; then
2370                 AC_MSG_RESULT(cross compiling, assuming yes)
2371         else
2372                 AC_TRY_RUN([
2373                         #include <stdio.h>
2374                         #include <stdlib.h>
2375                         #include <unistd.h>
2376                         #include <signal.h>
2377                         #include <pthread.h>
2378                         #include <sys/wait.h>
2379                         #if defined(__FreeBSD__) || defined(__NetBSD__)
2380                         #define SA_STACK SA_ONSTACK
2381                         #endif
2382                         static void
2383                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
2384                         {
2385                                 exit (0);
2386                         }
2388                         volatile char*__ptr = NULL;
2389                         static void *
2390                         loop (void *ignored)
2391                         {
2392                                 *__ptr = 0;
2393                                 return NULL;
2394                         }
2396                         static void
2397                         child ()
2398                         {
2399                                 struct sigaction sa;
2400                                 stack_t sas;
2401                                 pthread_t id;
2402                                 pthread_attr_t attr;
2404                                 sa.sa_sigaction = sigsegv_signal_handler;
2405                                 sigemptyset (&sa.sa_mask);
2406                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
2407                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
2408                                         perror ("sigaction");
2409                                         return;
2410                                 }
2412                                 /* x86 darwin deliver segfaults using SIGBUS */
2413                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
2414                                         perror ("sigaction");
2415                                         return;
2416                                 }
2417                                 sas.ss_sp = malloc (SIGSTKSZ);
2418                                 sas.ss_size = SIGSTKSZ;
2419                                 sas.ss_flags = 0;
2420                                 if (sigaltstack (&sas, NULL) == -1) {
2421                                         perror ("sigaltstack");
2422                                         return;
2423                                 }
2425                                 pthread_attr_init (&attr);
2426                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
2427                                         printf ("pthread_create\n");
2428                                         return;
2429                                 }
2431                                 sleep (100);
2432                         }
2434                         int
2435                         main ()
2436                         {
2437                                 pid_t son;
2438                                 int status;
2439                                 int i;
2441                                 son = fork ();
2442                                 if (son == -1) {
2443                                         return 1;
2444                                 }
2446                                 if (son == 0) {
2447                                         child ();
2448                                         return 0;
2449                                 }
2451                                 for (i = 0; i < 300; ++i) {
2452                                         waitpid (son, &status, WNOHANG);
2453                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
2454                                                 return 0;
2455                                         usleep (10000);
2456                                 }
2458                                 kill (son, SIGKILL);
2459                                 return 1;
2460                         }
2462                 ], [
2463                                 AC_MSG_RESULT(yes)
2464                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
2465                 ], [
2466                                 with_sigaltstack=no
2467                                 AC_MSG_RESULT(no)
2468                 ])
2469         fi
2471         dnl ********************************
2472         dnl *** Checks for semaphore lib ***
2473         dnl ********************************
2474         # 'Real Time' functions on Solaris
2475         # posix4 on Solaris 2.6
2476         # pthread (first!) on Linux
2477         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
2479         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
2480         AC_CHECK_FUNCS(shm_open)
2482         dnl ********************************
2483         dnl *** Checks for timezone stuff **
2484         dnl ********************************
2485         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
2486                 AC_TRY_COMPILE([
2487                         #include <time.h>
2488                         ], [
2489                         struct tm tm;
2490                         tm.tm_gmtoff = 1;
2491                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
2492         if test $ac_cv_struct_tm_gmtoff = yes; then
2493                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
2494         else
2495                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
2496                         AC_TRY_COMPILE([
2497                                 #include <time.h>
2498                         ], [
2499                                 timezone = 1;
2500                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
2501                 if test $ac_cv_var_timezone = yes; then
2502                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
2503                 else
2504                         AC_ERROR(unable to find a way to determine timezone)
2505                 fi
2506         fi
2508         dnl *********************************
2509         dnl *** Checks for math functions ***
2510         dnl *********************************
2511         AC_SEARCH_LIBS(sqrtf, m)
2512         if test "x$has_broken_apple_cpp" != "xyes"; then
2513                 AC_CHECK_FUNCS(finite, , AC_MSG_CHECKING(for finite in math.h)
2514                         AC_TRY_LINK([#include <math.h>], 
2515                         [ finite(0.0); ], 
2516                         AC_DEFINE(HAVE_FINITE, 1, [Have finite in -lm]) AC_MSG_RESULT(yes),
2517                         AC_MSG_RESULT(no)))
2518         fi
2519         AC_CHECK_FUNCS(isfinite, , AC_MSG_CHECKING(for isfinite in math.h)
2520                 AC_TRY_LINK([#include <math.h>], 
2521                 [ isfinite(0.0); ], 
2522                 AC_DEFINE(HAVE_ISFINITE, 1, [Have isfinite]) AC_MSG_RESULT(yes),
2523                 AC_MSG_RESULT(no)))
2525         dnl ****************************************************************
2526         dnl *** Checks for working poll() (macosx defines it but doesn't ***
2527         dnl *** have it in the library (duh))                            ***
2528         dnl ****************************************************************
2529         AC_CHECK_FUNCS(poll)
2531         dnl *************************
2532         dnl *** Check for signbit ***
2533         dnl *************************
2534         AC_MSG_CHECKING(for signbit)
2535         AC_TRY_LINK([#include <math.h>], [
2536                 int s = signbit(1.0);
2537         ], [
2538                 AC_MSG_RESULT(yes)
2539                 AC_DEFINE(HAVE_SIGNBIT, 1, [Have signbit])
2540         ], [
2541                 AC_MSG_RESULT(no)
2542         ]) 
2544         dnl **********************************
2545         dnl *** epoll                      ***
2546         dnl **********************************
2547         AC_CHECK_HEADERS(sys/epoll.h)
2548         haveepoll=no
2549         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
2550         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
2551                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
2552         fi
2554         havekqueue=no
2556         AC_CHECK_HEADERS(sys/event.h)
2557         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
2559         dnl **************************************
2560         dnl * Darwin has a race that prevents us from using reliably:
2561         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
2562         dnl * Since kqueue is mostly used for scaling large web servers, 
2563         dnl * and very few folks run Mono on large web servers on OSX, falling
2564         dnl * back 
2565         dnl **************************************
2566         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
2567                 if test "x$host_darwin" = "xno"; then
2568                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
2569                 fi
2570         fi
2572         dnl ******************************
2573         dnl *** Checks for SIOCGIFCONF ***
2574         dnl ******************************
2575         AC_CHECK_HEADERS(sys/ioctl.h)
2576         AC_CHECK_HEADERS(net/if.h, [], [],
2577            [
2578            #ifdef HAVE_SYS_TYPES_H
2579            # include <sys/types.h>
2580            #endif
2581            #ifdef HAVE_SYS_SOCKET_H
2582            # include <sys/socket.h>
2583            #endif
2584            ])
2585         AC_MSG_CHECKING(for ifreq)
2586         AC_TRY_COMPILE([
2587                 #include <stdio.h>
2588                 #include <sys/ioctl.h>
2589                 #include <net/if.h>
2590                 ], [
2591                 struct ifconf ifc;
2592                 struct ifreq *ifr;
2593                 void *x;
2594                 ifc.ifc_len = 0;
2595                 ifc.ifc_buf = NULL;
2596                 x = (void *) &ifr->ifr_addr;
2597                 ],[
2598                         AC_MSG_RESULT(yes)
2599                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
2600                 ], [
2601                         AC_MSG_RESULT(no)
2602                 ])
2603         dnl **********************************
2604         dnl ***     Checks for sin_len     ***
2605         dnl **********************************
2606         AC_MSG_CHECKING(for sockaddr_in.sin_len)
2607         AC_TRY_COMPILE([
2608                 #include <netinet/in.h>
2609                 ], [
2610                 struct sockaddr_in saddr;
2611                 saddr.sin_len = sizeof (saddr);
2612                 ],[
2613                         AC_MSG_RESULT(yes)
2614                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
2615                 ], [
2616                         AC_MSG_RESULT(no)
2617                 ])      
2618         dnl **********************************
2619         dnl ***    Checks for sin6_len     ***
2620         dnl **********************************
2621         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
2622         AC_TRY_COMPILE([
2623                 #include <netinet/in.h>
2624                 ], [
2625                 struct sockaddr_in6 saddr6;
2626                 saddr6.sin6_len = sizeof (saddr6);
2627                 ],[
2628                         AC_MSG_RESULT(yes)
2629                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
2630                 ], [
2631                         AC_MSG_RESULT(no)
2632                 ])
2633         dnl **********************************
2634         dnl *** Check for getifaddrs       ***
2635         dnl **********************************
2636         AC_MSG_CHECKING(for getifaddrs)
2637                 AC_TRY_LINK([
2638                 #include <stdio.h>
2639                 #include <sys/types.h>
2640                 #include <sys/socket.h>
2641                 #include <ifaddrs.h>
2642         ], [
2643                 getifaddrs(NULL);
2644         ], [
2645                 # Yes, we have it...
2646                 AC_MSG_RESULT(yes)
2647                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
2648         ], [
2649                 AC_MSG_RESULT(no)
2650         ])
2651         dnl **********************************
2652         dnl *** Check for if_nametoindex   ***
2653         dnl **********************************
2654         AC_MSG_CHECKING(for if_nametoindex)
2655                 AC_TRY_LINK([
2656                 #include <stdio.h>
2657                 #include <sys/types.h>
2658                 #include <sys/socket.h>
2659                 #include <net/if.h>
2660         ], [
2661                 if_nametoindex(NULL);
2662         ], [
2663                 # Yes, we have it...
2664                 AC_MSG_RESULT(yes)
2665                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
2666         ], [
2667                 AC_MSG_RESULT(no)
2668         ])
2669         dnl **********************************
2670         dnl *** Check for access ***
2671         dnl **********************************
2672         AC_MSG_CHECKING(for access)
2673                 AC_TRY_LINK([
2674                 #include <unistd.h>
2675         ], [
2676                 access(NULL,0);
2677         ], [
2678                 # Yes, we have it...
2679                 AC_MSG_RESULT(yes)
2680                 AC_DEFINE(HAVE_ACCESS, 1, [Have access])
2681         ], [
2682                 AC_MSG_RESULT(no)
2683         ])
2684                         
2685         dnl **********************************
2686         dnl *** Checks for proclib         ***
2687         dnl **********************************
2688         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.)])
2689         dnl **********************************
2690         dnl *** Checks for MonoPosixHelper ***
2691         dnl **********************************
2692         AC_CHECK_HEADERS(checklist.h)
2693         AC_CHECK_HEADERS(pathconf.h)
2694         AC_CHECK_HEADERS(fstab.h)
2695         AC_CHECK_HEADERS(attr/xattr.h)
2696         AC_CHECK_HEADERS(sys/extattr.h)
2697         AC_CHECK_HEADERS(sys/sendfile.h)
2698         AC_CHECK_HEADERS(sys/statvfs.h)
2699         AC_CHECK_HEADERS(sys/statfs.h)
2700         AC_CHECK_HEADERS(sys/vfstab.h)
2701         AC_CHECK_HEADERS(sys/xattr.h)
2702         AC_CHECK_HEADERS(sys/mman.h)
2703         AC_CHECK_HEADERS(sys/param.h)
2704         AC_CHECK_HEADERS(sys/mount.h, [], [],
2705                 [
2706                 #ifdef HAVE_SYS_PARAM_H
2707                 # include <sys/param.h>
2708                 #endif
2709                 ])
2710         AC_CHECK_HEADERS(sys/mount.h)
2711         AC_CHECK_FUNCS(confstr)
2712         AC_CHECK_FUNCS(seekdir telldir)
2713         AC_CHECK_FUNCS(getdomainname)
2714         AC_CHECK_FUNCS(setdomainname)
2715         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
2716         AC_CHECK_FUNCS(setgroups)
2717         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
2718         AC_CHECK_FUNCS(getfsstat)
2719         AC_CHECK_FUNCS(lutimes futimes)
2720         AC_CHECK_FUNCS(mremap)
2721         AC_CHECK_FUNCS(remap_file_pages)
2722         AC_CHECK_FUNCS(posix_fadvise)
2723         AC_CHECK_FUNCS(posix_fallocate)
2724         AC_CHECK_FUNCS(posix_madvise)
2725         AC_CHECK_FUNCS(vsnprintf)
2726         AC_CHECK_FUNCS(sendfile)
2727         AC_CHECK_FUNCS(gethostid sethostid)
2728         AC_CHECK_FUNCS(sethostname)
2729         AC_CHECK_FUNCS(statfs)
2730         AC_CHECK_FUNCS(fstatfs)
2731         AC_CHECK_FUNCS(statvfs)
2732         AC_CHECK_FUNCS(fstatvfs)
2733         AC_CHECK_FUNCS(stime)
2734         AC_CHECK_FUNCS(strerror_r)
2735         AC_CHECK_FUNCS(ttyname_r)
2736         AC_CHECK_FUNCS(psignal)
2737         AC_CHECK_FUNCS(getlogin_r)
2738         AC_CHECK_FUNCS(lockf)
2739         AC_CHECK_FUNCS(swab)
2740         AC_CHECK_FUNCS(setusershell endusershell)
2741         AC_CHECK_FUNCS(futimens utimensat)
2742         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
2743         AC_CHECK_FUNCS(readv writev preadv pwritev)
2744         AC_CHECK_FUNCS(setpgid)
2745         AC_CHECK_FUNCS(system)
2746         AC_CHECK_FUNCS(fork execv execve)
2747         AC_CHECK_FUNCS(accept4)
2748         AC_CHECK_FUNCS(localtime_r)
2749         AC_CHECK_FUNCS(mkdtemp)
2750         AC_CHECK_SIZEOF(size_t)
2751         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
2752                 [#include <sys/types.h>
2753                  #include <sys/stat.h>
2754                  #include <unistd.h>])
2755         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
2756                 [#include <sys/types.h>
2757                  #include <sys/stat.h>
2758                  #include <unistd.h>])
2759         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
2760                 [#include <sys/time.h>])
2761         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
2762                 [#include <sys/socket.h>])
2763         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
2764                 [#include <unistd.h>
2765                  #include <fcntl.h>])
2766         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
2767                 [#include <sys/uio.h>])
2768         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
2769                 [#include <sys/socket.h>])
2770         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
2771                 [#include <sys/poll.h>])
2772         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
2773                 [#include <sys/socket.h>])
2774         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
2775                 [#include <sys/socket.h>])
2776         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
2777                 [#include <netinet/in.h>])
2778         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
2779                 [#include <netinet/in.h>])
2780         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
2781                 [#include <sys/un.h>])
2782         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
2783                 [#include <sys/types.h>
2784                  #include <sys/stat.h>
2785                  #include <unistd.h>])
2786         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
2787                 [#include <time.h>])
2788         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
2789                 [#include <sys/time.h>
2790                  #include <sys/types.h>
2791                  #include <utime.h>])
2792         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
2793                 [#include <sys/time.h>])
2794         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
2795                 [#include <sys/types.h>
2796                  #include <utime.h>])
2797         AC_CHECK_MEMBERS(
2798                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
2799                 [#include <sys/types.h>
2800                  #include <dirent.h>])
2801         AC_CHECK_MEMBERS(
2802                 [struct passwd.pw_gecos],,, 
2803                 [#include <sys/types.h>
2804                  #include <pwd.h>])
2805         AC_CHECK_MEMBERS(
2806                 [struct statfs.f_flags],,, 
2807                 [#include <sys/types.h>
2808                  #include <sys/vfs.h>])
2809         AC_CHECK_MEMBERS(
2810                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
2811                 [#include <sys/types.h>
2812                  #include <sys/stat.h>
2813                  #include <unistd.h>])
2815         dnl Favour xattr through glibc, but use libattr if we have to
2816         AC_CHECK_FUNC(lsetxattr, ,
2817                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
2818         )
2819         AC_SUBST(XATTR_LIB)
2821         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
2822         AC_CHECK_MEMBERS(
2823                 [struct kinfo_proc.kp_proc],,, 
2824                 [#include <sys/types.h>
2825                  #include <sys/param.h>
2826                  #include <sys/sysctl.h>
2827                  #include <sys/proc.h>
2828                  ])
2830         dnl *********************************
2831         dnl *** Checks for Windows compilation ***
2832         dnl *********************************
2833         AC_CHECK_HEADERS(sys/time.h)
2834         AC_CHECK_HEADERS(sys/param.h)
2835         AC_CHECK_HEADERS(dirent.h)
2837         dnl ******************************************
2838         dnl *** Checks for OSX and iOS compilation ***
2839         dnl ******************************************
2840         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
2842         dnl *********************************
2843         dnl *** Check for Console 2.0 I/O ***
2844         dnl *********************************
2845         AC_CHECK_HEADERS([curses.h])
2846         AC_CHECK_HEADERS([term.h], [], [],
2847         [#if HAVE_CURSES_H
2848          #include <curses.h>
2849          #endif
2850         ])
2851         AC_CHECK_HEADERS([termios.h])
2853         dnl *********************************
2854         dnl *** Checks for random         ***
2855         dnl *********************************
2856         if test x$host_darwin = xno; then
2857                 AC_CHECK_HEADERS(sys/random.h)
2858                 AC_CHECK_FUNCS(getrandom getentropy)
2859         fi
2860 else
2861         dnl *********************************
2862         dnl *** Checks for Windows compilation ***
2863         dnl *********************************
2864         AC_CHECK_HEADERS(winternl.h)
2866         jdk_headers_found=no
2867         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
2868         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
2869         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
2870         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
2871         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
2872         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
2873         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
2875         dnl *********************************
2876         dnl *** Check for struct ip_mreqn ***
2877         dnl *********************************
2878         AC_MSG_CHECKING(for struct ip_mreqn)
2879         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
2880                 struct ip_mreqn mreq;
2881                 mreq.imr_address.s_addr = 0;
2882         ], [
2883                 # Yes, we have it...
2884                 AC_MSG_RESULT(yes)
2885                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
2886         ], [
2887                 # We'll just have to try and use struct ip_mreq
2888                 AC_MSG_RESULT(no)
2889                 AC_MSG_CHECKING(for struct ip_mreq)
2890                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
2891                         struct ip_mreq mreq;
2892                         mreq.imr_interface.s_addr = 0;
2893                 ], [
2894                         # Yes, we have it...
2895                         AC_MSG_RESULT(yes)
2896                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
2897                 ], [
2898                         # No multicast support
2899                         AC_MSG_RESULT(no)
2900                 ])
2901         ])
2903         dnl **********************************
2904         dnl *** Check for getaddrinfo ***
2905         dnl **********************************
2906         AC_MSG_CHECKING(for getaddrinfo)
2907                 AC_TRY_LINK([
2908                 #include <stdio.h>
2909                 #include <winsock2.h>
2910                 #include <ws2tcpip.h>
2911         ], [
2912                 getaddrinfo(NULL,NULL,NULL,NULL);
2913         ], [
2914                 # Yes, we have it...
2915                 AC_MSG_RESULT(yes)
2916                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2917         ], [
2918                 AC_MSG_RESULT(no)
2919         ])
2921         dnl **********************************
2922         dnl *** Check for gethostbyname ***
2923         dnl **********************************
2924         AC_MSG_CHECKING(for gethostbyname)
2925                 AC_TRY_LINK([
2926                 #include <stdio.h>
2927                 #include <winsock2.h>
2928                 #include <ws2tcpip.h>
2929         ], [
2930                 gethostbyname(NULL);
2931         ], [
2932                 # Yes, we have it...
2933                 AC_MSG_RESULT(yes)
2934                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2935         ], [
2936                 AC_MSG_RESULT(no)
2937         ])
2939         dnl **********************************
2940         dnl *** Check for getprotobyname ***
2941         dnl **********************************
2942         AC_MSG_CHECKING(for getprotobyname)
2943                 AC_TRY_LINK([
2944                 #include <stdio.h>
2945                 #include <winsock2.h>
2946                 #include <ws2tcpip.h>
2947         ], [
2948                 getprotobyname(NULL);
2949         ], [
2950                 # Yes, we have it...
2951                 AC_MSG_RESULT(yes)
2952                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2953         ], [
2954                 AC_MSG_RESULT(no)
2955         ])
2957         dnl **********************************
2958         dnl *** Check for getnameinfo ***
2959         dnl **********************************
2960         AC_MSG_CHECKING(for getnameinfo)
2961                 AC_TRY_LINK([
2962                 #include <stdio.h>
2963                 #include <winsock2.h>
2964                 #include <ws2tcpip.h>
2965         ], [
2966                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2967         ], [
2968                 # Yes, we have it...
2969                 AC_MSG_RESULT(yes)
2970                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2971         ], [
2972                 AC_MSG_RESULT(no)
2973         ])
2975         dnl **********************************
2976         dnl *** Check for inet_ntop ***
2977         dnl **********************************
2978         AC_MSG_CHECKING(for inet_ntop)
2979                 AC_TRY_LINK([
2980                 #include <stdio.h>
2981                 #include <winsock2.h>
2982                 #include <ws2tcpip.h>
2983         ], [
2984                 inet_ntop (0, NULL, NULL, 0);
2985         ], [
2986                 # Yes, we have it...
2987                 AC_MSG_RESULT(yes)
2988                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2989         ], [
2990                 AC_MSG_RESULT(no)
2991         ])
2993         dnl **********************************
2994         dnl *** Check for inet_pton ***
2995         dnl **********************************
2996         AC_MSG_CHECKING(for inet_pton)
2997                 AC_TRY_LINK([
2998                 #include <stdio.h>
2999                 #include <winsock2.h>
3000                 #include <ws2tcpip.h>
3001         ], [
3002                 #ifndef inet_pton
3003                 (void) inet_pton;
3004                 #endif
3005                 inet_pton (0, NULL, NULL);
3006         ], [
3007                 # Yes, we have it...
3008                 AC_MSG_RESULT(yes)
3009                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
3010         ], [
3011                 AC_MSG_RESULT(no)
3012         ])
3014         AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
3015         AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
3016         AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
3017         AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
3018         AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
3019         AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
3020         AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
3023 dnl socklen_t check
3024 AC_MSG_CHECKING(for socklen_t)
3025 AC_TRY_COMPILE([
3026 #include <sys/types.h>
3027 #include <sys/socket.h>
3029   socklen_t foo;
3031 ac_cv_c_socklen_t=yes
3032         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
3033         AC_MSG_RESULT(yes)
3035         AC_MSG_RESULT(no)
3038 AC_MSG_CHECKING(for array element initializer support)
3039 AC_TRY_COMPILE([#include <sys/socket.h>], [
3040         const int array[] = {[1] = 2,};
3041 ], [
3042         # Yes, we have it...
3043         AC_MSG_RESULT(yes)
3044         AC_DEFINE(HAVE_ARRAY_ELEM_INIT,1,[Supports C99 array initialization])
3045 ], [
3046         # We'll have to use signals
3047         AC_MSG_RESULT(no)
3050 AC_CHECK_FUNCS(trunc, , AC_MSG_CHECKING(for trunc in math.h)
3051         # Simply calling trunc (0.0) is no good since gcc will optimize the call away
3052         AC_TRY_LINK([#include <math.h>], 
3053         [ static void *p = &trunc; ],
3054         [
3055                 AC_DEFINE(HAVE_TRUNC) 
3056                 AC_MSG_RESULT(yes)
3057                 ac_cv_trunc=yes
3058         ],
3059         AC_MSG_RESULT(no)))
3061 if test "x$ac_cv_truncl" != "xyes"; then
3062    AC_CHECK_LIB(sunmath, aintl, [ AC_DEFINE(HAVE_AINTL, 1, [Has the 'aintl' function]) LIBS="$LIBS -lsunmath"])
3065 AC_CHECK_FUNCS(execvp)
3067 dnl ****************************
3068 dnl *** Look for /dev/random ***
3069 dnl ****************************
3071 AC_MSG_CHECKING([if usage of random device is requested])
3072 AC_ARG_ENABLE(dev-random,
3073 [  --disable-dev-random    disable the use of the random device (enabled by default)],
3074 try_dev_random=$enableval, try_dev_random=yes)
3076 AC_MSG_RESULT($try_dev_random)
3078 case "{$build}" in
3080 dnl IBM i does not have /dev/random, use unblocking only
3082     *-*-os400*)
3083     NAME_DEV_RANDOM="/dev/urandom"
3084     ;;
3086 dnl Win32 does not have /dev/random, they have their own method...
3088     *-mingw*|*-*-cygwin*)
3089     ac_cv_have_dev_random=no
3090     ;;
3092 dnl Everywhere else, it's /dev/random
3094     *)
3095     NAME_DEV_RANDOM="/dev/random"
3096     ;;
3097 esac
3099 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
3101 dnl Now check if the device actually exists
3103 if test "x$try_dev_random" = "xyes"; then
3104     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
3105     [if test -r "$NAME_DEV_RANDOM" ; then
3106         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
3107     if test "x$ac_cv_have_dev_random" = "xyes"; then
3108         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
3109     fi
3110 else
3111     AC_MSG_CHECKING(for random device)
3112     ac_cv_have_dev_random=no
3113     AC_MSG_RESULT(has been disabled)
3116 if test "x$host_win32" = "xyes"; then
3117     AC_DEFINE(HAVE_CRYPT_RNG)
3120 if test "x$ac_cv_have_dev_random" = "xno" \
3121     && test "x$host_win32" = "xno"; then
3122     AC_MSG_WARN([[
3124 *** A system-provided entropy source was not found on this system.
3125 *** Because of this, the System.Security.Cryptography random number generator
3126 *** will throw a NotImplemented exception.
3128 *** If you are seeing this message, and you know your system DOES have an
3129 *** entropy collection in place, please report an issue on GitHub and
3130 *** provide information about the system and how to access the random device.
3132 *** Otherwise you can install either egd or prngd and set the environment
3133 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
3134 ***]])
3137 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)
3139 AC_MSG_CHECKING([if big-arrays are to be enabled])
3140 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)
3141 if test "x$enable_big_arrays" = "xyes" ; then
3142     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
3143         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
3144     else
3145         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
3146     fi
3148 AC_MSG_RESULT($enable_big_arrays)
3150 dnl **************
3151 dnl *** DTRACE ***
3152 dnl **************
3154 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
3156 if test "x$enable_dtrace" = "xyes"; then
3157    if test "x$has_dtrace" = "xno"; then
3158           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
3159    fi
3160    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
3161    if test "x$DTRACE" = "xno"; then
3162           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
3163           enable_dtrace=no
3164    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
3165           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
3166           enable_dtrace=no
3167    fi
3170 dtrace_g=no
3171 if test "x$enable_dtrace" = "xyes"; then
3172         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
3173         DTRACEFLAGS=
3174         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3175                 case "$host" in
3176                         powerpc-*-darwin*)
3177                         DTRACEFLAGS="-arch ppc64"
3178                         ;;
3179                         i*86-*-darwin*)
3180                         DTRACEFLAGS="-arch x86_64"
3181                         ;;
3182                         *)
3183                         DTRACEFLAGS=-64
3184                         ;;
3185                 esac
3186         else
3187                 case "$host" in
3188                         powerpc-*-darwin*)
3189                         DTRACEFLAGS="-arch ppc"
3190                         ;;
3191                         i*86-*-darwin*)
3192                         DTRACEFLAGS="-arch i386"
3193                         ;;
3194                         *)
3195                         DTRACEFLAGS=-32
3196                         ;;
3197                 esac
3198         fi
3199         AC_SUBST(DTRACEFLAGS)
3200         case "$host" in
3201                 *-*-solaris*)
3202                 dtrace_g=yes
3203                 ;;
3204         esac
3205         AC_CHECK_HEADERS([sys/sdt.h])
3207 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
3208 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
3210 dnl **************************
3211 dnl *** AOT cross offsets  ***
3212 dnl **************************
3214 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
3215     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
3217 dnl **************
3218 dnl ***  LLVM  ***
3219 dnl **************
3221 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
3222 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
3223 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)
3224 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
3226 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
3228 if test "x$enable_llvm" = "xdefault"; then
3229    enable_llvm=$enable_llvm_default
3232 if test "x$enable_llvm" = "xyes"; then
3233    if test "x$with_llvm" != "x"; then
3234           LLVM_CONFIG=$with_llvm/bin/llvm-config
3235           if test x$host_win32 = xyes; then
3236                 LLVM_CONFIG=$LLVM_CONFIG.exe
3237           fi
3238           if test ! -x $LLVM_CONFIG; then
3239                  AC_MSG_ERROR([LLVM executable $LLVM_CONFIG not found.])
3240       fi
3241    else
3242       AC_PATH_PROG(LLVM_CONFIG, llvm-config, no)
3243       if test "x$LLVM_CONFIG" = "xno"; then
3244              AC_MSG_ERROR([llvm-config not found.])
3245       fi
3246    fi
3248    llvm_codegen="x86codegen"
3249    LLVM_ARCH_LIBS="-lLLVMX86Disassembler -lLLVMX86CodeGen -lLLVMX86AsmParser -lLLVMX86Desc -lLLVMX86Info -lLLVMX86AsmPrinter -lLLVMX86Utils"
3250    case "$target" in
3251    arm*)
3252                 llvm_codegen="armcodegen"
3253                 LLVM_ARCH_LIBS="-lLLVMARMDisassembler -lLLVMARMCodeGen -lLLVMARMAsmParser -lLLVMARMDesc -lLLVMARMInfo -lLLVMARMAsmPrinter"
3254                 ;;
3255    aarch64*)
3256                 llvm_codegen="aarch64codegen"
3257                 LLVM_ARCH_LIBS="-lLLVMARMDisassembler -lLLVMARMCodeGen -lLLVMARMAsmParser -lLLVMARMDesc -lLLVMARMInfo -lLLVMARMAsmPrinter"
3258                 ;;
3259    powerpc*)
3260                 llvm_codegen="powerpccodegen"
3261                 LLVM_ARCH_LIBS="-lLLVMPowerPCDisassembler -lLLVMPowerPCCodeGen -lLLVMPowerPCAsmParser -lLLVMPowerPCDesc -lLLVMPowerPCInfo -lLLVMPowerPCAsmPrinter"
3262                 ;;
3263    esac
3265    if test "x$host_win32" = "xno"; then
3267    # Should be something like '2.6' or '2.7svn'
3268    llvm_version=`$LLVM_CONFIG --version`
3269    llvm_api_version=`$LLVM_CONFIG --mono-api-version 2>/dev/null`
3270    AC_MSG_CHECKING(LLVM version)
3271    AC_MSG_RESULT($llvm_version $llvm_api_version)
3272    if echo $llvm_version | grep -q 'mono'; then
3273           if test "x$enable_llvm_version_check" = "xyes"; then
3274                  if test "$llvm_version" != "$expected_llvm_version"; then
3275                         AC_MSG_ERROR([Expected llvm version $expected_llvm_version, but llvm-config --version returned $llvm_version"])
3276                  fi
3277           fi
3278    else
3279           AC_MSG_ERROR([Compiling with stock LLVM is not supported, please use the Mono LLVM repo at https://github.com/mono/llvm, with the GIT branch which matches this version of mono, i.e. 'mono-2-10' for Mono 2.10.])
3280    fi
3282    # The output of --cflags seems to include optimizations flags too
3283    if test $llvm_api_version -gt 100; then
3284           # The --cflags argument includes all kinds of warnings -pendantic etc.
3285           LLVM_CFLAGS="-I$with_llvm/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS"
3286           LLVM_CXXFLAGS="-I$with_llvm/include -std=c++11 -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS"
3287    else
3288           LLVM_CFLAGS=`$LLVM_CONFIG --cflags | sed -e 's/-O2//g' | sed -e 's/-O0//g' | sed -e 's/-fomit-frame-pointer//g' | sed -e 's/-fPIC//g'`
3289       LLVM_CXXFLAGS=`$LLVM_CONFIG --cxxflags | sed -e 's/-O2//g' | sed -e 's/-O0//g' | sed -e 's/-fomit-frame-pointer//g' | sed -e 's/-fPIC//g'`
3290    fi
3291    # LLVM is compiled with -fno-rtti, so we need this too, since our classes inherit
3292    # from LLVM classes.
3293    LLVM_CXXFLAGS="$LLVM_CXXFLAGS -fno-rtti -fexceptions"
3294    LLVM_LDFLAGS=`$LLVM_CONFIG --ldflags`
3295    # This might include empty lines
3296    LLVM_SYSTEM_LIBS=`$LLVM_CONFIG --system-libs 2>/dev/null | grep -- -`
3297    llvm_jit_supported=yes
3298    llvm_jit_libs="jit mcjit $llvm_codegen"
3299    if test "x$host" != "x$target"; then
3300       # No need for jit libs
3301           llvm_jit_supported=no
3302       llvm_jit_libs=""
3303    elif test $llvm_api_version -gt 100; then
3304       llvm_jit_libs="orcjit $llvm_codegen"
3305    fi
3306    LLVM_LIBS=`$LLVM_CONFIG --libs analysis core bitwriter $llvm_jit_libs`
3307    if test "x$LLVM_LIBS" = "x"; then
3308           echo "$LLVM_CONFIG --libs failed."
3309           exit 1
3310    fi
3311    LLVM_LIBS="$LLVM_LIBS $LLVM_LDFLAGS $LLVM_SYSTEM_LIBS"
3312    # The c++ standard library used by llvm doesn't show up in $LLVM_SYSTEM_LIBS so add it manually
3313    if echo $LLVM_CXXFLAGS | grep -q -- '-stdlib=libc++'; then
3314       LLVM_LIBS="$LLVM_LIBS -lc++"
3315    else
3316       LLVM_LIBS="$LLVM_LIBS -lstdc++"
3317    fi
3319    expected_llvm_version="3.4svn-mono-mono/e656cac"
3321    else
3322        LLVM_CFLAGS="-I$with_llvm/include -DNDEBUG -D__NO_CTYPE_INLINE -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS"
3323        LLVM_CXXFLAGS="$LLVM_CFLAGS -std=gnu++11 -fvisibility-inlines-hidden -fno-rtti -Woverloaded-virtual -Wcast-qual"
3324        LLVM_LDFLAGS="-L$with_llvm/lib"
3325        LLVM_SYSTEM_LIBS="-lshell32 -lpsapi -limagehlp -ldbghelp -lm"
3326        LLVM_LIBS="-lLLVMLTO -lLLVMObjCARCOpts -lLLVMLinker -lLLVMipo -lLLVMVectorize -lLLVMBitWriter \
3327          -lLLVMTableGen -lLLVMDebugInfo -lLLVMOption -lLLVMSelectionDAG -lLLVMAsmPrinter \
3328          -lLLVMMCDisassembler -lLLVMJIT -lLLVMAnalysis -lLLVMTarget \
3329          -lLLVMIRReader -lLLVMAsmParser -lLLVMLineEditor -lLLVMMCAnalysis -lLLVMInstrumentation \
3330          -lLLVMInterpreter -lLLVMCodeGen -lLLVMScalarOpts -lLLVMInstCombine -lLLVMTransformUtils \
3331          -lLLVMipa -lLLVMAnalysis -lLLVMProfileData -lLLVMMCJIT -lLLVMTarget -lLLVMRuntimeDyld \
3332          -lLLVMObject -lLLVMMCParser -lLLVMBitReader -lLLVMExecutionEngine -lLLVMMC -lLLVMCore \
3333          -lLLVMSupport -lstdc++"
3334        LLVM_LIBS="$LLVM_LIBS $LLVM_ARCH_LIBS $LLVM_SYSTEM_LIBS"
3336        llvm_config_path=$with_llvm/include/llvm/Config/llvm-config.h
3337        llvm_api_version=`awk '/MONO_API_VERSION/ { print $3 }' $llvm_config_path`
3338    fi  
3340    if test "x$llvm_api_version" = "x"; then
3341           LLVM_CFLAGS="$LLVM_CFLAGS -DLLVM_API_VERSION=0"
3342           LLVM_CXXFLAGS="$LLVM_CXXFLAGS -DLLVM_API_VERSION=0"
3343    else
3344           LLVM_CFLAGS="$LLVM_CFLAGS -DLLVM_API_VERSION=$llvm_api_version"
3345           LLVM_CXXFLAGS="$LLVM_CXXFLAGS -DLLVM_API_VERSION=$llvm_api_version"
3346    fi   
3348    AC_DEFINE_UNQUOTED(LLVM_VERSION, "$llvm_version", [Full version of LLVM libraries])
3350    AC_SUBST(LLVM_CFLAGS)
3351    AC_SUBST(LLVM_CXXFLAGS)
3352    AC_SUBST(LLVM_LIBS)
3353    AC_SUBST(LLVM_LDFLAGS)
3354    AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
3357 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes])
3358 if test "x$enable_loadedllvm" = "xyes"; then
3359    AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
3361 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes])
3363 if test "x$enable_llvm" = "xyes"; then
3364    enable_llvm_runtime=yes
3366 if test "x$enable_llvm_runtime" = "xyes"; then
3367    AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
3369 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes])
3371 TARGET="unknown"
3372 ACCESS_UNALIGNED="yes"
3374 LIBC="libc.so.6"
3375 INTL="libc.so.6"
3376 SQLITE="libsqlite.so.0"
3377 SQLITE3="libsqlite3.so.0"
3378 X11="libX11.so"
3379 GDKX11="libgdk-x11-2.0.so.0"
3380 GTKX11="libgtk-x11-2.0.so.0"
3381 XINERAMA="libXinerama.so.1"
3383 sizeof_register="SIZEOF_VOID_P"
3385 jit_wanted=true
3386 boehm_supported=true
3387 BTLS_SUPPORTED=no
3388 BTLS_PLATFORM=
3390 if test "x$enable_wasm" = "xyes"; then
3391 TARGET=WASM
3392 HOST=WASM
3393 arch_target=wasm
3394 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
3395 AC_DEFINE(HOST_WASM, 1, [Host wasm])
3396 BTLS_SUPPORTED=no
3397 with_tls=pthread
3398 target_mach=no
3400 else
3402 case "$host" in
3403         mips*)
3404                 TARGET=MIPS;
3405                 arch_target=mips;
3406                 with_tls=pthread;
3407                 ACCESS_UNALIGNED="no"
3409                 AC_MSG_CHECKING(for mips n32)
3410                 AC_TRY_COMPILE([],[
3411                 #if _MIPS_SIM != _ABIN32
3412                 #error Not mips n32
3413                 #endif
3414                 ],[
3415                 AC_MSG_RESULT(yes)
3416                 sizeof_register=8
3417                 ],[
3418                 AC_MSG_RESULT(no)
3419                 ])
3420                 ;;
3421         i*86-*-*)
3422                 TARGET=X86;
3423                 arch_target=x86;
3424                 case $host_os in
3425                   solaris*)
3426                         LIBC="libc.so"
3427                         INTL="libintl.so"
3428                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3429                                 TARGET=AMD64
3430                                 arch_target=amd64
3431                         fi
3433                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
3434                         # int astruct __attribute__ ((visibility ("hidden")));
3435                         # void foo ()
3436                         # {
3437                         #       void *p = &astruct;
3438                         # }
3439                         # gcc -fPIC --shared -o libfoo.so foo.c
3440                         # yields:
3441                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
3442                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
3443                         have_visibility_hidden=no
3444                         ;;
3445                   mingw*|cygwin*)
3446                         have_visibility_hidden=no                 
3447                         ;;
3448                   haiku*)
3449                         LIBC=libroot.so
3450                         ;;
3451                   linux*)
3452                         AOT_SUPPORTED="yes"
3453                         BTLS_SUPPORTED=yes
3454                         BTLS_PLATFORM=i386
3455                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3456                         ;;
3457                   darwin*)
3458                         AOT_SUPPORTED="yes"
3459                         BTLS_SUPPORTED=yes
3460                         BTLS_PLATFORM=i386
3461                         ;;
3462                   openbsd*|freebsd*|kfreebsd-gnu*)
3463                         AOT_SUPPORTED="yes"
3464                         BTLS_SUPPORTED=yes
3465                         BTLS_PLATFORM=i386
3466                         ;;
3467                 esac
3468                 ;;
3469         x86_64-*-* | amd64-*-*)
3470                 TARGET=AMD64;
3471                 arch_target=amd64;
3472                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
3473                         AC_DEFINE(__mono_ilp32__, 1, [64 bit mode with 4 byte longs and pointers])
3474                         sizeof_register=8
3475                 fi
3476                 case $host_os in
3477                   linux*)
3478                         AOT_SUPPORTED="yes"
3479                         BTLS_SUPPORTED=yes
3480                         BTLS_PLATFORM=x86_64
3481                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3482                         ;;
3483                   darwin*)
3484                         AOT_SUPPORTED="yes"
3485                         BTLS_SUPPORTED=yes
3486                         BTLS_PLATFORM=x86_64
3487                         boehm_supported=false
3488                         ;;
3489                   openbsd*|freebsd*|kfreebsd-gnu*)
3490                         AOT_SUPPORTED="yes"
3491                         BTLS_SUPPORTED=yes
3492                         BTLS_PLATFORM=x86_64
3493                         ;;
3494                   mingw*)
3495                         ;;
3496                 esac
3497                 ;;
3498         sparc*-*-*)
3499                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
3500                    TARGET=SPARC64
3501                 else
3502                         TARGET=SPARC
3503                 fi
3504                 arch_target=sparc;
3505                 ACCESS_UNALIGNED="no"
3506                 case $host_os in
3507                   linux*) ;;
3508                   *)
3509                         LIBC="libc.so"
3510                         INTL="libintl.so"
3511                 esac
3512                 if test x"$GCC" = xyes; then
3513                         # We don't support v8 cpus
3514                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
3515                 fi
3516                 if test x"$AR" = xfalse; then
3517                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
3518                 fi
3519                 ;;
3520         *-mingw*|*-*-cygwin*)
3521                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
3522                 have_visibility_hidden=no
3523                 INTL="intl"
3524                 ;;
3525         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
3526         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
3527         powerpc-*-freebsd* | powerpc-*-aix* | powerpc-*-os400* )
3528                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
3529                         TARGET=POWERPC64;
3530                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
3531                         if ! (echo $CC | grep -q -- 'clang'); then
3532                                 CFLAGS="$CFLAGS -mminimal-toc"
3533                         fi
3534                 else
3535                         TARGET=POWERPC;
3536                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
3537                 fi
3538                 arch_target=ppc;
3539                 case $host_os in
3540                   aix*|os400*)
3541                         BTLS_SUPPORTED=yes
3542                         BTLS_PLATFORM=powerpc
3543                         dnl on AIX/PASE, shared libraries can be inside archives
3544                         dnl if they are, we specify them by lib.a(lib.so)
3545                         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX, so
3546                         LIBC="libc.a(shr_64.o)"
3547                         INTL="libintl.a(libintl.so.8)"
3548                         ;;
3549                   linux*)
3550                         BTLS_SUPPORTED=yes
3551                         BTLS_PLATFORM=powerpc
3552                         ;;
3553                 esac
3554                 ;;
3555         armv7k-*-darwin*)
3556                 TARGET=ARM;
3557                 TARGET_SYS=WATCHOS
3558                 arch_target=arm;
3559                 arm_fpu=VFP_HARD
3560                 ACCESS_UNALIGNED="no"
3561                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3562                 ;;
3564         arm*-darwin*)
3565                 TARGET=ARM;
3566                 arch_target=arm;
3567                 ACCESS_UNALIGNED="no"
3568                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3569                 ;;
3570         arm*-linux*)
3571                 TARGET=ARM;
3572                 arch_target=arm;
3573                 ACCESS_UNALIGNED="no"
3574                 AOT_SUPPORTED="yes"
3575                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3576                 BTLS_SUPPORTED=yes
3577                 BTLS_PLATFORM=arm
3578                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3579                 case "$target" in
3580                 arm*-linux*-gnueabi)
3581                         BTLS_PLATFORM=armsoft
3582                         ;;
3583                 esac
3584                 ;;
3585         arm*-netbsd*-eabi*)
3586                 TARGET=ARM;
3587                 arch_target=arm;
3588                 ACCESS_UNALIGNED="no"
3589                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3590                 ;;
3591         aarch64-*)
3592                 # https://lkml.org/lkml/2012/7/15/133
3593                 TARGET=ARM64
3594                 arch_target=arm64
3595                 boehm_supported=false
3596                 AOT_SUPPORTED="yes"
3597                 BTLS_SUPPORTED=yes
3598                 BTLS_PLATFORM=aarch64
3599                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3600                 ;;
3601         s390x-*-linux*)
3602                 TARGET=S390X;
3603                 arch_target=s390x;
3604                 ACCESS_UNALIGNED="yes"
3605                 BTLS_SUPPORTED=yes
3606                 BTLS_PLATFORM=s390x
3607                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
3608                 ;;
3609 esac
3611 HOST=$TARGET
3613 if test "x$host" != "x$target"; then
3614    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
3615    enable_mcs_build=no
3616    enable_support_build=no
3617    BTLS_SUPPORTED=no
3618    case "$target" in
3619    arm*-darwin*)
3620                 TARGET=ARM;
3621                 arch_target=arm;
3622                 ACCESS_UNALIGNED="no"
3623                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3624                 # Can't use tls, since it depends on the runtime detection of tls offsets
3625                 # in mono-compiler.h
3626                 with_tls=pthread
3627                 case "$target" in
3628                 armv7k-*)
3629                         arm_fpu=VFP_HARD
3630                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
3631                         ;;
3632                 esac            
3633                 ;;
3634    powerpc64-ps3-linux-gnu)
3635                 TARGET=POWERPC64
3636                 arch_target=powerpc64
3637                 AC_DEFINE(TARGET_PS3, 1, [...])
3638                 # It would be better to just use TARGET_POWERPC64, but lots of code already
3639                 # uses this define
3640                 AC_DEFINE(__mono_ppc64__, 1, [...])
3641                 AC_DEFINE(__mono_ilp32__, 1, [64 bit mode with 4 byte longs and pointers])
3642                 sizeof_register=8
3643                 target_byte_order=G_BIG_ENDIAN
3644                 ;;
3645    powerpc64-xbox360-linux-gnu)
3646                 TARGET=POWERPC64
3647                 arch_target=powerpc64
3648                 AC_DEFINE(TARGET_XBOX360, 1, [...])
3649                 # It would be better to just use TARGET_POWERPC64, but lots of code already
3650                 # uses this define
3651                 sizeof_register=8
3652                 target_byte_order=G_BIG_ENDIAN
3653                 ;;
3654    arm*-linux-*)
3655                 TARGET=ARM;
3656                 arch_target=arm;
3657                 AC_DEFINE(TARGET_ARM, 1, [...])
3658                 ACCESS_UNALIGNED="no"
3659                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3660                 # Can't use tls, since it depends on the runtime detection of tls offsets
3661                 # in mono-compiler.h
3662                 with_tls=pthread
3663                 target_mach=no
3664                 case "$target" in
3665                 armv7l-unknown-linux-gnueabi*)
3666                         # TEGRA
3667                         CPPFLAGS="$CPPFLAGS"
3668                         ;;
3669                 armv5-*-linux-androideabi*)
3670                         AC_DEFINE(TARGET_ANDROID, 1, [...])
3671                         CPPFLAGS="$CPPFLAGS"
3672                         ;;
3673                 *-linux-androideabi*)
3674                         AC_DEFINE(TARGET_ANDROID, 1, [...])
3675                         CPPFLAGS="$CPPFLAGS"
3676                         ;;
3677                 esac
3678                 ;;
3679    arm*-netbsd*-eabi*)
3680                 TARGET=ARM;
3681                 arch_target=arm;
3682                 AC_DEFINE(TARGET_ARM, 1, [...])
3683                 ACCESS_UNALIGNED="no"
3684                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3685                 # Can't use tls, since it depends on the runtime detection of tls offsets
3686                 # in mono-compiler.h
3687                 with_tls=pthread
3688                 target_mach=no
3689                 ;;
3690    i686*-linux-*)
3691                 TARGET=X86;
3692                 arch_target=x86;
3693                 AC_DEFINE(TARGET_X86, 1, [...])
3694                 CPPFLAGS="$CPPFLAGS"
3695                 # Can't use tls, since it depends on the runtime detection of tls offsets
3696                 # in mono-compiler.h            
3697                 with_tls=pthread
3698                 target_mach=no
3700                 case "$target" in
3701                 *-linux-android*)
3702                         AC_DEFINE(TARGET_ANDROID, 1, [...])
3703                         ;;
3704                 esac
3705                 ;;
3706    x86_64*-linux-*)
3707                 TARGET=AMD64;
3708                 arch_target=amd64;
3709                 AC_DEFINE(TARGET_AMD64, 1, [...])
3710                 CPPFLAGS="$CPPFLAGS"
3711                 # Can't use tls, since it depends on the runtime detection of tls offsets
3712                 # in mono-compiler.h
3713                 with_tls=pthread
3714                 target_mach=no
3716                 case "$target" in
3717                 *-linux-android*)
3718                         AC_DEFINE(TARGET_ANDROID, 1, [...])
3719                         ;;
3720                 esac
3721                 ;;
3722    x86_64-ps4-freebsd)
3723                 TARGET=AMD64;
3724                 arch_target=amd64;
3725                 AC_DEFINE(TARGET_AMD64, 1, [...])
3726                 AC_DEFINE(TARGET_PS4, 1, [...])
3727                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
3728                 CPPFLAGS="$CPPFLAGS"
3729                 # Can't use tls, since it depends on the runtime detection of tls offsets
3730                 # in mono-compiler.h
3731                 with_tls=pthread
3732                 target_mach=no
3733                 target_win32=no
3734                 ;;
3735    aarch64*-linux-*)
3736                 TARGET=ARM64;
3737                 arch_target=arm64;
3738                 AC_DEFINE(TARGET_ARM64, 1, [...])
3739                 CPPFLAGS="$CPPFLAGS"
3740                 # Can't use tls, since it depends on the runtime detection of tls offsets
3741                 # in mono-compiler.h
3742                 with_tls=pthread
3743                 target_mach=no
3744                 case "$target" in
3745                 *-linux-android*)
3746                         AC_DEFINE(TARGET_ANDROID, 1, [...])
3747                         ;;
3748                 esac
3749                 ;;
3750         aarch64-*)
3751                 TARGET=ARM64
3752                 ;;
3753         *)
3754                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
3755         esac
3758 case "$TARGET" in
3759 X86)
3760         AC_DEFINE(TARGET_X86, 1, [...])
3761         ;;
3762 AMD64)
3763         AC_DEFINE(TARGET_AMD64, 1, [...])
3764         ;;
3765 ARM)
3766         AC_DEFINE(TARGET_ARM, 1, [...])
3767         ;;
3768 ARM64)
3769         AC_DEFINE(TARGET_ARM64, 1, [...])
3770         ;;
3771 POWERPC)
3772         AC_DEFINE(TARGET_POWERPC, 1, [...])
3773         ;;
3774 POWERPC64)
3775         AC_DEFINE(TARGET_POWERPC, 1, [...])
3776         AC_DEFINE(TARGET_POWERPC64, 1, [...])
3777         ;;
3778 S390X)
3779         AC_DEFINE(TARGET_S390X, 1, [...])
3780         ;;
3781 MIPS)
3782         AC_DEFINE(TARGET_MIPS, 1, [...])
3783         ;;
3784 SPARC)
3785         AC_DEFINE(TARGET_SPARC, 1, [...])
3786         ;;
3787 SPARC64)
3788         AC_DEFINE(TARGET_SPARC64, 1, [...])
3789         ;;
3790 esac
3792 case "$HOST" in
3793 X86)
3794         AC_DEFINE(HOST_X86, 1, [...])
3795         ;;
3796 AMD64)
3797         AC_DEFINE(HOST_AMD64, 1, [...])
3798         ;;
3799 ARM)
3800         AC_DEFINE(HOST_ARM, 1, [...])
3801         ;;
3802 ARM64)
3803         AC_DEFINE(HOST_ARM64, 1, [...])
3804         ;;
3805 POWERPC)
3806         AC_DEFINE(HOST_POWERPC, 1, [...])
3807         ;;
3808 POWERPC64)
3809         AC_DEFINE(HOST_POWERPC, 1, [...])
3810         AC_DEFINE(HOST_POWERPC64, 1, [...])
3811         ;;
3812 S390X)
3813         AC_DEFINE(HOST_S390X, 1, [...])
3814         ;;
3815 MIPS)
3816         AC_DEFINE(HOST_MIPS, 1, [...])
3817         ;;
3818 SPARC)
3819         AC_DEFINE(HOST_SPARC, 1, [...])
3820         ;;
3821 SPARC64)
3822         AC_DEFINE(HOST_SPARC64, 1, [...])
3823         ;;
3824 esac
3826 #WASM hack
3830 dnl *************
3831 dnl *** VTUNE ***
3832 dnl *************
3834 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
3835 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
3837 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
3839 if test "x$enable_vtune" = "xyes"; then
3840         if test "x$with_vtune" = "x"; then
3841                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
3842         else
3843                 VTUNE_PATH=$with_vtune
3844         fi
3845         VTUNE_INCLUDE=$VTUNE_PATH/include
3846         case "$TARGET" in
3847         X86)
3848                 VTUNE_LIB=$VTUNE_PATH/lib32
3849                 ;;
3850         AMD64)
3851                 VTUNE_LIB=$VTUNE_PATH/lib64
3852                 ;;
3853         *)
3854                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
3855                 ;;
3856         esac
3857         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
3858                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
3859         fi
3860         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
3861                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
3862         fi
3864         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
3865         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
3867         AC_SUBST(VTUNE_LIBS)
3868         AC_SUBST(VTUNE_CFLAGS)
3870 dnl Use GCC atomic ops if they work on the target.
3871 if test x$GCC = "xyes"; then
3872         case $TARGET in
3873         X86 | AMD64 | ARM | ARM64 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64)
3874                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
3875                 ;;
3876         esac
3879 if test "x$target_mach" = "xyes"; then
3881    if test "x$TARGET_SYS" = "xWATCHOS"; then
3882           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
3883           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
3884           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
3885           BTLS_SUPPORTED=no
3886    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64"; then
3887           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
3888           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
3889           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
3890           BTLS_SUPPORTED=no
3891    else
3892        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
3893        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
3894        #error fail this for ios
3895        #endif
3896        ], [
3897                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
3898           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
3899           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
3900           target_osx=yes
3901        ], [
3902           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
3903           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
3904           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
3905           BTLS_SUPPORTED=no
3906                   target_ios=yes
3907        ])
3908         fi
3909    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
3912 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
3914 if test "x$sizeof_register" = "x4"; then
3915    AC_DEFINE(SIZEOF_REGISTER,4,[size of machine integer registers])
3916 elif test "x$sizeof_register" = "x8"; then
3917    AC_DEFINE(SIZEOF_REGISTER,8,[size of machine integer registers])
3918 else
3919    AC_DEFINE(SIZEOF_REGISTER,SIZEOF_VOID_P,[size of machine integer registers])
3922 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
3924 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
3925    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
3926 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
3927    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
3928 else
3929    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
3932 if test "x$have_visibility_hidden" = "xyes"; then
3933    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
3936 if test "x$have_deprecated" = "xyes"; then
3937    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
3940 dnl 
3941 dnl Simple Generational checks (sgen)
3943 SGEN_DEFINES=
3944 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
3945 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
3946 if test x$buildsgen = xyes; then
3947    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
3948    SGEN_DEFINES="-DHAVE_SGEN_GC"
3950         conc_gc_msg=""
3951    if test x$with_sgen_default_concurrent != xno; then
3952        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
3953            conc_gc_msg=" (concurrent by default)"
3954    fi
3956    if test "x$gc_msg" = "x"; then
3957       gc_msg="sgen$conc_gc_msg"
3958    else
3959       gc_msg="sgen$conc_gc_msg and $gc_msg"
3960    fi
3962 AC_SUBST(SGEN_DEFINES)
3963 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
3965 jit_status="Building and using the JIT"
3967 libsuffix=".so"
3969 case "$host" in
3970      *-*-darwin*)
3971         libsuffix=".dylib"
3972         LIBC="libc.dylib"
3973         INTL="libintl.dylib"
3974         SQLITE="libsqlite.0.dylib"
3975         SQLITE3="libsqlite3.0.dylib"
3976         X11="libX11.dylib"
3977         GDKX11="libgdk-x11-2.0.dylib"
3978         GTKX11="libgtk-x11-2.0.dylib"
3979         ;;
3980      *-*-*netbsd*)
3981         LIBC="libc.so"
3982         INTL="libintl.so"
3983         SQLITE="libsqlite.so"
3984         SQLITE3="libsqlite3.so"
3985         ;;
3986      *-*-kfreebsd*-gnu)
3987         LIBC="libc.so.0.1"
3988         INTL="libc.so.0.1"
3989         X11="libX11.so.6"
3990         ;;
3991     *-*-*freebsd*)
3992         LIBC="libc.so.7"
3993         INTL="libintl.so"
3994         SQLITE="libsqlite.so"
3995         SQLITE3="libsqlite3.so"
3996         ;;
3997     *-*-*openbsd*)
3998         LIBC="libc.so"
3999         INTL="libintl.so"
4000         SQLITE="libsqlite.so"
4001         SQLITE3="libsqlite3.so"
4002         ;;
4003     *-*-*linux*)
4004         AC_PATH_X
4005         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
4006         AC_MSG_CHECKING(for the soname of libX11.so)
4007         for i in $x_libraries $dlsearch_path; do
4008                 for r in 4 5 6; do
4009                         if test -f $i/libX11.so.$r; then
4010                                 X11=libX11.so.$r
4011                                 AC_MSG_RESULT($X11)
4012                         fi
4013                 done
4014         done
4015         
4016         if test "x$X11" = "xlibX11.so"; then
4017                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
4018                 X11=libX11.so.6
4019         fi
4020         ;;
4021 esac
4023 AC_SUBST(libsuffix)
4025 ######################################
4026 # EGLIB CHECKS
4027 ######################################
4029 GNUC_PRETTY=
4030 GNUC_UNUSED=
4031 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
4032 if test x$GCC = xyes; then
4033    GNUC_UNUSED='__attribute__((__unused__))'
4034    GNUC_NORETURN='__attribute__((__noreturn__))'
4035    case $host_cpu in
4036      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
4037    esac
4039 AC_SUBST(GNUC_PRETTY)
4040 AC_SUBST(GNUC_UNUSED)
4041 AC_SUBST(GNUC_NORETURN)
4042 AC_SUBST(BREAKPOINT)
4044 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
4046 case $host in
4047 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
4048     PATHSEP='\\'
4049     SEARCHSEP=';'
4050     OS="WIN32"
4051     PIDTYPE='void *'
4052     ;;
4054     PATHSEP='/'
4055     SEARCHSEP=':'
4056     OS="UNIX"
4057     PIDTYPE='int'
4058     ;;
4059 esac
4061 case $host in
4062         *-*-solaris*)
4063         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
4064         ;;
4065 esac
4067 case $target in
4068 arm*-darwin*|aarch64*-*)
4069     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
4070     ;;
4071 i*86-*-darwin*)
4072     ORDER=G_LITTLE_ENDIAN
4073     ;;
4074 *-*-haiku*)
4075     LDFLAGS="$LDFLAGS -ltextencoding"
4076     ;;
4077 *-*-openbsd*)
4078     CFLAGS="$CFLAGS -pthread"
4079     LDFLAGS="$LDFLAGS -pthread"
4080     ;;
4081 esac
4083 AC_SUBST(ORDER)
4084 AC_SUBST(CFLAGS)
4085 AC_SUBST(PATHSEP)
4086 AC_SUBST(SEARCHSEP)
4087 AC_SUBST(OS)
4088 AC_SUBST(PIDTYPE)
4090 # Defined for all targets/platforms using classic Windows API support.
4091 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
4092 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
4094 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf strerror_r)
4095 AC_CHECK_FUNCS(getrlimit)
4096 AC_CHECK_FUNCS(fork execv execve)
4098 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
4100 if test x$with_overridable_allocators = xyes; then
4101         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
4102   AC_MSG_NOTICE([Overridable allocator support enabled])
4103 else
4104   AC_MSG_NOTICE([Overridable allocator support disabled])
4108 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
4109 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
4110 # removed once support for 10.6 is dropped.
4112 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
4114 if test x$target_osx = xyes; then
4115 AC_CHECK_FUNCS(getpwuid_r)
4116 elif test x$target_ios = xno; then
4117 AC_CHECK_FUNCS(strndup getpwuid_r)
4120 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
4122 AC_SEARCH_LIBS(sqrtf, m)
4124 # nanosleep may not be part of libc, also search it in other libraries
4125 AC_SEARCH_LIBS(nanosleep, rt)
4127 AC_SEARCH_LIBS(dlopen, dl)
4128 old_ldflags="${LDFLAGS}"
4129 # GNU specific option, this confuses IBM ld, but do offer alternatives when possible
4130 if test $lt_cv_prog_gnu_ld = yes; then
4131         LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4132 else
4133         case $host in
4134         *-*-aix*|*-*-os400*)
4135                 ;;
4136         *)
4137                 dnl Try to use export-dynamic anyways
4138                 LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4139                 ;;
4140         esac
4142 AC_TRY_LINK(, [int i;], found_export_dynamic=yes, found_export_dynamic=no)
4143 if test $found_export_dynamic = no; then
4144         LDFLAGS="${old_ldflags}"
4147 AC_MSG_CHECKING(for varargs macros)
4148 AC_TRY_COMPILE([],[
4149 int foo (int i, int j);
4150 #define bar(...) foo (1, __VA_ARGS__)
4151 void main () {
4152          bar (2);
4154 ],have_iso_varargs=yes,have_iso_varargs=no)
4155 AC_MSG_RESULT($have_iso_varargs)
4156 G_HAVE_ISO_VARARGS=0
4157 if test "x$have_iso_varargs" = "xyes"; then
4158    G_HAVE_ISO_VARARGS=1
4160 AC_SUBST(G_HAVE_ISO_VARARGS)
4162 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)
4163 AC_CHECK_LIB([iconv], [locale_charset],[],[AC_CHECK_LIB([charset], [locale_charset],[LIBS+=" -liconv -lcharset"])])
4164 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
4165 AC_SUBST(HAVE_ALLOCA_H)
4167 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_int; then
4168    GPOINTER_TO_INT="((gint) (ptr))"
4169    GPOINTER_TO_UINT="((guint) (ptr))"
4170    GINT_TO_POINTER="((gpointer) (v))"
4171    GUINT_TO_POINTER="((gpointer) (v))"
4172    GSIZE="int"
4173    GSIZE_FORMAT='"u"'
4174 elif test $ac_cv_sizeof_void_p = $ac_cv_sizeof_long; then
4175    GPOINTER_TO_INT="((gint)(long) (ptr))"
4176    GPOINTER_TO_UINT="((guint)(long) (ptr))"
4177    GINT_TO_POINTER="((gpointer)(glong) (v))"
4178    GUINT_TO_POINTER="((gpointer)(gulong) (v))"
4179    GSIZE="long"
4180    GSIZE_FORMAT='"lu"'
4181 elif test $ac_cv_sizeof_void_p = $ac_cv_sizeof_long_long; then
4182    GPOINTER_TO_INT="((gint)(long long) (ptr))"
4183    GPOINTER_TO_UINT="((guint)(unsigned long long) (ptr))"
4184    GINT_TO_POINTER="((gpointer)(long long) (v))"
4185    GUINT_TO_POINTER="((gpointer)(unsigned long long) (v))"
4186    GSIZE="long long"
4187    GSIZE_FORMAT='"I64u"'
4188 else
4189    AC_MSG_ERROR([unsupported pointer size])
4192 AC_SUBST(GPOINTER_TO_INT)
4193 AC_SUBST(GPOINTER_TO_UINT)
4194 AC_SUBST(GINT_TO_POINTER)
4195 AC_SUBST(GUINT_TO_POINTER)
4196 AC_SUBST(GSIZE)
4197 AC_SUBST(GSIZE_FORMAT)
4198 AC_SUBST(G_GUINT64_FORMAT)
4199 AC_SUBST(G_GINT64_FORMAT)
4200 AC_SUBST(G_GUINT32_FORMAT)
4201 AC_SUBST(G_GINT32_FORMAT)
4204 # END OF EGLIB CHECKS
4207 AC_ARG_WITH([libgdiplus],
4208         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
4209         [], [with_libgdiplus=installed])
4211 # default install location
4212 libgdiplus_install_loc=libgdiplus${libsuffix}
4213 case "$host" in
4214     *-*-*linux*)
4215     libgdiplus_install_loc=libgdiplus${libsuffix}.0
4216     ;;
4217 esac
4219 case $with_libgdiplus in
4220     no)
4221     libgdiplus_loc=
4222     ;;
4224     installed)
4225     libgdiplus_loc=
4226     if test x$cross_compiling = xno; then
4227         if test x$host_darwin = xyes; then
4228             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
4229             if test -x $a; then
4230               libgdiplus_install_loc=$a
4231               libgdiplus_loc=$a
4232             fi
4233         fi
4234     fi
4235     ;;
4237     yes|sibling)
4238     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
4239     ;;
4241     /*) # absolute path, assume it is an install location
4242     libgdiplus_loc=$with_libgdiplus
4243     libgdiplus_install_loc=$with_libgdiplus
4244     ;;
4246     *)
4247     libgdiplus_loc=`pwd`/$with_libgdiplus
4248     ;;
4249 esac
4250 AC_SUBST(libgdiplus_loc)
4251 AC_SUBST(libgdiplus_install_loc)
4253 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)
4254 if test "x$icall_symbol_map" = "xyes"; then
4255    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
4258 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
4259 if test "x$icall_export" = "xyes"; then
4260    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
4263 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
4264 if test "x$icall_tables" = "xno"; then
4265    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
4268 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
4270 if test "x$with_tls" = "x__thread"; then
4271         AC_DEFINE(HAVE_KW_THREAD, 1, [Have __thread keyword])
4272         # Pass the information to libgc
4273         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
4274         AC_MSG_CHECKING(if the tls_model attribute is supported)
4275         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
4276                 ], [
4277                         AC_MSG_RESULT(yes)
4278                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
4279                 ], [
4280                         AC_MSG_RESULT(no)
4281         ])
4284 if test ${TARGET} = ARM; then
4285         dnl ******************************************
4286         dnl *** Check to see what FPU is available ***
4287         dnl ******************************************
4288         AC_MSG_CHECKING(which FPU to use)
4290         #
4291         # This is a bit tricky:
4292         #
4293         # if (__ARM_PCS_VFP) {
4294         #       /* mfloat-abi=hard == VFP with hard ABI */
4295         # } elif (!__SOFTFP__) {
4296         #       /* mfloat-abi=softfp == VFP with soft ABI */
4297         # } else {
4298         #       /* mfloat-abi=soft == no VFP */
4299         # }
4300         #
4301         # The exception is iOS (w/ GCC) where none of the above
4302         # are defined (but iOS always uses the 'softfp' ABI).
4303         #
4304         # No support for FPA.
4305         #
4307         fpu=NONE
4309         # iOS GCC always uses the 'softfp' ABI.
4310         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
4311                 fpu=VFP
4312         fi
4314         # Are we using the 'hard' ABI?
4315         if test x$fpu = xNONE; then
4316                 AC_TRY_COMPILE([], [
4317                         #ifndef __ARM_PCS_VFP
4318                         #error "Float ABI is not 'hard'"
4319                         #endif
4320                 ], [
4321                         fpu=VFP_HARD
4322                 ], [
4323                         fpu=NONE
4324                 ])
4325         fi
4327         # No 'hard' ABI. 'soft' or 'softfp'?
4328         if test x$fpu = xNONE; then
4329                 AC_TRY_COMPILE([], [
4330                         #ifdef __SOFTFP__
4331                         #error "Float ABI is not 'softfp'"
4332                         #endif
4333                 ], [
4334                         fpu=VFP
4335                 ], [
4336                         fpu=NONE
4337                 ])
4338         fi
4340         if test x$arm_fpu != x; then
4341            fpu=$arm_fpu
4342         fi
4344         AC_MSG_RESULT($fpu)
4345         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
4346         unset fpu
4348         dnl *********************************************
4349         dnl *** Check which ARM version(s) we can use ***
4350         dnl *********************************************
4351         AC_MSG_CHECKING(which ARM version to use)
4353         AC_TRY_COMPILE([], [
4354                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
4355                 #error Not on ARM v5.
4356                 #endif
4357         ], [
4358                 arm_v5=yes
4360                 arm_ver=ARMv5
4361         ], [])
4363         AC_TRY_COMPILE([], [
4364                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
4365                 #error Not on ARM v6.
4366                 #endif
4367         ], [
4368                 arm_v5=yes
4369                 arm_v6=yes
4371                 arm_ver=ARMv6
4372         ], [])
4374         AC_TRY_COMPILE([], [
4375                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
4376                 #error Not on ARM v7.
4377                 #endif
4378         ], [
4379                 arm_v5=yes
4380                 arm_v6=yes
4381                 arm_v7=yes
4383                 arm_ver=ARMv7
4384         ], [])
4386         AC_MSG_RESULT($arm_ver)
4388         if test x$arm_v5 = xyes; then
4389                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
4390                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
4391         fi
4393         if test x$arm_v6 = xyes; then
4394                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
4395                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
4396         fi
4398         if test x$arm_v7 = xyes; then
4399                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
4400                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
4401         fi
4404 if test ${TARGET} = unknown; then
4405         CPPFLAGS="$CPPFLAGS -DNO_PORT"
4406         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
4409 if test "x$platform_android" = "xyes"; then
4410         case "x${TARGET}" in
4411         xARM)
4412                 case "x$arm_ver" in
4413                 xARMv5)
4414                         BTLS_SUPPORTED=yes
4415                         BTLS_PLATFORM=android-armv5
4416                         ;;
4417                 xARMv6)
4418                         BTLS_SUPPORTED=yes
4419                         BTLS_PLATFORM=android-armv6
4420                         ;;
4421                 xARMv7)
4422                         BTLS_SUPPORTED=yes
4423                         BTLS_PLATFORM=android-armv7
4424                         ;;
4425                 *)
4426                         BTLS_SUPPORTED=no
4427                         ;;
4428                 esac
4429                 ;;
4430         xARM64)
4431                 BTLS_SUPPORTED=yes
4432                 BTLS_PLATFORM=android-v8a
4433                 ;;
4434         xX86)
4435                 BTLS_SUPPORTED=yes
4436                 BTLS_PLATFORM=android-x86
4437                 ;;
4438         xAMD64)
4439                 BTLS_SUPPORTED=yes
4440                 BTLS_PLATFORM=android-x64
4441                 ;;
4442         *)
4443                 BTLS_SUPPORTED=no
4444                 ;;
4445         esac
4448 if test ${ACCESS_UNALIGNED} = no; then
4449         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
4452 if test x$host_darwin = xyes; then
4453         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
4454         AS_IF(
4455                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
4456                 [AC_MSG_RESULT([no])],
4457                 [
4458                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
4459                         AR_FLAGS="Scru"
4460                         RANLIB="$RANLIB -no_warning_for_no_symbols"
4461                         AC_MSG_RESULT([yes])
4462                 ]
4463         )
4466 case "x$libgc" in
4467         xincluded)
4468                 # Pass CPPFLAGS to libgc configure
4469                 # We should use a separate variable for this to avoid passing useless and
4470                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
4471                 # This should be executed late so we pick up the final version of CPPFLAGS
4472                 # The problem with this approach, is that during a reconfigure, the main
4473                 # configure scripts gets invoked with these arguments, so we use separate
4474                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
4475                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
4476                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
4477                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
4478                 fi
4479                 # Don't pass -finstrument-for-thread-suspension in, 
4480                 # if these are instrumented it will be very bad news 
4481                 # (infinite recursion, undefined parking behavior, etc)
4482                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
4483                 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\""
4484                 if test "x$support_boehm" = "xyes"; then
4485                         AC_CONFIG_SUBDIRS(libgc)
4486                 fi
4487                 ;;
4488 esac
4490 MALLOC_MEMPOOLS=no
4491 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
4492         if test x$with_malloc_mempools = xyes; then
4493                 MALLOC_MEMPOOLS=yes
4494                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
4495         fi
4499 DISABLE_MCS_DOCS=default
4500 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
4501         if test x$with_mcs_docs != xyes; then
4502                 DISABLE_MCS_DOCS=yes
4503         fi
4505 if test -n "$INSTALL_4_x_TRUE"; then :
4506         DISABLE_MCS_DOCS=yes
4508 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
4509    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
4512 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)],[
4513         if test x$with_lazy_gc_thread_creation != xno ; then
4514                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
4515         fi
4516 ], [with_lazy_gc_thread_creation=no])
4518 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])
4519 AC_ARG_ENABLE(cooperative_suspend, [  --enable-cooperative-suspend      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [], [enable_cooperative_suspend=default])
4521 if test x$enable_cooperative_suspend = xdefault -a test x$with_cooperative_gc != xdefault; then
4522         enable_cooperative_suspend=$with_cooperative_gc
4525 if test x$enable_cooperative_suspend = xdefault; then
4526         enable_cooperative_suspend=$enable_cooperative_suspend_default
4529 if test x$enable_cooperative_suspend != xno; then
4530         AC_DEFINE(ENABLE_COOP_SUSPEND,1,[Enable cooperative stop-the-world garbage collection.])
4533 AM_CONDITIONAL([ENABLE_COOP_SUSPEND], [test x$enable_cooperative_suspend != xno])
4535 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=no])
4537 if test x$enable_hybrid_suspend != xno -a x$enable_cooperative_suspend != xno ; then
4538         AC_MSG_ERROR([Hybrid suspend and Cooperative suspend cannot be both enabled.])
4541 if test x$enable_hybrid_suspend != xno ; then
4542         AC_DEFINE(ENABLE_HYBRID_SUSPEND,1,[Enable hybrid suspend for GC stop-the-world])
4545 AM_CONDITIONAL([ENABLE_HYBRID_SUSPEND], [test x$enable_hybrid_suspend != xno])
4547 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],[
4549         if test x$enable_checked_build != x ; then
4550                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
4551         fi
4552         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
4553                 eval "mono_checked_build_test_enable_$feature='yes'"
4554         done
4556         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
4557                 eval "mono_checked_build_test_enable_gc='yes'"
4558                 eval "mono_checked_build_test_enable_metadata='yes'"
4559                 eval "mono_checked_build_test_enable_thread='yes'"
4560                 eval "mono_checked_build_test_enable_private_types='yes'"
4561         fi
4563         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
4564                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
4565         fi
4567         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
4568                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
4569         fi
4571         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
4572                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
4573         fi
4575         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
4576                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
4577         fi
4578 ], [])
4580 AC_CHECK_HEADER([malloc.h], 
4581                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
4582                         [Define to 1 if you have /usr/include/malloc.h.])],,)
4584 if test x"$GCC" = xyes; then
4585         # Implicit function declarations are not 64 bit safe
4586         # Do this late, since this causes lots of configure tests to fail
4587         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
4588         # jay has a lot of implicit declarations
4589         JAY_CFLAGS="-Wno-implicit-function-declaration"
4592 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
4593 # instead of libmono-static.a
4594 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
4595    LIBMONO_LA=libmini-static.la
4596 else
4597    if test x$buildsgen = xyes; then
4598       LIBMONO_LA=libmonosgen-$API_VER.la
4599    else
4600       LIBMONO_LA=libmonoboehm-$API_VER.la
4601    fi
4603 AC_SUBST(LIBMONO_LA)
4605 dnl **************
4606 dnl ***  Btls  ***
4607 dnl **************
4609 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
4610 AC_ARG_ENABLE(btls-lib, [  --disable-btls-lib             Disable building the BTLS native library], enable_btls_lib=$enableval, enable_btls_lib=$BTLS_SUPPORTED)
4611 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
4613 if test "x$enable_btls" = "xno"; then
4614    enable_btls_lib=no
4617 AM_CONDITIONAL(BTLS, test x$enable_btls_lib = xyes)
4619 btls_android=no
4620 if test "x$enable_btls" = "xyes"; then
4621         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
4622         if test "x$CMAKE" = "xno"; then
4623                 AC_MSG_ERROR("cmake not found")
4624         fi
4626         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
4627         AC_SUBST(BTLS_ROOT)
4629         btls_arch=
4630         btls_cflags=
4631         BTLS_CMAKE_ARGS=
4633         case "$BTLS_PLATFORM" in
4634         i386)
4635                 btls_arch=i386
4636                 btls_cflags="-m32"
4637                 case $host_os in
4638                         darwin*)
4639                                 btls_cflags="$btls_cflags -arch i386"
4640                 esac
4641                 ;;
4642         x86_64)
4643                 btls_arch=x86_64
4644                 ;;
4645         arm)
4646                 btls_arch=arm
4647                 btls_cflags="-DOPENSSL_NO_ASM=1"
4648                 ;;
4649         armsoft)
4650                 btls_arch=arm
4651                 btls_cflags="-DOPENSSL_NO_ASM=1"
4652                 ;;
4653         aarch64)
4654                 btls_arch=aarch64
4655                 btls_cflags="-march=armv8-a+crypto"
4656                 ;;
4657         s390x)
4658                 btls_arch=s390x
4659                 ;;
4660         powerpc)
4661                 btls_arch=powerpc
4662                 case $host_os in
4663                         aix*|os400*)
4664                                 btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
4665                                 BTLS_CMAKE_ARGS="-DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
4666                 esac
4667                 ;;
4668         android-armv5)
4669                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
4670                 ;;
4671         android-armv6)
4672                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
4673                 ;;
4674         android-armv7)
4675                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=14"
4676                 ;;
4677         android-v8a)
4678                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=21"
4679                 ;;
4680         android-x86)
4681                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=14"
4682                 ;;
4683         android-x64)
4684                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=21"
4685                 ;;
4686         *)
4687                 AC_MSG_ERROR(Invalid BTLS platform)
4688         esac
4690         if test "x$platform_android" = "xyes"; then
4691                 btls_android=yes
4692                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
4693                 if test "x$with_btls_android_ndk" != "x"; then
4694                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
4695                 else
4696                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
4697                 fi
4698         fi
4700         if test "x$btls_arch" != "x"; then
4701                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
4702         fi
4704         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
4705         AC_SUBST(BTLS_ARCH)
4706         AC_SUBST(BTLS_CFLAGS)
4707         AC_SUBST(BTLS_PLATFORM)
4708         AC_SUBST(BTLS_CMAKE_ARGS)
4710         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
4711 else
4712         enable_btls=no
4715 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
4717 if test x$DISABLE_MCS_DOCS = xyes; then
4718    docs_dir=""
4719 else
4720    docs_dir=docs
4722 AC_SUBST(docs_dir)
4724 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
4725 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
4726 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
4728 libmono_ldflags="$libmono_ldflags $LIBS"
4730 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
4731 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
4732 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
4733 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
4734 AM_CONDITIONAL(X86, test x$TARGET = xX86)
4735 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
4736 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
4737 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
4738 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
4739 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
4740 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64)
4741 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
4742 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
4743 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
4744 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
4745 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
4746 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
4747 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
4749 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
4751 AC_SUBST(LIBC)
4752 AC_SUBST(INTL)
4753 AC_SUBST(SQLITE)
4754 AC_SUBST(SQLITE3)
4755 AC_SUBST(X11)
4756 AC_SUBST(GDKX11)
4757 AC_SUBST(GTKX11)
4758 AC_SUBST(XINERAMA)
4759 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
4760 AC_SUBST(arch_target)
4761 AC_SUBST(CFLAGS)
4762 AC_SUBST(CPPFLAGS)
4763 AC_SUBST(LDFLAGS)
4765 #This must always be defined when building the runtime
4766 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
4768 mono_build_root=`pwd`
4769 AC_SUBST(mono_build_root)
4771 mono_runtime=mono/mini/mono
4772 AC_SUBST(mono_runtime)
4774 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/Microsoft.Net.Compilers.2.7.0/tools/csc.exe
4776 if test $csc_compiler = mcs; then
4777   CSC=$mcs_topdir/class/lib/build/mcs.exe
4778 else
4779   CSC=$CSC_LOCATION
4782 AM_CONDITIONAL([CSC_IS_ROSLYN], [test x$csc_compiler != xmcs])
4784 mono_cfg_root=$mono_build_root/runtime
4785 if test x$host_win32 = xyes; then
4786   if test "x$cross_compiling" = "xno"; then
4787     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
4788     CSC=`cygpath -m -a $CSC`
4789     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
4790   else
4791     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
4792   fi
4793 else
4794   mono_cfg_dir=$mono_cfg_root/etc
4796 AC_SUBST(mono_cfg_dir)
4798 AC_SUBST(CSC)
4800 AC_CONFIG_FILES([po/mcs/Makefile.in])
4802 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
4803 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
4805 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
4806 [   depth=../../../..
4807     case $srcdir in
4808     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4809     .) reldir=$depth ;;
4810     *) reldir=$depth/$srcdir ;;
4811     esac
4812     $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
4813     cd runtime/etc/mono/1.0
4814     rm -f machine.config
4815     $LN_S $reldir/data/net_1_1/machine.config machine.config
4816     cd $depth
4817 ],[LN_S='$LN_S'])
4819 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
4820 [   depth=../../../..
4821     case $srcdir in
4822     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4823     .) reldir=$depth ;;
4824     *) reldir=$depth/$srcdir ;;
4825     esac
4826     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
4827     cd runtime/etc/mono/2.0
4828     rm -f machine.config
4829     $LN_S $reldir/data/net_2_0/machine.config machine.config
4830     cd $depth
4831 ],[LN_S='$LN_S'])
4833 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
4834 [   depth=../../../..
4835     case $srcdir in
4836     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4837     .) reldir=$depth ;;
4838     *) reldir=$depth/$srcdir ;;
4839     esac
4840     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
4841     cd runtime/etc/mono/2.0
4842     rm -f web.config
4843     $LN_S $reldir/data/net_2_0/web.config web.config
4844     cd $depth
4845 ],[LN_S='$LN_S'])
4847 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
4848 [   depth=../../..
4849     case $srcdir in
4850     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4851     .) reldir=$depth ;;
4852     *) reldir=$depth/$srcdir ;;
4853     esac
4854     $ac_aux_dir/install-sh -d runtime/etc/mono/
4855     cd runtime/etc/mono/
4856     rm -f browscap.ini
4857     $LN_S $reldir/data/browscap.ini browscap.ini
4858     cd $depth
4859 ],[LN_S='$LN_S'])
4861 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
4862 [   depth=../../../../..
4863     case $srcdir in
4864     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4865     .) reldir=$depth ;;
4866     *) reldir=$depth/$srcdir ;;
4867     esac
4868     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
4869     cd runtime/etc/mono/2.0/Browsers
4870     rm -f Compat.browser
4871     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
4872     cd $depth
4873 ],[LN_S='$LN_S'])
4875 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
4876 [   depth=../../../../..
4877     case $srcdir in
4878     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4879     .) reldir=$depth ;;
4880     *) reldir=$depth/$srcdir ;;
4881     esac
4882     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
4883     cd runtime/etc/mono/4.0/Browsers
4884     rm -f Compat.browser
4885     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
4886     cd $depth
4887 ],[LN_S='$LN_S'])
4889 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
4890 [   depth=../../../../..
4891     case $srcdir in
4892     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4893     .) reldir=$depth ;;
4894     *) reldir=$depth/$srcdir ;;
4895     esac
4896     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
4897     cd runtime/etc/mono/4.5/Browsers
4898     rm -f Compat.browser
4899     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
4900     cd $depth
4901 ],[LN_S='$LN_S'])
4903 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
4904 [   depth=../../../..
4905     case $srcdir in
4906     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4907     .) reldir=$depth ;;
4908     *) reldir=$depth/$srcdir ;;
4909     esac
4910     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
4911     cd runtime/etc/mono/4.0
4912     rm -f machine.config
4913     $LN_S $reldir/data/net_4_0/machine.config machine.config
4914     cd $depth
4915 ],[LN_S='$LN_S'])
4917 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
4918 [   depth=../../../..
4919     case $srcdir in
4920     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4921     .) reldir=$depth ;;
4922     *) reldir=$depth/$srcdir ;;
4923     esac
4924     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
4925     cd runtime/etc/mono/4.0
4926     rm -f web.config
4927     $LN_S $reldir/data/net_4_0/web.config web.config
4928     cd $depth
4929 ],[LN_S='$LN_S'])
4931 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
4932 [   depth=../../../..
4933     case $srcdir in
4934     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4935     .) reldir=$depth ;;
4936     *) reldir=$depth/$srcdir ;;
4937     esac
4938     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
4939     cd runtime/etc/mono/4.5
4940     rm -f machine.config
4941     $LN_S $reldir/data/net_4_5/machine.config machine.config
4942     cd $depth
4943 ],[LN_S='$LN_S'])
4945 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
4946 [   depth=../../../..
4947     case $srcdir in
4948     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4949     .) reldir=$depth ;;
4950     *) reldir=$depth/$srcdir ;;
4951     esac
4952     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
4953     cd runtime/etc/mono/4.5
4954     rm -f web.config
4955     $LN_S $reldir/data/net_4_5/web.config web.config
4956     cd $depth
4957 ],[LN_S='$LN_S'])
4959 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])
4960 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])
4962 AC_OUTPUT([
4963 Makefile
4964 mono-uninstalled.pc
4965 acceptance-tests/Makefile
4966 llvm/Makefile
4967 scripts/mono-find-provides
4968 scripts/mono-find-requires
4969 mk/Makefile
4970 mono/Makefile
4971 mono/btls/Makefile
4972 mono/utils/Makefile
4973 mono/utils/jemalloc/Makefile
4974 mono/metadata/Makefile
4975 mono/dis/Makefile
4976 mono/cil/Makefile
4977 mono/arch/Makefile
4978 mono/arch/x86/Makefile
4979 mono/arch/amd64/Makefile
4980 mono/arch/ppc/Makefile
4981 mono/arch/sparc/Makefile
4982 mono/arch/s390x/Makefile
4983 mono/arch/arm/Makefile
4984 mono/arch/arm64/Makefile
4985 mono/arch/mips/Makefile
4986 mono/sgen/Makefile
4987 mono/tests/Makefile
4988 mono/tests/tests-config
4989 mono/tests/gc-descriptors/Makefile
4990 mono/tests/testing_gac/Makefile
4991 mono/unit-tests/Makefile
4992 mono/benchmark/Makefile
4993 mono/mini/Makefile
4994 mono/profiler/Makefile
4995 mono/eglib/Makefile
4996 mono/eglib/eglib-config.h
4997 m4/Makefile
4998 ikvm-native/Makefile
4999 scripts/Makefile
5000 man/Makefile
5001 docs/Makefile
5002 data/Makefile
5003 data/net_2_0/Makefile
5004 data/net_4_0/Makefile
5005 data/net_4_5/Makefile
5006 data/net_2_0/Browsers/Makefile
5007 data/net_4_0/Browsers/Makefile
5008 data/net_4_5/Browsers/Makefile
5009 data/mint.pc
5010 data/mono-2.pc
5011 data/monosgen-2.pc
5012 data/mono.pc
5013 data/mono-cairo.pc
5014 data/mono-nunit.pc
5015 data/mono-options.pc
5016 data/mono-lineeditor.pc
5017 data/monodoc.pc
5018 data/dotnet.pc
5019 data/dotnet35.pc
5020 data/wcf.pc
5021 data/cecil.pc
5022 data/system.web.extensions_1.0.pc
5023 data/system.web.extensions.design_1.0.pc
5024 data/system.web.mvc.pc
5025 data/system.web.mvc2.pc
5026 data/system.web.mvc3.pc
5027 data/aspnetwebstack.pc
5028 data/reactive.pc
5029 samples/Makefile
5030 support/Makefile
5031 data/config
5032 tools/Makefile
5033 tools/locale-builder/Makefile
5034 tools/sgen/Makefile
5035 tools/monograph/Makefile
5036 tools/pedump/Makefile
5037 runtime/Makefile
5038 msvc/Makefile
5039 po/Makefile
5042 # Update all submodules recursively to ensure everything is checked out
5043 $srcdir/scripts/update_submodules.sh
5045 if test x$host_win32 = xyes; then
5046    # Get rid of 'cyg' prefixes in library names
5047    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
5048    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
5049    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
5050    # executable doesn't work...
5051    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
5054 if test x$host_darwin = xyes; then
5055    # This doesn't seem to be required and it slows down parallel builds
5056    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
5060   case $prefix in
5061   NONE) prefix=$ac_default_prefix ;;
5062   esac
5063   case $exec_prefix in
5064   NONE) exec_prefix='${prefix}' ;;
5065   esac
5067   #
5068   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
5069   # any existing config.make.  This allows people to share the same source tree
5070   # with different build directories, one native and one cross
5071   #
5072   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
5074     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
5076     echo "prefix=$prefix" > $mcs_topdir/build/config.make
5077     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
5078     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
5079     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
5080     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
5081     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
5082     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
5083     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
5084     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
5086     case $INSTALL in
5087     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
5088     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
5089     esac
5091     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
5093     export VERSION
5094     [myver=$($AWK 'BEGIN {
5095       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
5096       if(length(vsplit [1]) > 4) {
5097         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
5098       }
5099       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
5100     }')]
5102     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
5103     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
5105     if test x$host_darwin = xyes; then
5106       echo "BUILD_PLATFORM = darwin" >> $mcs_topdir/build/config.make
5107       echo "HOST_PLATFORM ?= darwin" >> $mcs_topdir/build/config.make
5108       echo "XTEST_PLATFORM ?= osx" >> $mcs_topdir/build/config.make
5109     elif test x$host_win32 = xyes; then
5110       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
5111       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
5112       echo "XTEST_PLATFORM ?= windows" >> $mcs_topdir/build/config.make
5113     else
5114       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
5115       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
5116       echo "XTEST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
5117     fi
5119     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
5120       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
5121     fi
5123         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
5124            enable_system_aot=yes
5125         fi
5127     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
5128       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
5129     fi
5131     if test x$DISABLE_MCS_DOCS = xyes; then
5132       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
5133     fi
5135     if test x$has_extension_module != xno; then
5136         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
5137     fi
5138     
5139     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
5140     
5141     if test "x$test_bcl_opt" = "xyes"; then    
5142       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
5143     fi
5145     echo "CSC_LOCATION = $CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
5147     if test $csc_compiler = mcs; then
5148       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
5149     fi
5151     if test "x$AOT_BUILD_FLAGS" != "x" ; then
5152       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
5153       echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
5154       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
5155     fi
5157     if test "x$AOT_MODE" != "x" ; then
5158       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
5159     fi
5161     if test "x$enable_btls" = "xyes"; then
5162       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
5163     fi
5165   fi
5169 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
5171 btls_platform_string=
5172 if test x$enable_btls = xyes; then
5173         if test x$btls_android = xyes; then
5174                 btls_platform_string=" (android:$BTLS_PLATFORM)"
5175         else
5176                 btls_platform_string=" ($BTLS_PLATFORM)"
5177         fi
5180 echo "
5181         mcs source:    $mcsdir
5182         C# Compiler:   $csc_compiler
5184    Engine:
5185         Host:          $host
5186         Target:        $target
5187         GC:            $gc_msg 
5188         TLS:           $with_tls
5189         SIGALTSTACK:   $with_sigaltstack
5190         Engine:        $jit_status
5191         BigArrays:     $enable_big_arrays
5192         DTrace:        $enable_dtrace
5193         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm)
5194         Spectre:       $spectre_mitigation_status
5196    Libraries:
5197         .NET 4.x:        $with_profile4_x
5198         Xamarin.Android: $with_monodroid
5199         Xamarin.iOS:     $with_monotouch
5200         Xamarin.WatchOS: $with_monotouch_watch
5201         Xamarin.TVOS:    $with_monotouch_tv
5202         Xamarin.Mac:     $with_xammac
5203         Windows AOT:     $with_winaot
5204         Orbis:           $with_orbis
5205         Unreal:          $with_unreal
5206         WebAssembly:     $with_wasm
5207         Test profiles:   AOT Full ($with_testing_aot_full), AOT Hybrid ($with_testing_aot_hybrid)
5208         JNI support:     $jdk_headers_found
5209         libgdiplus:      $libgdiplus_msg
5210         zlib:            $zlib_msg
5211         BTLS:            $enable_btls$btls_platform_string
5212         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
5213         $disabled
5215 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
5216    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)