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