[csproj] Update project files
[mono-project.git] / configure.ac
blob5174205a883fdcd15d6337a4192e2a2f6f5bb8e6
1 # Process this file with autoconf to produce a configure script.
2 #AC_PREREQ([2.62])
4 AC_INIT(mono, [6.1.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=D0E80A74-BC69-4440-B4A0-BA6B5A944F1A
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 target_wasm=no
121 platform_android=no
122 platform_tizen=no
123 platform_ios=no
124 host_darwin=no
125 host_linux=no
127 case "$host" in
128         wasm32*)
129                 CFLAGS="$CFLAGS -D_REENTRANT -D_GNU_SOURCE -s WASM=1"
130                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DUSE_MMAP -s WASM=1"
131                 libdl="-ldl"
132                 libgc_threads=pthreads
133                 platform_wasm=yes
134                 ;;
135         *-mingw*|*-*-cygwin*)
136                 AC_DEFINE(DISABLE_PORTABILITY,1,[Disable the io-portability layer])
137                 AC_DEFINE(HOST_NO_SYMLINKS,1,[This platform does not support symlinks])
138                 host_win32=yes
139                 mono_cv_clang=no
140                 if test "x$cross_compiling" = "xno"; then
141                         if test "x$host" = "x$build" -a "x$host" = "x$target"; then
142                                 target_win32=yes
143                         fi
144                 else
145                         if test "x$host" = "x$target"; then
146                                 target_win32=yes
147                         fi
148                 fi
149                 HOST_CC="gcc"
151                 # Windows 7 or later is required
152                 WIN32_CPPFLAGS="-DWINVER=0x0601 -D_WIN32_WINNT=0x0601 -D_WIN32_IE=0x0501 -D_UNICODE -DUNICODE -DWIN32_THREADS -DFD_SETSIZE=1024"
153                 CPPFLAGS="$CPPFLAGS $WIN32_CPPFLAGS"
154                 WIN32_LDFLAGS="-lbcrypt -lmswsock -lws2_32 -lole32 -loleaut32 -lpsapi -lversion -ladvapi32 -lwinmm -lkernel32 -liphlpapi"
155                 LDFLAGS="$LDFLAGS $WIN32_LDFLAGS"
156                 libmono_cflags="-mms-bitfields -mwindows"
157                 libmono_ldflags="-mms-bitfields -mwindows"
158                 libdl=
159                 libgc_threads=win32
160                 with_sigaltstack=no
161                 with_tls=pthread
162                 with_sgen_default_concurrent=yes
163                 LN_S=cp
164                 # This forces libgc to use the DllMain based thread registration code on win32
165                 libgc_configure_args="$libgc_configure_args --enable-win32-dllmain=yes"
166                 ;;
167         *-*-*netbsd*)
168                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DGC_NETBSD_THREADS -D_GNU_SOURCE"
169                 libmono_cflags="-D_REENTRANT"
170                 LDFLAGS="$LDFLAGS -pthread"
171                 CPPFLAGS="$CPPFLAGS -DHOST_BSD"
172                 libmono_ldflags="-pthread"
173                 need_link_unlink=yes
174                 libdl="-ldl"
175                 libgc_threads=pthreads
176                 with_sigaltstack=no
177                 use_sigposix=yes
178                 with_sgen_default_concurrent=yes
179                 ;;
180         *-*-kfreebsd*-gnu)
181                 CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP -DUSE_MUNMAP -DTHREAD_LOCAL_ALLOC -pthread"
182                 libmono_cflags="-D_REENTRANT -DTHREAD_LOCAL_ALLOC -pthread"
183                 libmono_ldflags="-lpthread -pthread"
184                 libdl="-ldl"
185                 libgc_threads=pthreads
186                 need_link_unlink=yes
187                 with_sigaltstack=no
188                 use_sigposix=yes
189                 with_sgen_default_concurrent=yes
190                 ;;
191         *-*-*freebsd*)
192                 dnl For close_my_fds
193                 LDFLAGS="$LDFLAGS -lutil"
194                 if test "x$PTHREAD_CFLAGS" = "x"; then
195                         CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS"
196                         libmono_cflags=
197                 else
198                         CPPFLAGS="$CPPFLAGS $PTHREAD_CFLAGS -DGC_FREEBSD_THREADS"
199                         libmono_cflags="$PTHREAD_CFLAGS"
200                 fi
201                 if test "x$PTHREAD_LIBS" = "x"; then
202                         LDFLAGS="$LDFLAGS -pthread -L/usr/local/lib"
203                         libmono_ldflags="-pthread"
204                 else
205                         LDFLAGS="$LDFLAGS $PTHREAD_LIBS -L/usr/local/lib"
206                         libmono_ldflags="$PTHREAD_LIBS"
207                 fi
208                 CPPFLAGS="$CPPFLAGS -DHOST_BSD -D_WITH_GETLINE"
209                 need_link_unlink=yes
210                 AC_DEFINE(PTHREAD_POINTER_ID, 1, [pthread is a pointer])
211                 libdl=
212                 libgc_threads=pthreads
213                 use_sigposix=yes
214                 has_dtrace=yes
215                 case "$host" in
216                 aarch64-*)
217                         support_boehm=no
218                         with_gc=sgen
219                         ;;
220                 riscv*)
221                         support_boehm=no
222                         with_gc=sgen
223                         ;;
224                 esac
225                 with_sgen_default_concurrent=yes
226                 ;;
227         *-*-*openbsd*)
228                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_OPENBSD_THREADS -DHOST_BSD -D_REENTRANT -DUSE_MMAP"
229                 LDFLAGS="${LDFLAGS} -Wl,-zwxneeded"
230                 if test "x$disable_munmap" != "xyes"; then
231                 CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
232                 fi
233                 libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
234                 LDFLAGS="$LDFLAGS -pthread"
235                 need_link_unlink=yes
236                 AC_DEFINE(PTHREAD_POINTER_ID)
237                 libdl=
238                 libgc_threads=pthreads
239                 with_tls=pthread
240                 with_sigaltstack=no
241                 use_sigposix=yes
242                 with_sgen_default_concurrent=yes
243                 ;;
244         *-*-linux-android*)
245                 platform_android=yes
246                 AC_DEFINE(HOST_ANDROID,1,[Targeting the Android platform])
247                 AC_DEFINE(TARGET_ANDROID,1,[Targeting the Android platform])
249                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
250                 if test "x$disable_munmap" != "xyes"; then
251                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
252                 fi
253                 libmono_cflags="-D_REENTRANT"
254                 libdl="-ldl"
255                 libgc_threads=pthreads
256                 use_sigposix=yes
258                 with_tls=pthread
259                 with_sigaltstack=no
260                 with_static_mono=no
262                 # Android doesn't support boehm, as it's missing <link.h>
263                 support_boehm=no
264                 with_gc=sgen
266                 # isinf(3) requires -lm
267                 LDFLAGS="$LDFLAGS -lm"
269                 # Bionic's <pthread.h> sets PTHREAD_STACK_MIN=2*PAGE_SIZE; doesn't define
270                 # PAGE_SIZE; breaks mono/io-layer/collection.c
271                 # Bionic doesn't provide S_IWRITE; breaks io-layer/io.c
272                 CFLAGS="$CFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
273                 CXXFLAGS="$CXXFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
275                 # to bypass the underscore linker check, can't work when cross-compiling
276                 mono_cv_uscore=yes
277                 mono_cv_clang=no
278                 ;;
279         *-*-linux*)
280                 host_linux=yes
281                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
282                 if test "x$disable_munmap" != "xyes"; then
283                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
284                 fi
285                 libmono_cflags="-D_REENTRANT"
286                 libdl="-ldl"
287                 libgc_threads=pthreads
288                 use_sigposix=yes
289                 if test "x$cross_compiling" != "xno"; then
290                         # to bypass the underscore linker check, not
291                         # available during cross-compilation
292                         mono_cv_uscore=no
293                 fi
294                 case "$host" in
295                 *-tizen-linux-*)
296                         platform_tizen=yes
297                         ;;
298                 esac
299                 case "$host" in
300                 aarch64-*)
301                         support_boehm=no
302                         with_gc=sgen
303                         ;;
304                 powerpc*-*-linux*)
305                         # https://bugzilla.novell.com/show_bug.cgi?id=504411
306                         disable_munmap=yes
307                         ;;
308                 riscv*)
309                         support_boehm=no
310                         with_gc=sgen
311                         ;;
312                 esac
313                 with_sgen_default_concurrent=yes
314                 ;;
315         *-*-nacl*)
316                 echo "nacl no longer supported."
317                 exit 1
318                 ;;
319         *-*-hpux*)
320                 CPPFLAGS="$CPPFLAGS -DGC_HPUX_THREADS -D_HPUX_SOURCE -D_XOPEN_SOURCE_EXTENDED -D_REENTRANT"
321                 # +ESdbgasm only valid on bundled cc on RISC
322                 # silently ignored for ia64
323                 if test $GCC != "yes"; then
324                         CFLAGS="$CFLAGS +ESdbgasm"
325                         # Arrange for run-time dereferencing of null
326                         # pointers to produce a SIGSEGV signal.
327                         LDFLAGS="$LDFLAGS -z"
328                 fi
329                 CFLAGS="$CFLAGS +ESdbgasm"
330                 LDFLAGS="$LDFLAGS -z"
331                 libmono_cflags="-D_REENTRANT"
332                 libmono_ldflags="-lpthread"
333                 libgc_threads=pthreads
334                 need_link_unlink=yes
335                 use_sigposix=yes
336                 ;;
337         *-*-solaris*)
338                 CPPFLAGS="$CPPFLAGS -DGC_SOLARIS_THREADS -DGC_SOLARIS_PTHREADS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -DUSE_MMAP -DUSE_MUNMAP -DHOST_SOLARIS"
339                 need_link_unlink=yes
340                 libmono_cflags="-D_REENTRANT"
341                 libgc_threads=pthreads
342                 has_dtrace=yes
343                 use_sigposix=yes
344                 enable_solaris_tar_check=yes
345                 ;;
346         *-*-darwin*)
347                 parallel_mark="Disabled_Currently_Hangs_On_MacOSX"
348                 host_darwin=yes
349                 target_mach=yes
350                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_MACOSX_THREADS -DUSE_MMAP -DUSE_MUNMAP"
351                 libmono_cflags="-D_THREAD_SAFE"
352                 need_link_unlink=yes
353                 AC_DEFINE(PTHREAD_POINTER_ID)
354                 AC_DEFINE(USE_MACH_SEMA, 1, [...])
355                 libdl=
356                 libgc_threads=pthreads
357                 has_dtrace=yes
358                 if test "x$cross_compiling" = "xyes"; then
359                         has_broken_apple_cpp=yes
360                 fi
361                 dnl Snow Leopard is horribly broken -- it reports itself as i386-apple-darwin*, but
362                 dnl its gcc defaults to 64-bit mode.  They have also deprecated the usage of ucontext
363                 dnl we need to set some flags to build our 32-bit binaries on 10.6 properly
364                 case "$host" in
365                         dnl Snow Leopard and newer config.guess reports as this
366                         i*86-*-darwin*)
367                                 BROKEN_DARWIN_FLAGS="-arch i386"
368                                 BROKEN_DARWIN_CPPFLAGS=""
369                                 CPPFLAGS="$CPPFLAGS $BROKEN_DARWIN_CPPFLAGS"
370                                 CFLAGS="$CFLAGS $BROKEN_DARWIN_FLAGS"
371                                 CXXFLAGS="$CXXFLAGS $BROKEN_DARWIN_FLAGS"
372                                 CCASFLAGS="$CCASFLAGS $BROKEN_DARWIN_FLAGS"
373                                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC $BROKEN_DARWIN_CPPFLAGS"
374                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC $BROKEN_DARWIN_FLAGS"
375                                 with_sgen_default_concurrent=yes
376                                 ;;
377                         x*64-*-darwin*)
378                                 with_sgen_default_concurrent=yes
379                                 ;;
380                         arm*-darwin*)
381                                 platform_ios=yes
382                                 has_dtrace=no
383                                 ;;
384                         aarch64*-darwin*)
385                                 platform_ios=yes
386                                 ;;
387                 esac
388                 ;;
389         *-*-haiku*)
390                 dnl BSD_SOURCE is for getifaddrs
391                 CPPFLAGS="$CPPFLAGS -D_BSD_SOURCE -D_REENTRANT -D_THREAD_SAFE"
392                 libmono_cflags="-D_REENTRANT -D_THREAD_SAFE"
393                 libdl=
394                 LIBS="$LIBS -lnetwork -ltextencoding"
395                 need_link_unlink=yes
396                 AC_DEFINE(PTHREAD_POINTER_ID)
397                 dnl Haiku does not support static TLS with __thread
398                 with_tls=pthread
399                 libgc_threads=pthreads
400                 use_sigposix=yes
401                 with_sigaltstack=no
402                 ;;
403         *-*-fuchsia*)
404                 AC_DEFINE(DISABLE_PORTABILITY,1,[Disable the io-portability layer])
405                 AC_DEFINE(HOST_FUCHSIA,1,[Targeting the Fuchsia platform])
406                 fuchsia=true
407                 with_tls=pthread
408                 with_sigaltstack=yes
409                 with_static_mono=no
410                 support_boehm=no
411                 with_gc=sgen
412                 mono_cv_uscore=yes
413                 mono_cv_clang=no
414                 ;;
415         *-*-aix*|*-*-os400*)
416                 dnl Set up a 64-bit build
417                 CPPFLAGS="$CPPFLAGS -maix64 -DGC_AIX_THREADS -D_ALL_SOURCE -D_THREAD_SAFE -D_LARGE_FILES -D_REENTRANT"
418                 LDFLAGS="-maix64"
419                 libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
420                 dnl Would you believe GNU nm doesn't know how to process AIX libraries?
421                 dnl Hardcode IBM binutils in case GNU ones end up on our path. Also
422                 dnl specifiy 64-bit mode for tools.
423                 AR="/usr/bin/ar -X64"
424                 NM="/usr/bin/nm -X64"
425                 dnl SGen is the future (changes to Boehm support code would be
426                 dnl required if you wish to re-enable Boehm)
427                 support_boehm=no
428                 with_gc=sgen
429                 need_link_unlink=yes
430                 use_sigposix=yes
431                 dnl the valloc call to alloc the guard page bombs out, even with extending the data area
432                 with_sigaltstack=no
433                 dnl use pthread TLS, __thread has issues with the compiler flags we use
434                 with_tls=pthread
435                 dnl ppc Linux is the same? test further
436                 disable_munmap=yes
437                 ;;
438         *)
439                 AC_MSG_WARN([*** Please add $host to configure.ac checks!])
440                 libdl="-ldl"
441                 ;;
442 esac
444 AC_MSG_RESULT(ok)
446 if test x$need_link_unlink = xyes; then
447    AC_DEFINE(NEED_LINK_UNLINK, 1, [Define if Unix sockets cannot be created in an anonymous namespace])
450 if test x$host_win32 = xyes; then
451    AC_DEFINE(HOST_WIN32, 1, [Host Platform is Win32])
454 if test x$target_win32 = xyes; then
455    AC_DEFINE(TARGET_WIN32, 1, [Target Platform is Win32])
458 if test x$host_darwin = xyes; then
459    AC_DEFINE(HOST_DARWIN, 1, [Host Platform is Darwin])
462 # Defined for all targets/platforms using classic Windows API support.
463 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
464 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
466 AC_SUBST(extra_runtime_ldflags)
467 AM_CONDITIONAL(HOST_WIN32, test x$host_win32 = xyes)
468 AM_CONDITIONAL(TARGET_WIN32, test x$target_win32 = xyes)
469 AM_CONDITIONAL(HOST_LINUX, echo x$target_os | grep -q linux)
470 AM_CONDITIONAL(HOST_DARWIN, test x$host_darwin = xyes)
471 AM_CONDITIONAL(HOST_SIGPOSIX, test x$use_sigposix = xyes)
472 AM_CONDITIONAL(HOST_ANDROID, test x$platform_android = xyes)
473 AM_CONDITIONAL(HOST_TIZEN, test x$platform_tizen = xyes)
474 AM_CONDITIONAL(HOST_IOS, test x$platform_ios = xyes)
475 AM_CONDITIONAL(HOST_WASM, test x$platform_wasm = xyes)
477 if test -z "$HOST_DARWIN_TRUE"; then :
478 PLATFORM_AOT_SUFFIX=.dylib
481 if test -z "$HOST_LINUX_TRUE"; then :
482 PLATFORM_AOT_SUFFIX=.so
485 if test -z "$HOST_WIN32_TRUE"; then :
486 PLATFORM_AOT_SUFFIX=.dll
489 AC_SUBST(PLATFORM_AOT_SUFFIX)
491 if test -z "$HOST_WASM_TRUE"; then :
492 AC_DEFINE(HAVE_UTIME)
493 AC_DEFINE(HAVE_UTIMES)
496 ## PLATFORM_AOT_SUFFIX not so simple for windows :-)
498 AC_CHECK_TOOL(CC, gcc, gcc)
499 AC_PROG_CC
500 AC_CHECK_TOOL(CXX, g++, g++)
501 AC_PROG_CXX
502 AM_PROG_AS
503 AC_PROG_INSTALL
504 AC_PROG_AWK
505 AM_PROG_CC_C_O
506 dnl We should use AM_PROG_AS, but it's not available on automake/aclocal 1.4
507 : ${CCAS='$(CC)'}
508 # Set ASFLAGS if not already set.
509 : ${CCASFLAGS='$(CFLAGS)'}
510 AC_SUBST(CCAS)
511 AC_SUBST(CCASFLAGS)
513 # AC_PROG_CXX helpfully sets CXX to g++ even if no c++ compiler is found so check
514 # GXX instead. See http://lists.gnu.org/archive/html/bug-autoconf/2002-04/msg00056.html
515 if test "x$CXX" = "xg++"; then
516         if test "x$GXX" != "xyes"; then
517                 # automake/libtool is so broken, it requires g++ even if the c++ sources
518                 # are inside automake conditionals
519                 AC_MSG_ERROR([You need to install g++])
520         fi
523 dnl may require a specific autoconf version
524 dnl AC_PROG_CC_FOR_BUILD
525 dnl CC_FOR_BUILD not automatically detected
526 CC_FOR_BUILD=$CC
527 CFLAGS_FOR_BUILD=$CFLAGS
528 BUILD_EXEEXT=
529 if test "x$cross_compiling" = "xyes"; then
530         CC_FOR_BUILD=cc
531         CFLAGS_FOR_BUILD=
532         BUILD_EXEEXT=""
534 AC_SUBST(CC_FOR_BUILD)
535 AC_SUBST(CFLAGS_FOR_BUILD)
536 AC_SUBST(HOST_CC)
537 AC_SUBST(BUILD_EXEEXT)
539 AM_CONDITIONAL(CROSS_COMPILING, [test x$cross_compiling = xyes])
540 AM_CONDITIONAL(USE_BATCH_FILES, [test x$host_win32 = xyes -a x$cross_compiling = xyes])
542 # Set STDC_HEADERS
543 AC_HEADER_STDC
544 AC_LIBTOOL_WIN32_DLL
545 # This causes monodis to not link correctly
546 #AC_DISABLE_FAST_INSTALL
548 #lookup makedev() header
549 AC_HEADER_MAJOR
551 AM_PROG_LIBTOOL
552 # Use dolt (http://dolt.freedesktop.org/) instead of libtool for building.
553 DOLT
555 export_ldflags=`(./libtool --config; echo eval echo \\$export_dynamic_flag_spec) | sh`
556 AC_SUBST(export_ldflags)
558 # Test whenever ld supports -version-script
559 AC_PROG_LD
560 AC_PROG_LD_GNU
562 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)
563 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)
564 AC_CHECK_HEADER(unistd.h, [HAVE_UNISTD_H=1], [HAVE_UNISTD_H=0])
565 AC_SUBST(HAVE_UNISTD_H)
566 AC_CHECK_HEADERS([linux/netlink.h linux/rtnetlink.h],
567                   [], [], [#include <stddef.h>
568                   #include <sys/socket.h>
569                   #include <linux/socket.h>])
571 AC_CHECK_HEADERS(sys/user.h, [], [],
573 #ifdef HAVE_SYS_PARAM_H
574 # include <sys/param.h>
575 #endif
578 AC_CHECK_HEADERS(linux/serial.h)
580 AC_CHECK_HEADER(zlib.h, [have_zlib=yes], [have_zlib=no])
581 if test x$have_zlib = xyes; then
582    AC_TRY_COMPILE([#include <zlib.h>], [
583    #if defined(ZLIB_VERNUM) && (ZLIB_VERNUM >= 0x1230)
584    #else
585    #error No good zlib found
586    #endif
587    ],[
588         AC_MSG_RESULT(Using system zlib)
589         zlib_msg="system zlib"
590         AC_DEFINE(HAVE_SYS_ZLIB,1,[Have system zlib])
591    ],[
592         AC_MSG_RESULT(Using embedded zlib)
593         have_zlib=no
594         zlib_msg="bundled zlib"
595    ])
598 AM_CONDITIONAL(HAVE_ZLIB, test x$have_zlib = xyes)
599 AC_DEFINE(HAVE_ZLIB,1,[Have system zlib])
601 # for mono/metadata/debug-symfile.c
602 AC_CHECK_HEADERS(elf.h)
604 # for support
605 AC_CHECK_HEADERS(poll.h)
606 AC_CHECK_HEADERS(sys/poll.h)
607 AC_CHECK_HEADERS(sys/wait.h)
608 AC_CHECK_HEADERS(grp.h)
609 AC_CHECK_HEADERS(syslog.h)
610 AC_CHECK_FUNCS(vsyslog)
612 # for mono/dis
613 AC_CHECK_HEADERS(wchar.h)
615 # for Linux statfs support
616 AC_CHECK_HEADERS(linux/magic.h)
618 # For Android NDK unified headers
619 if test x$platform_android = xyes; then
620         AC_CHECK_HEADERS(machine/endian.h sys/endian.h)
621         AC_CHECK_HEADERS(android/legacy_signal_inlines.h, [have_android_signal_inlines=yes], [have_android_signal_inlines=no])
622         AC_CHECK_HEADERS(android/ndk-version.h)
624         # Make sure SIGRT{MIN,MAX} work - they will fail to work with unified headers if building for
625         # API level < 21 *and* android/legacy_signal_inlines.h doesn't declare (and define) the required
626         # libc APIs to obtain values for SIGRT{MIN,MAX}. We perform the check only if android/legacy_signal_inlines.h
627         # is found because in other cases the macros will either work (for NDK < 14) or fail if the legacy header
628         # doesn't contain the required definitions (NDK 14)
629         if test x$have_android_signal_inlines = xyes; then
630                 AC_MSG_CHECKING([Whether Android SIGRTMIN/SGRTMAX macros are valid])
631                 AC_COMPILE_IFELSE([
632                         AC_LANG_PROGRAM([#include <signal.h>
633                                 #include <android/legacy_signal_inlines.h>],[
634                                 int i;
635                                 for (i = SIGRTMIN + 1; i < SIGRTMAX; ++i) {
636                                 }
637                         ])],[
638                                 AC_MSG_RESULT(yes)
639                                 android_sigrtminmax_work=yes
640                         ],[
641                                 AC_MSG_RESULT(no)
642                                 android_sigrtminmax_work=no
643                         ]
644                 )
646                 if test x$android_sigrtminmax_work = xno; then
647                         AC_MSG_ERROR([Android SIGRTMIN/SIGRTMAX macros don't work in this NDK])
648                 fi
649         fi
651         # Attempt to detect whether we're using Android NDK unified headers
652         AC_CHECK_HEADERS(android/api-level.h, [have_android_api_level=yes], [have_android_api_level=no])
653         AC_CHECK_HEADERS(android/versioning.h, [have_android_versioning=yes], [have_android_versioning=no])
655         android_unified_headers=no
656         if test x$have_android_api_level = xyes; then
657                 if test x$have_android_versioning = xyes; then
658                         AC_MSG_CHECKING([whether using Android NDK unified headers])
660                         # Both macros are defined only in the NDK unified headers
661                         AC_COMPILE_IFELSE([
662                                 AC_LANG_PROGRAM([
663                                         #include <android/api-level.h>
664                                         #include <android/versioning.h>
665                                 ],[
666                                         #if __ANDROID_API_O__ == 26 && defined(__INTRODUCED_IN)
667                                         #else
668                                                 #error __ANDROID_API_O__ != 26 or the __INTRODUCED_IN macro not defined
669                                         #endif
670                                 ])],[
671                                         AC_MSG_RESULT(yes)
672                                         android_unified_headers=yes
673                                 ],[
674                                         AC_MSG_RESULT(no)
675                                         android_unified_headers=no
676                                 ]
677                         )
678                 fi
679         fi
681         if test x$android_unified_headers = xyes; then
682                 AC_DEFINE(ANDROID_UNIFIED_HEADERS, 1, [Whether Android NDK unified headers are used])
683         fi
684 fi # Android
686 # not 64 bit clean in cross-compile
687 AC_CHECK_SIZEOF(void *)
688 AC_CHECK_SIZEOF(long)
690 AC_CHECK_SIZEOF(int)
691 AC_CHECK_SIZEOF(long long)
693 AC_CACHE_CHECK([for clang],
694         mono_cv_clang,[
695         AC_TRY_COMPILE([], [
696                 #ifdef __clang__
697                 #else
698                 #error "FAILED"
699                 #endif
700         ],
701         [mono_cv_clang=yes],
702         [mono_cv_clang=no],
703         [])
706 AC_ARG_ENABLE(visibility-hidden,
707 [  --disable-visibility-hidden    disable usage of -fvisiblity=hidden],
708    disable_visibility_hidden=yes, disable_visibility_hidden=no)
710 WARN=''
711 if test x"$GCC" = xyes; then
712                 WARN='-Wall -Wunused -Wmissing-declarations -Wpointer-arith -Wno-cast-qual -Wwrite-strings -Wno-switch -Wno-switch-enum -Wno-unused-value -Wno-attributes'
713                 CFLAGS="$CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs -Wno-format-zero-length"
715                 # We require C99 with some GNU extensions, e.g. `linux` macro
716                 CFLAGS="$CFLAGS -std=gnu99"
718                 # The runtime code does not respect ANSI C strict aliasing rules
719                 CFLAGS="$CFLAGS -fno-strict-aliasing"
721                 # We rely on signed overflow to behave
722                 CFLAGS="$CFLAGS -fwrapv"
724                 CFLAGS="$CFLAGS -DMONO_DLL_EXPORT"
725                 if test x"$disable_visibility_hidden" = xno; then
726                    # Don't export any symbols by default
727                    SHARED_CFLAGS="-fvisibility=hidden"
728                    CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
729                 fi
731                 ORIG_CFLAGS=$CFLAGS
732                 # Check for the normal version, since gcc ignores unknown -Wno options
733                 CFLAGS="$CFLAGS -Wunused-but-set-variable -Werror"
734                 AC_MSG_CHECKING(for -Wno-unused-but-set-variable option to gcc)
735                 AC_TRY_COMPILE([],[
736                 ], [
737                    AC_MSG_RESULT(yes)
738                    CFLAGS="$ORIG_CFLAGS -Wno-unused-but-set-variable"
739                 ], [
740                    AC_MSG_RESULT(no)
741                    CFLAGS=$ORIG_CFLAGS
742                 ])
744                 if test "x$mono_cv_clang" = "xyes"; then
745                    # https://bugzilla.samba.org/show_bug.cgi?id=8118
746                    WARN="$WARN -Qunused-arguments"
747                    WARN="$WARN -Wno-unused-function -Wno-tautological-compare -Wno-parentheses-equality -Wno-self-assign -Wno-return-stack-address -Wno-constant-logical-operand"
748                    # We rely on zero length arrays in structs
749                    WARN="$WARN -Wno-zero-length-array"
750                 fi
751 else
752         # The Sun Forte compiler complains about inline functions that access static variables
753         # so disable all inlining.
754         case "$host" in
755         *-*-solaris*)
756                 CFLAGS="$CFLAGS -Dinline="
757                 ;;
758         esac
760 CFLAGS="$WARN $CFLAGS -g"
761 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -g"
762 CPPFLAGS="$WARN $CPPFLAGS -g"
764 # Where's the 'mcs' source tree?
765 if test -d $srcdir/mcs; then
766   mcsdir=mcs
767 else
768   mcsdir=../mcs
771 AC_ARG_WITH(mcs-path, [  --with-mcs-path=/path/to/mcs      Specify an alternate mcs source tree],
772         if test x$with_mcs_path != "x" -a -d $with_mcs_path ; then
773                 mcsdir=$with_mcs_path
774         fi
777 AC_ARG_WITH(jumptables, [  --with-jumptables=yes,no      enable/disable support for jumptables (ARM-only for now) (defaults to no)],[],[with_jumptables=no])
779 AC_ARG_WITH(core,       [  --with-core=only       controls whether to build Mono as a .NET Core runtime (defaults to no)],[],[with_core=no])
780 if test x$with_core = xonly; then
781     AC_DEFINE(ENABLE_NETCORE,1,[Enables the support for .NET Core Features in the MonoVM])
782     with_runtime_preset=netcore
784 AM_CONDITIONAL(ENABLE_NETCORE, test x$with_core = xonly)
787 # A sanity check to catch cases where the package was unpacked
788 # with an ancient tar program (Solaris)
790 AC_ARG_ENABLE(solaris-tar-check,
791 [  --disable-solaris-tar-check    disable solaris tar check],
792    do_solaris_tar_check=no, do_solaris_tar_check=yes)
794 if test x"$do_solaris_tar_check" = xyes -a x"$enable_solaris_tar_check" = xyes; then
795         AC_MSG_CHECKING(integrity of package)
796         if test -f $mcsdir/class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapTypeMapper.cs
797         then
798                 AC_MSG_RESULT(ok)
799         else
800                 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"
801                 AC_MSG_ERROR([$errorm])
802         fi
805 if test "x$with_mcs_path" != "x"; then
806 mcs_topdir=$(cd "$mcsdir" && pwd)
807 mcs_topdir_from_srcdir=$mcs_topdir
808 else
809 mcs_topdir=$(cd "$srcdir/$mcsdir" && pwd)
810 mcs_topdir_from_srcdir='$(top_builddir)'/$mcsdir
813 # Convert mcs_topdir* paths to Windows syntax.
814 if test x$cross_compiling$host_win32 = xnoyes; then
815   mcs_topdir=$(cygpath -m $mcs_topdir)
816   case $mcs_topdir_from_srcdir in
817     /cygdrive/*)
818         mcs_topdir_from_srcdir=$(cygpath -m $mcs_topdir_from_srcdir)
819         ;;
820   esac
823 AC_SUBST([mcs_topdir])
824 AC_SUBST([mcs_topdir_from_srcdir])
826 # gettext: prepare the translation directories. 
827 # we do not configure the full gettext, as we consume it dynamically from C#
828 AM_PO_SUBDIRS
830 if test "x$USE_NLS" = "xyes"; then
831    AC_CHECK_PROG(HAVE_MSGFMT, msgfmt,yes,no)
833    if test "x$HAVE_MSGFMT" = "xno"; then
834           AC_MSG_ERROR([msgfmt not found. You need to install the 'gettext' package, or pass --enable-nls=no to configure.])
835    fi
838 AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
840 pkg_config_path=
841 AC_ARG_WITH(crosspkgdir, [  --with-crosspkgdir=/path/to/pkg-config/dir      Change pkg-config dir to custom dir],
842         if test x$with_crosspkgdir = "x"; then
843                 if test -s $PKG_CONFIG_PATH; then
844                         pkg_config_path=$PKG_CONFIG_PATH
845                 fi
846         else
847                 pkg_config_path=$with_crosspkgdir
848                 PKG_CONFIG_PATH=$pkg_config_path
849                 export PKG_CONFIG_PATH
850         fi
853 AC_ARG_ENABLE(ninja,[  --enable-ninja    Enable using ninja where available], enable_ninja=$enableval)
854 AC_CHECK_PROG(HAVE_NINJA, ninja, yes, no)
855 AM_CONDITIONAL(NINJA, test x$enable_ninja = xyes -a x$HAVE_NINJA != xno)
857 AC_ARG_ENABLE(werror, [  --enable-werror Pass -Werror to the C compiler], werror_flag=$enableval, werror_flag=no)
858 if test x$werror_flag = xyes; then
859         WERROR_CFLAGS="-Werror"
861 AC_SUBST([WERROR_CFLAGS])
862 AC_SUBST([SHARED_CFLAGS])
864 GLIB_CFLAGS='-I$(top_srcdir)/mono/eglib -I$(top_builddir)/mono/eglib'
865   
866 AC_SUBST(GLIB_CFLAGS)
868 # Enable support for fast thread-local storage
869 # Some systems have broken support, so we allow to disable it.
870 AC_ARG_WITH(tls, [  --with-tls=__thread,pthread    select Thread Local Storage implementation (defaults to __thread)],[],[with_tls=__thread])
872 # Enable support for using sigaltstack for SIGSEGV and stack overflow handling
873 # This does not work on some platforms (bug #55253)
874 AC_ARG_WITH(sigaltstack, [  --with-sigaltstack=yes,no      enable/disable support for sigaltstack (defaults to yes)],[],[with_sigaltstack=yes])
876 AC_ARG_WITH(static_mono, [  --with-static_mono=yes,no      link mono statically to libmono (faster) (defaults to yes)],[],[with_static_mono=yes])
877 AC_ARG_WITH(shared_mono, [  --with-shared_mono=yes,no      build a shared libmono library (defaults to yes)],[],[with_shared_mono=yes])
878 # Same as --with-shared_mono=no
879 AC_ARG_ENABLE(libraries, [  --disable-libraries disable the build of libmono], enable_libraries=$enableval, enable_libraries=yes)
881 if test "x$enable_static" = "xno"; then
882    with_static_mono=no
885 if test "x$enable_shared" = "xno"; then
886    with_shared_mono=no
889 if test "x$enable_libraries" = "xno"; then
890    with_shared_mono=no
893 AM_CONDITIONAL(DISABLE_LIBRARIES, test x$enable_libraries = xno)
895 if test "x$host_win32" = "xyes"; then
896    # Boehm GC requires the runtime to be in its own dll
897    with_static_mono=no
900 AM_CONDITIONAL(STATIC_MONO, test x$with_static_mono != xno)
901 AM_CONDITIONAL(SHARED_MONO, test x$with_shared_mono != xno)
902 AC_ARG_ENABLE(mcs-build, [  --disable-mcs-build disable the build of the mcs directory], try_mcs_build=$enableval, enable_mcs_build=yes)
903 AC_ARG_ENABLE(support-build, [  --disable-support-build disable the build of the support directory], try_support_build=$enableval, enable_support_build=yes)
905 AC_ARG_WITH(xen_opt,   [  --with-xen_opt=yes,no          Enable Xen-specific behaviour (defaults to yes)],[],[with_xen_opt=yes])
906 if test "x$with_xen_opt" = "xyes" -a "x$mono_cv_clang" = "xno"; then
907         AC_DEFINE(MONO_XEN_OPT, 1, [Xen-specific behaviour])
908         ORIG_CFLAGS=$CFLAGS
909         CFLAGS="$CFLAGS -mno-tls-direct-seg-refs"
910         AC_MSG_CHECKING(for -mno-tls-direct-seg-refs option to gcc)
911         AC_TRY_COMPILE([], [
912         ], [
913            AC_MSG_RESULT(yes)
914            # Pass it to libgc as well
915            CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -mno-tls-direct-seg-refs"
916         ], [
917            AC_MSG_RESULT(no)
918            CFLAGS=$ORIG_CFLAGS
919         ])
922 AC_ARG_ENABLE(small-config, [  --enable-small-config Enable tweaks to reduce requirements (and capabilities)], enable_small_config=$enableval, enable_small_config=no)
924 if test x$enable_small_config = xyes; then
925         AC_DEFINE(MONO_SMALL_CONFIG,1,[Reduce runtime requirements (and capabilities)])
926         CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DSMALL_CONFIG"
929 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)
931 DISABLED_FEATURES=none
932 csc_compiler=default
933 endian=unknown
934 AC_C_BIGENDIAN([endian=big],[endian=little],[endian=unknown])
935 AC_MSG_CHECKING([CSharp compiler to use])
936 AC_ARG_WITH(csc, [  --with-csc=mcs,roslyn,default      Configures the CSharp compiler to use],[
937    if test x$withval = xmcs; then
938        csc_compiler=mcs
939    elif test x$withval = xroslyn; then
940        csc_compiler=roslyn
941    elif test x$withval = xdefault; then
942        :
943    else
944        AC_MSG_ERROR([You must supply one of "mcs", "roslyn" or "default" to the --with-csc option])
945    fi
946 ],[csc_compiler=default])
948 if test $csc_compiler = default; then
949    if test $endian = big; then
950       csc_compiler=mcs
951    elif test $endian = little; then
952       case "$host" in
953         powerpc*) csc_compiler=mcs ;;
954         *) csc_compiler=roslyn ;;
955       esac
956    else
957       csc_compiler=mcs
958    fi
960 AC_MSG_RESULT($csc_compiler)
962 AC_ARG_WITH(jemalloc,             [  --with-jemalloc=yes,no               If jemalloc is enabled (defaults to no)],                                     [], [with_jemalloc=no])
963 AC_ARG_WITH(jemalloc-always,      [  --with-jemalloc_always=yes,no        If jemalloc is enabled and always used (defaults to yes)],                    [], [with_jemalloc_always=no])
964 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])
967 if test x$target_win32 = xyes; then
968 with_jemalloc=no
969 with_jemalloc_assert=no
970 with_jemalloc_always=no
973 AM_CONDITIONAL(MONO_JEMALLOC_ASSERT, [test "x$with_jemalloc_assert" = "xyes"])
974 if test "x$with_jemalloc_assert" = "xyes"; then
975 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ASSERT"
976 AC_DEFINE(MONO_JEMALLOC_ASSERT, 1, [Make jemalloc assert for mono])
977 AC_SUBST(MONO_JEMALLOC_ASSERT, 1)
980 AM_CONDITIONAL(MONO_JEMALLOC_DEFAULT, [test "x$with_jemalloc_always" = "xyes"])
981 if test "x$with_jemalloc_always" = "xyes"; then
982 with_jemalloc=yes
983 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_DEFAULT"
984 AC_DEFINE(MONO_JEMALLOC_DEFAULT, 1, [Make jemalloc default for mono])
985 AC_SUBST(MONO_JEMALLOC_DEFAULT, 1)
988 AM_CONDITIONAL(MONO_JEMALLOC_ENABLED, [test "x$with_jemalloc" = "xyes"])
989 if test "x$with_jemalloc" = "xyes"; then
990 JEMALLOC_LDFLAGS="-L`pwd`/mono/utils/jemalloc/jemalloc/lib -ljemalloc_pic"
991 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ENABLED -I `pwd`/mono/utils/jemalloc/jemalloc/include"
992 JEMALLOC_AUTOCONF_FLAGS=" --build=$target --host=$host"
994 if test "x$target_mach" = "xyes"; then
995         JEMALLOC_CPPFLAGS=" -stdlib=libc++ "
998 AC_DEFINE(MONO_JEMALLOC_ENABLED, 1, [Enable jemalloc usage for mono])
999 AC_SUBST(MONO_JEMALLOC_ENABLED, 1)
1001 AC_SUBST(JEMALLOC_CFLAGS)
1002 AC_SUBST(JEMALLOC_CPPFLAGS)
1003 AC_SUBST(JEMALLOC_LDFLAGS)
1004 AC_SUBST(JEMALLOC_AUTOCONF_FLAGS)
1007 # Terminology:
1008 # Crash privacy - Attempts to not send identifying information in the crash dump / to protect the obscurity of the program control flow
1009 # MERP - The MS telemetry profile. Not for general use.
1010 # Structured crashes - crashes at runtime that trigger a stack walk by mono that happens cooperatively
1012 # 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.
1014 #--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.
1015 #--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.
1016 #--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.
1017 #--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.
1019 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])
1020 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])
1021 AC_ARG_ENABLE(crash-reporting,  [  --disable-crash-reporting            Enable or Disable crash reporting subsystem],        [crash_reporting=$enableval], [crash_reporting=yes])
1023 if test "x$with_crash_privacy" = "xyes"; then
1024 AC_DEFINE(MONO_PRIVATE_CRASHES,1,[Do not include names of unmanaged functions in the crash dump])
1027 if test "x$with_structured_crashes" = "xno"; then
1028 AC_DEFINE(DISABLE_STRUCTURED_CRASH,1,[Do not create structured crash files during unmanaged crashes])
1031 case "$host" in
1032         *-mingw*|*-*-cygwin*|*-*-aix*|*-*-os400*)
1033                 crash_reporting=no
1034                 ;;
1035 esac
1037 if test "x$crash_reporting" != "xyes"; then
1038 CFLAGS="$CFLAGS -DDISABLE_CRASH_REPORTING=1"
1039 CXXFLAGS="$CXXFLAGS -DDISABLE_CRASH_REPORTING=1"
1042 AC_ARG_ENABLE(monodroid, [ --enable-monodroid Enable runtime support for Monodroid (Xamarin.Android)], enable_monodroid=$enableval, enable_monodroid=no)
1043 AM_CONDITIONAL(ENABLE_MONODROID, test x$enable_monodroid = xyes)
1045 AC_ARG_ENABLE(monotouch, [ --enable-monotouch Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)], enable_monotouch=$enableval, enable_monotouch=no)
1046 AM_CONDITIONAL(ENABLE_MONOTOUCH, test x$enable_monotouch = xyes)
1048 if test x$enable_monodroid = xyes; then
1049         AC_DEFINE(ENABLE_MONODROID, 1, [Enable runtime support for Monodroid (Xamarin.Android)])
1052 if test x$enable_monotouch = xyes; then
1053         AC_DEFINE(ENABLE_MONOTOUCH, 1, [Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)])
1056 AC_ARG_ENABLE(cxx, [  --enable-cxx   compile some code as C++])
1058 # mono/corefx/native has a lot of invalid C++98 in its headers
1059 # dotnet/corefx/native looks a lot better, i.e. 44e5bdafb8d989a220c9cf1b94f31a64a6e4f052
1060 #CXXFLAGS_COMMON=' -std=gnu++98 -fno-exceptions -fno-rtti '
1061 CXXFLAGS_COMMON=' -std=gnu++0x -fno-exceptions -fno-rtti '
1062 # "c++0x" instead of C++11, for compat with Centos6/gcc4.4
1064 # -stdlib=libc++ is needed by clang for iOS 6.0 (-miphoneos-version-min=6.0)
1065 # to support C++11 headers but it does not seem to harm elsewhere, so over-approximate
1066 # and add it whenever we're running clang on Darwin.
1067 if test "x$mono_cv_clang" = xyes -a x$host_darwin = xyes; then
1068         CXXFLAGS_COMMON="$CXXFLAGS_COMMON -stdlib=libc++"
1071 AC_SUBST(CXXFLAGS_COMMON)
1073 if test "x$enable_cxx" = "xyes"; then
1075         CXX_ADD_CFLAGS=" -xc++ $CXXFLAGS_COMMON "
1077         # -std=gnu99 -xc++ is not allowed and errors.
1078         CXX_REMOVE_CFLAGS=-std=gnu99
1079         # These give warnings and should be removed. They are C-only.
1080         # i.e. C++ never allows these, they are always errors and their warningness is not controllable.
1081         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs"
1082         # Likewise with CentOS 6 gcc 4.4.
1083         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Werror-implicit-function-declaration"
1085         # The C-only-ness of -Wno-format-zero-length varies with gcc version.
1086         # It is C-only prior to 4.7. Using it with C++ prior to 4.7
1087         # generates a warning every time we run gcc which is very unsightly.
1088         # The warning is for e.g. sprintf(foo, "") which can just be
1089         # foo[0] = 0 but Mono's use is more elaborate, not as easy to "fix",
1090         # and completely legal and valid.
1091         # We have to switch to C++ and not just use -xc++ because of -std=gnu99 (error when combined with -xc++).
1092         # Alternatively, just run $CXX -xc++ -c /dev/null.
1093         AC_LANG_PUSH(C++)
1094         ORIG_CXXFLAGS=$CXXFLAGS
1095         CXXFLAGS="$CXXFLAGS -Werror -Wno-format-zero-length -xc++ "
1096         AC_MSG_CHECKING(or C-only-ness of -Wno-format-zero-length)
1097         AC_TRY_COMPILE([ ], [ ], [ AC_MSG_RESULT(yes) ],
1098                                  [ AC_MSG_RESULT(no)
1099                                    CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wno-format-zero-length" ])
1100         CXXFLAGS=$ORIG_CXXFLAGS
1101         AC_LANG_POP(C++)
1103 AC_SUBST(CXX_ADD_CFLAGS)
1104 AC_SUBST(CXX_REMOVE_CFLAGS)
1107 # Set the build profiles and options before things which use them
1110 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])
1111 AC_ARG_WITH(monodroid,           [  --with-monodroid=yes,no             If you want to build the MonoDroid assemblies (defaults to no)],            [], [with_monodroid=default])
1112 AC_ARG_WITH(monotouch,           [  --with-monotouch=yes,no             If you want to build the Xamarin.iOS assemblies (defaults to no)],          [], [with_monotouch=default])
1113 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])
1114 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])
1115 AC_ARG_WITH(bitcode,             [  --with-bitcode=yes,no               If bitcode is enabled (defaults to no)],                                    [], [with_bitcode=default])
1116 AC_ARG_WITH(xammac,              [  --with-xammac=yes,no                If you want to build the Xamarin.Mac assemblies (defaults to no)],          [], [with_xammac=default])
1117 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])
1118 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])
1119 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])
1120 AC_ARG_WITH(winaot,              [  --with-winaot=yes,no                If you want to build the Windows friendly AOT assemblies (defaults to no)], [], [with_winaot=default])
1121 AC_ARG_WITH(orbis,               [  --with-orbis=yes,no                 If you want to build the Orbis assemblies (defaults to no)], [], [with_orbis=default])
1122 AC_ARG_WITH(unreal,              [  --with-unreal=yes,no                If you want to build the Unreal assemblies (defaults to no)], [], [with_unreal=default])
1123 AC_ARG_WITH(wasm,                [  --with-wasm=yes,no                  If you want to build the WebAssembly (defaults to no)], [], [with_wasm=default])
1126 AC_ARG_WITH(runtime-preset, [  --with-runtime-preset=net_4_x,all,aot,aot_llvm,hybridaot,hybridaot_llvm,fullaot,fullaot_llvm,winaot,winaot_llvm,bitcode,bitcodeinterp,unreal,fullaotinterp,fullaotinterp_llvm  Which default profile to build (defaults to net_4_x)],  [], [with_runtime_preset=net_4_x])
1127 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])
1128 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])
1129 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])
1132 dnl Spectre compiler mitigation flag checks
1134 if test "x$with_spectre_mitigation" = "xyes"; then
1135    AC_MSG_NOTICE([Compiler Spectre mitigation support checks])
1136    SPECTRE_CFLAGS=
1137    SPECTRE_INDIRECT_BRANCH_KIND=
1138    case "x$with_spectre_indirect_branch_choice" in
1139        xkeep) SPECTRE_INDIRECT_BRANCH_KIND=keep ;;
1140        xthunk) SPECTRE_INDIRECT_BRANCH_KIND=thunk ;;
1141        xinline) SPECTRE_INDIRECT_BRANCH_KIND=thunk-inline ;;
1142        xextern) SPECTRE_INDIRECT_BRANCH_KIND=thunk-extern ;;
1143        *) AC_MSG_ERROR([Invalid indirect jump thunk kind ($with_spectre_indirect_branch_choice)]) ;;
1144    esac
1146    SPECTRE_FUNCTION_RETURN_KIND=""
1147    case "x$with_spectre_function_return_choice" in
1148        xkeep) SPECTRE_FUNCTION_RETURN_KIND=keep ;;
1149        xthunk) SPECTRE_FUNCTION_RETURN_KIND=thunk ;;
1150        xinline) SPECTRE_FUNCTION_RETURN_KIND=thunk-inline ;;
1151        xextern) SPECTRE_FUNCTION_RETURN_KIND=thunk-extern ;;
1152        *) AC_MSG_ERROR([Invalid function return thunk kind ($with_spectre_function_return_choice)]) ;;
1153    esac
1155    AX_CHECK_COMPILE_FLAG(
1156         [ -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND ],
1157         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND" ]
1158    )
1160    AX_CHECK_COMPILE_FLAG(
1161         [ -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND ],
1162         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND" ]
1163    )
1165    if test "x$SPECTRE_CFLAGS" != "x" ; then
1166         CFLAGS="$CFLAGS $SPECTRE_CFLAGS"
1167         CXXFLAGS="$CXXFLAGS $SPECTRE_CFLAGS"
1168         spectre_mitigation_status="mitigation enabled"
1169    fi
1170 else
1171         spectre_mitigation_status="no mitigation"
1175 dnl Profile defaults
1177 TEST_PROFILE=default
1178 enable_llvm_default=no
1180 with_profile4_x_default=no
1181 with_monodroid_default=no
1182 with_monotouch_default=no
1183 with_monotouch_watch_default=no
1184 with_monotouch_tv_default=no
1185 with_xammac_default=no
1186 with_testing_aot_full_interp_default=no
1187 with_testing_aot_hybrid_default=no
1188 with_testing_aot_full_default=no
1189 with_winaot_default=no
1190 with_orbis_default=no
1191 with_unreal_default=no
1192 with_wasm_default=no
1194 with_bitcode_default=no
1195 enable_cooperative_suspend_default=no
1196 enable_hybrid_suspend_default=no
1198 INVARIANT_AOT_OPTIONS=nimt-trampolines=2000,ntrampolines=10000,nrgctx-fetch-trampolines=256,ngsharedvt-trampolines=4000,nftnptr-arg-trampolines=4000
1200 AOT_BUILD_ATTRS=$INVARIANT_AOT_OPTIONS
1202 if test x$cross_compiling = xyes -o x$enable_mcs_build = xno; then
1203    DISABLE_MCS_DOCS_default=yes
1204 elif test x$with_runtime_preset = xnetcore; then
1205    DISABLE_MCS_DOCS_default=yes
1207    mono_feature_disable_remoting='yes'
1208    mono_feature_disable_reflection_emit_save='yes'
1209    mono_feature_disable_appdomains='yes'
1210    disable_mono_native=yes
1211 elif test x$with_runtime_preset = xnet_4_x; then
1212    with_profile4_x_default=yes
1213    TEST_PROFILE=net_4_x
1214 elif test x$with_runtime_preset = xall; then
1215    with_profile4_x_default=yes
1216    with_monodroid_default=yes
1217    with_monotouch_default=yes
1218    with_monotouch_watch_default=yes
1219    with_monotouch_tv_default=yes
1220    with_xammac_default=yes
1221    with_winaot_default=yes
1222    with_orbis_default=yes
1223    with_unreal_default=yes
1224    with_wasm_default=yes
1225    with_testing_aot_full_interp_default=yes
1226    with_testing_aot_hybrid_default=yes
1227    with_testing_aot_full_default=yes
1228    TEST_PROFILE=net_4_x
1229 elif test x$with_runtime_preset = xbitcode; then
1230    DISABLE_MCS_DOCS_default=yes
1231    with_testing_aot_full_default=yes
1232    with_bitcode_default=yes
1233    enable_cooperative_suspend_default=yes
1234    # FIXME: use TEST_PROFILE=testing_aot_full
1235    TEST_PROFILE=testing_aot_bitcode
1236    PLATFORM_TEST_HARNESS_EXCLUDES=BitcodeNotSupported
1237    enable_llvm_default=yes
1239    mono_feature_disable_com='yes'
1240    mono_feature_disable_remoting='yes'
1241    mono_feature_disable_reflection_emit_save='yes'
1242    mono_feature_disable_reflection_emit='yes'
1243    mono_feature_disable_appdomains='yes'
1245    # We need at least clang++-6.0 to read the LLVM IR produced by the runtime
1246    AOT_BUILD_FLAGS="--runtime=mobile --aot=llvmonly,clangxx=clang++-6.0,$INVARIANT_AOT_OPTIONS"
1247    AOT_RUN_FLAGS="--runtime=mobile --llvmonly"
1248    AOT_MODE="llvmonly"
1249 elif test x$with_runtime_preset = xbitcodeinterp; then
1250    with_testing_aot_full_interp_default=yes
1251    with_bitcode_default=yes
1252    enable_cooperative_suspend_default=yes
1253    # FIXME: use TEST_PROFILE=testing_aot_full_interp
1254    TEST_PROFILE=testing_aot_bitcode_interp
1255    PLATFORM_TEST_HARNESS_EXCLUDES=BitcodeNotSupported
1256    enable_llvm_default=yes
1258    # mscorlib.dll aot compilation crashes
1259    mono_feature_disable_com='yes'
1261    # We need at least clang++-6.0 to read the LLVM IR produced by the runtime
1262    AOT_BUILD_FLAGS="--aot=llvmonly,interp,clangxx=clang++-6.0,$INVARIANT_AOT_OPTIONS"
1263    AOT_RUN_FLAGS="--llvmonly-interp"
1264 elif test x$with_runtime_preset = xfullaot; then
1265    DISABLE_MCS_DOCS_default=yes
1266    with_testing_aot_full_default=yes
1267    TEST_PROFILE=testing_aot_full
1269    mono_feature_disable_com='yes'
1270    mono_feature_disable_remoting='yes'
1271    mono_feature_disable_reflection_emit_save='yes'
1272    mono_feature_disable_reflection_emit='yes'
1273    mono_feature_disable_appdomains='yes'
1275    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1276    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1277    AOT_MODE="full"
1278 elif test x$with_runtime_preset = xfullaot_llvm; then
1279    DISABLE_MCS_DOCS_default=yes
1280    with_testing_aot_full_default=yes
1281    TEST_PROFILE=testing_aot_full
1283    mono_feature_disable_com='yes'
1284    mono_feature_disable_remoting='yes'
1285    mono_feature_disable_reflection_emit_save='yes'
1286    mono_feature_disable_reflection_emit='yes'
1287    mono_feature_disable_appdomains='yes'
1289    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1290    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1291    AOT_MODE="full"
1292 elif test x$with_runtime_preset = xhybridaot; then
1293    DISABLE_MCS_DOCS_default=yes
1294    with_testing_aot_hybrid_default=yes
1295    TEST_PROFILE=testing_aot_hybrid 
1297    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1298    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1299 elif test x$with_runtime_preset = xhybridaot_llvm; then
1300    DISABLE_MCS_DOCS_default=yes
1301    with_testing_aot_hybrid_default=yes
1302    TEST_PROFILE=testing_aot_hybrid
1304    AOT_BUILD_FLAGS="--runtime=mobile --llvm --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1305    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1306 elif test x$with_runtime_preset = xfullaotinterp; then
1307    with_testing_aot_full_interp_default=yes
1308    TEST_PROFILE=testing_aot_full_interp
1310    # mscorlib.dll aot compilation crashes
1311    mono_feature_disable_com='yes'
1313    AOT_BUILD_FLAGS="--aot=full,interp,$INVARIANT_AOT_OPTIONS"
1314    AOT_RUN_FLAGS="--full-aot-interp"
1315 elif test x$with_runtime_preset = xfullaotinterp_llvm; then
1316    with_testing_aot_full_interp_default=yes
1317    TEST_PROFILE=testing_aot_full_interp
1319    # mscorlib.dll aot compilation crashes
1320    mono_feature_disable_com='yes'
1322    AOT_BUILD_FLAGS="-O=gsharedvt --llvm --aot=full,interp,$INVARIANT_AOT_OPTIONS"
1323    AOT_RUN_FLAGS="--full-aot-interp"
1324 elif test x$with_runtime_preset = xaot; then
1325    with_profile4_x_default=yes
1327    AOT_BUILD_FLAGS="--aot=$INVARIANT_AOT_OPTIONS"
1328    AOT_RUN_FLAGS=""
1330    DISABLE_MCS_DOCS_default=yes
1331 elif test x$with_runtime_preset = xaot_llvm; then
1332    with_profile4_x_default=yes
1334    AOT_BUILD_FLAGS="--llvm --aot=$INVARIANT_AOT_OPTIONS"
1335    AOT_RUN_FLAGS=""
1337    DISABLE_MCS_DOCS_default=yes
1338 elif test x$with_runtime_preset = xwinaot; then
1339    DISABLE_MCS_DOCS_default=yes
1340    with_winaot_default=yes
1341    TEST_PROFILE=winaot
1343    mono_feature_disable_com='yes'
1344    mono_feature_disable_remoting='yes'
1345    mono_feature_disable_reflection_emit_save='yes'
1346    mono_feature_disable_reflection_emit='yes'
1347    mono_feature_disable_appdomains='yes'
1349    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1350    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1351    AOT_MODE="full"
1352 elif test x$with_runtime_preset = xwinaot_llvm; then
1353    DISABLE_MCS_DOCS_default=yes
1354    with_winaot_default=yes
1355    TEST_PROFILE=winaot
1357    mono_feature_disable_com='yes'
1358    mono_feature_disable_remoting='yes'
1359    mono_feature_disable_reflection_emit_save='yes'
1360    mono_feature_disable_reflection_emit='yes'
1361    mono_feature_disable_appdomains='yes'
1363    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1364    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1365    AOT_MODE="full"
1366 elif test x$with_runtime_preset = xorbis; then
1367    DISABLE_MCS_DOCS_default=yes
1368    with_orbis_default=yes
1369    TEST_PROFILE=orbis
1371    mono_feature_disable_com='yes'
1372    mono_feature_disable_remoting='yes'
1373    mono_feature_disable_reflection_emit_save='yes'
1374    mono_feature_disable_reflection_emit='yes'
1375    mono_feature_disable_appdomains='yes'
1377    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1378    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1379    AOT_MODE="full"
1380 elif test x$with_runtime_preset = xunreal; then
1381    DISABLE_MCS_DOCS_default=yes
1382    with_unreal_default=yes
1383    TEST_PROFILE=unreal
1385    mono_feature_disable_com='yes'
1386    mono_feature_disable_remoting='yes'
1387    mono_feature_disable_appdomains='no'
1389    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1390    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1391 elif test x$with_runtime_preset = xwasm; then
1392    DISABLE_MCS_DOCS_default=yes
1393    with_wasm_default=yes
1394    TEST_PROFILE=wasm
1396    mono_feature_disable_com='yes'
1397    mono_feature_disable_remoting='yes'
1398    mono_feature_disable_reflection_emit_save='yes'
1399    mono_feature_disable_reflection_emit='yes'
1400    mono_feature_disable_appdomains='yes'
1402    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1403    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1404 else
1405    TEST_PROFILE=net_4_x
1406    with_profile4_x_default=yes
1409 if test "x$AOT_BUILD_FLAGS" != "x"; then :
1410    AC_SUBST(AOT_BUILD_FLAGS)
1411    AC_SUBST(AOT_RUN_FLAGS)
1412    # For llvmonlycheck + fullaotcheck
1413    AC_SUBST(INVARIANT_AOT_OPTIONS)
1416 AC_SUBST(TEST_PROFILE)
1418 if test "x$with_profile4_x" = "xdefault"; then
1419    with_profile4_x=$with_profile4_x_default
1421 if test "x$with_monodroid" = "xdefault"; then
1422    with_monodroid=$with_monodroid_default
1424 if test "x$with_monotouch" = "xdefault"; then
1425    with_monotouch=$with_monotouch_default
1427 if test "x$with_monotouch_watch" = "xdefault"; then
1428    with_monotouch_watch=$with_monotouch_watch_default
1430 if test "x$with_monotouch_tv" = "xdefault"; then
1431    with_monotouch_tv=$with_monotouch_tv_default
1433 if test "x$with_bitcode" = "xdefault"; then
1434    with_bitcode=$with_bitcode_default
1436 if test "x$with_xammac" = "xdefault"; then
1437    with_xammac=$with_xammac_default
1439 if test "x$with_testing_aot_full_interp" = "xdefault"; then
1440    with_testing_aot_full_interp=$with_testing_aot_full_interp_default
1442 if test "x$with_testing_aot_hybrid" = "xdefault"; then
1443    with_testing_aot_hybrid=$with_testing_aot_hybrid_default
1445 if test "x$with_testing_aot_full" = "xdefault"; then
1446    with_testing_aot_full=$with_testing_aot_full_default
1448 if test "x$with_winaot" = "xdefault"; then
1449    with_winaot=$with_winaot_default
1451 if test "x$with_orbis" = "xdefault"; then
1452    with_orbis=$with_orbis_default
1454 if test "x$with_unreal" = "xdefault"; then
1455    with_unreal=$with_unreal_default
1457 if test "x$with_wasm" = "xdefault"; then
1458    with_wasm=$with_wasm_default
1462 AM_CONDITIONAL(INSTALL_4_x, [test "x$with_profile4_x" = "xyes"])
1463 AM_CONDITIONAL(INSTALL_MONODROID, [test "x$with_monodroid" != "xno"])
1464 AM_CONDITIONAL(INSTALL_MONOTOUCH, [test "x$with_monotouch" != "xno"])
1465 AM_CONDITIONAL(INSTALL_MONOTOUCH_WATCH, [test "x$with_monotouch_watch" != "xno"])
1466 AM_CONDITIONAL(INSTALL_MONOTOUCH_TV, [test "x$with_monotouch_tv" != "xno"])
1467 AM_CONDITIONAL(BITCODE, test "x$with_bitcode" = "xyes")
1468 AM_CONDITIONAL(INSTALL_XAMMAC, [test "x$with_xammac" != "xno"])
1469 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL_INTERP, [test "x$with_testing_aot_full_interp" != "xno"])
1470 AM_CONDITIONAL(INSTALL_TESTING_AOT_HYBRID, [test "x$with_testing_aot_hybrid" != "xno"])
1471 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL, [test "x$with_testing_aot_full" != "xno"])
1472 AM_CONDITIONAL(INSTALL_WINAOT, [test "x$with_winaot" != "xno"])
1473 AM_CONDITIONAL(INSTALL_ORBIS, [test "x$with_orbis" != "xno"])
1474 AM_CONDITIONAL(INSTALL_UNREAL, [test "x$with_unreal" != "xno"])
1475 AM_CONDITIONAL(INSTALL_WASM, [test "x$with_wasm" != "xno"])
1476 AM_CONDITIONAL(INSTALL_NETCORE, [test "x$with_core" != "xno"])
1478 AM_CONDITIONAL(HYBRID_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_hybrid"] || [test "x$TEST_PROFILE" = "xunreal"])
1479 AM_CONDITIONAL(FULL_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full"] || [test "x$TEST_PROFILE" = "xtesting_aot_bitcode"] || [test "x$TEST_PROFILE" = "xwinaot"] || [test "x$TEST_PROFILE" = "xorbis"] || [test "x$TEST_PROFILE" = "xwasm"])
1480 AM_CONDITIONAL(FULL_AOT_INTERP_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full_interp"] || [test "x$TEST_PROFILE" = "xtesting_aot_bitcode_interp"])
1481 AM_CONDITIONAL(DEFAULT_TESTS, [test "x$TEST_PROFILE" = "xnet_4_x"])
1483 default_profile=net_4_x
1484 if test -z "$INSTALL_MONODROID_TRUE"; then :
1485    default_profile=monodroid
1487 if test -z "$INSTALL_MONOTOUCH_TRUE"; then :
1488    default_profile=monotouch
1490 if test -z "$INSTALL_XAMMAC_TRUE"; then :
1491    default_profile=xammac
1493 if test -z "$INSTALL_TESTING_AOT_FULL_INTERP_TRUE"; then :
1494    default_profile=testing_aot_full_interp
1496 if test -z "$INSTALL_TESTING_AOT_HYBRID_TRUE"; then :
1497    default_profile=testing_aot_hybrid
1499 if test -z "$INSTALL_TESTING_AOT_FULL_TRUE"; then :
1500    default_profile=testing_aot_full
1502 if test -z "$INSTALL_WINAOT_TRUE"; then :
1503    default_profile=winaot
1505 if test -z "$INSTALL_ORBIS_TRUE"; then :
1506    default_profile=orbis
1508 if test -z "$INSTALL_UNREAL_TRUE"; then :
1509    default_profile=unreal
1511 if test -z "$INSTALL_WASM_TRUE"; then :
1512    default_profile=wasm
1514 if test -z "$INSTALL_4_x_TRUE"; then :
1515    default_profile=net_4_x
1517 DEFAULT_PROFILE=$default_profile
1518 AC_SUBST(DEFAULT_PROFILE)
1521 # End build profile configuration
1524 if test x$USE_NLS = xprofile_default; then
1526         AC_MSG_CHECKING([NLS used])
1528         # We make the default value for USE_NLS
1529         # "no" on OSX because it isn't available on most
1530         # default OSX installs. The most common configurations will
1531         # all disable it, so this saves us typing.
1532         if test x$host_darwin = xyes; then
1533                 USE_NLS=no;
1534         else
1535                 USE_NLS=yes;
1536         fi
1538         AC_SUBST([USE_NLS])
1539         AC_MSG_RESULT([$USE_NLS])
1542 AC_ARG_ENABLE(minimal, [  --enable-minimal=LIST      drop support for LIST subsystems.
1543      LIST is a comma-separated list from: aot, profiler, decimal, pinvoke, debug, appdomains, verifier, 
1544      reflection_emit, reflection_emit_save, large_code, logging, com, ssa, generics, attach, jit, interpreter, simd, soft_debug, perfcounters, normalization, desktop_loader, shared_perfcounters, remoting,
1545          security, lldb, mdb, assert_messages, cleanup, sgen_marksweep_conc, sgen_split_nursery, sgen_gc_bridge, sgen_debug_helpers, sockets.],
1547         for feature in `echo "$enable_minimal" | sed -e "s/,/ /g"`; do
1548                 eval "mono_feature_disable_$feature='yes'"
1549         done
1550         DISABLED_FEATURES=$enable_minimal
1551         disabled="Disabled:      $enable_minimal"
1552 ],[])
1554 AC_DEFINE_UNQUOTED(DISABLED_FEATURES, "$DISABLED_FEATURES", [String of disabled features])
1556 if test "x$mono_feature_disable_aot" = "xyes"; then
1557         AC_DEFINE(DISABLE_AOT, 1, [Disable AOT Compiler])
1558         enable_system_aot=no
1559         AC_MSG_NOTICE([Disabled AOT compiler])
1562 if test "x$mono_feature_disable_profiler" = "xyes"; then
1563         AC_DEFINE(DISABLE_PROFILER, 1, [Disable default profiler support])
1564         AC_MSG_NOTICE([Disabled support for the profiler])
1566 AM_CONDITIONAL(DISABLE_PROFILER, test x$mono_feature_disable_profiler = xyes)
1568 if test "x$mono_feature_disable_decimal" = "xyes"; then
1569         AC_DEFINE(DISABLE_DECIMAL, 1, [Disable System.Decimal support])
1570         AC_MSG_NOTICE([Disabled support for decimal])
1573 if test "x$mono_feature_disable_pinvoke" = "xyes"; then
1574         AC_DEFINE(DISABLE_PINVOKE, 1, [Disable P/Invoke support])
1575         AC_MSG_NOTICE([Disabled support for P/Invoke])
1578 if test "x$mono_feature_disable_debug" = "xyes"; then
1579         AC_DEFINE(DISABLE_DEBUG, 1, [Disable runtime debugging support])
1580         AC_MSG_NOTICE([Disabled support for runtime debugging])
1583 if test "x$mono_feature_disable_reflection_emit" = "xyes"; then
1584         AC_DEFINE(DISABLE_REFLECTION_EMIT, 1, [Disable reflection emit support])
1585         mono_feature_disable_reflection_emit_save=yes
1586         AC_MSG_NOTICE([Disabled support for Reflection.Emit])
1589 if test "x$mono_feature_disable_reflection_emit_save" = "xyes"; then
1590         AC_DEFINE(DISABLE_REFLECTION_EMIT_SAVE, 1, [Disable assembly saving support in reflection emit])
1591         AC_MSG_NOTICE([Disabled support for Reflection.Emit.Save])
1594 if test "x$mono_feature_disable_large_code" = "xyes"; then
1595         AC_DEFINE(DISABLE_LARGE_CODE, 1, [Disable support for huge assemblies])
1596         AC_MSG_NOTICE([Disabled support for large assemblies])
1599 if test "x$mono_feature_disable_logging" = "xyes"; then
1600         AC_DEFINE(DISABLE_LOGGING, 1, [Disable support debug logging])
1601         AC_MSG_NOTICE([Disabled support for logging])
1604 if test "x$mono_feature_disable_com" = "xyes"; then
1605         AC_DEFINE(DISABLE_COM, 1, [Disable COM support])
1606         AC_MSG_NOTICE([Disabled COM support])
1609 if test "x$mono_feature_disable_ssa" = "xyes"; then
1610         AC_DEFINE(DISABLE_SSA, 1, [Disable advanced SSA JIT optimizations])
1611         AC_MSG_NOTICE([Disabled SSA JIT optimizations])
1614 if test "x$mono_feature_disable_generics" = "xyes"; then
1615         AC_DEFINE(DISABLE_GENERICS, 1, [Disable generics support])
1616         AC_MSG_NOTICE([Disabled Generics Support])
1619 if test "x$mono_feature_disable_shadowcopy" = "xyes"; then
1620         AC_DEFINE(DISABLE_SHADOW_COPY, 1, [Disable Shadow Copy for AppDomains])
1621         AC_MSG_NOTICE([Disabled Shadow copy for AppDomains])
1624 if test "x$mono_feature_disable_portability" = "xyes"; then
1625         AC_DEFINE(DISABLE_PORTABILITY, 1, [Disables the IO portability layer])
1626         AC_MSG_NOTICE([Disabled IO Portability layer])
1629 if test "x$mono_feature_disable_attach" = "xyes"; then
1630         AC_DEFINE(DISABLE_ATTACH, 1, [Disable agent attach support])
1631         AC_MSG_NOTICE([Disabled agent attach])
1634 if test "x$mono_feature_disable_verifier" = "xyes"; then
1635         AC_DEFINE(DISABLE_VERIFIER, 1, [Disables the verifier])
1636         AC_MSG_NOTICE([Disabled the metadata and IL verifiers])
1639 if test "x$mono_feature_disable_jit" = "xyes"; then
1640         AC_DEFINE(DISABLE_JIT, 1, [Disable the JIT, only full-aot mode or interpreter will be supported by the runtime.])
1641         AC_MSG_NOTICE([Disabled the JIT engine, only full AOT or interpreter will be supported])
1644 AM_CONDITIONAL(DISABLE_JIT, test x$mono_feature_disable_jit = xyes)
1646 if test "x$mono_feature_disable_interpreter" = "xyes"; then
1647         AC_DEFINE(DISABLE_INTERPRETER, 1, [Disable the interpreter.])
1648         AC_MSG_NOTICE([Disabled the interpreter])
1651 AM_CONDITIONAL(DISABLE_INTERPRETER, test x$mono_feature_disable_interpreter = xyes)
1653 if test "x$mono_feature_disable_interpreter" != "xyes" -o "x$mono_feature_disable_jit" != "xyes"; then
1654         AC_DEFINE(ENABLE_ILGEN, 1, [Some VES is available at runtime])
1657 AM_CONDITIONAL(ENABLE_ILGEN, test x$mono_feature_disable_interpreter != xyes -o x$mono_feature_disable_jit != xyes)
1659 if test "x$mono_feature_disable_simd" = "xyes"; then
1660         AC_DEFINE(DISABLE_SIMD, 1, [Disable SIMD intrinsics related optimizations.])
1661         AC_MSG_NOTICE([Disabled SIMD support])
1664 if test "x$mono_feature_disable_soft_debug" = "xyes"; then
1665         AC_DEFINE(DISABLE_DEBUGGER_AGENT, 1, [Disable Soft Debugger Agent.])
1666         AC_MSG_NOTICE([Disabled Soft Debugger.])
1669 AM_CONDITIONAL(DISABLE_DEBUGGER_AGENT, test x$mono_feature_disable_debugger_agent = xyes)
1671 if test "x$mono_feature_disable_perfcounters" = "xyes"; then
1672         AC_DEFINE(DISABLE_PERFCOUNTERS, 1, [Disable Performance Counters.])
1673         AC_MSG_NOTICE([Disabled Performance Counters.])
1675 if test "x$mono_feature_disable_normalization" = "xyes"; then
1676         AC_DEFINE(DISABLE_NORMALIZATION, 1, [Disable String normalization support.])
1677         AC_MSG_NOTICE([Disabled String normalization support.])
1680 #TODO: remove assembly_remapping feature name once everyone is using desktop_loader
1681 if test "x$mono_feature_disable_assembly_remapping" = "xyes" || test "x$mono_feature_disable_desktop_loader" = "xyes"; then
1682         AC_DEFINE(DISABLE_DESKTOP_LOADER, 1, [Disable desktop assembly loader semantics.])
1683         AC_MSG_NOTICE([Disabled desktop assembly loader semantics.])
1686 if test "x$mono_feature_disable_shared_perfcounters" = "xyes"; then
1687         AC_DEFINE(DISABLE_SHARED_PERFCOUNTERS, 1, [Disable shared perfcounters.])
1688         AC_MSG_NOTICE([Disabled Shared perfcounters.])
1691 if test "x$mono_feature_disable_appdomains" = "xyes"; then
1692         AC_DEFINE(DISABLE_APPDOMAINS, 1, [Disable support for multiple appdomains.])
1693         AC_MSG_NOTICE([Disabled support for multiple appdomains.])
1696 if test "x$mono_feature_disable_remoting" = "xyes"; then
1697         AC_DEFINE(DISABLE_REMOTING, 1, [Disable remoting support (This disables type proxies and make com non-functional)])
1698         AC_MSG_NOTICE([Disabled remoting])
1701 if test "x$mono_feature_disable_security" = "xyes"; then
1702         AC_DEFINE(DISABLE_SECURITY, 1, [Disable CAS/CoreCLR security])
1703         AC_MSG_NOTICE([Disabled CAS/CoreCLR security manager (used e.g. for Moonlight)])
1706 if test "x$mono_feature_disable_lldb" = "xyes"; then
1707         AC_DEFINE(DISABLE_LLDB, 1, [Disable support code for the LLDB plugin.])
1708         AC_MSG_NOTICE([Disabled LLDB plugin support code.])
1711 if test "x$mono_feature_disable_mdb" = "xyes"; then
1712         AC_DEFINE(DISABLE_MDB, 1, [Disable support for .mdb symbol files.])
1713         AC_MSG_NOTICE([Disabled support for .mdb symbol files.])
1716 if test "x$mono_feature_disable_assert_messages" = "xyes"; then
1717         AC_DEFINE(DISABLE_ASSERT_MESSAGES, 1, [Disable assertion messages.])
1718         AC_MSG_NOTICE([Disabled assertion messages.])
1721 if test "x$mono_feature_disable_cleanup" = "xyes"; then
1722         AC_DEFINE(DISABLE_CLEANUP, 1, [Disable runtime cleanup.])
1723         AC_MSG_NOTICE([Disabled runtime cleanup.])
1726 if test "x$mono_feature_disable_sgen_marksweep_conc" = "xyes"; then
1727         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_CONC, 1, [Disable concurrent gc support in SGEN.])
1728         AC_MSG_NOTICE([Disabled concurrent gc support in SGEN.])
1732 if test "x$mono_feature_disable_sgen_split_nursery" = "xyes"; then
1733         AC_DEFINE(DISABLE_SGEN_SPLIT_NURSERY, 1, [Disable minor=split support in SGEN.])
1734         AC_MSG_NOTICE([Disabled minor=split support in SGEN.])
1737 if test "x$mono_feature_disable_sgen_gc_bridge" = "xyes"; then
1738         AC_DEFINE(DISABLE_SGEN_GC_BRIDGE, 1, [Disable gc bridge support in SGEN.])
1739         AC_MSG_NOTICE([Disabled gc bridge support in SGEN.])
1742 if test "x$mono_feature_disable_sgen_debug_helpers" = "xyes"; then
1743         AC_DEFINE(DISABLE_SGEN_DEBUG_HELPERS, 1, [Disable debug helpers in SGEN.])
1744         AC_MSG_NOTICE([Disabled debug helpers in SGEN.])
1747 if test "x$mono_feature_disable_sockets" = "xyes"; then
1748         AC_DEFINE(DISABLE_SOCKETS, 1, [Disable sockets])
1749         AC_MSG_NOTICE([Disabled sockets])
1752 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
1753 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
1755 has_extension_module=no
1756 AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
1758         for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
1759                 if test x$extension = xdefault ; then
1760                         has_extension_module=yes;
1761                 fi
1762         done
1763         if test x$enable_extension_module = xyes; then
1764                 has_extension_module=yes;
1765         fi
1766 ], [])
1768 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
1770 if test x$has_extension_module != xno ; then
1771         AC_DEFINE([ENABLE_EXTENSION_MODULE], 1, [Extension module enabled])
1772         AC_MSG_NOTICE([Enabling mono extension module.])
1775 # Deprecated
1776 AC_ARG_ENABLE(gsharedvt, [  --enable-gsharedvt Enable generic valuetype sharing (Deprecated)], enable_gsharedvt=$enableval, enable_gsharedvt=no)
1778 AC_MSG_CHECKING(for visibility __attribute__)
1779 AC_COMPILE_IFELSE([
1780         AC_LANG_SOURCE([[
1781                 void __attribute__ ((visibility ("hidden"))) doit (void) {}
1782                 int main () { doit (); return 0; }
1783         ]])
1784 ], [
1785    have_visibility_hidden=yes
1786    AC_MSG_RESULT(yes)
1787 ], [
1788    have_visibility_hidden=no
1789    AC_MSG_RESULT(no)
1793 dnl Boehm GC configuration
1796 AC_ARG_WITH(libgc,   [  --with-libgc=included,none  Controls the Boehm GC config, default=included],[libgc=$with_libgc],[libgc=included])
1798 AC_ARG_ENABLE(boehm, [  --disable-boehm            Disable the Boehm GC.], support_boehm=$enableval,support_boehm=${support_boehm:-yes})
1799 AM_CONDITIONAL(SUPPORT_BOEHM, test x$support_boehm = xyes)
1801 if test "x$support_boehm" = "xyes"; then
1803         AC_ARG_ENABLE(parallel-mark, [  --enable-parallel-mark     Enables Boehm GC Parallel Marking], enable_parallel_mark=$enableval, enable_parallel_mark=$parallel_mark)
1804         if test x$enable_parallel_mark = xyes; then
1805                 libgc_configure_args="$libgc_configure_args --enable-parallel-mark"
1806         fi
1808         gc_msg=""
1809         LIBGC_CPPFLAGS=
1810         LIBGC_LIBS=
1811         LIBGC_STATIC_LIBS=
1812         libgc_dir=
1813         case "x$libgc" in
1814                 xincluded)
1815                         if test "x$support_boehm" = "xyes"; then
1816                                 libgc_dir=libgc
1817                         fi
1819                         LIBGC_CPPFLAGS='-I$(top_srcdir)/libgc/include'
1820                         LIBGC_LIBS='$(top_builddir)/libgc/libmonogc.la'
1821                         LIBGC_STATIC_LIBS='$(top_builddir)/libgc/libmonogc-static.la'
1823                         BOEHM_DEFINES="-DHAVE_BOEHM_GC"
1825                         if test x$target_win32 = xyes; then
1826                                 BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
1827                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
1828                         fi
1830                         gc_msg="Included Boehm GC with typed GC"
1831                         if test x$enable_parallel_mark = xyes; then
1832                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
1833                                 gc_msg="$gc_msg and parallel mark"
1834                         else
1835                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC)", [GC description])
1836                         fi
1837                         ;;
1839                 xboehm|xbohem|xyes)
1840                         AC_MSG_WARN("External Boehm is no longer supported")
1841                         ;;
1843                 xsgen)
1844                         AC_MSG_WARN("Use --with-sgen instead, --with-libgc= controls Boehm configuration")
1845                         ;;
1847                 xnone)
1848                         AC_MSG_WARN("Compiling mono without GC.")
1849                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description])
1850                         AC_DEFINE(HAVE_NULL_GC,1,[No GC support.])
1851                         gc_msg="none"
1852                         ;;
1853                 *)
1854                         AC_MSG_ERROR([Invalid argument $libgc to --with-libgc.])
1855                         ;;
1856         esac
1858         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])
1859         if test "x$large_heap" = "xyes"; then
1860            CPPFLAGS="$CPPFLAGS -DLARGE_CONFIG"
1861         fi
1863         AC_SUBST(LIBGC_CPPFLAGS)
1864         AC_SUBST(LIBGC_LIBS)
1865         AC_SUBST(LIBGC_STATIC_LIBS)
1866         AC_SUBST(libgc_dir)
1867         AC_SUBST(BOEHM_DEFINES)
1870 AM_CONDITIONAL(SUPPORT_NULLGC, test "x$libgc" = "xnone")
1873 dnl End of Boehm GC Configuration
1876 dnl *************************************
1877 dnl *** Checks for zero length arrays ***
1878 dnl *************************************
1879 AC_MSG_CHECKING(whether $CC supports zero length arrays)
1880 AC_TRY_COMPILE([
1881         struct s {
1882                 int  length;
1883                 char data [0];
1884         };
1885 ], [], [
1886         AC_MSG_RESULT(yes)
1887         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 0, [Length of zero length arrays])
1888 ], [
1889         AC_MSG_RESULT(no)
1890         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
1893 dnl ***********************************
1894 dnl *** Checks for signals
1895 dnl ***********************************
1896 AC_CHECK_HEADERS(signal.h)
1897 AC_CHECK_FUNCS(sigaction)
1898 AC_CHECK_FUNCS(kill)
1899 AC_CHECK_FUNCS(signal)
1901 # signal() is declared inline in Android headers
1902 # so we need to workaround it by overriding the check.
1903 if test x$platform_android = xyes; then
1904         AC_DEFINE(HAVE_SIGNAL,1)
1907 # `target_ios=yes` does not detect watch devices and fails when cross-compiling
1908 AC_MONO_APPLE_TARGET(TARGET_OS_IPHONE, [mono_native_platform_ios=yes])
1910 if test x$host_win32 = xno; then
1911         dnl *************************************
1912         dnl *** Checks for time capabilities ***
1913         dnl *************************************
1915         AC_MSG_CHECKING(for CLOCK_MONOTONIC)
1916         AC_TRY_COMPILE([#include <time.h>], [
1917                 const int foo = CLOCK_MONOTONIC;
1918         ],[
1919                 AC_MSG_RESULT(yes)
1920                 AC_DEFINE(HAVE_CLOCK_MONOTONIC, 1, [CLOCK_MONOTONIC])
1921         ], [
1922                 AC_MSG_RESULT(no)
1923         ])
1925         AC_MSG_CHECKING(for CLOCK_MONOTONIC_COARSE)
1926         AC_TRY_COMPILE([#include <time.h>], [
1927                 const int foo = CLOCK_MONOTONIC_COARSE;
1928         ],[
1929                 AC_MSG_RESULT(yes)
1930                 AC_DEFINE(HAVE_CLOCK_MONOTONIC_COARSE, 1, [CLOCK_MONOTONIC_COARSE])
1931         ], [
1932                 AC_MSG_RESULT(no)
1933         ])
1935         AC_MSG_CHECKING(for CLOCK_REALTIME)
1936         AC_TRY_COMPILE([#include <time.h>], [
1937                 const int foo = CLOCK_REALTIME;
1938         ],[
1939                 AC_MSG_RESULT(yes)
1940                 AC_DEFINE(HAVE_CLOCK_REALTIME, 1, [CLOCK_REALTIME])
1941         ], [
1942                 AC_MSG_RESULT(no)
1943         ])
1945         AC_CHECK_FUNC(mach_absolute_time, [AC_DEFINE(HAVE_MACH_ABSOLUTE_TIME, 1, [mach_absolute_time])])
1946         AC_CHECK_FUNC(gethrtime, [AC_DEFINE(HAVE_GETHRTIME, 1, [gethrtime])])
1947         AC_CHECK_FUNC(read_real_time, [AC_DEFINE(HAVE_READ_REAL_TIME, 1, [read_real_time])])
1948         AC_CHECK_FUNC(mach_timebase_info, [AC_DEFINE(HAVE_MACH_TIMEBASE_INFO, 1, [mach_timebase_info])])
1949         AC_CHECK_FUNC(futimes,            [AC_DEFINE(HAVE_FUTIMES, 1, [futimes])])
1950         AC_CHECK_FUNC(futimens,           [AC_DEFINE(HAVE_FUTIMENS, 1, [futimens])])
1952         dnl hires monotonic clock support
1953         AC_SEARCH_LIBS(clock_gettime, rt)
1954         AC_CHECK_FUNCS(clock_nanosleep)
1956         dnl dynamic loader support
1957         AC_CHECK_FUNC(dlopen, DL_LIB="",
1958                 AC_CHECK_LIB(dl, dlopen, DL_LIB="-ldl", dl_support=no)
1959         )
1960         if test x$dl_support = xno; then
1961                 AC_MSG_WARN([No dynamic loading support available])
1962         else
1963                 LIBS="$LIBS $DL_LIB"
1964                 AC_DEFINE(HAVE_DL_LOADER,1,[dlopen-based dynamic loader available])
1965                 dnl from glib's configure.ac
1966                 AC_CACHE_CHECK([for preceeding underscore in symbols],
1967                         mono_cv_uscore,[
1968                         AC_TRY_RUN([#include <dlfcn.h>
1969                         int mono_underscore_test (void) { return 42; }
1970                         int main() {
1971                           void *f1 = (void*)0, *f2 = (void*)0, *handle;
1972                           handle = dlopen ((void*)0, 0);
1973                           if (handle) {
1974                             f1 = dlsym (handle, "mono_underscore_test");
1975                             f2 = dlsym (handle, "_mono_underscore_test");
1976                           } return (!f2 || f1);
1977                         }],
1978                                 [mono_cv_uscore=yes],
1979                                 [mono_cv_uscore=no],
1980                         [])
1981                 ])
1982                 if test "x$mono_cv_uscore" = "xyes"; then
1983                         MONO_DL_NEED_USCORE=1
1984                 else
1985                         MONO_DL_NEED_USCORE=0
1986                 fi
1987                 AC_SUBST(MONO_DL_NEED_USCORE)
1988                 AC_CHECK_FUNC(dlerror)
1989         fi
1991         dnl ******************************************************************
1992         dnl *** Checks for the IKVM JNI interface library                  ***
1993         dnl ******************************************************************
1994         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])
1996         ikvm_native_dir=
1997         if test x$with_ikvm_native = xyes; then
1998                 ikvm_native_dir=ikvm-native
1999                 jdk_headers_found="IKVM Native"
2000         fi
2002         AC_SUBST(ikvm_native_dir)
2004         AC_CHECK_HEADERS(execinfo.h)
2006         AC_CHECK_HEADERS(sys/auxv.h sys/resource.h)
2008         AC_CHECK_FUNCS(getgrgid_r)
2009         AC_CHECK_FUNCS(getgrnam_r)
2010         AC_CHECK_FUNCS(getresuid)
2011         AC_CHECK_FUNCS(setresuid)
2012         AC_CHECK_FUNCS(kqueue)
2013         AC_CHECK_FUNCS(backtrace_symbols)
2014         AC_CHECK_FUNCS(mkstemp)
2015         AC_CHECK_FUNCS(mmap)
2016         AC_CHECK_FUNCS(madvise)
2017         AC_CHECK_FUNCS(getrusage)
2018         AC_CHECK_FUNCS(getpriority)
2019         AC_CHECK_FUNCS(setpriority)
2020         AC_CHECK_FUNCS(dl_iterate_phdr)
2021         AC_CHECK_FUNCS(dladdr)
2022         AC_CHECK_FUNCS(sysconf)
2023         AC_CHECK_FUNCS(getrlimit)
2024         AC_CHECK_FUNCS(prctl)
2025         AC_CHECK_FUNCS(arc4random)
2026         AC_CHECK_FUNCS(nl_langinfo)
2028         AC_CHECK_FUNCS(sched_getaffinity)
2029         AC_CHECK_FUNCS(sched_setaffinity)
2030         AC_CHECK_FUNCS(sched_getcpu)
2032         if test x$platform_android != xyes; then
2033                 AC_CHECK_FUNCS(getpwnam_r)
2034                 AC_CHECK_FUNCS(getpwuid_r)
2035         fi
2037         AC_CHECK_FUNCS(readlink)
2038         AC_CHECK_FUNCS(chmod)
2039         AC_CHECK_FUNCS(lstat)
2040         AC_CHECK_FUNCS(getdtablesize)
2042         AC_CHECK_FUNCS(ftruncate)
2043         AC_CHECK_FUNCS(msync)
2045         AC_CHECK_FUNCS(gethostname getpeername)
2046         AC_CHECK_FUNCS(utime utimes)
2048         AC_CHECK_FUNCS(openlog closelog)
2049         AC_CHECK_FUNCS(atexit)
2051         AC_FUNC_STRERROR_R()
2053         dnl ****************************************************************
2054         dnl *** Check for sched_setaffinity from glibc versions before   ***
2055         dnl *** 2.3.4. The older versions of the function only take 2    ***
2056         dnl *** parameters, not 3.                                       ***
2057         dnl ***                                                          ***
2058         dnl *** Because the interface change was not made in a minor     ***
2059         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
2060         dnl *** won't always indicate the interface sched_affinity has.  ***
2061         dnl ****************************************************************
2062         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
2063         AC_TRY_COMPILE([#include <sched.h>], [
2064             int mask = 1; 
2065             sched_setaffinity(0, &mask);
2066         ], [
2067                 # Yes, we have it...
2068                 AC_MSG_RESULT(yes)
2069                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
2070         ], [
2071                 # We have the new, three-parameter version
2072                 AC_MSG_RESULT(no)
2073         ])
2074         AC_TRY_COMPILE([#include <sched.h>], [
2075              CPU_COUNT((void *) 0);
2076         ], [
2077                 AC_MSG_RESULT(yes)
2078                 AC_DEFINE(GLIBC_HAS_CPU_COUNT, 1, [GLIBC has CPU_COUNT macro in sched.h])
2079         ], [
2080                 # We have the new, three-parameter version
2081                 AC_MSG_RESULT(no)
2082         ])
2084         dnl ******************************************************************
2085         dnl *** Check for large file support                               ***
2086         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
2087         dnl ******************************************************************
2088         
2089         # Check that off_t can represent 2**63 - 1 correctly, working around
2090         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
2091         # CPPFLAGS and sets $large_offt to yes if the test succeeds
2092         large_offt=no
2093         AC_DEFUN([LARGE_FILES], [
2094                 large_CPPFLAGS=$CPPFLAGS
2095                 CPPFLAGS="$CPPFLAGS $1"
2096                 AC_TRY_COMPILE([
2097                         #include <sys/types.h>
2098                         #include <limits.h>
2099                 ], [
2100                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
2101                         #define COMPILE_TIME_ASSERT(pred) \
2102                                 switch(0){case 0:case pred:;}
2103                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
2104                 ], [
2105                         AC_MSG_RESULT(ok)
2106                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
2107                         large_CPPFLAGS="$large_CPPFLAGS $1"
2108                         large_offt=yes
2109                 ], [
2110                         AC_MSG_RESULT(no)
2111                 ])
2112                 CPPFLAGS=$large_CPPFLAGS
2113         ])
2115         AC_MSG_CHECKING(if off_t is 64 bits wide)
2116         LARGE_FILES("")
2117         if test $large_offt = no; then
2118                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
2119                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
2120         fi
2121         if test $large_offt = no; then
2122                 AC_MSG_WARN([No 64 bit file size support available])
2123         fi
2124         
2125         dnl *****************************
2126         dnl *** Checks for libsocket  ***
2127         dnl *****************************
2128         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
2130         case "$host" in
2131                 *-*-*freebsd*)
2132                         dnl *****************************
2133                         dnl *** Checks for libinotify ***
2134                         dnl *****************************
2135                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
2136         esac
2138         dnl *******************************
2139         dnl *** Checks for MSG_NOSIGNAL ***
2140         dnl *******************************
2141         AC_MSG_CHECKING(for MSG_NOSIGNAL)
2142         AC_TRY_COMPILE([#include <sys/socket.h>], [
2143                 int f = MSG_NOSIGNAL;
2144         ], [
2145                 # Yes, we have it...
2146                 AC_MSG_RESULT(yes)
2147                 AC_DEFINE(HAVE_MSG_NOSIGNAL, 1, [Have MSG_NOSIGNAL])
2148         ], [
2149                 # We'll have to use signals
2150                 AC_MSG_RESULT(no)
2151         ])
2153         dnl *****************************
2154         dnl *** Checks for IPPROTO_IP ***
2155         dnl *****************************
2156         AC_MSG_CHECKING(for IPPROTO_IP)
2157         AC_TRY_COMPILE([#include <netinet/in.h>], [
2158                 int level = IPPROTO_IP;
2159         ], [
2160                 # Yes, we have it...
2161                 AC_MSG_RESULT(yes)
2162                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
2163         ], [
2164                 # We'll have to use getprotobyname
2165                 AC_MSG_RESULT(no)
2166         ])
2168         dnl *******************************
2169         dnl *** Checks for IPPROTO_IPV6 ***
2170         dnl *******************************
2171         AC_MSG_CHECKING(for IPPROTO_IPV6)
2172         AC_TRY_COMPILE([#include <netinet/in.h>], [
2173                 int level = IPPROTO_IPV6;
2174         ], [
2175                 # Yes, we have it...
2176                 AC_MSG_RESULT(yes)
2177                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
2178         ], [
2179                 # We'll have to use getprotobyname
2180                 AC_MSG_RESULT(no)
2181         ])
2183         dnl ******************************
2184         dnl *** Checks for IPPROTO_TCP ***
2185         dnl ******************************
2186         AC_MSG_CHECKING(for IPPROTO_TCP)
2187         AC_TRY_COMPILE([#include <netinet/in.h>], [
2188                 int level = IPPROTO_TCP;
2189         ], [
2190                 # Yes, we have it...
2191                 AC_MSG_RESULT(yes)
2192                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
2193         ], [
2194                 # We'll have to use getprotobyname
2195                 AC_MSG_RESULT(no)
2196         ])
2198         dnl *****************************
2199         dnl *** Checks for SOL_IP     ***
2200         dnl *****************************
2201         AC_MSG_CHECKING(for SOL_IP)
2202         AC_TRY_COMPILE([#include <netdb.h>], [
2203                 int level = SOL_IP;
2204         ], [
2205                 # Yes, we have it...
2206                 AC_MSG_RESULT(yes)
2207                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
2208         ], [
2209                 # We'll have to use getprotobyname
2210                 AC_MSG_RESULT(no)
2211         ])
2213         dnl *****************************
2214         dnl *** Checks for SOL_IPV6     ***
2215         dnl *****************************
2216         AC_MSG_CHECKING(for SOL_IPV6)
2217         AC_TRY_COMPILE([#include <netdb.h>], [
2218                 int level = SOL_IPV6;
2219         ], [
2220                 # Yes, we have it...
2221                 AC_MSG_RESULT(yes)
2222                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
2223         ], [
2224                 # We'll have to use getprotobyname
2225                 AC_MSG_RESULT(no)
2226         ])
2228         dnl *****************************
2229         dnl *** Checks for SOL_TCP    ***
2230         dnl *****************************
2231         AC_MSG_CHECKING(for SOL_TCP)
2232         AC_TRY_COMPILE([#include <netdb.h>], [
2233                 int level = SOL_TCP;
2234         ], [
2235                 # Yes, we have it...
2236                 AC_MSG_RESULT(yes)
2237                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
2238         ], [
2239                 # We'll have to use getprotobyname
2240                 AC_MSG_RESULT(no)
2241         ])
2243         dnl *****************************
2244         dnl *** Checks for IP_PKTINFO ***
2245         dnl *****************************
2246         AC_MSG_CHECKING(for IP_PKTINFO)
2247         AC_TRY_COMPILE([#include <linux/in.h>], [
2248                 int level = IP_PKTINFO;
2249         ], [
2250                 # Yes, we have it...
2251                 AC_MSG_RESULT(yes)
2252                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
2253         ], [
2254                 AC_MSG_RESULT(no)
2255         ])
2257         dnl *****************************
2258         dnl *** Checks for IPV6_PKTINFO ***
2259         dnl *****************************
2260         AC_MSG_CHECKING(for IPV6_PKTINFO)
2261         AC_TRY_COMPILE([#include <netdb.h>], [
2262                 int level = IPV6_PKTINFO;
2263         ], [
2264                 # Yes, we have it...
2265                 AC_MSG_RESULT(yes)
2266                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
2267         ], [
2268                 AC_MSG_RESULT(no)
2269         ])
2271         dnl **********************************
2272         dnl *** Checks for IP_DONTFRAG     ***
2273         dnl **********************************
2274         AC_MSG_CHECKING(for IP_DONTFRAG)
2275         AC_TRY_COMPILE([#include <netinet/in.h>], [
2276                 int level = IP_DONTFRAG;
2277         ], [
2278                 # Yes, we have it...
2279                 AC_MSG_RESULT(yes)
2280                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
2281         ], [
2282                 AC_MSG_RESULT(no)
2283         ])
2285         dnl **********************************
2286         dnl *** Checks for IP_DONTFRAGMENT ***
2287         dnl **********************************
2288         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
2289         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
2290                 int level = IP_DONTFRAGMENT;
2291         ], [
2292                 # Yes, we have it...
2293                 AC_MSG_RESULT(yes)
2294                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
2295         ], [
2296                 AC_MSG_RESULT(no)
2297         ])
2299         dnl **********************************
2300         dnl *** Checks for IP_MTU_DISCOVER ***
2301         dnl **********************************
2302         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
2303         AC_TRY_COMPILE([#include <linux/in.h>], [
2304                 int level = IP_MTU_DISCOVER;
2305         ], [
2306                 # Yes, we have it...
2307                 AC_MSG_RESULT(yes)
2308                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
2309         ], [
2310                 AC_MSG_RESULT(no)
2311         ])
2313         dnl **********************************
2314         dnl *** Checks for  IP_PMTUDISC_DO ***
2315         dnl **********************************
2316         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
2317         AC_TRY_COMPILE([#include <linux/in.h>], [
2318                 int level = IP_PMTUDISC_DO;
2319         ], [
2320                 # Yes, we have it...
2321                 AC_MSG_RESULT(yes)
2322                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
2323         ], [
2324                 AC_MSG_RESULT(no)
2325         ])
2327         dnl *********************************
2328         dnl *** Check for struct ip_mreqn ***
2329         dnl *********************************
2330         AC_MSG_CHECKING(for struct ip_mreqn)
2331         AC_TRY_COMPILE([#include <netinet/in.h>], [
2332                 struct ip_mreqn mreq;
2333                 mreq.imr_address.s_addr = 0;
2334         ], [
2335                 # Yes, we have it...
2336                 AC_MSG_RESULT(yes)
2337                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
2338         ], [
2339                 # We'll just have to try and use struct ip_mreq
2340                 AC_MSG_RESULT(no)
2341                 AC_MSG_CHECKING(for struct ip_mreq)
2342                 AC_TRY_COMPILE([#include <netinet/in.h>], [
2343                         struct ip_mreq mreq;
2344                         mreq.imr_interface.s_addr = 0;
2345                 ], [
2346                         # Yes, we have it...
2347                         AC_MSG_RESULT(yes)
2348                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
2349                 ], [
2350                         # No multicast support
2351                         AC_MSG_RESULT(no)
2352                 ])
2353         ])
2354         
2355         dnl **********************************
2356         dnl *** Check for getaddrinfo ***
2357         dnl **********************************
2358         AC_MSG_CHECKING(for getaddrinfo)
2359                 AC_TRY_LINK([
2360                 #include <stdio.h>
2361                 #include <netdb.h>
2362         ], [
2363                 getaddrinfo(NULL,NULL,NULL,NULL);
2364         ], [
2365                 # Yes, we have it...
2366                 AC_MSG_RESULT(yes)
2367                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2368         ], [
2369                 AC_MSG_RESULT(no)
2370         ])
2372         dnl **********************************
2373         dnl *** Check for gethostbyname2_r ***
2374         dnl **********************************
2375         AC_MSG_CHECKING(for gethostbyname2_r)
2376                 AC_TRY_LINK([
2377                 #include <stdio.h>
2378                 #include <netdb.h>
2379         ], [
2381                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
2382         ], [
2383                 # Yes, we have it...
2384                 AC_MSG_RESULT(yes)
2385                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
2386         ], [
2387                 AC_MSG_RESULT(no)
2388         ])
2390         dnl **********************************
2391         dnl *** Check for gethostbyname2 ***
2392         dnl **********************************
2393         AC_MSG_CHECKING(for gethostbyname2)
2394                 AC_TRY_LINK([
2395                 #include <stdio.h>
2396                 #include <netdb.h>
2397         ], [
2398                 gethostbyname2(NULL,0);
2399         ], [
2400                 # Yes, we have it...
2401                 AC_MSG_RESULT(yes)
2402                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
2403         ], [
2404                 AC_MSG_RESULT(no)
2405         ])
2407         dnl **********************************
2408         dnl *** Check for gethostbyname ***
2409         dnl **********************************
2410         AC_MSG_CHECKING(for gethostbyname)
2411                 AC_TRY_LINK([
2412                 #include <stdio.h>
2413                 #include <netdb.h>
2414         ], [
2415                 gethostbyname(NULL);
2416         ], [
2417                 # Yes, we have it...
2418                 AC_MSG_RESULT(yes)
2419                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2420         ], [
2421                 AC_MSG_RESULT(no)
2422         ])
2424         dnl **********************************
2425         dnl *** Check for getprotobyname ***
2426         dnl **********************************
2427         AC_MSG_CHECKING(for getprotobyname)
2428                 AC_TRY_LINK([
2429                 #include <stdio.h>
2430                 #include <netdb.h>
2431         ], [
2432                 getprotobyname(NULL);
2433         ], [
2434                 # Yes, we have it...
2435                 AC_MSG_RESULT(yes)
2436                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2437         ], [
2438                 AC_MSG_RESULT(no)
2439         ])
2441         dnl **********************************
2442         dnl *** Check for getprotobyname_r ***
2443         dnl **********************************
2444         AC_MSG_CHECKING(for getprotobyname_r)
2445                 AC_TRY_LINK([
2446                 #include <stdio.h>
2447                 #include <netdb.h>
2448         ], [
2449                 getprotobyname_r(NULL, NULL, NULL, 0, NULL);
2450         ], [
2451                 # Yes, we have it...
2452                 AC_MSG_RESULT(yes)
2453                 AC_DEFINE(HAVE_GETPROTOBYNAME_R, 1, [Have getprotobyname_r])
2454         ], [
2455                 AC_MSG_RESULT(no)
2456         ])
2458         dnl **********************************
2459         dnl *** Check for getnameinfo ***
2460         dnl **********************************
2461         AC_MSG_CHECKING(for getnameinfo)
2462                 AC_TRY_LINK([
2463                 #include <stdio.h>
2464                 #include <netdb.h>
2465         ], [
2466                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2467         ], [
2468                 # Yes, we have it...
2469                 AC_MSG_RESULT(yes)
2470                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2471         ], [
2472                 AC_MSG_RESULT(no)
2473         ])
2476         dnl **********************************
2477         dnl *** Check for inet_ntop ***
2478         dnl **********************************
2479         AC_MSG_CHECKING(for inet_ntop)
2480                 AC_TRY_LINK([
2481                 #include <stdio.h>
2482                 #include <arpa/inet.h>
2483         ], [
2484                 inet_ntop (0, NULL, NULL, 0);
2485         ], [
2486                 # Yes, we have it...
2487                 AC_MSG_RESULT(yes)
2488                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2489         ], [
2490                 AC_MSG_RESULT(no)
2491         ])
2493         dnl *****************************
2494         dnl *** Checks for libnsl     ***
2495         dnl *****************************
2496         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
2498         AC_CHECK_FUNCS(inet_pton inet_aton)
2500         dnl *****************************
2501         dnl *** Checks for libxnet    ***
2502         dnl *****************************
2503         case "${host}" in
2504                 *solaris* )
2505                         AC_MSG_CHECKING(for Solaris XPG4 support)
2506                         if test -f /usr/lib/libxnet.so; then
2507                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
2508                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
2509                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
2510                                 LIBS="$LIBS -lxnet"
2511                                 AC_MSG_RESULT(yes)
2512                         else
2513                                 AC_MSG_RESULT(no)
2514                         fi
2516                         if test "$GCC" = "yes"; then
2517                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
2518                         fi
2519                 ;;
2520         esac
2522         dnl *****************************
2523         dnl *** Checks for libpthread ***
2524         dnl *****************************
2525 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
2526 # and libpthread does not exist
2528         case "${host}" in
2529                 *-*-*haiku*)
2530                         dnl Haiku has pthread in libroot (libc equiv)
2531                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS")
2532                 ;;
2533                 *-*-*freebsd*)
2534                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2535                 ;;
2536                 *-*-*openbsd*)
2537                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2538                 ;;
2539                 *)
2540                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
2541                 ;;
2542         esac
2543         AC_CHECK_HEADERS(pthread.h)
2544         AC_CHECK_HEADERS(pthread_np.h)
2545         AC_CHECK_FUNCS(pthread_mutex_timedlock)
2546         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_getname_np pthread_setname_np pthread_cond_timedwait_relative_np)
2547         AC_CHECK_FUNCS(pthread_kill)
2548         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
2549         AC_TRY_COMPILE([ #include <pthread.h>], [
2550                 pthread_mutexattr_t attr;
2551                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
2552         ], [
2553                 AC_MSG_RESULT(ok)
2554         ], [
2555                 AC_MSG_RESULT(no)
2556                 AC_ERROR(Posix system lacks support for recursive mutexes)
2557         ])
2558         AC_CHECK_FUNCS(pthread_attr_setstacksize)
2559         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
2560         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
2561         AC_CHECK_FUNCS(mincore mlock munlock)
2563         dnl ***********************************
2564         dnl *** Checks for working __thread ***
2565         dnl ***********************************
2566         AC_MSG_CHECKING(for working __thread)
2567         if test "x$with_tls" != "x__thread"; then
2568                 AC_MSG_RESULT(disabled)
2569         elif test "x$cross_compiling" = "xyes"; then
2570                 AC_MSG_RESULT(cross compiling, assuming yes)
2571         else
2572                 AC_TRY_RUN([
2573                         #if defined(__APPLE__) && defined(__clang__)
2574                         #error "__thread does not currently work with clang on Mac OS X"
2575                         #endif
2576                         
2577                         #include <unistd.h>
2578                         #include <pthread.h>
2579                         __thread int i;
2580                         static int res1, res2;
2582                         void thread_main (void *arg)
2583                         {
2584                                 i = arg;
2585                                 sleep (1);
2586                                 if (arg == 1)
2587                                         res1 = (i == arg);
2588                                 else
2589                                         res2 = (i == arg);
2590                         }
2592                         int main () {
2593                                 pthread_t t1, t2;
2595                                 i = 5;
2597                                 pthread_create (&t1, NULL, thread_main, 1);
2598                                 pthread_create (&t2, NULL, thread_main, 2);
2600                                 pthread_join (t1, NULL);
2601                                 pthread_join (t2, NULL);
2603                                 return !(res1 + res2 == 2);
2604                         }
2605                 ], [
2606                                 AC_MSG_RESULT(yes)
2607                 ], [
2608                                 AC_MSG_RESULT(no)
2609                                 with_tls=pthread
2610                 ])
2611         fi
2613         dnl **************************************
2614         dnl *** Checks for working sigaltstack ***
2615         dnl **************************************
2616         AC_MSG_CHECKING(for working sigaltstack)
2617         if test "x$with_sigaltstack" != "xyes"; then
2618                 AC_MSG_RESULT(disabled)
2619         elif test "x$cross_compiling" = "xyes"; then
2620                 AC_MSG_RESULT(cross compiling, assuming no)
2621                 with_sigaltstack=no
2622         else
2623                 AC_TRY_RUN([
2624                         #include <stdio.h>
2625                         #include <stdlib.h>
2626                         #include <unistd.h>
2627                         #include <signal.h>
2628                         #include <pthread.h>
2629                         #include <sys/wait.h>
2630                         #if defined(__FreeBSD__) || defined(__NetBSD__)
2631                         #define SA_STACK SA_ONSTACK
2632                         #endif
2633                         static void
2634                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
2635                         {
2636                                 exit (0);
2637                         }
2639                         volatile char*__ptr = NULL;
2640                         static void *
2641                         loop (void *ignored)
2642                         {
2643                                 *__ptr = 0;
2644                                 return NULL;
2645                         }
2647                         static void
2648                         child ()
2649                         {
2650                                 struct sigaction sa;
2651                                 stack_t sas;
2652                                 pthread_t id;
2653                                 pthread_attr_t attr;
2655                                 sa.sa_sigaction = sigsegv_signal_handler;
2656                                 sigemptyset (&sa.sa_mask);
2657                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
2658                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
2659                                         perror ("sigaction");
2660                                         return;
2661                                 }
2663                                 /* x86 darwin deliver segfaults using SIGBUS */
2664                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
2665                                         perror ("sigaction");
2666                                         return;
2667                                 }
2668                                 sas.ss_sp = malloc (SIGSTKSZ);
2669                                 sas.ss_size = SIGSTKSZ;
2670                                 sas.ss_flags = 0;
2671                                 if (sigaltstack (&sas, NULL) == -1) {
2672                                         perror ("sigaltstack");
2673                                         return;
2674                                 }
2676                                 pthread_attr_init (&attr);
2677                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
2678                                         printf ("pthread_create\n");
2679                                         return;
2680                                 }
2682                                 sleep (100);
2683                         }
2685                         int
2686                         main ()
2687                         {
2688                                 pid_t son;
2689                                 int status;
2690                                 int i;
2692                                 son = fork ();
2693                                 if (son == -1) {
2694                                         return 1;
2695                                 }
2697                                 if (son == 0) {
2698                                         child ();
2699                                         return 0;
2700                                 }
2702                                 for (i = 0; i < 300; ++i) {
2703                                         waitpid (son, &status, WNOHANG);
2704                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
2705                                                 return 0;
2706                                         usleep (10000);
2707                                 }
2709                                 kill (son, SIGKILL);
2710                                 return 1;
2711                         }
2713                 ], [
2714                                 AC_MSG_RESULT(yes)
2715                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
2716                 ], [
2717                                 with_sigaltstack=no
2718                                 AC_MSG_RESULT(no)
2719                 ])
2720         fi
2722         dnl ********************************
2723         dnl *** Checks for semaphore lib ***
2724         dnl ********************************
2725         # 'Real Time' functions on Solaris
2726         # posix4 on Solaris 2.6
2727         # pthread (first!) on Linux
2728         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
2730         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
2731         AC_CHECK_FUNCS(shm_open)
2733         dnl ********************************
2734         dnl *** Checks for timezone stuff **
2735         dnl ********************************
2736         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
2737                 AC_TRY_COMPILE([
2738                         #include <time.h>
2739                         ], [
2740                         struct tm tm;
2741                         tm.tm_gmtoff = 1;
2742                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
2743         if test $ac_cv_struct_tm_gmtoff = yes; then
2744                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
2745         else
2746                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
2747                         AC_TRY_COMPILE([
2748                                 #include <time.h>
2749                         ], [
2750                                 timezone = 1;
2751                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
2752                 if test $ac_cv_var_timezone = yes; then
2753                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
2754                 else
2755                         AC_ERROR(unable to find a way to determine timezone)
2756                 fi
2757         fi
2759         dnl *********************************
2760         dnl *** Checks for math functions ***
2761         dnl *********************************
2762         AC_SEARCH_LIBS(sqrtf, m)
2764         dnl ****************************************************************
2765         dnl *** Checks for working poll() (macosx defines it but doesn't ***
2766         dnl *** have it in the library (duh))                            ***
2767         dnl ****************************************************************
2768         AC_CHECK_FUNCS(poll)
2770         dnl **********************************
2771         dnl *** epoll                      ***
2772         dnl **********************************
2773         AC_CHECK_HEADERS(sys/epoll.h)
2774         haveepoll=no
2775         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
2776         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
2777                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
2778         fi
2780         havekqueue=no
2782         AC_CHECK_HEADERS(sys/event.h)
2783         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
2785         dnl **************************************
2786         dnl * Darwin has a race that prevents us from using reliably:
2787         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
2788         dnl * Since kqueue is mostly used for scaling large web servers, 
2789         dnl * and very few folks run Mono on large web servers on OSX, falling
2790         dnl * back 
2791         dnl **************************************
2792         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
2793                 if test "x$host_darwin" = "xno"; then
2794                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
2795                 fi
2796         fi
2798         dnl ******************************
2799         dnl *** Checks for SIOCGIFCONF ***
2800         dnl ******************************
2801         AC_CHECK_HEADERS(sys/ioctl.h)
2802         AC_CHECK_HEADERS(net/if.h, [], [],
2803            [
2804            #ifdef HAVE_SYS_TYPES_H
2805            # include <sys/types.h>
2806            #endif
2807            #ifdef HAVE_SYS_SOCKET_H
2808            # include <sys/socket.h>
2809            #endif
2810            ])
2811         AC_MSG_CHECKING(for ifreq)
2812         AC_TRY_COMPILE([
2813                 #include <stdio.h>
2814                 #include <sys/ioctl.h>
2815                 #include <net/if.h>
2816                 ], [
2817                 struct ifconf ifc;
2818                 struct ifreq *ifr;
2819                 void *x;
2820                 ifc.ifc_len = 0;
2821                 ifc.ifc_buf = NULL;
2822                 x = (void *) &ifr->ifr_addr;
2823                 ],[
2824                         AC_MSG_RESULT(yes)
2825                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
2826                 ], [
2827                         AC_MSG_RESULT(no)
2828                 ])
2829         dnl **********************************
2830         dnl ***     Checks for sin_len     ***
2831         dnl **********************************
2832         AC_MSG_CHECKING(for sockaddr_in.sin_len)
2833         AC_TRY_COMPILE([
2834                 #include <netinet/in.h>
2835                 ], [
2836                 struct sockaddr_in saddr;
2837                 saddr.sin_len = sizeof (saddr);
2838                 ],[
2839                         AC_MSG_RESULT(yes)
2840                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
2841                 ], [
2842                         AC_MSG_RESULT(no)
2843                 ])      
2844         dnl **********************************
2845         dnl ***    Checks for sin6_len     ***
2846         dnl **********************************
2847         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
2848         AC_TRY_COMPILE([
2849                 #include <netinet/in.h>
2850                 ], [
2851                 struct sockaddr_in6 saddr6;
2852                 saddr6.sin6_len = sizeof (saddr6);
2853                 ],[
2854                         AC_MSG_RESULT(yes)
2855                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
2856                 ], [
2857                         AC_MSG_RESULT(no)
2858                 ])
2859         dnl **********************************
2860         dnl *** Check for getifaddrs       ***
2861         dnl **********************************
2862         AC_MSG_CHECKING(for getifaddrs)
2863                 AC_TRY_LINK([
2864                 #include <stdio.h>
2865                 #include <sys/types.h>
2866                 #include <sys/socket.h>
2867                 #ifdef HAVE_NET_IF_H
2868                 #include <net/if.h>
2869                 #endif
2870                 #include <ifaddrs.h>
2871         ], [
2872                 getifaddrs(NULL);
2873         ], [
2874                 # Yes, we have it...
2875                 AC_MSG_RESULT(yes)
2876                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
2877         ], [
2878                 AC_MSG_RESULT(no)
2879         ])
2880         dnl **********************************
2881         dnl *** Check for if_nametoindex   ***
2882         dnl **********************************
2883         AC_MSG_CHECKING(for if_nametoindex)
2884                 AC_TRY_LINK([
2885                 #include <stdio.h>
2886                 #include <sys/types.h>
2887                 #include <sys/socket.h>
2888                 #include <net/if.h>
2889         ], [
2890                 if_nametoindex(NULL);
2891         ], [
2892                 # Yes, we have it...
2893                 AC_MSG_RESULT(yes)
2894                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
2895         ], [
2896                 AC_MSG_RESULT(no)
2897         ])
2898         dnl **********************************
2899         dnl *** Check for access ***
2900         dnl **********************************
2901         AC_MSG_CHECKING(for access)
2902                 AC_TRY_LINK([
2903                 #include <unistd.h>
2904         ], [
2905                 access(NULL,0);
2906         ], [
2907                 # Yes, we have it...
2908                 AC_MSG_RESULT(yes)
2909                 AC_DEFINE(HAVE_ACCESS, 1, [Have access])
2910         ], [
2911                 AC_MSG_RESULT(no)
2912         ])
2913                         
2914         dnl **********************************
2915         dnl *** Checks for proclib         ***
2916         dnl **********************************
2917         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.)])
2918         dnl **********************************
2919         dnl *** Checks for MonoPosixHelper ***
2920         dnl **********************************
2921         AC_CHECK_HEADERS(checklist.h)
2922         AC_CHECK_HEADERS(pathconf.h)
2923         AC_CHECK_HEADERS(fstab.h)
2924         AC_CHECK_HEADERS(attr/xattr.h)
2925         AC_CHECK_HEADERS(sys/extattr.h)
2926         AC_CHECK_HEADERS(sys/sendfile.h)
2927         AC_CHECK_HEADERS(sys/statvfs.h)
2928         AC_CHECK_HEADERS(sys/statfs.h)
2929         AC_CHECK_HEADERS(sys/vfstab.h)
2930         AC_CHECK_HEADERS(sys/xattr.h)
2931         AC_CHECK_HEADERS(sys/mman.h)
2932         AC_CHECK_HEADERS(sys/param.h)
2933         AC_CHECK_HEADERS(sys/mount.h, [], [],
2934                 [
2935                 #ifdef HAVE_SYS_PARAM_H
2936                 # include <sys/param.h>
2937                 #endif
2938                 ])
2939         AC_CHECK_HEADERS(sys/mount.h)
2940         AC_CHECK_FUNCS(confstr)
2941         AC_CHECK_FUNCS(seekdir telldir)
2942         AC_CHECK_FUNCS(getdomainname)
2943         AC_CHECK_FUNCS(setdomainname)
2944         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
2945         AC_CHECK_FUNCS(setgroups)
2946         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
2947         AC_CHECK_FUNCS(getfsstat)
2948         AC_CHECK_FUNCS(lutimes futimes)
2949         AC_CHECK_FUNCS(mremap)
2950         AC_CHECK_FUNCS(remap_file_pages)
2951         AC_CHECK_FUNCS(posix_fadvise)
2952         AC_CHECK_FUNCS(posix_fallocate)
2953         AC_CHECK_FUNCS(posix_madvise)
2954         AC_CHECK_FUNCS(vsnprintf)
2955         AC_CHECK_FUNCS(sendfile)
2956         AC_CHECK_FUNCS(gethostid sethostid)
2957         AC_CHECK_FUNCS(sethostname)
2958         AC_CHECK_FUNCS(statfs)
2959         AC_CHECK_FUNCS(fstatfs)
2960         AC_CHECK_FUNCS(statvfs)
2961         AC_CHECK_FUNCS(fstatvfs)
2962         AC_CHECK_FUNCS(stime)
2963         AC_CHECK_FUNCS(ttyname_r)
2964         AC_CHECK_FUNCS(psignal)
2965         AC_CHECK_FUNCS(getlogin_r)
2966         AC_CHECK_FUNCS(lockf)
2967         AC_CHECK_FUNCS(swab)
2968         AC_CHECK_FUNCS(setusershell endusershell)
2969         AC_CHECK_FUNCS(futimens utimensat)
2970         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
2971         AC_CHECK_FUNCS(readv writev preadv pwritev)
2972         AC_CHECK_FUNCS(setpgid)
2973         AC_CHECK_FUNCS(system)
2974         AC_CHECK_FUNCS(fork execv execve)
2975         AC_CHECK_FUNCS(waitpid)
2976         AC_CHECK_FUNCS(accept4)
2977         AC_CHECK_FUNCS(localtime_r)
2978         AC_CHECK_FUNCS(mkdtemp)
2979         AC_CHECK_SIZEOF(size_t)
2980         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
2981                 [#include <sys/types.h>
2982                  #include <sys/stat.h>
2983                  #include <unistd.h>])
2984         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
2985                 [#include <sys/types.h>
2986                  #include <sys/stat.h>
2987                  #include <unistd.h>])
2988         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
2989                 [#include <sys/time.h>])
2990         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
2991                 [#include <sys/socket.h>])
2992         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
2993                 [#include <unistd.h>
2994                  #include <fcntl.h>])
2995         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
2996                 [#include <sys/uio.h>])
2997         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
2998                 [#include <sys/socket.h>])
2999         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
3000                 [#include <sys/poll.h>])
3001         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
3002                 [#include <sys/socket.h>])
3003         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
3004                 [#include <sys/socket.h>])
3005         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
3006                 [#include <netinet/in.h>])
3007         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
3008                 [#include <netinet/in.h>])
3009         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
3010                 [#include <sys/un.h>])
3011         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
3012                 [#include <sys/types.h>
3013                  #include <sys/stat.h>
3014                  #include <unistd.h>])
3015         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
3016                 [#include <time.h>])
3017         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
3018                 [#include <sys/time.h>
3019                  #include <sys/types.h>
3020                  #include <utime.h>])
3021         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
3022                 [#include <sys/time.h>])
3023         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
3024                 [#include <sys/types.h>
3025                  #include <utime.h>])
3026         AC_CHECK_MEMBERS(
3027                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
3028                 [#include <sys/types.h>
3029                  #include <dirent.h>])
3030         AC_CHECK_MEMBERS(
3031                 [struct passwd.pw_gecos],,, 
3032                 [#include <sys/types.h>
3033                  #include <pwd.h>])
3034         AC_CHECK_MEMBERS(
3035                 [struct statfs.f_flags],,, 
3036                 [#include <sys/types.h>
3037                  #include <sys/vfs.h>])
3038         AC_CHECK_MEMBERS(
3039                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
3040                 [#include <sys/types.h>
3041                  #include <sys/stat.h>
3042                  #include <unistd.h>])
3044         dnl Favour xattr through glibc, but use libattr if we have to
3045         AC_CHECK_FUNC(lsetxattr, ,
3046                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
3047         )
3048         AC_SUBST(XATTR_LIB)
3050         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
3051         AC_CHECK_MEMBERS(
3052                 [struct kinfo_proc.kp_proc],,, 
3053                 [#include <sys/types.h>
3054                  #include <sys/param.h>
3055                  #include <sys/sysctl.h>
3056                  #include <sys/proc.h>
3057                  ])
3059         dnl *********************************
3060         dnl *** Checks for Windows compilation ***
3061         dnl *********************************
3062         AC_CHECK_HEADERS(sys/time.h)
3063         AC_CHECK_HEADERS(sys/param.h)
3064         AC_CHECK_HEADERS(dirent.h)
3066         dnl ******************************************
3067         dnl *** Checks for OSX and iOS compilation ***
3068         dnl ******************************************
3069         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
3071         dnl *********************************
3072         dnl *** Check for Console 2.0 I/O ***
3073         dnl *********************************
3074         AC_CHECK_HEADERS([curses.h])
3075         AC_CHECK_HEADERS([term.h], [], [],
3076         [#if HAVE_CURSES_H
3077          #include <curses.h>
3078          #endif
3079         ])
3080         AC_CHECK_HEADERS([termios.h])
3082         dnl *********************************
3083         dnl *** Checks for random         ***
3084         dnl *********************************
3085         if test x$host_darwin = xno; then
3086                 AC_CHECK_HEADERS(sys/random.h)
3087                 AC_CHECK_FUNCS(getrandom getentropy)
3088         fi
3090         dnl *********************************
3091         dnl *** Checks for Mono.Native    ***
3092         dnl *********************************
3094         # Translated from CMake in external/corefx/src/Native/Unix/configure.cmake, keep in sync!
3095         # Note: check_c_source_compiles in CMake is AC_TRY_LINK in autoconf
3097         AC_MSG_CHECKING(for linux/in.h)
3098         AC_TRY_COMPILE([
3099                 #include <sys/socket.h>
3100                 #include <linux/in.h>
3101         ], [
3102         ],[
3103                 AC_MSG_RESULT(yes)
3104                 AC_DEFINE(HAVE_LINUX_IN_H, 1, [linux/in.h])
3105         ], [
3106                 AC_MSG_RESULT(no)
3107         ])
3109         AC_CHECK_HEADERS([linux/if_packet.h])
3111         AC_MSG_CHECKING(for struct in_pktinfo)
3112         AC_TRY_COMPILE([
3113                 #ifdef HAVE_LINUX_IN_H
3114                 #include <sys/socket.h>
3115                 #include <linux/in.h>
3116                 #else
3117                 #include <netinet/in.h>
3118                 #endif
3119         ], [
3120                 struct in_pktinfo pktinfo;
3121         ],[
3122                 AC_MSG_RESULT(yes)
3123                 AC_DEFINE(HAVE_IN_PKTINFO, 1, [struct in_pktinfo])
3124         ], [
3125                 AC_MSG_RESULT(no)
3126         ])
3128         AC_MSG_CHECKING(for struct ip_mreqn)
3129         AC_TRY_COMPILE([
3130                 #if HAVE_LINUX_IN_H
3131                 #include <sys/socket.h>
3132                 #include <linux/in.h>
3133                 #else
3134                 #include <netinet/in.h>
3135                 #endif
3136         ], [
3137                 struct ip_mreqn mreqn;
3138         ],[
3139                 AC_MSG_RESULT(yes)
3140                 AC_DEFINE(HAVE_IP_MREQN, 1, struct ip_mreqn)
3141         ], [
3142                 AC_MSG_RESULT(no)
3143         ])
3145         if test x$host_darwin = xno; then
3146                 AC_CHECK_TYPES([struct flock64], [AC_DEFINE(HAVE_FLOCK64, 1, struct flock64)], , [#include <fcntl.h>])
3147         fi
3149         AC_CHECK_DECL(O_CLOEXEC,         [AC_DEFINE(HAVE_O_CLOEXEC, 1, [O_CLOEXEC])], [], [[#include <fcntl.h>]])
3150         AC_CHECK_DECL(F_DUPFD_CLOEXEC,   [AC_DEFINE(HAVE_F_DUPFD_CLOEXEC, 1, [F_DUPFD_CLOEXEC])], [], [[#include <fcntl.h>]])
3152         # AC_CHECK_FUNC(getifaddrs,           [AC_DEFINE(HAVE_GETIFADDRS, 1, [getifaddrs])]) # already done above
3154         AC_CHECK_FUNC(lseek64,           [AC_DEFINE(HAVE_LSEEK64, 1, [lseek64])])
3155         AC_CHECK_FUNC(mmap64,            [AC_DEFINE(HAVE_MMAP64, 1, [mmap64])])
3156         AC_CHECK_FUNC(ftruncate64,       [AC_DEFINE(HAVE_FTRUNCATE64, 1, [ftruncate64])])
3157         AC_CHECK_FUNC(posix_fadvise64,   [AC_DEFINE(HAVE_POSIX_FADVISE64, 1, [posix_fadvise64])])
3159         if test "x$mono_native_platform_ios" = "xno"; then
3160                 # On iOS, `stat64()` is deprecated and there is no `struct stat64` and `stat()`
3161                 # is either 32-bit or 64-bit based on the device / simulator that you're running on.
3162                 AC_CHECK_FUNC(stat64,            [AC_DEFINE(HAVE_STAT64, 1, [stat64])])
3163         fi
3165         AC_CHECK_DECL(pipe2,             [AC_DEFINE(HAVE_PIPE2, 1, [pipe2])])
3166         AC_CHECK_FUNC(getmntinfo,        [AC_DEFINE(HAVE_GETMNTINFO, 1, [getmntinfo])], [], [[#include <unistd.h>]])
3167         AC_CHECK_FUNC(strcpy_s,          [AC_DEFINE(HAVE_STRCPY_S, 1, [strcpy_s])])
3168         AC_CHECK_FUNC(strlcpy,           [AC_DEFINE(HAVE_STRLCPY, 1, [strlcpy])])
3169         AC_CHECK_FUNC(posix_fadvise,     [AC_DEFINE(HAVE_POSIX_ADVISE, 1, [posix_fadvise])]) # the define is called HAVE_POSIX_ADVISE in corefx, not a typo
3170         AC_CHECK_FUNC(ioctl,             [AC_DEFINE(HAVE_IOCTL, 1, [ioctl])])
3171         AC_CHECK_FUNC(sched_getaffinity, [AC_DEFINE(HAVE_SCHED_GETAFFINITY, 1, [sched_getaffinity])])
3172         AC_CHECK_FUNC(sched_setaffinity, [AC_DEFINE(HAVE_SCHED_SETAFFINITY, 1, [sched_setaffinity])])
3174         if test "x$platform_android" != "xyes"; then
3175                 AC_CHECK_FUNC(arc4random_buf,    [AC_DEFINE(HAVE_ARC4RANDOM_BUF, 1, [arc4random_buf])])
3176         fi
3178         AC_CHECK_DECL(TIOCGWINSZ,        [AC_DEFINE(HAVE_TIOCGWINSZ, 1, [TIOCGWINSZ])], [], [[#include <sys/ioctl.h>]])
3179         AC_CHECK_FUNC(tcgetattr,         [AC_DEFINE(HAVE_TCGETATTR, 1, [tcgetattr])])
3180         AC_CHECK_FUNC(tcsetattr,         [AC_DEFINE(HAVE_TCSETATTR, 1, [tcsetattr])])
3181         AC_CHECK_DECL(ECHO,              [AC_DEFINE(HAVE_ECHO, 1, [ECHO])], [], [[#include <termios.h>]])
3182         AC_CHECK_DECL(ICANON,            [AC_DEFINE(HAVE_ICANON, 1, [ICANON])], [], [[#include <termios.h>]])
3183         AC_CHECK_DECL(TCSANOW,           [AC_DEFINE(HAVE_TCSANOW, 1, [TCSANOW])], [], [[#include <termios.h>]])
3185         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>]])
3186         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>]])
3187         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>]])
3188         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>]])
3189         AC_CHECK_MEMBER(struct dirent.d_namlen,       [AC_DEFINE(HAVE_DIRENT_NAME_LEN, 1, [struct dirent.d_namlen])], [], [[#include <dirent.h>]])
3190         AC_CHECK_MEMBER(struct statfs.f_fstypename,   [AC_DEFINE(HAVE_STATFS_FSTYPENAME, 1, [struct statfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3191         AC_CHECK_MEMBER(struct statvfs.f_fstypename,  [AC_DEFINE(HAVE_STATVFS_FSTYPENAME, 1, [struct statvfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3193         AC_MSG_CHECKING(for struct statfs)
3194         AC_TRY_COMPILE([
3195                 #if defined(HAVE_STATFS_FSTYPENAME) || defined(HAVE_STATVFS_FSTYPENAME)
3196                 #include <sys/mount.h>
3197                 #else
3198                 #include <sys/statfs.h>
3199                 #endif
3200         ], [
3201                 struct statfs;
3202         ],[
3203                 AC_MSG_RESULT(yes)
3204                 AC_DEFINE(HAVE_STATFS, 1, [struct statfs])
3205         ], [
3206                 AC_MSG_RESULT(no)
3207         ])
3209         if test "x$ac_cv_func_strerror_r_char_p" = "xyes" ; then
3210                 AC_DEFINE(HAVE_GNU_STRERROR_R, 1, [char* strerror(int errnum, char *buf, size_t buflen)])
3211         fi
3213         AC_MSG_CHECKING(for readdir_r)
3214         AC_TRY_LINK([
3215                 #include <dirent.h>
3216         ], [
3217                 DIR* dir;
3218                 struct dirent* entry;
3219                 struct dirent* result;
3220                 readdir_r(dir, entry, &result);
3221         ],[
3222                 AC_MSG_RESULT(yes)
3223                 AC_DEFINE(HAVE_READDIR_R, 1, [readdir_r])
3224         ], [
3225                 AC_MSG_RESULT(no)
3226         ])
3228         AC_MSG_CHECKING(for kevent with void *data)
3229         AC_TRY_LINK([
3230                 #include <sys/types.h>
3231                 #include <sys/event.h>
3232         ], [
3233                 struct kevent event;
3234                 void* data;
3235                 EV_SET(&event, 0, EVFILT_READ, 0, 0, 0, data);
3236         ],[
3237                 AC_MSG_RESULT(yes)
3238                 AC_DEFINE(KEVENT_HAS_VOID_UDATA, 1, [kevent with void *data])
3239         ], [
3240                 AC_MSG_RESULT(no)
3241         ])
3243         AC_CHECK_MEMBER(struct fd_set.fds_bits,   [AC_DEFINE(HAVE_FDS_BITS, 1, [struct fd_set.fds_bits])], [], [[#include <sys/select.h>]])
3244         AC_CHECK_MEMBER(struct fd_set.__fds_bits, [AC_DEFINE(HAVE_PRIVATE_FDS_BITS, 1, [struct fd_set.__fds_bits])], [], [[#include <sys/select.h>]])
3246         AC_MSG_CHECKING(for sendfile with 4 arguments)
3247         AC_TRY_LINK([
3248                 #include <sys/sendfile.h>
3249         ], [
3250                 #if defined(TARGET_ANDROID)
3251                 #if !defined(__ANDROID_API__)
3252                 #error No definition for __ANDROID_API__ even though we're targeting TARGET_ANDROID
3253                 #elif __ANDROID_API__ < 21
3254                 #error sendfile is not supported on this Android API level
3255                 #endif
3256                 #endif
3258                 int result = sendfile(0, 0, 0, 0);
3259         ],[
3260                 AC_MSG_RESULT(yes)
3261                 AC_DEFINE(HAVE_SENDFILE_4, 1, [sendfile with 4 arguments])
3262         ], [
3263                 AC_MSG_RESULT(no)
3264         ])
3266         ORIG_CFLAGS="$CFLAGS"
3267         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
3269         AC_MSG_CHECKING(for sendfile with 6 arguments)
3270         AC_TRY_LINK([
3271                 #include <stdlib.h>
3272                 #include <sys/types.h>
3273                 #include <sys/socket.h>
3274                 #include <sys/uio.h>
3275         ], [
3276                 int result = sendfile(0, 0, 0, NULL, NULL, 0);
3277         ],[
3278                 AC_MSG_RESULT(yes)
3279                 AC_DEFINE(HAVE_SENDFILE_6, 1, [sendfile with 6 arguments])
3280         ], [
3281                 AC_MSG_RESULT(no)
3282         ])
3284         CFLAGS="$ORIG_CFLAGS"
3286         AC_CHECK_FUNC(fcopyfile,     [AC_DEFINE(HAVE_FCOPYFILE, 1, [fcopyfile])])
3287         AC_CHECK_FUNC(epoll_create1, [AC_DEFINE(HAVE_EPOLL, 1, [epoll_create1])])
3288         AC_CHECK_FUNC(accept4,       [AC_DEFINE(HAVE_ACCEPT4, 1, [accept4])])
3289         AC_CHECK_FUNC(kqueue,        [AC_DEFINE(HAVE_KQUEUE, 1, [kqueue])])
3291         ORIG_CFLAGS="$CFLAGS"
3292         CFLAGS="$CFLAGS -Werror=sign-conversion"
3294         AC_MSG_CHECKING(for getnameinfo with signed flags)
3295         AC_TRY_LINK([
3296                 #include <sys/types.h>
3297                 #include <netdb.h>
3298         ], [
3299                 const struct sockaddr *addr;
3300                 socklen_t addrlen;
3301                 char *host;
3302                 socklen_t hostlen;
3303                 char *serv;
3304                 socklen_t servlen;
3305                 int flags;
3306                 int result = getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags);
3307         ],[
3308                 AC_MSG_RESULT(yes)
3309                 AC_DEFINE(HAVE_GETNAMEINFO_SIGNED_FLAGS, 1, [getnameinfo with signed flags])
3310         ], [
3311                 AC_MSG_RESULT(no)
3312         ])
3314         CFLAGS="$ORIG_CFLAGS"
3316         if test "x$host_linux" = "xyes"; then
3317                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 1, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3318         else
3319                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 0, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3320         fi
3322         # HAVE_CLOCK_MONOTONIC check already done above
3323         # HAVE_CLOCK_REALTIME check already done above
3324         # HAVE_MACH_ABSOLUTE_TIME check already done above
3325         # HAVE_MACH_TIMEBASE_INFO check already done above
3326         # HAVE_FUTIMES check already done above
3327         # HAVE_FUTIMENS check already done above
3329         ORIG_CFLAGS="$CFLAGS"
3330         CFLAGS="$CFLAGS -Werror=sign-conversion"
3332         AC_MSG_CHECKING(for bind with unsigned addrlen)
3333         AC_TRY_LINK([
3334                 #include <sys/socket.h>
3335         ], [
3336                 int fd;
3337                 struct sockaddr* addr;
3338                 socklen_t addrLen;
3339                 bind(fd, addr, addrLen);
3340         ],[
3341                 AC_MSG_RESULT(yes)
3342                 AC_DEFINE(BIND_ADDRLEN_UNSIGNED, 1, [bind with unsigned addrlen])
3343         ], [
3344                 AC_MSG_RESULT(no)
3345         ])
3347         AC_MSG_CHECKING(for struct ipv6_mreq with unsigned ipv6mr_interface)
3348         AC_TRY_LINK([
3349                 #include <netinet/in.h>
3350                 #include <netinet/tcp.h>
3351         ], [
3352                 struct ipv6_mreq opt;
3353                 unsigned int index = 0;
3354                 opt.ipv6mr_interface = index;
3355         ],[
3356                 AC_MSG_RESULT(yes)
3357                 AC_DEFINE(IPV6MR_INTERFACE_UNSIGNED, 1, [struct ipv6_mreq with unsigned ipv6mr_interface])
3358         ], [
3359                 AC_MSG_RESULT(no)
3360         ])
3362         AC_MSG_CHECKING(for inotify_rm_watch with unsigned wd)
3363         AC_TRY_LINK([
3364                 #include <sys/inotify.h>
3365         ], [
3366                 intptr_t fd;
3367                 uint32_t wd;
3368                 int result = inotify_rm_watch(fd, wd);
3369         ],[
3370                 AC_MSG_RESULT(yes)
3371                 AC_DEFINE(INOTIFY_RM_WATCH_WD_UNSIGNED, 1, [inotify_rm_watch with unsigned wd])
3372         ], [
3373                 AC_MSG_RESULT(no)
3374         ])
3376         CFLAGS="$ORIG_CFLAGS"
3378         AC_MSG_CHECKING(for shm_open that works well enough with mmap)
3379         if test "x$ac_cv_func_shm_open" = "xno" -o "x$ac_cv_func_shm_open_working_with_mmap" = "xno" ; then
3380                 AC_MSG_RESULT(no)
3381         elif test "x$cross_compiling" = "xyes"; then
3382                 AC_MSG_RESULT(cross compiling, assuming yes)
3383                 AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3384         else
3385                 AC_TRY_RUN([
3386                         #include <sys/mman.h>
3387                         #include <fcntl.h>
3388                         #include <unistd.h>
3390                         int main ()
3391                         {
3392                                 int fd = shm_open("/mono_configure_shm_open", O_CREAT | O_RDWR, 0777);
3393                                 if (fd == -1)
3394                                         return -1;
3396                                 shm_unlink("/mono_configure_shm_open");
3398                                 // NOTE: PROT_EXEC and MAP_PRIVATE don't work well with shm_open
3399                                 //       on at least the current version of Mac OS X
3401                                 if (mmap(NULL, 1, PROT_EXEC, MAP_PRIVATE, fd, 0) == MAP_FAILED)
3402                                         return -1;
3404                                 return 0;
3405                         }
3406                 ],[
3407                         AC_MSG_RESULT(yes)
3408                         AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3409                 ], [
3410                         AC_MSG_RESULT(no)
3411                 ])
3412         fi
3414         AC_MSG_CHECKING(for getpriority with int who)
3415         AC_TRY_LINK([
3416                 #include <sys/resource.h>
3417         ], [
3418                 int which;
3419                 int who;
3420                 int result = getpriority(which, who);
3421         ],[
3422                 AC_MSG_RESULT(yes)
3423                 AC_DEFINE(PRIORITY_REQUIRES_INT_WHO, 1, [getpriority with int who])
3424         ], [
3425                 AC_MSG_RESULT(no)
3426         ])
3428         AC_MSG_CHECKING(for kevent with int parameters)
3429         AC_TRY_LINK([
3430                 #include <sys/types.h>
3431                 #include <sys/event.h>
3432         ], [
3433                 int kg;
3434                 const struct kevent* chagelist;
3435                 int nchanges;
3436                 struct kevent* eventlist;
3437                 int nevents;
3438                 const struct timespec* timeout;
3439                 int result = kevent(kg, chagelist, nchanges, eventlist, nevents, timeout);
3440         ],[
3441                 AC_MSG_RESULT(yes)
3442                 AC_DEFINE(KEVENT_REQUIRES_INT_PARAMS, 1, [kevent with int parameters])
3443         ], [
3444                 AC_MSG_RESULT(no)
3445         ])
3447         AC_CHECK_FUNCS(mkstemps)
3448         # AC_CHECK_FUNCS(mkstemp) # already done above
3450         if test "x$ac_cv_func_mkstemps" != "xyes" -a "x$ac_cv_func_mkstemp" != "xyes"; then
3451                 AC_MSG_ERROR([Cannot find mkstemps or mkstemp on this platform])
3452         fi
3454         AC_MSG_CHECKING(for tcp/var.h)
3455         AC_TRY_LINK([
3456                 #include <sys/types.h>
3457                 #include <sys/socketvar.h>
3458                 #include <netinet/ip.h>
3459                 #include <netinet/tcp.h>
3460                 #include <netinet/tcp_var.h>
3461         ], [
3462         ],[
3463                 AC_MSG_RESULT(yes)
3464                 AC_DEFINE(HAVE_TCP_VAR_H, 1, [tcp/var.h])
3465         ], [
3466                 AC_MSG_RESULT(no)
3467         ])
3469         AC_CHECK_HEADERS([sys/cdefs.h])
3471         AC_MSG_CHECKING(for TCPSTATE enum in netinet/tcp.h)
3472         AC_TRY_LINK([
3473                 #ifdef HAVE_SYS_CDEFS_H
3474                 #include <sys/cdefs.h>
3475                 #endif
3476                 #include <netinet/tcp.h>
3477         ], [
3478                 int result = TCP_ESTABLISHED;
3479         ],[
3480                 AC_MSG_RESULT(yes)
3481                 AC_DEFINE(HAVE_TCP_H_TCPSTATE_ENUM, 1, [TCPSTATE enum in netinet/tcp.h])
3482         ], [
3483                 AC_MSG_RESULT(no)
3484         ])
3486         AC_CHECK_DECL(TCPS_ESTABLISHED, [AC_DEFINE(HAVE_TCP_FSM_H, 1, [HAVE_TCP_FSM_H])], [], [[#include <netinet/tcp_fsm.h>]])
3488         AC_MSG_CHECKING(for struct rt_msghdr)
3489         AC_TRY_COMPILE([
3490                 #include <sys/types.h>
3491                 #include <net/route.h>
3492         ], [
3493                 struct rt_msghdr;
3494         ],[
3495                 AC_MSG_RESULT(yes)
3496                 AC_DEFINE(HAVE_RT_MSGHDR, 1, [struct rt_msghdr])
3497         ], [
3498                 AC_MSG_RESULT(no)
3499         ])
3501         AC_CHECK_HEADERS([sys/sysctl.h])
3502         AC_CHECK_HEADERS([linux/rtnetlink.h])
3504         AC_CHECK_FUNC(getpeereid,    [AC_DEFINE(HAVE_GETPEEREID, 1, [getpeereid])])
3505         #AC_CHECK_FUNC(getdomainname, [AC_DEFINE(HAVE_GETDOMAINNAME, 1, [getdomainname])]) # already done above
3506         AC_CHECK_FUNC(uname,         [AC_DEFINE(HAVE_UNAME, 1, [uname])])
3508         ORIG_CFLAGS="$CFLAGS"
3509         CFLAGS="$CFLAGS -Werror=shorten-64-to-32"
3511         AC_MSG_CHECKING(for getdomainname with size_t namelen)
3512         AC_TRY_LINK([
3513                 #include <unistd.h>
3514         ], [
3515                 size_t namelen = 20;
3516                 char name[20];
3517                 int result = getdomainname(name, namelen);
3518         ],[
3519                 AC_MSG_RESULT(yes)
3520                 AC_DEFINE(HAVE_GETDOMAINNAME_SIZET, 1, [getdomainname with size_t namelen])
3521         ], [
3522                 AC_MSG_RESULT(no)
3523         ])
3525         CFLAGS="$ORIG_CFLAGS"
3527         AC_CHECK_FUNC(inotify_init, [AC_DEFINE(HAVE_INOTIFY_INIT, 1, [inotify_init])])
3528         AC_CHECK_FUNC(inotify_add_watch, [AC_DEFINE(HAVE_INOTIFY_ADD_WATCH, 1, [inotify_add_watch])])
3529         AC_CHECK_FUNC(inotify_rm_watch, [AC_DEFINE(HAVE_INOTIFY_RM_WATCH, 1, [inotify_rm_watch])])
3531         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
3532                 AC_DEFINE(HAVE_INOTIFY, 1, [HAVE_INOTIFY])
3533         elif test "x$host_linux" = "xyes"; then
3534                 AC_MSG_ERROR([Cannot find inotify functions on a Linux platform.])
3535         fi
3537         # HAVE_CURLM_ADDED_ALREADY check skipped because we don't use libcurl in mono
3538         # HAVE_CURL_HTTP_VERSION_2TLS check skipped because we don't use libcurl in mono
3539         # HAVE_CURLPIPE_MULTIPLEX check skipped because we don't use libcurl in mono
3540         # HAVE_CURL_SSLVERSION_TLSv1_012 check skipped because we don't use libcurl in mono
3542         enable_gss=no;
3543         AC_MSG_CHECKING(for GSS/GSS.h)
3544         AC_TRY_COMPILE([
3545                         #include <GSS/GSS.h>
3546         ], [
3547         ],[
3548                         AC_MSG_RESULT(yes)
3549                         AC_DEFINE(HAVE_GSSFW_HEADERS, 1, [GSS/GSS.h])
3550                         AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
3551                         enable_gss=yes
3552         ], [
3553                         AC_MSG_RESULT(no)
3554         ])
3556         AC_MSG_CHECKING(for gssapi/gssapi_ext.h)
3557         AC_TRY_COMPILE([
3558                         #include <gssapi/gssapi_ext.h>
3559         ], [
3560         ],[
3561                         AC_MSG_RESULT(yes)
3562                         enable_gss=yes
3563         ], [
3564                         AC_MSG_RESULT(no)
3565         ])
3567         AC_MSG_CHECKING(for GSS_SPNEGO_MECHANISM)
3568         AC_TRY_COMPILE([
3569                         #include <gssapi/gssapi_ext.h>
3570                         #include <gssapi/gssapi_krb5.h>
3571                         gss_OID_set_desc gss_mech_spnego_OID_set_desc = {.count = 1, .elements = GSS_SPNEGO_MECHANISM};
3572         ], [
3573         ],[
3574                         AC_MSG_RESULT(yes)
3575                         AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
3576         ], [
3577                         AC_MSG_RESULT(no)
3578         ])
3580         AM_CONDITIONAL(ENABLE_GSS, test x$enable_gss = xyes)
3582         AC_CHECK_HEADERS([crt_externs.h])
3584         AC_MSG_CHECKING(for _NSGetEnviron)
3585         AC_TRY_LINK([
3586                 #include <crt_externs.h>
3587         ], [
3588                 char **result = *(_NSGetEnviron());
3589         ],[
3590                 AC_MSG_RESULT(yes)
3591                 AC_DEFINE(HAVE_NSGETENVIRON, 1, [_NSGetEnviron])
3592         ], [
3593                 AC_MSG_RESULT(no)
3594         ])
3596         AC_CHECK_DECL(IN_EXCL_UNLINK, [AC_DEFINE(HAVE_IN_EXCL_UNLINK, 1, [IN_EXCL_UNLINK])], [], [[#include <sys/inotify.h>]])
3598         # *** End of Mono.Native checks ***
3599 else
3600         AM_CONDITIONAL(ENABLE_GSS, false)
3602         dnl *********************************
3603         dnl *** Checks for Windows compilation ***
3604         dnl *********************************
3605         AC_CHECK_HEADERS(winternl.h)
3607         jdk_headers_found=no
3608         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
3609         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
3610         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
3611         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
3612         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
3613         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
3614         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
3616         dnl *********************************
3617         dnl *** Check for struct ip_mreqn ***
3618         dnl *********************************
3619         AC_MSG_CHECKING(for struct ip_mreqn)
3620         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3621                 struct ip_mreqn mreq;
3622                 mreq.imr_address.s_addr = 0;
3623         ], [
3624                 # Yes, we have it...
3625                 AC_MSG_RESULT(yes)
3626                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
3627         ], [
3628                 # We'll just have to try and use struct ip_mreq
3629                 AC_MSG_RESULT(no)
3630                 AC_MSG_CHECKING(for struct ip_mreq)
3631                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3632                         struct ip_mreq mreq;
3633                         mreq.imr_interface.s_addr = 0;
3634                 ], [
3635                         # Yes, we have it...
3636                         AC_MSG_RESULT(yes)
3637                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
3638                 ], [
3639                         # No multicast support
3640                         AC_MSG_RESULT(no)
3641                 ])
3642         ])
3644         dnl **********************************
3645         dnl *** Check for getaddrinfo ***
3646         dnl **********************************
3647         AC_MSG_CHECKING(for getaddrinfo)
3648                 AC_TRY_LINK([
3649                 #include <stdio.h>
3650                 #include <winsock2.h>
3651                 #include <ws2tcpip.h>
3652         ], [
3653                 getaddrinfo(NULL,NULL,NULL,NULL);
3654         ], [
3655                 # Yes, we have it...
3656                 AC_MSG_RESULT(yes)
3657                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
3658         ], [
3659                 AC_MSG_RESULT(no)
3660         ])
3662         dnl **********************************
3663         dnl *** Check for gethostbyname ***
3664         dnl **********************************
3665         AC_MSG_CHECKING(for gethostbyname)
3666                 AC_TRY_LINK([
3667                 #include <stdio.h>
3668                 #include <winsock2.h>
3669                 #include <ws2tcpip.h>
3670         ], [
3671                 gethostbyname(NULL);
3672         ], [
3673                 # Yes, we have it...
3674                 AC_MSG_RESULT(yes)
3675                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
3676         ], [
3677                 AC_MSG_RESULT(no)
3678         ])
3680         dnl **********************************
3681         dnl *** Check for getprotobyname ***
3682         dnl **********************************
3683         AC_MSG_CHECKING(for getprotobyname)
3684                 AC_TRY_LINK([
3685                 #include <stdio.h>
3686                 #include <winsock2.h>
3687                 #include <ws2tcpip.h>
3688         ], [
3689                 getprotobyname(NULL);
3690         ], [
3691                 # Yes, we have it...
3692                 AC_MSG_RESULT(yes)
3693                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
3694         ], [
3695                 AC_MSG_RESULT(no)
3696         ])
3698         dnl **********************************
3699         dnl *** Check for getnameinfo ***
3700         dnl **********************************
3701         AC_MSG_CHECKING(for getnameinfo)
3702                 AC_TRY_LINK([
3703                 #include <stdio.h>
3704                 #include <winsock2.h>
3705                 #include <ws2tcpip.h>
3706         ], [
3707                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
3708         ], [
3709                 # Yes, we have it...
3710                 AC_MSG_RESULT(yes)
3711                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
3712         ], [
3713                 AC_MSG_RESULT(no)
3714         ])
3716         dnl **********************************
3717         dnl *** Check for inet_ntop ***
3718         dnl **********************************
3719         AC_MSG_CHECKING(for inet_ntop)
3720                 AC_TRY_LINK([
3721                 #include <stdio.h>
3722                 #include <winsock2.h>
3723                 #include <ws2tcpip.h>
3724         ], [
3725                 inet_ntop (0, NULL, NULL, 0);
3726         ], [
3727                 # Yes, we have it...
3728                 AC_MSG_RESULT(yes)
3729                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
3730         ], [
3731                 AC_MSG_RESULT(no)
3732         ])
3734         dnl **********************************
3735         dnl *** Check for inet_pton ***
3736         dnl **********************************
3737         AC_MSG_CHECKING(for inet_pton)
3738                 AC_TRY_LINK([
3739                 #include <stdio.h>
3740                 #include <winsock2.h>
3741                 #include <ws2tcpip.h>
3742         ], [
3743                 #ifndef inet_pton
3744                 (void) inet_pton;
3745                 #endif
3746                 inet_pton (0, NULL, NULL);
3747         ], [
3748                 # Yes, we have it...
3749                 AC_MSG_RESULT(yes)
3750                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
3751         ], [
3752                 AC_MSG_RESULT(no)
3753         ])
3755         AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
3756         AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
3757         AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
3758         AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
3759         AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
3760         AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
3761         AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
3764 dnl socklen_t check
3765 AC_MSG_CHECKING(for socklen_t)
3766 AC_TRY_COMPILE([
3767 #include <sys/types.h>
3768 #include <sys/socket.h>
3770   socklen_t foo;
3772 ac_cv_c_socklen_t=yes
3773         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
3774         AC_MSG_RESULT(yes)
3776         AC_MSG_RESULT(no)
3779 AC_CHECK_FUNCS(execvp)
3781 dnl ****************************
3782 dnl *** Look for /dev/random ***
3783 dnl ****************************
3785 AC_MSG_CHECKING([if usage of random device is requested])
3786 AC_ARG_ENABLE(dev-random,
3787 [  --disable-dev-random    disable the use of the random device (enabled by default)],
3788 try_dev_random=$enableval, try_dev_random=yes)
3790 AC_MSG_RESULT($try_dev_random)
3792 case "{$build}" in
3794 dnl IBM i does not have /dev/random, use unblocking only
3796     *-*-os400*)
3797     NAME_DEV_RANDOM="/dev/urandom"
3798     ;;
3800 dnl Win32 does not have /dev/random, they have their own method...
3802     *-mingw*|*-*-cygwin*)
3803     ac_cv_have_dev_random=no
3804     ;;
3806 dnl Everywhere else, it's /dev/random
3808     *)
3809     NAME_DEV_RANDOM="/dev/random"
3810     ;;
3811 esac
3813 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
3815 dnl Now check if the device actually exists
3817 if test "x$try_dev_random" = "xyes"; then
3818     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
3819     [if test -r "$NAME_DEV_RANDOM" ; then
3820         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
3821     if test "x$ac_cv_have_dev_random" = "xyes"; then
3822         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
3823     fi
3824 else
3825     AC_MSG_CHECKING(for random device)
3826     ac_cv_have_dev_random=no
3827     AC_MSG_RESULT(has been disabled)
3830 if test "x$host_win32" = "xyes"; then
3831     AC_DEFINE(HAVE_CRYPT_RNG)
3834 if test "x$ac_cv_have_dev_random" = "xno" \
3835     && test "x$host_win32" = "xno"; then
3836     AC_MSG_WARN([[
3838 *** A system-provided entropy source was not found on this system.
3839 *** Because of this, the System.Security.Cryptography random number generator
3840 *** will throw a NotImplemented exception.
3842 *** If you are seeing this message, and you know your system DOES have an
3843 *** entropy collection in place, please report an issue on GitHub and
3844 *** provide information about the system and how to access the random device.
3846 *** Otherwise you can install either egd or prngd and set the environment
3847 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
3848 ***]])
3851 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)
3853 AC_MSG_CHECKING([if big-arrays are to be enabled])
3854 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)
3855 if test "x$enable_big_arrays" = "xyes" ; then
3856     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
3857         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
3858     else
3859         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
3860     fi
3862 AC_MSG_RESULT($enable_big_arrays)
3864 dnl **************
3865 dnl *** DTRACE ***
3866 dnl **************
3868 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
3870 if test "x$enable_dtrace" = "xyes"; then
3871    if test "x$has_dtrace" = "xno"; then
3872           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
3873    fi
3874    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
3875    if test "x$DTRACE" = "xno"; then
3876           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
3877           enable_dtrace=no
3878    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
3879           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
3880           enable_dtrace=no
3881    fi
3884 dtrace_g=no
3885 if test "x$enable_dtrace" = "xyes"; then
3886         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
3887         DTRACEFLAGS=
3888         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3889                 case "$host" in
3890                         powerpc-*-darwin*)
3891                         DTRACEFLAGS="-arch ppc64"
3892                         ;;
3893                         i*86-*-darwin*)
3894                         DTRACEFLAGS="-arch x86_64"
3895                         ;;
3896                         *)
3897                         DTRACEFLAGS=-64
3898                         ;;
3899                 esac
3900         else
3901                 case "$host" in
3902                         powerpc-*-darwin*)
3903                         DTRACEFLAGS="-arch ppc"
3904                         ;;
3905                         i*86-*-darwin*)
3906                         DTRACEFLAGS="-arch i386"
3907                         ;;
3908                         *)
3909                         DTRACEFLAGS=-32
3910                         ;;
3911                 esac
3912         fi
3913         AC_SUBST(DTRACEFLAGS)
3914         case "$host" in
3915                 *-*-solaris*)
3916                 dtrace_g=yes
3917                 ;;
3918         esac
3919         AC_CHECK_HEADERS([sys/sdt.h])
3921 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
3922 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
3924 dnl **************************
3925 dnl *** AOT cross offsets  ***
3926 dnl **************************
3928 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
3929     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
3931 dnl **************
3932 dnl ***  LLVM  ***
3933 dnl **************
3935 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
3936 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
3937 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)
3938 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
3939 AC_ARG_ENABLE(llvm-asserts,[  --enable-llvm-asserts Enable llvm asserts (option to LLVM in CMake)], enable_llvm_asserts=$enableval, enable_llvm_asserts=no)
3941 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
3943 if test "x$enable_llvm" = "xdefault"; then
3944    enable_llvm=$enable_llvm_default
3947 enable_llvm_msvc_only="no"
3948 if test "x$enable_llvm" = "xyes"; then
3949         if test "x$host_win32" = "xyes"; then
3950                 if test "x$cross_compiling" = "xno"; then
3951                         case "$target" in
3952                         x86_64*)
3953                                 AC_MSG_WARN("LLVM for host=Windows and target=Windows is only supported on x64 MSVC builds. Disabling LLVM for GCC build.")
3954                                 enable_llvm_msvc_only="yes"
3955                                 ;;
3956                         i686*)
3957                                 AC_MSG_ERROR("LLVM for host=Windows and target=Windows is only supported for x64 builds.")
3958                                 ;;
3959                         esac
3960                 fi
3961                 if test "x$enable_loadedllvm" = "xyes"; then
3962                         AC_MSG_WARN("Loadable LLVM currently not supported on Windows. Disabling feature.")
3963                         enable_loadedllvm=no
3964                 fi
3965         fi
3968 internal_llvm="no"
3969 if test "x$enable_llvm" = "xyes"; then
3970         if test "x$with_llvm" != "x"; then
3971                 EXTERNAL_LLVM_CONFIG=$with_llvm/bin/llvm-config
3972                 if test x$host_win32 = xyes; then
3973                         EXTERNAL_LLVM_CONFIG=$EXTERNAL_LLVM_CONFIG.exe
3974                 fi
3975                 if test ! -x $EXTERNAL_LLVM_CONFIG; then
3976                         AC_MSG_ERROR([LLVM executable $EXTERNAL_LLVM_CONFIG not found.])
3977                 fi
3978         else
3979                 if test x$host_win32 = xyes; then
3980                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config.exe, no)
3981                 else
3982                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config, no)
3983                 fi
3984                 if test "x$EXTERNAL_LLVM_CONFIG" = "xno"; then
3985                         internal_llvm=yes
3986                 fi
3987         fi
3989         LLVM_CODEGEN_LIBS="x86codegen"
3990         case "$target" in
3991         arm*)
3992                 LLVM_CODEGEN_LIBS="armcodegen"
3993                 ;;
3994         aarch64*)
3995                 LLVM_CODEGEN_LIBS="aarch64codegen"
3996                 ;;
3997         powerpc*)
3998                 LLVM_CODEGEN_LIBS="powerpccodegen"
3999                 ;;
4000         esac
4001         if test "x$host" != "x$target"; then
4002                 # No need for jit libs
4003                 LLVM_CODEGEN_LIBS=
4004         fi
4006         AC_SUBST(LLVM_CODEGEN_LIBS)
4007         AC_SUBST(EXTERNAL_LLVM_CONFIG)
4009         if test "x$host_win32" = "xyes" && test "x$cross_compiling" = "xno" &&  test "x$internal_llvm" = "xno"; then
4010                 EXTERNAL_LLVM_CONFIG_WIN32=$(cygpath -m $EXTERNAL_LLVM_CONFIG)
4011                 AC_SUBST(EXTERNAL_LLVM_CONFIG_WIN32)
4012         fi
4013         if test "x$enable_llvm_msvc_only" != "xyes"; then
4014                 AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
4015         else
4016                 AC_DEFINE(ENABLE_LLVM_MSVC_ONLY, 1, [Enable the LLVM back end])
4017         fi
4018 fi # ENABLE_LLVM
4020 # AC_DEFINE necessary for correct restore behavior on Linux
4021 AM_CONDITIONAL(INTERNAL_LLVM, [test "x$internal_llvm" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
4022 if test "x$internal_llvm" != "xno"; then
4023         if test "x$enable_llvm_msvc_only" != "xyes"; then
4024                 AC_DEFINE(INTERNAL_LLVM, 1, [LLVM used is being build during mono build])
4025         else
4026                 AC_DEFINE(INTERNAL_LLVM_MSVC_ONLY, 1, [LLVM used is being build during mono build])
4027         fi
4030 AM_CONDITIONAL(INTERNAL_LLVM_ASSERTS, [test "x$enable_llvm_asserts" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
4031 if test "x$enable_llvm_asserts" != "xno"; then
4032         if test "x$enable_llvm_msvc_only" != "xyes"; then
4033                 AC_DEFINE(INTERNAL_LLVM_ASSERTS, 1, [Build LLVM with assertions])
4034         else
4035                 AC_DEFINE(INTERNAL_LLVM_ASSERTS_MSVC_ONLY, 1, [Build LLVM with assertions])
4036         fi
4039 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes && test x$enable_llvm_msvc_only != xyes])
4041 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes && test x$enable_llvm_msvc_only != xyes])
4042 if test "x$enable_loadedllvm" = "xyes"; then
4043         if test "x$enable_llvm_msvc_only" != "xyes"; then
4044                 AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
4045         fi
4048 if test "x$enable_llvm" = "xyes"; then
4049         enable_llvm_runtime=yes
4052 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes && test x$enable_llvm_msvc_only != xyes])
4053 if test "x$enable_llvm_runtime" = "xyes"; then
4054         if test "x$enable_llvm_msvc_only" != "xyes"; then
4055                 AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
4056         else
4057                 AC_DEFINE(ENABLE_LLVM_RUNTIME_MSVC_ONLY, 1, [Runtime support code for llvm enabled])
4058         fi
4061 TARGET="unknown"
4062 ACCESS_UNALIGNED="yes"
4064 LIBC="libc.so.6"
4065 INTL="libc.so.6"
4066 SQLITE="libsqlite.so.0"
4067 SQLITE3="libsqlite3.so.0"
4068 X11="libX11.so"
4069 GDKX11="libgdk-x11-2.0.so.0"
4070 GTKX11="libgtk-x11-2.0.so.0"
4071 XINERAMA="libXinerama.so.1"
4073 sizeof_register="SIZEOF_VOID_P"
4075 jit_wanted=true
4076 boehm_supported=true
4077 BTLS_SUPPORTED=no
4078 BTLS_PLATFORM=
4080 case "$host" in
4081         wasm32*)
4082                 TARGET=WASM
4083                 arch_target=wasm
4084                 BTLS_SUPPORTED=no
4085                 ACCESS_UNALIGNED="no"
4086                 with_tls=pthread
4087                 target_wasm=yes
4088                 ;;
4089         mips*)
4090                 TARGET=MIPS;
4091                 arch_target=mips;
4092                 with_tls=pthread;
4093                 ACCESS_UNALIGNED="no"
4095                 AC_MSG_CHECKING(for mips n32)
4096                 AC_TRY_COMPILE([],[
4097                 #if _MIPS_SIM != _ABIN32
4098                 #error Not mips n32
4099                 #endif
4100                 ],[
4101                 AC_MSG_RESULT(yes)
4102                 sizeof_register=8
4103                 ],[
4104                 AC_MSG_RESULT(no)
4105                 ])
4106                 ;;
4107         i*86-*-*)
4108                 TARGET=X86;
4109                 arch_target=x86;
4110                 case $host_os in
4111                   solaris*)
4112                         LIBC="libc.so"
4113                         INTL="libintl.so"
4114                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
4115                                 TARGET=AMD64
4116                                 arch_target=amd64
4117                         fi
4119                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
4120                         # int astruct __attribute__ ((visibility ("hidden")));
4121                         # void foo ()
4122                         # {
4123                         #       void *p = &astruct;
4124                         # }
4125                         # gcc -fPIC --shared -o libfoo.so foo.c
4126                         # yields:
4127                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
4128                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
4129                         have_visibility_hidden=no
4130                         ;;
4131                   mingw*|cygwin*)
4132                         have_visibility_hidden=no
4133                         BTLS_SUPPORTED=no
4134                         BTLS_PLATFORM=i386
4135                         ;;
4136                   haiku*)
4137                         LIBC=libroot.so
4138                         ;;
4139                   linux*)
4140                         AOT_SUPPORTED="yes"
4141                         BTLS_SUPPORTED=yes
4142                         BTLS_PLATFORM=i386
4143                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4144                         ;;
4145                   darwin*)
4146                         AOT_SUPPORTED="yes"
4147                         BTLS_SUPPORTED=yes
4148                         BTLS_PLATFORM=i386
4149                         ;;
4150                   openbsd*|freebsd*|kfreebsd-gnu*)
4151                         AOT_SUPPORTED="yes"
4152                         BTLS_SUPPORTED=yes
4153                         BTLS_PLATFORM=i386
4154                         ;;
4155                 esac
4156                 ;;
4157         x86_64-*-* | amd64-*-*)
4158                 TARGET=AMD64;
4159                 arch_target=amd64;
4160                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
4161                         AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4162                         sizeof_register=8
4163                 fi
4164                 case $host_os in
4165                   linux*)
4166                         AOT_SUPPORTED="yes"
4167                         BTLS_SUPPORTED=yes
4168                         BTLS_PLATFORM=x86_64
4169                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4170                         ;;
4171                   darwin*)
4172                         AOT_SUPPORTED="yes"
4173                         BTLS_SUPPORTED=yes
4174                         BTLS_PLATFORM=x86_64
4175                         boehm_supported=false
4176                         ;;
4177                   openbsd*|freebsd*|kfreebsd-gnu*)
4178                         AOT_SUPPORTED="yes"
4179                         BTLS_SUPPORTED=yes
4180                         BTLS_PLATFORM=x86_64
4181                         ;;
4182                   mingw*|cygwin*)
4183                         BTLS_SUPPORTED=no
4184                         BTLS_PLATFORM=x86_64
4185                         ;;
4186                 esac
4187                 ;;
4188         sparc*-*-*)
4189                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4190                    TARGET=SPARC64
4191                 else
4192                         TARGET=SPARC
4193                 fi
4194                 arch_target=sparc;
4195                 ACCESS_UNALIGNED="no"
4196                 case $host_os in
4197                   linux*) ;;
4198                   *)
4199                         LIBC="libc.so"
4200                         INTL="libintl.so"
4201                 esac
4202                 if test x"$GCC" = xyes; then
4203                         # We don't support v8 cpus
4204                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
4205                 fi
4206                 if test x"$AR" = xfalse; then
4207                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
4208                 fi
4209                 ;;
4210         *-mingw*|*-*-cygwin*)
4211                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
4212                 have_visibility_hidden=no
4213                 INTL="intl"
4214                 case "$host" in
4215                         x86_64*mingw*)
4216                                 # Old Boehm fails to compile for x86_64-mingw.
4217                                 # It is trivial to fix, but just silently drop it.
4218                                 boehm_supported=false
4219                                 ;;
4220                 esac
4221                 ;;
4222         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
4223         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
4224         powerpc-*-freebsd* | powerpc*-*-aix* | powerpc*-*-os400* )
4225                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4226                         TARGET=POWERPC64;
4227                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
4228                         if ! (echo $CC | grep -q -- 'clang'); then
4229                                 CFLAGS="$CFLAGS -mminimal-toc"
4230                         fi
4231                 else
4232                         TARGET=POWERPC;
4233                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
4234                 fi
4235                 arch_target=ppc;
4236                 case $host_os in
4237                   aix*|os400*)
4238                         BTLS_SUPPORTED=yes
4239                         BTLS_PLATFORM=powerpc
4240                         dnl on AIX/PASE, shared libraries can be inside archives
4241                         dnl if they are, we specify them by lib.a(lib.so)
4242                         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX, so
4243                         LIBC="libc.a(shr_64.o)"
4244                         INTL="libintl.a(libintl.so.8)"
4245                         ;;
4246                   linux*)
4247                         BTLS_SUPPORTED=yes
4248                         BTLS_PLATFORM=powerpc
4249                         ;;
4250                 esac
4251                 ;;
4252         armv7k-*-darwin*)
4253                 TARGET=ARM;
4254                 TARGET_SYS=WATCHOS
4255                 arch_target=arm;
4256                 arm_fpu=VFP_HARD
4257                 ACCESS_UNALIGNED="no"
4258                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4259                 ;;
4261         arm*-darwin*)
4262                 TARGET=ARM;
4263                 arch_target=arm;
4264                 ACCESS_UNALIGNED="no"
4265                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4266                 ;;
4267         arm*-linux*)
4268                 TARGET=ARM;
4269                 arch_target=arm;
4270                 ACCESS_UNALIGNED="no"
4271                 AOT_SUPPORTED="yes"
4272                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4273                 BTLS_SUPPORTED=yes
4274                 BTLS_PLATFORM=arm
4275                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4276                 case "$target" in
4277                 arm*-linux*-gnueabi)
4278                         BTLS_PLATFORM=armsoft
4279                         ;;
4280                 esac
4281                 ;;
4282         arm*-netbsd*-eabi*)
4283                 TARGET=ARM;
4284                 arch_target=arm;
4285                 ACCESS_UNALIGNED="no"
4286                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4287                 ;;
4288         aarch64-*darwin*ilp32)
4289                 TARGET=ARM6432
4290                 arch_target=arm64
4291                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4292                 sizeof_register=8
4293                 # assuming no other target other than watchOS is using aarch64*darwin triple
4294                 TARGET_SYS=WATCHOS
4295                 ;;
4296         aarch64-*)
4297                 # https://lkml.org/lkml/2012/7/15/133
4298                 TARGET=ARM64
4299                 arch_target=arm64
4300                 boehm_supported=false
4301                 AOT_SUPPORTED="yes"
4302                 BTLS_SUPPORTED=yes
4303                 BTLS_PLATFORM=aarch64
4304                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4305                 ;;
4306         s390x-*-linux*)
4307                 TARGET=S390X;
4308                 arch_target=s390x;
4309                 ACCESS_UNALIGNED="yes"
4310                 BTLS_SUPPORTED=yes
4311                 BTLS_PLATFORM=s390x
4312                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
4313                 ;;
4314         riscv32-*)
4315                 TARGET=RISCV32
4316                 ACCESS_UNALIGNED=no
4317                 AOT_SUPPORTED=no
4318                 BTLS_SUPPORTED=yes
4319                 BTLS_PLATFORM=riscv32
4320                 arch_target=riscv32
4321                 boehm_supported=false
4322                 ;;
4323         riscv64*)
4324                 TARGET=RISCV64
4325                 ACCESS_UNALIGNED=no
4326                 AOT_SUPPORTED=no
4327                 BTLS_SUPPORTED=yes
4328                 BTLS_PLATFORM=riscv64
4329                 arch_target=riscv64
4330                 boehm_supported=false
4331                 ;;
4332 esac
4334 HOST=$TARGET
4336 if test "x$host" != "x$target"; then
4337    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
4338    enable_mcs_build=no
4339    enable_support_build=no
4340    BTLS_SUPPORTED=no
4341    # Can't use tls, since it depends on the runtime detection of tls offsets
4342    # in mono-compiler.h
4343    with_tls=pthread
4344    target_mach=no
4345    case "$target" in
4346    wasm32*)
4347                 TARGET=WASM
4348                 arch_target=wasm
4349                 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
4350                 ;;
4351    arm*-darwin*)
4352                 TARGET=ARM;
4353                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4354                 case "$target" in
4355                 armv7k-*)
4356                         arm_fpu=VFP_HARD
4357                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
4358                         ;;
4359                 esac            
4360                 ;;
4361    powerpc64-ps3-linux-gnu)
4362                 TARGET=POWERPC64
4363                 arch_target=powerpc64
4364                 AC_DEFINE(TARGET_PS3, 1, [...])
4365                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4366                 # uses this define
4367                 AC_DEFINE(__mono_ppc64__, 1, [...])
4368                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4369                 sizeof_register=8
4370                 target_byte_order=G_BIG_ENDIAN
4371                 ;;
4372    powerpc64-xbox360-linux-gnu)
4373                 TARGET=POWERPC64
4374                 arch_target=powerpc64
4375                 AC_DEFINE(TARGET_XBOX360, 1, [...])
4376                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4377                 # uses this define
4378                 sizeof_register=8
4379                 target_byte_order=G_BIG_ENDIAN
4380                 ;;
4381    arm*-linux-*)
4382                 TARGET=ARM;
4383                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4384                 ;;
4385    arm*-netbsd*-eabi*)
4386                 TARGET=ARM;
4387                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4388                 ;;
4389    i686*-linux-*)
4390                 TARGET=X86;
4391                 ;;
4392    i*86-apple-*)
4393                 TARGET=X86;
4394                 ;;
4395    x86_64*-linux-*)
4396                 TARGET=AMD64;
4397                 ;;
4398    x86_64-ps4-freebsd)
4399                 TARGET=AMD64;
4400                 AC_DEFINE(TARGET_PS4, 1, [...])
4401                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
4402                 CPPFLAGS="$CPPFLAGS"
4403                 target_win32=no
4404                 ;;
4405         aarch64*darwin*_ilp32)
4406                 TARGET=ARM6432;
4407                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4408                 AC_DEFINE(TARGET_WATCHOS, 1, [...])
4409                 ;;
4410         aarch64-*)
4411                 TARGET=ARM64
4412                 ;;
4413         riscv32*)
4414                 TARGET=RISCV32
4415                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4416                 AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4417                 arch_target=riscv32
4418                 target_mach=no
4419                 with_tls=pthread
4420                 ;;
4421         riscv64*)
4422                 TARGET=RISCV64
4423                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4424                 AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4425                 arch_target=riscv64
4426                 target_mach=no
4427                 with_tls=pthread
4428                 ;;
4429         x86_64-google-fuchsia)
4430                 TARGET=AMD64
4431                 target_win32=nop
4432                 AC_DEFINE(HOST_FUCHSIA,1,[Targeting the Fuchsia platform])
4433                 ;;
4434         *)
4435                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
4436         esac
4438         case "$target" in
4439         *-darwin*)
4440                 target_mach=yes
4441                 ;;
4442         *-linux-android*)
4443                 AC_DEFINE(TARGET_ANDROID, 1, [...])
4444                 ;;
4445         esac
4448 case "$TARGET" in
4449 WASM)
4450         AC_DEFINE(TARGET_WASM, 1, [...])
4451         arch_target=wasm
4452         ;;
4453 X86)
4454         AC_DEFINE(TARGET_X86, 1, [...])
4455         arch_target=x86
4456         ;;
4457 AMD64)
4458         AC_DEFINE(TARGET_AMD64, 1, [...])
4459         arch_target=amd64
4460         ;;
4461 ARM)
4462         AC_DEFINE(TARGET_ARM, 1, [...])
4463         arch_target=arm
4464         ACCESS_UNALIGNED="no"
4465         ;;
4466 ARM64|ARM6432)
4467         AC_DEFINE(TARGET_ARM64, 1, [...])
4468         arch_target=arm64
4469         ;;
4470 POWERPC)
4471         AC_DEFINE(TARGET_POWERPC, 1, [...])
4472         ;;
4473 POWERPC64)
4474         AC_DEFINE(TARGET_POWERPC, 1, [...])
4475         AC_DEFINE(TARGET_POWERPC64, 1, [...])
4476         ;;
4477 S390X)
4478         AC_DEFINE(TARGET_S390X, 1, [...])
4479         ;;
4480 MIPS)
4481         AC_DEFINE(TARGET_MIPS, 1, [...])
4482         ;;
4483 SPARC)
4484         AC_DEFINE(TARGET_SPARC, 1, [...])
4485         ;;
4486 SPARC64)
4487         AC_DEFINE(TARGET_SPARC64, 1, [...])
4488         ;;
4489 RISCV32)
4490         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4491         AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4492         ;;
4493 RISCV64)
4494         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4495         AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4496         ;;
4497 esac
4499 case "$TARGET" in
4500 *32* | ARM | X86 | POWERPC | MIPS | SPARC | WASM | ARM6432)
4501     target_sizeof_void_p=4
4502     ;;
4503 *64* | S390X)
4504     target_sizeof_void_p=8
4505     ;;
4507     AC_MSG_ERROR([unknown target])
4508     ;;
4509 esac
4511 case "$HOST" in
4512 WASM)
4513         AC_DEFINE(HOST_WASM, 1, [...])
4514         ;;
4515 X86)
4516         AC_DEFINE(HOST_X86, 1, [...])
4517         ;;
4518 AMD64)
4519         AC_DEFINE(HOST_AMD64, 1, [...])
4520         ;;
4521 ARM)
4522         AC_DEFINE(HOST_ARM, 1, [...])
4523         ;;
4524 ARM64)
4525         AC_DEFINE(HOST_ARM64, 1, [...])
4526         ;;
4527 POWERPC)
4528         AC_DEFINE(HOST_POWERPC, 1, [...])
4529         ;;
4530 POWERPC64)
4531         AC_DEFINE(HOST_POWERPC, 1, [...])
4532         AC_DEFINE(HOST_POWERPC64, 1, [...])
4533         ;;
4534 S390X)
4535         AC_DEFINE(HOST_S390X, 1, [...])
4536         ;;
4537 MIPS)
4538         AC_DEFINE(HOST_MIPS, 1, [...])
4539         ;;
4540 SPARC)
4541         AC_DEFINE(HOST_SPARC, 1, [...])
4542         ;;
4543 SPARC64)
4544         AC_DEFINE(HOST_SPARC64, 1, [...])
4545         ;;
4546 RISCV32)
4547         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4548         AC_DEFINE([HOST_RISCV32], [1], [Host is 32-bit RISC-V])
4549         ;;
4550 RISCV64)
4551         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4552         AC_DEFINE([HOST_RISCV64], [1], [Host is 64-bit RISC-V])
4553         ;;
4554 esac
4556 MONO_ARCH_GSHAREDVT_SUPPORTED=0
4557 case "$HOST" in
4558 X86 | AMD64 | ARM | ARM64)
4559         MONO_ARCH_GSHAREDVT_SUPPORTED=1 # keep in sync with mini-{x86,amd64,arm,arm64}.h
4560         ;;
4561 esac
4563 AM_CONDITIONAL(MONO_ARCH_GSHAREDVT_SUPPORTED, test $MONO_ARCH_GSHAREDVT_SUPPORTED = 1)
4564 AM_CONDITIONAL(TARGET_WASM, test $arch_target = wasm)
4566 dnl *************
4567 dnl *** VTUNE ***
4568 dnl *************
4570 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
4571 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
4573 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
4575 if test "x$enable_vtune" = "xyes"; then
4576         if test "x$with_vtune" = "x"; then
4577                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
4578         else
4579                 VTUNE_PATH=$with_vtune
4580         fi
4581         VTUNE_INCLUDE=$VTUNE_PATH/include
4582         case "$TARGET" in
4583         X86)
4584                 VTUNE_LIB=$VTUNE_PATH/lib32
4585                 ;;
4586         AMD64)
4587                 VTUNE_LIB=$VTUNE_PATH/lib64
4588                 ;;
4589         *)
4590                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
4591                 ;;
4592         esac
4593         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
4594                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
4595         fi
4596         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
4597                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
4598         fi
4600         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
4601         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
4603         AC_SUBST(VTUNE_LIBS)
4604         AC_SUBST(VTUNE_CFLAGS)
4606 dnl Use GCC atomic ops if they work on the target.
4607 if test x$GCC = "xyes"; then
4608         case $TARGET in
4609         X86 | AMD64 | ARM | ARM64 | ARM6432 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64 | RISCV32 | RISCV64)
4610                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
4611                 ;;
4612         esac
4615 if test "x$target_mach" = "xyes"; then
4617    if test "x$TARGET_SYS" = "xWATCHOS"; then
4618           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
4619           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4620           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4621           BTLS_SUPPORTED=no
4622    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64" -o "x$TARGET" = "xARM6432"; then
4623           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4624           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4625           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4626           BTLS_SUPPORTED=no
4627           target_ios=yes
4628    else
4629        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
4630        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
4631        #error fail this for ios
4632        #endif
4633        ], [
4634                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
4635           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
4636           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
4637           target_osx=yes
4638        ], [
4639           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4640           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4641           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4642           BTLS_SUPPORTED=no
4643                   target_ios=yes
4644        ])
4645         fi
4646    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
4649 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
4651 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
4653 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
4654    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
4655 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
4656    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
4657 else
4658    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
4661 AC_DEFINE_UNQUOTED(TARGET_SIZEOF_VOID_P,${target_sizeof_void_p},[wordsize of target])
4663 if test "x$sizeof_register" = "x4"; then
4664   AC_DEFINE(SIZEOF_REGISTER,4,[size of target machine integer registers])
4665 elif test "x$sizeof_register" = "x8"; then
4666   AC_DEFINE(SIZEOF_REGISTER,8,[size of target machine integer registers])
4667 else
4668   AC_DEFINE_UNQUOTED(SIZEOF_REGISTER,${target_sizeof_void_p},[size of target machine integer registers])
4671 if test "x$have_visibility_hidden" = "xyes"; then
4672    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
4675 if test "x$have_deprecated" = "xyes"; then
4676    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
4679 dnl 
4680 dnl Simple Generational checks (sgen)
4682 SGEN_DEFINES=
4683 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
4684 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
4685 if test x$buildsgen = xyes; then
4686    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
4687    SGEN_DEFINES="-DHAVE_SGEN_GC"
4689         conc_gc_msg=""
4690    if test x$with_sgen_default_concurrent != xno; then
4691        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
4692            conc_gc_msg=" (concurrent by default)"
4693    fi
4695    if test "x$gc_msg" = "x"; then
4696       gc_msg="sgen$conc_gc_msg"
4697    else
4698       gc_msg="sgen$conc_gc_msg and $gc_msg"
4699    fi
4701 AC_SUBST(SGEN_DEFINES)
4702 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
4704 jit_status="Building and using the JIT"
4706 libsuffix=".so"
4708 case "$host" in
4709      *-*-darwin*)
4710         libsuffix=".dylib"
4711         LIBC="libc.dylib"
4712         INTL="libintl.dylib"
4713         SQLITE="libsqlite.0.dylib"
4714         SQLITE3="libsqlite3.0.dylib"
4715         X11="libX11.dylib"
4716         GDKX11="libgdk-x11-2.0.dylib"
4717         GTKX11="libgtk-x11-2.0.dylib"
4718         ;;
4719      *-*-*netbsd*)
4720         LIBC="libc.so"
4721         INTL="libintl.so"
4722         SQLITE="libsqlite.so"
4723         SQLITE3="libsqlite3.so"
4724         ;;
4725      *-*-kfreebsd*-gnu)
4726         LIBC="libc.so.0.1"
4727         INTL="libc.so.0.1"
4728         X11="libX11.so.6"
4729         ;;
4730     *-*-*freebsd*)
4731         LIBC="libc.so.7"
4732         INTL="libintl.so"
4733         SQLITE="libsqlite.so"
4734         SQLITE3="libsqlite3.so"
4735         ;;
4736     *-*-*openbsd*)
4737         LIBC="libc.so"
4738         INTL="libintl.so"
4739         SQLITE="libsqlite.so"
4740         SQLITE3="libsqlite3.so"
4741         ;;
4742     *-*-*linux*)
4743         AC_PATH_X
4744         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
4745         AC_MSG_CHECKING(for the soname of libX11.so)
4746         for i in $x_libraries $dlsearch_path; do
4747                 for r in 4 5 6; do
4748                         if test -f $i/libX11.so.$r; then
4749                                 X11=libX11.so.$r
4750                                 AC_MSG_RESULT($X11)
4751                         fi
4752                 done
4753         done
4754         
4755         if test "x$X11" = "xlibX11.so"; then
4756                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
4757                 X11=libX11.so.6
4758         fi
4759         ;;
4760 esac
4762 AC_SUBST(libsuffix)
4764 ######################################
4765 # EGLIB CHECKS
4766 ######################################
4768 GNUC_PRETTY=
4769 GNUC_UNUSED=
4770 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
4771 if test x$GCC = xyes; then
4772    GNUC_UNUSED='__attribute__((__unused__))'
4773    GNUC_NORETURN='__attribute__((__noreturn__))'
4774    case $host_cpu in
4775      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
4776    esac
4778 AC_SUBST(GNUC_PRETTY)
4779 AC_SUBST(GNUC_UNUSED)
4780 AC_SUBST(GNUC_NORETURN)
4781 AC_SUBST(BREAKPOINT)
4783 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
4785 case $host in
4786 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
4787     PATHSEP='\\'
4788     SEARCHSEP=';'
4789     OS="WIN32"
4790     PIDTYPE='void *'
4791     ;;
4793     PATHSEP='/'
4794     SEARCHSEP=':'
4795     OS="UNIX"
4796     PIDTYPE='int'
4797     ;;
4798 esac
4800 case $host in
4801         *-*-solaris*)
4802         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
4803         ;;
4804 esac
4806 case $target in
4807 arm*-darwin*|aarch64*-*|riscv*)
4808     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
4809     ;;
4810 i*86-*-darwin*)
4811     ORDER=G_LITTLE_ENDIAN
4812     ;;
4813 *-*-haiku*)
4814     LDFLAGS="$LDFLAGS -ltextencoding"
4815     ;;
4816 *-*-openbsd*)
4817     CFLAGS="$CFLAGS -pthread"
4818     LDFLAGS="$LDFLAGS -pthread"
4819     ;;
4820 esac
4822 AC_SUBST(ORDER)
4823 AC_SUBST(PATHSEP)
4824 AC_SUBST(SEARCHSEP)
4825 AC_SUBST(OS)
4826 AC_SUBST(PIDTYPE)
4828 # Defined for all targets/platforms using classic Windows API support.
4829 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
4830 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
4832 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf)
4833 AC_CHECK_FUNCS(getrlimit)
4834 AC_CHECK_FUNCS(fork execv execve)
4835 AC_CHECK_FUNCS(waitpid)
4837 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
4839 if test x$with_overridable_allocators = xyes; then
4840         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
4841   AC_MSG_NOTICE([Overridable allocator support enabled])
4842 else
4843   AC_MSG_NOTICE([Overridable allocator support disabled])
4847 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
4848 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
4849 # removed once support for 10.6 is dropped.
4851 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
4853 if test x$target_osx = xyes; then
4854 AC_CHECK_FUNCS(getpwuid_r)
4855 elif test x$target_ios = xno; then
4856 AC_CHECK_FUNCS(strndup getpwuid_r)
4859 AC_SEARCH_LIBS(sqrtf, m)
4861 # nanosleep may not be part of libc, also search it in other libraries
4862 AC_SEARCH_LIBS(nanosleep, rt)
4864 AC_SEARCH_LIBS(dlopen, dl)
4865 old_ldflags="${LDFLAGS}"
4866 # GNU specific option, this confuses IBM ld, but do offer alternatives when possible
4867 if test $lt_cv_prog_gnu_ld = yes; then
4868         LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4869 else
4870         case $host in
4871         *-*-aix*|*-*-os400*)
4872                 ;;
4873         *)
4874                 dnl Try to use export-dynamic anyways
4875                 LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4876                 ;;
4877         esac
4879 AC_TRY_LINK(, [int i;], found_export_dynamic=yes, found_export_dynamic=no)
4880 if test $found_export_dynamic = no; then
4881         LDFLAGS="${old_ldflags}"
4884 AC_CHECK_HEADERS(getopt.h sys/select.h sys/time.h sys/wait.h pwd.h iconv.h sys/types.h sys/resource.h)
4885 dnl giconv.c will check on HAVE_ICONV_H but we need this for link time
4886 AC_CHECK_LIB(iconv, iconv_open)
4887 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
4888 AC_SUBST(HAVE_ALLOCA_H)
4890 # Get the exact type of size_t, not just its size.
4891 # This is so we can find an exact printf format among u, lu, llu, I64u.
4892 # To avoid warnings about slight mismatches.
4893 # C99 runtime "zu" dependency is being avoided here.
4895 # We have to compile as C++ because C is too lenient
4896 # and lets the wrong thing compile, with warnings.
4898 # Note: "zu" or ifdef <something> have the advantage
4899 # of producing installable "biarch" headers. i.e. one Mac header
4900 # for Mac/x86 and Mac/amd64.
4902 AC_LANG_PUSH(C++)
4904 # Check long before int because it is the overwhelming Unix answer,
4905 # across 32bit and 64bit systems -- fewer compiler invocations in autoconf.
4907 # long ahead of int also tends to produce biarch-compatible headers except Windows.
4909 AC_MSG_CHECKING(if size_t is unsigned long)
4910 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4911         #include <stddef.h>
4912         unsigned long *a = (size_t*)0;
4913 ])], [
4914         AC_MSG_RESULT(yes)
4915         AC_SUBST(GSIZE_FORMAT, '"lu"')
4916 ], [
4917         AC_MSG_RESULT(no)
4918         AC_MSG_CHECKING(if size_t is unsigned int)
4919         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4920                 #include <stddef.h>
4921                 unsigned *a = (size_t*)0;
4922         ])], [
4923                 AC_MSG_RESULT(yes)
4924                 AC_SUBST(GSIZE_FORMAT, '"u"')
4925         ], [
4926 # At this point the majority of systems have their answer,
4927 # and we descend into non-standard or new-standard territory.
4929 # Check __int64 first because I64 on some systems predates ll, enabling
4930 # new compiler/old runtime interop, and the types always have the same size.
4931                 AC_MSG_RESULT(no)
4932                 AC_MSG_CHECKING(if size_t is unsigned __int64)
4933                 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4934                         #include <stddef.h>
4935                         unsigned __int64 *a = (size_t*)0;
4936                 ])], [
4937                         AC_MSG_RESULT(yes)
4938                         AC_SUBST(GSIZE_FORMAT, '"I64u"')
4939                 ], [
4940                         AC_MSG_RESULT(no)
4941                         AC_MSG_CHECKING(if size_t is unsigned long long)
4942                         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4943                                 #include <stddef.h>
4944                                 unsigned long long *a = (size_t*)0;
4945                         ])], [
4946                                 AC_MSG_RESULT(yes)
4947                                 AC_SUBST(GSIZE_FORMAT, '"llu"')
4948                         ], [
4949                                 AC_MSG_RESULT(no)
4950                                 AC_MSG_ERROR(Unable to determine size_t among unsigned long, int, __int64, long long)
4951                         ] )
4952                 ] )
4953         ] )
4954 ] )
4956 AC_LANG_POP
4958 # If size_t/ptrdiff_t is correct, use it. Otherwise C99 [u]intptr_t.
4959 # This provides for an exact match with functions that
4960 # take size_t like malloc and pthread_attr_getstacksize, avoiding warnings.
4961 # uintptr_t is not necessarily the same.
4963 # ptrdiff_t is preferred over ssize_t as it is C89 vs. new Posix.
4964 # ssize_t looks nicer but ptrdiff_t is wrapped up as gssize anyway.
4966 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_size_t; then
4967    GSIZE="size_t"
4968    GSSIZE="ptrdiff_t"
4969 else
4970    GSIZE="uintptr_t"
4971    GSSIZE="intptr_t"
4974 AC_SUBST(GSIZE)
4975 AC_SUBST(GSSIZE)
4976 AC_SUBST(GSIZE_FORMAT)
4979 # END OF EGLIB CHECKS
4982 AC_ARG_WITH([libgdiplus],
4983         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
4984         [], [with_libgdiplus=installed])
4986 # default install location
4987 libgdiplus_install_loc=libgdiplus${libsuffix}
4988 case "$host" in
4989     *-*-*linux*)
4990     libgdiplus_install_loc=libgdiplus${libsuffix}.0
4991     ;;
4992 esac
4994 case $with_libgdiplus in
4995     no)
4996     libgdiplus_loc=
4997     ;;
4999     installed)
5000     libgdiplus_loc=
5001     if test x$cross_compiling = xno; then
5002         if test x$host_darwin = xyes; then
5003             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
5004             if test -x $a; then
5005               libgdiplus_install_loc=$a
5006               libgdiplus_loc=$a
5007             fi
5008         fi
5009     fi
5010     ;;
5012     yes|sibling)
5013     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
5014     ;;
5016     /*) # absolute path, assume it is an install location
5017     libgdiplus_loc=$with_libgdiplus
5018     libgdiplus_install_loc=$with_libgdiplus
5019     ;;
5021     *)
5022     libgdiplus_loc=`pwd`/$with_libgdiplus
5023     ;;
5024 esac
5025 AC_SUBST(libgdiplus_loc)
5026 AC_SUBST(libgdiplus_install_loc)
5028 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)
5029 if test "x$icall_symbol_map" = "xyes"; then
5030    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
5033 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
5034 if test "x$icall_export" = "xyes"; then
5035    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
5038 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
5039 if test "x$icall_tables" = "xno"; then
5040    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
5043 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
5045 if test "x$with_tls" = "x__thread"; then
5046         AC_DEFINE(MONO_KEYWORD_THREAD, __thread, [Have __thread keyword])
5047         # Pass the information to libgc
5048         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
5049         AC_MSG_CHECKING(if the tls_model attribute is supported)
5050         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
5051                 ], [
5052                         AC_MSG_RESULT(yes)
5053                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
5054                 ], [
5055                         AC_MSG_RESULT(no)
5056         ])
5059 if test ${TARGET} = ARM; then
5060         dnl ******************************************
5061         dnl *** Check to see what FPU is available ***
5062         dnl ******************************************
5063         AC_MSG_CHECKING(which FPU to use)
5065         #
5066         # This is a bit tricky:
5067         #
5068         # if (__ARM_PCS_VFP) {
5069         #       /* mfloat-abi=hard == VFP with hard ABI */
5070         # } elif (!__SOFTFP__) {
5071         #       /* mfloat-abi=softfp == VFP with soft ABI */
5072         # } else {
5073         #       /* mfloat-abi=soft == no VFP */
5074         # }
5075         #
5076         # The exception is iOS (w/ GCC) where none of the above
5077         # are defined (but iOS always uses the 'softfp' ABI).
5078         #
5079         # No support for FPA.
5080         #
5082         fpu=NONE
5084         # iOS GCC always uses the 'softfp' ABI.
5085         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
5086                 fpu=VFP
5087         fi
5089         # Are we using the 'hard' ABI?
5090         if test x$fpu = xNONE; then
5091                 AC_TRY_COMPILE([], [
5092                         #ifndef __ARM_PCS_VFP
5093                         #error "Float ABI is not 'hard'"
5094                         #endif
5095                 ], [
5096                         fpu=VFP_HARD
5097                 ], [
5098                         fpu=NONE
5099                 ])
5100         fi
5102         # No 'hard' ABI. 'soft' or 'softfp'?
5103         if test x$fpu = xNONE; then
5104                 AC_TRY_COMPILE([], [
5105                         #ifdef __SOFTFP__
5106                         #error "Float ABI is not 'softfp'"
5107                         #endif
5108                 ], [
5109                         fpu=VFP
5110                 ], [
5111                         fpu=NONE
5112                 ])
5113         fi
5115         if test x$arm_fpu != x; then
5116            fpu=$arm_fpu
5117         fi
5119         AC_MSG_RESULT($fpu)
5120         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
5121         unset fpu
5123         dnl *********************************************
5124         dnl *** Check which ARM version(s) we can use ***
5125         dnl *********************************************
5126         AC_MSG_CHECKING(which ARM version to use)
5128         AC_TRY_COMPILE([], [
5129                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
5130                 #error Not on ARM v5.
5131                 #endif
5132         ], [
5133                 arm_v5=yes
5135                 arm_ver=ARMv5
5136         ], [])
5138         AC_TRY_COMPILE([], [
5139                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
5140                 #error Not on ARM v6.
5141                 #endif
5142         ], [
5143                 arm_v5=yes
5144                 arm_v6=yes
5146                 arm_ver=ARMv6
5147         ], [])
5149         AC_TRY_COMPILE([], [
5150                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
5151                 #error Not on ARM v7.
5152                 #endif
5153         ], [
5154                 arm_v5=yes
5155                 arm_v6=yes
5156                 arm_v7=yes
5158                 arm_ver=ARMv7
5159         ], [])
5161         AC_MSG_RESULT($arm_ver)
5163         if test x$arm_v5 = xyes; then
5164                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
5165                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
5166         fi
5168         if test x$arm_v6 = xyes; then
5169                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
5170                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
5171         fi
5173         if test x$arm_v7 = xyes; then
5174                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
5175                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
5176         fi
5179 if test ${TARGET} = RISCV32 -o ${TARGET} = RISCV64; then
5180         AC_ARG_WITH([riscv-fpabi], [  --with-riscv-fpabi=auto,double,soft   Select RISC-V floating point ABI (auto)], [fpabi=$withval], [fpabi=double])
5182         AC_MSG_CHECKING([which RISC-V floating point ABI to use])
5184         if test x$fpabi = xauto; then
5185                 AC_TRY_COMPILE([], [
5186                         #ifdef __riscv_float_abi_double
5187                         #error "double"
5188                         #endif
5189                 ], [
5190                         fpabi=auto
5191                 ], [
5192                         fpabi=double
5193                 ])
5194         fi
5196         if test x$fpabi = xauto; then
5197                 AC_TRY_COMPILE([], [
5198                         #ifdef __riscv_float_abi_single
5199                         #error "single"
5200                         #endif
5201                 ], [
5202                         fpabi=auto
5203                 ], [
5204                         fpabi=single
5205                 ])
5206         fi
5208         if test x$fpabi = xauto; then
5209                 AC_TRY_COMPILE([], [
5210                         #ifdef __riscv_float_abi_soft
5211                         #error "soft"
5212                         #endif
5213                 ], [
5214                         fpabi=auto
5215                 ], [
5216                         fpabi=soft
5217                 ])
5218         fi
5220         case $fpabi in
5221         double)
5222                 AC_DEFINE([RISCV_FPABI_DOUBLE], [1], [RISC-V FPABI is double-precision])
5223                 AC_MSG_RESULT([double-precision])
5224                 ;;
5225         single)
5226                 AC_DEFINE([RISCV_FPABI_SINGLE], [1], [RISC-V FPABI is single-precision])
5227                 AC_MSG_ERROR([single-precision, not supported])
5228                 ;;
5229         soft)
5230                 AC_DEFINE([RISCV_FPABI_SOFT], [1], [RISC-V FPABI is soft float])
5231                 AC_MSG_RESULT([soft float])
5232                 ;;
5233         auto)
5234                 AC_MSG_ERROR([unknown])
5235                 ;;
5236         *)
5237                 AC_MSG_ERROR([invalid option: $fpabi])
5238                 ;;
5239         esac
5242 if test ${TARGET} = unknown; then
5243         CPPFLAGS="$CPPFLAGS -DNO_PORT"
5244         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
5247 if test "x$platform_android" = "xyes"; then
5248         case "x${TARGET}" in
5249         xARM)
5250                 case "x$arm_ver" in
5251                 xARMv5)
5252                         BTLS_SUPPORTED=yes
5253                         BTLS_PLATFORM=android-armv5
5254                         ;;
5255                 xARMv6)
5256                         BTLS_SUPPORTED=yes
5257                         BTLS_PLATFORM=android-armv6
5258                         ;;
5259                 xARMv7)
5260                         BTLS_SUPPORTED=yes
5261                         BTLS_PLATFORM=android-armv7
5262                         ;;
5263                 *)
5264                         BTLS_SUPPORTED=no
5265                         ;;
5266                 esac
5267                 ;;
5268         xARM64)
5269                 BTLS_SUPPORTED=yes
5270                 BTLS_PLATFORM=android-v8a
5271                 ;;
5272         xX86)
5273                 BTLS_SUPPORTED=yes
5274                 BTLS_PLATFORM=android-x86
5275                 ;;
5276         xAMD64)
5277                 BTLS_SUPPORTED=yes
5278                 BTLS_PLATFORM=android-x64
5279                 ;;
5280         *)
5281                 BTLS_SUPPORTED=no
5282                 ;;
5283         esac
5286 if test ${ACCESS_UNALIGNED} = no; then
5287         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
5290 if test x$host_darwin = xyes; then
5291         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
5292         AS_IF(
5293                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
5294                 [AC_MSG_RESULT([no])],
5295                 [
5296                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
5297                         AR_FLAGS="Scru"
5298                         RANLIB="$RANLIB -no_warning_for_no_symbols"
5299                         AC_MSG_RESULT([yes])
5300                 ]
5301         )
5304 case "x$libgc" in
5305         xincluded)
5306                 # Pass CPPFLAGS to libgc configure
5307                 # We should use a separate variable for this to avoid passing useless and
5308                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
5309                 # This should be executed late so we pick up the final version of CPPFLAGS
5310                 # The problem with this approach, is that during a reconfigure, the main
5311                 # configure scripts gets invoked with these arguments, so we use separate
5312                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
5313                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
5314                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
5315                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
5316                 fi
5317                 # Don't pass -finstrument-for-thread-suspension in, 
5318                 # if these are instrumented it will be very bad news 
5319                 # (infinite recursion, undefined parking behavior, etc)
5320                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
5321                 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\""
5322                 if test "x$support_boehm" = "xyes"; then
5323                         AC_CONFIG_SUBDIRS(libgc)
5324                 fi
5325                 ;;
5326 esac
5328 MALLOC_MEMPOOLS=no
5329 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
5330         if test x$with_malloc_mempools = xyes; then
5331                 MALLOC_MEMPOOLS=yes
5332                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
5333         fi
5337 DISABLE_MCS_DOCS=default
5338 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
5339         if test x$with_mcs_docs != xyes; then
5340                 DISABLE_MCS_DOCS=yes
5341         fi
5343 if test -n "$INSTALL_4_x_TRUE"; then :
5344         DISABLE_MCS_DOCS=yes
5346 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
5347    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
5350 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)],[
5351         if test x$with_lazy_gc_thread_creation != xno ; then
5352                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
5353         fi
5354 ], [with_lazy_gc_thread_creation=no])
5356 dnl *****************************
5357 dnl *** Thread suspend policy ***
5358 dnl *****************************
5360 dnl Set a default hybrid or cooperative suspend on some platforms
5362 dnl Coop default is set by the bitcode preset.
5364 dnl If coop isn't on by default, maybe hybrid should be?
5365 if test x$enable_cooperative_suspend_default != xyes; then
5366         case $HOST in
5367         X86 | AMD64)
5368                 dnl Some host/target confusion, there's no host_osx (and
5369                 dnl host_darwin would be true on iOS not just macOS).
5370                 if test x$target_osx = xyes; then
5371                         enable_hybrid_suspend_default=yes
5372                 elif test x$host_linux = xyes -o x$host_win32 = xyes; then
5373                         enable_hybrid_suspend_default=yes
5374                 fi
5375                 ;;
5376         esac
5379 dnl Now check if there were flags overriding the defaults
5381 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])
5382 AC_ARG_ENABLE(cooperative_suspend, [  --enable-cooperative-suspend      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [], [enable_cooperative_suspend=default])
5384 if test x$enable_cooperative_suspend = xdefault -a x$with_cooperative_gc != xdefault; then
5385         enable_cooperative_suspend=$with_cooperative_gc
5388 if test x$enable_cooperative_suspend = xdefault; then
5389         enable_cooperative_suspend=$enable_cooperative_suspend_default
5392 if test x$enable_cooperative_suspend != xno; then
5393         AC_DEFINE(ENABLE_COOP_SUSPEND,1,[Enable cooperative stop-the-world garbage collection.])
5396 AM_CONDITIONAL([ENABLE_COOP_SUSPEND], [test x$enable_cooperative_suspend != xno])
5398 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])
5400 if test x$enable_hybrid_suspend = xdefault; then
5401    enable_hybrid_suspend=$enable_hybrid_suspend_default
5404 if test x$enable_hybrid_suspend != xno -a x$enable_cooperative_suspend != xno ; then
5405         AC_MSG_ERROR([Hybrid suspend and Cooperative suspend cannot be both enabled.])
5408 if test x$enable_hybrid_suspend != xno ; then
5409         AC_DEFINE(ENABLE_HYBRID_SUSPEND,1,[Enable hybrid suspend for GC stop-the-world])
5412 AM_CONDITIONAL([ENABLE_HYBRID_SUSPEND], [test x$enable_hybrid_suspend != xno])
5414 dnl End of thread suspend policy
5416 dnl ***************************
5417 dnl *** feature experiments ***
5418 dnl ***************************
5420 dnl When adding experiments, also add to mono/utils/mono-experiments.def
5421 AC_ARG_ENABLE(experiment, [ --enable-experiment=LIST       Enable experimental fatures from the comma-separate LIST.  Available experiments: null],[
5423         if test x$enable_experiment != x ; then
5424                 AC_DEFINE(ENABLE_EXPERIMENTS,1,[Enable feature experiments])
5425         fi
5426         for feature in `echo "$enable_experiment" | sed -e "s/,/ /g"`; do
5427                 eval "mono_experiment_test_enable_$feature='yes'"
5428         done
5430         if test "x$mono_experiment_test_enable_all" = "xyes"; then
5431                 eval "mono_experiment_test_enable_null='yes'"
5432                 true
5433         fi
5435         if test "x$mono_experiment_test_enable_null" = "xyes"; then
5436                 AC_DEFINE(ENABLE_EXPERIMENT_null, 1, [Enable experiment 'null'])
5437         fi
5438 ],[])
5440 dnl **********************
5441 dnl *** checked builds ***
5442 dnl **********************
5444 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, crash_reporting],[
5446         if test x$enable_checked_build != x ; then
5447                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
5448         fi
5449         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
5450                 eval "mono_checked_build_test_enable_$feature='yes'"
5451         done
5453         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
5454                 eval "mono_checked_build_test_enable_gc='yes'"
5455                 eval "mono_checked_build_test_enable_metadata='yes'"
5456                 eval "mono_checked_build_test_enable_thread='yes'"
5457                 eval "mono_checked_build_test_enable_private_types='yes'"
5458                 eval "mono_checked_build_test_enable_crash_reporting='yes'"
5459         fi
5461         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
5462                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
5463         fi
5465         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
5466                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
5467         fi
5469         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
5470                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
5471         fi
5473         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
5474                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
5475         fi
5477         if test "x$mono_checked_build_test_enable_crash_reporting" = "xyes"; then
5478                 # Required
5479                 with_overridable_allocators=yes
5480                 AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
5482                 AC_DEFINE(ENABLE_CHECKED_BUILD_CRASH_REPORTING, 1, [Enable private types checked build])
5483         fi
5484 ], [])
5486 dnl End of checked builds
5488 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
5490 AC_CHECK_HEADER([malloc.h], 
5491                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
5492                         [Define to 1 if you have /usr/include/malloc.h.])],,)
5494 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
5495 # instead of libmono-static.a
5496 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
5497    LIBMONO_LA=libmini-static.la
5498 else
5499    if test x$buildsgen = xyes; then
5500       LIBMONO_LA=libmonosgen-$API_VER.la
5501    else
5502       LIBMONO_LA=libmonoboehm-$API_VER.la
5503    fi
5505 AC_SUBST(LIBMONO_LA)
5507 dnl **************
5508 dnl ***  Btls  ***
5509 dnl **************
5511 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
5512 AC_ARG_ENABLE(btls-lib, [  --disable-btls-lib             Disable building the BTLS native library], enable_btls_lib=$enableval, enable_btls_lib=$BTLS_SUPPORTED)
5513 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
5514 AC_ARG_WITH(btls_android_api, [  --with-btls-android-api        Android NDK API level for BTLS build])
5515 AC_ARG_WITH(btls_android_cmake_toolchain, [  --with-btls-android-cmake-toolchain        Path to the cmake toolchain file for Android])
5516 AC_ARG_WITH(btls_android_ndk_asm_workaround, [  --with-btls-android-ndk-asm-workaround        Work around a problem with NDK r18+ clang compiler when compiling some AES assembly for ARM])
5518 if test "x$with_btls_android_api" = "x" ; then
5519         case "$BTLS_PLATFORM" in
5520                 android-armv5)
5521                         with_btls_android_api=16" ;;
5522                 android-armv6)
5523                         with_btls_android_api=16" ;;
5524                 android-armv7)
5525                         with_btls_android_api=16 ;;
5526                 android-v8a)
5527                         with_btls_android_api=21 ;;
5528                 android-x86)
5529                         with_btls_android_api=16 ;;
5530                 android-x64)
5531                         with_btls_android_api=21 ;;
5532         esac
5535 if test "x$enable_btls" = "xno"; then
5536    enable_btls_lib=no
5539 AM_CONDITIONAL(BTLS, test x$enable_btls_lib = xyes)
5541 btls_android=no
5542 if test "x$enable_btls" = "xyes"; then
5543         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
5544         if test "x$CMAKE" = "xno"; then
5545                 AC_MSG_ERROR("cmake not found")
5546         fi
5548         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
5549         AC_SUBST(BTLS_ROOT)
5551         btls_arch=
5552         btls_cflags=
5553         BTLS_CMAKE_ARGS=
5555         if test "x$host_win32" = "xyes"; then
5556                 AC_CHECK_PROG(HAVE_YASM, yasm, yes, no)
5557         fi
5559         case "$BTLS_PLATFORM" in
5560         i386)
5561                 btls_arch=i386
5562                 btls_cflags="-m32"
5563                 case $host_os in
5564                         darwin*)
5565                                 btls_cflags="$btls_cflags -arch i386"
5566                                 ;;
5567                         mingw*|cygwin*)
5568                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5569                                 if test "x$HAVE_YASM" != "xyes"; then
5570                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5571                                 fi
5572                                 ;;
5573                 esac
5574                 ;;
5575         x86_64)
5576                 btls_arch=x86_64
5577                 case $host_os in
5578                         mingw*|cygwin*)
5579                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5580                                 if test "x$HAVE_YASM" != "xyes"; then
5581                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5582                                 fi
5583                                 ;;
5584                 esac
5585                 ;;
5586         arm)
5587                 btls_arch=arm
5588                 btls_cflags="-DOPENSSL_NO_ASM=1"
5589                 ;;
5590         armsoft)
5591                 btls_arch=arm
5592                 btls_cflags="-DOPENSSL_NO_ASM=1"
5593                 ;;
5594         aarch64)
5595                 btls_arch=aarch64
5596                 btls_cflags="-march=armv8-a+crypto"
5597                 ;;
5598         s390x)
5599                 btls_arch=s390x
5600                 ;;
5601         powerpc)
5602                 btls_arch=powerpc
5603                 case $host_os in
5604                         aix*|os400*)
5605                                 btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
5606                                 BTLS_CMAKE_ARGS="-DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
5607                 esac
5608                 ;;
5609         android-armv5)
5610                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5611                 ;;
5612         android-armv6)
5613                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5614                 ;;
5615         android-armv7)
5616                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5617                 ;;
5618         android-v8a)
5619                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5620                 ;;
5621         android-x86)
5622                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5623                 ;;
5624         android-x64)
5625                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5626                 ;;
5627         riscv32)
5628                 btls_arch=riscv32
5629                 ;;
5630         riscv64)
5631                 btls_arch=riscv64
5632                 ;;
5633         *)
5634                 AC_MSG_ERROR(Invalid BTLS platform)
5635         esac
5637         if test "x$platform_android" = "xyes"; then
5638                 if test "x$with_btls_android_cmake_toolchain" = "x"; then
5639                    with_btls_android_cmake_toolchain="$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
5640                 fi
5642                 if test "x$with_btls_android_ndk_asm_workaround" != "x"; then
5643                    BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DENABLE_NDK_ARM_WORKAROUND=ON"
5644                 fi
5646                 btls_android=yes
5647                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$with_btls_android_cmake_toolchain"
5648                 if test "x$with_btls_android_ndk" != "x"; then
5649                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
5650                 else
5651                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
5652                 fi
5653         fi
5655         if test "x$btls_arch" != "x"; then
5656                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
5657         fi
5659         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
5660         AC_SUBST(BTLS_ARCH)
5661         AC_SUBST(BTLS_CFLAGS)
5662         AC_SUBST(BTLS_PLATFORM)
5663         AC_SUBST(BTLS_CMAKE_ARGS)
5665         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
5666 else
5667         enable_btls=no
5670 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
5672 if test x$DISABLE_MCS_DOCS = xyes; then
5673    docs_dir=""
5674 else
5675    docs_dir=docs
5677 AC_SUBST(docs_dir)
5679 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
5680 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
5681 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
5683 libmono_ldflags="$libmono_ldflags $LIBS"
5685 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
5686 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
5687 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
5688 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
5689 AM_CONDITIONAL(X86, test x$TARGET = xX86)
5690 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
5691 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
5692 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
5693 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
5694 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
5695 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64 -o x$TARGET = xARM6432)
5696 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
5697 AM_CONDITIONAL([RISCV], [test x$TARGET = xRISCV32 -o x$TARGET = xRISCV64])
5698 AM_CONDITIONAL([RISCV32], [test x$TARGET = xRISCV32])
5699 AM_CONDITIONAL([RISCV64], [test x$TARGET = xRISCV64])
5700 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
5701 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
5702 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
5703 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
5704 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
5705 AM_CONDITIONAL([HOST_RISCV], [test x$HOST = xRISCV32 -o x$HOST = xRISCV64])
5706 AM_CONDITIONAL([HOST_RISCV32], [test x$HOST = xRISCV32])
5707 AM_CONDITIONAL([HOST_RISCV64], [test x$HOST = xRISCV64])
5708 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
5710 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
5712 AC_SUBST(LIBC)
5713 AC_SUBST(INTL)
5714 AC_SUBST(SQLITE)
5715 AC_SUBST(SQLITE3)
5716 AC_SUBST(X11)
5717 AC_SUBST(GDKX11)
5718 AC_SUBST(GTKX11)
5719 AC_SUBST(XINERAMA)
5720 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
5721 AC_SUBST(arch_target)
5723 #This must always be defined when building the runtime
5724 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
5726 mono_build_root=`pwd`
5727 AC_SUBST(mono_build_root)
5729 AC_ARG_ENABLE(msvc,[  --enable-msvc    Build with Visual Studio (msvc) (defaults to no)], enable_msvc=$enableval, enable_msvc=no)
5730 if test x$host_win32 = xno; then
5731         if test x$enable_msvc = xyes; then
5732                 echo "Error, --enable-msvc only supported for Windows builds."
5733                 exit 1
5734         fi
5736 AM_CONDITIONAL(ENABLE_MSVC, test x$enable_msvc = xyes)
5738 if test "x$enable_msvc" = "xyes"; then
5739         if test "x$support_boehm" = "xyes"; then
5740                 echo "Error, Boehm GC is not supported when using --enable-msvc."
5741                 exit 1
5742         fi
5743         mono_msvc_build_dir='$(top_srcdir)'/msvc/build/sgen
5744         if test "x$host_cpu" = "xi686"; then
5745                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/Win32/lib/Release
5746                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/Win32/bin/Release
5747                 mono_runtime=msvc/build/sgen/Win32/bin/Release/mono-sgen.exe
5748                 mono_runtime_wrapper=$mono_runtime
5749         else
5750                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/x64/lib/Release
5751                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/x64/bin/Release
5752                 mono_runtime=msvc/build/sgen/x64/bin/Release/mono-sgen.exe
5753                 mono_runtime_wrapper=msvc/build/sgen/x64/bin/Release/mono-sgen-msvc.sh
5754         fi
5755         AC_SUBST(mono_msvc_build_dir)
5756         AC_SUBST(mono_msvc_build_lib_dir)
5757         AC_SUBST(mono_msvc_build_bin_dir)
5758 else
5759         mono_runtime=mono/mini/mono
5760         mono_runtime_wrapper=$mono_runtime
5763 AC_SUBST(mono_runtime)
5764 AC_SUBST(mono_runtime_wrapper)
5766 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/Microsoft.Net.Compilers.2.8.2/tools/csc.exe
5768 if test $csc_compiler = mcs; then
5769   CSC=$mcs_topdir/class/lib/build/mcs.exe
5770 else
5771   CSC=$CSC_LOCATION
5774 AM_CONDITIONAL([CSC_IS_ROSLYN], [test x$csc_compiler != xmcs])
5776 mono_cfg_root=$mono_build_root/runtime
5777 if test x$host_win32 = xyes; then
5778   if test "x$cross_compiling" = "xno"; then
5779     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
5780     CSC=`cygpath -m -a $CSC`
5781     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
5782   else
5783     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
5784   fi
5785 else
5786   mono_cfg_dir=$mono_cfg_root/etc
5789 if test "x$platform_android" = "xyes"; then
5790   mono_cfg_dir=
5793 AC_SUBST(mono_cfg_dir)
5795 AC_SUBST(CSC)
5797 AC_CONFIG_FILES([po/mcs/Makefile.in])
5799 AC_CONFIG_FILES([acceptance-tests/microbench-perf.sh],[chmod +x acceptance-tests/microbench-perf.sh])
5800 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
5801 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
5803 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
5804 [   depth=../../../..
5805     case $srcdir in
5806     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5807     .) reldir=$depth ;;
5808     *) reldir=$depth/$srcdir ;;
5809     esac
5810     $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
5811     cd runtime/etc/mono/1.0
5812     rm -f machine.config
5813     $LN_S $reldir/data/net_1_1/machine.config machine.config
5814     cd $depth
5815 ],[LN_S='$LN_S'])
5817 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
5818 [   depth=../../../..
5819     case $srcdir in
5820     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5821     .) reldir=$depth ;;
5822     *) reldir=$depth/$srcdir ;;
5823     esac
5824     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5825     cd runtime/etc/mono/2.0
5826     rm -f machine.config
5827     $LN_S $reldir/data/net_2_0/machine.config machine.config
5828     cd $depth
5829 ],[LN_S='$LN_S'])
5831 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
5832 [   depth=../../../..
5833     case $srcdir in
5834     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5835     .) reldir=$depth ;;
5836     *) reldir=$depth/$srcdir ;;
5837     esac
5838     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5839     cd runtime/etc/mono/2.0
5840     rm -f web.config
5841     $LN_S $reldir/data/net_2_0/web.config web.config
5842     cd $depth
5843 ],[LN_S='$LN_S'])
5845 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
5846 [   depth=../../..
5847     case $srcdir in
5848     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5849     .) reldir=$depth ;;
5850     *) reldir=$depth/$srcdir ;;
5851     esac
5852     $ac_aux_dir/install-sh -d runtime/etc/mono/
5853     cd runtime/etc/mono/
5854     rm -f browscap.ini
5855     $LN_S $reldir/data/browscap.ini browscap.ini
5856     cd $depth
5857 ],[LN_S='$LN_S'])
5859 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
5860 [   depth=../../../../..
5861     case $srcdir in
5862     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5863     .) reldir=$depth ;;
5864     *) reldir=$depth/$srcdir ;;
5865     esac
5866     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
5867     cd runtime/etc/mono/2.0/Browsers
5868     rm -f Compat.browser
5869     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5870     cd $depth
5871 ],[LN_S='$LN_S'])
5873 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
5874 [   depth=../../../../..
5875     case $srcdir in
5876     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5877     .) reldir=$depth ;;
5878     *) reldir=$depth/$srcdir ;;
5879     esac
5880     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
5881     cd runtime/etc/mono/4.0/Browsers
5882     rm -f Compat.browser
5883     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5884     cd $depth
5885 ],[LN_S='$LN_S'])
5887 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
5888 [   depth=../../../../..
5889     case $srcdir in
5890     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5891     .) reldir=$depth ;;
5892     *) reldir=$depth/$srcdir ;;
5893     esac
5894     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
5895     cd runtime/etc/mono/4.5/Browsers
5896     rm -f Compat.browser
5897     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5898     cd $depth
5899 ],[LN_S='$LN_S'])
5901 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
5902 [   depth=../../../..
5903     case $srcdir in
5904     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5905     .) reldir=$depth ;;
5906     *) reldir=$depth/$srcdir ;;
5907     esac
5908     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5909     cd runtime/etc/mono/4.0
5910     rm -f machine.config
5911     $LN_S $reldir/data/net_4_0/machine.config machine.config
5912     cd $depth
5913 ],[LN_S='$LN_S'])
5915 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
5916 [   depth=../../../..
5917     case $srcdir in
5918     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5919     .) reldir=$depth ;;
5920     *) reldir=$depth/$srcdir ;;
5921     esac
5922     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5923     cd runtime/etc/mono/4.0
5924     rm -f web.config
5925     $LN_S $reldir/data/net_4_0/web.config web.config
5926     cd $depth
5927 ],[LN_S='$LN_S'])
5929 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
5930 [   depth=../../../..
5931     case $srcdir in
5932     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5933     .) reldir=$depth ;;
5934     *) reldir=$depth/$srcdir ;;
5935     esac
5936     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5937     cd runtime/etc/mono/4.5
5938     rm -f machine.config
5939     $LN_S $reldir/data/net_4_5/machine.config machine.config
5940     cd $depth
5941 ],[LN_S='$LN_S'])
5943 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
5944 [   depth=../../../..
5945     case $srcdir in
5946     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5947     .) reldir=$depth ;;
5948     *) reldir=$depth/$srcdir ;;
5949     esac
5950     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5951     cd runtime/etc/mono/4.5
5952     rm -f web.config
5953     $LN_S $reldir/data/net_4_5/web.config web.config
5954     cd $depth
5955 ],[LN_S='$LN_S'])
5957 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])
5958 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])
5959 AC_CONFIG_COMMANDS([clean-llvm], [rm -f llvm/llvm_config.mk])
5962 # Mono.Native Support
5963 # -------------------
5964 # Mono.Native is the new name for both System.Native and System.Security.Cryptography.Apple.
5965 # It is built as a stand-alone shared library and not bundled with the runtime because we
5966 # may need to build two different versions of it.
5968 # Starting with macOS 10.12+ and iOS 10+, Apple introduced a new Unified API for some of the
5969 # crypto primitives that we're using as part of System.Security.Cryptography.Apple.
5971 # On Desktop, we can check at runtime whether the OS version is recent enough and switch
5972 # implementation accordingly.  We build a single `libmono-native` shared library.
5974 # However, on Mobile we cannot have any undefined symbols as this would break Bitcode.
5976 # During the mobile build, we are called with `CFLAGS` containing an explicit minium version flag,
5977 # which is eiter `-mmacosx-version-min=`, `-mios-simulator-version-min=` or `-miphoneos-version-min=`
5978 # depending on platform.
5980 # We build two versions of the shared library:
5981 # - `libmono-native-compat` is built with whichever minimum version is passed to us via `CFLAGS`.
5982 # - `libmono-native-unifed` is built with the minimum version set to macOS 10.12+ / iOS 10+.
5984 # For testing purpuses, there is a function called `mono_native_get_platform_type ()`
5985 # (see mono/native/mono-native-platform.c), which returns a `MonoNativePlatformType` enum value.
5986 # There is also `Mono.MonoNativePlatform.GetPlatformType ()` (see mcs/class/corlib/Test/Mono/MonoNativePlatform.cs).
5988 # This can be called by automated tests both to ensure that the library has been correctly installed and also
5989 # to verify that it's the correct version of it.
5992 AC_MSG_CHECKING([Mono.Native support])
5993 sed_version_pattern='[[0-9]]\{1,2\}\(\.[[0-9]]\{1,2\}\)'
5994 if test x$disable_mono_native = xyes; then
5995         mono_native=no
5996 elif test x$target_osx = xyes; then
5997         MONO_NATIVE_CC=$CC
5998         MONO_NATIVE_CXX=$CXX
5999         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6000         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6001         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6002         MONO_NATIVE_CFLAGS=$CFLAGS
6003         MONO_NATIVE_LDFLAGS=$LDFLAGS
6005         mono_native=yes
6006         MONO_NATIVE_PLATFORM=macos
6007         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_MACOS"
6009         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer],
6010                 [!(MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12)])
6012         if test x$mono_native_compat = xyes; then
6013                 mono_native_compat=yes
6014                 mono_native_text="Mac OSX (compat + unified v10.12)"
6015                 MONO_NATIVE_COMPAT_CCASFLAGS=$MONO_NATIVE_CCASFLAGS
6016                 MONO_NATIVE_COMPAT_CPPFLAGS=$MONO_NATIVE_CPPFLAGS
6017                 MONO_NATIVE_COMPAT_CXXFLAGS=$MONO_NATIVE_CXXFLAGS
6018                 MONO_NATIVE_COMPAT_CFLAGS=$MONO_NATIVE_CFLAGS
6019                 MONO_NATIVE_COMPAT_LDFLAGS=$MONO_NATIVE_LDFLAGS
6021                 sed_remove_mac_version_pattern="s/-mmacosx-version-min=$sed_version_pattern//g"
6022                 MONO_NATIVE_UNIFIED_CCASFLAGS="`echo $CCASFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6023                 MONO_NATIVE_UNIFIED_CPPFLAGS="`echo $CPPFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6024                 MONO_NATIVE_UNIFIED_CXXFLAGS="`echo $CXXFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6025                 MONO_NATIVE_UNIFIED_CFLAGS="`echo $CFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6026                 MONO_NATIVE_UNIFIED_LDFLAGS="`echo $LDFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6027         else
6028                 mono_native_compat=no
6029                 mono_native_text="Mac OSX"
6030         fi
6031 elif test x$mono_native_platform_ios = xyes; then
6032         AC_MONO_APPLE_TARGET(TARGET_OS_SIMULATOR, [mono_native_ios_sim=yes], [mono_native_ios_sim=no])
6034         AC_MONO_APPLE_TARGET(TARGET_OS_IOS, [
6035                 if test x$mono_native_ios_sim = xyes; then
6036                         mono_native_ios_target=ios-simulator
6037                         mono_native_text="iOS Simulator"
6038                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6039                 else
6040                         mono_native_ios_target=iphoneos
6041                         mono_native_text="iOS Device"
6042                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6043                 fi
6044                 mono_native_unified_version="10.0"
6045                 mono_native_compat_check="__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_10_0"
6046         ], [
6047                 AC_MONO_APPLE_TARGET(TARGET_OS_TV, [
6048                         if test x$mono_native_ios_sim = xyes; then
6049                                 mono_native_ios_target=tvos-simulator
6050                                 mono_native_text="AppleTV Simulator"
6051                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6052                         else
6053                                 mono_native_ios_target=tvos
6054                                 mono_native_text="AppleTV Device"
6055                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6056                         fi
6057                         mono_native_unified_version="10.0"
6058                         mono_native_compat_check="__TV_OS_VERSION_MIN_REQUIRED >= __TVOS_10_0"
6059                 ], [
6060                         AC_MONO_APPLE_TARGET(TARGET_OS_WATCH, [
6061                                 if test x$mono_native_ios_sim = xyes; then
6062                                         mono_native_ios_target=watchos-simulator
6063                                         mono_native_text="Apple Watch Simulator"
6064                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6065                                 else
6066                                         mono_native_ios_target=watchos
6067                                         mono_native_text="Apple Watch Device"
6068                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6069                                 fi
6070                                 mono_native_unified_version="5.0"
6071                                 mono_native_compat_check="__WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_5_0"
6072                         ], [
6073                                 AC_MSG_ERROR([Unknown iOS Target])
6074                         ])
6075                 ])
6076         ])
6078         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer], [!($mono_native_compat_check)])
6080         if test x$with_bitcode = xyes; then
6081                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -no-undefined -fatal_warnings"
6082                 MONO_NATIVE_LIBADD="../mini/$LIBMONO_LA"
6083         else
6084                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -fatal_warnings"
6085         fi
6087         if test x$enable_gss = xyes; then
6088                 mono_native_ldflags="$mono_native_ldflags -framework GSS"
6089         fi
6091         MONO_NATIVE_CC=$CC
6092         MONO_NATIVE_CXX=$CXX
6093         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6094         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6095         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6096         MONO_NATIVE_CFLAGS=$CFLAGS
6097         MONO_NATIVE_LDFLAGS="$LDFLAGS $mono_native_ldflags"
6099         if test x$mono_native_compat = xyes; then
6100                 mono_native_text="$mono_native_text (compat + unified v$mono_native_unified_version)"
6101                 MONO_NATIVE_COMPAT_CCASFLAGS=$MONO_NATIVE_CCASFLAGS
6102                 MONO_NATIVE_COMPAT_CPPFLAGS=$MONO_NATIVE_CPPFLAGS
6103                 MONO_NATIVE_COMPAT_CXXFLAGS=$MONO_NATIVE_CXXFLAGS
6104                 MONO_NATIVE_COMPAT_CFLAGS=$MONO_NATIVE_CFLAGS
6105                 MONO_NATIVE_COMPAT_LDFLAGS=$MONO_NATIVE_LDFLAGS
6107                 sed_remove_ios_version_pattern="s/-m\(.*\)-version-min=$sed_version_pattern//g"
6108                 MONO_NATIVE_UNIFIED_CCASFLAGS="`echo $CCASFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6109                 MONO_NATIVE_UNIFIED_CPPFLAGS="`echo $CPPFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6110                 MONO_NATIVE_UNIFIED_CXXFLAGS="`echo $CXXFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6111                 MONO_NATIVE_UNIFIED_CFLAGS="`echo $CFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6112                 MONO_NATIVE_UNIFIED_LDFLAGS="`echo $LDFLAGS $mono_native_ldflags | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6113         fi
6115         mono_native=yes
6116         MONO_NATIVE_PLATFORM=ios
6117 elif test x$host_linux = xyes; then
6118         mono_native_text="Linux"
6119         MONO_NATIVE_CC=$CC
6120         MONO_NATIVE_CXX=$CXX
6121         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6122         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6123         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6124         MONO_NATIVE_CFLAGS=$CFLAGS
6125         MONO_NATIVE_LDFLAGS=$LDFLAGS
6127         mono_native=yes
6128         mono_native_compat=no
6129         MONO_NATIVE_PLATFORM=linux
6131         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
6132 elif test x$target_wasm = xyes; then
6133         mono_native_text="wasm"
6134         MONO_NATIVE_CC=$CC
6135         MONO_NATIVE_CXX=$CXX
6136         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6137         # The system.native code uses _WASM_ to check for wasm
6138         MONO_NATIVE_CPPFLAGS="$CPPFLAGS -D_WASM_"
6139         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6140         MONO_NATIVE_CFLAGS=$CFLAGS
6141         MONO_NATIVE_LDFLAGS=$LDFLAGS
6143         mono_native=yes
6144         mono_native_compat=no
6145         MONO_NATIVE_PLATFORM=linux
6147         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
6148 elif case $host_os in aix*|os400*) true;; *) false;; esac; then
6149         mono_native_text="AIX"
6150         MONO_NATIVE_CC=$CC
6151         MONO_NATIVE_CXX=$CXX
6152         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6153         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6154         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6155         MONO_NATIVE_CFLAGS=$CFLAGS
6156         dnl flock in AIX exists in libbsd (not the same as freedesktop.org
6157         dnl libbsd) which Mono.Native needs.
6158         dnl Because of the way that the library is built by default, unresolved
6159         dnl references are kept and resolved at runtime. Often, the dependency
6160         dnl chain means libbsd is loaded anyways, but not necessarily. It's
6161         dnl better to explicitly link it, even though it has it shadows libc's
6162         dnl ioctl with its own. (As for the other unresolved imports, those
6163         dnl should be provided by the Mono runtime loaded.)
6164         MONO_NATIVE_LDFLAGS="$LDFLAGS -lbsd"
6166         mono_native=yes
6167         mono_native_compat=no
6168         MONO_NATIVE_PLATFORM=aix
6170         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_AIX"
6171 elif case $host_os in freebsd*) true;; *) false;; esac; then
6172         mono_native_text="FreeBSD"
6173         MONO_NATIVE_CC=$CC
6174         MONO_NATIVE_CXX=$CXX
6175         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6176         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6177         MONO_NATIVE_CFLAGS=$CFLAGS
6178         MONO_NATIVE_LDFLAGS=$LDFLAGS
6180         mono_native=yes
6181         mono_native_compat=no
6182         MONO_NATIVE_PLATFORM=freebsd
6183         AC_MSG_CHECKING([Mono.Native support])
6184         AC_MSG_RESULT(freebsd)
6186         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_FREEBSD"
6187 elif test x$platform_android = xyes; then
6188         mono_native_text="Android"
6189         MONO_NATIVE_CC=$CC
6190         MONO_NATIVE_CXX=$CXX
6191         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6192         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6193         MONO_NATIVE_CFLAGS=$CFLAGS
6194         MONO_NATIVE_LDFLAGS=$LDFLAGS
6196         mono_native=yes
6197         mono_native_compat=no
6198         MONO_NATIVE_PLATFORM=android
6200         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_ANDROID"
6201 else
6202         mono_native=no
6203         mono_native_text="no"
6206 AC_MSG_RESULT($mono_native_text)
6208 if test x$mono_native_compat = xyes; then
6209         MONO_NATIVE_LIBRARY_NAME=libmono-native-compat
6210 else
6211         MONO_NATIVE_LIBRARY_NAME=libmono-native
6214 AC_SUBST(MONO_NATIVE_PLATFORM)
6215 AC_SUBST(MONO_NATIVE_CC)
6216 AC_SUBST(MONO_NATIVE_CXX)
6217 AC_SUBST(MONO_NATIVE_CCASFLAGS)
6218 AC_SUBST(MONO_NATIVE_COMPAT_CCASFLAGS)
6219 AC_SUBST(MONO_NATIVE_UNIFIED_CCASFLAGS)
6220 AC_SUBST(MONO_NATIVE_CPPFLAGS)
6221 AC_SUBST(MONO_NATIVE_COMPAT_CPPFLAGS)
6222 AC_SUBST(MONO_NATIVE_UNIFIED_CPPFLAGS)
6223 AC_SUBST(MONO_NATIVE_CXXFLAGS)
6224 AC_SUBST(MONO_NATIVE_COMPAT_CXXFLAGS)
6225 AC_SUBST(MONO_NATIVE_UNIFIED_CXXFLAGS)
6226 AC_SUBST(MONO_NATIVE_CFLAGS)
6227 AC_SUBST(MONO_NATIVE_COMPAT_CFLAGS)
6228 AC_SUBST(MONO_NATIVE_UNIFIED_CFLAGS)
6229 AC_SUBST(MONO_NATIVE_LDFLAGS)
6230 AC_SUBST(MONO_NATIVE_COMPAT_LDFLAGS)
6231 AC_SUBST(MONO_NATIVE_UNIFIED_LDFLAGS)
6232 AC_SUBST(MONO_NATIVE_LIBRARY_NAME)
6233 AC_SUBST(MONO_NATIVE_LIBADD)
6235 AM_CONDITIONAL(MONO_NATIVE, test x$mono_native = xyes)
6236 AM_CONDITIONAL(MONO_NATIVE_COMPAT, test x$mono_native_compat = xyes)
6237 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_MACOS, test x$MONO_NATIVE_PLATFORM = xmacos)
6238 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_IOS, test x$MONO_NATIVE_PLATFORM = xios)
6239 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_LINUX, test x$MONO_NATIVE_PLATFORM = xlinux)
6240 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_AIX, test x$MONO_NATIVE_PLATFORM = xaix)
6241 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_ANDROID, test x$MONO_NATIVE_PLATFORM = xandroid)
6242 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_FREEBSD, test x$MONO_NATIVE_PLATFORM = xfreebsd)
6244 MONO_NATIVE_PLATFORM_TYPE_COMPAT="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_COMPAT"
6245 MONO_NATIVE_PLATFORM_TYPE_UNIFIED="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_UNIFIED"
6246 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE)
6247 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_COMPAT)
6248 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_UNIFIED)
6250 ### C++ Linker selection
6252 # We have to lie to autotools, sometimes.
6254 # If we're building with llvm compiled into Mono, set MONO_CXXLD to CXX,
6255 # otherwise to CC.  We want C linking even if we're compiling with C++ enabled
6256 # because we do not want to link inthe C++ runtime library (-lstdc++ or -lc++),
6257 # except if we're linking with LLVM which relies on it.
6259 # Explanation of the hack:
6261 # According to
6262 # https://www.gnu.org/software/automake/manual/html_node/How-the-Linker-is-Chosen.html,
6263 # automake chooses the linker that it used to compile a target based on the
6264 # _SOURCES for that target.  If the target is comprised of only C code, it
6265 # chooses the C linker (on Linux and OSX this is just gcc or clang called with
6266 # linker arguments and a -o).  If the target _SOURCES include at least one C++ file, 
6267 # then automake chooses the C++ linker (usually g++ or clang++ called with linker arguments and -o).
6269 # The problem for Mono is that we don't want the C++ runtime library (libstdc++
6270 # or libc++) linked in - even when Mono is written in C++, we take care not to
6271 # require the runtime library.  As a result, we don't want g++ or clang++ to do
6272 # the linking.  On the other hand if LLVM is enabled, then we _must_ use the
6273 # C++ linker - LLVM doesn't have the same restrictions.
6275 # So the trick is we set MONO_CXXLD here to $CXX or $CC and in
6276 #  mono/mini/Makefile.am.in we have CCLD=$MONO_CXXLD and CXXLD=$MONO_CXXLD which bypasses
6277 #  automake's autodetection and lets us use the linker that we want.
6279 if test "x$enable_llvm_runtime" = "xyes"; then
6280         AC_SUBST(MONO_CXXLD, [$CXX])
6281 else
6282         AC_SUBST(MONO_CXXLD, [$CC])
6285 ### Set -Werror options
6287 # Anything involving -Werror must be done late because autoconf depends on compiling with warnings to be success.
6289 if test x"$GCC" = xyes; then
6291         if test "x$with_jemalloc" != "xyes"; then
6293                 # incompatible-pointer-types requires gcc circa 5.x
6295                 ORIG_CFLAGS=$CFLAGS
6296                 CFLAGS="$CFLAGS -Wincompatible-pointer-types -Werror"
6297                 AC_MSG_CHECKING(for -Wincompatible-pointer-types option to gcc)
6298                 AC_TRY_COMPILE([],[
6299                 ], [
6300                         AC_MSG_RESULT(yes)
6301                         CFLAGS="$ORIG_CFLAGS -Werror=incompatible-pointer-types"
6302                 ], [
6303                         AC_MSG_RESULT(no)
6304                         CFLAGS=$ORIG_CFLAGS
6305                 ])
6307                 CFLAGS="$CFLAGS -Werror=return-type"
6308         fi
6310         # Implicit function declarations are not 64 bit safe
6311         # Do this late, since this causes lots of configure tests to fail
6312         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
6313         # jay has a lot of implicit declarations
6314         JAY_CFLAGS="-Wno-implicit-function-declaration"
6317 AC_SUBST(CFLAGS)
6318 AC_SUBST(CPPFLAGS)
6319 AC_SUBST(LDFLAGS)
6321 # Update all submodules recursively to ensure everything is checked out
6322 (cd $srcdir && scripts/update_submodules.sh)
6324 AC_OUTPUT([
6325 Makefile
6326 mono-uninstalled.pc
6327 acceptance-tests/Makefile
6328 llvm/Makefile
6329 scripts/mono-find-provides
6330 scripts/mono-find-requires
6331 mk/Makefile
6332 mono/Makefile
6333 mono/btls/Makefile
6334 mono/native/Makefile
6335 mono/utils/Makefile
6336 mono/utils/jemalloc/Makefile
6337 mono/metadata/Makefile
6338 mono/dis/Makefile
6339 mono/cil/Makefile
6340 mono/arch/Makefile
6341 mono/arch/x86/Makefile
6342 mono/arch/amd64/Makefile
6343 mono/arch/ppc/Makefile
6344 mono/arch/sparc/Makefile
6345 mono/arch/s390x/Makefile
6346 mono/arch/arm/Makefile
6347 mono/arch/arm64/Makefile
6348 mono/arch/mips/Makefile
6349 mono/arch/riscv/Makefile
6350 mono/sgen/Makefile
6351 mono/native/platform-type.c
6352 mono/native/platform-type-compat.c
6353 mono/native/platform-type-unified.c
6354 mono/tests/Makefile
6355 mono/tests/assembly-load-reference/Makefile
6356 mono/tests/tests-config
6357 mono/tests/gc-descriptors/Makefile
6358 mono/tests/testing_gac/Makefile
6359 mono/tests/fullaot-mixed/Makefile
6360 mono/tests/llvmonly-mixed/Makefile
6361 mono/unit-tests/Makefile
6362 mono/benchmark/Makefile
6363 mono/mini/Makefile
6364 mono/profiler/Makefile
6365 mono/eglib/Makefile
6366 mono/eglib/eglib-config.h
6367 mono/eglib/test/Makefile
6368 m4/Makefile
6369 ikvm-native/Makefile
6370 scripts/Makefile
6371 man/Makefile
6372 docs/Makefile
6373 data/Makefile
6374 data/net_2_0/Makefile
6375 data/net_4_0/Makefile
6376 data/net_4_5/Makefile
6377 data/net_2_0/Browsers/Makefile
6378 data/net_4_0/Browsers/Makefile
6379 data/net_4_5/Browsers/Makefile
6380 data/mint.pc
6381 data/mono-2.pc
6382 data/monosgen-2.pc
6383 data/mono.pc
6384 data/mono-cairo.pc
6385 data/mono-nunit.pc
6386 data/mono-options.pc
6387 data/mono-lineeditor.pc
6388 data/monodoc.pc
6389 data/dotnet.pc
6390 data/dotnet35.pc
6391 data/wcf.pc
6392 data/cecil.pc
6393 data/system.web.extensions_1.0.pc
6394 data/system.web.extensions.design_1.0.pc
6395 data/system.web.mvc.pc
6396 data/system.web.mvc2.pc
6397 data/system.web.mvc3.pc
6398 data/aspnetwebstack.pc
6399 data/reactive.pc
6400 samples/Makefile
6401 support/Makefile
6402 data/config
6403 tools/Makefile
6404 tools/locale-builder/Makefile
6405 tools/sgen/Makefile
6406 tools/monograph/Makefile
6407 tools/pedump/Makefile
6408 runtime/Makefile
6409 msvc/Makefile
6410 po/Makefile
6413 if test x$host_win32 = xyes; then
6414    # Get rid of 'cyg' prefixes in library names
6415    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6416    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
6417    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
6418    # executable doesn't work...
6419    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6422 if test x$host_darwin = xyes; then
6423    # This doesn't seem to be required and it slows down parallel builds
6424    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
6428   case $prefix in
6429   NONE) prefix=$ac_default_prefix ;;
6430   esac
6431   case $exec_prefix in
6432   NONE) exec_prefix='${prefix}' ;;
6433   esac
6435   #
6436   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
6437   # any existing config.make.  This allows people to share the same source tree
6438   # with different build directories, one native and one cross
6439   #
6440   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
6442     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
6444     echo "prefix=$prefix" > $mcs_topdir/build/config.make
6445     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
6446     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
6447     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
6448     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
6449     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
6450     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
6451     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
6452     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
6454     case $INSTALL in
6455     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
6456     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
6457     esac
6459     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
6461     export VERSION
6462     [myver=$($AWK 'BEGIN {
6463       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
6464       if(length(vsplit [1]) > 4) {
6465         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
6466       }
6467       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
6468     }')]
6470     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
6471     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
6473     if test x$host_darwin = xyes; then
6474       echo "BUILD_PLATFORM = macos" >> $mcs_topdir/build/config.make
6475       echo "HOST_PLATFORM ?= macos" >> $mcs_topdir/build/config.make
6476       echo "XTEST_PLATFORM ?= osx" >> $mcs_topdir/build/config.make
6477     elif test x$host_win32 = xyes; then
6478       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
6479       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
6480       echo "XTEST_PLATFORM ?= windows" >> $mcs_topdir/build/config.make
6481     elif test x$host_linux = xyes; then
6482       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
6483       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6484       echo "XTEST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6485     else
6486       echo "BUILD_PLATFORM = unix" >> $mcs_topdir/build/config.make
6487       echo "HOST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6488       echo "XTEST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6489     fi
6491     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
6492       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
6493     fi
6495         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
6496            enable_system_aot=yes
6497         fi
6499     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
6500       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
6501     fi
6503     if test x$DISABLE_MCS_DOCS = xyes; then
6504       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
6505     fi
6507     if test x$has_extension_module != xno; then
6508         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
6509     fi
6510     
6511     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
6512     
6513     if test "x$test_bcl_opt" = "xyes"; then    
6514       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
6515     fi
6517     echo "STANDALONE_CSC_LOCATION=$CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
6518     echo "SERVER_CSC_LOCATION?=$CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
6519     echo "VBCS_LOCATION?=" >> $srcdir/$mcsdir/build/config.make
6521     if test $csc_compiler = mcs; then
6522       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
6523     fi
6525     if test "x$AOT_BUILD_FLAGS" != "x" ; then
6526       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
6527       echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
6528       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
6529     fi
6531     if test "x$AOT_MODE" != "x" ; then
6532       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
6533     fi
6535     if test "x$enable_btls" = "xyes"; then
6536       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
6537     fi
6539     if test "x$mono_native" = "xyes"; then
6540       echo "MONO_NATIVE_SUPPORTED=true" >> $srcdir/$mcsdir/build/config.make
6541     else
6542       echo "MONO_NATIVE_SUPPORTED=false" >> $srcdir/$mcsdir/build/config.make
6543     fi
6545     if test x$mono_native_compat = xyes; then
6546       echo "MONO_NATIVE_USING_COMPAT=true" >> $srcdir/$mcsdir/build/config.make
6547     else
6548       echo "MONO_NATIVE_USING_COMPAT=false" >> $srcdir/$mcsdir/build/config.make
6549     fi
6551     echo "MONO_NATIVE_PLATFORM_TYPE=$MONO_NATIVE_PLATFORM_TYPE" >> $srcdir/$mcsdir/build/config.make
6552     echo "MONO_NATIVE_PLATFORM=$MONO_NATIVE_PLATFORM" >> $srcdir/$mcsdir/build/config.make
6553     if test x$enable_compiler_server = xyes; then
6554       echo "ENABLE_COMPILER_SERVER?=1" >> $srcdir/$mcsdir/build/config.make
6555     else
6556       echo "ENABLE_COMPILER_SERVER?=0" >> $srcdir/$mcsdir/build/config.make
6557     fi
6558     echo "COMPILER_SERVER_PIPENAME?=monomake" >> $srcdir/$mcsdir/build/config.make
6560   fi
6564 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
6566 btls_platform_string=
6567 if test x$enable_btls = xyes; then
6568         if test x$btls_android = xyes; then
6569                 btls_platform_string=" (android:$BTLS_PLATFORM)"
6570         else
6571                 btls_platform_string=" ($BTLS_PLATFORM)"
6572         fi
6575 thread_suspend_msg=
6576 if test x$buildsgen = xyes; then
6577         if test x$enable_cooperative_suspend != xno; then
6578                 thread_suspend_msg="Suspend:       Cooperative"
6579         elif test x$enable_hybrid_suspend != xno; then
6580                 thread_suspend_msg="Suspend:       Hybrid"
6581         else
6582                 thread_suspend_msg="Suspend:       Preemptive"
6583         fi
6585         
6586 echo "
6587         mcs source:    $mcsdir
6588         C# Compiler:   $csc_compiler
6590    Engine:
6591         Host:          $host
6592         Target:        $target
6593         GC:            $gc_msg 
6594         $thread_suspend_msg
6595         TLS:           $with_tls
6596         SIGALTSTACK:   $with_sigaltstack
6597         Engine:        $jit_status
6598         BigArrays:     $enable_big_arrays
6599         DTrace:        $enable_dtrace
6600         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm, built in-tree: $internal_llvm, assertions: $enable_llvm_asserts, msvc only: $enable_llvm_msvc_only)
6601         Spectre:       $spectre_mitigation_status
6602         Mono.Native:   $mono_native_text
6604    Libraries:
6605         .NET 4.x:        $with_profile4_x
6606         Xamarin.Android: $with_monodroid
6607         Xamarin.iOS:     $with_monotouch
6608         Xamarin.WatchOS: $with_monotouch_watch
6609         Xamarin.TVOS:    $with_monotouch_tv
6610         Xamarin.Mac:     $with_xammac
6611         Windows AOT:     $with_winaot
6612         Orbis:           $with_orbis
6613         Unreal:          $with_unreal
6614         WebAssembly:     $with_wasm
6615         Test profiles:   AOT Full ($with_testing_aot_full), AOT Hybrid ($with_testing_aot_hybrid)
6616         JNI support:     $jdk_headers_found
6617         libgdiplus:      $libgdiplus_msg
6618         zlib:            $zlib_msg
6619         BTLS:            $enable_btls$btls_platform_string
6620         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
6621         crash reporting: $crash_reporting (private crashes: $with_crash_privacy)
6622         .NET Core:       $with_core
6623         $disabled
6625 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
6626    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)