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