[mini] Always emit safepoints, except WASM
[mono-project.git] / configure.ac
blob89b795d94addad48042af7b67f1d5f535d5708ce
1 # Process this file with autoconf to produce a configure script.
2 #AC_PREREQ([2.62])
4 AC_INIT(mono, [5.23.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
23 m4_ifdef([AM_EXTRA_RECURSIVE_TARGETS], AM_EXTRA_RECURSIVE_TARGETS([test]))
24 m4_ifdef([AM_EXTRA_RECURSIVE_TARGETS], AM_EXTRA_RECURSIVE_TARGETS([test-bundle]))
26 API_VER=2.0
27 AC_SUBST(API_VER)
29 AC_PROG_LN_S
31 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
33 MONO_VERSION_MAJOR=`echo $VERSION | cut -d . -f 1`
34 MONO_VERSION_MINOR=`echo $VERSION | cut -d . -f 2`
35 MONO_VERSION_BUILD=`echo $VERSION | cut -d . -f 3`
38 # This is the version of the corlib-runtime interface. When
39 # making changes to this interface (by changing the layout
40 # of classes the runtime knows about, changing icall signature or
41 # semantics etc), change this variable.
43 # This must be unique relative to corlib interface/semantics.
45 # Generate it with uuidgen. For example:
46 # perl -pi.bak -e "s/^MONO_CORLIB_VERSION=\S+/MONO_CORLIB_VERSION=`uuidgen`/" configure.ac
48 # There is no ordering of corlib versions, no old or new,
49 # the runtime expects an exact match.
51 MONO_CORLIB_VERSION=28B18F53-22DE-423B-B0A8-8ED64B1B5F00
54 # Put a quoted #define in config.h.
55 # Substitute @MONO_CORLIB_VERSION@ unquoted.
57 AC_DEFINE_UNQUOTED(MONO_CORLIB_VERSION,"$MONO_CORLIB_VERSION",[Version of the corlib-runtime interface])
58 AC_SUBST(MONO_CORLIB_VERSION)
60 case $host_os in
61 *cygwin* )
62                  echo "Run configure using ./configure --host=i686-w64-mingw32 or --host=x86_64-w64-mingw32"
63                  exit 1
64 esac
66 # In case of cygwin, override LN_S, irrespective of what it determines.
67 # The build uses cygwin, but the actual runtime doesn't.
68 case $host_os in
69 *cygwin* ) LN_S='cp -p';;
70 esac
73 # libgc defaults
75 libgc_configure_args=
77 # These variables are the CPPFLAGS/CFLAGS passed to libgc's configure
78 # libgc should inherit the original CFLAGS/CPPFLAGS passed to configure, i.e. -O0
79 CPPFLAGS_FOR_LIBGC=$CPPFLAGS
80 CFLAGS_FOR_LIBGC=$CFLAGS
81 CPPFLAGS_FOR_BTLS=$CPPFLAGS
82 CFLAGS_FOR_BTLS=$CFLAGS
84 # libgc uses some deprecated APIs
85 CFLAGS_FOR_LIBGC="$CFLAGS -Wno-deprecated-declarations"
88 # These are the flags that need to be stored in the mono.pc file for 
89 # compiling code that will embed Mono
91 libmono_cflags=""
92 libmono_ldflags=""
93 AC_SUBST(libmono_cflags)
94 AC_SUBST(libmono_ldflags)
96 # Variable to have relocatable .pc files (lib, or lib64)
97 # realpath isn't always available, and requires that all but the tip of the provided
98 # path exists. Fall back to the old behaviour, but realpath allows depth >1
99 # e.g. Debian puts Mono in /usr/bin and libs in /usr/lib/x86_64-linux-gnu/ which is
100 # too deep for the old method to work
101 reloc_libdir=`realpath --relative-to=${prefix} ${libdir} 2> /dev/null || basename ${libdir}`
102 AC_SUBST(reloc_libdir)
104 # Set to yes if Unix sockets cannot be created in an anonymous namespace
105 need_link_unlink=no
107 #Set to extra linker flags to be passed to the runtime binaries (mono /mono-sgen)
108 extra_runtime_ldflags=""
110 # Thread configuration inspired by sleepycat's db
111 AC_MSG_CHECKING([host platform characteristics])
113 libgc_threads=no
114 has_dtrace=no
115 parallel_mark=yes
116 ikvm_native=yes
118 host_win32=no
119 target_win32=no
120 platform_android=no
121 platform_tizen=no
122 platform_ios=no
123 host_darwin=no
124 host_linux=no
126 case "$host" in
127         wasm32*)
128                 CFLAGS="$CFLAGS -D_REENTRANT -D_GNU_SOURCE -s WASM=1"
129                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DUSE_MMAP -s WASM=1"
130                 libdl="-ldl"
131                 libgc_threads=pthreads
132                 platform_wasm=yes
133                 ;;
134         *-mingw*|*-*-cygwin*)
135                 AC_DEFINE(DISABLE_PORTABILITY,1,[Disable the io-portability layer])
136                 AC_DEFINE(HOST_NO_SYMLINKS,1,[This platform does not support symlinks])
137                 host_win32=yes
138                 mono_cv_clang=no
139                 if test "x$cross_compiling" = "xno"; then
140                         if test "x$host" = "x$build" -a "x$host" = "x$target"; then
141                                 target_win32=yes
142                         fi
143                 else
144                         if test "x$host" = "x$target"; then
145                                 target_win32=yes
146                         fi
147                 fi
148                 HOST_CC="gcc"
150                 # Windows 7 or later is required
151                 WIN32_CPPFLAGS="-DWINVER=0x0601 -D_WIN32_WINNT=0x0601 -D_WIN32_IE=0x0501 -D_UNICODE -DUNICODE -DWIN32_THREADS -DFD_SETSIZE=1024"
152                 CPPFLAGS="$CPPFLAGS $WIN32_CPPFLAGS"
153                 WIN32_LDFLAGS="-lbcrypt -lmswsock -lws2_32 -lole32 -loleaut32 -lpsapi -lversion -ladvapi32 -lwinmm -lkernel32 -liphlpapi"
154                 LDFLAGS="$LDFLAGS $WIN32_LDFLAGS"
155                 libmono_cflags="-mms-bitfields -mwindows"
156                 libmono_ldflags="-mms-bitfields -mwindows"
157                 libdl=
158                 libgc_threads=win32
159                 with_sigaltstack=no
160                 with_tls=pthread
161                 with_sgen_default_concurrent=yes
162                 LN_S=cp
163                 # This forces libgc to use the DllMain based thread registration code on win32
164                 libgc_configure_args="$libgc_configure_args --enable-win32-dllmain=yes"
165                 ;;
166         *-*-*netbsd*)
167                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DGC_NETBSD_THREADS -D_GNU_SOURCE"
168                 libmono_cflags="-D_REENTRANT"
169                 LDFLAGS="$LDFLAGS -pthread"
170                 CPPFLAGS="$CPPFLAGS -DHOST_BSD"
171                 libmono_ldflags="-pthread"
172                 need_link_unlink=yes
173                 libdl="-ldl"
174                 libgc_threads=pthreads
175                 with_sigaltstack=no
176                 use_sigposix=yes
177                 with_sgen_default_concurrent=yes
178                 ;;
179         *-*-kfreebsd*-gnu)
180                 CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP -DUSE_MUNMAP -DTHREAD_LOCAL_ALLOC -pthread"
181                 libmono_cflags="-D_REENTRANT -DTHREAD_LOCAL_ALLOC -pthread"
182                 libmono_ldflags="-lpthread -pthread"
183                 libdl="-ldl"
184                 libgc_threads=pthreads
185                 need_link_unlink=yes
186                 with_sigaltstack=no
187                 use_sigposix=yes
188                 with_sgen_default_concurrent=yes
189                 ;;
190         *-*-*freebsd*)
191                 dnl For close_my_fds
192                 LDFLAGS="$LDFLAGS -lutil"
193                 if test "x$PTHREAD_CFLAGS" = "x"; then
194                         CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS"
195                         libmono_cflags=
196                 else
197                         CPPFLAGS="$CPPFLAGS $PTHREAD_CFLAGS -DGC_FREEBSD_THREADS"
198                         libmono_cflags="$PTHREAD_CFLAGS"
199                 fi
200                 if test "x$PTHREAD_LIBS" = "x"; then
201                         LDFLAGS="$LDFLAGS -pthread -L/usr/local/lib"
202                         libmono_ldflags="-pthread"
203                 else
204                         LDFLAGS="$LDFLAGS $PTHREAD_LIBS -L/usr/local/lib"
205                         libmono_ldflags="$PTHREAD_LIBS"
206                 fi
207                 CPPFLAGS="$CPPFLAGS -DHOST_BSD -D_WITH_GETLINE"
208                 need_link_unlink=yes
209                 AC_DEFINE(PTHREAD_POINTER_ID, 1, [pthread is a pointer])
210                 libdl=
211                 libgc_threads=pthreads
212                 use_sigposix=yes
213                 has_dtrace=yes
214                 case "$host" in
215                 aarch64-*)
216                         support_boehm=no
217                         with_gc=sgen
218                         ;;
219                 riscv*)
220                         support_boehm=no
221                         with_gc=sgen
222                         ;;
223                 esac
224                 with_sgen_default_concurrent=yes
225                 ;;
226         *-*-*openbsd*)
227                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_OPENBSD_THREADS -DHOST_BSD -D_REENTRANT -DUSE_MMAP"
228                 LDFLAGS="${LDFLAGS} -Wl,-zwxneeded"
229                 if test "x$disable_munmap" != "xyes"; then
230                 CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
231                 fi
232                 libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
233                 LDFLAGS="$LDFLAGS -pthread"
234                 need_link_unlink=yes
235                 AC_DEFINE(PTHREAD_POINTER_ID)
236                 libdl=
237                 libgc_threads=pthreads
238                 with_tls=pthread
239                 with_sigaltstack=no
240                 use_sigposix=yes
241                 with_sgen_default_concurrent=yes
242                 ;;
243         *-*-linux-android*)
244                 platform_android=yes
245                 AC_DEFINE(HOST_ANDROID,1,[Targeting the Android platform])
246                 AC_DEFINE(TARGET_ANDROID,1,[Targeting the Android platform])
248                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
249                 if test "x$disable_munmap" != "xyes"; then
250                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
251                 fi
252                 libmono_cflags="-D_REENTRANT"
253                 libdl="-ldl"
254                 libgc_threads=pthreads
255                 use_sigposix=yes
257                 with_tls=pthread
258                 with_sigaltstack=no
259                 with_static_mono=no
261                 # Android doesn't support boehm, as it's missing <link.h>
262                 support_boehm=no
263                 with_gc=sgen
265                 # isinf(3) requires -lm
266                 LDFLAGS="$LDFLAGS -lm"
268                 # Bionic's <pthread.h> sets PTHREAD_STACK_MIN=2*PAGE_SIZE; doesn't define
269                 # PAGE_SIZE; breaks mono/io-layer/collection.c
270                 # Bionic doesn't provide S_IWRITE; breaks io-layer/io.c
271                 CFLAGS="$CFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
272                 CXXFLAGS="$CXXFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
274                 # to bypass the underscore linker check, can't work when cross-compiling
275                 mono_cv_uscore=yes
276                 mono_cv_clang=no
277                 ;;
278         *-*-linux*)
279                 host_linux=yes
280                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
281                 if test "x$disable_munmap" != "xyes"; then
282                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
283                 fi
284                 libmono_cflags="-D_REENTRANT"
285                 libdl="-ldl"
286                 libgc_threads=pthreads
287                 use_sigposix=yes
288                 if test "x$cross_compiling" != "xno"; then
289                         # to bypass the underscore linker check, not
290                         # available during cross-compilation
291                         mono_cv_uscore=no
292                 fi
293                 case "$host" in
294                 *-tizen-linux-*)
295                         platform_tizen=yes
296                         ;;
297                 esac
298                 case "$host" in
299                 aarch64-*)
300                         support_boehm=no
301                         with_gc=sgen
302                         ;;
303                 powerpc*-*-linux*)
304                         # https://bugzilla.novell.com/show_bug.cgi?id=504411
305                         disable_munmap=yes
306                         ;;
307                 riscv*)
308                         support_boehm=no
309                         with_gc=sgen
310                         ;;
311                 esac
312                 with_sgen_default_concurrent=yes
313                 ;;
314         *-*-nacl*)
315                 echo "nacl no longer supported."
316                 exit 1
317                 ;;
318         *-*-hpux*)
319                 CPPFLAGS="$CPPFLAGS -DGC_HPUX_THREADS -D_HPUX_SOURCE -D_XOPEN_SOURCE_EXTENDED -D_REENTRANT"
320                 # +ESdbgasm only valid on bundled cc on RISC
321                 # silently ignored for ia64
322                 if test $GCC != "yes"; then
323                         CFLAGS="$CFLAGS +ESdbgasm"
324                         # Arrange for run-time dereferencing of null
325                         # pointers to produce a SIGSEGV signal.
326                         LDFLAGS="$LDFLAGS -z"
327                 fi
328                 CFLAGS="$CFLAGS +ESdbgasm"
329                 LDFLAGS="$LDFLAGS -z"
330                 libmono_cflags="-D_REENTRANT"
331                 libmono_ldflags="-lpthread"
332                 libgc_threads=pthreads
333                 need_link_unlink=yes
334                 use_sigposix=yes
335                 ;;
336         *-*-solaris*)
337                 CPPFLAGS="$CPPFLAGS -DGC_SOLARIS_THREADS -DGC_SOLARIS_PTHREADS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -DUSE_MMAP -DUSE_MUNMAP -DHOST_SOLARIS"
338                 need_link_unlink=yes
339                 libmono_cflags="-D_REENTRANT"
340                 libgc_threads=pthreads
341                 has_dtrace=yes
342                 use_sigposix=yes
343                 enable_solaris_tar_check=yes
344                 ;;
345         *-*-darwin*)
346                 parallel_mark="Disabled_Currently_Hangs_On_MacOSX"
347                 host_darwin=yes
348                 target_mach=yes
349                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_MACOSX_THREADS -DUSE_MMAP -DUSE_MUNMAP"
350                 libmono_cflags="-D_THREAD_SAFE"
351                 need_link_unlink=yes
352                 AC_DEFINE(PTHREAD_POINTER_ID)
353                 AC_DEFINE(USE_MACH_SEMA, 1, [...])
354                 libdl=
355                 libgc_threads=pthreads
356                 has_dtrace=yes
357                 if test "x$cross_compiling" = "xyes"; then
358                         has_broken_apple_cpp=yes
359                 fi
360                 dnl Snow Leopard is horribly broken -- it reports itself as i386-apple-darwin*, but
361                 dnl its gcc defaults to 64-bit mode.  They have also deprecated the usage of ucontext
362                 dnl we need to set some flags to build our 32-bit binaries on 10.6 properly
363                 case "$host" in
364                         dnl Snow Leopard and newer config.guess reports as this
365                         i*86-*-darwin*)
366                                 BROKEN_DARWIN_FLAGS="-arch i386"
367                                 BROKEN_DARWIN_CPPFLAGS=""
368                                 CPPFLAGS="$CPPFLAGS $BROKEN_DARWIN_CPPFLAGS"
369                                 CFLAGS="$CFLAGS $BROKEN_DARWIN_FLAGS"
370                                 CXXFLAGS="$CXXFLAGS $BROKEN_DARWIN_FLAGS"
371                                 CCASFLAGS="$CCASFLAGS $BROKEN_DARWIN_FLAGS"
372                                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC $BROKEN_DARWIN_CPPFLAGS"
373                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC $BROKEN_DARWIN_FLAGS"
374                                 with_sgen_default_concurrent=yes
375                                 ;;
376                         x*64-*-darwin*)
377                                 with_sgen_default_concurrent=yes
378                                 ;;
379                         arm*-darwin*)
380                                 platform_ios=yes
381                                 has_dtrace=no
382                                 ;;
383                         aarch64*-darwin*)
384                                 platform_ios=yes
385                                 ;;
386                 esac
387                 ;;
388         *-*-haiku*)
389                 dnl BSD_SOURCE is for getifaddrs
390                 CPPFLAGS="$CPPFLAGS -D_BSD_SOURCE -D_REENTRANT -D_THREAD_SAFE"
391                 libmono_cflags="-D_REENTRANT -D_THREAD_SAFE"
392                 libdl=
393                 LIBS="$LIBS -lnetwork -ltextencoding"
394                 need_link_unlink=yes
395                 AC_DEFINE(PTHREAD_POINTER_ID)
396                 dnl Haiku does not support static TLS with __thread
397                 with_tls=pthread
398                 libgc_threads=pthreads
399                 use_sigposix=yes
400                 with_sigaltstack=no
401                 ;;
402         *-*-aix*|*-*-os400*)
403                 dnl Set up a 64-bit build
404                 CPPFLAGS="$CPPFLAGS -maix64 -DGC_AIX_THREADS -D_ALL_SOURCE -D_THREAD_SAFE -D_LARGE_FILES -D_REENTRANT"
405                 LDFLAGS="-maix64"
406                 libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
407                 dnl Would you believe GNU nm doesn't know how to process AIX libraries?
408                 dnl Hardcode IBM binutils in case GNU ones end up on our path. Also
409                 dnl specifiy 64-bit mode for tools.
410                 AR="/usr/bin/ar -X64"
411                 NM="/usr/bin/nm -X64"
412                 dnl SGen is the future (changes to Boehm support code would be
413                 dnl required if you wish to re-enable Boehm)
414                 support_boehm=no
415                 with_gc=sgen
416                 need_link_unlink=yes
417                 use_sigposix=yes
418                 dnl the valloc call to alloc the guard page bombs out, even with extending the data area
419                 with_sigaltstack=no
420                 dnl use pthread TLS, __thread has issues with the compiler flags we use
421                 with_tls=pthread
422                 dnl ppc Linux is the same? test further
423                 disable_munmap=yes
424                 ;;
425         *)
426                 AC_MSG_WARN([*** Please add $host to configure.ac checks!])
427                 libdl="-ldl"
428                 ;;
429 esac
431 AC_MSG_RESULT(ok)
433 if test x$need_link_unlink = xyes; then
434    AC_DEFINE(NEED_LINK_UNLINK, 1, [Define if Unix sockets cannot be created in an anonymous namespace])
437 if test x$host_win32 = xyes; then
438    AC_DEFINE(HOST_WIN32, 1, [Host Platform is Win32])
441 if test x$target_win32 = xyes; then
442    AC_DEFINE(TARGET_WIN32, 1, [Target Platform is Win32])
445 if test x$host_darwin = xyes; then
446    AC_DEFINE(HOST_DARWIN, 1, [Host Platform is Darwin])
449 # Defined for all targets/platforms using classic Windows API support.
450 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
451 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
453 AC_SUBST(extra_runtime_ldflags)
454 AM_CONDITIONAL(HOST_WIN32, test x$host_win32 = xyes)
455 AM_CONDITIONAL(TARGET_WIN32, test x$target_win32 = xyes)
456 AM_CONDITIONAL(HOST_LINUX, echo x$target_os | grep -q linux)
457 AM_CONDITIONAL(HOST_DARWIN, test x$host_darwin = xyes)
458 AM_CONDITIONAL(HOST_SIGPOSIX, test x$use_sigposix = xyes)
459 AM_CONDITIONAL(HOST_ANDROID, test x$platform_android = xyes)
460 AM_CONDITIONAL(HOST_TIZEN, test x$platform_tizen = xyes)
461 AM_CONDITIONAL(HOST_IOS, test x$platform_ios = xyes)
462 AM_CONDITIONAL(HOST_WASM, test x$platform_wasm = xyes)
464 if test -z "$HOST_DARWIN_TRUE"; then :
465 PLATFORM_AOT_SUFFIX=.dylib
468 if test -z "$HOST_LINUX_TRUE"; then :
469 PLATFORM_AOT_SUFFIX=.so
472 if test -z "$HOST_WIN32_TRUE"; then :
473 PLATFORM_AOT_SUFFIX=.dll
476 AC_SUBST(PLATFORM_AOT_SUFFIX)
478 ## PLATFORM_AOT_SUFFIX not so simple for windows :-)
480 AC_CHECK_TOOL(CC, gcc, gcc)
481 AC_PROG_CC
482 AC_CHECK_TOOL(CXX, g++, g++)
483 AC_PROG_CXX
484 AM_PROG_AS
485 AC_PROG_INSTALL
486 AC_PROG_AWK
487 AM_PROG_CC_C_O
488 dnl We should use AM_PROG_AS, but it's not available on automake/aclocal 1.4
489 : ${CCAS='$(CC)'}
490 # Set ASFLAGS if not already set.
491 : ${CCASFLAGS='$(CFLAGS)'}
492 AC_SUBST(CCAS)
493 AC_SUBST(CCASFLAGS)
495 # AC_PROG_CXX helpfully sets CXX to g++ even if no c++ compiler is found so check
496 # GXX instead. See http://lists.gnu.org/archive/html/bug-autoconf/2002-04/msg00056.html
497 if test "x$CXX" = "xg++"; then
498         if test "x$GXX" != "xyes"; then
499                 # automake/libtool is so broken, it requires g++ even if the c++ sources
500                 # are inside automake conditionals
501                 AC_MSG_ERROR([You need to install g++])
502         fi
505 dnl may require a specific autoconf version
506 dnl AC_PROG_CC_FOR_BUILD
507 dnl CC_FOR_BUILD not automatically detected
508 CC_FOR_BUILD=$CC
509 CFLAGS_FOR_BUILD=$CFLAGS
510 BUILD_EXEEXT=
511 if test "x$cross_compiling" = "xyes"; then
512         CC_FOR_BUILD=cc
513         CFLAGS_FOR_BUILD=
514         BUILD_EXEEXT=""
516 AC_SUBST(CC_FOR_BUILD)
517 AC_SUBST(CFLAGS_FOR_BUILD)
518 AC_SUBST(HOST_CC)
519 AC_SUBST(BUILD_EXEEXT)
521 AM_CONDITIONAL(CROSS_COMPILING, [test x$cross_compiling = xyes])
522 AM_CONDITIONAL(USE_BATCH_FILES, [test x$host_win32 = xyes -a x$cross_compiling = xyes])
524 # Set STDC_HEADERS
525 AC_HEADER_STDC
526 AC_LIBTOOL_WIN32_DLL
527 # This causes monodis to not link correctly
528 #AC_DISABLE_FAST_INSTALL
530 #lookup makedev() header
531 AC_HEADER_MAJOR
533 AM_PROG_LIBTOOL
534 # Use dolt (http://dolt.freedesktop.org/) instead of libtool for building.
535 DOLT
537 export_ldflags=`(./libtool --config; echo eval echo \\$export_dynamic_flag_spec) | sh`
538 AC_SUBST(export_ldflags)
540 # Test whenever ld supports -version-script
541 AC_PROG_LD
542 AC_PROG_LD_GNU
544 AC_CHECK_HEADERS(sys/filio.h sys/sockio.h netdb.h utime.h sys/utime.h semaphore.h sys/un.h linux/rtc.h sys/syscall.h sys/mkdev.h sys/uio.h sys/param.h sys/sysctl.h libproc.h sys/prctl.h copyfile.h)
545 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)
546 AC_CHECK_HEADERS([linux/netlink.h linux/rtnetlink.h],
547                   [], [], [#include <stddef.h>
548                   #include <sys/socket.h>
549                   #include <linux/socket.h>])
551 AC_CHECK_HEADERS(sys/user.h, [], [],
553 #ifdef HAVE_SYS_PARAM_H
554 # include <sys/param.h>
555 #endif
558 AC_CHECK_HEADERS(linux/serial.h)
560 AC_CHECK_HEADER(zlib.h, [have_zlib=yes], [have_zlib=no])
561 if test x$have_zlib = xyes; then
562    AC_TRY_COMPILE([#include <zlib.h>], [
563    #if defined(ZLIB_VERNUM) && (ZLIB_VERNUM >= 0x1230)
564    #else
565    #error No good zlib found
566    #endif
567    ],[
568         AC_MSG_RESULT(Using system zlib)
569         zlib_msg="system zlib"
570         AC_DEFINE(HAVE_SYS_ZLIB,1,[Have system zlib])
571    ],[
572         AC_MSG_RESULT(Using embedded zlib)
573         have_zlib=no
574         zlib_msg="bundled zlib"
575    ])
578 AM_CONDITIONAL(HAVE_ZLIB, test x$have_zlib = xyes)
579 AC_DEFINE(HAVE_ZLIB,1,[Have system zlib])
581 # for mono/metadata/debug-symfile.c
582 AC_CHECK_HEADERS(elf.h)
584 # for support
585 AC_CHECK_HEADERS(poll.h)
586 AC_CHECK_HEADERS(sys/poll.h)
587 AC_CHECK_HEADERS(sys/wait.h)
588 AC_CHECK_HEADERS(grp.h)
589 AC_CHECK_HEADERS(syslog.h)
590 AC_CHECK_FUNCS(vsyslog)
592 # for mono/dis
593 AC_CHECK_HEADERS(wchar.h)
595 # for Linux statfs support
596 AC_CHECK_HEADERS(linux/magic.h)
598 # For Android NDK unified headers
599 if test x$platform_android = xyes; then
600         AC_CHECK_HEADERS(machine/endian.h sys/endian.h)
601         AC_CHECK_HEADERS(android/legacy_signal_inlines.h, [have_android_signal_inlines=yes], [have_android_signal_inlines=no])
603         # Make sure SIGRT{MIN,MAX} work - they will fail to work with unified headers if building for
604         # API level < 21 *and* android/legacy_signal_inlines.h doesn't declare (and define) the required
605         # libc APIs to obtain values for SIGRT{MIN,MAX}. We perform the check only if android/legacy_signal_inlines.h
606         # is found because in other cases the macros will either work (for NDK < 14) or fail if the legacy header
607         # doesn't contain the required definitions (NDK 14)
608         if test x$have_android_signal_inlines = xyes; then
609                 AC_MSG_CHECKING([Whether Android SIGRTMIN/SGRTMAX macros are valid])
610                 AC_COMPILE_IFELSE([
611                         AC_LANG_PROGRAM([#include <android/legacy_signal_inlines.h>],[
612                                 int i;
613                                 for (i = SIGRTMIN + 1; i < SIGRTMAX; ++i) {
614                                 }
615                         ])],[
616                                 AC_MSG_RESULT(yes)
617                                 android_sigrtminmax_work=yes
618                         ],[
619                                 AC_MSG_RESULT(no)
620                                 android_sigrtminmax_work=no
621                         ]
622                 )
624                 if test x$android_sigrtminmax_work = xno; then
625                         AC_MSG_ERROR([Android SIGRTMIN/SIGRTMAX macros don't work in this NDK])
626                 fi
627         fi
629         # Attempt to detect whether we're using Android NDK unified headers
630         AC_CHECK_HEADERS(android/api-level.h, [have_android_api_level=yes], [have_android_api_level=no])
631         AC_CHECK_HEADERS(android/versioning.h, [have_android_versioning=yes], [have_android_versioning=no])
633         android_unified_headers=no
634         if test x$have_android_api_level = xyes; then
635                 if test x$have_android_versioning = xyes; then
636                         AC_MSG_CHECKING([whether using Android NDK unified headers])
638                         # Both macros are defined only in the NDK unified headers
639                         AC_COMPILE_IFELSE([
640                                 AC_LANG_PROGRAM([
641                                         #include <android/api-level.h>
642                                         #include <android/versioning.h>
643                                 ],[
644                                         #if __ANDROID_API_O__ == 26 && defined(__INTRODUCED_IN)
645                                         #else
646                                                 #error __ANDROID_API_O__ != 26 or the __INTRODUCED_IN macro not defined
647                                         #endif
648                                 ])],[
649                                         AC_MSG_RESULT(yes)
650                                         android_unified_headers=yes
651                                 ],[
652                                         AC_MSG_RESULT(no)
653                                         android_unified_headers=no
654                                 ]
655                         )
656                 fi
657         fi
659         if test x$android_unified_headers = xyes; then
660                 AC_DEFINE(ANDROID_UNIFIED_HEADERS, 1, [Whether Android NDK unified headers are used])
661         fi
662 fi # Android
664 # not 64 bit clean in cross-compile
665 AC_CHECK_SIZEOF(void *)
666 AC_CHECK_SIZEOF(long)
668 AC_CHECK_SIZEOF(int)
669 AC_CHECK_SIZEOF(long long)
671 AC_CACHE_CHECK([for clang],
672         mono_cv_clang,[
673         AC_TRY_COMPILE([], [
674                 #ifdef __clang__
675                 #else
676                 #error "FAILED"
677                 #endif
678         ],
679         [mono_cv_clang=yes],
680         [mono_cv_clang=no],
681         [])
684 AC_ARG_ENABLE(visibility-hidden,
685 [  --disable-visibility-hidden    disable usage of -fvisiblity=hidden],
686    disable_visibility_hidden=yes, disable_visibility_hidden=no)
688 WARN=''
689 if test x"$GCC" = xyes; then
690                 WARN='-Wall -Wunused -Wmissing-declarations -Wpointer-arith -Wno-cast-qual -Wwrite-strings -Wno-switch -Wno-switch-enum -Wno-unused-value -Wno-attributes'
691                 CFLAGS="$CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs -Wno-format-zero-length"
693                 # We require C99 with some GNU extensions, e.g. `linux` macro
694                 CFLAGS="$CFLAGS -std=gnu99"
696                 # The runtime code does not respect ANSI C strict aliasing rules
697                 CFLAGS="$CFLAGS -fno-strict-aliasing"
699                 # We rely on signed overflow to behave
700                 CFLAGS="$CFLAGS -fwrapv"
702                 CFLAGS="$CFLAGS -DMONO_DLL_EXPORT"
703                 if test x"$disable_visibility_hidden" = xno; then
704                    # Don't export any symbols by default
705                    SHARED_CFLAGS="-fvisibility=hidden"
706                    CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
707                 fi
709                 ORIG_CFLAGS=$CFLAGS
710                 # Check for the normal version, since gcc ignores unknown -Wno options
711                 CFLAGS="$CFLAGS -Wunused-but-set-variable -Werror"
712                 AC_MSG_CHECKING(for -Wno-unused-but-set-variable option to gcc)
713                 AC_TRY_COMPILE([],[
714                 ], [
715                    AC_MSG_RESULT(yes)
716                    CFLAGS="$ORIG_CFLAGS -Wno-unused-but-set-variable"
717                 ], [
718                    AC_MSG_RESULT(no)
719                    CFLAGS=$ORIG_CFLAGS
720                 ])
722                 if test "x$mono_cv_clang" = "xyes"; then
723                    # https://bugzilla.samba.org/show_bug.cgi?id=8118
724                    WARN="$WARN -Qunused-arguments"
725                    WARN="$WARN -Wno-unused-function -Wno-tautological-compare -Wno-parentheses-equality -Wno-self-assign -Wno-return-stack-address -Wno-constant-logical-operand"
726                    # We rely on zero length arrays in structs
727                    WARN="$WARN -Wno-zero-length-array"
728                 fi
729 else
730         # The Sun Forte compiler complains about inline functions that access static variables
731         # so disable all inlining.
732         case "$host" in
733         *-*-solaris*)
734                 CFLAGS="$CFLAGS -Dinline="
735                 ;;
736         esac
738 CFLAGS="$WARN $CFLAGS -g"
739 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -g"
740 CPPFLAGS="$WARN $CPPFLAGS -g"
742 # Where's the 'mcs' source tree?
743 if test -d $srcdir/mcs; then
744   mcsdir=mcs
745 else
746   mcsdir=../mcs
749 AC_ARG_WITH(mcs-path, [  --with-mcs-path=/path/to/mcs      Specify an alternate mcs source tree],
750         if test x$with_mcs_path != "x" -a -d $with_mcs_path ; then
751                 mcsdir=$with_mcs_path
752         fi
755 AC_ARG_WITH(jumptables, [  --with-jumptables=yes,no      enable/disable support for jumptables (ARM-only for now) (defaults to no)],[],[with_jumptables=no])
757 AC_ARG_WITH(core,       [  --with-core=yes,no,only       controls whether to build Mono as a .NET Core runtime, not build it, or just build core (defaults to no)],[],[with_core=no])
758 if test x$with_core = xyes; then
759     AC_DEFINE(ENABLE_NETCORE,1,[Enables the support for .NET Core Features in the MonoVM])
761 AM_CONDITIONAL(ENABLE_CORE, test x$with_core = xyes)
762 AM_CONDITIONAL(ONLY_CORE, test x$with_core = xonly)
765 # A sanity check to catch cases where the package was unpacked
766 # with an ancient tar program (Solaris)
768 AC_ARG_ENABLE(solaris-tar-check,
769 [  --disable-solaris-tar-check    disable solaris tar check],
770    do_solaris_tar_check=no, do_solaris_tar_check=yes)
772 if test x"$do_solaris_tar_check" = xyes -a x"$enable_solaris_tar_check" = xyes; then
773         AC_MSG_CHECKING(integrity of package)
774         if test -f $mcsdir/class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapTypeMapper.cs
775         then
776                 AC_MSG_RESULT(ok)
777         else
778                 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"
779                 AC_MSG_ERROR([$errorm])
780         fi
783 if test "x$with_mcs_path" != "x"; then
784 mcs_topdir=$(cd "$mcsdir" && pwd)
785 mcs_topdir_from_srcdir=$mcs_topdir
786 else
787 mcs_topdir=$(cd "$srcdir/$mcsdir" && pwd)
788 mcs_topdir_from_srcdir='$(top_builddir)'/$mcsdir
791 # Convert mcs_topdir* paths to Windows syntax.
792 if test x$cross_compiling$host_win32 = xnoyes; then
793   mcs_topdir=$(cygpath -m $mcs_topdir)
794   case $mcs_topdir_from_srcdir in
795     /cygdrive/*)
796         mcs_topdir_from_srcdir=$(cygpath -m $mcs_topdir_from_srcdir)
797         ;;
798   esac
801 AC_SUBST([mcs_topdir])
802 AC_SUBST([mcs_topdir_from_srcdir])
804 # gettext: prepare the translation directories. 
805 # we do not configure the full gettext, as we consume it dynamically from C#
806 AM_PO_SUBDIRS
808 if test "x$USE_NLS" = "xyes"; then
809    AC_CHECK_PROG(HAVE_MSGFMT, msgfmt,yes,no)
811    if test "x$HAVE_MSGFMT" = "xno"; then
812           AC_MSG_ERROR([msgfmt not found. You need to install the 'gettext' package, or pass --enable-nls=no to configure.])
813    fi
816 AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
818 pkg_config_path=
819 AC_ARG_WITH(crosspkgdir, [  --with-crosspkgdir=/path/to/pkg-config/dir      Change pkg-config dir to custom dir],
820         if test x$with_crosspkgdir = "x"; then
821                 if test -s $PKG_CONFIG_PATH; then
822                         pkg_config_path=$PKG_CONFIG_PATH
823                 fi
824         else
825                 pkg_config_path=$with_crosspkgdir
826                 PKG_CONFIG_PATH=$pkg_config_path
827                 export PKG_CONFIG_PATH
828         fi
831 AC_ARG_ENABLE(ninja,[  --enable-ninja    Enable using ninja where available], enable_ninja=$enableval)
832 AC_CHECK_PROG(HAVE_NINJA, ninja, yes, no)
833 AM_CONDITIONAL(NINJA, test x$enable_ninja = xyes -a x$HAVE_NINJA != xno)
835 AC_ARG_ENABLE(werror, [  --enable-werror Pass -Werror to the C compiler], werror_flag=$enableval, werror_flag=no)
836 if test x$werror_flag = xyes; then
837         WERROR_CFLAGS="-Werror"
839 AC_SUBST([WERROR_CFLAGS])
840 AC_SUBST([SHARED_CFLAGS])
842 GLIB_CFLAGS='-I$(top_srcdir)/mono/eglib -I$(top_builddir)/mono/eglib'
843   
844 AC_SUBST(GLIB_CFLAGS)
846 # Enable support for fast thread-local storage
847 # Some systems have broken support, so we allow to disable it.
848 AC_ARG_WITH(tls, [  --with-tls=__thread,pthread    select Thread Local Storage implementation (defaults to __thread)],[],[with_tls=__thread])
850 # Enable support for using sigaltstack for SIGSEGV and stack overflow handling
851 # This does not work on some platforms (bug #55253)
852 AC_ARG_WITH(sigaltstack, [  --with-sigaltstack=yes,no      enable/disable support for sigaltstack (defaults to yes)],[],[with_sigaltstack=yes])
854 AC_ARG_WITH(static_mono, [  --with-static_mono=yes,no      link mono statically to libmono (faster) (defaults to yes)],[],[with_static_mono=yes])
855 AC_ARG_WITH(shared_mono, [  --with-shared_mono=yes,no      build a shared libmono library (defaults to yes)],[],[with_shared_mono=yes])
856 # Same as --with-shared_mono=no
857 AC_ARG_ENABLE(libraries, [  --disable-libraries disable the build of libmono], enable_libraries=$enableval, enable_libraries=yes)
859 if test "x$enable_static" = "xno"; then
860    with_static_mono=no
863 if test "x$enable_shared" = "xno"; then
864    with_shared_mono=no
867 if test "x$enable_libraries" = "xno"; then
868    with_shared_mono=no
871 AM_CONDITIONAL(DISABLE_LIBRARIES, test x$enable_libraries = xno)
873 if test "x$host_win32" = "xyes"; then
874    # Boehm GC requires the runtime to be in its own dll
875    with_static_mono=no
878 AM_CONDITIONAL(STATIC_MONO, test x$with_static_mono != xno)
879 AM_CONDITIONAL(SHARED_MONO, test x$with_shared_mono != xno)
880 AC_ARG_ENABLE(mcs-build, [  --disable-mcs-build disable the build of the mcs directory], try_mcs_build=$enableval, enable_mcs_build=yes)
881 AC_ARG_ENABLE(support-build, [  --disable-support-build disable the build of the support directory], try_support_build=$enableval, enable_support_build=yes)
883 AC_ARG_WITH(xen_opt,   [  --with-xen_opt=yes,no          Enable Xen-specific behaviour (defaults to yes)],[],[with_xen_opt=yes])
884 if test "x$with_xen_opt" = "xyes" -a "x$mono_cv_clang" = "xno"; then
885         AC_DEFINE(MONO_XEN_OPT, 1, [Xen-specific behaviour])
886         ORIG_CFLAGS=$CFLAGS
887         CFLAGS="$CFLAGS -mno-tls-direct-seg-refs"
888         AC_MSG_CHECKING(for -mno-tls-direct-seg-refs option to gcc)
889         AC_TRY_COMPILE([], [
890         ], [
891            AC_MSG_RESULT(yes)
892            # Pass it to libgc as well
893            CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -mno-tls-direct-seg-refs"
894         ], [
895            AC_MSG_RESULT(no)
896            CFLAGS=$ORIG_CFLAGS
897         ])
900 AC_ARG_ENABLE(small-config, [  --enable-small-config Enable tweaks to reduce requirements (and capabilities)], enable_small_config=$enableval, enable_small_config=no)
902 if test x$enable_small_config = xyes; then
903         AC_DEFINE(MONO_SMALL_CONFIG,1,[Reduce runtime requirements (and capabilities)])
904         CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DSMALL_CONFIG"
907 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)
909 DISABLED_FEATURES=none
910 csc_compiler=default
911 endian=unknown
912 AC_C_BIGENDIAN([endian=big],[endian=little],[endian=unknown])
913 AC_MSG_CHECKING([CSharp compiler to use])
914 AC_ARG_WITH(csc, [  --with-csc=mcs,roslyn,default      Configures the CSharp compiler to use],[
915    if test x$withval = xmcs; then
916        csc_compiler=mcs
917    elif test x$withval = xroslyn; then
918        csc_compiler=roslyn
919    elif test x$withval = xdefault; then
920        :
921    else
922        AC_MSG_ERROR([You must supply one of "mcs", "roslyn" or "default" to the --with-csc option])
923    fi
924 ],[csc_compiler=default])
926 if test $csc_compiler = default; then
927    if test $endian = big; then
928       csc_compiler=mcs
929    elif test $endian = little; then
930       case "$host" in
931         powerpc*) csc_compiler=mcs ;;
932         *) csc_compiler=roslyn ;;
933       esac
934    else
935       csc_compiler=mcs
936    fi
938 AC_MSG_RESULT($csc_compiler)
940 AC_ARG_WITH(jemalloc,             [  --with-jemalloc=yes,no               If jemalloc is enabled (defaults to no)],                                     [], [with_jemalloc=no])
941 AC_ARG_WITH(jemalloc-always,      [  --with-jemalloc_always=yes,no        If jemalloc is enabled and always used (defaults to yes)],                    [], [with_jemalloc_always=no])
942 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])
945 if test x$target_win32 = xyes; then
946 with_jemalloc=no
947 with_jemalloc_assert=no
948 with_jemalloc_always=no
951 AM_CONDITIONAL(MONO_JEMALLOC_ASSERT, [test "x$with_jemalloc_assert" = "xyes"])
952 if test "x$with_jemalloc_assert" = "xyes"; then
953 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ASSERT"
954 AC_DEFINE(MONO_JEMALLOC_ASSERT, 1, [Make jemalloc assert for mono])
955 AC_SUBST(MONO_JEMALLOC_ASSERT, 1)
958 AM_CONDITIONAL(MONO_JEMALLOC_DEFAULT, [test "x$with_jemalloc_always" = "xyes"])
959 if test "x$with_jemalloc_always" = "xyes"; then
960 with_jemalloc=yes
961 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_DEFAULT"
962 AC_DEFINE(MONO_JEMALLOC_DEFAULT, 1, [Make jemalloc default for mono])
963 AC_SUBST(MONO_JEMALLOC_DEFAULT, 1)
966 AM_CONDITIONAL(MONO_JEMALLOC_ENABLED, [test "x$with_jemalloc" = "xyes"])
967 if test "x$with_jemalloc" = "xyes"; then
968 JEMALLOC_LDFLAGS="-L`pwd`/mono/utils/jemalloc/jemalloc/lib -ljemalloc_pic"
969 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ENABLED -I `pwd`/mono/utils/jemalloc/jemalloc/include"
970 JEMALLOC_AUTOCONF_FLAGS=" --build=$target --host=$host"
972 if test "x$target_mach" = "xyes"; then
973         JEMALLOC_CPPFLAGS=" -stdlib=libc++ "
976 AC_DEFINE(MONO_JEMALLOC_ENABLED, 1, [Enable jemalloc usage for mono])
977 AC_SUBST(MONO_JEMALLOC_ENABLED, 1)
979 AC_SUBST(JEMALLOC_CFLAGS)
980 AC_SUBST(JEMALLOC_CPPFLAGS)
981 AC_SUBST(JEMALLOC_LDFLAGS)
982 AC_SUBST(JEMALLOC_AUTOCONF_FLAGS)
985 # Terminology:
986 # Crash privacy - Attempts to not send identifying information in the crash dump / to protect the obscurity of the program control flow
987 # MERP - The MS telemetry profile. Not for general use.
988 # Structured crashes - crashes at runtime that trigger a stack walk by mono that happens cooperatively
990 # Structured crashes are not merp crashes. Structured crashes are json dumps made by mono during crashes. Merp upload is going to use the dumping code is a very specific way, and is enabled at runtime with an icall.
992 #--with-crash_privacy=yes --with-structured_crashes=no means we don't wanna dump in non-merp-enabled builds, and we want to not send symbol strings. This is going to be the default pair of settings for VS4Mac.
993 #--with-crash_privacy=yes --with-structured_crashes=yes means you want to see crashes on your console, and you want to not see unmanaged symbol names. This is an option for proprietary apps that have manual bugs filed.
994 #--with-crash_privacy=no --with-structured_crashes=no means you want to see no crash dumps on failure and you don't care about privacy. This is how you'd set a "don't want it, don't care" configuration.
995 #--with-crash_privacy=no --with-structured_crashes=yes means you want full crashes and you want to see them in the terminal, not on telemetry. This is going to be how we build for CI.
997 AC_ARG_WITH(crash-privacy,       [  --with-crash_privacy=yes,no         If you want your crashes to not include names of symbols present in the binary. ], [], [with_crash_privacy=yes])
998 AC_ARG_WITH(structured-crashes,  [  --with-structured_crashes=yes,no    If you want your unmanaged crashes to result in a small crash dump file. ],        [], [with_structured_crashes=yes])
999 AC_ARG_ENABLE(crash-reporting,  [  --disable-crash-reporting            Enable or Disable crash reporting subsystem],        [crash_reporting=$enableval], [crash_reporting=yes])
1001 if test "x$with_crash_privacy" = "xyes"; then
1002 AC_DEFINE(MONO_PRIVATE_CRASHES,1,[Do not include names of unmanaged functions in the crash dump])
1005 if test "x$with_structured_crashes" = "xno"; then
1006 AC_DEFINE(DISABLE_STRUCTURED_CRASH,1,[Do not create structured crash files during unmanaged crashes])
1009 case "$host" in
1010         *-mingw*|*-*-cygwin*|*-*-aix*|*-*-os400*)
1011                 crash_reporting=no
1012                 ;;
1013 esac
1015 if test "x$crash_reporting" != "xyes"; then
1016 CFLAGS="$CFLAGS -DDISABLE_CRASH_REPORTING=1"
1017 CXXFLAGS="$CXXFLAGS -DDISABLE_CRASH_REPORTING=1"
1020 AC_ARG_ENABLE(monodroid, [ --enable-monodroid Enable runtime support for Monodroid (Xamarin.Android)], enable_monodroid=$enableval, enable_monodroid=no)
1021 AM_CONDITIONAL(ENABLE_MONODROID, test x$enable_monodroid = xyes)
1023 AC_ARG_ENABLE(monotouch, [ --enable-monotouch Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)], enable_monotouch=$enableval, enable_monotouch=no)
1024 AM_CONDITIONAL(ENABLE_MONOTOUCH, test x$enable_monotouch = xyes)
1026 if test x$enable_monodroid = xyes; then
1027         AC_DEFINE(ENABLE_MONODROID, 1, [Enable runtime support for Monodroid (Xamarin.Android)])
1030 if test x$enable_monotouch = xyes; then
1031         AC_DEFINE(ENABLE_MONOTOUCH, 1, [Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)])
1034 AC_ARG_ENABLE(cxx, [  --enable-cxx   compile some code as C++])
1036 # mono/corefx/native has a lot of invalid C++98 in its headers
1037 # dotnet/corefx/native looks a lot better, i.e. 44e5bdafb8d989a220c9cf1b94f31a64a6e4f052
1038 #CXXFLAGS_COMMON=' -std=gnu++98 -fno-exceptions -fno-rtti '
1039 CXXFLAGS_COMMON=' -std=gnu++0x -fno-exceptions -fno-rtti '
1040 # "c++0x" instead of C++11, for compat with Centos6/gcc4.4
1042 # -stdlib=libc++ is needed by clang for iOS 6.0 (-miphoneos-version-min=6.0)
1043 # to support C++11 headers but it does not seem to harm elsewhere, so over-approximate
1044 # and add it whenever we're running clang on Darwin.
1045 if test "x$mono_cv_clang" = xyes -a x$host_darwin = xyes; then
1046         CXXFLAGS_COMMON="$CXXFLAGS_COMMON -stdlib=libc++"
1049 AC_SUBST(CXXFLAGS_COMMON)
1051 if test "x$enable_cxx" = "xyes"; then
1053         CXX_ADD_CFLAGS=" -xc++ $CXXFLAGS_COMMON "
1055         # -std=gnu99 -xc++ is not allowed and errors.
1056         CXX_REMOVE_CFLAGS=-std=gnu99
1057         # These give warnings and should be removed. They are C-only.
1058         # i.e. C++ never allows these, they are always errors and their warningness is not controllable.
1059         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs"
1060         # Likewise with CentOS 6 gcc 4.4.
1061         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Werror-implicit-function-declaration"
1063         # The C-only-ness of -Wno-format-zero-length varies with gcc version.
1064         # It is C-only prior to 4.7. Using it with C++ prior to 4.7
1065         # generates a warning every time we run gcc which is very unsightly.
1066         # The warning is for e.g. sprintf(foo, "") which can just be
1067         # foo[0] = 0 but Mono's use is more elaborate, not as easy to "fix",
1068         # and completely legal and valid.
1069         # We have to switch to C++ and not just use -xc++ because of -std=gnu99 (error when combined with -xc++).
1070         # Alternatively, just run $CXX -xc++ -c /dev/null.
1071         AC_LANG_PUSH(C++)
1072         ORIG_CXXFLAGS=$CXXFLAGS
1073         CXXFLAGS="$CXXFLAGS -Werror -Wno-format-zero-length -xc++ "
1074         AC_MSG_CHECKING(or C-only-ness of -Wno-format-zero-length)
1075         AC_TRY_COMPILE([ ], [ ], [ AC_MSG_RESULT(yes) ],
1076                                  [ AC_MSG_RESULT(no)
1077                                    CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wno-format-zero-length" ])
1078         CXXFLAGS=$ORIG_CXXFLAGS
1079         AC_LANG_POP(C++)
1081 AC_SUBST(CXX_ADD_CFLAGS)
1082 AC_SUBST(CXX_REMOVE_CFLAGS)
1085 # Set the build profiles and options before things which use them
1088 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])
1089 AC_ARG_WITH(monodroid,           [  --with-monodroid=yes,no             If you want to build the MonoDroid assemblies (defaults to no)],            [], [with_monodroid=default])
1090 AC_ARG_WITH(monotouch,           [  --with-monotouch=yes,no             If you want to build the Xamarin.iOS assemblies (defaults to no)],          [], [with_monotouch=default])
1091 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])
1092 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])
1093 AC_ARG_WITH(bitcode,             [  --with-bitcode=yes,no               If bitcode is enabled (defaults to no)],                                    [], [with_bitcode=default])
1094 AC_ARG_WITH(xammac,              [  --with-xammac=yes,no                If you want to build the Xamarin.Mac assemblies (defaults to no)],          [], [with_xammac=default])
1095 AC_ARG_WITH(testing_aot_full_interp,  [  --with-testing_aot_full_interp=yes,no    If you want to build the testing_aot_full_interp assemblies (defaults to no)],   [], [with_testing_aot_full_interp=default])
1096 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])
1097 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])
1098 AC_ARG_WITH(winaot,              [  --with-winaot=yes,no                If you want to build the Windows friendly AOT assemblies (defaults to no)], [], [with_winaot=default])
1099 AC_ARG_WITH(orbis,               [  --with-orbis=yes,no                 If you want to build the Orbis assemblies (defaults to no)], [], [with_orbis=default])
1100 AC_ARG_WITH(unreal,              [  --with-unreal=yes,no                If you want to build the Unreal assemblies (defaults to no)], [], [with_unreal=default])
1101 AC_ARG_WITH(wasm,                [  --with-wasm=yes,no                  If you want to build the WebAssembly (defaults to no)], [], [with_wasm=default])
1104 AC_ARG_WITH(runtime-preset, [  --with-runtime-preset=net_4_x,all,aot,aot_llvm,hybridaot,hybridaot_llvm,fullaot,fullaot_llvm,bitcode,unreal,fullaotinterp,fullaotinterp_llvm  Which default profile to build (defaults to net_4_x)],  [], [with_runtime_preset=net_4_x])
1105 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])
1106 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])
1107 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])
1110 dnl Spectre compiler mitigation flag checks
1112 if test "x$with_spectre_mitigation" = "xyes"; then
1113    AC_MSG_NOTICE([Compiler Spectre mitigation support checks])
1114    SPECTRE_CFLAGS=
1115    SPECTRE_INDIRECT_BRANCH_KIND=
1116    case "x$with_spectre_indirect_branch_choice" in
1117        xkeep) SPECTRE_INDIRECT_BRANCH_KIND=keep ;;
1118        xthunk) SPECTRE_INDIRECT_BRANCH_KIND=thunk ;;
1119        xinline) SPECTRE_INDIRECT_BRANCH_KIND=thunk-inline ;;
1120        xextern) SPECTRE_INDIRECT_BRANCH_KIND=thunk-extern ;;
1121        *) AC_MSG_ERROR([Invalid indirect jump thunk kind ($with_spectre_indirect_branch_choice)]) ;;
1122    esac
1124    SPECTRE_FUNCTION_RETURN_KIND=""
1125    case "x$with_spectre_function_return_choice" in
1126        xkeep) SPECTRE_FUNCTION_RETURN_KIND=keep ;;
1127        xthunk) SPECTRE_FUNCTION_RETURN_KIND=thunk ;;
1128        xinline) SPECTRE_FUNCTION_RETURN_KIND=thunk-inline ;;
1129        xextern) SPECTRE_FUNCTION_RETURN_KIND=thunk-extern ;;
1130        *) AC_MSG_ERROR([Invalid function return thunk kind ($with_spectre_function_return_choice)]) ;;
1131    esac
1133    AX_CHECK_COMPILE_FLAG(
1134         [ -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND ],
1135         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND" ]
1136    )
1138    AX_CHECK_COMPILE_FLAG(
1139         [ -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND ],
1140         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND" ]
1141    )
1143    if test "x$SPECTRE_CFLAGS" != "x" ; then
1144         CFLAGS="$CFLAGS $SPECTRE_CFLAGS"
1145         CXXFLAGS="$CXXFLAGS $SPECTRE_CFLAGS"
1146         spectre_mitigation_status="mitigation enabled"
1147    fi
1148 else
1149         spectre_mitigation_status="no mitigation"
1153 dnl Profile defaults
1155 TEST_PROFILE=default
1156 enable_llvm_default=no
1158 with_profile4_x_default=no
1159 with_monodroid_default=no
1160 with_monotouch_default=no
1161 with_monotouch_watch_default=no
1162 with_monotouch_tv_default=no
1163 with_xammac_default=no
1164 with_testing_aot_full_interp_default=no
1165 with_testing_aot_hybrid_default=no
1166 with_testing_aot_full_default=no
1167 with_winaot_default=no
1168 with_orbis_default=no
1169 with_unreal_default=no
1170 with_wasm_default=no
1172 with_bitcode_default=no
1173 enable_cooperative_suspend_default=no
1174 enable_hybrid_suspend_default=no
1176 INVARIANT_AOT_OPTIONS=nimt-trampolines=2000,ntrampolines=10000,nrgctx-fetch-trampolines=256,ngsharedvt-trampolines=4000,nftnptr-arg-trampolines=4000
1178 AOT_BUILD_ATTRS=$INVARIANT_AOT_OPTIONS
1180 if test x$cross_compiling = xyes -o x$enable_mcs_build = xno; then
1181    DISABLE_MCS_DOCS_default=yes
1182 elif test x$with_runtime_preset = xnet_4_x; then
1183    with_profile4_x_default=yes
1184    TEST_PROFILE=net_4_x
1185 elif test x$with_runtime_preset = xall; then
1186    with_profile4_x_default=yes
1187    with_monodroid_default=yes
1188    with_monotouch_default=yes
1189    with_monotouch_watch_default=yes
1190    with_monotouch_tv_default=yes
1191    with_xammac_default=yes
1192    with_winaot_default=yes
1193    with_orbis_default=yes
1194    with_unreal_default=yes
1195    with_wasm_default=yes
1196    with_testing_aot_full_interp_default=yes
1197    with_testing_aot_hybrid_default=yes
1198    with_testing_aot_full_default=yes
1199    TEST_PROFILE=net_4_x
1200 elif test x$with_runtime_preset = xbitcode; then
1201    DISABLE_MCS_DOCS_default=yes
1202    with_testing_aot_full_default=yes
1203    with_bitcode_default=yes
1204    enable_cooperative_suspend_default=yes
1205    TEST_PROFILE=testing_aot_full
1206    enable_llvm_default=yes
1208    mono_feature_disable_com='yes'
1209    mono_feature_disable_remoting='yes'
1210    mono_feature_disable_reflection_emit_save='yes'
1211    mono_feature_disable_reflection_emit='yes'
1212    mono_feature_disable_appdomains='yes'
1214    AOT_BUILD_FLAGS="--runtime=mobile --aot=llvmonly,$INVARIANT_AOT_OPTIONS"
1215    AOT_RUN_FLAGS="--runtime=mobile --llvmonly"
1216    AOT_MODE="llvmonly"
1217 elif test x$with_runtime_preset = xfullaot; then
1218    DISABLE_MCS_DOCS_default=yes
1219    with_testing_aot_full_default=yes
1220    TEST_PROFILE=testing_aot_full
1222    mono_feature_disable_com='yes'
1223    mono_feature_disable_remoting='yes'
1224    mono_feature_disable_reflection_emit_save='yes'
1225    mono_feature_disable_reflection_emit='yes'
1226    mono_feature_disable_appdomains='yes'
1228    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1229    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1230    AOT_MODE="full"
1231 elif test x$with_runtime_preset = xfullaot_llvm; then
1232    DISABLE_MCS_DOCS_default=yes
1233    with_testing_aot_full_default=yes
1234    TEST_PROFILE=testing_aot_full
1236    mono_feature_disable_com='yes'
1237    mono_feature_disable_remoting='yes'
1238    mono_feature_disable_reflection_emit_save='yes'
1239    mono_feature_disable_reflection_emit='yes'
1240    mono_feature_disable_appdomains='yes'
1242    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1243    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1244    AOT_MODE="full"
1245 elif test x$with_runtime_preset = xhybridaot; then
1246    DISABLE_MCS_DOCS_default=yes
1247    with_testing_aot_hybrid_default=yes
1248    TEST_PROFILE=testing_aot_hybrid 
1250    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1251    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1252 elif test x$with_runtime_preset = xhybridaot_llvm; then
1253    DISABLE_MCS_DOCS_default=yes
1254    with_testing_aot_hybrid_default=yes
1255    TEST_PROFILE=testing_aot_hybrid
1257    AOT_BUILD_FLAGS="--runtime=mobile --llvm --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1258    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1259 elif test x$with_runtime_preset = xfullaotinterp; then
1260    with_testing_aot_full_interp_default=yes
1261    TEST_PROFILE=testing_aot_full_interp
1263    # mscorlib.dll aot compilation crashes
1264    mono_feature_disable_com='yes'
1266    AOT_BUILD_FLAGS="--aot=full,interp,$INVARIANT_AOT_OPTIONS"
1267    AOT_RUN_FLAGS="--full-aot-interp"
1268 elif test x$with_runtime_preset = xfullaotinterp_llvm; then
1269    with_testing_aot_full_interp_default=yes
1270    TEST_PROFILE=testing_aot_full_interp_llvm
1272    # mscorlib.dll aot compilation crashes
1273    mono_feature_disable_com='yes'
1275    AOT_BUILD_FLAGS="-O=gsharedvt --llvm --aot=full,interp,$INVARIANT_AOT_OPTIONS"
1276    AOT_RUN_FLAGS="--full-aot-interp"
1277 elif test x$with_runtime_preset = xaot; then
1278    with_profile4_x_default=yes
1280    AOT_BUILD_FLAGS="--aot=$INVARIANT_AOT_OPTIONS"
1281    AOT_RUN_FLAGS=""
1283    DISABLE_MCS_DOCS_default=yes
1284 elif test x$with_runtime_preset = xaot_llvm; then
1285    with_profile4_x_default=yes
1287    AOT_BUILD_FLAGS="--llvm --aot=$INVARIANT_AOT_OPTIONS"
1288    AOT_RUN_FLAGS=""
1290    DISABLE_MCS_DOCS_default=yes
1291 elif test x$with_runtime_preset = xwinaot; then
1292    DISABLE_MCS_DOCS_default=yes
1293    with_winaot_default=yes
1294    TEST_PROFILE=winaot
1296    mono_feature_disable_com='yes'
1297    mono_feature_disable_remoting='yes'
1298    mono_feature_disable_reflection_emit_save='yes'
1299    mono_feature_disable_reflection_emit='yes'
1300    mono_feature_disable_appdomains='yes'
1302    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1303    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1304    AOT_MODE="llvmonly"
1305 elif test x$with_runtime_preset = xorbis; then
1306    DISABLE_MCS_DOCS_default=yes
1307    with_orbis_default=yes
1308    TEST_PROFILE=orbis
1310    mono_feature_disable_com='yes'
1311    mono_feature_disable_remoting='yes'
1312    mono_feature_disable_reflection_emit_save='yes'
1313    mono_feature_disable_reflection_emit='yes'
1314    mono_feature_disable_appdomains='yes'
1316    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1317    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1318    AOT_MODE="full"
1319 elif test x$with_runtime_preset = xunreal; then
1320    DISABLE_MCS_DOCS_default=yes
1321    with_unreal_default=yes
1322    TEST_PROFILE=unreal
1324    mono_feature_disable_com='yes'
1325    mono_feature_disable_remoting='yes'
1326    mono_feature_disable_appdomains='no'
1328    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1329    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1330 elif test x$with_runtime_preset = xwasm; then
1331    DISABLE_MCS_DOCS_default=yes
1332    with_wasm_default=yes
1333    TEST_PROFILE=wasm
1335    mono_feature_disable_com='yes'
1336    mono_feature_disable_remoting='yes'
1337    mono_feature_disable_reflection_emit_save='yes'
1338    mono_feature_disable_reflection_emit='yes'
1339    mono_feature_disable_appdomains='yes'
1341    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1342    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1343 else
1344    TEST_PROFILE=net_4_x
1345    with_profile4_x_default=yes
1348 if test "x$AOT_BUILD_FLAGS" != "x"; then :
1349    AC_SUBST(AOT_BUILD_FLAGS)
1350    AC_SUBST(AOT_RUN_FLAGS)
1351    # For llvmonlycheck + fullaotcheck
1352    AC_SUBST(INVARIANT_AOT_OPTIONS)
1355 AC_SUBST(TEST_PROFILE)
1357 if test "x$with_profile4_x" = "xdefault"; then
1358    with_profile4_x=$with_profile4_x_default
1360 if test "x$with_monodroid" = "xdefault"; then
1361    with_monodroid=$with_monodroid_default
1363 if test "x$with_monotouch" = "xdefault"; then
1364    with_monotouch=$with_monotouch_default
1366 if test "x$with_monotouch_watch" = "xdefault"; then
1367    with_monotouch_watch=$with_monotouch_watch_default
1369 if test "x$with_monotouch_tv" = "xdefault"; then
1370    with_monotouch_tv=$with_monotouch_tv_default
1372 if test "x$with_bitcode" = "xdefault"; then
1373    with_bitcode=$with_bitcode_default
1375 if test "x$with_xammac" = "xdefault"; then
1376    with_xammac=$with_xammac_default
1378 if test "x$with_testing_aot_full_interp" = "xdefault"; then
1379    with_testing_aot_full_interp=$with_testing_aot_full_interp_default
1381 if test "x$with_testing_aot_hybrid" = "xdefault"; then
1382    with_testing_aot_hybrid=$with_testing_aot_hybrid_default
1384 if test "x$with_testing_aot_full" = "xdefault"; then
1385    with_testing_aot_full=$with_testing_aot_full_default
1387 if test "x$with_winaot" = "xdefault"; then
1388    with_winaot=$with_winaot_default
1390 if test "x$with_orbis" = "xdefault"; then
1391    with_orbis=$with_orbis_default
1393 if test "x$with_unreal" = "xdefault"; then
1394    with_unreal=$with_unreal_default
1396 if test "x$with_wasm" = "xdefault"; then
1397    with_wasm=$with_wasm_default
1401 AM_CONDITIONAL(INSTALL_4_x, [test "x$with_profile4_x" = "xyes"])
1402 AM_CONDITIONAL(INSTALL_MONODROID, [test "x$with_monodroid" != "xno"])
1403 AM_CONDITIONAL(INSTALL_MONOTOUCH, [test "x$with_monotouch" != "xno"])
1404 AM_CONDITIONAL(INSTALL_MONOTOUCH_WATCH, [test "x$with_monotouch_watch" != "xno"])
1405 AM_CONDITIONAL(INSTALL_MONOTOUCH_TV, [test "x$with_monotouch_tv" != "xno"])
1406 AM_CONDITIONAL(BITCODE, test "x$with_bitcode" = "xyes")
1407 AM_CONDITIONAL(INSTALL_XAMMAC, [test "x$with_xammac" != "xno"])
1408 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL_INTERP, [test "x$with_testing_aot_full_interp" != "xno"])
1409 AM_CONDITIONAL(INSTALL_TESTING_AOT_HYBRID, [test "x$with_testing_aot_hybrid" != "xno"])
1410 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL, [test "x$with_testing_aot_full" != "xno"])
1411 AM_CONDITIONAL(INSTALL_WINAOT, [test "x$with_winaot" != "xno"])
1412 AM_CONDITIONAL(INSTALL_ORBIS, [test "x$with_orbis" != "xno"])
1413 AM_CONDITIONAL(INSTALL_UNREAL, [test "x$with_unreal" != "xno"])
1414 AM_CONDITIONAL(INSTALL_WASM, [test "x$with_wasm" != "xno"])
1415 AM_CONDITIONAL(INSTALL_NETCORE, [test "x$with_core" != "xno"])
1416 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"])
1417 AM_CONDITIONAL(HYBRID_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_hybrid"] || [test "x$TEST_PROFILE" = "xunreal"])
1418 AM_CONDITIONAL(AOT_FULL_INTERP_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full_interp"])
1419 AM_CONDITIONAL(AOT_FULL_INTERP_LLVM_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full_interp_llvm"])
1420 AM_CONDITIONAL(DEFAULT_TESTS, [test "x$TEST_PROFILE" = "xnet_4_x"])
1422 default_profile=net_4_x
1423 if test -z "$INSTALL_MONODROID_TRUE"; then :
1424    default_profile=monodroid
1426 if test -z "$INSTALL_MONOTOUCH_TRUE"; then :
1427    default_profile=monotouch
1429 if test -z "$INSTALL_XAMMAC_TRUE"; then :
1430    default_profile=xammac
1432 if test -z "$INSTALL_TESTING_AOT_FULL_INTERP_TRUE"; then :
1433    default_profile=testing_aot_full_interp
1435 if test -z "$INSTALL_TESTING_AOT_HYBRID_TRUE"; then :
1436    default_profile=testing_aot_hybrid
1438 if test -z "$INSTALL_TESTING_AOT_FULL_TRUE"; then :
1439    default_profile=testing_aot_full
1441 if test -z "$INSTALL_WINAOT_TRUE"; then :
1442    default_profile=winaot
1444 if test -z "$INSTALL_ORBIS_TRUE"; then :
1445    default_profile=orbis
1447 if test -z "$INSTALL_UNREAL_TRUE"; then :
1448    default_profile=unreal
1450 if test -z "$INSTALL_WASM_TRUE"; then :
1451    default_profile=wasm
1453 if test -z "$INSTALL_4_x_TRUE"; then :
1454    default_profile=net_4_x
1456 DEFAULT_PROFILE=$default_profile
1457 AC_SUBST(DEFAULT_PROFILE)
1460 # End build profile configuration
1463 if test x$USE_NLS = xprofile_default; then
1465         AC_MSG_CHECKING([NLS used])
1467         # We make the default value for USE_NLS
1468         # "no" on OSX because it isn't available on most
1469         # default OSX installs. The most common configurations will
1470         # all disable it, so this saves us typing.
1471         if test x$host_darwin = xyes; then
1472                 USE_NLS=no;
1473         else
1474                 USE_NLS=yes;
1475         fi
1477         AC_SUBST([USE_NLS])
1478         AC_MSG_RESULT([$USE_NLS])
1481 AC_ARG_ENABLE(minimal, [  --enable-minimal=LIST      drop support for LIST subsystems.
1482      LIST is a comma-separated list from: aot, profiler, decimal, pinvoke, debug, appdomains, verifier, 
1483      reflection_emit, reflection_emit_save, large_code, logging, com, ssa, generics, attach, jit, interpreter, simd, soft_debug, perfcounters, normalization, desktop_loader, shared_perfcounters, remoting,
1484          security, lldb, mdb, assert_messages, sgen_marksweep_conc, sgen_split_nursery, sgen_gc_bridge, sgen_debug_helpers.],
1486         for feature in `echo "$enable_minimal" | sed -e "s/,/ /g"`; do
1487                 eval "mono_feature_disable_$feature='yes'"
1488         done
1489         DISABLED_FEATURES=$enable_minimal
1490         disabled="Disabled:      $enable_minimal"
1491 ],[])
1493 AC_DEFINE_UNQUOTED(DISABLED_FEATURES, "$DISABLED_FEATURES", [String of disabled features])
1495 if test "x$mono_feature_disable_aot" = "xyes"; then
1496         AC_DEFINE(DISABLE_AOT, 1, [Disable AOT Compiler])
1497         enable_system_aot=no
1498         AC_MSG_NOTICE([Disabled AOT compiler])
1501 if test "x$mono_feature_disable_profiler" = "xyes"; then
1502         AC_DEFINE(DISABLE_PROFILER, 1, [Disable default profiler support])
1503         AC_MSG_NOTICE([Disabled support for the profiler])
1505 AM_CONDITIONAL(DISABLE_PROFILER, test x$mono_feature_disable_profiler = xyes)
1507 if test "x$mono_feature_disable_decimal" = "xyes"; then
1508         AC_DEFINE(DISABLE_DECIMAL, 1, [Disable System.Decimal support])
1509         AC_MSG_NOTICE([Disabled support for decimal])
1512 if test "x$mono_feature_disable_pinvoke" = "xyes"; then
1513         AC_DEFINE(DISABLE_PINVOKE, 1, [Disable P/Invoke support])
1514         AC_MSG_NOTICE([Disabled support for P/Invoke])
1517 if test "x$mono_feature_disable_debug" = "xyes"; then
1518         AC_DEFINE(DISABLE_DEBUG, 1, [Disable runtime debugging support])
1519         AC_MSG_NOTICE([Disabled support for runtime debugging])
1522 if test "x$mono_feature_disable_reflection_emit" = "xyes"; then
1523         AC_DEFINE(DISABLE_REFLECTION_EMIT, 1, [Disable reflection emit support])
1524         mono_feature_disable_reflection_emit_save=yes
1525         AC_MSG_NOTICE([Disabled support for Reflection.Emit])
1528 if test "x$mono_feature_disable_reflection_emit_save" = "xyes"; then
1529         AC_DEFINE(DISABLE_REFLECTION_EMIT_SAVE, 1, [Disable assembly saving support in reflection emit])
1530         AC_MSG_NOTICE([Disabled support for Reflection.Emit.Save])
1533 if test "x$mono_feature_disable_large_code" = "xyes"; then
1534         AC_DEFINE(DISABLE_LARGE_CODE, 1, [Disable support for huge assemblies])
1535         AC_MSG_NOTICE([Disabled support for large assemblies])
1538 if test "x$mono_feature_disable_logging" = "xyes"; then
1539         AC_DEFINE(DISABLE_LOGGING, 1, [Disable support debug logging])
1540         AC_MSG_NOTICE([Disabled support for logging])
1543 if test "x$mono_feature_disable_com" = "xyes"; then
1544         AC_DEFINE(DISABLE_COM, 1, [Disable COM support])
1545         AC_MSG_NOTICE([Disabled COM support])
1548 if test "x$mono_feature_disable_ssa" = "xyes"; then
1549         AC_DEFINE(DISABLE_SSA, 1, [Disable advanced SSA JIT optimizations])
1550         AC_MSG_NOTICE([Disabled SSA JIT optimizations])
1553 if test "x$mono_feature_disable_generics" = "xyes"; then
1554         AC_DEFINE(DISABLE_GENERICS, 1, [Disable generics support])
1555         AC_MSG_NOTICE([Disabled Generics Support])
1558 if test "x$mono_feature_disable_shadowcopy" = "xyes"; then
1559         AC_DEFINE(DISABLE_SHADOW_COPY, 1, [Disable Shadow Copy for AppDomains])
1560         AC_MSG_NOTICE([Disabled Shadow copy for AppDomains])
1563 if test "x$mono_feature_disable_portability" = "xyes"; then
1564         AC_DEFINE(DISABLE_PORTABILITY, 1, [Disables the IO portability layer])
1565         AC_MSG_NOTICE([Disabled IO Portability layer])
1568 if test "x$mono_feature_disable_attach" = "xyes"; then
1569         AC_DEFINE(DISABLE_ATTACH, 1, [Disable agent attach support])
1570         AC_MSG_NOTICE([Disabled agent attach])
1573 if test "x$mono_feature_disable_verifier" = "xyes"; then
1574         AC_DEFINE(DISABLE_VERIFIER, 1, [Disables the verifier])
1575         AC_MSG_NOTICE([Disabled the metadata and IL verifiers])
1578 if test "x$mono_feature_disable_jit" = "xyes"; then
1579         AC_DEFINE(DISABLE_JIT, 1, [Disable the JIT, only full-aot mode or interpreter will be supported by the runtime.])
1580         AC_MSG_NOTICE([Disabled the JIT engine, only full AOT or interpreter will be supported])
1583 AM_CONDITIONAL(DISABLE_JIT, test x$mono_feature_disable_jit = xyes)
1585 if test "x$mono_feature_disable_interpreter" = "xyes"; then
1586         AC_DEFINE(DISABLE_INTERPRETER, 1, [Disable the interpreter.])
1587         AC_MSG_NOTICE([Disabled the interpreter])
1590 AM_CONDITIONAL(DISABLE_INTERPRETER, test x$mono_feature_disable_interpreter = xyes)
1592 if test "x$mono_feature_disable_interpreter" != "xyes" -o "x$mono_feature_disable_jit" != "xyes"; then
1593         AC_DEFINE(ENABLE_ILGEN, 1, [Some VES is available at runtime])
1596 AM_CONDITIONAL(ENABLE_ILGEN, test x$mono_feature_disable_interpreter != xyes -o x$mono_feature_disable_jit != xyes)
1598 if test "x$mono_feature_disable_simd" = "xyes"; then
1599         AC_DEFINE(DISABLE_SIMD, 1, [Disable SIMD intrinsics related optimizations.])
1600         AC_MSG_NOTICE([Disabled SIMD support])
1603 if test "x$mono_feature_disable_soft_debug" = "xyes"; then
1604         AC_DEFINE(DISABLE_DEBUGGER_AGENT, 1, [Disable Soft Debugger Agent.])
1605         AC_MSG_NOTICE([Disabled Soft Debugger.])
1608 AM_CONDITIONAL(DISABLE_DEBUGGER_AGENT, test x$mono_feature_disable_debugger_agent = xyes)
1610 if test "x$mono_feature_disable_perfcounters" = "xyes"; then
1611         AC_DEFINE(DISABLE_PERFCOUNTERS, 1, [Disable Performance Counters.])
1612         AC_MSG_NOTICE([Disabled Performance Counters.])
1614 if test "x$mono_feature_disable_normalization" = "xyes"; then
1615         AC_DEFINE(DISABLE_NORMALIZATION, 1, [Disable String normalization support.])
1616         AC_MSG_NOTICE([Disabled String normalization support.])
1619 #TODO: remove assembly_remapping feature name once everyone is using desktop_loader
1620 if test "x$mono_feature_disable_assembly_remapping" = "xyes" || test "x$mono_feature_disable_desktop_loader" = "xyes"; then
1621         AC_DEFINE(DISABLE_DESKTOP_LOADER, 1, [Disable desktop assembly loader semantics.])
1622         AC_MSG_NOTICE([Disabled desktop assembly loader semantics.])
1625 if test "x$mono_feature_disable_shared_perfcounters" = "xyes"; then
1626         AC_DEFINE(DISABLE_SHARED_PERFCOUNTERS, 1, [Disable shared perfcounters.])
1627         AC_MSG_NOTICE([Disabled Shared perfcounters.])
1630 if test "x$mono_feature_disable_appdomains" = "xyes"; then
1631         AC_DEFINE(DISABLE_APPDOMAINS, 1, [Disable support for multiple appdomains.])
1632         AC_MSG_NOTICE([Disabled support for multiple appdomains.])
1635 if test "x$mono_feature_disable_remoting" = "xyes"; then
1636         AC_DEFINE(DISABLE_REMOTING, 1, [Disable remoting support (This disables type proxies and make com non-functional)])
1637         AC_MSG_NOTICE([Disabled remoting])
1640 if test "x$mono_feature_disable_security" = "xyes"; then
1641         AC_DEFINE(DISABLE_SECURITY, 1, [Disable CAS/CoreCLR security])
1642         AC_MSG_NOTICE([Disabled CAS/CoreCLR security manager (used e.g. for Moonlight)])
1645 if test "x$mono_feature_disable_lldb" = "xyes"; then
1646         AC_DEFINE(DISABLE_LLDB, 1, [Disable support code for the LLDB plugin.])
1647         AC_MSG_NOTICE([Disabled LLDB plugin support code.])
1650 if test "x$mono_feature_disable_mdb" = "xyes"; then
1651         AC_DEFINE(DISABLE_MDB, 1, [Disable support for .mdb symbol files.])
1652         AC_MSG_NOTICE([Disabled support for .mdb symbol files.])
1655 if test "x$mono_feature_disable_assert_messages" = "xyes"; then
1656         AC_DEFINE(DISABLE_ASSERT_MESSAGES, 1, [Disable assertion messages.])
1657         AC_MSG_NOTICE([Disabled assertion messages.])
1660 if test "x$mono_feature_disable_sgen_marksweep_conc" = "xyes"; then
1661         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_CONC, 1, [Disable concurrent gc support in SGEN.])
1662         AC_MSG_NOTICE([Disabled concurrent gc support in SGEN.])
1666 if test "x$mono_feature_disable_sgen_split_nursery" = "xyes"; then
1667         AC_DEFINE(DISABLE_SGEN_SPLIT_NURSERY, 1, [Disable minor=split support in SGEN.])
1668         AC_MSG_NOTICE([Disabled minor=split support in SGEN.])
1671 if test "x$mono_feature_disable_sgen_gc_bridge" = "xyes"; then
1672         AC_DEFINE(DISABLE_SGEN_GC_BRIDGE, 1, [Disable gc bridge support in SGEN.])
1673         AC_MSG_NOTICE([Disabled gc bridge support in SGEN.])
1676 if test "x$mono_feature_disable_sgen_debug_helpers" = "xyes"; then
1677         AC_DEFINE(DISABLE_SGEN_DEBUG_HELPERS, 1, [Disable debug helpers in SGEN.])
1678         AC_MSG_NOTICE([Disabled debug helpers in SGEN.])
1681 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
1682 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
1684 has_extension_module=no
1685 AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
1687         for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
1688                 if test x$extension = xdefault ; then
1689                         has_extension_module=yes;
1690                 fi
1691         done
1692         if test x$enable_extension_module = xyes; then
1693                 has_extension_module=yes;
1694         fi
1695 ], [])
1697 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
1699 if test x$has_extension_module != xno ; then
1700         AC_DEFINE([ENABLE_EXTENSION_MODULE], 1, [Extension module enabled])
1701         AC_MSG_NOTICE([Enabling mono extension module.])
1704 # Deprecated
1705 AC_ARG_ENABLE(gsharedvt, [  --enable-gsharedvt Enable generic valuetype sharing (Deprecated)], enable_gsharedvt=$enableval, enable_gsharedvt=no)
1707 AC_MSG_CHECKING(for visibility __attribute__)
1708 AC_COMPILE_IFELSE([
1709         AC_LANG_SOURCE([[
1710                 void __attribute__ ((visibility ("hidden"))) doit (void) {}
1711                 int main () { doit (); return 0; }
1712         ]])
1713 ], [
1714    have_visibility_hidden=yes
1715    AC_MSG_RESULT(yes)
1716 ], [
1717    have_visibility_hidden=no
1718    AC_MSG_RESULT(no)
1722 dnl Boehm GC configuration
1725 AC_ARG_WITH(libgc,   [  --with-libgc=included,none  Controls the Boehm GC config, default=included],[libgc=$with_libgc],[libgc=included])
1727 AC_ARG_ENABLE(boehm, [  --disable-boehm            Disable the Boehm GC.], support_boehm=$enableval,support_boehm=${support_boehm:-yes})
1728 AM_CONDITIONAL(SUPPORT_BOEHM, test x$support_boehm = xyes)
1730 if test "x$support_boehm" = "xyes"; then
1732         AC_ARG_ENABLE(parallel-mark, [  --enable-parallel-mark     Enables Boehm GC Parallel Marking], enable_parallel_mark=$enableval, enable_parallel_mark=$parallel_mark)
1733         if test x$enable_parallel_mark = xyes; then
1734                 libgc_configure_args="$libgc_configure_args --enable-parallel-mark"
1735         fi
1737         gc_msg=""
1738         LIBGC_CPPFLAGS=
1739         LIBGC_LIBS=
1740         LIBGC_STATIC_LIBS=
1741         libgc_dir=
1742         case "x$libgc" in
1743                 xincluded)
1744                         if test "x$support_boehm" = "xyes"; then
1745                                 libgc_dir=libgc
1746                         fi
1748                         LIBGC_CPPFLAGS='-I$(top_srcdir)/libgc/include'
1749                         LIBGC_LIBS='$(top_builddir)/libgc/libmonogc.la'
1750                         LIBGC_STATIC_LIBS='$(top_builddir)/libgc/libmonogc-static.la'
1752                         BOEHM_DEFINES="-DHAVE_BOEHM_GC"
1754                         if test x$target_win32 = xyes; then
1755                                 BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
1756                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
1757                         fi
1759                         gc_msg="Included Boehm GC with typed GC"
1760                         if test x$enable_parallel_mark = xyes; then
1761                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
1762                                 gc_msg="$gc_msg and parallel mark"
1763                         else
1764                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC)", [GC description])
1765                         fi
1766                         ;;
1768                 xboehm|xbohem|xyes)
1769                         AC_MSG_WARN("External Boehm is no longer supported")
1770                         ;;
1772                 xsgen)
1773                         AC_MSG_WARN("Use --with-sgen instead, --with-libgc= controls Boehm configuration")
1774                         ;;
1776                 xnone)
1777                         AC_MSG_WARN("Compiling mono without GC.")
1778                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description])
1779                         AC_DEFINE(HAVE_NULL_GC,1,[No GC support.])
1780                         gc_msg="none"
1781                         ;;
1782                 *)
1783                         AC_MSG_ERROR([Invalid argument $libgc to --with-libgc.])
1784                         ;;
1785         esac
1787         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])
1788         if test "x$large_heap" = "xyes"; then
1789            CPPFLAGS="$CPPFLAGS -DLARGE_CONFIG"
1790         fi
1792         AC_SUBST(LIBGC_CPPFLAGS)
1793         AC_SUBST(LIBGC_LIBS)
1794         AC_SUBST(LIBGC_STATIC_LIBS)
1795         AC_SUBST(libgc_dir)
1796         AC_SUBST(BOEHM_DEFINES)
1799 AM_CONDITIONAL(SUPPORT_NULLGC, test "x$libgc" = "xnone")
1802 dnl End of Boehm GC Configuration
1805 dnl *************************************
1806 dnl *** Checks for zero length arrays ***
1807 dnl *************************************
1808 AC_MSG_CHECKING(whether $CC supports zero length arrays)
1809 AC_TRY_COMPILE([
1810         struct s {
1811                 int  length;
1812                 char data [0];
1813         };
1814 ], [], [
1815         AC_MSG_RESULT(yes)
1816         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 0, [Length of zero length arrays])
1817 ], [
1818         AC_MSG_RESULT(no)
1819         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
1822 dnl ***********************************
1823 dnl *** Checks for signals
1824 dnl ***********************************
1825 AC_CHECK_HEADERS(signal.h)
1826 AC_CHECK_FUNCS(sigaction)
1827 AC_CHECK_FUNCS(kill)
1828 AC_CHECK_FUNCS(signal)
1830 # signal() is declared inline in Android headers
1831 # so we need to workaround it by overriding the check.
1832 if test x$platform_android = xyes; then
1833         AC_DEFINE(HAVE_SIGNAL,1)
1836 dnl ***********************************
1837 dnl *** Checks for availability of GSS dependencies (krb5, gss.framework, etc)
1838 dnl ***********************************
1839 enable_gss=no;
1840 AC_MSG_CHECKING(for GSS/GSS.h)
1841 AC_TRY_COMPILE([
1842     #include <GSS/GSS.h>
1843 ], [
1845     AC_MSG_RESULT(yes)
1846     AC_DEFINE(HAVE_GSSFW_HEADERS, 1, [GSS/GSS.h])
1847     AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
1848     enable_gss=yes
1849 ], [
1850     AC_MSG_RESULT(no)
1853 AC_MSG_CHECKING(for gssapi/gssapi_ext.h)
1854 AC_TRY_COMPILE([
1855     #include <gssapi/gssapi_ext.h>
1856 ], [
1858     AC_MSG_RESULT(yes)
1859     enable_gss=yes
1860 ], [
1861     AC_MSG_RESULT(no)
1864 AC_MSG_CHECKING(for GSS_SPNEGO_MECHANISM)
1865 AC_TRY_COMPILE([
1866     #include <gssapi/gssapi_ext.h>
1867     #include <gssapi/gssapi_krb5.h>
1868     gss_OID_set_desc gss_mech_spnego_OID_set_desc = {.count = 1, .elements = GSS_SPNEGO_MECHANISM};
1869 ], [
1871     AC_MSG_RESULT(yes)
1872     AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
1873 ], [
1874     AC_MSG_RESULT(no)
1877 AM_CONDITIONAL(ENABLE_GSS, test x$enable_gss = xyes)
1879 # `target_ios=yes` does not detect watch devices and fails when cross-compiling
1880 AC_MONO_APPLE_TARGET(TARGET_OS_IPHONE, [mono_native_platform_ios=yes])
1882 if test x$host_win32 = xno; then
1883         dnl *************************************
1884         dnl *** Checks for time capabilities ***
1885         dnl *************************************
1887         AC_MSG_CHECKING(for CLOCK_MONOTONIC)
1888         AC_TRY_COMPILE([#include <time.h>], [
1889                 const int foo = CLOCK_MONOTONIC;
1890         ],[
1891                 AC_MSG_RESULT(yes)
1892                 AC_DEFINE(HAVE_CLOCK_MONOTONIC, 1, [CLOCK_MONOTONIC])
1893         ], [
1894                 AC_MSG_RESULT(no)
1895         ])
1897         AC_MSG_CHECKING(for CLOCK_MONOTONIC_COARSE)
1898         AC_TRY_COMPILE([#include <time.h>], [
1899                 const int foo = CLOCK_MONOTONIC_COARSE;
1900         ],[
1901                 AC_MSG_RESULT(yes)
1902                 AC_DEFINE(HAVE_CLOCK_MONOTONIC_COARSE, 1, [CLOCK_MONOTONIC_COARSE])
1903         ], [
1904                 AC_MSG_RESULT(no)
1905         ])
1907         AC_MSG_CHECKING(for CLOCK_REALTIME)
1908         AC_TRY_COMPILE([#include <time.h>], [
1909                 const int foo = CLOCK_REALTIME;
1910         ],[
1911                 AC_MSG_RESULT(yes)
1912                 AC_DEFINE(HAVE_CLOCK_REALTIME, 1, [CLOCK_REALTIME])
1913         ], [
1914                 AC_MSG_RESULT(no)
1915         ])
1917         AC_CHECK_FUNC(mach_absolute_time, [AC_DEFINE(HAVE_MACH_ABSOLUTE_TIME, 1, [mach_absolute_time])])
1918         AC_CHECK_FUNC(gethrtime, [AC_DEFINE(HAVE_GETHRTIME, 1, [gethrtime])])
1919         AC_CHECK_FUNC(read_real_time, [AC_DEFINE(HAVE_READ_REAL_TIME, 1, [read_real_time])])
1920         AC_CHECK_FUNC(mach_timebase_info, [AC_DEFINE(HAVE_MACH_TIMEBASE_INFO, 1, [mach_timebase_info])])
1921         AC_CHECK_FUNC(futimes,            [AC_DEFINE(HAVE_FUTIMES, 1, [futimes])])
1922         AC_CHECK_FUNC(futimens,           [AC_DEFINE(HAVE_FUTIMENS, 1, [futimens])])
1924         dnl hires monotonic clock support
1925         AC_SEARCH_LIBS(clock_gettime, rt)
1926         AC_CHECK_FUNCS(clock_nanosleep)
1928         dnl dynamic loader support
1929         AC_CHECK_FUNC(dlopen, DL_LIB="",
1930                 AC_CHECK_LIB(dl, dlopen, DL_LIB="-ldl", dl_support=no)
1931         )
1932         if test x$dl_support = xno; then
1933                 AC_MSG_WARN([No dynamic loading support available])
1934         else
1935                 LIBS="$LIBS $DL_LIB"
1936                 AC_DEFINE(HAVE_DL_LOADER,1,[dlopen-based dynamic loader available])
1937                 dnl from glib's configure.ac
1938                 AC_CACHE_CHECK([for preceeding underscore in symbols],
1939                         mono_cv_uscore,[
1940                         AC_TRY_RUN([#include <dlfcn.h>
1941                         int mono_underscore_test (void) { return 42; }
1942                         int main() {
1943                           void *f1 = (void*)0, *f2 = (void*)0, *handle;
1944                           handle = dlopen ((void*)0, 0);
1945                           if (handle) {
1946                             f1 = dlsym (handle, "mono_underscore_test");
1947                             f2 = dlsym (handle, "_mono_underscore_test");
1948                           } return (!f2 || f1);
1949                         }],
1950                                 [mono_cv_uscore=yes],
1951                                 [mono_cv_uscore=no],
1952                         [])
1953                 ])
1954                 if test "x$mono_cv_uscore" = "xyes"; then
1955                         MONO_DL_NEED_USCORE=1
1956                 else
1957                         MONO_DL_NEED_USCORE=0
1958                 fi
1959                 AC_SUBST(MONO_DL_NEED_USCORE)
1960                 AC_CHECK_FUNC(dlerror)
1961         fi
1963         dnl ******************************************************************
1964         dnl *** Checks for the IKVM JNI interface library                  ***
1965         dnl ******************************************************************
1966         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])
1968         ikvm_native_dir=
1969         if test x$with_ikvm_native = xyes; then
1970                 ikvm_native_dir=ikvm-native
1971                 jdk_headers_found="IKVM Native"
1972         fi
1974         AC_SUBST(ikvm_native_dir)
1976         AC_CHECK_HEADERS(execinfo.h)
1978         AC_CHECK_HEADERS(sys/auxv.h sys/resource.h)
1980         AC_CHECK_FUNCS(getgrgid_r)
1981         AC_CHECK_FUNCS(getgrnam_r)
1982         AC_CHECK_FUNCS(getresuid)
1983         AC_CHECK_FUNCS(setresuid)
1984         AC_CHECK_FUNCS(kqueue)
1985         AC_CHECK_FUNCS(backtrace_symbols)
1986         AC_CHECK_FUNCS(mkstemp)
1987         AC_CHECK_FUNCS(mmap)
1988         AC_CHECK_FUNCS(madvise)
1989         AC_CHECK_FUNCS(getrusage)
1990         AC_CHECK_FUNCS(getpriority)
1991         AC_CHECK_FUNCS(setpriority)
1992         AC_CHECK_FUNCS(dl_iterate_phdr)
1993         AC_CHECK_FUNCS(dladdr)
1994         AC_CHECK_FUNCS(sysconf)
1995         AC_CHECK_FUNCS(getrlimit)
1996         AC_CHECK_FUNCS(prctl)
1997         AC_CHECK_FUNCS(arc4random)
1998         AC_CHECK_FUNCS(nl_langinfo)
2000         AC_CHECK_FUNCS(sched_getaffinity)
2001         AC_CHECK_FUNCS(sched_setaffinity)
2002         AC_CHECK_FUNCS(sched_getcpu)
2004         if test x$platform_android != xyes; then
2005                 AC_CHECK_FUNCS(getpwnam_r)
2006                 AC_CHECK_FUNCS(getpwuid_r)
2007         fi
2009         AC_FUNC_STRERROR_R()
2011         dnl ****************************************************************
2012         dnl *** Check for sched_setaffinity from glibc versions before   ***
2013         dnl *** 2.3.4. The older versions of the function only take 2    ***
2014         dnl *** parameters, not 3.                                       ***
2015         dnl ***                                                          ***
2016         dnl *** Because the interface change was not made in a minor     ***
2017         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
2018         dnl *** won't always indicate the interface sched_affinity has.  ***
2019         dnl ****************************************************************
2020         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
2021         AC_TRY_COMPILE([#include <sched.h>], [
2022             int mask = 1; 
2023             sched_setaffinity(0, &mask);
2024         ], [
2025                 # Yes, we have it...
2026                 AC_MSG_RESULT(yes)
2027                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
2028         ], [
2029                 # We have the new, three-parameter version
2030                 AC_MSG_RESULT(no)
2031         ])
2032         AC_TRY_COMPILE([#include <sched.h>], [
2033              CPU_COUNT((void *) 0);
2034         ], [
2035                 AC_MSG_RESULT(yes)
2036                 AC_DEFINE(GLIBC_HAS_CPU_COUNT, 1, [GLIBC has CPU_COUNT macro in sched.h])
2037         ], [
2038                 # We have the new, three-parameter version
2039                 AC_MSG_RESULT(no)
2040         ])
2042         dnl ******************************************************************
2043         dnl *** Check for large file support                               ***
2044         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
2045         dnl ******************************************************************
2046         
2047         # Check that off_t can represent 2**63 - 1 correctly, working around
2048         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
2049         # CPPFLAGS and sets $large_offt to yes if the test succeeds
2050         large_offt=no
2051         AC_DEFUN([LARGE_FILES], [
2052                 large_CPPFLAGS=$CPPFLAGS
2053                 CPPFLAGS="$CPPFLAGS $1"
2054                 AC_TRY_COMPILE([
2055                         #include <sys/types.h>
2056                         #include <limits.h>
2057                 ], [
2058                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
2059                         #define COMPILE_TIME_ASSERT(pred) \
2060                                 switch(0){case 0:case pred:;}
2061                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
2062                 ], [
2063                         AC_MSG_RESULT(ok)
2064                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
2065                         large_CPPFLAGS="$large_CPPFLAGS $1"
2066                         large_offt=yes
2067                 ], [
2068                         AC_MSG_RESULT(no)
2069                 ])
2070                 CPPFLAGS=$large_CPPFLAGS
2071         ])
2073         AC_MSG_CHECKING(if off_t is 64 bits wide)
2074         LARGE_FILES("")
2075         if test $large_offt = no; then
2076                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
2077                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
2078         fi
2079         if test $large_offt = no; then
2080                 AC_MSG_WARN([No 64 bit file size support available])
2081         fi
2082         
2083         dnl *****************************
2084         dnl *** Checks for libsocket  ***
2085         dnl *****************************
2086         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
2088         case "$host" in
2089                 *-*-*freebsd*)
2090                         dnl *****************************
2091                         dnl *** Checks for libinotify ***
2092                         dnl *****************************
2093                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
2094         esac
2096         dnl *******************************
2097         dnl *** Checks for MSG_NOSIGNAL ***
2098         dnl *******************************
2099         AC_MSG_CHECKING(for MSG_NOSIGNAL)
2100         AC_TRY_COMPILE([#include <sys/socket.h>], [
2101                 int f = MSG_NOSIGNAL;
2102         ], [
2103                 # Yes, we have it...
2104                 AC_MSG_RESULT(yes)
2105                 AC_DEFINE(HAVE_MSG_NOSIGNAL, 1, [Have MSG_NOSIGNAL])
2106         ], [
2107                 # We'll have to use signals
2108                 AC_MSG_RESULT(no)
2109         ])
2111         dnl *****************************
2112         dnl *** Checks for IPPROTO_IP ***
2113         dnl *****************************
2114         AC_MSG_CHECKING(for IPPROTO_IP)
2115         AC_TRY_COMPILE([#include <netinet/in.h>], [
2116                 int level = IPPROTO_IP;
2117         ], [
2118                 # Yes, we have it...
2119                 AC_MSG_RESULT(yes)
2120                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
2121         ], [
2122                 # We'll have to use getprotobyname
2123                 AC_MSG_RESULT(no)
2124         ])
2126         dnl *******************************
2127         dnl *** Checks for IPPROTO_IPV6 ***
2128         dnl *******************************
2129         AC_MSG_CHECKING(for IPPROTO_IPV6)
2130         AC_TRY_COMPILE([#include <netinet/in.h>], [
2131                 int level = IPPROTO_IPV6;
2132         ], [
2133                 # Yes, we have it...
2134                 AC_MSG_RESULT(yes)
2135                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
2136         ], [
2137                 # We'll have to use getprotobyname
2138                 AC_MSG_RESULT(no)
2139         ])
2141         dnl ******************************
2142         dnl *** Checks for IPPROTO_TCP ***
2143         dnl ******************************
2144         AC_MSG_CHECKING(for IPPROTO_TCP)
2145         AC_TRY_COMPILE([#include <netinet/in.h>], [
2146                 int level = IPPROTO_TCP;
2147         ], [
2148                 # Yes, we have it...
2149                 AC_MSG_RESULT(yes)
2150                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
2151         ], [
2152                 # We'll have to use getprotobyname
2153                 AC_MSG_RESULT(no)
2154         ])
2156         dnl *****************************
2157         dnl *** Checks for SOL_IP     ***
2158         dnl *****************************
2159         AC_MSG_CHECKING(for SOL_IP)
2160         AC_TRY_COMPILE([#include <netdb.h>], [
2161                 int level = SOL_IP;
2162         ], [
2163                 # Yes, we have it...
2164                 AC_MSG_RESULT(yes)
2165                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
2166         ], [
2167                 # We'll have to use getprotobyname
2168                 AC_MSG_RESULT(no)
2169         ])
2171         dnl *****************************
2172         dnl *** Checks for SOL_IPV6     ***
2173         dnl *****************************
2174         AC_MSG_CHECKING(for SOL_IPV6)
2175         AC_TRY_COMPILE([#include <netdb.h>], [
2176                 int level = SOL_IPV6;
2177         ], [
2178                 # Yes, we have it...
2179                 AC_MSG_RESULT(yes)
2180                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
2181         ], [
2182                 # We'll have to use getprotobyname
2183                 AC_MSG_RESULT(no)
2184         ])
2186         dnl *****************************
2187         dnl *** Checks for SOL_TCP    ***
2188         dnl *****************************
2189         AC_MSG_CHECKING(for SOL_TCP)
2190         AC_TRY_COMPILE([#include <netdb.h>], [
2191                 int level = SOL_TCP;
2192         ], [
2193                 # Yes, we have it...
2194                 AC_MSG_RESULT(yes)
2195                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
2196         ], [
2197                 # We'll have to use getprotobyname
2198                 AC_MSG_RESULT(no)
2199         ])
2201         dnl *****************************
2202         dnl *** Checks for IP_PKTINFO ***
2203         dnl *****************************
2204         AC_MSG_CHECKING(for IP_PKTINFO)
2205         AC_TRY_COMPILE([#include <linux/in.h>], [
2206                 int level = IP_PKTINFO;
2207         ], [
2208                 # Yes, we have it...
2209                 AC_MSG_RESULT(yes)
2210                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
2211         ], [
2212                 AC_MSG_RESULT(no)
2213         ])
2215         dnl *****************************
2216         dnl *** Checks for IPV6_PKTINFO ***
2217         dnl *****************************
2218         AC_MSG_CHECKING(for IPV6_PKTINFO)
2219         AC_TRY_COMPILE([#include <netdb.h>], [
2220                 int level = IPV6_PKTINFO;
2221         ], [
2222                 # Yes, we have it...
2223                 AC_MSG_RESULT(yes)
2224                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
2225         ], [
2226                 AC_MSG_RESULT(no)
2227         ])
2229         dnl **********************************
2230         dnl *** Checks for IP_DONTFRAG     ***
2231         dnl **********************************
2232         AC_MSG_CHECKING(for IP_DONTFRAG)
2233         AC_TRY_COMPILE([#include <netinet/in.h>], [
2234                 int level = IP_DONTFRAG;
2235         ], [
2236                 # Yes, we have it...
2237                 AC_MSG_RESULT(yes)
2238                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
2239         ], [
2240                 AC_MSG_RESULT(no)
2241         ])
2243         dnl **********************************
2244         dnl *** Checks for IP_DONTFRAGMENT ***
2245         dnl **********************************
2246         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
2247         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
2248                 int level = IP_DONTFRAGMENT;
2249         ], [
2250                 # Yes, we have it...
2251                 AC_MSG_RESULT(yes)
2252                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
2253         ], [
2254                 AC_MSG_RESULT(no)
2255         ])
2257         dnl **********************************
2258         dnl *** Checks for IP_MTU_DISCOVER ***
2259         dnl **********************************
2260         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
2261         AC_TRY_COMPILE([#include <linux/in.h>], [
2262                 int level = IP_MTU_DISCOVER;
2263         ], [
2264                 # Yes, we have it...
2265                 AC_MSG_RESULT(yes)
2266                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
2267         ], [
2268                 AC_MSG_RESULT(no)
2269         ])
2271         dnl **********************************
2272         dnl *** Checks for  IP_PMTUDISC_DO ***
2273         dnl **********************************
2274         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
2275         AC_TRY_COMPILE([#include <linux/in.h>], [
2276                 int level = IP_PMTUDISC_DO;
2277         ], [
2278                 # Yes, we have it...
2279                 AC_MSG_RESULT(yes)
2280                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
2281         ], [
2282                 AC_MSG_RESULT(no)
2283         ])
2285         dnl *********************************
2286         dnl *** Check for struct ip_mreqn ***
2287         dnl *********************************
2288         AC_MSG_CHECKING(for struct ip_mreqn)
2289         AC_TRY_COMPILE([#include <netinet/in.h>], [
2290                 struct ip_mreqn mreq;
2291                 mreq.imr_address.s_addr = 0;
2292         ], [
2293                 # Yes, we have it...
2294                 AC_MSG_RESULT(yes)
2295                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
2296         ], [
2297                 # We'll just have to try and use struct ip_mreq
2298                 AC_MSG_RESULT(no)
2299                 AC_MSG_CHECKING(for struct ip_mreq)
2300                 AC_TRY_COMPILE([#include <netinet/in.h>], [
2301                         struct ip_mreq mreq;
2302                         mreq.imr_interface.s_addr = 0;
2303                 ], [
2304                         # Yes, we have it...
2305                         AC_MSG_RESULT(yes)
2306                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
2307                 ], [
2308                         # No multicast support
2309                         AC_MSG_RESULT(no)
2310                 ])
2311         ])
2312         
2313         dnl **********************************
2314         dnl *** Check for getaddrinfo ***
2315         dnl **********************************
2316         AC_MSG_CHECKING(for getaddrinfo)
2317                 AC_TRY_LINK([
2318                 #include <stdio.h>
2319                 #include <netdb.h>
2320         ], [
2321                 getaddrinfo(NULL,NULL,NULL,NULL);
2322         ], [
2323                 # Yes, we have it...
2324                 AC_MSG_RESULT(yes)
2325                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2326         ], [
2327                 AC_MSG_RESULT(no)
2328         ])
2330         dnl **********************************
2331         dnl *** Check for gethostbyname2_r ***
2332         dnl **********************************
2333         AC_MSG_CHECKING(for gethostbyname2_r)
2334                 AC_TRY_LINK([
2335                 #include <stdio.h>
2336                 #include <netdb.h>
2337         ], [
2339                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
2340         ], [
2341                 # Yes, we have it...
2342                 AC_MSG_RESULT(yes)
2343                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
2344         ], [
2345                 AC_MSG_RESULT(no)
2346         ])
2348         dnl **********************************
2349         dnl *** Check for gethostbyname2 ***
2350         dnl **********************************
2351         AC_MSG_CHECKING(for gethostbyname2)
2352                 AC_TRY_LINK([
2353                 #include <stdio.h>
2354                 #include <netdb.h>
2355         ], [
2356                 gethostbyname2(NULL,0);
2357         ], [
2358                 # Yes, we have it...
2359                 AC_MSG_RESULT(yes)
2360                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
2361         ], [
2362                 AC_MSG_RESULT(no)
2363         ])
2365         dnl **********************************
2366         dnl *** Check for gethostbyname ***
2367         dnl **********************************
2368         AC_MSG_CHECKING(for gethostbyname)
2369                 AC_TRY_LINK([
2370                 #include <stdio.h>
2371                 #include <netdb.h>
2372         ], [
2373                 gethostbyname(NULL);
2374         ], [
2375                 # Yes, we have it...
2376                 AC_MSG_RESULT(yes)
2377                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2378         ], [
2379                 AC_MSG_RESULT(no)
2380         ])
2382         dnl **********************************
2383         dnl *** Check for getprotobyname ***
2384         dnl **********************************
2385         AC_MSG_CHECKING(for getprotobyname)
2386                 AC_TRY_LINK([
2387                 #include <stdio.h>
2388                 #include <netdb.h>
2389         ], [
2390                 getprotobyname(NULL);
2391         ], [
2392                 # Yes, we have it...
2393                 AC_MSG_RESULT(yes)
2394                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2395         ], [
2396                 AC_MSG_RESULT(no)
2397         ])
2399         dnl **********************************
2400         dnl *** Check for getprotobyname_r ***
2401         dnl **********************************
2402         AC_MSG_CHECKING(for getprotobyname_r)
2403                 AC_TRY_LINK([
2404                 #include <stdio.h>
2405                 #include <netdb.h>
2406         ], [
2407                 getprotobyname_r(NULL, NULL, NULL, 0, NULL);
2408         ], [
2409                 # Yes, we have it...
2410                 AC_MSG_RESULT(yes)
2411                 AC_DEFINE(HAVE_GETPROTOBYNAME_R, 1, [Have getprotobyname_r])
2412         ], [
2413                 AC_MSG_RESULT(no)
2414         ])
2416         dnl **********************************
2417         dnl *** Check for getnameinfo ***
2418         dnl **********************************
2419         AC_MSG_CHECKING(for getnameinfo)
2420                 AC_TRY_LINK([
2421                 #include <stdio.h>
2422                 #include <netdb.h>
2423         ], [
2424                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2425         ], [
2426                 # Yes, we have it...
2427                 AC_MSG_RESULT(yes)
2428                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2429         ], [
2430                 AC_MSG_RESULT(no)
2431         ])
2434         dnl **********************************
2435         dnl *** Check for inet_ntop ***
2436         dnl **********************************
2437         AC_MSG_CHECKING(for inet_ntop)
2438                 AC_TRY_LINK([
2439                 #include <stdio.h>
2440                 #include <arpa/inet.h>
2441         ], [
2442                 inet_ntop (0, NULL, NULL, 0);
2443         ], [
2444                 # Yes, we have it...
2445                 AC_MSG_RESULT(yes)
2446                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2447         ], [
2448                 AC_MSG_RESULT(no)
2449         ])
2451         dnl *****************************
2452         dnl *** Checks for libnsl     ***
2453         dnl *****************************
2454         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
2456         AC_CHECK_FUNCS(inet_pton inet_aton)
2458         dnl *****************************
2459         dnl *** Checks for libxnet    ***
2460         dnl *****************************
2461         case "${host}" in
2462                 *solaris* )
2463                         AC_MSG_CHECKING(for Solaris XPG4 support)
2464                         if test -f /usr/lib/libxnet.so; then
2465                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
2466                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
2467                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
2468                                 LIBS="$LIBS -lxnet"
2469                                 AC_MSG_RESULT(yes)
2470                         else
2471                                 AC_MSG_RESULT(no)
2472                         fi
2474                         if test "$GCC" = "yes"; then
2475                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
2476                         fi
2477                 ;;
2478         esac
2480         dnl *****************************
2481         dnl *** Checks for libpthread ***
2482         dnl *****************************
2483 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
2484 # and libpthread does not exist
2486         case "${host}" in
2487                 *-*-*haiku*)
2488                         dnl Haiku has pthread in libroot (libc equiv)
2489                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS")
2490                 ;;
2491                 *-*-*freebsd*)
2492                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2493                 ;;
2494                 *-*-*openbsd*)
2495                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2496                 ;;
2497                 *)
2498                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
2499                 ;;
2500         esac
2501         AC_CHECK_HEADERS(pthread.h)
2502         AC_CHECK_HEADERS(pthread_np.h)
2503         AC_CHECK_FUNCS(pthread_mutex_timedlock)
2504         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_getname_np pthread_setname_np pthread_cond_timedwait_relative_np)
2505         AC_CHECK_FUNCS(pthread_kill)
2506         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
2507         AC_TRY_COMPILE([ #include <pthread.h>], [
2508                 pthread_mutexattr_t attr;
2509                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
2510         ], [
2511                 AC_MSG_RESULT(ok)
2512         ], [
2513                 AC_MSG_RESULT(no)
2514                 AC_ERROR(Posix system lacks support for recursive mutexes)
2515         ])
2516         AC_CHECK_FUNCS(pthread_attr_setstacksize)
2517         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
2518         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
2519         AC_CHECK_FUNCS(mincore mlock munlock)
2521         dnl ***********************************
2522         dnl *** Checks for working __thread ***
2523         dnl ***********************************
2524         AC_MSG_CHECKING(for working __thread)
2525         if test "x$with_tls" != "x__thread"; then
2526                 AC_MSG_RESULT(disabled)
2527         elif test "x$cross_compiling" = "xyes"; then
2528                 AC_MSG_RESULT(cross compiling, assuming yes)
2529         else
2530                 AC_TRY_RUN([
2531                         #if defined(__APPLE__) && defined(__clang__)
2532                         #error "__thread does not currently work with clang on Mac OS X"
2533                         #endif
2534                         
2535                         #include <pthread.h>
2536                         __thread int i;
2537                         static int res1, res2;
2539                         void thread_main (void *arg)
2540                         {
2541                                 i = arg;
2542                                 sleep (1);
2543                                 if (arg == 1)
2544                                         res1 = (i == arg);
2545                                 else
2546                                         res2 = (i == arg);
2547                         }
2549                         int main () {
2550                                 pthread_t t1, t2;
2552                                 i = 5;
2554                                 pthread_create (&t1, NULL, thread_main, 1);
2555                                 pthread_create (&t2, NULL, thread_main, 2);
2557                                 pthread_join (t1, NULL);
2558                                 pthread_join (t2, NULL);
2560                                 return !(res1 + res2 == 2);
2561                         }
2562                 ], [
2563                                 AC_MSG_RESULT(yes)
2564                 ], [
2565                                 AC_MSG_RESULT(no)
2566                                 with_tls=pthread
2567                 ])
2568         fi
2570         dnl **************************************
2571         dnl *** Checks for working sigaltstack ***
2572         dnl **************************************
2573         AC_MSG_CHECKING(for working sigaltstack)
2574         if test "x$with_sigaltstack" != "xyes"; then
2575                 AC_MSG_RESULT(disabled)
2576         elif test "x$cross_compiling" = "xyes"; then
2577                 AC_MSG_RESULT(cross compiling, assuming yes)
2578         else
2579                 AC_TRY_RUN([
2580                         #include <stdio.h>
2581                         #include <stdlib.h>
2582                         #include <unistd.h>
2583                         #include <signal.h>
2584                         #include <pthread.h>
2585                         #include <sys/wait.h>
2586                         #if defined(__FreeBSD__) || defined(__NetBSD__)
2587                         #define SA_STACK SA_ONSTACK
2588                         #endif
2589                         static void
2590                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
2591                         {
2592                                 exit (0);
2593                         }
2595                         volatile char*__ptr = NULL;
2596                         static void *
2597                         loop (void *ignored)
2598                         {
2599                                 *__ptr = 0;
2600                                 return NULL;
2601                         }
2603                         static void
2604                         child ()
2605                         {
2606                                 struct sigaction sa;
2607                                 stack_t sas;
2608                                 pthread_t id;
2609                                 pthread_attr_t attr;
2611                                 sa.sa_sigaction = sigsegv_signal_handler;
2612                                 sigemptyset (&sa.sa_mask);
2613                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
2614                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
2615                                         perror ("sigaction");
2616                                         return;
2617                                 }
2619                                 /* x86 darwin deliver segfaults using SIGBUS */
2620                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
2621                                         perror ("sigaction");
2622                                         return;
2623                                 }
2624                                 sas.ss_sp = malloc (SIGSTKSZ);
2625                                 sas.ss_size = SIGSTKSZ;
2626                                 sas.ss_flags = 0;
2627                                 if (sigaltstack (&sas, NULL) == -1) {
2628                                         perror ("sigaltstack");
2629                                         return;
2630                                 }
2632                                 pthread_attr_init (&attr);
2633                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
2634                                         printf ("pthread_create\n");
2635                                         return;
2636                                 }
2638                                 sleep (100);
2639                         }
2641                         int
2642                         main ()
2643                         {
2644                                 pid_t son;
2645                                 int status;
2646                                 int i;
2648                                 son = fork ();
2649                                 if (son == -1) {
2650                                         return 1;
2651                                 }
2653                                 if (son == 0) {
2654                                         child ();
2655                                         return 0;
2656                                 }
2658                                 for (i = 0; i < 300; ++i) {
2659                                         waitpid (son, &status, WNOHANG);
2660                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
2661                                                 return 0;
2662                                         usleep (10000);
2663                                 }
2665                                 kill (son, SIGKILL);
2666                                 return 1;
2667                         }
2669                 ], [
2670                                 AC_MSG_RESULT(yes)
2671                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
2672                 ], [
2673                                 with_sigaltstack=no
2674                                 AC_MSG_RESULT(no)
2675                 ])
2676         fi
2678         dnl ********************************
2679         dnl *** Checks for semaphore lib ***
2680         dnl ********************************
2681         # 'Real Time' functions on Solaris
2682         # posix4 on Solaris 2.6
2683         # pthread (first!) on Linux
2684         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
2686         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
2687         AC_CHECK_FUNCS(shm_open)
2689         dnl ********************************
2690         dnl *** Checks for timezone stuff **
2691         dnl ********************************
2692         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
2693                 AC_TRY_COMPILE([
2694                         #include <time.h>
2695                         ], [
2696                         struct tm tm;
2697                         tm.tm_gmtoff = 1;
2698                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
2699         if test $ac_cv_struct_tm_gmtoff = yes; then
2700                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
2701         else
2702                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
2703                         AC_TRY_COMPILE([
2704                                 #include <time.h>
2705                         ], [
2706                                 timezone = 1;
2707                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
2708                 if test $ac_cv_var_timezone = yes; then
2709                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
2710                 else
2711                         AC_ERROR(unable to find a way to determine timezone)
2712                 fi
2713         fi
2715         dnl *********************************
2716         dnl *** Checks for math functions ***
2717         dnl *********************************
2718         AC_SEARCH_LIBS(sqrtf, m)
2720         dnl ****************************************************************
2721         dnl *** Checks for working poll() (macosx defines it but doesn't ***
2722         dnl *** have it in the library (duh))                            ***
2723         dnl ****************************************************************
2724         AC_CHECK_FUNCS(poll)
2726         dnl **********************************
2727         dnl *** epoll                      ***
2728         dnl **********************************
2729         AC_CHECK_HEADERS(sys/epoll.h)
2730         haveepoll=no
2731         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
2732         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
2733                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
2734         fi
2736         havekqueue=no
2738         AC_CHECK_HEADERS(sys/event.h)
2739         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
2741         dnl **************************************
2742         dnl * Darwin has a race that prevents us from using reliably:
2743         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
2744         dnl * Since kqueue is mostly used for scaling large web servers, 
2745         dnl * and very few folks run Mono on large web servers on OSX, falling
2746         dnl * back 
2747         dnl **************************************
2748         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
2749                 if test "x$host_darwin" = "xno"; then
2750                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
2751                 fi
2752         fi
2754         dnl ******************************
2755         dnl *** Checks for SIOCGIFCONF ***
2756         dnl ******************************
2757         AC_CHECK_HEADERS(sys/ioctl.h)
2758         AC_CHECK_HEADERS(net/if.h, [], [],
2759            [
2760            #ifdef HAVE_SYS_TYPES_H
2761            # include <sys/types.h>
2762            #endif
2763            #ifdef HAVE_SYS_SOCKET_H
2764            # include <sys/socket.h>
2765            #endif
2766            ])
2767         AC_MSG_CHECKING(for ifreq)
2768         AC_TRY_COMPILE([
2769                 #include <stdio.h>
2770                 #include <sys/ioctl.h>
2771                 #include <net/if.h>
2772                 ], [
2773                 struct ifconf ifc;
2774                 struct ifreq *ifr;
2775                 void *x;
2776                 ifc.ifc_len = 0;
2777                 ifc.ifc_buf = NULL;
2778                 x = (void *) &ifr->ifr_addr;
2779                 ],[
2780                         AC_MSG_RESULT(yes)
2781                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
2782                 ], [
2783                         AC_MSG_RESULT(no)
2784                 ])
2785         dnl **********************************
2786         dnl ***     Checks for sin_len     ***
2787         dnl **********************************
2788         AC_MSG_CHECKING(for sockaddr_in.sin_len)
2789         AC_TRY_COMPILE([
2790                 #include <netinet/in.h>
2791                 ], [
2792                 struct sockaddr_in saddr;
2793                 saddr.sin_len = sizeof (saddr);
2794                 ],[
2795                         AC_MSG_RESULT(yes)
2796                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
2797                 ], [
2798                         AC_MSG_RESULT(no)
2799                 ])      
2800         dnl **********************************
2801         dnl ***    Checks for sin6_len     ***
2802         dnl **********************************
2803         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
2804         AC_TRY_COMPILE([
2805                 #include <netinet/in.h>
2806                 ], [
2807                 struct sockaddr_in6 saddr6;
2808                 saddr6.sin6_len = sizeof (saddr6);
2809                 ],[
2810                         AC_MSG_RESULT(yes)
2811                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
2812                 ], [
2813                         AC_MSG_RESULT(no)
2814                 ])
2815         dnl **********************************
2816         dnl *** Check for getifaddrs       ***
2817         dnl **********************************
2818         AC_MSG_CHECKING(for getifaddrs)
2819                 AC_TRY_LINK([
2820                 #include <stdio.h>
2821                 #include <sys/types.h>
2822                 #include <sys/socket.h>
2823                 #include <ifaddrs.h>
2824         ], [
2825                 getifaddrs(NULL);
2826         ], [
2827                 # Yes, we have it...
2828                 AC_MSG_RESULT(yes)
2829                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
2830         ], [
2831                 AC_MSG_RESULT(no)
2832         ])
2833         dnl **********************************
2834         dnl *** Check for if_nametoindex   ***
2835         dnl **********************************
2836         AC_MSG_CHECKING(for if_nametoindex)
2837                 AC_TRY_LINK([
2838                 #include <stdio.h>
2839                 #include <sys/types.h>
2840                 #include <sys/socket.h>
2841                 #include <net/if.h>
2842         ], [
2843                 if_nametoindex(NULL);
2844         ], [
2845                 # Yes, we have it...
2846                 AC_MSG_RESULT(yes)
2847                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
2848         ], [
2849                 AC_MSG_RESULT(no)
2850         ])
2851         dnl **********************************
2852         dnl *** Check for access ***
2853         dnl **********************************
2854         AC_MSG_CHECKING(for access)
2855                 AC_TRY_LINK([
2856                 #include <unistd.h>
2857         ], [
2858                 access(NULL,0);
2859         ], [
2860                 # Yes, we have it...
2861                 AC_MSG_RESULT(yes)
2862                 AC_DEFINE(HAVE_ACCESS, 1, [Have access])
2863         ], [
2864                 AC_MSG_RESULT(no)
2865         ])
2866                         
2867         dnl **********************************
2868         dnl *** Checks for proclib         ***
2869         dnl **********************************
2870         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.)])
2871         dnl **********************************
2872         dnl *** Checks for MonoPosixHelper ***
2873         dnl **********************************
2874         AC_CHECK_HEADERS(checklist.h)
2875         AC_CHECK_HEADERS(pathconf.h)
2876         AC_CHECK_HEADERS(fstab.h)
2877         AC_CHECK_HEADERS(attr/xattr.h)
2878         AC_CHECK_HEADERS(sys/extattr.h)
2879         AC_CHECK_HEADERS(sys/sendfile.h)
2880         AC_CHECK_HEADERS(sys/statvfs.h)
2881         AC_CHECK_HEADERS(sys/statfs.h)
2882         AC_CHECK_HEADERS(sys/vfstab.h)
2883         AC_CHECK_HEADERS(sys/xattr.h)
2884         AC_CHECK_HEADERS(sys/mman.h)
2885         AC_CHECK_HEADERS(sys/param.h)
2886         AC_CHECK_HEADERS(sys/mount.h, [], [],
2887                 [
2888                 #ifdef HAVE_SYS_PARAM_H
2889                 # include <sys/param.h>
2890                 #endif
2891                 ])
2892         AC_CHECK_HEADERS(sys/mount.h)
2893         AC_CHECK_FUNCS(confstr)
2894         AC_CHECK_FUNCS(seekdir telldir)
2895         AC_CHECK_FUNCS(getdomainname)
2896         AC_CHECK_FUNCS(setdomainname)
2897         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
2898         AC_CHECK_FUNCS(setgroups)
2899         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
2900         AC_CHECK_FUNCS(getfsstat)
2901         AC_CHECK_FUNCS(lutimes futimes)
2902         AC_CHECK_FUNCS(mremap)
2903         AC_CHECK_FUNCS(remap_file_pages)
2904         AC_CHECK_FUNCS(posix_fadvise)
2905         AC_CHECK_FUNCS(posix_fallocate)
2906         AC_CHECK_FUNCS(posix_madvise)
2907         AC_CHECK_FUNCS(vsnprintf)
2908         AC_CHECK_FUNCS(sendfile)
2909         AC_CHECK_FUNCS(gethostid sethostid)
2910         AC_CHECK_FUNCS(sethostname)
2911         AC_CHECK_FUNCS(statfs)
2912         AC_CHECK_FUNCS(fstatfs)
2913         AC_CHECK_FUNCS(statvfs)
2914         AC_CHECK_FUNCS(fstatvfs)
2915         AC_CHECK_FUNCS(stime)
2916         AC_CHECK_FUNCS(ttyname_r)
2917         AC_CHECK_FUNCS(psignal)
2918         AC_CHECK_FUNCS(getlogin_r)
2919         AC_CHECK_FUNCS(lockf)
2920         AC_CHECK_FUNCS(swab)
2921         AC_CHECK_FUNCS(setusershell endusershell)
2922         AC_CHECK_FUNCS(futimens utimensat)
2923         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
2924         AC_CHECK_FUNCS(readv writev preadv pwritev)
2925         AC_CHECK_FUNCS(setpgid)
2926         AC_CHECK_FUNCS(system)
2927         AC_CHECK_FUNCS(fork execv execve)
2928         AC_CHECK_FUNCS(waitpid)
2929         AC_CHECK_FUNCS(accept4)
2930         AC_CHECK_FUNCS(localtime_r)
2931         AC_CHECK_FUNCS(mkdtemp)
2932         AC_CHECK_SIZEOF(size_t)
2933         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
2934                 [#include <sys/types.h>
2935                  #include <sys/stat.h>
2936                  #include <unistd.h>])
2937         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
2938                 [#include <sys/types.h>
2939                  #include <sys/stat.h>
2940                  #include <unistd.h>])
2941         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
2942                 [#include <sys/time.h>])
2943         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
2944                 [#include <sys/socket.h>])
2945         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
2946                 [#include <unistd.h>
2947                  #include <fcntl.h>])
2948         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
2949                 [#include <sys/uio.h>])
2950         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
2951                 [#include <sys/socket.h>])
2952         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
2953                 [#include <sys/poll.h>])
2954         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
2955                 [#include <sys/socket.h>])
2956         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
2957                 [#include <sys/socket.h>])
2958         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
2959                 [#include <netinet/in.h>])
2960         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
2961                 [#include <netinet/in.h>])
2962         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
2963                 [#include <sys/un.h>])
2964         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
2965                 [#include <sys/types.h>
2966                  #include <sys/stat.h>
2967                  #include <unistd.h>])
2968         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
2969                 [#include <time.h>])
2970         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
2971                 [#include <sys/time.h>
2972                  #include <sys/types.h>
2973                  #include <utime.h>])
2974         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
2975                 [#include <sys/time.h>])
2976         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
2977                 [#include <sys/types.h>
2978                  #include <utime.h>])
2979         AC_CHECK_MEMBERS(
2980                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
2981                 [#include <sys/types.h>
2982                  #include <dirent.h>])
2983         AC_CHECK_MEMBERS(
2984                 [struct passwd.pw_gecos],,, 
2985                 [#include <sys/types.h>
2986                  #include <pwd.h>])
2987         AC_CHECK_MEMBERS(
2988                 [struct statfs.f_flags],,, 
2989                 [#include <sys/types.h>
2990                  #include <sys/vfs.h>])
2991         AC_CHECK_MEMBERS(
2992                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
2993                 [#include <sys/types.h>
2994                  #include <sys/stat.h>
2995                  #include <unistd.h>])
2997         dnl Favour xattr through glibc, but use libattr if we have to
2998         AC_CHECK_FUNC(lsetxattr, ,
2999                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
3000         )
3001         AC_SUBST(XATTR_LIB)
3003         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
3004         AC_CHECK_MEMBERS(
3005                 [struct kinfo_proc.kp_proc],,, 
3006                 [#include <sys/types.h>
3007                  #include <sys/param.h>
3008                  #include <sys/sysctl.h>
3009                  #include <sys/proc.h>
3010                  ])
3012         dnl *********************************
3013         dnl *** Checks for Windows compilation ***
3014         dnl *********************************
3015         AC_CHECK_HEADERS(sys/time.h)
3016         AC_CHECK_HEADERS(sys/param.h)
3017         AC_CHECK_HEADERS(dirent.h)
3019         dnl ******************************************
3020         dnl *** Checks for OSX and iOS compilation ***
3021         dnl ******************************************
3022         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
3024         dnl *********************************
3025         dnl *** Check for Console 2.0 I/O ***
3026         dnl *********************************
3027         AC_CHECK_HEADERS([curses.h])
3028         AC_CHECK_HEADERS([term.h], [], [],
3029         [#if HAVE_CURSES_H
3030          #include <curses.h>
3031          #endif
3032         ])
3033         AC_CHECK_HEADERS([termios.h])
3035         dnl *********************************
3036         dnl *** Checks for random         ***
3037         dnl *********************************
3038         if test x$host_darwin = xno; then
3039                 AC_CHECK_HEADERS(sys/random.h)
3040                 AC_CHECK_FUNCS(getrandom getentropy)
3041         fi
3043         dnl *********************************
3044         dnl *** Checks for Mono.Native  ***
3045         dnl *********************************
3047         AC_MSG_CHECKING(for linux/in.h)
3048         AC_TRY_COMPILE([
3049                 #include <sys/socket.h>
3050                 #include <linux/in.h>
3051         ], [
3052         ],[
3053                 AC_MSG_RESULT(yes)
3054                 AC_DEFINE(HAVE_LINUX_IN_H, 1, [linux/in.h])
3055         ], [
3056                 AC_MSG_RESULT(no)
3057         ])
3059         AC_MSG_CHECKING(for struct in_pktinfo)
3060         AC_TRY_COMPILE([
3061                 #ifdef HAVE_LINUX_IN_H
3062                 #include <sys/socket.h>
3063                 #include <linux/in.h>
3064                 #else
3065                 #include <netinet/in.h>
3066                 #endif
3067         ], [
3068                 struct in_pktinfo pktinfo;
3069         ],[
3070                 AC_MSG_RESULT(yes)
3071                 AC_DEFINE(HAVE_IN_PKTINFO, 1, [struct in_pktinfo])
3072         ], [
3073                 AC_MSG_RESULT(no)
3074         ])
3076         AC_MSG_CHECKING(for struct ip_mreqn)
3077         AC_TRY_COMPILE([
3078                 #if HAVE_LINUX_IN_H
3079                 #include <sys/socket.h>
3080                 #include <linux/in.h>
3081                 #else
3082                 #include <netinet/in.h>
3083                 #endif
3084         ], [
3085                 struct ip_mreqn mreqn;
3086         ],[
3087                 AC_MSG_RESULT(yes)
3088                 AC_DEFINE(HAVE_IP_MREQN, 1, struct ip_mreqn)
3089         ], [
3090                 AC_MSG_RESULT(no)
3091         ])
3093         if test x$host_darwin = xno; then
3094                 AC_CHECK_TYPES([struct flock64], [AC_DEFINE(HAVE_FLOCK64, 1, struct flock64)], , [#include <fcntl.h>])
3095         fi
3097         if test x$mono_native_platform_ios = xno; then
3098                 # On iOS, `stat64()` is deprecated and there is no `struct stat64` and `stat()`
3099                 # is either 32-bit or 64-bit based on the device / simulator that you're running on.
3100                 AC_CHECK_FUNC(stat64,            [AC_DEFINE(HAVE_STAT64, 1, [stat64])])
3101         fi
3103         AC_CHECK_FUNC(lseek64,           [AC_DEFINE(HAVE_LSEEK64, 1, [lseek64])])
3104         AC_CHECK_FUNC(mmap64,            [AC_DEFINE(HAVE_MMAP64, 1, [mmap64])])
3105         AC_CHECK_FUNC(ftruncate64,       [AC_DEFINE(HAVE_FTRUNCATE64, 1, [ftruncate64])])
3106         AC_CHECK_FUNC(posix_fadvise64,   [AC_DEFINE(HAVE_POSIX_FADVISE64, 1, [posix_fadvise64])])
3107         AC_CHECK_DECL(pipe2,             [AC_DEFINE(HAVE_PIPE2, 1, [pipe2])])
3108         AC_CHECK_FUNC(getmntinfo,        [AC_DEFINE(HAVE_GETMNTINFO, 1, [getmntinfo])], [], [[#include <unistd.h>]])
3109         AC_CHECK_FUNC(strcpy_s,          [AC_DEFINE(HAVE_STRCPY_S, 1, [strcpy_s])])
3110         AC_CHECK_FUNC(strlcpy,           [AC_DEFINE(HAVE_STRLCPY, 1, [strlcpy])])
3111         AC_CHECK_FUNC(posix_fadvise,     [AC_DEFINE(HAVE_POSIX_FADVISE, 1, [posix_fadvise])])
3112         AC_CHECK_FUNC(ioctl,             [AC_DEFINE(HAVE_IOCTL, 1, [ioctl])])
3113         AC_CHECK_FUNC(sched_getaffinity, [AC_DEFINE(HAVE_SCHED_GETAFFINITY, 1, [sched_getaffinity])])
3114         AC_CHECK_FUNC(sched_setaffinity, [AC_DEFINE(HAVE_SCHED_SETAFFINITY, 1, [sched_setaffinity])])
3115         AC_CHECK_DECL(TIOCGWINSZ,        [AC_DEFINE(HAVE_TIOCGWINSZ, 1, [TIOCGWINSZ])], [], [[#include <sys/ioctl.h>]])
3116         AC_CHECK_FUNC(tcgetattr,         [AC_DEFINE(HAVE_TCGETATTR, 1, [tcgetattr])])
3117         AC_CHECK_FUNC(tcsetattr,         [AC_DEFINE(HAVE_TCSETATTR, 1, [tcsetattr])])
3118         AC_CHECK_FUNC(arc4random,        [AC_DEFINE(HAVE_ARC4RANDOM, 1, [arc4random])])
3119         AC_CHECK_DECL(ECHO,              [AC_DEFINE(HAVE_ECHO, 1, [ECHO])], [], [[#include <termios.h>]])
3120         AC_CHECK_DECL(ICANON,            [AC_DEFINE(HAVE_ICANON, 1, [ICANON])], [], [[#include <termios.h>]])
3121         AC_CHECK_DECL(TCSANOW,           [AC_DEFINE(HAVE_TCSANOW, 1, [TCSANOW])], [], [[#include <termios.h>]])
3123         AC_CHECK_DECL(O_CLOEXEC,         [AC_DEFINE(HAVE_O_CLOEXEC, 1, [O_CLOEXEC])], [], [[#include <fcntl.h>]])
3124         AC_CHECK_DECL(F_DUPFD_CLOEXEC,   [AC_DEFINE(HAVE_F_DUPFD_CLOEXEC, 1, [F_DUPFD_CLOEXEC])], [], [[#include <fcntl.h>]])
3126         AC_CHECK_MEMBER(struct stat.st_birthtimespec, [AC_DEFINE(HAVE_STAT_BIRTHTIME, 1, [struct stat.st_birthtime])], [], [[#include <sys/types.h>], [#include <sys/stat.h>]])
3127         AC_CHECK_MEMBER(struct stat.st_atimespec,     [AC_DEFINE(HAVE_STAT_TIMESPEC, 1, [struct stat.st_atimespec])], [], [[#include <sys/types.h>], [#include <sys/stat.h>]])
3128         AC_CHECK_MEMBER(struct stat.st_atim,          [AC_DEFINE(HAVE_STAT_TIM, 1, [struct stat.st_atim])], [], [[#include <sys/types.h>], [#include <sys/stat.h>]])
3129         AC_CHECK_MEMBER(struct stat.st_atimensec,     [AC_DEFINE(HAVE_STAT_NSEC, 1, [struct stat.st_atimensec])], [], [[#include <sys/types.h>], [#include <sys/stat.h>]])
3130         AC_CHECK_MEMBER(struct dirent.d_namlen,       [AC_DEFINE(HAVE_DIRENT_NAME_LEN, 1, [struct dirent.d_namlen])], [], [[#include <dirent.h>]])
3131         AC_CHECK_MEMBER(struct statfs.f_fstypename,   [AC_DEFINE(HAVE_STATFS_FSTYPENAME, 1, [struct statfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3132         AC_CHECK_MEMBER(struct statvfs.f_fstypename,  [AC_DEFINE(HAVE_STATVFS_FSTYPENAME, 1, [struct statvfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3134         AC_MSG_CHECKING(for struct statfs)
3135         AC_TRY_COMPILE([
3136                 #if defined(HAVE_STATFS_FSTYPENAME) || defined(HAVE_STATVFS_FSTYPENAME)
3137                 #include <sys/mount.h>
3138                 #else
3139                 #include <sys/statfs.h>
3140                 #endif
3141         ], [
3142                 struct statfs;
3143         ],[
3144                 AC_MSG_RESULT(yes)
3145                 AC_DEFINE(HAVE_STATFS, 1, [struct statfs])
3146         ], [
3147                 AC_MSG_RESULT(no)
3148         ])
3150         if test "x$ac_cv_func_strerror_r_char_p" = "xyes" ; then
3151                 AC_DEFINE(HAVE_GNU_STRERROR_R, 1, [char* strerror(int errnum, char *buf, size_t buflen)])
3152         fi
3154         AC_MSG_CHECKING(for readdir_r)
3155         AC_TRY_COMPILE([
3156                 #include <dirent.h>
3157         ], [
3158                 DIR* dir;
3159                 struct dirent* entry;
3160                 struct dirent* result;
3161                 readdir_r(dir, entry, &result);
3162         ],[
3163                 AC_MSG_RESULT(yes)
3164                 AC_DEFINE(HAVE_READDIR_R, 1, [readdir_r])
3165         ], [
3166                 AC_MSG_RESULT(no)
3167         ])
3169         AC_MSG_CHECKING(for kevent with void *data)
3170         AC_TRY_COMPILE([
3171                 #include <sys/types.h>
3172                 #include <sys/event.h>
3173         ], [
3174                 struct kevent event;
3175                 void* data;
3176                 EV_SET(&event, 0, EVFILT_READ, 0, 0, 0, data);
3177         ],[
3178                 AC_MSG_RESULT(yes)
3179                 AC_DEFINE(KEVENT_HAS_VOID_UDATA, 1, [kevent with void *data])
3180         ], [
3181                 AC_MSG_RESULT(no)
3182         ])
3184         AC_CHECK_MEMBER(struct fd_set.fds_bits,   [AC_DEFINE(HAVE_FDS_BITS, 1, [struct fd_set.fds_bits])], [], [[#include <sys/select.h>]])
3185         AC_CHECK_MEMBER(struct fd_set.__fds_bits, [AC_DEFINE(HAVE_PRIVATE_FDS_BITS, 1, [struct fd_set.__fds_bits])], [], [[#include <sys/select.h>]])
3187         AC_MSG_CHECKING(for sendfile with 4 arguments)
3188         AC_TRY_COMPILE([
3189                 #include <sys/sendfile.h>
3190         ], [
3191                 int result = sendfile(0, 0, 0, 0);
3192         ],[
3193                 AC_MSG_RESULT(yes)
3194                 AC_DEFINE(HAVE_SENDFILE_4, 1, [sendfile with 4 arguments])
3195         ], [
3196                 AC_MSG_RESULT(no)
3197         ])
3199         AC_MSG_CHECKING(for sendfile with 6 arguments)
3200         AC_TRY_LINK([
3201                 #include <stdlib.h>
3202                 #include <sys/types.h>
3203                 #include <sys/socket.h>
3204                 #include <sys/uio.h>
3205         ], [
3206                 int result = sendfile(0, 0, 0, NULL, NULL, 0);
3207         ],[
3208                 AC_MSG_RESULT(yes)
3209                 AC_DEFINE(HAVE_SENDFILE_6, 1, [sendfile with 6 arguments])
3210         ], [
3211                 AC_MSG_RESULT(no)
3212         ])
3214         AC_CHECK_FUNC(fcopyfile,     [AC_DEFINE(HAVE_FCOPYFILE, 1, [fcopyfile])])
3215         AC_CHECK_FUNC(epoll_create1, [AC_DEFINE(HAVE_EPOLL, 1, [epoll_create1])])
3216         AC_CHECK_FUNC(accept4,       [AC_DEFINE(HAVE_ACCEPT4, 1, [accept4])])
3217         AC_CHECK_FUNC(kqueue,        [AC_DEFINE(HAVE_KQUEUE, 1, [kqueue])])
3219         ORIG_CFLAGS="$CFLAGS"
3220         CFLAGS="-Werror -Wsign-conversion"
3222         AC_MSG_CHECKING(for getnameinfo with signed flags)
3223         AC_TRY_COMPILE([
3224                 #include <sys/types.h>
3225                 #include <netdb.h>
3226         ], [
3227                 const struct sockaddr *addr;
3228                 socklen_t addrlen;
3229                 char *host;
3230                 socklen_t hostlen;
3231                 char *serv;
3232                 socklen_t servlen;
3233                 int flags;
3234                 int result = getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags);
3235         ],[
3236                 AC_MSG_RESULT(yes)
3237                 AC_DEFINE(HAVE_GETNAMEINFO_SIGNED_FLAGS, 1, [getnameinfo with signed flags])
3238         ], [
3239                 AC_MSG_RESULT(no)
3240         ])
3242         CFLAGS="$ORIG_CFLAGS"
3244         if test "x$host_linux" = "xyes"; then
3245                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 1, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3246         else
3247                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 0, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3248         fi
3250         ORIG_CFLAGS="$CFLAGS"
3251         CFLAGS="-Werror -Wsign-conversion"
3253         AC_MSG_CHECKING(for bind with unsigned addrlen)
3254         AC_TRY_COMPILE([
3255                 #include <sys/socket.h>
3256         ], [
3257                 int fd;
3258                 struct sockaddr* addr;
3259                 socklen_t addrLen;
3260                 bind(fd, addr, addrLen);
3261         ],[
3262                 AC_MSG_RESULT(yes)
3263                 AC_DEFINE(BIND_ADDRLEN_UNSIGNED, 1, [bind with unsigned addrlen])
3264         ], [
3265                 AC_MSG_RESULT(no)
3266         ])
3268         AC_MSG_CHECKING(for struct ipv6_mreq with unsigned ipv6mr_interface)
3269         AC_TRY_COMPILE([
3270                 #include <netinet/in.h>
3271                 #include <netinet/tcp.h>
3272         ], [
3273                 struct ipv6_mreq opt;
3274                 unsigned int index = 0;
3275                 opt.ipv6mr_interface = index;
3276         ],[
3277                 AC_MSG_RESULT(yes)
3278                 AC_DEFINE(IPV6MR_INTERFACE_UNSIGNED, 1, [struct ipv6_mreq with unsigned ipv6mr_interface])
3279         ], [
3280                 AC_MSG_RESULT(no)
3281         ])
3283         AC_MSG_CHECKING(for inotify_rm_watch with unsigned wd)
3284         AC_TRY_COMPILE([
3285                 #include <sys/inotify.h>
3286         ], [
3287                 intptr_t fd;
3288                 uint32_t wd;
3289                 int result = inotify_rm_watch(fd, wd);
3290         ],[
3291                 AC_MSG_RESULT(yes)
3292                 AC_DEFINE(INOTIFY_RM_WATCH_WD_UNSIGNED, 1, [inotify_rm_watch with unsigned wd])
3293         ], [
3294                 AC_MSG_RESULT(no)
3295         ])
3297         CFLAGS="$ORIG_CFLAGS"
3299         AC_MSG_CHECKING(for shm_open that works well enough with mmap)
3300         if test "x$ac_cv_func_shm_open" = "xno" -o "x$ac_cv_func_shm_open_working_with_mmap" = "xno" ; then
3301                 AC_MSG_RESULT(no)
3302         else
3303                 AC_TRY_RUN([
3304                         #include <sys/mman.h>
3305                         #include <fcntl.h>
3306                         #include <unistd.h>
3308                         int main ()
3309                         {
3310                                 int fd = shm_open("/mono_configure_shm_open", O_CREAT | O_RDWR, 0777);
3311                                 if (fd == -1)
3312                                         return -1;
3314                                 shm_unlink("/mono_configure_shm_open");
3316                                 // NOTE: PROT_EXEC and MAP_PRIVATE don't work well with shm_open
3317                                 //       on at least the current version of Mac OS X
3319                                 if (mmap(NULL, 1, PROT_EXEC, MAP_PRIVATE, fd, 0) == MAP_FAILED)
3320                                         return -1;
3322                                 return 0;
3323                         }
3324                 ],[
3325                         AC_MSG_RESULT(yes)
3326                         AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3327                 ], [
3328                         AC_MSG_RESULT(no)
3329                 ])
3330         fi
3332         AC_MSG_CHECKING(for getpriority with int who)
3333         AC_TRY_COMPILE([
3334                 #include <sys/resource.h>
3335         ], [
3336                 int which;
3337                 int who;
3338                 int result = getpriority(which, who);
3339         ],[
3340                 AC_MSG_RESULT(yes)
3341                 AC_DEFINE(PRIORITY_REQUIRES_INT_WHO, 1, [getpriority with int who])
3342         ], [
3343                 AC_MSG_RESULT(no)
3344         ])
3346         AC_MSG_CHECKING(for kevent with int parameters)
3347         AC_TRY_COMPILE([
3348                 #include <sys/types.h>
3349                 #include <sys/event.h>
3350         ], [
3351                 int kg;
3352                 const struct kevent* chagelist;
3353                 int nchanges;
3354                 struct kevent* eventlist;
3355                 int nevents;
3356                 const struct timespec* timeout;
3357                 int result = kevent(kg, chagelist, nchanges, eventlist, nevents, timeout);
3358         ],[
3359                 AC_MSG_RESULT(yes)
3360                 AC_DEFINE(KEVENT_REQUIRES_INT_PARAMS, 1, [kevent with int parameters])
3361         ], [
3362                 AC_MSG_RESULT(no)
3363         ])
3365         ORIG_CFLAGS="$CFLAGS"
3366         CFLAGS="-Werror -Wimplicit-function-declaration"
3368         AC_MSG_CHECKING(for mkstemps)
3369         AC_TRY_COMPILE([
3370                 #include <stdlib.h>
3371                 #include <unistd.h>
3372                 #include <string.h>
3373         ], [
3374                 char *template;
3375                 int suffixlen;
3376                 int result = mkstemps(template, suffixlen);
3377         ],[
3378                 AC_MSG_RESULT(yes)
3379                 AC_DEFINE(HAVE_MKSTEMPS, 1, [mkstemps])
3380                 have_mkstemps=yes
3381         ], [
3382                 AC_MSG_RESULT(no)
3383         ])
3385         CFLAGS="$ORIG_CFLAGS"
3387         if test "x$have_mkstemps" != "xyes" -a "x$ac_cv_func_mkstemp" != "xyes"; then
3388                 AC_MSG_ERROR([Cannot find mkstemps or mkstemp on this platform])
3389         fi
3391         AC_MSG_CHECKING(for tcp/var.h)
3392         AC_TRY_COMPILE([
3393                 #include <sys/types.h>
3394                 #include <sys/socketvar.h>
3395                 #include <netinet/ip.h>
3396                 #include <netinet/tcp.h>
3397                 #include <netinet/tcp_var.h>
3398         ], [
3399         ],[
3400                 AC_MSG_RESULT(yes)
3401                 AC_DEFINE(HAVE_TCP_VAR_H, 1, [tcp/var.h])
3402         ], [
3403                 AC_MSG_RESULT(no)
3404         ])
3406         AC_CHECK_HEADERS([sys/cdefs.h])
3408         AC_MSG_CHECKING(for TCPSTATE enum in netinet/tcp.h)
3409         AC_TRY_COMPILE([
3410                 #ifdef HAVE_SYS_CDEFS_H
3411                 #include <sys/cdefs.h>
3412                 #endif
3413                 #include <netinet/tcp.h>
3414         ], [
3415                 int result = TCP_ESTABLISHED;
3416         ],[
3417                 AC_MSG_RESULT(yes)
3418                 AC_DEFINE(HAVE_TCP_H_TCPSTATE_ENUM, 1, [TCPSTATE enum in netinet/tcp.h])
3419         ], [
3420                 AC_MSG_RESULT(no)
3421         ])
3423         AC_CHECK_DECL(TCPS_ESTABLISHED, [AC_DEFINE(HAVE_TCP_FSM_H, 1, [HAVE_TCP_FSM_H])], [], [[#include <netinet/tcp_fsm.h>]])
3425         AC_MSG_CHECKING(for struct rt_msghdr)
3426         AC_TRY_COMPILE([
3427                 #include <sys/types.h>
3428                 #include <net/route.h>
3429         ], [
3430                 struct rt_msghdr;
3431         ],[
3432                 AC_MSG_RESULT(yes)
3433                 AC_DEFINE(HAVE_RT_MSGHDR, 1, [struct rt_msghdr])
3434         ], [
3435                 AC_MSG_RESULT(no)
3436         ])
3438         AC_CHECK_HEADERS([sys/sysctl.h])
3439         AC_CHECK_HEADERS([linux/rtnetlink.h])
3441         AC_CHECK_FUNC(getpeereid,    [AC_DEFINE(HAVE_GETPEEREID, 1, [getpeereid])])
3442         AC_CHECK_FUNC(getdomainname, [AC_DEFINE(HAVE_GETDOMAINNAME, 1, [getdomainname])])
3443         AC_CHECK_FUNC(uname,         [AC_DEFINE(HAVE_UNAME, 1, [uname])])
3445         ORIG_CFLAGS="$CFLAGS"
3446         CFLAGS="-Werror -Weverything"
3448         AC_MSG_CHECKING(for getdomainname with size_t namelen)
3449         AC_TRY_COMPILE([
3450                 #include <unistd.h>
3451         ], [
3452                 size_t namelen = 20;
3453                 char name[20];
3454                 int result = getdomainname(name, namelen);
3455         ],[
3456                 AC_MSG_RESULT(yes)
3457                 AC_DEFINE(HAVE_GETDOMAINNAME_SIZET, 1, [getdomainname with size_t namelen])
3458         ], [
3459                 AC_MSG_RESULT(no)
3460         ])
3462         CFLAGS="$ORIG_CFLAGS"
3464         AC_CHECK_FUNC(inotify_init, [AC_DEFINE(HAVE_INOTIFY_INIT, 1, [inotify_init])])
3465         AC_CHECK_FUNC(inotify_add_watch, [AC_DEFINE(HAVE_INOTIFY_ADD_WATCH, 1, [inotify_add_watch])])
3466         AC_CHECK_FUNC(inotify_rm_watch, [AC_DEFINE(HAVE_INOTIFY_RM_WATCH, 1, [inotify_rm_watch])])
3468         if test "x$ac_cv_func_inotify_init" = "xyes" -a "x$ac_cv_func_inotify_add_watch" = "xyes" -a "x$ac_cv_func_inotify_rm_watch" = "xyes"; then
3469                 AC_DEFINE(HAVE_INOTIFY, 1, [HAVE_INOTIFY])
3470         elif test "x$host_linux" = "xyes"; then
3471                 AC_MSG_ERROR([Cannot find inotify functions on a Linux platform.])
3472         fi
3474         AC_CHECK_HEADERS([crt_externs.h])
3476         AC_MSG_CHECKING(for _NSGetEnviron)
3477         AC_TRY_COMPILE([
3478                 #include <crt_externs.h>
3479         ], [
3480                 char **result = *(_NSGetEnviron());
3481         ],[
3482                 AC_MSG_RESULT(yes)
3483                 AC_DEFINE(HAVE_NSGETENVIRON, 1, [_NSGetEnviron])
3484         ], [
3485                 AC_MSG_RESULT(no)
3486         ])
3488         AC_CHECK_DECL(IN_EXCL_UNLINK, [AC_DEFINE(HAVE_IN_EXCL_UNLINK, 1, [IN_EXCL_UNLINK])], [], [[#include <sys/inotify.h>]])
3490 else
3491         dnl *********************************
3492         dnl *** Checks for Windows compilation ***
3493         dnl *********************************
3494         AC_CHECK_HEADERS(winternl.h)
3496         jdk_headers_found=no
3497         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
3498         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
3499         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
3500         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
3501         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
3502         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
3503         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
3505         dnl *********************************
3506         dnl *** Check for struct ip_mreqn ***
3507         dnl *********************************
3508         AC_MSG_CHECKING(for struct ip_mreqn)
3509         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3510                 struct ip_mreqn mreq;
3511                 mreq.imr_address.s_addr = 0;
3512         ], [
3513                 # Yes, we have it...
3514                 AC_MSG_RESULT(yes)
3515                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
3516         ], [
3517                 # We'll just have to try and use struct ip_mreq
3518                 AC_MSG_RESULT(no)
3519                 AC_MSG_CHECKING(for struct ip_mreq)
3520                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3521                         struct ip_mreq mreq;
3522                         mreq.imr_interface.s_addr = 0;
3523                 ], [
3524                         # Yes, we have it...
3525                         AC_MSG_RESULT(yes)
3526                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
3527                 ], [
3528                         # No multicast support
3529                         AC_MSG_RESULT(no)
3530                 ])
3531         ])
3533         dnl **********************************
3534         dnl *** Check for getaddrinfo ***
3535         dnl **********************************
3536         AC_MSG_CHECKING(for getaddrinfo)
3537                 AC_TRY_LINK([
3538                 #include <stdio.h>
3539                 #include <winsock2.h>
3540                 #include <ws2tcpip.h>
3541         ], [
3542                 getaddrinfo(NULL,NULL,NULL,NULL);
3543         ], [
3544                 # Yes, we have it...
3545                 AC_MSG_RESULT(yes)
3546                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
3547         ], [
3548                 AC_MSG_RESULT(no)
3549         ])
3551         dnl **********************************
3552         dnl *** Check for gethostbyname ***
3553         dnl **********************************
3554         AC_MSG_CHECKING(for gethostbyname)
3555                 AC_TRY_LINK([
3556                 #include <stdio.h>
3557                 #include <winsock2.h>
3558                 #include <ws2tcpip.h>
3559         ], [
3560                 gethostbyname(NULL);
3561         ], [
3562                 # Yes, we have it...
3563                 AC_MSG_RESULT(yes)
3564                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
3565         ], [
3566                 AC_MSG_RESULT(no)
3567         ])
3569         dnl **********************************
3570         dnl *** Check for getprotobyname ***
3571         dnl **********************************
3572         AC_MSG_CHECKING(for getprotobyname)
3573                 AC_TRY_LINK([
3574                 #include <stdio.h>
3575                 #include <winsock2.h>
3576                 #include <ws2tcpip.h>
3577         ], [
3578                 getprotobyname(NULL);
3579         ], [
3580                 # Yes, we have it...
3581                 AC_MSG_RESULT(yes)
3582                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
3583         ], [
3584                 AC_MSG_RESULT(no)
3585         ])
3587         dnl **********************************
3588         dnl *** Check for getnameinfo ***
3589         dnl **********************************
3590         AC_MSG_CHECKING(for getnameinfo)
3591                 AC_TRY_LINK([
3592                 #include <stdio.h>
3593                 #include <winsock2.h>
3594                 #include <ws2tcpip.h>
3595         ], [
3596                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
3597         ], [
3598                 # Yes, we have it...
3599                 AC_MSG_RESULT(yes)
3600                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
3601         ], [
3602                 AC_MSG_RESULT(no)
3603         ])
3605         dnl **********************************
3606         dnl *** Check for inet_ntop ***
3607         dnl **********************************
3608         AC_MSG_CHECKING(for inet_ntop)
3609                 AC_TRY_LINK([
3610                 #include <stdio.h>
3611                 #include <winsock2.h>
3612                 #include <ws2tcpip.h>
3613         ], [
3614                 inet_ntop (0, NULL, NULL, 0);
3615         ], [
3616                 # Yes, we have it...
3617                 AC_MSG_RESULT(yes)
3618                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
3619         ], [
3620                 AC_MSG_RESULT(no)
3621         ])
3623         dnl **********************************
3624         dnl *** Check for inet_pton ***
3625         dnl **********************************
3626         AC_MSG_CHECKING(for inet_pton)
3627                 AC_TRY_LINK([
3628                 #include <stdio.h>
3629                 #include <winsock2.h>
3630                 #include <ws2tcpip.h>
3631         ], [
3632                 #ifndef inet_pton
3633                 (void) inet_pton;
3634                 #endif
3635                 inet_pton (0, NULL, NULL);
3636         ], [
3637                 # Yes, we have it...
3638                 AC_MSG_RESULT(yes)
3639                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
3640         ], [
3641                 AC_MSG_RESULT(no)
3642         ])
3644         AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
3645         AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
3646         AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
3647         AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
3648         AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
3649         AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
3650         AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
3653 dnl socklen_t check
3654 AC_MSG_CHECKING(for socklen_t)
3655 AC_TRY_COMPILE([
3656 #include <sys/types.h>
3657 #include <sys/socket.h>
3659   socklen_t foo;
3661 ac_cv_c_socklen_t=yes
3662         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
3663         AC_MSG_RESULT(yes)
3665         AC_MSG_RESULT(no)
3668 AC_CHECK_FUNCS(execvp)
3670 dnl ****************************
3671 dnl *** Look for /dev/random ***
3672 dnl ****************************
3674 AC_MSG_CHECKING([if usage of random device is requested])
3675 AC_ARG_ENABLE(dev-random,
3676 [  --disable-dev-random    disable the use of the random device (enabled by default)],
3677 try_dev_random=$enableval, try_dev_random=yes)
3679 AC_MSG_RESULT($try_dev_random)
3681 case "{$build}" in
3683 dnl IBM i does not have /dev/random, use unblocking only
3685     *-*-os400*)
3686     NAME_DEV_RANDOM="/dev/urandom"
3687     ;;
3689 dnl Win32 does not have /dev/random, they have their own method...
3691     *-mingw*|*-*-cygwin*)
3692     ac_cv_have_dev_random=no
3693     ;;
3695 dnl Everywhere else, it's /dev/random
3697     *)
3698     NAME_DEV_RANDOM="/dev/random"
3699     ;;
3700 esac
3702 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
3704 dnl Now check if the device actually exists
3706 if test "x$try_dev_random" = "xyes"; then
3707     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
3708     [if test -r "$NAME_DEV_RANDOM" ; then
3709         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
3710     if test "x$ac_cv_have_dev_random" = "xyes"; then
3711         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
3712     fi
3713 else
3714     AC_MSG_CHECKING(for random device)
3715     ac_cv_have_dev_random=no
3716     AC_MSG_RESULT(has been disabled)
3719 if test "x$host_win32" = "xyes"; then
3720     AC_DEFINE(HAVE_CRYPT_RNG)
3723 if test "x$ac_cv_have_dev_random" = "xno" \
3724     && test "x$host_win32" = "xno"; then
3725     AC_MSG_WARN([[
3727 *** A system-provided entropy source was not found on this system.
3728 *** Because of this, the System.Security.Cryptography random number generator
3729 *** will throw a NotImplemented exception.
3731 *** If you are seeing this message, and you know your system DOES have an
3732 *** entropy collection in place, please report an issue on GitHub and
3733 *** provide information about the system and how to access the random device.
3735 *** Otherwise you can install either egd or prngd and set the environment
3736 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
3737 ***]])
3740 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)
3742 AC_MSG_CHECKING([if big-arrays are to be enabled])
3743 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)
3744 if test "x$enable_big_arrays" = "xyes" ; then
3745     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
3746         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
3747     else
3748         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
3749     fi
3751 AC_MSG_RESULT($enable_big_arrays)
3753 dnl **************
3754 dnl *** DTRACE ***
3755 dnl **************
3757 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
3759 if test "x$enable_dtrace" = "xyes"; then
3760    if test "x$has_dtrace" = "xno"; then
3761           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
3762    fi
3763    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
3764    if test "x$DTRACE" = "xno"; then
3765           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
3766           enable_dtrace=no
3767    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
3768           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
3769           enable_dtrace=no
3770    fi
3773 dtrace_g=no
3774 if test "x$enable_dtrace" = "xyes"; then
3775         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
3776         DTRACEFLAGS=
3777         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3778                 case "$host" in
3779                         powerpc-*-darwin*)
3780                         DTRACEFLAGS="-arch ppc64"
3781                         ;;
3782                         i*86-*-darwin*)
3783                         DTRACEFLAGS="-arch x86_64"
3784                         ;;
3785                         *)
3786                         DTRACEFLAGS=-64
3787                         ;;
3788                 esac
3789         else
3790                 case "$host" in
3791                         powerpc-*-darwin*)
3792                         DTRACEFLAGS="-arch ppc"
3793                         ;;
3794                         i*86-*-darwin*)
3795                         DTRACEFLAGS="-arch i386"
3796                         ;;
3797                         *)
3798                         DTRACEFLAGS=-32
3799                         ;;
3800                 esac
3801         fi
3802         AC_SUBST(DTRACEFLAGS)
3803         case "$host" in
3804                 *-*-solaris*)
3805                 dtrace_g=yes
3806                 ;;
3807         esac
3808         AC_CHECK_HEADERS([sys/sdt.h])
3810 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
3811 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
3813 dnl **************************
3814 dnl *** AOT cross offsets  ***
3815 dnl **************************
3817 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
3818     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
3820 dnl **************
3821 dnl ***  LLVM  ***
3822 dnl **************
3824 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
3825 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
3826 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)
3827 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
3828 AC_ARG_ENABLE(llvm-asserts,[  --enable-llvm-asserts Enable llvm asserts (option to LLVM in CMake)], enable_llvm_asserts=$enableval, enable_llvm_asserts=no)
3830 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
3832 if test "x$enable_llvm" = "xdefault"; then
3833    enable_llvm=$enable_llvm_default
3836 enable_llvm_msvc_only="no"
3837 if test "x$enable_llvm" = "xyes"; then
3838         if test "x$host_win32" = "xyes"; then
3839                 if test "x$cross_compiling" = "xno"; then
3840                         case "$target" in
3841                         x86_64*)
3842                                 AC_MSG_WARN("LLVM for host=Windows and target=Windows is only supported on x64 MSVC builds. Disabling LLVM for GCC build.")
3843                                 enable_llvm_msvc_only="yes"
3844                                 ;;
3845                         i686*)
3846                                 AC_MSG_ERROR("LLVM for host=Windows and target=Windows is only supported for x64 builds.")
3847                                 ;;
3848                         esac
3849                 fi
3850                 if test "x$enable_loadedllvm" = "xyes"; then
3851                         AC_MSG_WARN("Loadable LLVM currently not supported on Windows. Disabling feature.")
3852                         enable_loadedllvm=no
3853                 fi
3854         fi
3857 internal_llvm="no"
3858 if test "x$enable_llvm" = "xyes"; then
3859         if test "x$with_llvm" != "x"; then
3860                 EXTERNAL_LLVM_CONFIG=$with_llvm/bin/llvm-config
3861                 if test x$host_win32 = xyes; then
3862                         EXTERNAL_LLVM_CONFIG=$EXTERNAL_LLVM_CONFIG.exe
3863                 fi
3864                 if test ! -x $EXTERNAL_LLVM_CONFIG; then
3865                         AC_MSG_ERROR([LLVM executable $EXTERNAL_LLVM_CONFIG not found.])
3866                 fi
3867         else
3868                 if test x$host_win32 = xyes; then
3869                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config.exe, no)
3870                 else
3871                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config, no)
3872                 fi
3873                 if test "x$EXTERNAL_LLVM_CONFIG" = "xno"; then
3874                         internal_llvm=yes
3875                 fi
3876         fi
3878         LLVM_CODEGEN_LIBS="x86codegen"
3879         case "$target" in
3880         arm*)
3881                 LLVM_CODEGEN_LIBS="armcodegen"
3882                 ;;
3883         aarch64*)
3884                 LLVM_CODEGEN_LIBS="aarch64codegen"
3885                 ;;
3886         powerpc*)
3887                 LLVM_CODEGEN_LIBS="powerpccodegen"
3888                 ;;
3889         esac
3890         if test "x$host" != "x$target"; then
3891                 # No need for jit libs
3892                 LLVM_CODEGEN_LIBS=
3893         fi
3895         AC_SUBST(LLVM_CODEGEN_LIBS)
3896         AC_SUBST(EXTERNAL_LLVM_CONFIG)
3898         if test "x$host_win32" = "xyes" && test "x$cross_compiling" = "xno" &&  test "x$internal_llvm" = "xno"; then
3899                 EXTERNAL_LLVM_CONFIG_WIN32=$(cygpath -m $EXTERNAL_LLVM_CONFIG)
3900                 AC_SUBST(EXTERNAL_LLVM_CONFIG_WIN32)
3901         fi
3902         if test "x$enable_llvm_msvc_only" != "xyes"; then
3903                 AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
3904         else
3905                 AC_DEFINE(ENABLE_LLVM_MSVC_ONLY, 1, [Enable the LLVM back end])
3906         fi
3907 fi # ENABLE_LLVM
3909 # AC_DEFINE necessary for correct restore behavior on Linux
3910 AM_CONDITIONAL(INTERNAL_LLVM, [test "x$internal_llvm" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
3911 if test "x$internal_llvm" != "xno"; then
3912         if test "x$enable_llvm_msvc_only" != "xyes"; then
3913                 AC_DEFINE(INTERNAL_LLVM, 1, [LLVM used is being build during mono build])
3914         else
3915                 AC_DEFINE(INTERNAL_LLVM_MSVC_ONLY, 1, [LLVM used is being build during mono build])
3916         fi
3919 AM_CONDITIONAL(INTERNAL_LLVM_ASSERTS, [test "x$enable_llvm_asserts" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
3920 if test "x$enable_llvm_asserts" != "xno"; then
3921         if test "x$enable_llvm_msvc_only" != "xyes"; then
3922                 AC_DEFINE(INTERNAL_LLVM_ASSERTS, 1, [Build LLVM with assertions])
3923         else
3924                 AC_DEFINE(INTERNAL_LLVM_ASSERTS_MSVC_ONLY, 1, [Build LLVM with assertions])
3925         fi
3928 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes && test x$enable_llvm_msvc_only != xyes])
3930 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes && test x$enable_llvm_msvc_only != xyes])
3931 if test "x$enable_loadedllvm" = "xyes"; then
3932         if test "x$enable_llvm_msvc_only" != "xyes"; then
3933                 AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
3934         fi
3937 if test "x$enable_llvm" = "xyes"; then
3938         enable_llvm_runtime=yes
3941 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes && test x$enable_llvm_msvc_only != xyes])
3942 if test "x$enable_llvm_runtime" = "xyes"; then
3943         if test "x$enable_llvm_msvc_only" != "xyes"; then
3944                 AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
3945         else
3946                 AC_DEFINE(ENABLE_LLVM_RUNTIME_MSVC_ONLY, 1, [Runtime support code for llvm enabled])
3947         fi
3950 TARGET="unknown"
3951 ACCESS_UNALIGNED="yes"
3953 LIBC="libc.so.6"
3954 INTL="libc.so.6"
3955 SQLITE="libsqlite.so.0"
3956 SQLITE3="libsqlite3.so.0"
3957 X11="libX11.so"
3958 GDKX11="libgdk-x11-2.0.so.0"
3959 GTKX11="libgtk-x11-2.0.so.0"
3960 XINERAMA="libXinerama.so.1"
3962 sizeof_register="SIZEOF_VOID_P"
3964 jit_wanted=true
3965 boehm_supported=true
3966 BTLS_SUPPORTED=no
3967 BTLS_PLATFORM=
3969 case "$host" in
3970         wasm32*)
3971                 TARGET=WASM
3972                 arch_target=wasm
3973                 BTLS_SUPPORTED=no
3974                 ACCESS_UNALIGNED="no"
3975                 with_tls=pthread
3976                 ;;
3977         mips*)
3978                 TARGET=MIPS;
3979                 arch_target=mips;
3980                 with_tls=pthread;
3981                 ACCESS_UNALIGNED="no"
3983                 AC_MSG_CHECKING(for mips n32)
3984                 AC_TRY_COMPILE([],[
3985                 #if _MIPS_SIM != _ABIN32
3986                 #error Not mips n32
3987                 #endif
3988                 ],[
3989                 AC_MSG_RESULT(yes)
3990                 sizeof_register=8
3991                 ],[
3992                 AC_MSG_RESULT(no)
3993                 ])
3994                 ;;
3995         i*86-*-*)
3996                 TARGET=X86;
3997                 arch_target=x86;
3998                 case $host_os in
3999                   solaris*)
4000                         LIBC="libc.so"
4001                         INTL="libintl.so"
4002                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
4003                                 TARGET=AMD64
4004                                 arch_target=amd64
4005                         fi
4007                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
4008                         # int astruct __attribute__ ((visibility ("hidden")));
4009                         # void foo ()
4010                         # {
4011                         #       void *p = &astruct;
4012                         # }
4013                         # gcc -fPIC --shared -o libfoo.so foo.c
4014                         # yields:
4015                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
4016                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
4017                         have_visibility_hidden=no
4018                         ;;
4019                   mingw*|cygwin*)
4020                         have_visibility_hidden=no
4021                         BTLS_SUPPORTED=no
4022                         BTLS_PLATFORM=i386
4023                         ;;
4024                   haiku*)
4025                         LIBC=libroot.so
4026                         ;;
4027                   linux*)
4028                         AOT_SUPPORTED="yes"
4029                         BTLS_SUPPORTED=yes
4030                         BTLS_PLATFORM=i386
4031                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4032                         ;;
4033                   darwin*)
4034                         AOT_SUPPORTED="yes"
4035                         BTLS_SUPPORTED=yes
4036                         BTLS_PLATFORM=i386
4037                         ;;
4038                   openbsd*|freebsd*|kfreebsd-gnu*)
4039                         AOT_SUPPORTED="yes"
4040                         BTLS_SUPPORTED=yes
4041                         BTLS_PLATFORM=i386
4042                         ;;
4043                 esac
4044                 ;;
4045         x86_64-*-* | amd64-*-*)
4046                 TARGET=AMD64;
4047                 arch_target=amd64;
4048                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
4049                         AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4050                         sizeof_register=8
4051                 fi
4052                 case $host_os in
4053                   linux*)
4054                         AOT_SUPPORTED="yes"
4055                         BTLS_SUPPORTED=yes
4056                         BTLS_PLATFORM=x86_64
4057                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4058                         ;;
4059                   darwin*)
4060                         AOT_SUPPORTED="yes"
4061                         BTLS_SUPPORTED=yes
4062                         BTLS_PLATFORM=x86_64
4063                         boehm_supported=false
4064                         ;;
4065                   openbsd*|freebsd*|kfreebsd-gnu*)
4066                         AOT_SUPPORTED="yes"
4067                         BTLS_SUPPORTED=yes
4068                         BTLS_PLATFORM=x86_64
4069                         ;;
4070                   mingw*|cygwin*)
4071                         BTLS_SUPPORTED=no
4072                         BTLS_PLATFORM=x86_64
4073                         ;;
4074                 esac
4075                 ;;
4076         sparc*-*-*)
4077                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4078                    TARGET=SPARC64
4079                 else
4080                         TARGET=SPARC
4081                 fi
4082                 arch_target=sparc;
4083                 ACCESS_UNALIGNED="no"
4084                 case $host_os in
4085                   linux*) ;;
4086                   *)
4087                         LIBC="libc.so"
4088                         INTL="libintl.so"
4089                 esac
4090                 if test x"$GCC" = xyes; then
4091                         # We don't support v8 cpus
4092                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
4093                 fi
4094                 if test x"$AR" = xfalse; then
4095                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
4096                 fi
4097                 ;;
4098         *-mingw*|*-*-cygwin*)
4099                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
4100                 have_visibility_hidden=no
4101                 INTL="intl"
4102                 ;;
4103         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
4104         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
4105         powerpc-*-freebsd* | powerpc*-*-aix* | powerpc*-*-os400* )
4106                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4107                         TARGET=POWERPC64;
4108                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
4109                         if ! (echo $CC | grep -q -- 'clang'); then
4110                                 CFLAGS="$CFLAGS -mminimal-toc"
4111                         fi
4112                 else
4113                         TARGET=POWERPC;
4114                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
4115                 fi
4116                 arch_target=ppc;
4117                 case $host_os in
4118                   aix*|os400*)
4119                         BTLS_SUPPORTED=yes
4120                         BTLS_PLATFORM=powerpc
4121                         dnl on AIX/PASE, shared libraries can be inside archives
4122                         dnl if they are, we specify them by lib.a(lib.so)
4123                         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX, so
4124                         LIBC="libc.a(shr_64.o)"
4125                         INTL="libintl.a(libintl.so.8)"
4126                         ;;
4127                   linux*)
4128                         BTLS_SUPPORTED=yes
4129                         BTLS_PLATFORM=powerpc
4130                         ;;
4131                 esac
4132                 ;;
4133         armv7k-*-darwin*)
4134                 TARGET=ARM;
4135                 TARGET_SYS=WATCHOS
4136                 arch_target=arm;
4137                 arm_fpu=VFP_HARD
4138                 ACCESS_UNALIGNED="no"
4139                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4140                 ;;
4142         arm*-darwin*)
4143                 TARGET=ARM;
4144                 arch_target=arm;
4145                 ACCESS_UNALIGNED="no"
4146                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4147                 ;;
4148         arm*-linux*)
4149                 TARGET=ARM;
4150                 arch_target=arm;
4151                 ACCESS_UNALIGNED="no"
4152                 AOT_SUPPORTED="yes"
4153                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4154                 BTLS_SUPPORTED=yes
4155                 BTLS_PLATFORM=arm
4156                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4157                 case "$target" in
4158                 arm*-linux*-gnueabi)
4159                         BTLS_PLATFORM=armsoft
4160                         ;;
4161                 esac
4162                 ;;
4163         arm*-netbsd*-eabi*)
4164                 TARGET=ARM;
4165                 arch_target=arm;
4166                 ACCESS_UNALIGNED="no"
4167                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4168                 ;;
4169         aarch64-*)
4170                 # https://lkml.org/lkml/2012/7/15/133
4171                 TARGET=ARM64
4172                 arch_target=arm64
4173                 boehm_supported=false
4174                 AOT_SUPPORTED="yes"
4175                 BTLS_SUPPORTED=yes
4176                 BTLS_PLATFORM=aarch64
4177                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4178                 ;;
4179         s390x-*-linux*)
4180                 TARGET=S390X;
4181                 arch_target=s390x;
4182                 ACCESS_UNALIGNED="yes"
4183                 BTLS_SUPPORTED=yes
4184                 BTLS_PLATFORM=s390x
4185                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
4186                 ;;
4187         riscv32-*)
4188                 TARGET=RISCV32
4189                 ACCESS_UNALIGNED=no
4190                 AOT_SUPPORTED=no
4191                 BTLS_SUPPORTED=yes
4192                 BTLS_PLATFORM=riscv32
4193                 arch_target=riscv32
4194                 boehm_supported=false
4195                 ;;
4196         riscv64*)
4197                 TARGET=RISCV64
4198                 ACCESS_UNALIGNED=no
4199                 AOT_SUPPORTED=no
4200                 BTLS_SUPPORTED=yes
4201                 BTLS_PLATFORM=riscv64
4202                 arch_target=riscv64
4203                 boehm_supported=false
4204                 ;;
4205 esac
4207 HOST=$TARGET
4209 if test "x$host" != "x$target"; then
4210    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
4211    enable_mcs_build=no
4212    enable_support_build=no
4213    BTLS_SUPPORTED=no
4214    # Can't use tls, since it depends on the runtime detection of tls offsets
4215    # in mono-compiler.h
4216    with_tls=pthread
4217    target_mach=no
4218    case "$target" in
4219    wasm32*)
4220                 TARGET=WASM
4221                 arch_target=wasm
4222                 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
4223                 ;;
4224    arm*-darwin*)
4225                 TARGET=ARM;
4226                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4227                 case "$target" in
4228                 armv7k-*)
4229                         arm_fpu=VFP_HARD
4230                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
4231                         ;;
4232                 esac            
4233                 ;;
4234    powerpc64-ps3-linux-gnu)
4235                 TARGET=POWERPC64
4236                 arch_target=powerpc64
4237                 AC_DEFINE(TARGET_PS3, 1, [...])
4238                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4239                 # uses this define
4240                 AC_DEFINE(__mono_ppc64__, 1, [...])
4241                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4242                 sizeof_register=8
4243                 target_byte_order=G_BIG_ENDIAN
4244                 ;;
4245    powerpc64-xbox360-linux-gnu)
4246                 TARGET=POWERPC64
4247                 arch_target=powerpc64
4248                 AC_DEFINE(TARGET_XBOX360, 1, [...])
4249                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4250                 # uses this define
4251                 sizeof_register=8
4252                 target_byte_order=G_BIG_ENDIAN
4253                 ;;
4254    arm*-linux-*)
4255                 TARGET=ARM;
4256                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4257                 ;;
4258    arm*-netbsd*-eabi*)
4259                 TARGET=ARM;
4260                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4261                 ;;
4262    i686*-linux-*)
4263                 TARGET=X86;
4264                 ;;
4265    i*86-apple-*)
4266                 TARGET=X86;
4267                 ;;
4268    x86_64*-linux-*)
4269                 TARGET=AMD64;
4270                 ;;
4271    x86_64-ps4-freebsd)
4272                 TARGET=AMD64;
4273                 AC_DEFINE(TARGET_PS4, 1, [...])
4274                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
4275                 CPPFLAGS="$CPPFLAGS"
4276                 target_win32=no
4277                 ;;
4278    aarch64*-linux-*)
4279                 TARGET=ARM64;
4280                 ;;
4281         aarch64-*)
4282                 TARGET=ARM64
4283                 ;;
4284         riscv32*)
4285                 TARGET=RISCV32
4286                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4287                 AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4288                 arch_target=riscv32
4289                 target_mach=no
4290                 with_tls=pthread
4291                 ;;
4292         riscv64*)
4293                 TARGET=RISCV64
4294                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4295                 AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4296                 arch_target=riscv64
4297                 target_mach=no
4298                 with_tls=pthread
4299                 ;;
4300         *)
4301                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
4302         esac
4304         case "$target" in
4305         *-darwin*)
4306                 target_mach=yes
4307                 ;;
4308         *-linux-android*)
4309                 AC_DEFINE(TARGET_ANDROID, 1, [...])
4310                 ;;
4311         esac
4314 case "$TARGET" in
4315 WASM)
4316         AC_DEFINE(TARGET_WASM, 1, [...])
4317         arch_target=wasm
4318         ;;
4319 X86)
4320         AC_DEFINE(TARGET_X86, 1, [...])
4321         arch_target=x86
4322         ;;
4323 AMD64)
4324         AC_DEFINE(TARGET_AMD64, 1, [...])
4325         arch_target=amd64
4326         ;;
4327 ARM)
4328         AC_DEFINE(TARGET_ARM, 1, [...])
4329         arch_target=arm
4330         ACCESS_UNALIGNED="no"
4331         ;;
4332 ARM64)
4333         AC_DEFINE(TARGET_ARM64, 1, [...])
4334         arch_target=arm64
4335         ;;
4336 POWERPC)
4337         AC_DEFINE(TARGET_POWERPC, 1, [...])
4338         ;;
4339 POWERPC64)
4340         AC_DEFINE(TARGET_POWERPC, 1, [...])
4341         AC_DEFINE(TARGET_POWERPC64, 1, [...])
4342         ;;
4343 S390X)
4344         AC_DEFINE(TARGET_S390X, 1, [...])
4345         ;;
4346 MIPS)
4347         AC_DEFINE(TARGET_MIPS, 1, [...])
4348         ;;
4349 SPARC)
4350         AC_DEFINE(TARGET_SPARC, 1, [...])
4351         ;;
4352 SPARC64)
4353         AC_DEFINE(TARGET_SPARC64, 1, [...])
4354         ;;
4355 RISCV32)
4356         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4357         AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4358         ;;
4359 RISCV64)
4360         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4361         AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4362         ;;
4363 esac
4365 case "$TARGET" in
4366 *32* | ARM | X86 | POWERPC | MIPS | SPARC | WASM | ARM6432)
4367     target_sizeof_void_p=4
4368     ;;
4369 *64* | S390X)
4370     target_sizeof_void_p=8
4371     ;;
4373     AC_MSG_ERROR([unknown target])
4374     ;;
4375 esac
4377 case "$HOST" in
4378 WASM)
4379         AC_DEFINE(HOST_WASM, 1, [...])
4380         ;;
4381 X86)
4382         AC_DEFINE(HOST_X86, 1, [...])
4383         ;;
4384 AMD64)
4385         AC_DEFINE(HOST_AMD64, 1, [...])
4386         ;;
4387 ARM)
4388         AC_DEFINE(HOST_ARM, 1, [...])
4389         ;;
4390 ARM64)
4391         AC_DEFINE(HOST_ARM64, 1, [...])
4392         ;;
4393 POWERPC)
4394         AC_DEFINE(HOST_POWERPC, 1, [...])
4395         ;;
4396 POWERPC64)
4397         AC_DEFINE(HOST_POWERPC, 1, [...])
4398         AC_DEFINE(HOST_POWERPC64, 1, [...])
4399         ;;
4400 S390X)
4401         AC_DEFINE(HOST_S390X, 1, [...])
4402         ;;
4403 MIPS)
4404         AC_DEFINE(HOST_MIPS, 1, [...])
4405         ;;
4406 SPARC)
4407         AC_DEFINE(HOST_SPARC, 1, [...])
4408         ;;
4409 SPARC64)
4410         AC_DEFINE(HOST_SPARC64, 1, [...])
4411         ;;
4412 RISCV32)
4413         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4414         AC_DEFINE([HOST_RISCV32], [1], [Host is 32-bit RISC-V])
4415         ;;
4416 RISCV64)
4417         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4418         AC_DEFINE([HOST_RISCV64], [1], [Host is 64-bit RISC-V])
4419         ;;
4420 esac
4422 MONO_ARCH_GSHAREDVT_SUPPORTED=0
4423 case "$HOST" in
4424 X86 | AMD64 | ARM | ARM64)
4425         MONO_ARCH_GSHAREDVT_SUPPORTED=1 # keep in sync with mini-{x86,amd64,arm,arm64}.h
4426         ;;
4427 esac
4429 AM_CONDITIONAL(MONO_ARCH_GSHAREDVT_SUPPORTED, test $MONO_ARCH_GSHAREDVT_SUPPORTED = 1)
4430 AM_CONDITIONAL(TARGET_WASM, test $arch_target = wasm)
4432 dnl *************
4433 dnl *** VTUNE ***
4434 dnl *************
4436 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
4437 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
4439 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
4441 if test "x$enable_vtune" = "xyes"; then
4442         if test "x$with_vtune" = "x"; then
4443                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
4444         else
4445                 VTUNE_PATH=$with_vtune
4446         fi
4447         VTUNE_INCLUDE=$VTUNE_PATH/include
4448         case "$TARGET" in
4449         X86)
4450                 VTUNE_LIB=$VTUNE_PATH/lib32
4451                 ;;
4452         AMD64)
4453                 VTUNE_LIB=$VTUNE_PATH/lib64
4454                 ;;
4455         *)
4456                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
4457                 ;;
4458         esac
4459         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
4460                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
4461         fi
4462         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
4463                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
4464         fi
4466         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
4467         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
4469         AC_SUBST(VTUNE_LIBS)
4470         AC_SUBST(VTUNE_CFLAGS)
4472 dnl Use GCC atomic ops if they work on the target.
4473 if test x$GCC = "xyes"; then
4474         case $TARGET in
4475         X86 | AMD64 | ARM | ARM64 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64 | RISCV32 | RISCV64)
4476                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
4477                 ;;
4478         esac
4481 if test "x$target_mach" = "xyes"; then
4483    if test "x$TARGET_SYS" = "xWATCHOS"; then
4484           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
4485           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4486           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4487           BTLS_SUPPORTED=no
4488    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64"; then
4489           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4490           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4491           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4492           BTLS_SUPPORTED=no
4493           target_ios=yes
4494    else
4495        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
4496        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
4497        #error fail this for ios
4498        #endif
4499        ], [
4500                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
4501           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
4502           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
4503           target_osx=yes
4504        ], [
4505           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4506           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4507           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4508           BTLS_SUPPORTED=no
4509                   target_ios=yes
4510        ])
4511         fi
4512    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
4515 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
4517 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
4519 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
4520    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
4521 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
4522    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
4523 else
4524    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
4527 AC_DEFINE_UNQUOTED(TARGET_SIZEOF_VOID_P,${target_sizeof_void_p},[wordsize of target])
4529 if test "x$sizeof_register" = "x4"; then
4530   AC_DEFINE(SIZEOF_REGISTER,4,[size of target machine integer registers])
4531 elif test "x$sizeof_register" = "x8"; then
4532   AC_DEFINE(SIZEOF_REGISTER,8,[size of target machine integer registers])
4533 else
4534   AC_DEFINE_UNQUOTED(SIZEOF_REGISTER,${target_sizeof_void_p},[size of target machine integer registers])
4537 if test "x$have_visibility_hidden" = "xyes"; then
4538    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
4541 if test "x$have_deprecated" = "xyes"; then
4542    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
4545 dnl 
4546 dnl Simple Generational checks (sgen)
4548 SGEN_DEFINES=
4549 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
4550 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
4551 if test x$buildsgen = xyes; then
4552    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
4553    SGEN_DEFINES="-DHAVE_SGEN_GC"
4555         conc_gc_msg=""
4556    if test x$with_sgen_default_concurrent != xno; then
4557        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
4558            conc_gc_msg=" (concurrent by default)"
4559    fi
4561    if test "x$gc_msg" = "x"; then
4562       gc_msg="sgen$conc_gc_msg"
4563    else
4564       gc_msg="sgen$conc_gc_msg and $gc_msg"
4565    fi
4567 AC_SUBST(SGEN_DEFINES)
4568 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
4570 jit_status="Building and using the JIT"
4572 libsuffix=".so"
4574 case "$host" in
4575      *-*-darwin*)
4576         libsuffix=".dylib"
4577         LIBC="libc.dylib"
4578         INTL="libintl.dylib"
4579         SQLITE="libsqlite.0.dylib"
4580         SQLITE3="libsqlite3.0.dylib"
4581         X11="libX11.dylib"
4582         GDKX11="libgdk-x11-2.0.dylib"
4583         GTKX11="libgtk-x11-2.0.dylib"
4584         ;;
4585      *-*-*netbsd*)
4586         LIBC="libc.so"
4587         INTL="libintl.so"
4588         SQLITE="libsqlite.so"
4589         SQLITE3="libsqlite3.so"
4590         ;;
4591      *-*-kfreebsd*-gnu)
4592         LIBC="libc.so.0.1"
4593         INTL="libc.so.0.1"
4594         X11="libX11.so.6"
4595         ;;
4596     *-*-*freebsd*)
4597         LIBC="libc.so.7"
4598         INTL="libintl.so"
4599         SQLITE="libsqlite.so"
4600         SQLITE3="libsqlite3.so"
4601         ;;
4602     *-*-*openbsd*)
4603         LIBC="libc.so"
4604         INTL="libintl.so"
4605         SQLITE="libsqlite.so"
4606         SQLITE3="libsqlite3.so"
4607         ;;
4608     *-*-*linux*)
4609         AC_PATH_X
4610         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
4611         AC_MSG_CHECKING(for the soname of libX11.so)
4612         for i in $x_libraries $dlsearch_path; do
4613                 for r in 4 5 6; do
4614                         if test -f $i/libX11.so.$r; then
4615                                 X11=libX11.so.$r
4616                                 AC_MSG_RESULT($X11)
4617                         fi
4618                 done
4619         done
4620         
4621         if test "x$X11" = "xlibX11.so"; then
4622                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
4623                 X11=libX11.so.6
4624         fi
4625         ;;
4626 esac
4628 AC_SUBST(libsuffix)
4630 ######################################
4631 # EGLIB CHECKS
4632 ######################################
4634 GNUC_PRETTY=
4635 GNUC_UNUSED=
4636 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
4637 if test x$GCC = xyes; then
4638    GNUC_UNUSED='__attribute__((__unused__))'
4639    GNUC_NORETURN='__attribute__((__noreturn__))'
4640    case $host_cpu in
4641      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
4642    esac
4644 AC_SUBST(GNUC_PRETTY)
4645 AC_SUBST(GNUC_UNUSED)
4646 AC_SUBST(GNUC_NORETURN)
4647 AC_SUBST(BREAKPOINT)
4649 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
4651 case $host in
4652 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
4653     PATHSEP='\\'
4654     SEARCHSEP=';'
4655     OS="WIN32"
4656     PIDTYPE='void *'
4657     ;;
4659     PATHSEP='/'
4660     SEARCHSEP=':'
4661     OS="UNIX"
4662     PIDTYPE='int'
4663     ;;
4664 esac
4666 case $host in
4667         *-*-solaris*)
4668         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
4669         ;;
4670 esac
4672 case $target in
4673 arm*-darwin*|aarch64*-*|riscv*)
4674     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
4675     ;;
4676 i*86-*-darwin*)
4677     ORDER=G_LITTLE_ENDIAN
4678     ;;
4679 *-*-haiku*)
4680     LDFLAGS="$LDFLAGS -ltextencoding"
4681     ;;
4682 *-*-openbsd*)
4683     CFLAGS="$CFLAGS -pthread"
4684     LDFLAGS="$LDFLAGS -pthread"
4685     ;;
4686 esac
4688 AC_SUBST(ORDER)
4689 AC_SUBST(CFLAGS)
4690 AC_SUBST(PATHSEP)
4691 AC_SUBST(SEARCHSEP)
4692 AC_SUBST(OS)
4693 AC_SUBST(PIDTYPE)
4695 # Defined for all targets/platforms using classic Windows API support.
4696 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
4697 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
4699 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf)
4700 AC_CHECK_FUNCS(getrlimit)
4701 AC_CHECK_FUNCS(fork execv execve)
4702 AC_CHECK_FUNCS(waitpid)
4704 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
4706 if test x$with_overridable_allocators = xyes; then
4707         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
4708   AC_MSG_NOTICE([Overridable allocator support enabled])
4709 else
4710   AC_MSG_NOTICE([Overridable allocator support disabled])
4714 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
4715 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
4716 # removed once support for 10.6 is dropped.
4718 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
4720 if test x$target_osx = xyes; then
4721 AC_CHECK_FUNCS(getpwuid_r)
4722 elif test x$target_ios = xno; then
4723 AC_CHECK_FUNCS(strndup getpwuid_r)
4726 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
4728 AC_SEARCH_LIBS(sqrtf, m)
4730 # nanosleep may not be part of libc, also search it in other libraries
4731 AC_SEARCH_LIBS(nanosleep, rt)
4733 AC_SEARCH_LIBS(dlopen, dl)
4734 old_ldflags="${LDFLAGS}"
4735 # GNU specific option, this confuses IBM ld, but do offer alternatives when possible
4736 if test $lt_cv_prog_gnu_ld = yes; then
4737         LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4738 else
4739         case $host in
4740         *-*-aix*|*-*-os400*)
4741                 ;;
4742         *)
4743                 dnl Try to use export-dynamic anyways
4744                 LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4745                 ;;
4746         esac
4748 AC_TRY_LINK(, [int i;], found_export_dynamic=yes, found_export_dynamic=no)
4749 if test $found_export_dynamic = no; then
4750         LDFLAGS="${old_ldflags}"
4753 AC_CHECK_HEADERS(getopt.h sys/select.h sys/time.h sys/wait.h pwd.h iconv.h sys/types.h sys/resource.h)
4754 dnl giconv.c will check on HAVE_ICONV_H but we need this for link time
4755 AC_CHECK_LIB(iconv, iconv_open)
4756 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
4757 AC_SUBST(HAVE_ALLOCA_H)
4759 # Get the exact type of size_t, not just its size.
4760 # This is so we can find an exact printf format among u, lu, llu, I64u.
4761 # To avoid warnings about slight mismatches.
4762 # C99 runtime "zu" dependency is being avoided here.
4764 # We have to compile as C++ because C is too lenient
4765 # and lets the wrong thing compile, with warnings.
4767 # Note: "zu" or ifdef <something> have the advantage
4768 # of producing installable "biarch" headers. i.e. one Mac header
4769 # for Mac/x86 and Mac/amd64.
4771 AC_LANG_PUSH(C++)
4773 # Check long before int because it is the overwhelming Unix answer,
4774 # across 32bit and 64bit systems -- fewer compiler invocations in autoconf.
4776 # long ahead of int also tends to produce biarch-compatible headers except Windows.
4778 AC_MSG_CHECKING(if size_t is unsigned long)
4779 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4780         #include <stddef.h>
4781         unsigned long *a = (size_t*)0;
4782 ])], [
4783         AC_MSG_RESULT(yes)
4784         AC_SUBST(GSIZE_FORMAT, '"lu"')
4785 ], [
4786         AC_MSG_RESULT(no)
4787         AC_MSG_CHECKING(if size_t is unsigned int)
4788         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4789                 #include <stddef.h>
4790                 unsigned *a = (size_t*)0;
4791         ])], [
4792                 AC_MSG_RESULT(yes)
4793                 AC_SUBST(GSIZE_FORMAT, '"u"')
4794         ], [
4795 # At this point the majority of systems have their answer,
4796 # and we descend into non-standard or new-standard territory.
4798 # Check __int64 first because I64 on some systems predates ll, enabling
4799 # new compiler/old runtime interop, and the types always have the same size.
4800                 AC_MSG_RESULT(no)
4801                 AC_MSG_CHECKING(if size_t is unsigned __int64)
4802                 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4803                         #include <stddef.h>
4804                         unsigned __int64 *a = (size_t*)0;
4805                 ])], [
4806                         AC_MSG_RESULT(yes)
4807                         AC_SUBST(GSIZE_FORMAT, '"I64u"')
4808                 ], [
4809                         AC_MSG_RESULT(no)
4810                         AC_MSG_CHECKING(if size_t is unsigned long long)
4811                         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4812                                 #include <stddef.h>
4813                                 unsigned long long *a = (size_t*)0;
4814                         ])], [
4815                                 AC_MSG_RESULT(yes)
4816                                 AC_SUBST(GSIZE_FORMAT, '"llu"')
4817                         ], [
4818                                 AC_MSG_RESULT(no)
4819                                 AC_MSG_ERROR(Unable to determine size_t among unsigned long, int, __int64, long long)
4820                         ] )
4821                 ] )
4822         ] )
4823 ] )
4825 AC_LANG_POP
4827 # If size_t/ptrdiff_t is correct, use it. Otherwise C99 [u]intptr_t.
4828 # This provides for an exact match with functions that
4829 # take size_t like malloc and pthread_attr_getstacksize, avoiding warnings.
4830 # uintptr_t is not necessarily the same.
4832 # ptrdiff_t is preferred over ssize_t as it is C89 vs. new Posix.
4833 # ssize_t looks nicer but ptrdiff_t is wrapped up as gssize anyway.
4835 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_size_t; then
4836    GSIZE="size_t"
4837    GSSIZE="ptrdiff_t"
4838 else
4839    GSIZE="uintptr_t"
4840    GSSIZE="intptr_t"
4843 AC_SUBST(GSIZE)
4844 AC_SUBST(GSSIZE)
4845 AC_SUBST(GSIZE_FORMAT)
4848 # END OF EGLIB CHECKS
4851 AC_ARG_WITH([libgdiplus],
4852         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
4853         [], [with_libgdiplus=installed])
4855 # default install location
4856 libgdiplus_install_loc=libgdiplus${libsuffix}
4857 case "$host" in
4858     *-*-*linux*)
4859     libgdiplus_install_loc=libgdiplus${libsuffix}.0
4860     ;;
4861 esac
4863 case $with_libgdiplus in
4864     no)
4865     libgdiplus_loc=
4866     ;;
4868     installed)
4869     libgdiplus_loc=
4870     if test x$cross_compiling = xno; then
4871         if test x$host_darwin = xyes; then
4872             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
4873             if test -x $a; then
4874               libgdiplus_install_loc=$a
4875               libgdiplus_loc=$a
4876             fi
4877         fi
4878     fi
4879     ;;
4881     yes|sibling)
4882     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
4883     ;;
4885     /*) # absolute path, assume it is an install location
4886     libgdiplus_loc=$with_libgdiplus
4887     libgdiplus_install_loc=$with_libgdiplus
4888     ;;
4890     *)
4891     libgdiplus_loc=`pwd`/$with_libgdiplus
4892     ;;
4893 esac
4894 AC_SUBST(libgdiplus_loc)
4895 AC_SUBST(libgdiplus_install_loc)
4897 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)
4898 if test "x$icall_symbol_map" = "xyes"; then
4899    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
4902 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
4903 if test "x$icall_export" = "xyes"; then
4904    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
4907 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
4908 if test "x$icall_tables" = "xno"; then
4909    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
4912 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
4914 if test "x$with_tls" = "x__thread"; then
4915         AC_DEFINE(MONO_KEYWORD_THREAD, __thread, [Have __thread keyword])
4916         # Pass the information to libgc
4917         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
4918         AC_MSG_CHECKING(if the tls_model attribute is supported)
4919         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
4920                 ], [
4921                         AC_MSG_RESULT(yes)
4922                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
4923                 ], [
4924                         AC_MSG_RESULT(no)
4925         ])
4928 if test ${TARGET} = ARM; then
4929         dnl ******************************************
4930         dnl *** Check to see what FPU is available ***
4931         dnl ******************************************
4932         AC_MSG_CHECKING(which FPU to use)
4934         #
4935         # This is a bit tricky:
4936         #
4937         # if (__ARM_PCS_VFP) {
4938         #       /* mfloat-abi=hard == VFP with hard ABI */
4939         # } elif (!__SOFTFP__) {
4940         #       /* mfloat-abi=softfp == VFP with soft ABI */
4941         # } else {
4942         #       /* mfloat-abi=soft == no VFP */
4943         # }
4944         #
4945         # The exception is iOS (w/ GCC) where none of the above
4946         # are defined (but iOS always uses the 'softfp' ABI).
4947         #
4948         # No support for FPA.
4949         #
4951         fpu=NONE
4953         # iOS GCC always uses the 'softfp' ABI.
4954         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
4955                 fpu=VFP
4956         fi
4958         # Are we using the 'hard' ABI?
4959         if test x$fpu = xNONE; then
4960                 AC_TRY_COMPILE([], [
4961                         #ifndef __ARM_PCS_VFP
4962                         #error "Float ABI is not 'hard'"
4963                         #endif
4964                 ], [
4965                         fpu=VFP_HARD
4966                 ], [
4967                         fpu=NONE
4968                 ])
4969         fi
4971         # No 'hard' ABI. 'soft' or 'softfp'?
4972         if test x$fpu = xNONE; then
4973                 AC_TRY_COMPILE([], [
4974                         #ifdef __SOFTFP__
4975                         #error "Float ABI is not 'softfp'"
4976                         #endif
4977                 ], [
4978                         fpu=VFP
4979                 ], [
4980                         fpu=NONE
4981                 ])
4982         fi
4984         if test x$arm_fpu != x; then
4985            fpu=$arm_fpu
4986         fi
4988         AC_MSG_RESULT($fpu)
4989         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
4990         unset fpu
4992         dnl *********************************************
4993         dnl *** Check which ARM version(s) we can use ***
4994         dnl *********************************************
4995         AC_MSG_CHECKING(which ARM version to use)
4997         AC_TRY_COMPILE([], [
4998                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
4999                 #error Not on ARM v5.
5000                 #endif
5001         ], [
5002                 arm_v5=yes
5004                 arm_ver=ARMv5
5005         ], [])
5007         AC_TRY_COMPILE([], [
5008                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
5009                 #error Not on ARM v6.
5010                 #endif
5011         ], [
5012                 arm_v5=yes
5013                 arm_v6=yes
5015                 arm_ver=ARMv6
5016         ], [])
5018         AC_TRY_COMPILE([], [
5019                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
5020                 #error Not on ARM v7.
5021                 #endif
5022         ], [
5023                 arm_v5=yes
5024                 arm_v6=yes
5025                 arm_v7=yes
5027                 arm_ver=ARMv7
5028         ], [])
5030         AC_MSG_RESULT($arm_ver)
5032         if test x$arm_v5 = xyes; then
5033                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
5034                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
5035         fi
5037         if test x$arm_v6 = xyes; then
5038                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
5039                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
5040         fi
5042         if test x$arm_v7 = xyes; then
5043                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
5044                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
5045         fi
5048 if test ${TARGET} = RISCV32 -o ${TARGET} = RISCV64; then
5049         AC_ARG_WITH([riscv-fpabi], [  --with-riscv-fpabi=auto,double,soft   Select RISC-V floating point ABI (auto)], [fpabi=$withval], [fpabi=double])
5051         AC_MSG_CHECKING([which RISC-V floating point ABI to use])
5053         if test x$fpabi = xauto; then
5054                 AC_TRY_COMPILE([], [
5055                         #ifdef __riscv_float_abi_double
5056                         #error "double"
5057                         #endif
5058                 ], [
5059                 ], [
5060                         fpabi=double
5061                 ])
5062         fi
5064         if test x$fpabi = xauto; then
5065                 AC_TRY_COMPILE([], [
5066                         #ifdef __riscv_float_abi_single
5067                         #error "single"
5068                         #endif
5069                 ], [
5070                 ], [
5071                         fpabi=single
5072                 ])
5073         fi
5075         if test x$fpabi = xauto; then
5076                 AC_TRY_COMPILE([], [
5077                         #ifdef __riscv_float_abi_soft
5078                         #error "soft"
5079                         #endif
5080                 ], [
5081                 ], [
5082                         fpabi=soft
5083                 ])
5084         fi
5086         case $fpabi in
5087         double)
5088                 AC_DEFINE([RISCV_FPABI_DOUBLE], [1], [RISC-V FPABI is double-precision])
5089                 AC_MSG_RESULT([double-precision])
5090                 ;;
5091         single)
5092                 AC_DEFINE([RISCV_FPABI_SINGLE], [1], [RISC-V FPABI is single-precision])
5093                 AC_MSG_ERROR([single-precision, not supported])
5094                 ;;
5095         soft)
5096                 AC_DEFINE([RISCV_FPABI_SOFT], [1], [RISC-V FPABI is soft float])
5097                 AC_MSG_RESULT([soft float])
5098                 ;;
5099         auto)
5100                 AC_MSG_ERROR([unknown])
5101                 ;;
5102         *)
5103                 AC_MSG_ERROR([invalid option: $fpabi])
5104                 ;;
5105         esac
5108 if test ${TARGET} = unknown; then
5109         CPPFLAGS="$CPPFLAGS -DNO_PORT"
5110         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
5113 if test "x$platform_android" = "xyes"; then
5114         case "x${TARGET}" in
5115         xARM)
5116                 case "x$arm_ver" in
5117                 xARMv5)
5118                         BTLS_SUPPORTED=yes
5119                         BTLS_PLATFORM=android-armv5
5120                         ;;
5121                 xARMv6)
5122                         BTLS_SUPPORTED=yes
5123                         BTLS_PLATFORM=android-armv6
5124                         ;;
5125                 xARMv7)
5126                         BTLS_SUPPORTED=yes
5127                         BTLS_PLATFORM=android-armv7
5128                         ;;
5129                 *)
5130                         BTLS_SUPPORTED=no
5131                         ;;
5132                 esac
5133                 ;;
5134         xARM64)
5135                 BTLS_SUPPORTED=yes
5136                 BTLS_PLATFORM=android-v8a
5137                 ;;
5138         xX86)
5139                 BTLS_SUPPORTED=yes
5140                 BTLS_PLATFORM=android-x86
5141                 ;;
5142         xAMD64)
5143                 BTLS_SUPPORTED=yes
5144                 BTLS_PLATFORM=android-x64
5145                 ;;
5146         *)
5147                 BTLS_SUPPORTED=no
5148                 ;;
5149         esac
5152 if test ${ACCESS_UNALIGNED} = no; then
5153         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
5156 if test x$host_darwin = xyes; then
5157         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
5158         AS_IF(
5159                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
5160                 [AC_MSG_RESULT([no])],
5161                 [
5162                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
5163                         AR_FLAGS="Scru"
5164                         RANLIB="$RANLIB -no_warning_for_no_symbols"
5165                         AC_MSG_RESULT([yes])
5166                 ]
5167         )
5170 case "x$libgc" in
5171         xincluded)
5172                 # Pass CPPFLAGS to libgc configure
5173                 # We should use a separate variable for this to avoid passing useless and
5174                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
5175                 # This should be executed late so we pick up the final version of CPPFLAGS
5176                 # The problem with this approach, is that during a reconfigure, the main
5177                 # configure scripts gets invoked with these arguments, so we use separate
5178                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
5179                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
5180                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
5181                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
5182                 fi
5183                 # Don't pass -finstrument-for-thread-suspension in, 
5184                 # if these are instrumented it will be very bad news 
5185                 # (infinite recursion, undefined parking behavior, etc)
5186                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
5187                 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\""
5188                 if test "x$support_boehm" = "xyes"; then
5189                         AC_CONFIG_SUBDIRS(libgc)
5190                 fi
5191                 ;;
5192 esac
5194 MALLOC_MEMPOOLS=no
5195 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
5196         if test x$with_malloc_mempools = xyes; then
5197                 MALLOC_MEMPOOLS=yes
5198                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
5199         fi
5203 DISABLE_MCS_DOCS=default
5204 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
5205         if test x$with_mcs_docs != xyes; then
5206                 DISABLE_MCS_DOCS=yes
5207         fi
5209 if test -n "$INSTALL_4_x_TRUE"; then :
5210         DISABLE_MCS_DOCS=yes
5212 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
5213    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
5216 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)],[
5217         if test x$with_lazy_gc_thread_creation != xno ; then
5218                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
5219         fi
5220 ], [with_lazy_gc_thread_creation=no])
5222 dnl *****************************
5223 dnl *** Thread suspend policy ***
5224 dnl *****************************
5226 dnl Set a default hybrid or cooperative suspend on some platforms
5228 dnl Coop default is set by the bitcode preset.
5230 dnl If coop isn't on by default, maybe hybrid should be?
5231 if test x$enable_cooperative_suspend_default != xyes; then
5232         case $HOST in
5233         X86 | AMD64)
5234                 dnl Some host/target confusion, there's no host_osx (and
5235                 dnl host_darwin would be true on iOS not just macOS).
5236                 if test x$target_osx = xyes; then
5237                         enable_hybrid_suspend_default=yes
5238                 elif test x$host_linux = xyes -o x$host_win32 = xyes; then
5239                         enable_hybrid_suspend_default=yes
5240                 fi
5241                 ;;
5242         esac
5245 dnl Now check if there were flags overriding the defaults
5247 AC_ARG_WITH(cooperative_gc,        [  --with-cooperative-gc=yes|no        Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [AC_MSG_WARN([--with-cooperative-gc is deprecated, use --enable-cooperative-suspend instead])], [with_cooperative_gc=default])
5248 AC_ARG_ENABLE(cooperative_suspend, [  --enable-cooperative-suspend      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [], [enable_cooperative_suspend=default])
5250 if test x$enable_cooperative_suspend = xdefault -a x$with_cooperative_gc != xdefault; then
5251         enable_cooperative_suspend=$with_cooperative_gc
5254 if test x$enable_cooperative_suspend = xdefault; then
5255         enable_cooperative_suspend=$enable_cooperative_suspend_default
5258 if test x$enable_cooperative_suspend != xno; then
5259         AC_DEFINE(ENABLE_COOP_SUSPEND,1,[Enable cooperative stop-the-world garbage collection.])
5262 AM_CONDITIONAL([ENABLE_COOP_SUSPEND], [test x$enable_cooperative_suspend != xno])
5264 AC_ARG_ENABLE(hybrid_suspend, [ --enable-hybrid-suspend     Enable hybrid stop-the-world garbage collection (sgen only) - cooperative suspend for threads running managed and runtime code, and preemptive suspend for threads running native and P/Invoke code (defaults to no)], [], [enable_hybrid_suspend=default])
5266 if test x$enable_hybrid_suspend = xdefault; then
5267    enable_hybrid_suspend=$enable_hybrid_suspend_default
5270 if test x$enable_hybrid_suspend != xno -a x$enable_cooperative_suspend != xno ; then
5271         AC_MSG_ERROR([Hybrid suspend and Cooperative suspend cannot be both enabled.])
5274 if test x$enable_hybrid_suspend != xno ; then
5275         AC_DEFINE(ENABLE_HYBRID_SUSPEND,1,[Enable hybrid suspend for GC stop-the-world])
5278 AM_CONDITIONAL([ENABLE_HYBRID_SUSPEND], [test x$enable_hybrid_suspend != xno])
5280 dnl End of thread suspend policy
5282 dnl ***************************
5283 dnl *** feature experiments ***
5284 dnl ***************************
5286 dnl When adding experiments, also add to mono/utils/mono-experiments.def
5287 AC_ARG_ENABLE(experiment, [ --enable-experiment=LIST       Enable experimental fatures from the comma-separate LIST.  Available experiments: null],[
5289         if test x$enable_experiment != x ; then
5290                 AC_DEFINE(ENABLE_EXPERIMENTS,1,[Enable feature experiments])
5291         fi
5292         for feature in `echo "$enable_experiment" | sed -e "s/,/ /g"`; do
5293                 eval "mono_experiment_test_enable_$feature='yes'"
5294         done
5296         if test "x$mono_experiment_test_enable_all" = "xyes"; then
5297                 eval "mono_experiment_test_enable_null='yes'"
5298                 true
5299         fi
5301         if test "x$mono_experiment_test_enable_null" = "xyes"; then
5302                 AC_DEFINE(ENABLE_EXPERIMENT_null, 1, [Enable experiment 'null'])
5303         fi
5304 ],[])
5306 dnl **********************
5307 dnl *** checked builds ***
5308 dnl **********************
5310 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],[
5312         if test x$enable_checked_build != x ; then
5313                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
5314         fi
5315         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
5316                 eval "mono_checked_build_test_enable_$feature='yes'"
5317         done
5319         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
5320                 eval "mono_checked_build_test_enable_gc='yes'"
5321                 eval "mono_checked_build_test_enable_metadata='yes'"
5322                 eval "mono_checked_build_test_enable_thread='yes'"
5323                 eval "mono_checked_build_test_enable_private_types='yes'"
5324         fi
5326         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
5327                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
5328         fi
5330         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
5331                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
5332         fi
5334         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
5335                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
5336         fi
5338         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
5339                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
5340         fi
5341 ], [])
5343 dnl End of checked builds
5345 AC_CHECK_HEADER([malloc.h], 
5346                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
5347                         [Define to 1 if you have /usr/include/malloc.h.])],,)
5349 if test x"$GCC" = xyes; then
5350         # Implicit function declarations are not 64 bit safe
5351         # Do this late, since this causes lots of configure tests to fail
5352         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
5353         # jay has a lot of implicit declarations
5354         JAY_CFLAGS="-Wno-implicit-function-declaration"
5357 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
5358 # instead of libmono-static.a
5359 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
5360    LIBMONO_LA=libmini-static.la
5361 else
5362    if test x$buildsgen = xyes; then
5363       LIBMONO_LA=libmonosgen-$API_VER.la
5364    else
5365       LIBMONO_LA=libmonoboehm-$API_VER.la
5366    fi
5368 AC_SUBST(LIBMONO_LA)
5370 dnl **************
5371 dnl ***  Btls  ***
5372 dnl **************
5374 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
5375 AC_ARG_ENABLE(btls-lib, [  --disable-btls-lib             Disable building the BTLS native library], enable_btls_lib=$enableval, enable_btls_lib=$BTLS_SUPPORTED)
5376 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
5378 if test "x$enable_btls" = "xno"; then
5379    enable_btls_lib=no
5382 AM_CONDITIONAL(BTLS, test x$enable_btls_lib = xyes)
5384 btls_android=no
5385 if test "x$enable_btls" = "xyes"; then
5386         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
5387         if test "x$CMAKE" = "xno"; then
5388                 AC_MSG_ERROR("cmake not found")
5389         fi
5391         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
5392         AC_SUBST(BTLS_ROOT)
5394         btls_arch=
5395         btls_cflags=
5396         BTLS_CMAKE_ARGS=
5398         if test "x$host_win32" = "xyes"; then
5399                 AC_CHECK_PROG(HAVE_YASM, yasm, yes, no)
5400         fi
5402         case "$BTLS_PLATFORM" in
5403         i386)
5404                 btls_arch=i386
5405                 btls_cflags="-m32"
5406                 case $host_os in
5407                         darwin*)
5408                                 btls_cflags="$btls_cflags -arch i386"
5409                                 ;;
5410                         mingw*|cygwin*)
5411                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5412                                 if test "x$HAVE_YASM" != "xyes"; then
5413                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5414                                 fi
5415                                 ;;
5416                 esac
5417                 ;;
5418         x86_64)
5419                 btls_arch=x86_64
5420                 case $host_os in
5421                         mingw*|cygwin*)
5422                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5423                                 if test "x$HAVE_YASM" != "xyes"; then
5424                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5425                                 fi
5426                                 ;;
5427                 esac
5428                 ;;
5429         arm)
5430                 btls_arch=arm
5431                 btls_cflags="-DOPENSSL_NO_ASM=1"
5432                 ;;
5433         armsoft)
5434                 btls_arch=arm
5435                 btls_cflags="-DOPENSSL_NO_ASM=1"
5436                 ;;
5437         aarch64)
5438                 btls_arch=aarch64
5439                 btls_cflags="-march=armv8-a+crypto"
5440                 ;;
5441         s390x)
5442                 btls_arch=s390x
5443                 ;;
5444         powerpc)
5445                 btls_arch=powerpc
5446                 case $host_os in
5447                         aix*|os400*)
5448                                 btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
5449                                 BTLS_CMAKE_ARGS="-DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
5450                 esac
5451                 ;;
5452         android-armv5)
5453                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
5454                 ;;
5455         android-armv6)
5456                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
5457                 ;;
5458         android-armv7)
5459                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=14"
5460                 ;;
5461         android-v8a)
5462                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=21"
5463                 ;;
5464         android-x86)
5465                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=14"
5466                 ;;
5467         android-x64)
5468                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=21"
5469                 ;;
5470         riscv32)
5471                 btls_arch=riscv32
5472                 ;;
5473         riscv64)
5474                 btls_arch=riscv64
5475                 ;;
5476         *)
5477                 AC_MSG_ERROR(Invalid BTLS platform)
5478         esac
5480         if test "x$platform_android" = "xyes"; then
5481                 btls_android=yes
5482                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
5483                 if test "x$with_btls_android_ndk" != "x"; then
5484                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
5485                 else
5486                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
5487                 fi
5488         fi
5490         if test "x$btls_arch" != "x"; then
5491                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
5492         fi
5494         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
5495         AC_SUBST(BTLS_ARCH)
5496         AC_SUBST(BTLS_CFLAGS)
5497         AC_SUBST(BTLS_PLATFORM)
5498         AC_SUBST(BTLS_CMAKE_ARGS)
5500         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
5501 else
5502         enable_btls=no
5505 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
5507 if test x$DISABLE_MCS_DOCS = xyes; then
5508    docs_dir=""
5509 else
5510    docs_dir=docs
5512 AC_SUBST(docs_dir)
5514 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
5515 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
5516 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
5518 libmono_ldflags="$libmono_ldflags $LIBS"
5520 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
5521 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
5522 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
5523 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
5524 AM_CONDITIONAL(X86, test x$TARGET = xX86)
5525 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
5526 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
5527 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
5528 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
5529 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
5530 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64)
5531 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
5532 AM_CONDITIONAL([RISCV], [test x$TARGET = xRISCV32 -o x$TARGET = xRISCV64])
5533 AM_CONDITIONAL([RISCV32], [test x$TARGET = xRISCV32])
5534 AM_CONDITIONAL([RISCV64], [test x$TARGET = xRISCV64])
5535 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
5536 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
5537 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
5538 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
5539 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
5540 AM_CONDITIONAL([HOST_RISCV], [test x$HOST = xRISCV32 -o x$HOST = xRISCV64])
5541 AM_CONDITIONAL([HOST_RISCV32], [test x$HOST = xRISCV32])
5542 AM_CONDITIONAL([HOST_RISCV64], [test x$HOST = xRISCV64])
5543 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
5545 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
5547 AC_SUBST(LIBC)
5548 AC_SUBST(INTL)
5549 AC_SUBST(SQLITE)
5550 AC_SUBST(SQLITE3)
5551 AC_SUBST(X11)
5552 AC_SUBST(GDKX11)
5553 AC_SUBST(GTKX11)
5554 AC_SUBST(XINERAMA)
5555 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
5556 AC_SUBST(arch_target)
5557 AC_SUBST(CFLAGS)
5558 AC_SUBST(CPPFLAGS)
5559 AC_SUBST(LDFLAGS)
5561 #This must always be defined when building the runtime
5562 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
5564 mono_build_root=`pwd`
5565 AC_SUBST(mono_build_root)
5567 AC_ARG_ENABLE(msvc,[  --enable-msvc    Build with Visual Studio (msvc) (defaults to no)], enable_msvc=$enableval, enable_msvc=no)
5568 if test x$host_win32 = xno; then
5569         if test x$enable_msvc = xyes; then
5570                 echo "Error, --enable-msvc only supported for Windows builds."
5571                 exit 1
5572         fi
5574 AM_CONDITIONAL(ENABLE_MSVC, test x$enable_msvc = xyes)
5576 if test "x$enable_msvc" = "xyes"; then
5577         if test "x$support_boehm" = "xyes"; then
5578                 echo "Error, Boehm GC is not supported when using --enable-msvc."
5579                 exit 1
5580         fi
5581         mono_msvc_build_dir='$(top_srcdir)'/msvc/build/sgen
5582         if test "x$host_cpu" = "xi686"; then
5583                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/Win32/lib/Release
5584                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/Win32/bin/Release
5585                 mono_runtime=msvc/build/sgen/Win32/bin/Release/mono-sgen.exe
5586         else
5587                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/x64/lib/Release
5588                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/x64/bin/Release
5589                 mono_runtime=msvc/build/sgen/x64/bin/Release/mono-sgen.exe
5590         fi
5591         AC_SUBST(mono_msvc_build_dir)
5592         AC_SUBST(mono_msvc_build_lib_dir)
5593         AC_SUBST(mono_msvc_build_bin_dir)
5594 else
5595         mono_runtime=mono/mini/mono
5598 AC_SUBST(mono_runtime)
5600 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/Microsoft.Net.Compilers.2.8.2/tools/csc.exe
5602 if test $csc_compiler = mcs; then
5603   CSC=$mcs_topdir/class/lib/build/mcs.exe
5604 else
5605   CSC=$CSC_LOCATION
5608 AM_CONDITIONAL([CSC_IS_ROSLYN], [test x$csc_compiler != xmcs])
5610 mono_cfg_root=$mono_build_root/runtime
5611 if test x$host_win32 = xyes; then
5612   if test "x$cross_compiling" = "xno"; then
5613     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
5614     CSC=`cygpath -m -a $CSC`
5615     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
5616   else
5617     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
5618   fi
5619 else
5620   mono_cfg_dir=$mono_cfg_root/etc
5622 AC_SUBST(mono_cfg_dir)
5624 AC_SUBST(CSC)
5626 AC_CONFIG_FILES([po/mcs/Makefile.in])
5628 AC_CONFIG_FILES([acceptance-tests/microbench-perf.sh],[chmod +x acceptance-tests/microbench-perf.sh])
5629 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
5630 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
5632 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
5633 [   depth=../../../..
5634     case $srcdir in
5635     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5636     .) reldir=$depth ;;
5637     *) reldir=$depth/$srcdir ;;
5638     esac
5639     $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
5640     cd runtime/etc/mono/1.0
5641     rm -f machine.config
5642     $LN_S $reldir/data/net_1_1/machine.config machine.config
5643     cd $depth
5644 ],[LN_S='$LN_S'])
5646 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
5647 [   depth=../../../..
5648     case $srcdir in
5649     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5650     .) reldir=$depth ;;
5651     *) reldir=$depth/$srcdir ;;
5652     esac
5653     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5654     cd runtime/etc/mono/2.0
5655     rm -f machine.config
5656     $LN_S $reldir/data/net_2_0/machine.config machine.config
5657     cd $depth
5658 ],[LN_S='$LN_S'])
5660 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
5661 [   depth=../../../..
5662     case $srcdir in
5663     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5664     .) reldir=$depth ;;
5665     *) reldir=$depth/$srcdir ;;
5666     esac
5667     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5668     cd runtime/etc/mono/2.0
5669     rm -f web.config
5670     $LN_S $reldir/data/net_2_0/web.config web.config
5671     cd $depth
5672 ],[LN_S='$LN_S'])
5674 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
5675 [   depth=../../..
5676     case $srcdir in
5677     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5678     .) reldir=$depth ;;
5679     *) reldir=$depth/$srcdir ;;
5680     esac
5681     $ac_aux_dir/install-sh -d runtime/etc/mono/
5682     cd runtime/etc/mono/
5683     rm -f browscap.ini
5684     $LN_S $reldir/data/browscap.ini browscap.ini
5685     cd $depth
5686 ],[LN_S='$LN_S'])
5688 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
5689 [   depth=../../../../..
5690     case $srcdir in
5691     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5692     .) reldir=$depth ;;
5693     *) reldir=$depth/$srcdir ;;
5694     esac
5695     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
5696     cd runtime/etc/mono/2.0/Browsers
5697     rm -f Compat.browser
5698     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5699     cd $depth
5700 ],[LN_S='$LN_S'])
5702 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
5703 [   depth=../../../../..
5704     case $srcdir in
5705     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5706     .) reldir=$depth ;;
5707     *) reldir=$depth/$srcdir ;;
5708     esac
5709     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
5710     cd runtime/etc/mono/4.0/Browsers
5711     rm -f Compat.browser
5712     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5713     cd $depth
5714 ],[LN_S='$LN_S'])
5716 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
5717 [   depth=../../../../..
5718     case $srcdir in
5719     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5720     .) reldir=$depth ;;
5721     *) reldir=$depth/$srcdir ;;
5722     esac
5723     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
5724     cd runtime/etc/mono/4.5/Browsers
5725     rm -f Compat.browser
5726     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5727     cd $depth
5728 ],[LN_S='$LN_S'])
5730 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
5731 [   depth=../../../..
5732     case $srcdir in
5733     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5734     .) reldir=$depth ;;
5735     *) reldir=$depth/$srcdir ;;
5736     esac
5737     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5738     cd runtime/etc/mono/4.0
5739     rm -f machine.config
5740     $LN_S $reldir/data/net_4_0/machine.config machine.config
5741     cd $depth
5742 ],[LN_S='$LN_S'])
5744 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
5745 [   depth=../../../..
5746     case $srcdir in
5747     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5748     .) reldir=$depth ;;
5749     *) reldir=$depth/$srcdir ;;
5750     esac
5751     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5752     cd runtime/etc/mono/4.0
5753     rm -f web.config
5754     $LN_S $reldir/data/net_4_0/web.config web.config
5755     cd $depth
5756 ],[LN_S='$LN_S'])
5758 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
5759 [   depth=../../../..
5760     case $srcdir in
5761     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5762     .) reldir=$depth ;;
5763     *) reldir=$depth/$srcdir ;;
5764     esac
5765     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5766     cd runtime/etc/mono/4.5
5767     rm -f machine.config
5768     $LN_S $reldir/data/net_4_5/machine.config machine.config
5769     cd $depth
5770 ],[LN_S='$LN_S'])
5772 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
5773 [   depth=../../../..
5774     case $srcdir in
5775     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5776     .) reldir=$depth ;;
5777     *) reldir=$depth/$srcdir ;;
5778     esac
5779     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5780     cd runtime/etc/mono/4.5
5781     rm -f web.config
5782     $LN_S $reldir/data/net_4_5/web.config web.config
5783     cd $depth
5784 ],[LN_S='$LN_S'])
5786 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])
5787 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])
5788 AC_CONFIG_COMMANDS([clean-llvm], [rm -f llvm/llvm_config.mk])
5790 # Anything involving -Werror must be done late because autoconf depends on compiling with warnings to be success.
5791 if test x"$GCC" = xyes; then
5793         # incompatible-pointer-types requires gcc circa 5.x
5795         ORIG_CFLAGS=$CFLAGS
5796         CFLAGS="$CFLAGS -Wincompatible-pointer-types -Werror"
5797         AC_MSG_CHECKING(for -Wincompatible-pointer-types option to gcc)
5798         AC_TRY_COMPILE([],[
5799         ], [
5800                 AC_MSG_RESULT(yes)
5801                 CFLAGS="$ORIG_CFLAGS -Werror=incompatible-pointer-types"
5802         ], [
5803                 AC_MSG_RESULT(no)
5804                 CFLAGS=$ORIG_CFLAGS
5805         ])
5809 # Mono.Native Support
5810 # -------------------
5811 # Mono.Native is the new name for both System.Native and System.Security.Cryptography.Apple.
5812 # It is built as a stand-alone shared library and not bundled with the runtime because we
5813 # may need to build two different versions of it.
5815 # Starting with macOS 10.12+ and iOS 10+, Apple introduced a new Unified API for some of the
5816 # crypto primitives that we're using as part of System.Security.Cryptography.Apple.
5818 # On Desktop, we can check at runtime whether the OS version is recent enough and switch
5819 # implementation accordingly.  We build a single `libmono_native` shared library.
5821 # However, on Mobile we cannot have any undefined symbols as this would break Bitcode.
5823 # During the mobile build, we are called with `CC` containing an explicit minium version flag,
5824 # which is eiter `-mmacosx-version-min=`, `-mios-simulator-version-min=` or `-miphoneos-version-min=`
5825 # depending on platform.
5827 # We build two versions of the shared library:
5828 # - `libmono_native_compat` is built with whichever minimum version is passed to us via `CC`.
5829 # - `libmono_native_unifed` is built with the minimum version set to macOS 10.12+ / iOS 10+.
5831 # For testing purpuses, there is a function called `mono_native_get_platform_type ()`
5832 # (see mono/native/mono-native-platform.c), which returns a `MonoNativePlatformType` enum value.
5833 # There is also `Mono.MonoNativePlatform.GetPlatformType ()` (see mcs/class/System/Mono/MonoNativePlatform.cs).
5835 # This can be called by automated tests both to ensure that the library has been correctly installed and also
5836 # to verify that it's the correct version of it.
5839 sed_version_pattern='[[0-9]]\{1,2\}\(\.[[0-9]]\{1,2\}\)'
5840 if test x$target_osx = xyes; then
5841         sed_remove_mac_version_pattern="s/-mmacosx-version-min=$sed_version_pattern//g"
5842         grep_find_mac_version_pattern="-mmacosx-version-min=$sed_version_pattern"
5843         mono_native_compat_version=`echo $CC | grep -o -e $grep_find_mac_version_pattern`
5844         MONO_NATIVE_CC=`echo $CC | sed -e $sed_remove_mac_version_pattern`
5845         MONO_NATIVE_CXX=`echo $CXX | sed -e $sed_remove_mac_version_pattern`
5846         MONO_NATIVE_CPPFLAGS=`echo $CPPFLAGS | sed -e $sed_remove_mac_version_pattern`
5847         MONO_NATIVE_CFLAGS=`echo $CFLAGS | sed -e $sed_remove_mac_version_pattern`
5848         MONO_NATIVE_CXXFLAGS=`echo $CXXFLAGS | sed -e $sed_remove_mac_version_pattern`
5849         MONO_NATIVE_LDFLAGS=`echo $LDFLAGS | sed -e $sed_remove_mac_version_pattern`
5851         mono_native=yes
5852         MONO_NATIVE_PLATFORM=macos
5853         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_MACOS"
5854         AC_MSG_CHECKING([Mono.Native support])
5855         AC_MSG_RESULT(macos)
5857         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer],
5858                 [!(MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12)])
5860         if test x$mono_native_compat = xyes; then
5861                 mono_native_compat=yes
5862                 mono_native_text="Mac OSX (compat+unified)"
5863                 MONO_NATIVE_COMPAT_CFLAGS="$CFLAGS $mono_native_compat_version"
5864                 MONO_NATIVE_COMPAT_LDFLAGS="$LDFLAGS $mono_native_compat_version"
5865                 MONO_NATIVE_UNIFIED_CFLAGS="$MONO_NATIVE_CFLAGS -mmacosx-version-min=10.12"
5866                 MONO_NATIVE_UNIFIED_LDFLAGS="$MONO_NATIVE_LDFLAGS -mmacosx-version-min=10.12"
5867         else
5868                 mono_native_compat=no
5869                 mono_native_text="Mac OSX"
5870         fi
5871 elif test x$mono_native_platform_ios = xyes; then
5872         AC_MONO_APPLE_TARGET(TARGET_OS_SIMULATOR, [mono_native_ios_sim=yes], [mono_native_ios_sim=no])
5874         AC_MONO_APPLE_TARGET(TARGET_OS_IOS, [
5875                 if test x$mono_native_ios_sim = xyes; then
5876                         mono_native_ios_target=ios-simulator
5877                         mono_native_text="iOS Simulator"
5878                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5879                 else
5880                         mono_native_ios_target=iphoneos
5881                         mono_native_text="iOS Device"
5882                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5883                 fi
5884                 mono_native_unified_version="10.0"
5885                 mono_native_compat_check="__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_10_0"
5886         ], [
5887                 AC_MONO_APPLE_TARGET(TARGET_OS_TV, [
5888                         if test x$mono_native_ios_sim = xyes; then
5889                                 mono_native_ios_target=tvos-simulator
5890                                 mono_native_text="AppleTV Simulator"
5891                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5892                         else
5893                                 mono_native_ios_target=tvos
5894                                 mono_native_text="AppleTV Device"
5895                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5896                         fi
5897                         mono_native_unified_version="10.0"
5898                         mono_native_compat_check="__TV_OS_VERSION_MIN_REQUIRED >= __TVOS_10_0"
5899                 ], [
5900                         AC_MONO_APPLE_TARGET(TARGET_OS_WATCH, [
5901                                 if test x$mono_native_ios_sim = xyes; then
5902                                         mono_native_ios_target=watchos-simulator
5903                                         mono_native_text="Apple Watch Simulator"
5904                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5905                                 else
5906                                         mono_native_ios_target=watchos
5907                                         mono_native_text="Apple Watch Device"
5908                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5909                                 fi
5910                                 mono_native_unified_version="5.0"
5911                                 mono_native_compat_check="__WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_5_0"
5912                         ], [
5913                                 AC_MSG_ERROR([Unknown iOS Target])
5914                         ])
5915                 ])
5916         ])
5918         AC_MSG_CHECKING([Mono.Native support])
5919         AC_MSG_RESULT([$mono_native_ios_target])
5921         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer], [!($mono_native_compat_check)])
5923         sed_remove_ios_version_pattern="s/-m\(.*\)-version-min=$sed_version_pattern//g"
5924         grep_find_ios_version_pattern="-m$mono_native_ios_target-version-min=$sed_version_pattern"
5926         mono_native_compat_version=`echo $CC | grep -o -e $grep_find_ios_version_pattern`
5928         if test x$with_bitcode = xyes; then
5929                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -no-undefined -fatal_warnings"
5930                 MONO_NATIVE_LIBADD="../mini/$LIBMONO_LA"
5931         else
5932                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -fatal_warnings"
5933         fi
5935         if test x$enable_gss = xyes; then
5936                 mono_native_ldflags="$mono_native_ldflags -framework GSS"
5937         fi
5939         MONO_NATIVE_CC=`echo $CC | sed -e $sed_remove_ios_version_pattern`
5940         MONO_NATIVE_CXX=`echo $CXX | sed -e $sed_remove_ios_version_pattern`
5941         MONO_NATIVE_CPPFLAGS=`echo $CPPFLAGS | sed -e $sed_remove_ios_version_pattern`
5942         MONO_NATIVE_CXXFLAGS=`echo $CXXFLAGS | sed -e $sed_remove_ios_version_pattern`
5943         MONO_NATIVE_CFLAGS=`echo $CFLAGS | sed -e $sed_remove_ios_version_pattern`
5944         MONO_NATIVE_LDFLAGS=`echo $LDFLAGS $mono_native_ldflags | sed -e $sed_remove_ios_version_pattern`
5946         if test x$mono_native_compat = xyes; then
5947                 mono_native_text="$mono_native_text (compat+unified)"
5948                 MONO_NATIVE_COMPAT_CFLAGS="$CFLAGS $mono_native_compat_version"
5949                 MONO_NATIVE_COMPAT_LDFLAGS="$LDFLAGS $mono_native_compat_version"
5950                 MONO_NATIVE_UNIFIED_CFLAGS="$MONO_NATIVE_CFLAGS -m$mono_native_ios_target-version-min=$mono_native_unified_version"
5951                 MONO_NATIVE_UNIFIED_LDFLAGS="$MONO_NATIVE_LDFLAGS -m$mono_native_ios_target-version-min=$mono_native_unified_version"
5952         fi
5954         mono_native=yes
5955         MONO_NATIVE_PLATFORM=ios
5956 elif test x$host_linux = xyes; then
5957         mono_native_text="Linux"
5958         MONO_NATIVE_CC=$CC
5959         MONO_NATIVE_CXX=$CXX
5960         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
5961         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
5962         MONO_NATIVE_CFLAGS=$CFLAGS
5963         MONO_NATIVE_LDFLAGS=$LDFLAGS
5965         mono_native=yes
5966         mono_native_compat=no
5967         MONO_NATIVE_PLATFORM=linux
5968         AC_MSG_CHECKING([Mono.Native support])
5969         AC_MSG_RESULT(linux)
5971         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
5972 elif case $host_os in aix*|os400*) true;; *) false;; esac; then
5973         mono_native_text="AIX"
5974         MONO_NATIVE_CC=$CC
5975         MONO_NATIVE_CXX=$CXX
5976         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
5977         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
5978         MONO_NATIVE_CFLAGS=$CFLAGS
5979         MONO_NATIVE_LDFLAGS=$LDFLAGS
5981         mono_native=yes
5982         mono_native_compat=no
5983         MONO_NATIVE_PLATFORM=aix
5984         AC_MSG_CHECKING([Mono.Native support])
5985         AC_MSG_RESULT(aix)
5987         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_AIX"
5988 else
5989         mono_native=no
5990         mono_native_text="no"
5991         AC_MSG_CHECKING([Mono.Native support])
5992         AC_MSG_RESULT(no)
5995 if test x$mono_native_compat = xyes; then
5996         MONO_NATIVE_LIBRARY_NAME=libmono-native-compat
5997 else
5998         MONO_NATIVE_LIBRARY_NAME=libmono-native
6001 AC_SUBST(MONO_NATIVE_PLATFORM)
6002 AC_SUBST(MONO_NATIVE_CC)
6003 AC_SUBST(MONO_NATIVE_CXX)
6004 AC_SUBST(MONO_NATIVE_CPPFLAGS)
6005 AC_SUBST(MONO_NATIVE_CXXFLAGS)
6006 AC_SUBST(MONO_NATIVE_CFLAGS)
6007 AC_SUBST(MONO_NATIVE_COMPAT_CFLAGS)
6008 AC_SUBST(MONO_NATIVE_UNIFIED_CFLAGS)
6009 AC_SUBST(MONO_NATIVE_LDFLAGS)
6010 AC_SUBST(MONO_NATIVE_COMPAT_LDFLAGS)
6011 AC_SUBST(MONO_NATIVE_UNIFIED_LDFLAGS)
6012 AC_SUBST(MONO_NATIVE_LIBRARY_NAME)
6013 AC_SUBST(MONO_NATIVE_LIBADD)
6015 AM_CONDITIONAL(MONO_NATIVE, test x$mono_native = xyes)
6016 AM_CONDITIONAL(MONO_NATIVE_COMPAT, test x$mono_native_compat = xyes)
6017 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_MACOS, test x$MONO_NATIVE_PLATFORM = xmacos)
6018 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_IOS, test x$MONO_NATIVE_PLATFORM = xios)
6019 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_LINUX, test x$MONO_NATIVE_PLATFORM = xlinux)
6020 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_AIX, test x$MONO_NATIVE_PLATFORM = xaix)
6022 MONO_NATIVE_PLATFORM_TYPE_COMPAT="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_COMPAT"
6023 MONO_NATIVE_PLATFORM_TYPE_UNIFIED="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_UNIFIED"
6024 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE)
6025 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_COMPAT)
6026 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_UNIFIED)
6028 # Update all submodules recursively to ensure everything is checked out
6029 (cd $srcdir && scripts/update_submodules.sh)
6031 AC_OUTPUT([
6032 Makefile
6033 mono-uninstalled.pc
6034 acceptance-tests/Makefile
6035 llvm/Makefile
6036 scripts/mono-find-provides
6037 scripts/mono-find-requires
6038 mk/Makefile
6039 mono/Makefile
6040 mono/btls/Makefile
6041 mono/native/Makefile
6042 mono/utils/Makefile
6043 mono/utils/jemalloc/Makefile
6044 mono/metadata/Makefile
6045 mono/dis/Makefile
6046 mono/cil/Makefile
6047 mono/arch/Makefile
6048 mono/arch/x86/Makefile
6049 mono/arch/amd64/Makefile
6050 mono/arch/ppc/Makefile
6051 mono/arch/sparc/Makefile
6052 mono/arch/s390x/Makefile
6053 mono/arch/arm/Makefile
6054 mono/arch/arm64/Makefile
6055 mono/arch/mips/Makefile
6056 mono/arch/riscv/Makefile
6057 mono/sgen/Makefile
6058 mono/native/platform-type.c
6059 mono/native/platform-type-compat.c
6060 mono/native/platform-type-unified.c
6061 mono/tests/Makefile
6062 mono/tests/assembly-load-reference/Makefile
6063 mono/tests/tests-config
6064 mono/tests/gc-descriptors/Makefile
6065 mono/tests/testing_gac/Makefile
6066 mono/unit-tests/Makefile
6067 mono/benchmark/Makefile
6068 mono/mini/Makefile
6069 mono/profiler/Makefile
6070 mono/eglib/Makefile
6071 mono/eglib/eglib-config.h
6072 mono/eglib/test/Makefile
6073 m4/Makefile
6074 ikvm-native/Makefile
6075 scripts/Makefile
6076 man/Makefile
6077 docs/Makefile
6078 data/Makefile
6079 data/net_2_0/Makefile
6080 data/net_4_0/Makefile
6081 data/net_4_5/Makefile
6082 data/net_2_0/Browsers/Makefile
6083 data/net_4_0/Browsers/Makefile
6084 data/net_4_5/Browsers/Makefile
6085 data/mint.pc
6086 data/mono-2.pc
6087 data/monosgen-2.pc
6088 data/mono.pc
6089 data/mono-cairo.pc
6090 data/mono-nunit.pc
6091 data/mono-options.pc
6092 data/mono-lineeditor.pc
6093 data/monodoc.pc
6094 data/dotnet.pc
6095 data/dotnet35.pc
6096 data/wcf.pc
6097 data/cecil.pc
6098 data/system.web.extensions_1.0.pc
6099 data/system.web.extensions.design_1.0.pc
6100 data/system.web.mvc.pc
6101 data/system.web.mvc2.pc
6102 data/system.web.mvc3.pc
6103 data/aspnetwebstack.pc
6104 data/reactive.pc
6105 samples/Makefile
6106 support/Makefile
6107 data/config
6108 tools/Makefile
6109 tools/locale-builder/Makefile
6110 tools/sgen/Makefile
6111 tools/monograph/Makefile
6112 tools/pedump/Makefile
6113 runtime/Makefile
6114 msvc/Makefile
6115 po/Makefile
6118 if test x$host_win32 = xyes; then
6119    # Get rid of 'cyg' prefixes in library names
6120    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6121    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
6122    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
6123    # executable doesn't work...
6124    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6127 if test x$host_darwin = xyes; then
6128    # This doesn't seem to be required and it slows down parallel builds
6129    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
6133   case $prefix in
6134   NONE) prefix=$ac_default_prefix ;;
6135   esac
6136   case $exec_prefix in
6137   NONE) exec_prefix='${prefix}' ;;
6138   esac
6140   #
6141   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
6142   # any existing config.make.  This allows people to share the same source tree
6143   # with different build directories, one native and one cross
6144   #
6145   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
6147     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
6149     echo "prefix=$prefix" > $mcs_topdir/build/config.make
6150     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
6151     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
6152     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
6153     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
6154     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
6155     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
6156     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
6157     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
6159     case $INSTALL in
6160     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
6161     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
6162     esac
6164     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
6166     export VERSION
6167     [myver=$($AWK 'BEGIN {
6168       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
6169       if(length(vsplit [1]) > 4) {
6170         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
6171       }
6172       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
6173     }')]
6175     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
6176     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
6178     if test x$host_darwin = xyes; then
6179       echo "BUILD_PLATFORM = macos" >> $mcs_topdir/build/config.make
6180       echo "HOST_PLATFORM ?= macos" >> $mcs_topdir/build/config.make
6181       echo "XTEST_PLATFORM ?= osx" >> $mcs_topdir/build/config.make
6182     elif test x$host_win32 = xyes; then
6183       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
6184       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
6185       echo "XTEST_PLATFORM ?= windows" >> $mcs_topdir/build/config.make
6186     elif test x$host_linux = xyes; then
6187       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
6188       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6189       echo "XTEST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6190     else
6191       echo "BUILD_PLATFORM = unix" >> $mcs_topdir/build/config.make
6192       echo "HOST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6193       echo "XTEST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6194     fi
6196     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
6197       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
6198     fi
6200         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
6201            enable_system_aot=yes
6202         fi
6204     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
6205       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
6206     fi
6208     if test x$DISABLE_MCS_DOCS = xyes; then
6209       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
6210     fi
6212     if test x$has_extension_module != xno; then
6213         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
6214     fi
6215     
6216     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
6217     
6218     if test "x$test_bcl_opt" = "xyes"; then    
6219       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
6220     fi
6222     echo "CSC_LOCATION = $CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
6224     if test $csc_compiler = mcs; then
6225       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
6226     fi
6228     if test "x$AOT_BUILD_FLAGS" != "x" ; then
6229       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
6230       echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
6231       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
6232     fi
6234     if test "x$AOT_MODE" != "x" ; then
6235       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
6236     fi
6238     if test "x$enable_btls" = "xyes"; then
6239       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
6240     fi
6242     if test "x$mono_native" = "xyes"; then
6243       echo "MONO_NATIVE_SUPPORTED=true" >> $srcdir/$mcsdir/build/config.make
6244     else
6245       echo "MONO_NATIVE_SUPPORTED=false" >> $srcdir/$mcsdir/build/config.make
6246     fi
6248     if test x$mono_native_compat = xyes; then
6249       echo "MONO_NATIVE_USING_COMPAT=true" >> $srcdir/$mcsdir/build/config.make
6250     else
6251       echo "MONO_NATIVE_USING_COMPAT=false" >> $srcdir/$mcsdir/build/config.make
6252     fi
6254     echo "MONO_NATIVE_PLATFORM_TYPE=$MONO_NATIVE_PLATFORM_TYPE" >> $srcdir/$mcsdir/build/config.make
6255     echo "MONO_NATIVE_PLATFORM=$MONO_NATIVE_PLATFORM" >> $srcdir/$mcsdir/build/config.make
6257   fi
6261 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
6263 btls_platform_string=
6264 if test x$enable_btls = xyes; then
6265         if test x$btls_android = xyes; then
6266                 btls_platform_string=" (android:$BTLS_PLATFORM)"
6267         else
6268                 btls_platform_string=" ($BTLS_PLATFORM)"
6269         fi
6272 thread_suspend_msg=
6273 if test x$buildsgen = xyes; then
6274         if test x$enable_cooperative_suspend != xno; then
6275                 thread_suspend_msg="Suspend:       Cooperative"
6276         elif test x$enable_hybrid_suspend != xno; then
6277                 thread_suspend_msg="Suspend:       Hybrid"
6278         else
6279                 thread_suspend_msg="Suspend:       Preemptive"
6280         fi
6282         
6283 echo "
6284         mcs source:    $mcsdir
6285         C# Compiler:   $csc_compiler
6287    Engine:
6288         Host:          $host
6289         Target:        $target
6290         GC:            $gc_msg 
6291         $thread_suspend_msg
6292         TLS:           $with_tls
6293         SIGALTSTACK:   $with_sigaltstack
6294         Engine:        $jit_status
6295         BigArrays:     $enable_big_arrays
6296         DTrace:        $enable_dtrace
6297         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm, built in-tree: $internal_llvm, assertions: $enable_llvm_asserts, msvc only: $enable_llvm_msvc_only)
6298         Spectre:       $spectre_mitigation_status
6299         Mono.Native:   $mono_native_text
6301    Libraries:
6302         .NET 4.x:        $with_profile4_x
6303         Xamarin.Android: $with_monodroid
6304         Xamarin.iOS:     $with_monotouch
6305         Xamarin.WatchOS: $with_monotouch_watch
6306         Xamarin.TVOS:    $with_monotouch_tv
6307         Xamarin.Mac:     $with_xammac
6308         Windows AOT:     $with_winaot
6309         Orbis:           $with_orbis
6310         Unreal:          $with_unreal
6311         WebAssembly:     $with_wasm
6312         Test profiles:   AOT Full ($with_testing_aot_full), AOT Hybrid ($with_testing_aot_hybrid)
6313         JNI support:     $jdk_headers_found
6314         libgdiplus:      $libgdiplus_msg
6315         zlib:            $zlib_msg
6316         BTLS:            $enable_btls$btls_platform_string
6317         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
6318         crash reporting: $crash_reporting (private crashes: $with_crash_privacy)
6319         .NET Core:       $with_core
6320         $disabled
6322 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
6323    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)