[interp] Add missing exception checkpoints (#6917)
[mono-project.git] / configure.ac
blob300a128223416ef20ad59d0e5deb8f124830929a
1 # Process this file with autoconf to produce a configure script.
2 #AC_PREREQ([2.62])
4 AC_INIT(mono, [5.13.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=1
44 MONO_CORLIB_VERSION=`printf "1%02d%02d%02d%03d" $MONO_VERSION_MAJOR $MONO_VERSION_MINOR 0 $MONO_CORLIB_COUNTER`
46 AC_DEFINE_UNQUOTED(MONO_CORLIB_VERSION,$MONO_CORLIB_VERSION,[Version of the corlib-runtime interface])
47 AC_SUBST(MONO_CORLIB_VERSION)
49 case $host_os in
50 *cygwin* )
51                  echo "Run configure using ./configure --host=i686-pc-mingw32"
52                  exit 1
53 esac
55 # In case of cygwin, override LN_S, irrespective of what it determines.
56 # The build uses cygwin, but the actual runtime doesn't.
57 case $host_os in
58 *cygwin* ) LN_S='cp -p';;
59 esac
62 # libgc defaults
64 libgc_configure_args=
66 # These variables are the CPPFLAGS/CFLAGS passed to libgc's configure
67 # libgc should inherit the original CFLAGS/CPPFLAGS passed to configure, i.e. -O0
68 CPPFLAGS_FOR_LIBGC=$CPPFLAGS
69 CFLAGS_FOR_LIBGC=$CFLAGS
70 CPPFLAGS_FOR_BTLS=$CPPFLAGS
71 CFLAGS_FOR_BTLS=$CFLAGS
73 # libgc uses some deprecated APIs
74 CFLAGS_FOR_LIBGC="$CFLAGS -Wno-deprecated-declarations"
77 # These are the flags that need to be stored in the mono.pc file for 
78 # compiling code that will embed Mono
80 libmono_cflags=""
81 libmono_ldflags=""
82 AC_SUBST(libmono_cflags)
83 AC_SUBST(libmono_ldflags)
85 # Variable to have relocatable .pc files (lib, or lib64)
86 # realpath isn't always available, and requires that all but the tip of the provided
87 # path exists. Fall back to the old behaviour, but realpath allows depth >1
88 # e.g. Debian puts Mono in /usr/bin and libs in /usr/lib/x86_64-linux-gnu/ which is
89 # too deep for the old method to work
90 reloc_libdir=`realpath --relative-to=${prefix} ${libdir} 2> /dev/null || basename ${libdir}`
91 AC_SUBST(reloc_libdir)
93 # Set to yes if Unix sockets cannot be created in an anonymous namespace
94 need_link_unlink=no
96 #Set to extra linker flags to be passed to the runtime binaries (mono /mono-sgen)
97 extra_runtime_ldflags=""
100 # Hack for WASM
101 # Current autotools (v1.15) doesn't have a triplet we can use for wasm so the kludge we do is to
102 # work around it by using a feature flag instead
103 AC_ARG_ENABLE(wasm,[  --enable-wasm    Hack to set the current runtime to target wasm], enable_wasm=$enableval)
105 # Thread configuration inspired by sleepycat's db
106 AC_MSG_CHECKING([host platform characteristics])
108 libgc_threads=no
109 has_dtrace=no
110 parallel_mark=yes
111 ikvm_native=yes
113 host_win32=no
114 target_win32=no
115 platform_android=no
116 platform_tizen=no
117 platform_ios=no
118 host_darwin=no
121 if test "x$enable_wasm" = "xyes"; then
122 CFLAGS="$CFLAGS -D_REENTRANT -D_GNU_SOURCE -DNO_UNALIGNED_ACCESS -s WASM=1"
123 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DUSE_MMAP -D_GNU_SOURCE -DNO_UNALIGNED_ACCESS -s WASM=1"
124 libdl="-ldl"
125 libgc_threads=pthreads
126 platform_wasm=yes
128 else
130 case "$host" in
131         *-mingw*|*-*-cygwin*)
132                 AC_DEFINE(DISABLE_PORTABILITY,1,[Disable the io-portability layer])
133                 AC_DEFINE(HOST_NO_SYMLINKS,1,[This platform does not support symlinks])
134                 host_win32=yes
135                 mono_cv_clang=no
136                 if test "x$cross_compiling" = "xno"; then
137                         if test "x$host" = "x$build" -a "x$host" = "x$target"; then
138                                 target_win32=yes
139                         fi
140                 else
141                         if test "x$host" = "x$target"; then
142                                 target_win32=yes
143                         fi
144                 fi
145                 HOST_CC="gcc"
146                 # Windows Vista or later is required
147                 CPPFLAGS="$CPPFLAGS -DWINVER=0x0600 -D_WIN32_WINNT=0x0600 -D_WIN32_IE=0x0501 -D_UNICODE -DUNICODE -DWIN32_THREADS -DFD_SETSIZE=1024"
148                 LDFLAGS="$LDFLAGS -lmswsock -lws2_32 -lole32 -loleaut32 -lpsapi -lversion -ladvapi32 -lwinmm -lkernel32 -liphlpapi"
149                 libmono_cflags="-mms-bitfields -mwindows"
150                 libmono_ldflags="-mms-bitfields -mwindows"
151                 libdl=
152                 libgc_threads=win32
153                 with_sigaltstack=no
154                 with_tls=pthread
155                 with_sgen_default_concurrent=yes
156                 LN_S=cp
157                 # This forces libgc to use the DllMain based thread registration code on win32
158                 libgc_configure_args="$libgc_configure_args --enable-win32-dllmain=yes"
159                 ;;
160         *-*-*netbsd*)
161                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DGC_NETBSD_THREADS -D_GNU_SOURCE"
162                 libmono_cflags="-D_REENTRANT"
163                 LDFLAGS="$LDFLAGS -pthread"
164                 CPPFLAGS="$CPPFLAGS -DHOST_BSD"
165                 libmono_ldflags="-pthread"
166                 need_link_unlink=yes
167                 libdl="-ldl"
168                 libgc_threads=pthreads
169                 with_sigaltstack=no
170                 use_sigposix=yes
171                 with_sgen_default_concurrent=yes
172                 ;;
173         *-*-kfreebsd*-gnu)
174                 CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP -DUSE_MUNMAP -DTHREAD_LOCAL_ALLOC -pthread"
175                 libmono_cflags="-D_REENTRANT -DTHREAD_LOCAL_ALLOC -pthread"
176                 libmono_ldflags="-lpthread -pthread"
177                 libdl="-ldl"
178                 libgc_threads=pthreads
179                 need_link_unlink=yes
180                 with_sigaltstack=no
181                 use_sigposix=yes
182                 with_sgen_default_concurrent=yes
183                 ;;
184         *-*-*freebsd*)
185                 if test "x$PTHREAD_CFLAGS" = "x"; then
186                         CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS"
187                         libmono_cflags=
188                 else
189                         CPPFLAGS="$CPPFLAGS $PTHREAD_CFLAGS -DGC_FREEBSD_THREADS"
190                         libmono_cflags="$PTHREAD_CFLAGS"
191                 fi
192                 if test "x$PTHREAD_LIBS" = "x"; then
193                         LDFLAGS="$LDFLAGS -pthread -L/usr/local/lib"
194                         libmono_ldflags="-pthread"
195                 else
196                         LDFLAGS="$LDFLAGS $PTHREAD_LIBS -L/usr/local/lib"
197                         libmono_ldflags="$PTHREAD_LIBS"
198                 fi
199                 CPPFLAGS="$CPPFLAGS -DHOST_BSD"
200                 need_link_unlink=yes
201                 AC_DEFINE(PTHREAD_POINTER_ID, 1, [pthread is a pointer])
202                 libdl=
203                 libgc_threads=pthreads
204                 use_sigposix=yes
205                 has_dtrace=yes
206                 with_sgen_default_concurrent=yes
207                 ;;
208         *-*-*openbsd*)
209                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_OPENBSD_THREADS -DHOST_BSD -D_REENTRANT -DUSE_MMAP"
210                 LDFLAGS="${LDFLAGS} -Wl,-zwxneeded"
211                 if test "x$disable_munmap" != "xyes"; then
212                 CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
213                 fi
214                 libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
215                 LDFLAGS="$LDFLAGS -pthread"
216                 need_link_unlink=yes
217                 AC_DEFINE(PTHREAD_POINTER_ID)
218                 libdl=
219                 libgc_threads=pthreads
220                 with_tls=pthread
221                 with_sigaltstack=no
222                 use_sigposix=yes
223                 with_sgen_default_concurrent=yes
224                 ;;
225         *-*-linux-android*)
226                 platform_android=yes
227                 AC_DEFINE(HOST_ANDROID,1,[Targeting the Android platform])
228                 AC_DEFINE(TARGET_ANDROID,1,[Targeting the Android platform])
230                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
231                 if test "x$disable_munmap" != "xyes"; then
232                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
233                 fi
234                 libmono_cflags="-D_REENTRANT"
235                 libdl="-ldl"
236                 libgc_threads=pthreads
237                 use_sigposix=yes
239                 with_tls=pthread
240                 with_sigaltstack=no
241                 with_static_mono=no
243                 # Android doesn't support boehm, as it's missing <link.h>
244                 support_boehm=no
245                 with_gc=sgen
247                 # isinf(3) requires -lm; see isinf check below
248                 LDFLAGS="$LDFLAGS -lm"
250                 # Bionic's <pthread.h> sets PTHREAD_STACK_MIN=2*PAGE_SIZE; doesn't define
251                 # PAGE_SIZE; breaks mono/io-layer/collection.c
252                 # Bionic doesn't provide S_IWRITE; breaks io-layer/io.c
253                 CFLAGS="$CFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
254                 CXXFLAGS="$CXXFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
256                 # to bypass the underscore linker check, can't work when cross-compiling
257                 mono_cv_uscore=yes
258                 mono_cv_clang=no
259                 ;;
260         *-*-linux*)
261                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
262                 if test "x$disable_munmap" != "xyes"; then
263                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
264                 fi
265                 libmono_cflags="-D_REENTRANT"
266                 libdl="-ldl"
267                 libgc_threads=pthreads
268                 use_sigposix=yes
269                 if test "x$cross_compiling" != "xno"; then
270                         # to bypass the underscore linker check, not
271                         # available during cross-compilation
272                         mono_cv_uscore=no
273                 fi
274                 case "$host" in
275                 *-tizen-linux-*)
276                         platform_tizen=yes
277                         ;;
278                 esac
279                 case "$host" in
280                 aarch64-*)
281                         support_boehm=no
282                         with_gc=sgen
283                         ;;
284                 powerpc*-*-linux*)
285                         # https://bugzilla.novell.com/show_bug.cgi?id=504411
286                         disable_munmap=yes
287                         ;;
288                 esac
289                 with_sgen_default_concurrent=yes
290                 ;;
291         *-*-nacl*)
292                 echo "nacl no longer supported."
293                 exit 1
294                 ;;
295         *-*-hpux*)
296                 CPPFLAGS="$CPPFLAGS -DGC_HPUX_THREADS -D_HPUX_SOURCE -D_XOPEN_SOURCE_EXTENDED -D_REENTRANT"
297                 # +ESdbgasm only valid on bundled cc on RISC
298                 # silently ignored for ia64
299                 if test $GCC != "yes"; then
300                         CFLAGS="$CFLAGS +ESdbgasm"
301                         # Arrange for run-time dereferencing of null
302                         # pointers to produce a SIGSEGV signal.
303                         LDFLAGS="$LDFLAGS -z"
304                 fi
305                 CFLAGS="$CFLAGS +ESdbgasm"
306                 LDFLAGS="$LDFLAGS -z"
307                 libmono_cflags="-D_REENTRANT"
308                 libmono_ldflags="-lpthread"
309                 libgc_threads=pthreads
310                 need_link_unlink=yes
311                 use_sigposix=yes
312                 ;;
313         *-*-solaris*)
314                 CPPFLAGS="$CPPFLAGS -DGC_SOLARIS_THREADS -DGC_SOLARIS_PTHREADS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -DUSE_MMAP -DUSE_MUNMAP -DHOST_SOLARIS"
315                 need_link_unlink=yes
316                 libmono_cflags="-D_REENTRANT"
317                 libgc_threads=pthreads
318                 has_dtrace=yes
319                 use_sigposix=yes
320                 enable_solaris_tar_check=yes
321                 ;;
322         *-*-darwin*)
323                 parallel_mark="Disabled_Currently_Hangs_On_MacOSX"
324                 host_darwin=yes
325                 target_mach=yes
326                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_MACOSX_THREADS -DUSE_MMAP -DUSE_MUNMAP"
327                 libmono_cflags="-D_THREAD_SAFE"
328                 need_link_unlink=yes
329                 AC_DEFINE(PTHREAD_POINTER_ID)
330                 AC_DEFINE(USE_MACH_SEMA, 1, [...])
331                 libdl=
332                 libgc_threads=pthreads
333                 has_dtrace=yes
334                 if test "x$cross_compiling" = "xyes"; then
335                         has_broken_apple_cpp=yes
336                 fi
337                 dnl Snow Leopard is horribly broken -- it reports itself as i386-apple-darwin*, but
338                 dnl its gcc defaults to 64-bit mode.  They have also deprecated the usage of ucontext
339                 dnl we need to set some flags to build our 32-bit binaries on 10.6 properly
340                 case "$host" in
341                         dnl Snow Leopard and newer config.guess reports as this
342                         i*86-*-darwin*)
343                                 BROKEN_DARWIN_FLAGS="-arch i386 -D_XOPEN_SOURCE"
344                                 BROKEN_DARWIN_CPPFLAGS="-D_XOPEN_SOURCE"
345                                 CPPFLAGS="$CPPFLAGS $BROKEN_DARWIN_CPPFLAGS"
346                                 CFLAGS="$CFLAGS $BROKEN_DARWIN_FLAGS"
347                                 CXXFLAGS="$CXXFLAGS $BROKEN_DARWIN_FLAGS"
348                                 CCASFLAGS="$CCASFLAGS $BROKEN_DARWIN_FLAGS"
349                                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC $BROKEN_DARWIN_CPPFLAGS"
350                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC $BROKEN_DARWIN_FLAGS"
351                                 with_sgen_default_concurrent=yes
352                                 ;;
353                         x*64-*-darwin*)
354                                 with_sgen_default_concurrent=yes
355                                 ;;
356                         arm*-darwin*)
357                                 platform_ios=yes
358                                 has_dtrace=no
359                                 ;;
360                         aarch64*-darwin*)
361                                 platform_ios=yes
362                                 ;;
363                 esac
364                 ;;
365         *-*-haiku*)
366                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -D_THREAD_SAFE"
367                 libmono_cflags="-D_REENTRANT -D_THREAD_SAFE"
368                 libdl=
369                 LIBS="$LIBS -lnetwork -ltextencoding"
370                 need_link_unlink=yes
371                 AC_DEFINE(PTHREAD_POINTER_ID)
372                 dnl Haiku does not support static TLS with __thread
373                 with_tls=pthread
374                 libgc_threads=pthreads
375                 use_sigposix=yes
376                 ;;
377         *-*-aix*|*-*-os400*)
378                 dnl Set up a 64-bit build
379                 CPPFLAGS="$CPPFLAGS -maix64 -DGC_AIX_THREADS -D_ALL_SOURCE -D_LARGE_FILES -D_REENTRANT"
380                 LDFLAGS="-maix64"
381                 libmono_cflags="-D_REENTRANT"
382                 dnl Would you believe GNU nm doesn't know how to process AIX libraries?
383                 dnl Hardcode IBM binutils in case GNU ones end up on our path. Also
384                 dnl specifiy 64-bit mode for tools.
385                 AR="/usr/bin/ar -X64"
386                 NM="/usr/bin/nm -X64"
387                 dnl SGen is the future (changes to Boehm support code would be
388                 dnl required if you wish to re-enable Boehm)
389                 support_boehm=no
390                 with_gc=sgen
391                 need_link_unlink=yes
392                 use_sigposix=yes
393                 dnl the valloc call to alloc the guard page bombs out, even with extending the data area
394                 with_sigaltstack=no
395                 dnl use pthread TLS, __thread has issues with the compiler flags we use
396                 with_tls=pthread
397                 dnl ppc Linux is the same? test further
398                 disable_munmap=yes
399                 ;;
400         *)
401                 AC_MSG_WARN([*** Please add $host to configure.ac checks!])
402                 libdl="-ldl"
403                 ;;
404 esac
406 # WASM hack
409 AC_MSG_RESULT(ok)
411 if test x$need_link_unlink = xyes; then
412    AC_DEFINE(NEED_LINK_UNLINK, 1, [Define if Unix sockets cannot be created in an anonymous namespace])
415 if test x$host_win32 = xyes; then
416    AC_DEFINE(HOST_WIN32, 1, [Host Platform is Win32])
419 if test x$target_win32 = xyes; then
420    AC_DEFINE(TARGET_WIN32, 1, [Target Platform is Win32])
423 if test x$host_darwin = xyes; then
424    AC_DEFINE(HOST_DARWIN, 1, [Host Platform is Darwin])
427 # Defined for all targets/platforms using classic Windows API support.
428 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
429 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
431 AC_SUBST(extra_runtime_ldflags)
432 AM_CONDITIONAL(HOST_WIN32, test x$host_win32 = xyes)
433 AM_CONDITIONAL(TARGET_WIN32, test x$target_win32 = xyes)
434 AM_CONDITIONAL(HOST_LINUX, echo x$target_os | grep -q linux)
435 AM_CONDITIONAL(HOST_DARWIN, test x$host_darwin = xyes)
436 AM_CONDITIONAL(HOST_SIGPOSIX, test x$use_sigposix = xyes)
437 AM_CONDITIONAL(HOST_ANDROID, test x$platform_android = xyes)
438 AM_CONDITIONAL(HOST_TIZEN, test x$platform_tizen = xyes)
439 AM_CONDITIONAL(HOST_IOS, test x$platform_ios = xyes)
440 AM_CONDITIONAL(HOST_WASM, test x$platform_wasm = xyes)
442 if test -z "$HOST_DARWIN_TRUE"; then :
443 PLATFORM_AOT_SUFFIX=.dylib
446 if test -z "$HOST_LINUX_TRUE"; then :
447 PLATFORM_AOT_SUFFIX=.so
450 if test -z "$HOST_WIN32_TRUE"; then :
451 PLATFORM_AOT_SUFFIX=.dll
454 AC_SUBST(PLATFORM_AOT_SUFFIX)
456 ## PLATFORM_AOT_SUFFIX not so simple for windows :-)
458 AC_CHECK_TOOL(CC, gcc, gcc)
459 AC_PROG_CC
460 AC_CHECK_TOOL(CXX, g++, g++)
461 AC_PROG_CXX
462 AM_PROG_AS
463 AC_PROG_INSTALL
464 AC_PROG_AWK
465 AM_PROG_CC_C_O
466 dnl We should use AM_PROG_AS, but it's not available on automake/aclocal 1.4
467 : ${CCAS='$(CC)'}
468 # Set ASFLAGS if not already set.
469 : ${CCASFLAGS='$(CFLAGS)'}
470 AC_SUBST(CCAS)
471 AC_SUBST(CCASFLAGS)
473 # AC_PROG_CXX helpfully sets CXX to g++ even if no c++ compiler is found so check
474 # GXX instead. See http://lists.gnu.org/archive/html/bug-autoconf/2002-04/msg00056.html
475 if test "x$CXX" = "xg++"; then
476         if test "x$GXX" != "xyes"; then
477                 # automake/libtool is so broken, it requires g++ even if the c++ sources
478                 # are inside automake conditionals
479                 AC_MSG_ERROR([You need to install g++])
480         fi
483 dnl may require a specific autoconf version
484 dnl AC_PROG_CC_FOR_BUILD
485 dnl CC_FOR_BUILD not automatically detected
486 CC_FOR_BUILD=$CC
487 CFLAGS_FOR_BUILD=$CFLAGS
488 BUILD_EXEEXT=
489 if test "x$cross_compiling" = "xyes"; then
490         CC_FOR_BUILD=cc
491         CFLAGS_FOR_BUILD=
492         BUILD_EXEEXT=""
494 AC_SUBST(CC_FOR_BUILD)
495 AC_SUBST(CFLAGS_FOR_BUILD)
496 AC_SUBST(HOST_CC)
497 AC_SUBST(BUILD_EXEEXT)
499 AM_CONDITIONAL(CROSS_COMPILING, [test x$cross_compiling = xyes])
500 AM_CONDITIONAL(USE_BATCH_FILES, [test x$host_win32 = xyes -a x$cross_compiling = xyes])
502 # Set STDC_HEADERS
503 AC_HEADER_STDC
504 AC_LIBTOOL_WIN32_DLL
505 # This causes monodis to not link correctly
506 #AC_DISABLE_FAST_INSTALL
508 #lookup makedev() header
509 AC_HEADER_MAJOR
511 AM_PROG_LIBTOOL
512 # Use dolt (http://dolt.freedesktop.org/) instead of libtool for building.
513 DOLT
515 export_ldflags=`(./libtool --config; echo eval echo \\$export_dynamic_flag_spec) | sh`
516 AC_SUBST(export_ldflags)
518 # Test whenever ld supports -version-script
519 AC_PROG_LD
520 AC_PROG_LD_GNU
522 AM_ICONV()
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="$CFLAGS -g $WARN"
742 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -g"
743 CPPFLAGS="$CPPFLAGS -g $WARN"
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 GLIB_LIBS='$(top_builddir)/mono/eglib/libeglib.la -lm'
840   
841 AC_SUBST(GLIB_CFLAGS)
842 AC_SUBST(GLIB_LIBS)
844 # Enable support for fast thread-local storage
845 # Some systems have broken support, so we allow to disable it.
846 AC_ARG_WITH(tls, [  --with-tls=__thread,pthread    select Thread Local Storage implementation (defaults to __thread)],[],[with_tls=__thread])
848 # Enable support for using sigaltstack for SIGSEGV and stack overflow handling
849 # This does not work on some platforms (bug #55253)
850 AC_ARG_WITH(sigaltstack, [  --with-sigaltstack=yes,no      enable/disable support for sigaltstack (defaults to yes)],[],[with_sigaltstack=yes])
852 AC_ARG_WITH(static_mono, [  --with-static_mono=yes,no      link mono statically to libmono (faster) (defaults to yes)],[],[with_static_mono=yes])
853 AC_ARG_WITH(shared_mono, [  --with-shared_mono=yes,no      build a shared libmono library (defaults to yes)],[],[with_shared_mono=yes])
854 # Same as --with-shared_mono=no
855 AC_ARG_ENABLE(libraries, [  --disable-libraries disable the build of libmono], enable_libraries=$enableval, enable_libraries=yes)
857 if test "x$enable_static" = "xno"; then
858    with_static_mono=no
861 if test "x$enable_shared" = "xno"; then
862    with_shared_mono=no
865 if test "x$enable_libraries" = "xno"; then
866    with_shared_mono=no
869 AM_CONDITIONAL(DISABLE_LIBRARIES, test x$enable_libraries = xno)
871 if test "x$host_win32" = "xyes"; then
872    # Boehm GC requires the runtime to be in its own dll
873    with_static_mono=no
876 AM_CONDITIONAL(STATIC_MONO, test x$with_static_mono != xno)
877 AM_CONDITIONAL(SHARED_MONO, test x$with_shared_mono != xno)
878 AC_ARG_ENABLE(mcs-build, [  --disable-mcs-build disable the build of the mcs directory], try_mcs_build=$enableval, enable_mcs_build=yes)
879 AC_ARG_ENABLE(support-build, [  --disable-support-build disable the build of the support directory], try_support_build=$enableval, enable_support_build=yes)
881 AC_ARG_WITH(xen_opt,   [  --with-xen_opt=yes,no          Enable Xen-specific behaviour (defaults to yes)],[],[with_xen_opt=yes])
882 if test "x$with_xen_opt" = "xyes" -a "x$mono_cv_clang" = "xno"; then
883         AC_DEFINE(MONO_XEN_OPT, 1, [Xen-specific behaviour])
884         ORIG_CFLAGS=$CFLAGS
885         CFLAGS="$CFLAGS -mno-tls-direct-seg-refs"
886         AC_MSG_CHECKING(for -mno-tls-direct-seg-refs option to gcc)
887         AC_TRY_COMPILE([], [
888         ], [
889            AC_MSG_RESULT(yes)
890            # Pass it to libgc as well
891            CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -mno-tls-direct-seg-refs"
892         ], [
893            AC_MSG_RESULT(no)
894            CFLAGS=$ORIG_CFLAGS
895         ])
898 AC_ARG_ENABLE(small-config, [  --enable-small-config Enable tweaks to reduce requirements (and capabilities)], enable_small_config=$enableval, enable_small_config=no)
900 if test x$enable_small_config = xyes; then
901         AC_DEFINE(MONO_SMALL_CONFIG,1,[Reduce runtime requirements (and capabilities)])
902         CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DSMALL_CONFIG"
905 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)
907 DISABLED_FEATURES=none
908 csc_compiler=default
909 endian=unknown
910 AC_C_BIGENDIAN([endian=big],[endian=little],[endian=unknown])
911 AC_MSG_CHECKING([CSharp compiler to use])
912 AC_ARG_WITH(csc, [  --with-csc=mcs,roslyn,default      Configures the CSharp compiler to use],[
913    if test x$withval = xmcs; then
914        csc_compiler=mcs
915    elif test x$withval = xroslyn; then
916        csc_compiler=roslyn
917    elif test x$withval = xdefault; then
918        :
919    else
920        AC_MSG_ERROR([You must supply one of "mcs", "roslyn" or "default" to the --with-csc option])
921    fi
922 ],[csc_compiler=default])
924 if test $csc_compiler = default; then
925    if test $endian = big; then
926       csc_compiler=mcs
927    elif test $endian = little; then
928       case "$host" in
929         powerpc*) csc_compiler=mcs ;;
930         *) csc_compiler=roslyn ;;
931       esac
932    else
933       csc_compiler=mcs
934    fi
936 AC_MSG_RESULT($csc_compiler)
938 AC_ARG_WITH(jemalloc,             [  --with-jemalloc=yes,no               If jemalloc is enabled (defaults to no)],                                     [], [with_jemalloc=no])
939 AC_ARG_WITH(jemalloc-always,      [  --with-jemalloc_always=yes,no        If jemalloc is enabled and always used (defaults to yes)],                    [], [with_jemalloc_always=no])
940 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])
943 if test x$target_win32 = xyes; then
944 with_jemalloc=no
945 with_jemalloc_assert=no
946 with_jemalloc_always=no
949 AM_CONDITIONAL(MONO_JEMALLOC_ASSERT, [test "x$with_jemalloc_assert" = "xyes"])
950 if test "x$with_jemalloc_assert" = "xyes"; then
951 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ASSERT"
952 AC_DEFINE(MONO_JEMALLOC_ASSERT, 1, [Make jemalloc assert for mono])
953 AC_SUBST(MONO_JEMALLOC_ASSERT, 1)
956 AM_CONDITIONAL(MONO_JEMALLOC_DEFAULT, [test "x$with_jemalloc_always" = "xyes"])
957 if test "x$with_jemalloc_always" = "xyes"; then
958 with_jemalloc=yes
959 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_DEFAULT"
960 AC_DEFINE(MONO_JEMALLOC_DEFAULT, 1, [Make jemalloc default for mono])
961 AC_SUBST(MONO_JEMALLOC_DEFAULT, 1)
964 AM_CONDITIONAL(MONO_JEMALLOC_ENABLED, [test "x$with_jemalloc" = "xyes"])
965 if test "x$with_jemalloc" = "xyes"; then
966 JEMALLOC_LDFLAGS="-L`pwd`/mono/utils/jemalloc/jemalloc/lib -ljemalloc_pic"
967 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ENABLED -I `pwd`/mono/utils/jemalloc/jemalloc/include"
968 JEMALLOC_AUTOCONF_FLAGS=" --build=$target --host=$host"
970 if test "x$target_mach" = "xyes"; then
971         JEMALLOC_CPPFLAGS=" -stdlib=libc++ "
974 AC_DEFINE(MONO_JEMALLOC_ENABLED, 1, [Enable jemalloc usage for mono])
975 AC_SUBST(MONO_JEMALLOC_ENABLED, 1)
977 AC_SUBST(JEMALLOC_CFLAGS)
978 AC_SUBST(JEMALLOC_CPPFLAGS)
979 AC_SUBST(JEMALLOC_LDFLAGS)
980 AC_SUBST(JEMALLOC_AUTOCONF_FLAGS)
984 # Set the build profiles and options before things which use them
987 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])
988 AC_ARG_WITH(monodroid,           [  --with-monodroid=yes,no             If you want to build the MonoDroid assemblies (defaults to no)],            [], [with_monodroid=default])
989 AC_ARG_WITH(monotouch,           [  --with-monotouch=yes,no             If you want to build the Xamarin.iOS assemblies (defaults to no)],          [], [with_monotouch=default])
990 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])
991 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])
992 AC_ARG_WITH(bitcode,             [  --with-bitcode=yes,no               If bitcode is enabled (defaults to no)],                                    [], [with_bitcode=default])
993 AC_ARG_WITH(xammac,              [  --with-xammac=yes,no                If you want to build the Xamarin.Mac assemblies (defaults to no)],          [], [with_xammac=default])
994 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])
995 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])
996 AC_ARG_WITH(winaot,              [  --with-winaot=yes,no                If you want to build the Windows friendly AOT assemblies (defaults to no)], [], [with_winaot=default])
997 AC_ARG_WITH(orbis,               [  --with-orbis=yes,no                 If you want to build the Orbis assemblies (defaults to no)], [], [with_orbis=default])
998 AC_ARG_WITH(unreal,              [  --with-unreal=yes,no                If you want to build the Unreal assemblies (defaults to no)], [], [with_unreal=default])
999 AC_ARG_WITH(wasm,                [  --with-wasm=yes,no                  If you want to build the WebAssembly (defaults to no)], [], [with_wasm=default])
1002 AC_ARG_WITH(runtime_preset, [  --with-runtime_preset=net_4_x,all,aot,hybridaot,fullaot,bitcode,unreal   Which default profile to build (defaults to net_4_x)],  [], [with_runtime_preset=net_4_x])
1003 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])
1004 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])
1005 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])
1008 dnl Spectre compiler mitigation flag checks
1010 if test "x$with_spectre_mitigation" = "xyes"; then
1011    AC_MSG_NOTICE([Compiler Spectre mitigation support checks])
1012    SPECTRE_CFLAGS=
1013    SPECTRE_INDIRECT_BRANCH_KIND=
1014    case "x$with_spectre_indirect_branch_choice" in
1015        xkeep) SPECTRE_INDIRECT_BRANCH_KIND=keep ;;
1016        xthunk) SPECTRE_INDIRECT_BRANCH_KIND=thunk ;;
1017        xinline) SPECTRE_INDIRECT_BRANCH_KIND=thunk-inline ;;
1018        xextern) SPECTRE_INDIRECT_BRANCH_KIND=thunk-extern ;;
1019        *) AC_MSG_ERROR([Invalid indirect jump thunk kind ($with_spectre_indirect_branch_choice)]) ;;
1020    esac
1022    SPECTRE_FUNCTION_RETURN_KIND=""
1023    case "x$with_spectre_function_return_choice" in
1024        xkeep) SPECTRE_FUNCTION_RETURN_KIND=keep ;;
1025        xthunk) SPECTRE_FUNCTION_RETURN_KIND=thunk ;;
1026        xinline) SPECTRE_FUNCTION_RETURN_KIND=thunk-inline ;;
1027        xextern) SPECTRE_FUNCTION_RETURN_KIND=thunk-extern ;;
1028        *) AC_MSG_ERROR([Invalid function return thunk kind ($with_spectre_function_return_choice)]) ;;
1029    esac
1031    AX_CHECK_COMPILE_FLAG(
1032         [ -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND ],
1033         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND" ]
1034    )
1036    AX_CHECK_COMPILE_FLAG(
1037         [ -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND ],
1038         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND" ]
1039    )
1041    if test "x$SPECTRE_CFLAGS" != "x" ; then
1042         CFLAGS="$CFLAGS $SPECTRE_CFLAGS"
1043         CXXFLAGS="$CXXFLAGS $SPECTRE_CFLAGS"
1044         spectre_mitigation_status="mitigation enabled"
1045    fi
1046 else
1047         spectre_mitigation_status="no mitigation"
1051 dnl Profile defaults
1053 TEST_PROFILE=default
1054 enable_llvm_default=no
1056 with_profile4_x_default=no
1057 with_monodroid_default=no
1058 with_monotouch_default=no
1059 with_monotouch_watch_default=no
1060 with_monotouch_tv_default=no
1061 with_xammac_default=no
1062 with_testing_aot_hybrid_default=no
1063 with_testing_aot_full_default=no
1064 with_winaot_default=no
1065 with_orbis_default=no
1066 with_unreal_default=no
1067 with_wasm_default=no
1069 with_bitcode_default=no
1070 with_cooperative_gc_default=no
1072 INVARIANT_AOT_OPTIONS=nimt-trampolines=2000,ntrampolines=9000,nrgctx-fetch-trampolines=256,ngsharedvt-trampolines=4000
1074 AOT_BUILD_ATTRS=$INVARIANT_AOT_OPTIONS
1076 if test x$cross_compiling = xyes -o x$enable_mcs_build = xno; then
1077    DISABLE_MCS_DOCS_default=yes
1078 elif test x$with_runtime_preset = xnet_4_x; then
1079    with_profile4_x_default=yes
1080 elif test x$with_runtime_preset = xall; then
1081    with_profile4_x_default=yes
1082    with_monodroid_default=yes
1083    with_monotouch_default=yes
1084    with_monotouch_watch_default=yes
1085    with_monotouch_tv_default=yes
1086    with_xammac_default=yes
1087    with_winaot_default=yes
1088    with_orbis_default=yes
1089    with_unreal_default=yes
1090    with_wasm_default=yes
1091 elif test x$with_runtime_preset = xfullaot; then
1092    DISABLE_MCS_DOCS_default=yes
1093    with_testing_aot_full_default=yes
1094    TEST_PROFILE=testing_aot_full
1096    mono_feature_disable_com='yes'
1097    mono_feature_disable_remoting='yes'
1098    mono_feature_disable_reflection_emit_save='yes'
1099    mono_feature_disable_reflection_emit='yes'
1100    mono_feature_disable_appdomains='yes'
1102    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1103    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1104    AOT_MODE="full"
1105 elif test x$with_runtime_preset = xbitcode; then
1106    DISABLE_MCS_DOCS_default=yes
1107    with_testing_aot_full_default=yes
1108    with_bitcode_default=yes
1109    with_cooperative_gc_default=yes
1110    TEST_PROFILE=testing_aot_full
1111    enable_llvm_default=yes
1113    mono_feature_disable_com='yes'
1114    mono_feature_disable_remoting='yes'
1115    mono_feature_disable_reflection_emit_save='yes'
1116    mono_feature_disable_reflection_emit='yes'
1117    mono_feature_disable_appdomains='yes'
1119    AOT_BUILD_FLAGS="--runtime=mobile --aot=llvmonly,$INVARIANT_AOT_OPTIONS"
1120    AOT_RUN_FLAGS="--runtime=mobile --llvmonly"
1121    AOT_MODE="llvmonly"
1122 elif test x$with_runtime_preset = xhybridaot; then
1123    DISABLE_MCS_DOCS_default=yes
1124    with_testing_aot_hybrid_default=yes
1125    TEST_PROFILE=testing_aot_hybrid 
1127    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1128    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1129 elif test x$with_runtime_preset = xaot; then
1130    with_profile4_x_default=yes
1132    AOT_BUILD_FLAGS="--aot=$INVARIANT_AOT_OPTIONS"
1133    AOT_RUN_FLAGS=""
1135    DISABLE_MCS_DOCS_default=yes
1136 elif test x$with_runtime_preset = xwinaot; then
1137    DISABLE_MCS_DOCS_default=yes
1138    with_winaot_default=yes
1139    TEST_PROFILE=winaot
1141    mono_feature_disable_com='yes'
1142    mono_feature_disable_remoting='yes'
1143    mono_feature_disable_reflection_emit_save='yes'
1144    mono_feature_disable_reflection_emit='yes'
1145    mono_feature_disable_appdomains='yes'
1147    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1148    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1149    AOT_MODE="llvmonly"
1150 elif test x$with_runtime_preset = xorbis; then
1151    DISABLE_MCS_DOCS_default=yes
1152    with_orbis_default=yes
1153    TEST_PROFILE=orbis
1155    mono_feature_disable_com='yes'
1156    mono_feature_disable_remoting='yes'
1157    mono_feature_disable_reflection_emit_save='yes'
1158    mono_feature_disable_reflection_emit='yes'
1159    mono_feature_disable_appdomains='yes'
1161    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1162    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1163    AOT_MODE="full"
1164 elif test x$with_runtime_preset = xunreal; then
1165    DISABLE_MCS_DOCS_default=yes
1166    with_unreal_default=yes
1167    TEST_PROFILE=unreal
1169    mono_feature_disable_com='yes'
1170    mono_feature_disable_remoting='yes'
1171    mono_feature_disable_appdomains='no'
1173    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1174    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1175 elif test x$with_runtime_preset = xwasm; then
1176    DISABLE_MCS_DOCS_default=yes
1177    with_wasm_default=yes
1178    TEST_PROFILE=wasm
1180    mono_feature_disable_com='yes'
1181    mono_feature_disable_remoting='yes'
1182    mono_feature_disable_reflection_emit_save='yes'
1183    mono_feature_disable_reflection_emit='yes'
1184    mono_feature_disable_appdomains='yes'
1186    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1187    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1188 else
1189    with_profile4_x_default=yes
1192 if test "x$AOT_BUILD_FLAGS" != "x"; then :
1193    AC_SUBST(AOT_BUILD_FLAGS)
1194    AC_SUBST(AOT_RUN_FLAGS)
1195    # For llvmonlycheck + fullaotcheck
1196    AC_SUBST(INVARIANT_AOT_OPTIONS)
1199 AC_SUBST(TEST_PROFILE)
1201 if test "x$with_profile4_x" = "xdefault"; then
1202    with_profile4_x=$with_profile4_x_default
1204 if test "x$with_monodroid" = "xdefault"; then
1205    with_monodroid=$with_monodroid_default
1207 if test "x$with_monotouch" = "xdefault"; then
1208    with_monotouch=$with_monotouch_default
1210 if test "x$with_monotouch_watch" = "xdefault"; then
1211    with_monotouch_watch=$with_monotouch_watch_default
1213 if test "x$with_monotouch_tv" = "xdefault"; then
1214    with_monotouch_tv=$with_monotouch_tv_default
1216 if test "x$with_bitcode" = "xdefault"; then
1217    with_bitcode=$with_bitcode_default
1219 if test "x$with_xammac" = "xdefault"; then
1220    with_xammac=$with_xammac_default
1222 if test "x$with_testing_aot_hybrid" = "xdefault"; then
1223    with_testing_aot_hybrid=$with_testing_aot_hybrid_default
1225 if test "x$with_testing_aot_full" = "xdefault"; then
1226    with_testing_aot_full=$with_testing_aot_full_default
1228 if test "x$with_winaot" = "xdefault"; then
1229    with_winaot=$with_winaot_default
1231 if test "x$with_orbis" = "xdefault"; then
1232    with_orbis=$with_orbis_default
1234 if test "x$with_unreal" = "xdefault"; then
1235    with_unreal=$with_unreal_default
1237 if test "x$with_wasm" = "xdefault"; then
1238    with_wasm=$with_wasm_default
1242 AM_CONDITIONAL(INSTALL_4_x, [test "x$with_profile4_x" = "xyes"])
1243 AM_CONDITIONAL(INSTALL_MONODROID, [test "x$with_monodroid" != "xno"])
1244 AM_CONDITIONAL(INSTALL_MONOTOUCH, [test "x$with_monotouch" != "xno"])
1245 AM_CONDITIONAL(INSTALL_MONOTOUCH_WATCH, [test "x$with_monotouch_watch" != "xno"])
1246 AM_CONDITIONAL(INSTALL_MONOTOUCH_TV, [test "x$with_monotouch_tv" != "xno"])
1247 AM_CONDITIONAL(BITCODE, test "x$with_bitcode" = "xyes")
1248 AM_CONDITIONAL(INSTALL_XAMMAC, [test "x$with_xammac" != "xno"])
1249 AM_CONDITIONAL(INSTALL_TESTING_AOT_HYBRID, [test "x$with_testing_aot_hybrid" != "xno"])
1250 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL, [test "x$with_testing_aot_full" != "xno"])
1251 AM_CONDITIONAL(INSTALL_WINAOT, [test "x$with_winaot" != "xno"])
1252 AM_CONDITIONAL(INSTALL_ORBIS, [test "x$with_orbis" != "xno"])
1253 AM_CONDITIONAL(INSTALL_UNREAL, [test "x$with_unreal" != "xno"])
1254 AM_CONDITIONAL(INSTALL_WASM, [test "x$with_wasm" != "xno"])
1255 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"])
1256 AM_CONDITIONAL(HYBRID_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_hybrid"] || [test "x$TEST_PROFILE" = "xunreal"])
1258 default_profile=net_4_x
1259 if test -z "$INSTALL_MONODROID_TRUE"; then :
1260    default_profile=monodroid
1262 if test -z "$INSTALL_MONOTOUCH_TRUE"; then :
1263    default_profile=monotouch
1265 if test -z "$INSTALL_XAMMAC_TRUE"; then :
1266    default_profile=xammac
1268 if test -z "$INSTALL_TESTING_AOT_HYBRID_TRUE"; then :
1269    default_profile=testing_aot_hybrid
1271 if test -z "$INSTALL_TESTING_AOT_FULL_TRUE"; then :
1272    default_profile=testing_aot_full
1274 if test -z "$INSTALL_WINAOT_TRUE"; then :
1275    default_profile=winaot
1277 if test -z "$INSTALL_ORBIS_TRUE"; then :
1278    default_profile=orbis
1280 if test -z "$INSTALL_UNREAL_TRUE"; then :
1281    default_profile=unreal
1283 if test -z "$INSTALL_WASM_TRUE"; then :
1284    default_profile=wasm
1286 if test -z "$INSTALL_4_x_TRUE"; then :
1287    default_profile=net_4_x
1289 DEFAULT_PROFILE=$default_profile
1290 AC_SUBST(DEFAULT_PROFILE)
1293 # End build profile configuration
1296 if test x$USE_NLS = xprofile_default; then
1298         AC_MSG_CHECKING([NLS used])
1300         # We make the default value for USE_NLS
1301         # "no" on OSX because it isn't available on most
1302         # default OSX installs. The most common configurations will
1303         # all disable it, so this saves us typing.
1304         if test x$host_darwin = xyes; then
1305                 USE_NLS=no;
1306         else
1307                 USE_NLS=yes;
1308         fi
1310         AC_SUBST([USE_NLS])
1311         AC_MSG_RESULT([$USE_NLS])
1314 AC_ARG_ENABLE(minimal, [  --enable-minimal=LIST      drop support for LIST subsystems.
1315      LIST is a comma-separated list from: aot, profiler, decimal, pinvoke, debug, appdomains, verifier, 
1316      reflection_emit, reflection_emit_save, large_code, logging, com, ssa, generics, attach, jit, interpreter, simd, soft_debug, perfcounters, normalization, desktop_loader, shared_perfcounters, remoting,
1317          security, lldb, mdb, sgen_remset, sgen_marksweep_par, sgen_marksweep_fixed, sgen_marksweep_fixed_par, sgen_copying.],
1319         for feature in `echo "$enable_minimal" | sed -e "s/,/ /g"`; do
1320                 eval "mono_feature_disable_$feature='yes'"
1321         done
1322         DISABLED_FEATURES=$enable_minimal
1323         disabled="Disabled:      $enable_minimal"
1324 ],[])
1326 AC_DEFINE_UNQUOTED(DISABLED_FEATURES, "$DISABLED_FEATURES", [String of disabled features])
1328 if test "x$mono_feature_disable_aot" = "xyes"; then
1329         AC_DEFINE(DISABLE_AOT, 1, [Disable AOT Compiler])
1330         enable_system_aot=no
1331         AC_MSG_NOTICE([Disabled AOT compiler])
1334 if test "x$mono_feature_disable_profiler" = "xyes"; then
1335         AC_DEFINE(DISABLE_PROFILER, 1, [Disable default profiler support])
1336         AC_MSG_NOTICE([Disabled support for the profiler])
1338 AM_CONDITIONAL(DISABLE_PROFILER, test x$mono_feature_disable_profiler = xyes)
1340 if test "x$mono_feature_disable_decimal" = "xyes"; then
1341         AC_DEFINE(DISABLE_DECIMAL, 1, [Disable System.Decimal support])
1342         AC_MSG_NOTICE([Disabled support for decimal])
1345 if test "x$mono_feature_disable_pinvoke" = "xyes"; then
1346         AC_DEFINE(DISABLE_PINVOKE, 1, [Disable P/Invoke support])
1347         AC_MSG_NOTICE([Disabled support for P/Invoke])
1350 if test "x$mono_feature_disable_debug" = "xyes"; then
1351         AC_DEFINE(DISABLE_DEBUG, 1, [Disable runtime debugging support])
1352         AC_MSG_NOTICE([Disabled support for runtime debugging])
1355 if test "x$mono_feature_disable_reflection_emit" = "xyes"; then
1356         AC_DEFINE(DISABLE_REFLECTION_EMIT, 1, [Disable reflection emit support])
1357         mono_feature_disable_reflection_emit_save=yes
1358         AC_MSG_NOTICE([Disabled support for Reflection.Emit])
1361 if test "x$mono_feature_disable_reflection_emit_save" = "xyes"; then
1362         AC_DEFINE(DISABLE_REFLECTION_EMIT_SAVE, 1, [Disable assembly saving support in reflection emit])
1363         AC_MSG_NOTICE([Disabled support for Reflection.Emit.Save])
1366 if test "x$mono_feature_disable_large_code" = "xyes"; then
1367         AC_DEFINE(DISABLE_LARGE_CODE, 1, [Disable support for huge assemblies])
1368         AC_MSG_NOTICE([Disabled support for large assemblies])
1371 if test "x$mono_feature_disable_logging" = "xyes"; then
1372         AC_DEFINE(DISABLE_LOGGING, 1, [Disable support debug logging])
1373         AC_MSG_NOTICE([Disabled support for logging])
1376 if test "x$mono_feature_disable_com" = "xyes"; then
1377         AC_DEFINE(DISABLE_COM, 1, [Disable COM support])
1378         AC_MSG_NOTICE([Disabled COM support])
1381 if test "x$mono_feature_disable_ssa" = "xyes"; then
1382         AC_DEFINE(DISABLE_SSA, 1, [Disable advanced SSA JIT optimizations])
1383         AC_MSG_NOTICE([Disabled SSA JIT optimizations])
1386 if test "x$mono_feature_disable_generics" = "xyes"; then
1387         AC_DEFINE(DISABLE_GENERICS, 1, [Disable generics support])
1388         AC_MSG_NOTICE([Disabled Generics Support])
1391 if test "x$mono_feature_disable_shadowcopy" = "xyes"; then
1392         AC_DEFINE(DISABLE_SHADOW_COPY, 1, [Disable Shadow Copy for AppDomains])
1393         AC_MSG_NOTICE([Disabled Shadow copy for AppDomains])
1396 if test "x$mono_feature_disable_portability" = "xyes"; then
1397         AC_DEFINE(DISABLE_PORTABILITY, 1, [Disables the IO portability layer])
1398         AC_MSG_NOTICE([Disabled IO Portability layer])
1401 if test "x$mono_feature_disable_attach" = "xyes"; then
1402         AC_DEFINE(DISABLE_ATTACH, 1, [Disable agent attach support])
1403         AC_MSG_NOTICE([Disabled agent attach])
1406 if test "x$mono_feature_disable_verifier" = "xyes"; then
1407         AC_DEFINE(DISABLE_VERIFIER, 1, [Disables the verifier])
1408         AC_MSG_NOTICE([Disabled the metadata and IL verifiers])
1411 if test "x$mono_feature_disable_jit" = "xyes"; then
1412         AC_DEFINE(DISABLE_JIT, 1, [Disable the JIT, only full-aot mode or interpreter will be supported by the runtime.])
1413         AC_MSG_NOTICE([Disabled the JIT engine, only full AOT or interpreter will be supported])
1416 AM_CONDITIONAL(DISABLE_JIT, test x$mono_feature_disable_jit = xyes)
1418 if test "x$mono_feature_disable_interpreter" = "xyes"; then
1419         AC_DEFINE(DISABLE_INTERPRETER, 1, [Disable the interpreter.])
1420         AC_MSG_NOTICE([Disabled the interpreter])
1423 AM_CONDITIONAL(DISABLE_INTERPRETER, test x$mono_feature_disable_interpreter = xyes)
1425 if test "x$mono_feature_disable_simd" = "xyes"; then
1426         AC_DEFINE(DISABLE_SIMD, 1, [Disable SIMD intrinsics related optimizations.])
1427         AC_MSG_NOTICE([Disabled SIMD support])
1430 if test "x$mono_feature_disable_soft_debug" = "xyes"; then
1431         AC_DEFINE(DISABLE_SOFT_DEBUG, 1, [Disable Soft Debugger Agent.])
1432         AC_MSG_NOTICE([Disabled Soft Debugger.])
1435 if test "x$mono_feature_disable_perfcounters" = "xyes"; then
1436         AC_DEFINE(DISABLE_PERFCOUNTERS, 1, [Disable Performance Counters.])
1437         AC_MSG_NOTICE([Disabled Performance Counters.])
1439 if test "x$mono_feature_disable_normalization" = "xyes"; then
1440         AC_DEFINE(DISABLE_NORMALIZATION, 1, [Disable String normalization support.])
1441         AC_MSG_NOTICE([Disabled String normalization support.])
1444 #TODO: remove assembly_remapping feature name once everyone is using desktop_loader
1445 if test "x$mono_feature_disable_assembly_remapping" = "xyes" || test "x$mono_feature_disable_desktop_loader" = "xyes"; then
1446         AC_DEFINE(DISABLE_DESKTOP_LOADER, 1, [Disable desktop assembly loader semantics.])
1447         AC_MSG_NOTICE([Disabled desktop assembly loader semantics.])
1450 if test "x$mono_feature_disable_shared_perfcounters" = "xyes"; then
1451         AC_DEFINE(DISABLE_SHARED_PERFCOUNTERS, 1, [Disable shared perfcounters.])
1452         AC_MSG_NOTICE([Disabled Shared perfcounters.])
1455 if test "x$mono_feature_disable_appdomains" = "xyes"; then
1456         AC_DEFINE(DISABLE_APPDOMAINS, 1, [Disable support for multiple appdomains.])
1457         AC_MSG_NOTICE([Disabled support for multiple appdomains.])
1460 if test "x$mono_feature_disable_remoting" = "xyes"; then
1461         AC_DEFINE(DISABLE_REMOTING, 1, [Disable remoting support (This disables type proxies and make com non-functional)])
1462         AC_MSG_NOTICE([Disabled remoting])
1465 if test "x$mono_feature_disable_security" = "xyes"; then
1466         AC_DEFINE(DISABLE_SECURITY, 1, [Disable CAS/CoreCLR security])
1467         AC_MSG_NOTICE([Disabled CAS/CoreCLR security manager (used e.g. for Moonlight)])
1470 if test "x$mono_feature_disable_lldb" = "xyes"; then
1471         AC_DEFINE(DISABLE_LLDB, 1, [Disable support code for the LLDB plugin.])
1472         AC_MSG_NOTICE([Disabled LLDB plugin support code.])
1475 if test "x$mono_feature_disable_mdb" = "xyes"; then
1476         AC_DEFINE(DISABLE_MDB, 1, [Disable support for .mdb symbol files.])
1477         AC_MSG_NOTICE([Disabled support for .mdb symbol files.])
1480 if test "x$mono_feature_disable_sgen_remset" = "xyes"; then
1481         AC_DEFINE(DISABLE_SGEN_REMSET, 1, [Disable wbarrier=remset support in SGEN.])
1482         AC_MSG_NOTICE([Disabled wbarrier=remset support in SGEN.])
1485 if test "x$mono_feature_disable_sgen_marksweep_par" = "xyes"; then
1486         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_PAR, 1, [Disable major=marksweep-par support in SGEN.])
1487         AC_MSG_NOTICE([Disabled major=marksweep-par support in SGEN.])
1490 if test "x$mono_feature_disable_sgen_marksweep_fixed" = "xyes"; then
1491         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_FIXED, 1, [Disable major=marksweep-fixed support in SGEN.])
1492         AC_MSG_NOTICE([Disabled major=marksweep-fixed support in SGEN.])
1495 if test "x$mono_feature_disable_sgen_marksweep_fixed_par" = "xyes"; then
1496         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_FIXED_PAR, 1, [Disable major=marksweep-fixed-par support in SGEN.])
1497         AC_MSG_NOTICE([Disabled major=marksweep-fixed-par support in SGEN.])
1500 if test "x$mono_feature_disable_sgen_copying" = "xyes"; then
1501         AC_DEFINE(DISABLE_SGEN_MAJOR_COPYING, 1, [Disable major=copying support in SGEN.])
1502         AC_MSG_NOTICE([Disabled major=copying support in SGEN.])
1505 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
1506 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
1508 has_extension_module=no
1509 AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
1511         for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
1512                 if test x$extension = xdefault ; then
1513                         has_extension_module=yes;
1514                 fi
1515         done
1516         if test x$enable_extension_module = xyes; then
1517                 has_extension_module=yes;
1518         fi
1519 ], [])
1521 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
1523 if test x$has_extension_module != xno ; then
1524         AC_DEFINE([ENABLE_EXTENSION_MODULE], 1, [Extension module enabled])
1525         AC_MSG_NOTICE([Enabling mono extension module.])
1528 # Deprecated
1529 AC_ARG_ENABLE(gsharedvt, [  --enable-gsharedvt Enable generic valuetype sharing (Deprecated)], enable_gsharedvt=$enableval, enable_gsharedvt=no)
1531 AC_MSG_CHECKING(for visibility __attribute__)
1532 AC_COMPILE_IFELSE([
1533         AC_LANG_SOURCE([[
1534                 void __attribute__ ((visibility ("hidden"))) doit (void) {}
1535                 int main () { doit (); return 0; }
1536         ]])
1537 ], [
1538    have_visibility_hidden=yes
1539    AC_MSG_RESULT(yes)
1540 ], [
1541    have_visibility_hidden=no
1542    AC_MSG_RESULT(no)
1546 dnl Boehm GC configuration
1549 AC_ARG_WITH(libgc,   [  --with-libgc=included,none  Controls the Boehm GC config, default=included],[libgc=$with_libgc],[libgc=included])
1551 AC_ARG_ENABLE(boehm, [  --disable-boehm            Disable the Boehm GC.], support_boehm=$enableval,support_boehm=${support_boehm:-yes})
1552 AM_CONDITIONAL(SUPPORT_BOEHM, test x$support_boehm = xyes)
1554 if test "x$support_boehm" = "xyes"; then
1556         AC_ARG_ENABLE(parallel-mark, [  --enable-parallel-mark     Enables Boehm GC Parallel Marking], enable_parallel_mark=$enableval, enable_parallel_mark=$parallel_mark)
1557         if test x$enable_parallel_mark = xyes; then
1558                 libgc_configure_args="$libgc_configure_args --enable-parallel-mark"
1559         fi
1561         gc_msg=""
1562         LIBGC_CPPFLAGS=
1563         LIBGC_LIBS=
1564         LIBGC_STATIC_LIBS=
1565         libgc_dir=
1566         case "x$libgc" in
1567                 xincluded)
1568                         if test "x$support_boehm" = "xyes"; then
1569                                 libgc_dir=libgc
1570                         fi
1572                         LIBGC_CPPFLAGS='-I$(top_srcdir)/libgc/include'
1573                         LIBGC_LIBS='$(top_builddir)/libgc/libmonogc.la'
1574                         LIBGC_STATIC_LIBS='$(top_builddir)/libgc/libmonogc-static.la'
1576                         BOEHM_DEFINES="-DHAVE_BOEHM_GC"
1578                         if test x$target_win32 = xyes; then
1579                                 BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
1580                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
1581                         fi
1583                         gc_msg="Included Boehm GC with typed GC"
1584                         if test x$enable_parallel_mark = xyes; then
1585                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
1586                                 gc_msg="$gc_msg and parallel mark"
1587                         else
1588                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC)", [GC description])
1589                         fi
1590                         ;;
1592                 xboehm|xbohem|xyes)
1593                         AC_MSG_WARN("External Boehm is no longer supported")
1594                         ;;
1596                 xsgen)
1597                         AC_MSG_WARN("Use --with-sgen instead, --with-libgc= controls Boehm configuration")
1598                         ;;
1600                 xnone)
1601                         AC_MSG_WARN("Compiling mono without GC.")
1602                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description])
1603                         AC_DEFINE(HAVE_NULL_GC,1,[No GC support.])
1604                         gc_msg="none"
1605                         ;;
1606                 *)
1607                         AC_MSG_ERROR([Invalid argument $libgc to --with-libgc.])
1608                         ;;
1609         esac
1611         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])
1612         if test "x$large_heap" = "xyes"; then
1613            CPPFLAGS="$CPPFLAGS -DLARGE_CONFIG"
1614         fi
1616         AC_SUBST(LIBGC_CPPFLAGS)
1617         AC_SUBST(LIBGC_LIBS)
1618         AC_SUBST(LIBGC_STATIC_LIBS)
1619         AC_SUBST(libgc_dir)
1620         AC_SUBST(BOEHM_DEFINES)
1623 AM_CONDITIONAL(SUPPORT_NULLGC, test "x$libgc" = "xnone")
1626 dnl End of Boehm GC Configuration
1629 dnl *************************************
1630 dnl *** Checks for zero length arrays ***
1631 dnl *************************************
1632 AC_MSG_CHECKING(whether $CC supports zero length arrays)
1633 AC_TRY_COMPILE([
1634         struct s {
1635                 int  length;
1636                 char data [0];
1637         };
1638 ], [], [
1639         AC_MSG_RESULT(yes)
1640         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 0, [Length of zero length arrays])
1641 ], [
1642         AC_MSG_RESULT(no)
1643         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
1646 dnl ***********************************
1647 dnl *** Checks for signals
1648 dnl ***********************************
1649 AC_CHECK_HEADERS(signal.h)
1650 AC_CHECK_FUNCS(sigaction)
1651 AC_CHECK_FUNCS(kill)
1652 AC_CHECK_FUNCS(signal)
1654 # signal() is declared inline in Android headers
1655 # so we need to workaround it by overriding the check.
1656 if test x$platform_android = xyes; then
1657         AC_DEFINE(HAVE_SIGNAL,1)
1660 if test x$host_win32 = xno; then
1662         dnl hires monotonic clock support
1663         AC_SEARCH_LIBS(clock_gettime, rt)
1664         AC_CHECK_FUNCS(clock_nanosleep)
1666         dnl dynamic loader support
1667         AC_CHECK_FUNC(dlopen, DL_LIB="",
1668                 AC_CHECK_LIB(dl, dlopen, DL_LIB="-ldl", dl_support=no)
1669         )
1670         if test x$dl_support = xno; then
1671                 AC_MSG_WARN([No dynamic loading support available])
1672         else
1673                 LIBS="$LIBS $DL_LIB"
1674                 AC_DEFINE(HAVE_DL_LOADER,1,[dlopen-based dynamic loader available])
1675                 dnl from glib's configure.ac
1676                 AC_CACHE_CHECK([for preceeding underscore in symbols],
1677                         mono_cv_uscore,[
1678                         AC_TRY_RUN([#include <dlfcn.h>
1679                         int mono_underscore_test (void) { return 42; }
1680                         int main() {
1681                           void *f1 = (void*)0, *f2 = (void*)0, *handle;
1682                           handle = dlopen ((void*)0, 0);
1683                           if (handle) {
1684                             f1 = dlsym (handle, "mono_underscore_test");
1685                             f2 = dlsym (handle, "_mono_underscore_test");
1686                           } return (!f2 || f1);
1687                         }],
1688                                 [mono_cv_uscore=yes],
1689                                 [mono_cv_uscore=no],
1690                         [])
1691                 ])
1692                 if test "x$mono_cv_uscore" = "xyes"; then
1693                         MONO_DL_NEED_USCORE=1
1694                 else
1695                         MONO_DL_NEED_USCORE=0
1696                 fi
1697                 AC_SUBST(MONO_DL_NEED_USCORE)
1698                 AC_CHECK_FUNC(dlerror)
1699         fi
1701         dnl ******************************************************************
1702         dnl *** Checks for the IKVM JNI interface library                  ***
1703         dnl ******************************************************************
1704         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])
1706         ikvm_native_dir=
1707         if test x$with_ikvm_native = xyes; then
1708                 ikvm_native_dir=ikvm-native
1709                 jdk_headers_found="IKVM Native"
1710         fi
1712         AC_SUBST(ikvm_native_dir)
1714         AC_CHECK_HEADERS(execinfo.h)
1716         AC_CHECK_HEADERS(sys/auxv.h sys/resource.h)
1718         AC_CHECK_FUNCS(getgrgid_r)
1719         AC_CHECK_FUNCS(getgrnam_r)
1720         AC_CHECK_FUNCS(getresuid)
1721         AC_CHECK_FUNCS(setresuid)
1722         AC_CHECK_FUNCS(kqueue)
1723         AC_CHECK_FUNCS(backtrace_symbols)
1724         AC_CHECK_FUNCS(mkstemp)
1725         AC_CHECK_FUNCS(mmap)
1726         AC_CHECK_FUNCS(madvise)
1727         AC_CHECK_FUNCS(getrusage)
1728         AC_CHECK_FUNCS(getpriority)
1729         AC_CHECK_FUNCS(setpriority)
1730         AC_CHECK_FUNCS(dl_iterate_phdr)
1731         AC_CHECK_FUNCS(dladdr)
1732         AC_CHECK_FUNCS(sysconf)
1733         AC_CHECK_FUNCS(getrlimit)
1734         AC_CHECK_FUNCS(prctl)
1736         AC_CHECK_FUNCS(sched_getaffinity)
1737         AC_CHECK_FUNCS(sched_setaffinity)
1738         AC_CHECK_FUNCS(sched_getcpu)
1740         if test x$platform_android != xyes; then
1741                 AC_CHECK_FUNCS(getpwnam_r)
1742                 AC_CHECK_FUNCS(getpwuid_r)
1743         fi
1745         AC_FUNC_STRERROR_R()
1747         dnl ****************************************************************
1748         dnl *** Check for sched_setaffinity from glibc versions before   ***
1749         dnl *** 2.3.4. The older versions of the function only take 2    ***
1750         dnl *** parameters, not 3.                                       ***
1751         dnl ***                                                          ***
1752         dnl *** Because the interface change was not made in a minor     ***
1753         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
1754         dnl *** won't always indicate the interface sched_affinity has.  ***
1755         dnl ****************************************************************
1756         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
1757         AC_TRY_COMPILE([#include <sched.h>], [
1758             int mask = 1; 
1759             sched_setaffinity(0, &mask);
1760         ], [
1761                 # Yes, we have it...
1762                 AC_MSG_RESULT(yes)
1763                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
1764         ], [
1765                 # We have the new, three-parameter version
1766                 AC_MSG_RESULT(no)
1767         ])
1768         AC_TRY_COMPILE([#include <sched.h>], [
1769              CPU_COUNT((void *) 0);
1770         ], [
1771                 AC_MSG_RESULT(yes)
1772                 AC_DEFINE(GLIBC_HAS_CPU_COUNT, 1, [GLIBC has CPU_COUNT macro in sched.h])
1773         ], [
1774                 # We have the new, three-parameter version
1775                 AC_MSG_RESULT(no)
1776         ])
1778         dnl ******************************************************************
1779         dnl *** Check for large file support                               ***
1780         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
1781         dnl ******************************************************************
1782         
1783         # Check that off_t can represent 2**63 - 1 correctly, working around
1784         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
1785         # CPPFLAGS and sets $large_offt to yes if the test succeeds
1786         large_offt=no
1787         AC_DEFUN([LARGE_FILES], [
1788                 large_CPPFLAGS=$CPPFLAGS
1789                 CPPFLAGS="$CPPFLAGS $1"
1790                 AC_TRY_COMPILE([
1791                         #include <sys/types.h>
1792                         #include <limits.h>
1793                 ], [
1794                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
1795                         #define COMPILE_TIME_ASSERT(pred) \
1796                                 switch(0){case 0:case pred:;}
1797                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
1798                 ], [
1799                         AC_MSG_RESULT(ok)
1800                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
1801                         large_CPPFLAGS="$large_CPPFLAGS $1"
1802                         large_offt=yes
1803                 ], [
1804                         AC_MSG_RESULT(no)
1805                 ])
1806                 CPPFLAGS=$large_CPPFLAGS
1807         ])
1809         AC_MSG_CHECKING(if off_t is 64 bits wide)
1810         LARGE_FILES("")
1811         if test $large_offt = no; then
1812                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
1813                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
1814         fi
1815         if test $large_offt = no; then
1816                 AC_MSG_WARN([No 64 bit file size support available])
1817         fi
1818         
1819         dnl *****************************
1820         dnl *** Checks for libsocket  ***
1821         dnl *****************************
1822         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
1824         case "$host" in
1825                 *-*-*freebsd*)
1826                         dnl *****************************
1827                         dnl *** Checks for libinotify ***
1828                         dnl *****************************
1829                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
1830         esac
1832         dnl *******************************
1833         dnl *** Checks for MSG_NOSIGNAL ***
1834         dnl *******************************
1835         AC_MSG_CHECKING(for MSG_NOSIGNAL)
1836         AC_TRY_COMPILE([#include <sys/socket.h>], [
1837                 int f = MSG_NOSIGNAL;
1838         ], [
1839                 # Yes, we have it...
1840                 AC_MSG_RESULT(yes)
1841                 AC_DEFINE(HAVE_MSG_NOSIGNAL, 1, [Have MSG_NOSIGNAL])
1842         ], [
1843                 # We'll have to use signals
1844                 AC_MSG_RESULT(no)
1845         ])
1847         dnl *****************************
1848         dnl *** Checks for IPPROTO_IP ***
1849         dnl *****************************
1850         AC_MSG_CHECKING(for IPPROTO_IP)
1851         AC_TRY_COMPILE([#include <netinet/in.h>], [
1852                 int level = IPPROTO_IP;
1853         ], [
1854                 # Yes, we have it...
1855                 AC_MSG_RESULT(yes)
1856                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
1857         ], [
1858                 # We'll have to use getprotobyname
1859                 AC_MSG_RESULT(no)
1860         ])
1862         dnl *******************************
1863         dnl *** Checks for IPPROTO_IPV6 ***
1864         dnl *******************************
1865         AC_MSG_CHECKING(for IPPROTO_IPV6)
1866         AC_TRY_COMPILE([#include <netinet/in.h>], [
1867                 int level = IPPROTO_IPV6;
1868         ], [
1869                 # Yes, we have it...
1870                 AC_MSG_RESULT(yes)
1871                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
1872         ], [
1873                 # We'll have to use getprotobyname
1874                 AC_MSG_RESULT(no)
1875         ])
1877         dnl ******************************
1878         dnl *** Checks for IPPROTO_TCP ***
1879         dnl ******************************
1880         AC_MSG_CHECKING(for IPPROTO_TCP)
1881         AC_TRY_COMPILE([#include <netinet/in.h>], [
1882                 int level = IPPROTO_TCP;
1883         ], [
1884                 # Yes, we have it...
1885                 AC_MSG_RESULT(yes)
1886                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
1887         ], [
1888                 # We'll have to use getprotobyname
1889                 AC_MSG_RESULT(no)
1890         ])
1892         dnl *****************************
1893         dnl *** Checks for SOL_IP     ***
1894         dnl *****************************
1895         AC_MSG_CHECKING(for SOL_IP)
1896         AC_TRY_COMPILE([#include <netdb.h>], [
1897                 int level = SOL_IP;
1898         ], [
1899                 # Yes, we have it...
1900                 AC_MSG_RESULT(yes)
1901                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
1902         ], [
1903                 # We'll have to use getprotobyname
1904                 AC_MSG_RESULT(no)
1905         ])
1907         dnl *****************************
1908         dnl *** Checks for SOL_IPV6     ***
1909         dnl *****************************
1910         AC_MSG_CHECKING(for SOL_IPV6)
1911         AC_TRY_COMPILE([#include <netdb.h>], [
1912                 int level = SOL_IPV6;
1913         ], [
1914                 # Yes, we have it...
1915                 AC_MSG_RESULT(yes)
1916                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
1917         ], [
1918                 # We'll have to use getprotobyname
1919                 AC_MSG_RESULT(no)
1920         ])
1922         dnl *****************************
1923         dnl *** Checks for SOL_TCP    ***
1924         dnl *****************************
1925         AC_MSG_CHECKING(for SOL_TCP)
1926         AC_TRY_COMPILE([#include <netdb.h>], [
1927                 int level = SOL_TCP;
1928         ], [
1929                 # Yes, we have it...
1930                 AC_MSG_RESULT(yes)
1931                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
1932         ], [
1933                 # We'll have to use getprotobyname
1934                 AC_MSG_RESULT(no)
1935         ])
1937         dnl *****************************
1938         dnl *** Checks for IP_PKTINFO ***
1939         dnl *****************************
1940         AC_MSG_CHECKING(for IP_PKTINFO)
1941         AC_TRY_COMPILE([#include <linux/in.h>], [
1942                 int level = IP_PKTINFO;
1943         ], [
1944                 # Yes, we have it...
1945                 AC_MSG_RESULT(yes)
1946                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
1947         ], [
1948                 AC_MSG_RESULT(no)
1949         ])
1951         dnl *****************************
1952         dnl *** Checks for IPV6_PKTINFO ***
1953         dnl *****************************
1954         AC_MSG_CHECKING(for IPV6_PKTINFO)
1955         AC_TRY_COMPILE([#include <netdb.h>], [
1956                 int level = IPV6_PKTINFO;
1957         ], [
1958                 # Yes, we have it...
1959                 AC_MSG_RESULT(yes)
1960                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
1961         ], [
1962                 AC_MSG_RESULT(no)
1963         ])
1965         dnl **********************************
1966         dnl *** Checks for IP_DONTFRAG     ***
1967         dnl **********************************
1968         AC_MSG_CHECKING(for IP_DONTFRAG)
1969         AC_TRY_COMPILE([#include <netinet/in.h>], [
1970                 int level = IP_DONTFRAG;
1971         ], [
1972                 # Yes, we have it...
1973                 AC_MSG_RESULT(yes)
1974                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
1975         ], [
1976                 AC_MSG_RESULT(no)
1977         ])
1979         dnl **********************************
1980         dnl *** Checks for IP_DONTFRAGMENT ***
1981         dnl **********************************
1982         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
1983         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
1984                 int level = IP_DONTFRAGMENT;
1985         ], [
1986                 # Yes, we have it...
1987                 AC_MSG_RESULT(yes)
1988                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
1989         ], [
1990                 AC_MSG_RESULT(no)
1991         ])
1993         dnl **********************************
1994         dnl *** Checks for IP_MTU_DISCOVER ***
1995         dnl **********************************
1996         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
1997         AC_TRY_COMPILE([#include <linux/in.h>], [
1998                 int level = IP_MTU_DISCOVER;
1999         ], [
2000                 # Yes, we have it...
2001                 AC_MSG_RESULT(yes)
2002                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
2003         ], [
2004                 AC_MSG_RESULT(no)
2005         ])
2007         dnl **********************************
2008         dnl *** Checks for  IP_PMTUDISC_DO ***
2009         dnl **********************************
2010         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
2011         AC_TRY_COMPILE([#include <linux/in.h>], [
2012                 int level = IP_PMTUDISC_DO;
2013         ], [
2014                 # Yes, we have it...
2015                 AC_MSG_RESULT(yes)
2016                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
2017         ], [
2018                 AC_MSG_RESULT(no)
2019         ])
2021         dnl *********************************
2022         dnl *** Check for struct ip_mreqn ***
2023         dnl *********************************
2024         AC_MSG_CHECKING(for struct ip_mreqn)
2025         AC_TRY_COMPILE([#include <netinet/in.h>], [
2026                 struct ip_mreqn mreq;
2027                 mreq.imr_address.s_addr = 0;
2028         ], [
2029                 # Yes, we have it...
2030                 AC_MSG_RESULT(yes)
2031                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
2032         ], [
2033                 # We'll just have to try and use struct ip_mreq
2034                 AC_MSG_RESULT(no)
2035                 AC_MSG_CHECKING(for struct ip_mreq)
2036                 AC_TRY_COMPILE([#include <netinet/in.h>], [
2037                         struct ip_mreq mreq;
2038                         mreq.imr_interface.s_addr = 0;
2039                 ], [
2040                         # Yes, we have it...
2041                         AC_MSG_RESULT(yes)
2042                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
2043                 ], [
2044                         # No multicast support
2045                         AC_MSG_RESULT(no)
2046                 ])
2047         ])
2048         
2049         dnl **********************************
2050         dnl *** Check for getaddrinfo ***
2051         dnl **********************************
2052         AC_MSG_CHECKING(for getaddrinfo)
2053                 AC_TRY_LINK([
2054                 #include <stdio.h>
2055                 #include <netdb.h>
2056         ], [
2057                 getaddrinfo(NULL,NULL,NULL,NULL);
2058         ], [
2059                 # Yes, we have it...
2060                 AC_MSG_RESULT(yes)
2061                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2062         ], [
2063                 AC_MSG_RESULT(no)
2064         ])
2066         dnl **********************************
2067         dnl *** Check for gethostbyname2_r ***
2068         dnl **********************************
2069         AC_MSG_CHECKING(for gethostbyname2_r)
2070                 AC_TRY_LINK([
2071                 #include <stdio.h>
2072                 #include <netdb.h>
2073         ], [
2075                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
2076         ], [
2077                 # Yes, we have it...
2078                 AC_MSG_RESULT(yes)
2079                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
2080         ], [
2081                 AC_MSG_RESULT(no)
2082         ])
2084         dnl **********************************
2085         dnl *** Check for gethostbyname2 ***
2086         dnl **********************************
2087         AC_MSG_CHECKING(for gethostbyname2)
2088                 AC_TRY_LINK([
2089                 #include <stdio.h>
2090                 #include <netdb.h>
2091         ], [
2092                 gethostbyname2(NULL,0);
2093         ], [
2094                 # Yes, we have it...
2095                 AC_MSG_RESULT(yes)
2096                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
2097         ], [
2098                 AC_MSG_RESULT(no)
2099         ])
2101         dnl **********************************
2102         dnl *** Check for gethostbyname ***
2103         dnl **********************************
2104         AC_MSG_CHECKING(for gethostbyname)
2105                 AC_TRY_LINK([
2106                 #include <stdio.h>
2107                 #include <netdb.h>
2108         ], [
2109                 gethostbyname(NULL);
2110         ], [
2111                 # Yes, we have it...
2112                 AC_MSG_RESULT(yes)
2113                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2114         ], [
2115                 AC_MSG_RESULT(no)
2116         ])
2118         dnl **********************************
2119         dnl *** Check for getprotobyname ***
2120         dnl **********************************
2121         AC_MSG_CHECKING(for getprotobyname)
2122                 AC_TRY_LINK([
2123                 #include <stdio.h>
2124                 #include <netdb.h>
2125         ], [
2126                 getprotobyname(NULL);
2127         ], [
2128                 # Yes, we have it...
2129                 AC_MSG_RESULT(yes)
2130                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2131         ], [
2132                 AC_MSG_RESULT(no)
2133         ])
2135         dnl **********************************
2136         dnl *** Check for getnameinfo ***
2137         dnl **********************************
2138         AC_MSG_CHECKING(for getnameinfo)
2139                 AC_TRY_LINK([
2140                 #include <stdio.h>
2141                 #include <netdb.h>
2142         ], [
2143                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2144         ], [
2145                 # Yes, we have it...
2146                 AC_MSG_RESULT(yes)
2147                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2148         ], [
2149                 AC_MSG_RESULT(no)
2150         ])
2153         dnl **********************************
2154         dnl *** Check for inet_ntop ***
2155         dnl **********************************
2156         AC_MSG_CHECKING(for inet_ntop)
2157                 AC_TRY_LINK([
2158                 #include <stdio.h>
2159                 #include <arpa/inet.h>
2160         ], [
2161                 inet_ntop (0, NULL, NULL, 0);
2162         ], [
2163                 # Yes, we have it...
2164                 AC_MSG_RESULT(yes)
2165                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2166         ], [
2167                 AC_MSG_RESULT(no)
2168         ])
2170         dnl *****************************
2171         dnl *** Checks for libnsl     ***
2172         dnl *****************************
2173         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
2175         AC_CHECK_FUNCS(inet_pton inet_aton)
2177         dnl *****************************
2178         dnl *** Checks for libxnet    ***
2179         dnl *****************************
2180         case "${host}" in
2181                 *solaris* )
2182                         AC_MSG_CHECKING(for Solaris XPG4 support)
2183                         if test -f /usr/lib/libxnet.so; then
2184                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
2185                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
2186                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
2187                                 LIBS="$LIBS -lxnet"
2188                                 AC_MSG_RESULT(yes)
2189                         else
2190                                 AC_MSG_RESULT(no)
2191                         fi
2193                         if test "$GCC" = "yes"; then
2194                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
2195                         fi
2196                 ;;
2197         esac
2199         dnl *****************************
2200         dnl *** Checks for libpthread ***
2201         dnl *****************************
2202 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
2203 # and libpthread does not exist
2205         case "${host}" in
2206                 *-*-*haiku*)
2207                         dnl Haiku has pthread in libroot (libc equiv)
2208                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS")
2209                 ;;
2210                 *-*-*freebsd*)
2211                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2212                 ;;
2213                 *-*-*openbsd*)
2214                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2215                 ;;
2216                 *)
2217                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
2218                 ;;
2219         esac
2220         AC_CHECK_HEADERS(pthread.h)
2221         AC_CHECK_HEADERS(pthread_np.h)
2222         AC_CHECK_FUNCS(pthread_mutex_timedlock)
2223         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_setname_np pthread_cond_timedwait_relative_np)
2224         AC_CHECK_FUNCS(pthread_kill)
2225         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
2226         AC_TRY_COMPILE([ #include <pthread.h>], [
2227                 pthread_mutexattr_t attr;
2228                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
2229         ], [
2230                 AC_MSG_RESULT(ok)
2231         ], [
2232                 AC_MSG_RESULT(no)
2233                 AC_ERROR(Posix system lacks support for recursive mutexes)
2234         ])
2235         AC_CHECK_FUNCS(pthread_attr_setstacksize)
2236         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
2237         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
2239         dnl **********************************
2240         dnl *** Check for mincore ***
2241         dnl **********************************
2242         AC_MSG_CHECKING(for mincore)
2243                 AC_TRY_LINK([
2244                 #include <stdio.h>
2245                 #include <sys/types.h>
2246                 #include <sys/mman.h>
2247         ], [
2248                 mincore(NULL, 0, NULL);
2249         ], [
2250                 # Yes, we have it...
2251                 AC_MSG_RESULT(yes)
2252                 AC_DEFINE(HAVE_MINCORE, 1, [Have mincore])
2253         ], [
2254                 AC_MSG_RESULT(no)
2255         ])
2257         dnl ***********************************
2258         dnl *** Checks for working __thread ***
2259         dnl ***********************************
2260         AC_MSG_CHECKING(for working __thread)
2261         if test "x$with_tls" != "x__thread"; then
2262                 AC_MSG_RESULT(disabled)
2263         elif test "x$cross_compiling" = "xyes"; then
2264                 AC_MSG_RESULT(cross compiling, assuming yes)
2265         else
2266                 AC_TRY_RUN([
2267                         #if defined(__APPLE__) && defined(__clang__)
2268                         #error "__thread does not currently work with clang on Mac OS X"
2269                         #endif
2270                         
2271                         #include <pthread.h>
2272                         __thread int i;
2273                         static int res1, res2;
2275                         void thread_main (void *arg)
2276                         {
2277                                 i = arg;
2278                                 sleep (1);
2279                                 if (arg == 1)
2280                                         res1 = (i == arg);
2281                                 else
2282                                         res2 = (i == arg);
2283                         }
2285                         int main () {
2286                                 pthread_t t1, t2;
2288                                 i = 5;
2290                                 pthread_create (&t1, NULL, thread_main, 1);
2291                                 pthread_create (&t2, NULL, thread_main, 2);
2293                                 pthread_join (t1, NULL);
2294                                 pthread_join (t2, NULL);
2296                                 return !(res1 + res2 == 2);
2297                         }
2298                 ], [
2299                                 AC_MSG_RESULT(yes)
2300                 ], [
2301                                 AC_MSG_RESULT(no)
2302                                 with_tls=pthread
2303                 ])
2304         fi
2306         dnl **************************************
2307         dnl *** Checks for working sigaltstack ***
2308         dnl **************************************
2309         AC_MSG_CHECKING(for working sigaltstack)
2310         if test "x$with_sigaltstack" != "xyes"; then
2311                 AC_MSG_RESULT(disabled)
2312         elif test "x$cross_compiling" = "xyes"; then
2313                 AC_MSG_RESULT(cross compiling, assuming yes)
2314         else
2315                 AC_TRY_RUN([
2316                         #include <stdio.h>
2317                         #include <stdlib.h>
2318                         #include <unistd.h>
2319                         #include <signal.h>
2320                         #include <pthread.h>
2321                         #include <sys/wait.h>
2322                         #if defined(__FreeBSD__) || defined(__NetBSD__)
2323                         #define SA_STACK SA_ONSTACK
2324                         #endif
2325                         static void
2326                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
2327                         {
2328                                 exit (0);
2329                         }
2331                         volatile char*__ptr = NULL;
2332                         static void *
2333                         loop (void *ignored)
2334                         {
2335                                 *__ptr = 0;
2336                                 return NULL;
2337                         }
2339                         static void
2340                         child ()
2341                         {
2342                                 struct sigaction sa;
2343                                 stack_t sas;
2344                                 pthread_t id;
2345                                 pthread_attr_t attr;
2347                                 sa.sa_sigaction = sigsegv_signal_handler;
2348                                 sigemptyset (&sa.sa_mask);
2349                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
2350                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
2351                                         perror ("sigaction");
2352                                         return;
2353                                 }
2355                                 /* x86 darwin deliver segfaults using SIGBUS */
2356                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
2357                                         perror ("sigaction");
2358                                         return;
2359                                 }
2360                                 sas.ss_sp = malloc (SIGSTKSZ);
2361                                 sas.ss_size = SIGSTKSZ;
2362                                 sas.ss_flags = 0;
2363                                 if (sigaltstack (&sas, NULL) == -1) {
2364                                         perror ("sigaltstack");
2365                                         return;
2366                                 }
2368                                 pthread_attr_init (&attr);
2369                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
2370                                         printf ("pthread_create\n");
2371                                         return;
2372                                 }
2374                                 sleep (100);
2375                         }
2377                         int
2378                         main ()
2379                         {
2380                                 pid_t son;
2381                                 int status;
2382                                 int i;
2384                                 son = fork ();
2385                                 if (son == -1) {
2386                                         return 1;
2387                                 }
2389                                 if (son == 0) {
2390                                         child ();
2391                                         return 0;
2392                                 }
2394                                 for (i = 0; i < 300; ++i) {
2395                                         waitpid (son, &status, WNOHANG);
2396                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
2397                                                 return 0;
2398                                         usleep (10000);
2399                                 }
2401                                 kill (son, SIGKILL);
2402                                 return 1;
2403                         }
2405                 ], [
2406                                 AC_MSG_RESULT(yes)
2407                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
2408                 ], [
2409                                 with_sigaltstack=no
2410                                 AC_MSG_RESULT(no)
2411                 ])
2412         fi
2414         dnl ********************************
2415         dnl *** Checks for semaphore lib ***
2416         dnl ********************************
2417         # 'Real Time' functions on Solaris
2418         # posix4 on Solaris 2.6
2419         # pthread (first!) on Linux
2420         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
2422         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
2423         AC_CHECK_FUNCS(shm_open)
2425         dnl ********************************
2426         dnl *** Checks for timezone stuff **
2427         dnl ********************************
2428         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
2429                 AC_TRY_COMPILE([
2430                         #include <time.h>
2431                         ], [
2432                         struct tm tm;
2433                         tm.tm_gmtoff = 1;
2434                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
2435         if test $ac_cv_struct_tm_gmtoff = yes; then
2436                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
2437         else
2438                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
2439                         AC_TRY_COMPILE([
2440                                 #include <time.h>
2441                         ], [
2442                                 timezone = 1;
2443                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
2444                 if test $ac_cv_var_timezone = yes; then
2445                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
2446                 else
2447                         AC_ERROR(unable to find a way to determine timezone)
2448                 fi
2449         fi
2451         dnl *********************************
2452         dnl *** Checks for math functions ***
2453         dnl *********************************
2454         AC_SEARCH_LIBS(sqrtf, m)
2455         if test "x$has_broken_apple_cpp" != "xyes"; then
2456                 AC_CHECK_FUNCS(finite, , AC_MSG_CHECKING(for finite in math.h)
2457                         AC_TRY_LINK([#include <math.h>], 
2458                         [ finite(0.0); ], 
2459                         AC_DEFINE(HAVE_FINITE, 1, [Have finite in -lm]) AC_MSG_RESULT(yes),
2460                         AC_MSG_RESULT(no)))
2461         fi
2462         AC_CHECK_FUNCS(isfinite, , AC_MSG_CHECKING(for isfinite in math.h)
2463                 AC_TRY_LINK([#include <math.h>], 
2464                 [ isfinite(0.0); ], 
2465                 AC_DEFINE(HAVE_ISFINITE, 1, [Have isfinite]) AC_MSG_RESULT(yes),
2466                 AC_MSG_RESULT(no)))
2468         dnl ****************************************************************
2469         dnl *** Checks for working poll() (macosx defines it but doesn't ***
2470         dnl *** have it in the library (duh))                            ***
2471         dnl ****************************************************************
2472         AC_CHECK_FUNCS(poll)
2474         dnl *************************
2475         dnl *** Check for signbit ***
2476         dnl *************************
2477         AC_MSG_CHECKING(for signbit)
2478         AC_TRY_LINK([#include <math.h>], [
2479                 int s = signbit(1.0);
2480         ], [
2481                 AC_MSG_RESULT(yes)
2482                 AC_DEFINE(HAVE_SIGNBIT, 1, [Have signbit])
2483         ], [
2484                 AC_MSG_RESULT(no)
2485         ]) 
2487         dnl **********************************
2488         dnl *** epoll                      ***
2489         dnl **********************************
2490         AC_CHECK_HEADERS(sys/epoll.h)
2491         haveepoll=no
2492         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
2493         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
2494                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
2495         fi
2497         havekqueue=no
2499         AC_CHECK_HEADERS(sys/event.h)
2500         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
2502         dnl **************************************
2503         dnl * Darwin has a race that prevents us from using reliably:
2504         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
2505         dnl * Since kqueue is mostly used for scaling large web servers, 
2506         dnl * and very few folks run Mono on large web servers on OSX, falling
2507         dnl * back 
2508         dnl **************************************
2509         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
2510                 if test "x$host_darwin" = "xno"; then
2511                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
2512                 fi
2513         fi
2515         dnl ******************************
2516         dnl *** Checks for SIOCGIFCONF ***
2517         dnl ******************************
2518         AC_CHECK_HEADERS(sys/ioctl.h)
2519         AC_CHECK_HEADERS(net/if.h, [], [],
2520            [
2521            #ifdef HAVE_SYS_TYPES_H
2522            # include <sys/types.h>
2523            #endif
2524            #ifdef HAVE_SYS_SOCKET_H
2525            # include <sys/socket.h>
2526            #endif
2527            ])
2528         AC_MSG_CHECKING(for ifreq)
2529         AC_TRY_COMPILE([
2530                 #include <stdio.h>
2531                 #include <sys/ioctl.h>
2532                 #include <net/if.h>
2533                 ], [
2534                 struct ifconf ifc;
2535                 struct ifreq *ifr;
2536                 void *x;
2537                 ifc.ifc_len = 0;
2538                 ifc.ifc_buf = NULL;
2539                 x = (void *) &ifr->ifr_addr;
2540                 ],[
2541                         AC_MSG_RESULT(yes)
2542                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
2543                 ], [
2544                         AC_MSG_RESULT(no)
2545                 ])
2546         dnl **********************************
2547         dnl ***     Checks for sin_len     ***
2548         dnl **********************************
2549         AC_MSG_CHECKING(for sockaddr_in.sin_len)
2550         AC_TRY_COMPILE([
2551                 #include <netinet/in.h>
2552                 ], [
2553                 struct sockaddr_in saddr;
2554                 saddr.sin_len = sizeof (saddr);
2555                 ],[
2556                         AC_MSG_RESULT(yes)
2557                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
2558                 ], [
2559                         AC_MSG_RESULT(no)
2560                 ])      
2561         dnl **********************************
2562         dnl ***    Checks for sin6_len     ***
2563         dnl **********************************
2564         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
2565         AC_TRY_COMPILE([
2566                 #include <netinet/in.h>
2567                 ], [
2568                 struct sockaddr_in6 saddr6;
2569                 saddr6.sin6_len = sizeof (saddr6);
2570                 ],[
2571                         AC_MSG_RESULT(yes)
2572                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
2573                 ], [
2574                         AC_MSG_RESULT(no)
2575                 ])
2576         dnl **********************************
2577         dnl *** Check for getifaddrs       ***
2578         dnl **********************************
2579         AC_MSG_CHECKING(for getifaddrs)
2580                 AC_TRY_LINK([
2581                 #include <stdio.h>
2582                 #include <sys/types.h>
2583                 #include <sys/socket.h>
2584                 #include <ifaddrs.h>
2585         ], [
2586                 getifaddrs(NULL);
2587         ], [
2588                 # Yes, we have it...
2589                 AC_MSG_RESULT(yes)
2590                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
2591         ], [
2592                 AC_MSG_RESULT(no)
2593         ])
2594         dnl **********************************
2595         dnl *** Check for if_nametoindex   ***
2596         dnl **********************************
2597         AC_MSG_CHECKING(for if_nametoindex)
2598                 AC_TRY_LINK([
2599                 #include <stdio.h>
2600                 #include <sys/types.h>
2601                 #include <sys/socket.h>
2602                 #include <net/if.h>
2603         ], [
2604                 if_nametoindex(NULL);
2605         ], [
2606                 # Yes, we have it...
2607                 AC_MSG_RESULT(yes)
2608                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
2609         ], [
2610                 AC_MSG_RESULT(no)
2611         ])
2612                         
2613         dnl **********************************
2614         dnl *** Checks for proclib         ***
2615         dnl **********************************
2616         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.)])
2617         dnl **********************************
2618         dnl *** Checks for MonoPosixHelper ***
2619         dnl **********************************
2620         AC_CHECK_HEADERS(checklist.h)
2621         AC_CHECK_HEADERS(pathconf.h)
2622         AC_CHECK_HEADERS(fstab.h)
2623         AC_CHECK_HEADERS(attr/xattr.h)
2624         AC_CHECK_HEADERS(sys/extattr.h)
2625         AC_CHECK_HEADERS(sys/sendfile.h)
2626         AC_CHECK_HEADERS(sys/statvfs.h)
2627         AC_CHECK_HEADERS(sys/statfs.h)
2628         AC_CHECK_HEADERS(sys/vfstab.h)
2629         AC_CHECK_HEADERS(sys/xattr.h)
2630         AC_CHECK_HEADERS(sys/mman.h)
2631         AC_CHECK_HEADERS(sys/param.h)
2632         AC_CHECK_HEADERS(sys/mount.h, [], [],
2633                 [
2634                 #ifdef HAVE_SYS_PARAM_H
2635                 # include <sys/param.h>
2636                 #endif
2637                 ])
2638         AC_CHECK_HEADERS(sys/mount.h)
2639         AC_CHECK_FUNCS(confstr)
2640         AC_CHECK_FUNCS(seekdir telldir)
2641         AC_CHECK_FUNCS(getdomainname)
2642         AC_CHECK_FUNCS(setdomainname)
2643         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
2644         AC_CHECK_FUNCS(setgroups)
2645         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
2646         AC_CHECK_FUNCS(getfsstat)
2647         AC_CHECK_FUNCS(lutimes futimes)
2648         AC_CHECK_FUNCS(mremap)
2649         AC_CHECK_FUNCS(remap_file_pages)
2650         AC_CHECK_FUNCS(posix_fadvise)
2651         AC_CHECK_FUNCS(posix_fallocate)
2652         AC_CHECK_FUNCS(posix_madvise)
2653         AC_CHECK_FUNCS(vsnprintf)
2654         AC_CHECK_FUNCS(sendfile)
2655         AC_CHECK_FUNCS(gethostid sethostid)
2656         AC_CHECK_FUNCS(sethostname)
2657         AC_CHECK_FUNCS(statfs)
2658         AC_CHECK_FUNCS(fstatfs)
2659         AC_CHECK_FUNCS(statvfs)
2660         AC_CHECK_FUNCS(fstatvfs)
2661         AC_CHECK_FUNCS(stime)
2662         AC_CHECK_FUNCS(strerror_r)
2663         AC_CHECK_FUNCS(ttyname_r)
2664         AC_CHECK_FUNCS(psignal)
2665         AC_CHECK_FUNCS(getlogin_r)
2666         AC_CHECK_FUNCS(lockf)
2667         AC_CHECK_FUNCS(swab)
2668         AC_CHECK_FUNCS(setusershell endusershell)
2669         AC_CHECK_FUNCS(futimens utimensat)
2670         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
2671         AC_CHECK_FUNCS(readv writev preadv pwritev)
2672         AC_CHECK_FUNCS(setpgid)
2673         AC_CHECK_FUNCS(system)
2674         AC_CHECK_FUNCS(fork execv execve)
2675         AC_CHECK_FUNCS(accept4)
2676         AC_CHECK_FUNCS(localtime_r)
2677         AC_CHECK_FUNCS(mkdtemp)
2678         AC_CHECK_SIZEOF(size_t)
2679         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
2680                 [#include <sys/types.h>
2681                  #include <sys/stat.h>
2682                  #include <unistd.h>])
2683         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
2684                 [#include <sys/types.h>
2685                  #include <sys/stat.h>
2686                  #include <unistd.h>])
2687         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
2688                 [#include <sys/time.h>])
2689         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
2690                 [#include <sys/socket.h>])
2691         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
2692                 [#include <unistd.h>
2693                  #include <fcntl.h>])
2694         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
2695                 [#include <sys/uio.h>])
2696         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
2697                 [#include <sys/socket.h>])
2698         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
2699                 [#include <sys/poll.h>])
2700         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
2701                 [#include <sys/socket.h>])
2702         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
2703                 [#include <sys/socket.h>])
2704         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
2705                 [#include <netinet/in.h>])
2706         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
2707                 [#include <netinet/in.h>])
2708         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
2709                 [#include <sys/un.h>])
2710         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
2711                 [#include <sys/types.h>
2712                  #include <sys/stat.h>
2713                  #include <unistd.h>])
2714         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
2715                 [#include <time.h>])
2716         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
2717                 [#include <sys/time.h>
2718                  #include <sys/types.h>
2719                  #include <utime.h>])
2720         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
2721                 [#include <sys/time.h>])
2722         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
2723                 [#include <sys/types.h>
2724                  #include <utime.h>])
2725         AC_CHECK_MEMBERS(
2726                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
2727                 [#include <sys/types.h>
2728                  #include <dirent.h>])
2729         AC_CHECK_MEMBERS(
2730                 [struct passwd.pw_gecos],,, 
2731                 [#include <sys/types.h>
2732                  #include <pwd.h>])
2733         AC_CHECK_MEMBERS(
2734                 [struct statfs.f_flags],,, 
2735                 [#include <sys/types.h>
2736                  #include <sys/vfs.h>])
2737         AC_CHECK_MEMBERS(
2738                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
2739                 [#include <sys/types.h>
2740                  #include <sys/stat.h>
2741                  #include <unistd.h>])
2743         dnl Favour xattr through glibc, but use libattr if we have to
2744         AC_CHECK_FUNC(lsetxattr, ,
2745                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
2746         )
2747         AC_SUBST(XATTR_LIB)
2749         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
2750         AC_CHECK_MEMBERS(
2751                 [struct kinfo_proc.kp_proc],,, 
2752                 [#include <sys/types.h>
2753                  #include <sys/param.h>
2754                  #include <sys/sysctl.h>
2755                  #include <sys/proc.h>
2756                  ])
2758         dnl *********************************
2759         dnl *** Checks for Windows compilation ***
2760         dnl *********************************
2761         AC_CHECK_HEADERS(sys/time.h)
2762         AC_CHECK_HEADERS(sys/param.h)
2763         AC_CHECK_HEADERS(dirent.h)
2765         dnl ******************************************
2766         dnl *** Checks for OSX and iOS compilation ***
2767         dnl ******************************************
2768         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
2770         dnl *********************************
2771         dnl *** Check for Console 2.0 I/O ***
2772         dnl *********************************
2773         AC_CHECK_HEADERS([curses.h])
2774         AC_CHECK_HEADERS([term.h], [], [],
2775         [#if HAVE_CURSES_H
2776          #include <curses.h>
2777          #endif
2778         ])
2779         AC_CHECK_HEADERS([termios.h])
2781         dnl *********************************
2782         dnl *** Checks for random         ***
2783         dnl *********************************
2784         if test x$host_darwin = xno; then
2785                 AC_CHECK_HEADERS(sys/random.h)
2786                 AC_CHECK_FUNCS(getrandom getentropy)
2787         fi
2788 else
2789         dnl *********************************
2790         dnl *** Checks for Windows compilation ***
2791         dnl *********************************
2792         AC_CHECK_HEADERS(winternl.h)
2794         jdk_headers_found=no
2795         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
2796         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
2797         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
2798         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
2799         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
2800         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
2801         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
2803         dnl *********************************
2804         dnl *** Check for struct ip_mreqn ***
2805         dnl *********************************
2806         AC_MSG_CHECKING(for struct ip_mreqn)
2807         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
2808                 struct ip_mreqn mreq;
2809                 mreq.imr_address.s_addr = 0;
2810         ], [
2811                 # Yes, we have it...
2812                 AC_MSG_RESULT(yes)
2813                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
2814         ], [
2815                 # We'll just have to try and use struct ip_mreq
2816                 AC_MSG_RESULT(no)
2817                 AC_MSG_CHECKING(for struct ip_mreq)
2818                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
2819                         struct ip_mreq mreq;
2820                         mreq.imr_interface.s_addr = 0;
2821                 ], [
2822                         # Yes, we have it...
2823                         AC_MSG_RESULT(yes)
2824                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
2825                 ], [
2826                         # No multicast support
2827                         AC_MSG_RESULT(no)
2828                 ])
2829         ])
2831         dnl **********************************
2832         dnl *** Check for getaddrinfo ***
2833         dnl **********************************
2834         AC_MSG_CHECKING(for getaddrinfo)
2835                 AC_TRY_LINK([
2836                 #include <stdio.h>
2837                 #include <winsock2.h>
2838                 #include <ws2tcpip.h>
2839         ], [
2840                 getaddrinfo(NULL,NULL,NULL,NULL);
2841         ], [
2842                 # Yes, we have it...
2843                 AC_MSG_RESULT(yes)
2844                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2845         ], [
2846                 AC_MSG_RESULT(no)
2847         ])
2849         dnl **********************************
2850         dnl *** Check for gethostbyname ***
2851         dnl **********************************
2852         AC_MSG_CHECKING(for gethostbyname)
2853                 AC_TRY_LINK([
2854                 #include <stdio.h>
2855                 #include <winsock2.h>
2856                 #include <ws2tcpip.h>
2857         ], [
2858                 gethostbyname(NULL);
2859         ], [
2860                 # Yes, we have it...
2861                 AC_MSG_RESULT(yes)
2862                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2863         ], [
2864                 AC_MSG_RESULT(no)
2865         ])
2867         dnl **********************************
2868         dnl *** Check for getprotobyname ***
2869         dnl **********************************
2870         AC_MSG_CHECKING(for getprotobyname)
2871                 AC_TRY_LINK([
2872                 #include <stdio.h>
2873                 #include <winsock2.h>
2874                 #include <ws2tcpip.h>
2875         ], [
2876                 getprotobyname(NULL);
2877         ], [
2878                 # Yes, we have it...
2879                 AC_MSG_RESULT(yes)
2880                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2881         ], [
2882                 AC_MSG_RESULT(no)
2883         ])
2885         dnl **********************************
2886         dnl *** Check for getnameinfo ***
2887         dnl **********************************
2888         AC_MSG_CHECKING(for getnameinfo)
2889                 AC_TRY_LINK([
2890                 #include <stdio.h>
2891                 #include <winsock2.h>
2892                 #include <ws2tcpip.h>
2893         ], [
2894                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2895         ], [
2896                 # Yes, we have it...
2897                 AC_MSG_RESULT(yes)
2898                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2899         ], [
2900                 AC_MSG_RESULT(no)
2901         ])
2903         dnl **********************************
2904         dnl *** Check for inet_ntop ***
2905         dnl **********************************
2906         AC_MSG_CHECKING(for inet_ntop)
2907                 AC_TRY_LINK([
2908                 #include <stdio.h>
2909                 #include <winsock2.h>
2910                 #include <ws2tcpip.h>
2911         ], [
2912                 inet_ntop (0, NULL, NULL, 0);
2913         ], [
2914                 # Yes, we have it...
2915                 AC_MSG_RESULT(yes)
2916                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2917         ], [
2918                 AC_MSG_RESULT(no)
2919         ])
2921         dnl **********************************
2922         dnl *** Check for inet_pton ***
2923         dnl **********************************
2924         AC_MSG_CHECKING(for inet_pton)
2925                 AC_TRY_LINK([
2926                 #include <stdio.h>
2927                 #include <winsock2.h>
2928                 #include <ws2tcpip.h>
2929         ], [
2930                 #ifndef inet_pton
2931                 (void) inet_pton;
2932                 #endif
2933                 inet_pton (0, NULL, NULL);
2934         ], [
2935                 # Yes, we have it...
2936                 AC_MSG_RESULT(yes)
2937                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
2938         ], [
2939                 AC_MSG_RESULT(no)
2940         ])
2942         AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
2943         AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
2944         AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
2945         AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
2946         AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
2947         AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
2948         AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
2951 dnl socklen_t check
2952 AC_MSG_CHECKING(for socklen_t)
2953 AC_TRY_COMPILE([
2954 #include <sys/types.h>
2955 #include <sys/socket.h>
2957   socklen_t foo;
2959 ac_cv_c_socklen_t=yes
2960         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
2961         AC_MSG_RESULT(yes)
2963         AC_MSG_RESULT(no)
2966 AC_MSG_CHECKING(for array element initializer support)
2967 AC_TRY_COMPILE([#include <sys/socket.h>], [
2968         const int array[] = {[1] = 2,};
2969 ], [
2970         # Yes, we have it...
2971         AC_MSG_RESULT(yes)
2972         AC_DEFINE(HAVE_ARRAY_ELEM_INIT,1,[Supports C99 array initialization])
2973 ], [
2974         # We'll have to use signals
2975         AC_MSG_RESULT(no)
2978 AC_CHECK_FUNCS(trunc, , AC_MSG_CHECKING(for trunc in math.h)
2979         # Simply calling trunc (0.0) is no good since gcc will optimize the call away
2980         AC_TRY_LINK([#include <math.h>], 
2981         [ static void *p = &trunc; ],
2982         [
2983                 AC_DEFINE(HAVE_TRUNC) 
2984                 AC_MSG_RESULT(yes)
2985                 ac_cv_trunc=yes
2986         ],
2987         AC_MSG_RESULT(no)))
2989 if test "x$ac_cv_truncl" != "xyes"; then
2990    AC_CHECK_LIB(sunmath, aintl, [ AC_DEFINE(HAVE_AINTL, 1, [Has the 'aintl' function]) LIBS="$LIBS -lsunmath"])
2993 AC_CHECK_FUNCS(execvp)
2995 dnl ****************************
2996 dnl *** Look for /dev/random ***
2997 dnl ****************************
2999 AC_MSG_CHECKING([if usage of random device is requested])
3000 AC_ARG_ENABLE(dev-random,
3001 [  --disable-dev-random    disable the use of the random device (enabled by default)],
3002 try_dev_random=$enableval, try_dev_random=yes)
3004 AC_MSG_RESULT($try_dev_random)
3006 case "{$build}" in
3007     *-openbsd*)
3008     NAME_DEV_RANDOM="/dev/srandom"
3009     ;;
3011 dnl IBM i does not have /dev/random, use unblocking only
3013     *-*-os400*)
3014     NAME_DEV_RANDOM="/dev/urandom"
3015     ;;
3017 dnl Win32 does not have /dev/random, they have their own method...
3019     *-mingw*|*-*-cygwin*)
3020     ac_cv_have_dev_random=no
3021     ;;
3023 dnl Everywhere else, it's /dev/random
3025     *)
3026     NAME_DEV_RANDOM="/dev/random"
3027     ;;
3028 esac
3030 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
3032 dnl Now check if the device actually exists
3034 if test "x$try_dev_random" = "xyes"; then
3035     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
3036     [if test -r "$NAME_DEV_RANDOM" ; then
3037         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
3038     if test "x$ac_cv_have_dev_random" = "xyes"; then
3039         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
3040     fi
3041 else
3042     AC_MSG_CHECKING(for random device)
3043     ac_cv_have_dev_random=no
3044     AC_MSG_RESULT(has been disabled)
3047 if test "x$host_win32" = "xyes"; then
3048     AC_DEFINE(HAVE_CRYPT_RNG)
3051 if test "x$ac_cv_have_dev_random" = "xno" \
3052     && test "x$host_win32" = "xno"; then
3053     AC_MSG_WARN([[
3055 *** A system-provided entropy source was not found on this system.
3056 *** Because of this, the System.Security.Cryptography random number generator
3057 *** will throw a NotImplemented exception.
3059 *** If you are seeing this message, and you know your system DOES have an
3060 *** entropy collection in place, please contact <crichton@gimp.org> and
3061 *** provide information about the system and how to access the random device.
3063 *** Otherwise you can install either egd or prngd and set the environment
3064 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
3065 ***]])
3068 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)
3070 AC_MSG_CHECKING([if big-arrays are to be enabled])
3071 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)
3072 if test "x$enable_big_arrays" = "xyes" ; then
3073     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
3074         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
3075     else
3076         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
3077     fi
3079 AC_MSG_RESULT($enable_big_arrays)
3081 dnl **************
3082 dnl *** DTRACE ***
3083 dnl **************
3085 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
3087 if test "x$enable_dtrace" = "xyes"; then
3088    if test "x$has_dtrace" = "xno"; then
3089           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
3090    fi
3091    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
3092    if test "x$DTRACE" = "xno"; then
3093           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
3094           enable_dtrace=no
3095    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
3096           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
3097           enable_dtrace=no
3098    fi
3101 dtrace_g=no
3102 if test "x$enable_dtrace" = "xyes"; then
3103         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
3104         DTRACEFLAGS=
3105         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3106                 case "$host" in
3107                         powerpc-*-darwin*)
3108                         DTRACEFLAGS="-arch ppc64"
3109                         ;;
3110                         i*86-*-darwin*)
3111                         DTRACEFLAGS="-arch x86_64"
3112                         ;;
3113                         *)
3114                         DTRACEFLAGS=-64
3115                         ;;
3116                 esac
3117         else
3118                 case "$host" in
3119                         powerpc-*-darwin*)
3120                         DTRACEFLAGS="-arch ppc"
3121                         ;;
3122                         i*86-*-darwin*)
3123                         DTRACEFLAGS="-arch i386"
3124                         ;;
3125                         *)
3126                         DTRACEFLAGS=-32
3127                         ;;
3128                 esac
3129         fi
3130         AC_SUBST(DTRACEFLAGS)
3131         case "$host" in
3132                 *-*-solaris*)
3133                 dtrace_g=yes
3134                 ;;
3135         esac
3136         AC_CHECK_HEADERS([sys/sdt.h])
3138 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
3139 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
3141 dnl **************************
3142 dnl *** AOT cross offsets  ***
3143 dnl **************************
3145 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
3146     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
3148 dnl **************
3149 dnl ***  LLVM  ***
3150 dnl **************
3152 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
3153 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
3154 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)
3155 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
3157 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
3159 if test "x$enable_llvm" = "xdefault"; then
3160    enable_llvm=$enable_llvm_default
3163 if test "x$enable_llvm" = "xyes"; then
3164    if test "x$with_llvm" != "x"; then
3165           LLVM_CONFIG=$with_llvm/bin/llvm-config
3166           if test x$host_win32 = xyes; then
3167                 LLVM_CONFIG=$LLVM_CONFIG.exe
3168           fi
3169           if test ! -x $LLVM_CONFIG; then
3170                  AC_MSG_ERROR([LLVM executable $LLVM_CONFIG not found.])
3171       fi
3172    else
3173       AC_PATH_PROG(LLVM_CONFIG, llvm-config, no)
3174       if test "x$LLVM_CONFIG" = "xno"; then
3175              AC_MSG_ERROR([llvm-config not found.])
3176       fi
3177    fi
3179    llvm_codegen="x86codegen"
3180    case "$target" in
3181    arm*)
3182                 llvm_codegen="armcodegen"
3183                 ;;
3184    esac
3186    if test "x$host_win32" = "xno"; then
3188    # Should be something like '2.6' or '2.7svn'
3189    llvm_version=`$LLVM_CONFIG --version`
3190    llvm_api_version=`$LLVM_CONFIG --mono-api-version 2>/dev/null`
3191    AC_MSG_CHECKING(LLVM version)
3192    AC_MSG_RESULT($llvm_version $llvm_api_version)
3193    if echo $llvm_version | grep -q 'mono'; then
3194           if test "x$enable_llvm_version_check" = "xyes"; then
3195                  if test "$llvm_version" != "$expected_llvm_version"; then
3196                         AC_MSG_ERROR([Expected llvm version $expected_llvm_version, but llvm-config --version returned $llvm_version"])
3197                  fi
3198           fi
3199    else
3200           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.])
3201    fi
3203    # The output of --cflags seems to include optimizations flags too
3204    if test $llvm_api_version -gt 100; then
3205           # The --cflags argument includes all kinds of warnings -pendantic etc.
3206           LLVM_CFLAGS="-I$with_llvm/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS"
3207           LLVM_CXXFLAGS="-I$with_llvm/include -std=c++11 -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS"
3208    else
3209           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'`
3210       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'`
3211    fi
3212    # LLVM is compiled with -fno-rtti, so we need this too, since our classes inherit
3213    # from LLVM classes.
3214    LLVM_CXXFLAGS="$LLVM_CXXFLAGS -fno-rtti -fexceptions"
3215    LLVM_LDFLAGS=`$LLVM_CONFIG --ldflags`
3216    # This might include empty lines
3217    LLVM_SYSTEM_LIBS=`$LLVM_CONFIG --system-libs 2>/dev/null | grep -- -`
3218    llvm_jit_supported=yes
3219    llvm_jit_libs="jit mcjit $llvm_codegen"
3220    if test "x$host" != "x$target"; then
3221       # No need for jit libs
3222           llvm_jit_supported=no
3223       llvm_jit_libs=""
3224    elif test $llvm_api_version -gt 100; then
3225       llvm_jit_libs="orcjit $llvm_codegen"
3226    fi
3227    LLVM_LIBS=`$LLVM_CONFIG --libs analysis core bitwriter $llvm_jit_libs`
3228    if test "x$LLVM_LIBS" = "x"; then
3229           echo "$LLVM_CONFIG --libs failed."
3230           exit 1
3231    fi
3232    LLVM_LIBS="$LLVM_LIBS $LLVM_LDFLAGS $LLVM_SYSTEM_LIBS"
3233    # The c++ standard library used by llvm doesn't show up in $LLVM_SYSTEM_LIBS so add it manually
3234    if echo $LLVM_CXXFLAGS | grep -q -- '-stdlib=libc++'; then
3235       LLVM_LIBS="$LLVM_LIBS -lc++"
3236    else
3237       LLVM_LIBS="$LLVM_LIBS -lstdc++"
3238    fi
3240    expected_llvm_version="3.4svn-mono-mono/e656cac"
3242    else
3243        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"
3244        LLVM_CXXFLAGS="$LLVM_CFLAGS -std=gnu++11 -fvisibility-inlines-hidden -fno-rtti -Woverloaded-virtual -Wcast-qual"
3245        LLVM_LDFLAGS="-L$with_llvm/lib"
3246        LLVM_SYSTEM_LIBS="-lshell32 -lpsapi -limagehlp -ldbghelp -lm"
3247        LLVM_LIBS="-lLLVMLTO -lLLVMObjCARCOpts -lLLVMLinker -lLLVMipo -lLLVMVectorize -lLLVMBitWriter \
3248          -lLLVMARMDisassembler -lLLVMARMCodeGen -lLLVMARMAsmParser -lLLVMARMDesc -lLLVMARMInfo \
3249          -lLLVMARMAsmPrinter -lLLVMTableGen -lLLVMDebugInfo -lLLVMOption -lLLVMX86Disassembler \
3250          -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMX86Desc \
3251          -lLLVMMCDisassembler -lLLVMX86Info -lLLVMX86AsmPrinter -lLLVMX86Utils -lLLVMJIT \
3252          -lLLVMAnalysis -lLLVMTarget \
3253          -lLLVMIRReader -lLLVMAsmParser -lLLVMLineEditor -lLLVMMCAnalysis -lLLVMInstrumentation \
3254          -lLLVMInterpreter -lLLVMCodeGen -lLLVMScalarOpts -lLLVMInstCombine -lLLVMTransformUtils \
3255          -lLLVMipa -lLLVMAnalysis -lLLVMProfileData -lLLVMMCJIT -lLLVMTarget -lLLVMRuntimeDyld \
3256          -lLLVMObject -lLLVMMCParser -lLLVMBitReader -lLLVMExecutionEngine -lLLVMMC -lLLVMCore \
3257          -lLLVMSupport -lstdc++"
3258        LLVM_LIBS="$LLVM_LIBS $LLVM_SYSTEM_LIBS"
3260        llvm_config_path=$with_llvm/include/llvm/Config/llvm-config.h
3261        llvm_api_version=`awk '/MONO_API_VERSION/ { print $3 }' $llvm_config_path`
3262    fi  
3264    if test "x$llvm_api_version" = "x"; then
3265           LLVM_CFLAGS="$LLVM_CFLAGS -DLLVM_API_VERSION=0"
3266           LLVM_CXXFLAGS="$LLVM_CXXFLAGS -DLLVM_API_VERSION=0"
3267    else
3268           LLVM_CFLAGS="$LLVM_CFLAGS -DLLVM_API_VERSION=$llvm_api_version"
3269           LLVM_CXXFLAGS="$LLVM_CXXFLAGS -DLLVM_API_VERSION=$llvm_api_version"
3270    fi   
3272    AC_DEFINE_UNQUOTED(LLVM_VERSION, "$llvm_version", [Full version of LLVM libraries])
3274    AC_SUBST(LLVM_CFLAGS)
3275    AC_SUBST(LLVM_CXXFLAGS)
3276    AC_SUBST(LLVM_LIBS)
3277    AC_SUBST(LLVM_LDFLAGS)
3278    AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
3281 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes])
3282 if test "x$enable_loadedllvm" = "xyes"; then
3283    AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
3285 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes])
3287 if test "x$enable_llvm" = "xyes"; then
3288    enable_llvm_runtime=yes
3290 if test "x$enable_llvm_runtime" = "xyes"; then
3291    AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
3293 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes])
3295 TARGET="unknown"
3296 ACCESS_UNALIGNED="yes"
3298 LIBC="libc.so.6"
3299 INTL="libc.so.6"
3300 SQLITE="libsqlite.so.0"
3301 SQLITE3="libsqlite3.so.0"
3302 X11="libX11.so"
3303 GDKX11="libgdk-x11-2.0.so.0"
3304 GTKX11="libgtk-x11-2.0.so.0"
3305 XINERAMA="libXinerama.so.1"
3307 sizeof_register="SIZEOF_VOID_P"
3309 jit_wanted=true
3310 boehm_supported=true
3311 BTLS_SUPPORTED=no
3312 BTLS_PLATFORM=
3314 if test "x$enable_wasm" = "xyes"; then
3315 TARGET=WASM
3316 HOST=WASM
3317 arch_target=wasm
3318 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
3319 AC_DEFINE(HOST_WASM, 1, [Host wasm])
3320 BTLS_SUPPORTED=no
3321 with_tls=pthread
3322 target_mach=no
3324 else
3326 case "$host" in
3327         mips*)
3328                 TARGET=MIPS;
3329                 arch_target=mips;
3330                 with_tls=pthread;
3331                 ACCESS_UNALIGNED="no"
3333                 AC_MSG_CHECKING(for mips n32)
3334                 AC_TRY_COMPILE([],[
3335                 #if _MIPS_SIM != _ABIN32
3336                 #error Not mips n32
3337                 #endif
3338                 ],[
3339                 AC_MSG_RESULT(yes)
3340                 sizeof_register=8
3341                 ],[
3342                 AC_MSG_RESULT(no)
3343                 ])
3344                 ;;
3345         i*86-*-*)
3346                 TARGET=X86;
3347                 arch_target=x86;
3348                 case $host_os in
3349                   solaris*)
3350                         LIBC="libc.so"
3351                         INTL="libintl.so"
3352                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3353                                 TARGET=AMD64
3354                                 arch_target=amd64
3355                         fi
3357                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
3358                         # int astruct __attribute__ ((visibility ("hidden")));
3359                         # void foo ()
3360                         # {
3361                         #       void *p = &astruct;
3362                         # }
3363                         # gcc -fPIC --shared -o libfoo.so foo.c
3364                         # yields:
3365                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
3366                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
3367                         have_visibility_hidden=no
3368                         ;;
3369                   mingw*|cygwin*)
3370                         have_visibility_hidden=no                 
3371                         ;;
3372                   haiku*)
3373                         LIBC=libroot.so
3374                         ;;
3375                   linux*)
3376                         AOT_SUPPORTED="yes"
3377                         BTLS_SUPPORTED=yes
3378                         BTLS_PLATFORM=i386
3379                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3380                         ;;
3381                   darwin*)
3382                         AOT_SUPPORTED="yes"
3383                         BTLS_SUPPORTED=yes
3384                         BTLS_PLATFORM=i386
3385                         ;;
3386                   openbsd*|freebsd*|kfreebsd-gnu*)
3387                         AOT_SUPPORTED="yes"
3388                         BTLS_SUPPORTED=yes
3389                         BTLS_PLATFORM=i386
3390                         ;;
3391                 esac
3392                 ;;
3393         x86_64-*-* | amd64-*-*)
3394                 TARGET=AMD64;
3395                 arch_target=amd64;
3396                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
3397                         AC_DEFINE(__mono_ilp32__, 1, [64 bit mode with 4 byte longs and pointers])
3398                         sizeof_register=8
3399                 fi
3400                 case $host_os in
3401                   linux*)
3402                         AOT_SUPPORTED="yes"
3403                         BTLS_SUPPORTED=yes
3404                         BTLS_PLATFORM=x86_64
3405                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3406                         ;;
3407                   darwin*)
3408                         AOT_SUPPORTED="yes"
3409                         BTLS_SUPPORTED=yes
3410                         BTLS_PLATFORM=x86_64
3411                         boehm_supported=false
3412                         ;;
3413                   openbsd*|freebsd*|kfreebsd-gnu*)
3414                         AOT_SUPPORTED="yes"
3415                         BTLS_SUPPORTED=yes
3416                         BTLS_PLATFORM=x86_64
3417                         ;;
3418                   mingw*)
3419                         ;;
3420                 esac
3421                 ;;
3422         sparc*-*-*)
3423                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
3424                    TARGET=SPARC64
3425                 else
3426                         TARGET=SPARC
3427                 fi
3428                 arch_target=sparc;
3429                 ACCESS_UNALIGNED="no"
3430                 case $host_os in
3431                   linux*) ;;
3432                   *)
3433                         LIBC="libc.so"
3434                         INTL="libintl.so"
3435                 esac
3436                 if test x"$GCC" = xyes; then
3437                         # We don't support v8 cpus
3438                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
3439                 fi
3440                 if test x"$AR" = xfalse; then
3441                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
3442                 fi
3443                 ;;
3444         *-mingw*|*-*-cygwin*)
3445                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
3446                 have_visibility_hidden=no
3447                 INTL="intl"
3448                 ;;
3449         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
3450         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
3451         powerpc-*-freebsd* | powerpc-*-aix* | powerpc-*-os400* )
3452                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
3453                         TARGET=POWERPC64;
3454                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
3455                         CFLAGS="$CFLAGS -mminimal-toc"
3456                 else
3457                         TARGET=POWERPC;
3458                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
3459                 fi
3460                 arch_target=ppc;
3461                 case $host_os in
3462                   aix*|os400*)
3463                         dnl on AIX/PASE, shared libraries can be inside archives
3464                         dnl if they are, we specify them by lib.a(lib.so)
3465                         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX, so
3466                         LIBC="libc.a(shr_64.o)"
3467                         INTL="libintl.a(libintl.so.9)"
3468                         ;;
3469                   linux*|darwin*)
3470                         ;;
3471                 esac
3472                 ;;
3473         armv7k-*-darwin*)
3474                 TARGET=ARM;
3475                 TARGET_SYS=WATCHOS
3476                 arch_target=arm;
3477                 arm_fpu=VFP_HARD
3478                 ACCESS_UNALIGNED="no"
3479                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3480                 ;;
3482         arm*-darwin*)
3483                 TARGET=ARM;
3484                 arch_target=arm;
3485                 ACCESS_UNALIGNED="no"
3486                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3487                 ;;
3488         arm*-linux*)
3489                 TARGET=ARM;
3490                 arch_target=arm;
3491                 ACCESS_UNALIGNED="no"
3492                 AOT_SUPPORTED="yes"
3493                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3494                 BTLS_SUPPORTED=yes
3495                 BTLS_PLATFORM=arm
3496                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3497                 case "$target" in
3498                 arm*-linux*-gnueabi)
3499                         BTLS_PLATFORM=armsoft
3500                         ;;
3501                 esac
3502                 ;;
3503         arm*-netbsd*-eabi*)
3504                 TARGET=ARM;
3505                 arch_target=arm;
3506                 ACCESS_UNALIGNED="no"
3507                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3508                 ;;
3509         aarch64-*)
3510                 # https://lkml.org/lkml/2012/7/15/133
3511                 TARGET=ARM64
3512                 arch_target=arm64
3513                 boehm_supported=false
3514                 AOT_SUPPORTED="yes"
3515                 BTLS_SUPPORTED=yes
3516                 BTLS_PLATFORM=aarch64
3517                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3518                 ;;
3519         s390x-*-linux*)
3520                 TARGET=S390X;
3521                 arch_target=s390x;
3522                 ACCESS_UNALIGNED="yes"
3523                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
3524                 ;;
3525 esac
3527 HOST=$TARGET
3529 if test "x$host" != "x$target"; then
3530    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
3531    enable_mcs_build=no
3532    enable_support_build=no
3533    BTLS_SUPPORTED=no
3534    case "$target" in
3535    arm*-darwin*)
3536                 TARGET=ARM;
3537                 arch_target=arm;
3538                 ACCESS_UNALIGNED="no"
3539                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3540                 # Can't use tls, since it depends on the runtime detection of tls offsets
3541                 # in mono-compiler.h
3542                 with_tls=pthread
3543                 case "$target" in
3544                 armv7k-*)
3545                         arm_fpu=VFP_HARD
3546                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
3547                         ;;
3548                 esac            
3549                 ;;
3550    powerpc64-ps3-linux-gnu)
3551                 TARGET=POWERPC64
3552                 arch_target=powerpc64
3553                 AC_DEFINE(TARGET_PS3, 1, [...])
3554                 # It would be better to just use TARGET_POWERPC64, but lots of code already
3555                 # uses this define
3556                 AC_DEFINE(__mono_ppc64__, 1, [...])
3557                 AC_DEFINE(__mono_ilp32__, 1, [64 bit mode with 4 byte longs and pointers])
3558                 sizeof_register=8
3559                 target_byte_order=G_BIG_ENDIAN
3560                 ;;
3561    powerpc64-xbox360-linux-gnu)
3562                 TARGET=POWERPC64
3563                 arch_target=powerpc64
3564                 AC_DEFINE(TARGET_XBOX360, 1, [...])
3565                 # It would be better to just use TARGET_POWERPC64, but lots of code already
3566                 # uses this define
3567                 sizeof_register=8
3568                 target_byte_order=G_BIG_ENDIAN
3569                 ;;
3570    arm*-linux-*)
3571                 TARGET=ARM;
3572                 arch_target=arm;
3573                 AC_DEFINE(TARGET_ARM, 1, [...])
3574                 ACCESS_UNALIGNED="no"
3575                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3576                 # Can't use tls, since it depends on the runtime detection of tls offsets
3577                 # in mono-compiler.h
3578                 with_tls=pthread
3579                 target_mach=no
3580                 case "$target" in
3581                 armv7l-unknown-linux-gnueabi*)
3582                         # TEGRA
3583                         CPPFLAGS="$CPPFLAGS"
3584                         ;;
3585                 armv5-*-linux-androideabi*)
3586                         AC_DEFINE(TARGET_ANDROID, 1, [...])
3587                         CPPFLAGS="$CPPFLAGS"
3588                         ;;
3589                 *-linux-androideabi*)
3590                         AC_DEFINE(TARGET_ANDROID, 1, [...])
3591                         CPPFLAGS="$CPPFLAGS"
3592                         ;;
3593                 esac
3594                 ;;
3595    arm*-netbsd*-eabi*)
3596                 TARGET=ARM;
3597                 arch_target=arm;
3598                 AC_DEFINE(TARGET_ARM, 1, [...])
3599                 ACCESS_UNALIGNED="no"
3600                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3601                 # Can't use tls, since it depends on the runtime detection of tls offsets
3602                 # in mono-compiler.h
3603                 with_tls=pthread
3604                 target_mach=no
3605                 ;;
3606    i686*-linux-*)
3607                 TARGET=X86;
3608                 arch_target=x86;
3609                 AC_DEFINE(TARGET_X86, 1, [...])
3610                 CPPFLAGS="$CPPFLAGS"
3611                 # Can't use tls, since it depends on the runtime detection of tls offsets
3612                 # in mono-compiler.h            
3613                 with_tls=pthread
3614                 target_mach=no
3616                 case "$target" in
3617                 *-linux-android*)
3618                         AC_DEFINE(TARGET_ANDROID, 1, [...])
3619                         ;;
3620                 esac
3621                 ;;
3622    x86_64*-linux-*)
3623                 TARGET=AMD64;
3624                 arch_target=amd64;
3625                 AC_DEFINE(TARGET_AMD64, 1, [...])
3626                 CPPFLAGS="$CPPFLAGS"
3627                 # Can't use tls, since it depends on the runtime detection of tls offsets
3628                 # in mono-compiler.h
3629                 with_tls=pthread
3630                 target_mach=no
3632                 case "$target" in
3633                 *-linux-android*)
3634                         AC_DEFINE(TARGET_ANDROID, 1, [...])
3635                         ;;
3636                 esac
3637                 ;;
3638    x86_64-ps4-freebsd)
3639                 TARGET=AMD64;
3640                 arch_target=amd64;
3641                 AC_DEFINE(TARGET_AMD64, 1, [...])
3642                 AC_DEFINE(TARGET_PS4, 1, [...])
3643                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
3644                 CPPFLAGS="$CPPFLAGS"
3645                 # Can't use tls, since it depends on the runtime detection of tls offsets
3646                 # in mono-compiler.h
3647                 with_tls=pthread
3648                 target_mach=no
3649                 target_win32=no
3650                 ;;
3651    aarch64*-linux-*)
3652                 TARGET=ARM64;
3653                 arch_target=arm64;
3654                 AC_DEFINE(TARGET_ARM64, 1, [...])
3655                 CPPFLAGS="$CPPFLAGS"
3656                 # Can't use tls, since it depends on the runtime detection of tls offsets
3657                 # in mono-compiler.h
3658                 with_tls=pthread
3659                 target_mach=no
3660                 case "$target" in
3661                 *-linux-android*)
3662                         AC_DEFINE(TARGET_ANDROID, 1, [...])
3663                         ;;
3664                 esac
3665                 ;;
3666         aarch64-*)
3667                 TARGET=ARM64
3668                 ;;
3669         *)
3670                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
3671         esac
3674 case "$TARGET" in
3675 X86)
3676         AC_DEFINE(TARGET_X86, 1, [...])
3677         ;;
3678 AMD64)
3679         AC_DEFINE(TARGET_AMD64, 1, [...])
3680         ;;
3681 ARM)
3682         AC_DEFINE(TARGET_ARM, 1, [...])
3683         ;;
3684 ARM64)
3685         AC_DEFINE(TARGET_ARM64, 1, [...])
3686         ;;
3687 POWERPC)
3688         AC_DEFINE(TARGET_POWERPC, 1, [...])
3689         ;;
3690 POWERPC64)
3691         AC_DEFINE(TARGET_POWERPC, 1, [...])
3692         AC_DEFINE(TARGET_POWERPC64, 1, [...])
3693         ;;
3694 S390X)
3695         AC_DEFINE(TARGET_S390X, 1, [...])
3696         ;;
3697 MIPS)
3698         AC_DEFINE(TARGET_MIPS, 1, [...])
3699         ;;
3700 SPARC)
3701         AC_DEFINE(TARGET_SPARC, 1, [...])
3702         ;;
3703 SPARC64)
3704         AC_DEFINE(TARGET_SPARC64, 1, [...])
3705         ;;
3706 esac
3708 case "$HOST" in
3709 X86)
3710         AC_DEFINE(HOST_X86, 1, [...])
3711         ;;
3712 AMD64)
3713         AC_DEFINE(HOST_AMD64, 1, [...])
3714         ;;
3715 ARM)
3716         AC_DEFINE(HOST_ARM, 1, [...])
3717         ;;
3718 ARM64)
3719         AC_DEFINE(HOST_ARM64, 1, [...])
3720         ;;
3721 POWERPC)
3722         AC_DEFINE(HOST_POWERPC, 1, [...])
3723         ;;
3724 POWERPC64)
3725         AC_DEFINE(HOST_POWERPC, 1, [...])
3726         AC_DEFINE(HOST_POWERPC64, 1, [...])
3727         ;;
3728 S390X)
3729         AC_DEFINE(HOST_S390X, 1, [...])
3730         ;;
3731 MIPS)
3732         AC_DEFINE(HOST_MIPS, 1, [...])
3733         ;;
3734 SPARC)
3735         AC_DEFINE(HOST_SPARC, 1, [...])
3736         ;;
3737 SPARC64)
3738         AC_DEFINE(HOST_SPARC64, 1, [...])
3739         ;;
3740 esac
3742 #WASM hack
3746 dnl *************
3747 dnl *** VTUNE ***
3748 dnl *************
3750 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
3751 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
3753 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
3755 if test "x$enable_vtune" = "xyes"; then
3756         if test "x$with_vtune" = "x"; then
3757                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
3758         else
3759                 VTUNE_PATH=$with_vtune
3760         fi
3761         VTUNE_INCLUDE=$VTUNE_PATH/include
3762         case "$TARGET" in
3763         X86)
3764                 VTUNE_LIB=$VTUNE_PATH/lib32
3765                 ;;
3766         AMD64)
3767                 VTUNE_LIB=$VTUNE_PATH/lib64
3768                 ;;
3769         *)
3770                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
3771                 ;;
3772         esac
3773         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
3774                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
3775         fi
3776         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
3777                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
3778         fi
3780         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
3781         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
3783         AC_SUBST(VTUNE_LIBS)
3784         AC_SUBST(VTUNE_CFLAGS)
3786 dnl Use GCC atomic ops if they work on the target.
3787 if test x$GCC = "xyes"; then
3788         case $TARGET in
3789         X86 | AMD64 | ARM | ARM64 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64)
3790                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
3791                 ;;
3792         esac
3795 if test "x$target_mach" = "xyes"; then
3797    if test "x$TARGET_SYS" = "xWATCHOS"; then
3798           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
3799           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
3800           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
3801           BTLS_SUPPORTED=no
3802    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64"; then
3803           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
3804           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
3805           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
3806           BTLS_SUPPORTED=no
3807    else
3808        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
3809        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
3810        #error fail this for ios
3811        #endif
3812        ], [
3813                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
3814           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
3815           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
3816           target_osx=yes
3817        ], [
3818           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
3819           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
3820           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
3821           BTLS_SUPPORTED=no
3822                   target_ios=yes
3823        ])
3824         fi
3825    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
3828 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
3830 if test "x$sizeof_register" = "x4"; then
3831    AC_DEFINE(SIZEOF_REGISTER,4,[size of machine integer registers])
3832 elif test "x$sizeof_register" = "x8"; then
3833    AC_DEFINE(SIZEOF_REGISTER,8,[size of machine integer registers])
3834 else
3835    AC_DEFINE(SIZEOF_REGISTER,SIZEOF_VOID_P,[size of machine integer registers])
3838 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
3840 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
3841    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
3842 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
3843    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
3844 else
3845    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
3848 if test "x$have_visibility_hidden" = "xyes"; then
3849    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
3852 if test "x$have_deprecated" = "xyes"; then
3853    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
3856 dnl 
3857 dnl Simple Generational checks (sgen)
3859 SGEN_DEFINES=
3860 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
3861 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
3862 if test x$buildsgen = xyes; then
3863    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
3864    SGEN_DEFINES="-DHAVE_SGEN_GC"
3866         conc_gc_msg=""
3867    if test x$with_sgen_default_concurrent != xno; then
3868        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
3869            conc_gc_msg=" (concurrent by default)"
3870    fi
3872    if test "x$gc_msg" = "x"; then
3873       gc_msg="sgen$conc_gc_msg"
3874    else
3875       gc_msg="sgen$conc_gc_msg and $gc_msg"
3876    fi
3878 AC_SUBST(SGEN_DEFINES)
3879 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
3881 jit_status="Building and using the JIT"
3883 libsuffix=".so"
3885 case "$host" in
3886      *-*-darwin*)
3887         libsuffix=".dylib"
3888         LIBC="libc.dylib"
3889         INTL="libintl.dylib"
3890         SQLITE="libsqlite.0.dylib"
3891         SQLITE3="libsqlite3.0.dylib"
3892         X11="libX11.dylib"
3893         GDKX11="libgdk-x11-2.0.dylib"
3894         GTKX11="libgtk-x11-2.0.dylib"
3895         ;;
3896      *-*-*netbsd*)
3897         LIBC="libc.so"
3898         INTL="libintl.so"
3899         SQLITE="libsqlite.so"
3900         SQLITE3="libsqlite3.so"
3901         ;;
3902      *-*-kfreebsd*-gnu)
3903         LIBC="libc.so.0.1"
3904         INTL="libc.so.0.1"
3905         X11="libX11.so.6"
3906         ;;
3907     *-*-*freebsd*)
3908         LIBC="libc.so.7"
3909         INTL="libintl.so"
3910         SQLITE="libsqlite.so"
3911         SQLITE3="libsqlite3.so"
3912         ;;
3913     *-*-*openbsd*)
3914         LIBC="libc.so"
3915         INTL="libintl.so"
3916         SQLITE="libsqlite.so"
3917         SQLITE3="libsqlite3.so"
3918         ;;
3919     *-*-*linux*)
3920         AC_PATH_X
3921         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
3922         AC_MSG_CHECKING(for the soname of libX11.so)
3923         for i in $x_libraries $dlsearch_path; do
3924                 for r in 4 5 6; do
3925                         if test -f $i/libX11.so.$r; then
3926                                 X11=libX11.so.$r
3927                                 AC_MSG_RESULT($X11)
3928                         fi
3929                 done
3930         done
3931         
3932         if test "x$X11" = "xlibX11.so"; then
3933                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
3934                 X11=libX11.so.6
3935         fi
3936         ;;
3937 esac
3939 AC_SUBST(libsuffix)
3941 ######################################
3942 # EGLIB CHECKS
3943 ######################################
3945 GNUC_PRETTY=
3946 GNUC_UNUSED=
3947 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
3948 if test x$GCC = xyes; then
3949    GNUC_UNUSED='__attribute__((__unused__))'
3950    GNUC_NORETURN='__attribute__((__noreturn__))'
3951    case $host_cpu in
3952      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
3953    esac
3955 AC_SUBST(GNUC_PRETTY)
3956 AC_SUBST(GNUC_UNUSED)
3957 AC_SUBST(GNUC_NORETURN)
3958 AC_SUBST(BREAKPOINT)
3960 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
3962 case $host in
3963 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
3964     PATHSEP='\\'
3965     SEARCHSEP=';'
3966     OS="WIN32"
3967     PIDTYPE='void *'
3968     ;;
3970     PATHSEP='/'
3971     SEARCHSEP=':'
3972     OS="UNIX"
3973     PIDTYPE='int'
3974     ;;
3975 esac
3977 case $host in
3978         *-*-solaris*)
3979         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
3980         ;;
3981 esac
3983 case $target in
3984 arm*-darwin*|aarch64*-*)
3985     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
3986     ;;
3987 i*86-*-darwin*)
3988     ORDER=G_LITTLE_ENDIAN
3989     ;;
3990 *-*-haiku*)
3991     LDFLAGS="$LDFLAGS -ltextencoding"
3992     ;;
3993 *-*-openbsd*)
3994     CFLAGS="$CFLAGS -pthread"
3995     LDFLAGS="$LDFLAGS -pthread"
3996     ;;
3997 esac
3999 AC_SUBST(ORDER)
4000 AC_SUBST(CFLAGS)
4001 AC_SUBST(PATHSEP)
4002 AC_SUBST(SEARCHSEP)
4003 AC_SUBST(OS)
4004 AC_SUBST(PIDTYPE)
4006 # Defined for all targets/platforms using classic Windows API support.
4007 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
4008 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
4010 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf strerror_r)
4011 AC_CHECK_FUNCS(getrlimit)
4012 AC_CHECK_FUNCS(fork execv execve)
4014 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
4016 if test x$with_overridable_allocators = xyes; then
4017         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
4018   AC_MSG_NOTICE([Overridable allocator support enabled])
4019 else
4020   AC_MSG_NOTICE([Overridable allocator support disabled])
4024 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
4025 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
4026 # removed once support for 10.6 is dropped.
4028 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
4030 if test x$target_osx = xyes; then
4031 AC_CHECK_FUNCS(getpwuid_r)
4032 elif test x$target_ios = xno; then
4033 AC_CHECK_FUNCS(strndup getpwuid_r)
4036 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
4037 AM_ICONV()
4038 AC_SEARCH_LIBS(sqrtf, m)
4040 # nanosleep may not be part of libc, also search it in other libraries
4041 AC_SEARCH_LIBS(nanosleep, rt)
4043 AC_SEARCH_LIBS(dlopen, dl)
4044 old_ldflags="${LDFLAGS}"
4045 # GNU specific option, this confuses IBM ld, but do offer alternatives when possible
4046 if test $lt_cv_prog_gnu_ld = yes; then
4047         LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4048 else
4049         case $host in
4050         *-*-aix*|*-*-os400*)
4051                 ;;
4052         *)
4053                 dnl Try to use export-dynamic anyways
4054                 LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4055                 ;;
4056         esac
4058 AC_TRY_LINK(, [int i;], found_export_dynamic=yes, found_export_dynamic=no)
4059 if test $found_export_dynamic = no; then
4060         LDFLAGS="${old_ldflags}"
4063 AC_MSG_CHECKING(for varargs macros)
4064 AC_TRY_COMPILE([],[
4065 int foo (int i, int j);
4066 #define bar(...) foo (1, __VA_ARGS__)
4067 void main () {
4068          bar (2);
4070 ],have_iso_varargs=yes,have_iso_varargs=no)
4071 AC_MSG_RESULT($have_iso_varargs)
4072 G_HAVE_ISO_VARARGS=0
4073 if test "x$have_iso_varargs" = "xyes"; then
4074    G_HAVE_ISO_VARARGS=1
4076 AC_SUBST(G_HAVE_ISO_VARARGS)
4078 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)
4079 AC_CHECK_LIB([iconv], [locale_charset],[],[AC_CHECK_LIB([charset], [locale_charset],[LIBS+="-liconv -lcharset"])])
4080 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
4081 AC_SUBST(HAVE_ALLOCA_H)
4083 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_int; then
4084    GPOINTER_TO_INT="((gint) (ptr))"
4085    GPOINTER_TO_UINT="((guint) (ptr))"
4086    GINT_TO_POINTER="((gpointer) (v))"
4087    GUINT_TO_POINTER="((gpointer) (v))"
4088    GSIZE="int"
4089    GSIZE_FORMAT='"u"'
4090 elif test $ac_cv_sizeof_void_p = $ac_cv_sizeof_long; then
4091    GPOINTER_TO_INT="((gint)(long) (ptr))"
4092    GPOINTER_TO_UINT="((guint)(long) (ptr))"
4093    GINT_TO_POINTER="((gpointer)(glong) (v))"
4094    GUINT_TO_POINTER="((gpointer)(gulong) (v))"
4095    GSIZE="long"
4096    GSIZE_FORMAT='"lu"'
4097 elif test $ac_cv_sizeof_void_p = $ac_cv_sizeof_long_long; then
4098    GPOINTER_TO_INT="((gint)(long long) (ptr))"
4099    GPOINTER_TO_UINT="((guint)(unsigned long long) (ptr))"
4100    GINT_TO_POINTER="((gpointer)(long long) (v))"
4101    GUINT_TO_POINTER="((gpointer)(unsigned long long) (v))"
4102    GSIZE="long long"
4103    GSIZE_FORMAT='"I64u"'
4104 else
4105    AC_MSG_ERROR([unsupported pointer size])
4108 AC_SUBST(GPOINTER_TO_INT)
4109 AC_SUBST(GPOINTER_TO_UINT)
4110 AC_SUBST(GINT_TO_POINTER)
4111 AC_SUBST(GUINT_TO_POINTER)
4112 AC_SUBST(GSIZE)
4113 AC_SUBST(GSIZE_FORMAT)
4114 AC_SUBST(G_GUINT64_FORMAT)
4115 AC_SUBST(G_GINT64_FORMAT)
4116 AC_SUBST(G_GUINT32_FORMAT)
4117 AC_SUBST(G_GINT32_FORMAT)
4120 # END OF EGLIB CHECKS
4123 AC_ARG_WITH([libgdiplus],
4124         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
4125         [], [with_libgdiplus=installed])
4127 # default install location
4128 libgdiplus_install_loc=libgdiplus${libsuffix}
4129 case "$host" in
4130     *-*-*linux*)
4131     libgdiplus_install_loc=libgdiplus${libsuffix}.0
4132     ;;
4133 esac
4135 case $with_libgdiplus in
4136     no)
4137     libgdiplus_loc=
4138     ;;
4140     installed)
4141     libgdiplus_loc=
4142     if test x$cross_compiling = xno; then
4143         if test x$host_darwin = xyes; then
4144             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
4145             if test -x $a; then
4146               libgdiplus_install_loc=$a
4147               libgdiplus_loc=$a
4148             fi
4149         fi
4150     fi
4151     ;;
4153     yes|sibling)
4154     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
4155     ;;
4157     /*) # absolute path, assume it is an install location
4158     libgdiplus_loc=$with_libgdiplus
4159     libgdiplus_install_loc=$with_libgdiplus
4160     ;;
4162     *)
4163     libgdiplus_loc=`pwd`/$with_libgdiplus
4164     ;;
4165 esac
4166 AC_SUBST(libgdiplus_loc)
4167 AC_SUBST(libgdiplus_install_loc)
4169 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)
4170 if test "x$icall_symbol_map" = "xyes"; then
4171    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
4174 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
4175 if test "x$icall_export" = "xyes"; then
4176    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
4179 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
4180 if test "x$icall_tables" = "xno"; then
4181    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
4184 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
4186 if test "x$with_tls" = "x__thread"; then
4187         AC_DEFINE(HAVE_KW_THREAD, 1, [Have __thread keyword])
4188         # Pass the information to libgc
4189         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
4190         AC_MSG_CHECKING(if the tls_model attribute is supported)
4191         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
4192                 ], [
4193                         AC_MSG_RESULT(yes)
4194                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
4195                 ], [
4196                         AC_MSG_RESULT(no)
4197         ])
4200 if test ${TARGET} = ARM; then
4201         dnl ******************************************
4202         dnl *** Check to see what FPU is available ***
4203         dnl ******************************************
4204         AC_MSG_CHECKING(which FPU to use)
4206         #
4207         # This is a bit tricky:
4208         #
4209         # if (__ARM_PCS_VFP) {
4210         #       /* mfloat-abi=hard == VFP with hard ABI */
4211         # } elif (!__SOFTFP__) {
4212         #       /* mfloat-abi=softfp == VFP with soft ABI */
4213         # } else {
4214         #       /* mfloat-abi=soft == no VFP */
4215         # }
4216         #
4217         # The exception is iOS (w/ GCC) where none of the above
4218         # are defined (but iOS always uses the 'softfp' ABI).
4219         #
4220         # No support for FPA.
4221         #
4223         fpu=NONE
4225         # iOS GCC always uses the 'softfp' ABI.
4226         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
4227                 fpu=VFP
4228         fi
4230         # Are we using the 'hard' ABI?
4231         if test x$fpu = xNONE; then
4232                 AC_TRY_COMPILE([], [
4233                         #ifndef __ARM_PCS_VFP
4234                         #error "Float ABI is not 'hard'"
4235                         #endif
4236                 ], [
4237                         fpu=VFP_HARD
4238                 ], [
4239                         fpu=NONE
4240                 ])
4241         fi
4243         # No 'hard' ABI. 'soft' or 'softfp'?
4244         if test x$fpu = xNONE; then
4245                 AC_TRY_COMPILE([], [
4246                         #ifdef __SOFTFP__
4247                         #error "Float ABI is not 'softfp'"
4248                         #endif
4249                 ], [
4250                         fpu=VFP
4251                 ], [
4252                         fpu=NONE
4253                 ])
4254         fi
4256         if test x$arm_fpu != x; then
4257            fpu=$arm_fpu
4258         fi
4260         AC_MSG_RESULT($fpu)
4261         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
4262         unset fpu
4264         dnl *********************************************
4265         dnl *** Check which ARM version(s) we can use ***
4266         dnl *********************************************
4267         AC_MSG_CHECKING(which ARM version to use)
4269         AC_TRY_COMPILE([], [
4270                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
4271                 #error Not on ARM v5.
4272                 #endif
4273         ], [
4274                 arm_v5=yes
4276                 arm_ver=ARMv5
4277         ], [])
4279         AC_TRY_COMPILE([], [
4280                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
4281                 #error Not on ARM v6.
4282                 #endif
4283         ], [
4284                 arm_v5=yes
4285                 arm_v6=yes
4287                 arm_ver=ARMv6
4288         ], [])
4290         AC_TRY_COMPILE([], [
4291                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
4292                 #error Not on ARM v7.
4293                 #endif
4294         ], [
4295                 arm_v5=yes
4296                 arm_v6=yes
4297                 arm_v7=yes
4299                 arm_ver=ARMv7
4300         ], [])
4302         AC_MSG_RESULT($arm_ver)
4304         if test x$arm_v5 = xyes; then
4305                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
4306                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
4307         fi
4309         if test x$arm_v6 = xyes; then
4310                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
4311                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
4312         fi
4314         if test x$arm_v7 = xyes; then
4315                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
4316                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
4317         fi
4320 if test ${TARGET} = unknown; then
4321         CPPFLAGS="$CPPFLAGS -DNO_PORT"
4322         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
4325 if test "x$platform_android" = "xyes"; then
4326         case "x${TARGET}" in
4327         xARM)
4328                 case "x$arm_ver" in
4329                 xARMv5)
4330                         BTLS_SUPPORTED=yes
4331                         BTLS_PLATFORM=android-armv5
4332                         ;;
4333                 xARMv6)
4334                         BTLS_SUPPORTED=yes
4335                         BTLS_PLATFORM=android-armv6
4336                         ;;
4337                 xARMv7)
4338                         BTLS_SUPPORTED=yes
4339                         BTLS_PLATFORM=android-armv7
4340                         ;;
4341                 *)
4342                         BTLS_SUPPORTED=no
4343                         ;;
4344                 esac
4345                 ;;
4346         xARM64)
4347                 BTLS_SUPPORTED=yes
4348                 BTLS_PLATFORM=android-v8a
4349                 ;;
4350         xX86)
4351                 BTLS_SUPPORTED=yes
4352                 BTLS_PLATFORM=android-x86
4353                 ;;
4354         xAMD64)
4355                 BTLS_SUPPORTED=yes
4356                 BTLS_PLATFORM=android-x64
4357                 ;;
4358         *)
4359                 BTLS_SUPPORTED=no
4360                 ;;
4361         esac
4364 if test ${ACCESS_UNALIGNED} = no; then
4365         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
4368 if test x$host_darwin = xyes; then
4369         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
4370         AS_IF(
4371                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
4372                 [AC_MSG_RESULT([no])],
4373                 [
4374                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
4375                         AR_FLAGS="Scru"
4376                         RANLIB="$RANLIB -no_warning_for_no_symbols"
4377                         AC_MSG_RESULT([yes])
4378                 ]
4379         )
4382 case "x$libgc" in
4383         xincluded)
4384                 # Pass CPPFLAGS to libgc configure
4385                 # We should use a separate variable for this to avoid passing useless and
4386                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
4387                 # This should be executed late so we pick up the final version of CPPFLAGS
4388                 # The problem with this approach, is that during a reconfigure, the main
4389                 # configure scripts gets invoked with these arguments, so we use separate
4390                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
4391                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
4392                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
4393                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
4394                 fi
4395                 # Don't pass -finstrument-for-thread-suspension in, 
4396                 # if these are instrumented it will be very bad news 
4397                 # (infinite recursion, undefined parking behavior, etc)
4398                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
4399                 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\""
4400                 if test "x$support_boehm" = "xyes"; then
4401                         AC_CONFIG_SUBDIRS(libgc)
4402                 fi
4403                 ;;
4404 esac
4406 MALLOC_MEMPOOLS=no
4407 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
4408         if test x$with_malloc_mempools = xyes; then
4409                 MALLOC_MEMPOOLS=yes
4410                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
4411         fi
4415 DISABLE_MCS_DOCS=default
4416 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
4417         if test x$with_mcs_docs != xyes; then
4418                 DISABLE_MCS_DOCS=yes
4419         fi
4421 if test -n "$INSTALL_4_x_TRUE"; then :
4422         DISABLE_MCS_DOCS=yes
4424 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
4425    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
4428 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)],[
4429         if test x$with_lazy_gc_thread_creation != xno ; then
4430                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
4431         fi
4432 ], [with_lazy_gc_thread_creation=no])
4434 AC_ARG_WITH(cooperative_gc, [  --with-cooperative-gc=yes|no      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [], [with_cooperative_gc=default])
4436 if test x$with_cooperative_gc = xdefault; then
4437         with_cooperative_gc=$with_cooperative_gc_default
4440 if test x$with_cooperative_gc != xno; then
4441         AC_DEFINE(USE_COOP_GC,1,[Enable cooperative stop-the-world garbage collection.])
4444 AM_CONDITIONAL([ENABLE_COOP], [test x$with_cooperative_gc != xno])
4446 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],[
4448         if test x$enable_checked_build != x ; then
4449                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
4450         fi
4451         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
4452                 eval "mono_checked_build_test_enable_$feature='yes'"
4453         done
4455         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
4456                 eval "mono_checked_build_test_enable_gc='yes'"
4457                 eval "mono_checked_build_test_enable_metadata='yes'"
4458                 eval "mono_checked_build_test_enable_thread='yes'"
4459                 eval "mono_checked_build_test_enable_private_types='yes'"
4460         fi
4462         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
4463                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
4464         fi
4466         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
4467                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
4468         fi
4470         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
4471                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
4472         fi
4474         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
4475                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
4476         fi
4477 ], [])
4479 AC_CHECK_HEADER([malloc.h], 
4480                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
4481                         [Define to 1 if you have /usr/include/malloc.h.])],,)
4483 if test x"$GCC" = xyes; then
4484         # Implicit function declarations are not 64 bit safe
4485         # Do this late, since this causes lots of configure tests to fail
4486         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
4487         # jay has a lot of implicit declarations
4488         JAY_CFLAGS="-Wno-implicit-function-declaration"
4491 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
4492 # instead of libmono-static.a
4493 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
4494    LIBMONO_LA=libmini-static.la
4495 else
4496    if test x$buildsgen = xyes; then
4497       LIBMONO_LA=libmonosgen-$API_VER.la
4498    else
4499       LIBMONO_LA=libmonoboehm-$API_VER.la
4500    fi
4502 AC_SUBST(LIBMONO_LA)
4504 dnl **************
4505 dnl ***  Btls  ***
4506 dnl **************
4508 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
4509 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
4511 AM_CONDITIONAL(BTLS, test x$enable_btls = xyes)
4513 btls_android=no
4514 if test "x$enable_btls" = "xyes"; then
4515         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
4516         if test "x$CMAKE" = "xno"; then
4517                 AC_MSG_ERROR("cmake not found")
4518         fi
4520         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
4521         AC_SUBST(BTLS_ROOT)
4523         btls_arch=
4524         btls_cflags=
4525         BTLS_CMAKE_ARGS=
4527         case "$BTLS_PLATFORM" in
4528         i386)
4529                 btls_arch=i386
4530                 btls_cflags="-m32"
4531                 case $host_os in
4532                         darwin*)
4533                                 btls_cflags="$btls_cflags -arch i386"
4534                 esac
4535                 ;;
4536         x86_64)
4537                 btls_arch=x86_64
4538                 ;;
4539         arm)
4540                 btls_arch=arm
4541                 ;;
4542         armsoft)
4543                 btls_arch=arm
4544                 btls_cflags="-DOPENSSL_NO_ASM=1"
4545                 ;;
4546         aarch64)
4547                 btls_arch=aarch64
4548                 ;;
4549         android-armv5)
4550                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
4551                 ;;
4552         android-armv6)
4553                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
4554                 ;;
4555         android-armv7)
4556                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=14"
4557                 ;;
4558         android-v8a)
4559                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=21"
4560                 ;;
4561         android-x86)
4562                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=14"
4563                 ;;
4564         android-x64)
4565                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=21"
4566                 ;;
4567         *)
4568                 AC_MSG_ERROR(Invalid BTLS platform)
4569         esac
4571         if test "x$platform_android" = "xyes"; then
4572                 btls_android=yes
4573                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
4574                 if test "x$with_btls_android_ndk" != "x"; then
4575                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
4576                 else
4577                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
4578                 fi
4579         fi
4581         if test "x$btls_arch" != "x"; then
4582                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
4583         fi
4585         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
4586         AC_SUBST(BTLS_ARCH)
4587         AC_SUBST(BTLS_CFLAGS)
4588         AC_SUBST(BTLS_PLATFORM)
4589         AC_SUBST(BTLS_CMAKE_ARGS)
4591         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
4592 else
4593         enable_btls=no
4596 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
4598 if test x$DISABLE_MCS_DOCS = xyes; then
4599    docs_dir=""
4600 else
4601    docs_dir=docs
4603 AC_SUBST(docs_dir)
4605 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
4606 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
4607 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
4609 libmono_ldflags="$libmono_ldflags $LIBS"
4611 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
4612 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
4613 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
4614 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
4615 AM_CONDITIONAL(X86, test x$TARGET = xX86)
4616 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
4617 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
4618 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
4619 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
4620 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
4621 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64)
4622 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
4623 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
4624 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
4625 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
4626 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
4627 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
4628 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
4630 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
4632 AC_SUBST(LIBC)
4633 AC_SUBST(INTL)
4634 AC_SUBST(SQLITE)
4635 AC_SUBST(SQLITE3)
4636 AC_SUBST(X11)
4637 AC_SUBST(GDKX11)
4638 AC_SUBST(GTKX11)
4639 AC_SUBST(XINERAMA)
4640 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
4641 AC_SUBST(arch_target)
4642 AC_SUBST(CFLAGS)
4643 AC_SUBST(CPPFLAGS)
4644 AC_SUBST(LDFLAGS)
4646 #This must always be defined when building the runtime
4647 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
4649 mono_build_root=`pwd`
4650 AC_SUBST(mono_build_root)
4652 mono_runtime=mono/mini/mono
4653 AC_SUBST(mono_runtime)
4655 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/Microsoft.Net.Compilers.2.6.0/tools/csc.exe
4657 if test $csc_compiler = mcs; then
4658   CSC=$mcs_topdir/class/lib/build/mcs.exe
4659 else
4660   CSC=$CSC_LOCATION
4663 mono_cfg_root=$mono_build_root/runtime
4664 if test x$host_win32 = xyes; then
4665   if test "x$cross_compiling" = "xno"; then
4666     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
4667     CSC=`cygpath -m -a $CSC`
4668     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
4669   else
4670     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
4671   fi
4672 else
4673   mono_cfg_dir=$mono_cfg_root/etc
4675 AC_SUBST(mono_cfg_dir)
4677 AC_SUBST(CSC)
4679 AC_CONFIG_FILES([po/mcs/Makefile.in])
4681 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
4682 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
4684 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
4685 [   depth=../../../..
4686     case $srcdir in
4687     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4688     .) reldir=$depth ;;
4689     *) reldir=$depth/$srcdir ;;
4690     esac
4691     $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
4692     cd runtime/etc/mono/1.0
4693     rm -f machine.config
4694     $LN_S $reldir/data/net_1_1/machine.config machine.config
4695     cd $depth
4696 ],[LN_S='$LN_S'])
4698 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
4699 [   depth=../../../..
4700     case $srcdir in
4701     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4702     .) reldir=$depth ;;
4703     *) reldir=$depth/$srcdir ;;
4704     esac
4705     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
4706     cd runtime/etc/mono/2.0
4707     rm -f machine.config
4708     $LN_S $reldir/data/net_2_0/machine.config machine.config
4709     cd $depth
4710 ],[LN_S='$LN_S'])
4712 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
4713 [   depth=../../../..
4714     case $srcdir in
4715     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4716     .) reldir=$depth ;;
4717     *) reldir=$depth/$srcdir ;;
4718     esac
4719     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
4720     cd runtime/etc/mono/2.0
4721     rm -f web.config
4722     $LN_S $reldir/data/net_2_0/web.config web.config
4723     cd $depth
4724 ],[LN_S='$LN_S'])
4726 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
4727 [   depth=../../..
4728     case $srcdir in
4729     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4730     .) reldir=$depth ;;
4731     *) reldir=$depth/$srcdir ;;
4732     esac
4733     $ac_aux_dir/install-sh -d runtime/etc/mono/
4734     cd runtime/etc/mono/
4735     rm -f browscap.ini
4736     $LN_S $reldir/data/browscap.ini browscap.ini
4737     cd $depth
4738 ],[LN_S='$LN_S'])
4740 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
4741 [   depth=../../../../..
4742     case $srcdir in
4743     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4744     .) reldir=$depth ;;
4745     *) reldir=$depth/$srcdir ;;
4746     esac
4747     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
4748     cd runtime/etc/mono/2.0/Browsers
4749     rm -f Compat.browser
4750     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
4751     cd $depth
4752 ],[LN_S='$LN_S'])
4754 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
4755 [   depth=../../../../..
4756     case $srcdir in
4757     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4758     .) reldir=$depth ;;
4759     *) reldir=$depth/$srcdir ;;
4760     esac
4761     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
4762     cd runtime/etc/mono/4.0/Browsers
4763     rm -f Compat.browser
4764     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
4765     cd $depth
4766 ],[LN_S='$LN_S'])
4768 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
4769 [   depth=../../../../..
4770     case $srcdir in
4771     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4772     .) reldir=$depth ;;
4773     *) reldir=$depth/$srcdir ;;
4774     esac
4775     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
4776     cd runtime/etc/mono/4.5/Browsers
4777     rm -f Compat.browser
4778     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
4779     cd $depth
4780 ],[LN_S='$LN_S'])
4782 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
4783 [   depth=../../../..
4784     case $srcdir in
4785     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4786     .) reldir=$depth ;;
4787     *) reldir=$depth/$srcdir ;;
4788     esac
4789     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
4790     cd runtime/etc/mono/4.0
4791     rm -f machine.config
4792     $LN_S $reldir/data/net_4_0/machine.config machine.config
4793     cd $depth
4794 ],[LN_S='$LN_S'])
4796 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
4797 [   depth=../../../..
4798     case $srcdir in
4799     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4800     .) reldir=$depth ;;
4801     *) reldir=$depth/$srcdir ;;
4802     esac
4803     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
4804     cd runtime/etc/mono/4.0
4805     rm -f web.config
4806     $LN_S $reldir/data/net_4_0/web.config web.config
4807     cd $depth
4808 ],[LN_S='$LN_S'])
4810 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
4811 [   depth=../../../..
4812     case $srcdir in
4813     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4814     .) reldir=$depth ;;
4815     *) reldir=$depth/$srcdir ;;
4816     esac
4817     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
4818     cd runtime/etc/mono/4.5
4819     rm -f machine.config
4820     $LN_S $reldir/data/net_4_5/machine.config machine.config
4821     cd $depth
4822 ],[LN_S='$LN_S'])
4824 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
4825 [   depth=../../../..
4826     case $srcdir in
4827     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4828     .) reldir=$depth ;;
4829     *) reldir=$depth/$srcdir ;;
4830     esac
4831     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
4832     cd runtime/etc/mono/4.5
4833     rm -f web.config
4834     $LN_S $reldir/data/net_4_5/web.config web.config
4835     cd $depth
4836 ],[LN_S='$LN_S'])
4838 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])
4839 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])
4841 AC_OUTPUT([
4842 Makefile
4843 mono-uninstalled.pc
4844 acceptance-tests/Makefile
4845 llvm/Makefile
4846 scripts/mono-find-provides
4847 scripts/mono-find-requires
4848 mono/Makefile
4849 mono/btls/Makefile
4850 mono/utils/Makefile
4851 mono/utils/jemalloc/Makefile
4852 mono/metadata/Makefile
4853 mono/dis/Makefile
4854 mono/cil/Makefile
4855 mono/arch/Makefile
4856 mono/arch/x86/Makefile
4857 mono/arch/amd64/Makefile
4858 mono/arch/ppc/Makefile
4859 mono/arch/sparc/Makefile
4860 mono/arch/s390x/Makefile
4861 mono/arch/arm/Makefile
4862 mono/arch/arm64/Makefile
4863 mono/arch/mips/Makefile
4864 mono/sgen/Makefile
4865 mono/tests/Makefile
4866 mono/tests/tests-config
4867 mono/tests/gc-descriptors/Makefile
4868 mono/tests/testing_gac/Makefile
4869 mono/unit-tests/Makefile
4870 mono/benchmark/Makefile
4871 mono/mini/Makefile
4872 mono/profiler/Makefile
4873 mono/eglib/Makefile
4874 mono/eglib/eglib-config.h
4875 m4/Makefile
4876 ikvm-native/Makefile
4877 scripts/Makefile
4878 man/Makefile
4879 docs/Makefile
4880 data/Makefile
4881 data/net_2_0/Makefile
4882 data/net_4_0/Makefile
4883 data/net_4_5/Makefile
4884 data/net_2_0/Browsers/Makefile
4885 data/net_4_0/Browsers/Makefile
4886 data/net_4_5/Browsers/Makefile
4887 data/mint.pc
4888 data/mono-2.pc
4889 data/monosgen-2.pc
4890 data/mono.pc
4891 data/mono-cairo.pc
4892 data/mono-nunit.pc
4893 data/mono-options.pc
4894 data/mono-lineeditor.pc
4895 data/monodoc.pc
4896 data/dotnet.pc
4897 data/dotnet35.pc
4898 data/wcf.pc
4899 data/cecil.pc
4900 data/system.web.extensions_1.0.pc
4901 data/system.web.extensions.design_1.0.pc
4902 data/system.web.mvc.pc
4903 data/system.web.mvc2.pc
4904 data/system.web.mvc3.pc
4905 data/aspnetwebstack.pc
4906 data/reactive.pc
4907 samples/Makefile
4908 support/Makefile
4909 data/config
4910 tools/Makefile
4911 tools/locale-builder/Makefile
4912 tools/sgen/Makefile
4913 tools/monograph/Makefile
4914 tools/pedump/Makefile
4915 runtime/Makefile
4916 msvc/Makefile
4917 po/Makefile
4920 # Update all submodules recursively to ensure everything is checked out
4921 $srcdir/scripts/update_submodules.sh
4923 if test x$host_win32 = xyes; then
4924    # Get rid of 'cyg' prefixes in library names
4925    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
4926    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
4927    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
4928    # executable doesn't work...
4929    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
4932 if test x$host_darwin = xyes; then
4933    # This doesn't seem to be required and it slows down parallel builds
4934    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
4938   case $prefix in
4939   NONE) prefix=$ac_default_prefix ;;
4940   esac
4941   case $exec_prefix in
4942   NONE) exec_prefix='${prefix}' ;;
4943   esac
4945   #
4946   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
4947   # any existing config.make.  This allows people to share the same source tree
4948   # with different build directories, one native and one cross
4949   #
4950   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
4952     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
4954     echo "prefix=$prefix" > $mcs_topdir/build/config.make
4955     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
4956     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
4957     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
4958     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
4959     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
4960     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
4961     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
4962     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
4964     case $INSTALL in
4965     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
4966     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
4967     esac
4969     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
4971     export VERSION
4972     [myver=$($AWK 'BEGIN {
4973       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
4974       if(length(vsplit [1]) > 4) {
4975         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
4976       }
4977       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
4978     }')]
4980     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
4981     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
4983     if test x$host_darwin = xyes; then
4984       echo "BUILD_PLATFORM = darwin" >> $mcs_topdir/build/config.make
4985     elif test x$host_win32 = xyes; then
4986       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
4987     else
4988       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
4989     fi
4991     if test x$host_darwin = xyes; then
4992       echo "HOST_PLATFORM ?= darwin" >> $mcs_topdir/build/config.make
4993     elif test x$host_win32 = xyes; then
4994       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
4995     else
4996       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
4997     fi
4999     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
5000       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
5001     fi
5003         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
5004            enable_system_aot=yes
5005         fi
5007     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
5008       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
5009     fi
5011     if test x$DISABLE_MCS_DOCS = xyes; then
5012       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
5013     fi
5015     if test x$has_extension_module != xno; then
5016         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
5017     fi
5018     
5019     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
5020     
5021     if test "x$test_bcl_opt" = "xyes"; then    
5022       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
5023     fi
5025     echo "CSC_LOCATION = $CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
5027     if test $csc_compiler = mcs; then
5028       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
5029     fi
5031     if test "x$AOT_BUILD_FLAGS" != "x" ; then
5032       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
5033       echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
5034       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
5035     fi
5037     if test "x$AOT_MODE" != "x" ; then
5038       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
5039     fi
5041     if test "x$enable_btls" = "xyes"; then
5042       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
5043     fi
5045   fi
5049 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
5051 btls_platform_string=
5052 if test x$enable_btls = xyes; then
5053         if test x$btls_android = xyes; then
5054                 btls_platform_string=" (android:$BTLS_PLATFORM)"
5055         else
5056                 btls_platform_string=" ($BTLS_PLATFORM)"
5057         fi
5060 echo "
5061         mcs source:    $mcsdir
5062         C# Compiler:   $csc_compiler
5064    Engine:
5065         Host:          $host
5066         Target:        $target
5067         GC:            $gc_msg 
5068         TLS:           $with_tls
5069         SIGALTSTACK:   $with_sigaltstack
5070         Engine:        $jit_status
5071         BigArrays:     $enable_big_arrays
5072         DTrace:        $enable_dtrace
5073         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm)
5074         Spectre:       $spectre_mitigation_status
5076    Libraries:
5077         .NET 4.x:        $with_profile4_x
5078         Xamarin.Android: $with_monodroid
5079         Xamarin.iOS:     $with_monotouch
5080         Xamarin.WatchOS: $with_monotouch_watch
5081         Xamarin.TVOS:    $with_monotouch_tv
5082         Xamarin.Mac:     $with_xammac
5083         Windows AOT:     $with_winaot
5084         Orbis:           $with_orbis
5085         Unreal:          $with_unreal
5086         WebAssembly:     $with_wasm
5087         Test profiles:   AOT Full ($with_testing_aot_full), AOT Hybrid ($with_testing_aot_hybrid)
5088         JNI support:     $jdk_headers_found
5089         libgdiplus:      $libgdiplus_msg
5090         zlib:            $zlib_msg
5091         BTLS:            $enable_btls$btls_platform_string
5092         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
5093         $disabled
5095 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
5096    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)