Add linker test for Queryable
[mono-project.git] / configure.ac
blob735bfaba63ead783b54bd270e5bf0720a3fb0cae
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 dnl ***********************************
1908 dnl *** Checks for availability of GSS dependencies (krb5, gss.framework, etc)
1909 dnl ***********************************
1910 enable_gss=no;
1911 AC_MSG_CHECKING(for GSS/GSS.h)
1912 AC_TRY_COMPILE([
1913     #include <GSS/GSS.h>
1914 ], [
1916     AC_MSG_RESULT(yes)
1917     AC_DEFINE(HAVE_GSSFW_HEADERS, 1, [GSS/GSS.h])
1918     AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
1919     enable_gss=yes
1920 ], [
1921     AC_MSG_RESULT(no)
1924 AC_MSG_CHECKING(for gssapi/gssapi_ext.h)
1925 AC_TRY_COMPILE([
1926     #include <gssapi/gssapi_ext.h>
1927 ], [
1929     AC_MSG_RESULT(yes)
1930     enable_gss=yes
1931 ], [
1932     AC_MSG_RESULT(no)
1935 AC_MSG_CHECKING(for GSS_SPNEGO_MECHANISM)
1936 AC_TRY_COMPILE([
1937     #include <gssapi/gssapi_ext.h>
1938     #include <gssapi/gssapi_krb5.h>
1939     gss_OID_set_desc gss_mech_spnego_OID_set_desc = {.count = 1, .elements = GSS_SPNEGO_MECHANISM};
1940 ], [
1942     AC_MSG_RESULT(yes)
1943     AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
1944 ], [
1945     AC_MSG_RESULT(no)
1948 AM_CONDITIONAL(ENABLE_GSS, test x$enable_gss = xyes)
1950 # `target_ios=yes` does not detect watch devices and fails when cross-compiling
1951 AC_MONO_APPLE_TARGET(TARGET_OS_IPHONE, [mono_native_platform_ios=yes])
1953 if test x$host_win32 = xno; then
1954         dnl *************************************
1955         dnl *** Checks for time capabilities ***
1956         dnl *************************************
1958         AC_MSG_CHECKING(for CLOCK_MONOTONIC)
1959         AC_TRY_COMPILE([#include <time.h>], [
1960                 const int foo = CLOCK_MONOTONIC;
1961         ],[
1962                 AC_MSG_RESULT(yes)
1963                 AC_DEFINE(HAVE_CLOCK_MONOTONIC, 1, [CLOCK_MONOTONIC])
1964         ], [
1965                 AC_MSG_RESULT(no)
1966         ])
1968         AC_MSG_CHECKING(for CLOCK_MONOTONIC_COARSE)
1969         AC_TRY_COMPILE([#include <time.h>], [
1970                 const int foo = CLOCK_MONOTONIC_COARSE;
1971         ],[
1972                 AC_MSG_RESULT(yes)
1973                 AC_DEFINE(HAVE_CLOCK_MONOTONIC_COARSE, 1, [CLOCK_MONOTONIC_COARSE])
1974         ], [
1975                 AC_MSG_RESULT(no)
1976         ])
1978         AC_MSG_CHECKING(for CLOCK_REALTIME)
1979         AC_TRY_COMPILE([#include <time.h>], [
1980                 const int foo = CLOCK_REALTIME;
1981         ],[
1982                 AC_MSG_RESULT(yes)
1983                 AC_DEFINE(HAVE_CLOCK_REALTIME, 1, [CLOCK_REALTIME])
1984         ], [
1985                 AC_MSG_RESULT(no)
1986         ])
1988         AC_CHECK_FUNC(mach_absolute_time, [AC_DEFINE(HAVE_MACH_ABSOLUTE_TIME, 1, [mach_absolute_time])])
1989         AC_CHECK_FUNC(gethrtime, [AC_DEFINE(HAVE_GETHRTIME, 1, [gethrtime])])
1990         AC_CHECK_FUNC(read_real_time, [AC_DEFINE(HAVE_READ_REAL_TIME, 1, [read_real_time])])
1991         AC_CHECK_FUNC(mach_timebase_info, [AC_DEFINE(HAVE_MACH_TIMEBASE_INFO, 1, [mach_timebase_info])])
1992         AC_CHECK_FUNC(futimes,            [AC_DEFINE(HAVE_FUTIMES, 1, [futimes])])
1993         AC_CHECK_FUNC(futimens,           [AC_DEFINE(HAVE_FUTIMENS, 1, [futimens])])
1995         dnl hires monotonic clock support
1996         AC_SEARCH_LIBS(clock_gettime, rt)
1997         AC_CHECK_FUNCS(clock_nanosleep)
1999         dnl dynamic loader support
2000         AC_CHECK_FUNC(dlopen, DL_LIB="",
2001                 AC_CHECK_LIB(dl, dlopen, DL_LIB="-ldl", dl_support=no)
2002         )
2003         if test x$dl_support = xno; then
2004                 AC_MSG_WARN([No dynamic loading support available])
2005         else
2006                 LIBS="$LIBS $DL_LIB"
2007                 AC_DEFINE(HAVE_DL_LOADER,1,[dlopen-based dynamic loader available])
2008                 dnl from glib's configure.ac
2009                 AC_CACHE_CHECK([for preceeding underscore in symbols],
2010                         mono_cv_uscore,[
2011                         AC_TRY_RUN([#include <dlfcn.h>
2012                         int mono_underscore_test (void) { return 42; }
2013                         int main() {
2014                           void *f1 = (void*)0, *f2 = (void*)0, *handle;
2015                           handle = dlopen ((void*)0, 0);
2016                           if (handle) {
2017                             f1 = dlsym (handle, "mono_underscore_test");
2018                             f2 = dlsym (handle, "_mono_underscore_test");
2019                           } return (!f2 || f1);
2020                         }],
2021                                 [mono_cv_uscore=yes],
2022                                 [mono_cv_uscore=no],
2023                         [])
2024                 ])
2025                 if test "x$mono_cv_uscore" = "xyes"; then
2026                         MONO_DL_NEED_USCORE=1
2027                 else
2028                         MONO_DL_NEED_USCORE=0
2029                 fi
2030                 AC_SUBST(MONO_DL_NEED_USCORE)
2031                 AC_CHECK_FUNC(dlerror)
2032         fi
2034         dnl ******************************************************************
2035         dnl *** Checks for the IKVM JNI interface library                  ***
2036         dnl ******************************************************************
2037         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])
2039         ikvm_native_dir=
2040         if test x$with_ikvm_native = xyes; then
2041                 ikvm_native_dir=ikvm-native
2042                 jdk_headers_found="IKVM Native"
2043         fi
2045         AC_SUBST(ikvm_native_dir)
2047         AC_CHECK_HEADERS(execinfo.h)
2049         AC_CHECK_HEADERS(sys/auxv.h sys/resource.h)
2051         AC_CHECK_FUNCS(getgrgid_r)
2052         AC_CHECK_FUNCS(getgrnam_r)
2053         AC_CHECK_FUNCS(getresuid)
2054         AC_CHECK_FUNCS(setresuid)
2055         AC_CHECK_FUNCS(kqueue)
2056         AC_CHECK_FUNCS(backtrace_symbols)
2057         AC_CHECK_FUNCS(mkstemp)
2058         AC_CHECK_FUNCS(mmap)
2059         AC_CHECK_FUNCS(madvise)
2060         AC_CHECK_FUNCS(getrusage)
2061         AC_CHECK_FUNCS(getpriority)
2062         AC_CHECK_FUNCS(setpriority)
2063         AC_CHECK_FUNCS(dl_iterate_phdr)
2064         AC_CHECK_FUNCS(dladdr)
2065         AC_CHECK_FUNCS(sysconf)
2066         AC_CHECK_FUNCS(getrlimit)
2067         AC_CHECK_FUNCS(prctl)
2068         AC_CHECK_FUNCS(arc4random)
2069         AC_CHECK_FUNCS(nl_langinfo)
2071         AC_CHECK_FUNCS(sched_getaffinity)
2072         AC_CHECK_FUNCS(sched_setaffinity)
2073         AC_CHECK_FUNCS(sched_getcpu)
2075         if test x$platform_android != xyes; then
2076                 AC_CHECK_FUNCS(getpwnam_r)
2077                 AC_CHECK_FUNCS(getpwuid_r)
2078         fi
2080         AC_CHECK_FUNCS(readlink)
2081         AC_CHECK_FUNCS(chmod)
2082         AC_CHECK_FUNCS(lstat)
2083         AC_CHECK_FUNCS(getdtablesize)
2085         AC_CHECK_FUNCS(ftruncate)
2086         AC_CHECK_FUNCS(msync)
2088         AC_CHECK_FUNCS(gethostname getpeername)
2089         AC_CHECK_FUNCS(utime utimes)
2091         AC_CHECK_FUNCS(openlog closelog)
2092         AC_CHECK_FUNCS(atexit)
2094         AC_FUNC_STRERROR_R()
2096         dnl ****************************************************************
2097         dnl *** Check for sched_setaffinity from glibc versions before   ***
2098         dnl *** 2.3.4. The older versions of the function only take 2    ***
2099         dnl *** parameters, not 3.                                       ***
2100         dnl ***                                                          ***
2101         dnl *** Because the interface change was not made in a minor     ***
2102         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
2103         dnl *** won't always indicate the interface sched_affinity has.  ***
2104         dnl ****************************************************************
2105         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
2106         AC_TRY_COMPILE([#include <sched.h>], [
2107             int mask = 1; 
2108             sched_setaffinity(0, &mask);
2109         ], [
2110                 # Yes, we have it...
2111                 AC_MSG_RESULT(yes)
2112                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
2113         ], [
2114                 # We have the new, three-parameter version
2115                 AC_MSG_RESULT(no)
2116         ])
2117         AC_TRY_COMPILE([#include <sched.h>], [
2118              CPU_COUNT((void *) 0);
2119         ], [
2120                 AC_MSG_RESULT(yes)
2121                 AC_DEFINE(GLIBC_HAS_CPU_COUNT, 1, [GLIBC has CPU_COUNT macro in sched.h])
2122         ], [
2123                 # We have the new, three-parameter version
2124                 AC_MSG_RESULT(no)
2125         ])
2127         dnl ******************************************************************
2128         dnl *** Check for large file support                               ***
2129         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
2130         dnl ******************************************************************
2131         
2132         # Check that off_t can represent 2**63 - 1 correctly, working around
2133         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
2134         # CPPFLAGS and sets $large_offt to yes if the test succeeds
2135         large_offt=no
2136         AC_DEFUN([LARGE_FILES], [
2137                 large_CPPFLAGS=$CPPFLAGS
2138                 CPPFLAGS="$CPPFLAGS $1"
2139                 AC_TRY_COMPILE([
2140                         #include <sys/types.h>
2141                         #include <limits.h>
2142                 ], [
2143                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
2144                         #define COMPILE_TIME_ASSERT(pred) \
2145                                 switch(0){case 0:case pred:;}
2146                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
2147                 ], [
2148                         AC_MSG_RESULT(ok)
2149                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
2150                         large_CPPFLAGS="$large_CPPFLAGS $1"
2151                         large_offt=yes
2152                 ], [
2153                         AC_MSG_RESULT(no)
2154                 ])
2155                 CPPFLAGS=$large_CPPFLAGS
2156         ])
2158         AC_MSG_CHECKING(if off_t is 64 bits wide)
2159         LARGE_FILES("")
2160         if test $large_offt = no; then
2161                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
2162                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
2163         fi
2164         if test $large_offt = no; then
2165                 AC_MSG_WARN([No 64 bit file size support available])
2166         fi
2167         
2168         dnl *****************************
2169         dnl *** Checks for libsocket  ***
2170         dnl *****************************
2171         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
2173         case "$host" in
2174                 *-*-*freebsd*)
2175                         dnl *****************************
2176                         dnl *** Checks for libinotify ***
2177                         dnl *****************************
2178                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
2179         esac
2181         dnl *******************************
2182         dnl *** Checks for MSG_NOSIGNAL ***
2183         dnl *******************************
2184         AC_MSG_CHECKING(for MSG_NOSIGNAL)
2185         AC_TRY_COMPILE([#include <sys/socket.h>], [
2186                 int f = MSG_NOSIGNAL;
2187         ], [
2188                 # Yes, we have it...
2189                 AC_MSG_RESULT(yes)
2190                 AC_DEFINE(HAVE_MSG_NOSIGNAL, 1, [Have MSG_NOSIGNAL])
2191         ], [
2192                 # We'll have to use signals
2193                 AC_MSG_RESULT(no)
2194         ])
2196         dnl *****************************
2197         dnl *** Checks for IPPROTO_IP ***
2198         dnl *****************************
2199         AC_MSG_CHECKING(for IPPROTO_IP)
2200         AC_TRY_COMPILE([#include <netinet/in.h>], [
2201                 int level = IPPROTO_IP;
2202         ], [
2203                 # Yes, we have it...
2204                 AC_MSG_RESULT(yes)
2205                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
2206         ], [
2207                 # We'll have to use getprotobyname
2208                 AC_MSG_RESULT(no)
2209         ])
2211         dnl *******************************
2212         dnl *** Checks for IPPROTO_IPV6 ***
2213         dnl *******************************
2214         AC_MSG_CHECKING(for IPPROTO_IPV6)
2215         AC_TRY_COMPILE([#include <netinet/in.h>], [
2216                 int level = IPPROTO_IPV6;
2217         ], [
2218                 # Yes, we have it...
2219                 AC_MSG_RESULT(yes)
2220                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
2221         ], [
2222                 # We'll have to use getprotobyname
2223                 AC_MSG_RESULT(no)
2224         ])
2226         dnl ******************************
2227         dnl *** Checks for IPPROTO_TCP ***
2228         dnl ******************************
2229         AC_MSG_CHECKING(for IPPROTO_TCP)
2230         AC_TRY_COMPILE([#include <netinet/in.h>], [
2231                 int level = IPPROTO_TCP;
2232         ], [
2233                 # Yes, we have it...
2234                 AC_MSG_RESULT(yes)
2235                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
2236         ], [
2237                 # We'll have to use getprotobyname
2238                 AC_MSG_RESULT(no)
2239         ])
2241         dnl *****************************
2242         dnl *** Checks for SOL_IP     ***
2243         dnl *****************************
2244         AC_MSG_CHECKING(for SOL_IP)
2245         AC_TRY_COMPILE([#include <netdb.h>], [
2246                 int level = SOL_IP;
2247         ], [
2248                 # Yes, we have it...
2249                 AC_MSG_RESULT(yes)
2250                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
2251         ], [
2252                 # We'll have to use getprotobyname
2253                 AC_MSG_RESULT(no)
2254         ])
2256         dnl *****************************
2257         dnl *** Checks for SOL_IPV6     ***
2258         dnl *****************************
2259         AC_MSG_CHECKING(for SOL_IPV6)
2260         AC_TRY_COMPILE([#include <netdb.h>], [
2261                 int level = SOL_IPV6;
2262         ], [
2263                 # Yes, we have it...
2264                 AC_MSG_RESULT(yes)
2265                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
2266         ], [
2267                 # We'll have to use getprotobyname
2268                 AC_MSG_RESULT(no)
2269         ])
2271         dnl *****************************
2272         dnl *** Checks for SOL_TCP    ***
2273         dnl *****************************
2274         AC_MSG_CHECKING(for SOL_TCP)
2275         AC_TRY_COMPILE([#include <netdb.h>], [
2276                 int level = SOL_TCP;
2277         ], [
2278                 # Yes, we have it...
2279                 AC_MSG_RESULT(yes)
2280                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
2281         ], [
2282                 # We'll have to use getprotobyname
2283                 AC_MSG_RESULT(no)
2284         ])
2286         dnl *****************************
2287         dnl *** Checks for IP_PKTINFO ***
2288         dnl *****************************
2289         AC_MSG_CHECKING(for IP_PKTINFO)
2290         AC_TRY_COMPILE([#include <linux/in.h>], [
2291                 int level = IP_PKTINFO;
2292         ], [
2293                 # Yes, we have it...
2294                 AC_MSG_RESULT(yes)
2295                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
2296         ], [
2297                 AC_MSG_RESULT(no)
2298         ])
2300         dnl *****************************
2301         dnl *** Checks for IPV6_PKTINFO ***
2302         dnl *****************************
2303         AC_MSG_CHECKING(for IPV6_PKTINFO)
2304         AC_TRY_COMPILE([#include <netdb.h>], [
2305                 int level = IPV6_PKTINFO;
2306         ], [
2307                 # Yes, we have it...
2308                 AC_MSG_RESULT(yes)
2309                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
2310         ], [
2311                 AC_MSG_RESULT(no)
2312         ])
2314         dnl **********************************
2315         dnl *** Checks for IP_DONTFRAG     ***
2316         dnl **********************************
2317         AC_MSG_CHECKING(for IP_DONTFRAG)
2318         AC_TRY_COMPILE([#include <netinet/in.h>], [
2319                 int level = IP_DONTFRAG;
2320         ], [
2321                 # Yes, we have it...
2322                 AC_MSG_RESULT(yes)
2323                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
2324         ], [
2325                 AC_MSG_RESULT(no)
2326         ])
2328         dnl **********************************
2329         dnl *** Checks for IP_DONTFRAGMENT ***
2330         dnl **********************************
2331         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
2332         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
2333                 int level = IP_DONTFRAGMENT;
2334         ], [
2335                 # Yes, we have it...
2336                 AC_MSG_RESULT(yes)
2337                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
2338         ], [
2339                 AC_MSG_RESULT(no)
2340         ])
2342         dnl **********************************
2343         dnl *** Checks for IP_MTU_DISCOVER ***
2344         dnl **********************************
2345         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
2346         AC_TRY_COMPILE([#include <linux/in.h>], [
2347                 int level = IP_MTU_DISCOVER;
2348         ], [
2349                 # Yes, we have it...
2350                 AC_MSG_RESULT(yes)
2351                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
2352         ], [
2353                 AC_MSG_RESULT(no)
2354         ])
2356         dnl **********************************
2357         dnl *** Checks for  IP_PMTUDISC_DO ***
2358         dnl **********************************
2359         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
2360         AC_TRY_COMPILE([#include <linux/in.h>], [
2361                 int level = IP_PMTUDISC_DO;
2362         ], [
2363                 # Yes, we have it...
2364                 AC_MSG_RESULT(yes)
2365                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
2366         ], [
2367                 AC_MSG_RESULT(no)
2368         ])
2370         dnl *********************************
2371         dnl *** Check for struct ip_mreqn ***
2372         dnl *********************************
2373         AC_MSG_CHECKING(for struct ip_mreqn)
2374         AC_TRY_COMPILE([#include <netinet/in.h>], [
2375                 struct ip_mreqn mreq;
2376                 mreq.imr_address.s_addr = 0;
2377         ], [
2378                 # Yes, we have it...
2379                 AC_MSG_RESULT(yes)
2380                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
2381         ], [
2382                 # We'll just have to try and use struct ip_mreq
2383                 AC_MSG_RESULT(no)
2384                 AC_MSG_CHECKING(for struct ip_mreq)
2385                 AC_TRY_COMPILE([#include <netinet/in.h>], [
2386                         struct ip_mreq mreq;
2387                         mreq.imr_interface.s_addr = 0;
2388                 ], [
2389                         # Yes, we have it...
2390                         AC_MSG_RESULT(yes)
2391                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
2392                 ], [
2393                         # No multicast support
2394                         AC_MSG_RESULT(no)
2395                 ])
2396         ])
2397         
2398         dnl **********************************
2399         dnl *** Check for getaddrinfo ***
2400         dnl **********************************
2401         AC_MSG_CHECKING(for getaddrinfo)
2402                 AC_TRY_LINK([
2403                 #include <stdio.h>
2404                 #include <netdb.h>
2405         ], [
2406                 getaddrinfo(NULL,NULL,NULL,NULL);
2407         ], [
2408                 # Yes, we have it...
2409                 AC_MSG_RESULT(yes)
2410                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2411         ], [
2412                 AC_MSG_RESULT(no)
2413         ])
2415         dnl **********************************
2416         dnl *** Check for gethostbyname2_r ***
2417         dnl **********************************
2418         AC_MSG_CHECKING(for gethostbyname2_r)
2419                 AC_TRY_LINK([
2420                 #include <stdio.h>
2421                 #include <netdb.h>
2422         ], [
2424                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
2425         ], [
2426                 # Yes, we have it...
2427                 AC_MSG_RESULT(yes)
2428                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
2429         ], [
2430                 AC_MSG_RESULT(no)
2431         ])
2433         dnl **********************************
2434         dnl *** Check for gethostbyname2 ***
2435         dnl **********************************
2436         AC_MSG_CHECKING(for gethostbyname2)
2437                 AC_TRY_LINK([
2438                 #include <stdio.h>
2439                 #include <netdb.h>
2440         ], [
2441                 gethostbyname2(NULL,0);
2442         ], [
2443                 # Yes, we have it...
2444                 AC_MSG_RESULT(yes)
2445                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
2446         ], [
2447                 AC_MSG_RESULT(no)
2448         ])
2450         dnl **********************************
2451         dnl *** Check for gethostbyname ***
2452         dnl **********************************
2453         AC_MSG_CHECKING(for gethostbyname)
2454                 AC_TRY_LINK([
2455                 #include <stdio.h>
2456                 #include <netdb.h>
2457         ], [
2458                 gethostbyname(NULL);
2459         ], [
2460                 # Yes, we have it...
2461                 AC_MSG_RESULT(yes)
2462                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2463         ], [
2464                 AC_MSG_RESULT(no)
2465         ])
2467         dnl **********************************
2468         dnl *** Check for getprotobyname ***
2469         dnl **********************************
2470         AC_MSG_CHECKING(for getprotobyname)
2471                 AC_TRY_LINK([
2472                 #include <stdio.h>
2473                 #include <netdb.h>
2474         ], [
2475                 getprotobyname(NULL);
2476         ], [
2477                 # Yes, we have it...
2478                 AC_MSG_RESULT(yes)
2479                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2480         ], [
2481                 AC_MSG_RESULT(no)
2482         ])
2484         dnl **********************************
2485         dnl *** Check for getprotobyname_r ***
2486         dnl **********************************
2487         AC_MSG_CHECKING(for getprotobyname_r)
2488                 AC_TRY_LINK([
2489                 #include <stdio.h>
2490                 #include <netdb.h>
2491         ], [
2492                 getprotobyname_r(NULL, NULL, NULL, 0, NULL);
2493         ], [
2494                 # Yes, we have it...
2495                 AC_MSG_RESULT(yes)
2496                 AC_DEFINE(HAVE_GETPROTOBYNAME_R, 1, [Have getprotobyname_r])
2497         ], [
2498                 AC_MSG_RESULT(no)
2499         ])
2501         dnl **********************************
2502         dnl *** Check for getnameinfo ***
2503         dnl **********************************
2504         AC_MSG_CHECKING(for getnameinfo)
2505                 AC_TRY_LINK([
2506                 #include <stdio.h>
2507                 #include <netdb.h>
2508         ], [
2509                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2510         ], [
2511                 # Yes, we have it...
2512                 AC_MSG_RESULT(yes)
2513                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2514         ], [
2515                 AC_MSG_RESULT(no)
2516         ])
2519         dnl **********************************
2520         dnl *** Check for inet_ntop ***
2521         dnl **********************************
2522         AC_MSG_CHECKING(for inet_ntop)
2523                 AC_TRY_LINK([
2524                 #include <stdio.h>
2525                 #include <arpa/inet.h>
2526         ], [
2527                 inet_ntop (0, NULL, NULL, 0);
2528         ], [
2529                 # Yes, we have it...
2530                 AC_MSG_RESULT(yes)
2531                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2532         ], [
2533                 AC_MSG_RESULT(no)
2534         ])
2536         dnl *****************************
2537         dnl *** Checks for libnsl     ***
2538         dnl *****************************
2539         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
2541         AC_CHECK_FUNCS(inet_pton inet_aton)
2543         dnl *****************************
2544         dnl *** Checks for libxnet    ***
2545         dnl *****************************
2546         case "${host}" in
2547                 *solaris* )
2548                         AC_MSG_CHECKING(for Solaris XPG4 support)
2549                         if test -f /usr/lib/libxnet.so; then
2550                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
2551                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
2552                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
2553                                 LIBS="$LIBS -lxnet"
2554                                 AC_MSG_RESULT(yes)
2555                         else
2556                                 AC_MSG_RESULT(no)
2557                         fi
2559                         if test "$GCC" = "yes"; then
2560                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
2561                         fi
2562                 ;;
2563         esac
2565         dnl *****************************
2566         dnl *** Checks for libpthread ***
2567         dnl *****************************
2568 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
2569 # and libpthread does not exist
2571         case "${host}" in
2572                 *-*-*haiku*)
2573                         dnl Haiku has pthread in libroot (libc equiv)
2574                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS")
2575                 ;;
2576                 *-*-*freebsd*)
2577                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2578                 ;;
2579                 *-*-*openbsd*)
2580                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2581                 ;;
2582                 *)
2583                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
2584                 ;;
2585         esac
2586         AC_CHECK_HEADERS(pthread.h)
2587         AC_CHECK_HEADERS(pthread_np.h)
2588         AC_CHECK_FUNCS(pthread_mutex_timedlock)
2589         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_getname_np pthread_setname_np pthread_cond_timedwait_relative_np)
2590         AC_CHECK_FUNCS(pthread_kill)
2591         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
2592         AC_TRY_COMPILE([ #include <pthread.h>], [
2593                 pthread_mutexattr_t attr;
2594                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
2595         ], [
2596                 AC_MSG_RESULT(ok)
2597         ], [
2598                 AC_MSG_RESULT(no)
2599                 AC_ERROR(Posix system lacks support for recursive mutexes)
2600         ])
2601         AC_CHECK_FUNCS(pthread_attr_setstacksize)
2602         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
2603         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
2604         AC_CHECK_FUNCS(mincore mlock munlock)
2606         dnl ***********************************
2607         dnl *** Checks for working __thread ***
2608         dnl ***********************************
2609         AC_MSG_CHECKING(for working __thread)
2610         if test "x$with_tls" != "x__thread"; then
2611                 AC_MSG_RESULT(disabled)
2612         elif test "x$cross_compiling" = "xyes"; then
2613                 AC_MSG_RESULT(cross compiling, assuming yes)
2614         else
2615                 AC_TRY_RUN([
2616                         #if defined(__APPLE__) && defined(__clang__)
2617                         #error "__thread does not currently work with clang on Mac OS X"
2618                         #endif
2619                         
2620                         #include <pthread.h>
2621                         __thread int i;
2622                         static int res1, res2;
2624                         void thread_main (void *arg)
2625                         {
2626                                 i = arg;
2627                                 sleep (1);
2628                                 if (arg == 1)
2629                                         res1 = (i == arg);
2630                                 else
2631                                         res2 = (i == arg);
2632                         }
2634                         int main () {
2635                                 pthread_t t1, t2;
2637                                 i = 5;
2639                                 pthread_create (&t1, NULL, thread_main, 1);
2640                                 pthread_create (&t2, NULL, thread_main, 2);
2642                                 pthread_join (t1, NULL);
2643                                 pthread_join (t2, NULL);
2645                                 return !(res1 + res2 == 2);
2646                         }
2647                 ], [
2648                                 AC_MSG_RESULT(yes)
2649                 ], [
2650                                 AC_MSG_RESULT(no)
2651                                 with_tls=pthread
2652                 ])
2653         fi
2655         dnl **************************************
2656         dnl *** Checks for working sigaltstack ***
2657         dnl **************************************
2658         AC_MSG_CHECKING(for working sigaltstack)
2659         if test "x$with_sigaltstack" != "xyes"; then
2660                 AC_MSG_RESULT(disabled)
2661         elif test "x$cross_compiling" = "xyes"; then
2662                 AC_MSG_RESULT(cross compiling, assuming no)
2663                 with_sigaltstack=no
2664         else
2665                 AC_TRY_RUN([
2666                         #include <stdio.h>
2667                         #include <stdlib.h>
2668                         #include <unistd.h>
2669                         #include <signal.h>
2670                         #include <pthread.h>
2671                         #include <sys/wait.h>
2672                         #if defined(__FreeBSD__) || defined(__NetBSD__)
2673                         #define SA_STACK SA_ONSTACK
2674                         #endif
2675                         static void
2676                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
2677                         {
2678                                 exit (0);
2679                         }
2681                         volatile char*__ptr = NULL;
2682                         static void *
2683                         loop (void *ignored)
2684                         {
2685                                 *__ptr = 0;
2686                                 return NULL;
2687                         }
2689                         static void
2690                         child ()
2691                         {
2692                                 struct sigaction sa;
2693                                 stack_t sas;
2694                                 pthread_t id;
2695                                 pthread_attr_t attr;
2697                                 sa.sa_sigaction = sigsegv_signal_handler;
2698                                 sigemptyset (&sa.sa_mask);
2699                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
2700                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
2701                                         perror ("sigaction");
2702                                         return;
2703                                 }
2705                                 /* x86 darwin deliver segfaults using SIGBUS */
2706                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
2707                                         perror ("sigaction");
2708                                         return;
2709                                 }
2710                                 sas.ss_sp = malloc (SIGSTKSZ);
2711                                 sas.ss_size = SIGSTKSZ;
2712                                 sas.ss_flags = 0;
2713                                 if (sigaltstack (&sas, NULL) == -1) {
2714                                         perror ("sigaltstack");
2715                                         return;
2716                                 }
2718                                 pthread_attr_init (&attr);
2719                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
2720                                         printf ("pthread_create\n");
2721                                         return;
2722                                 }
2724                                 sleep (100);
2725                         }
2727                         int
2728                         main ()
2729                         {
2730                                 pid_t son;
2731                                 int status;
2732                                 int i;
2734                                 son = fork ();
2735                                 if (son == -1) {
2736                                         return 1;
2737                                 }
2739                                 if (son == 0) {
2740                                         child ();
2741                                         return 0;
2742                                 }
2744                                 for (i = 0; i < 300; ++i) {
2745                                         waitpid (son, &status, WNOHANG);
2746                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
2747                                                 return 0;
2748                                         usleep (10000);
2749                                 }
2751                                 kill (son, SIGKILL);
2752                                 return 1;
2753                         }
2755                 ], [
2756                                 AC_MSG_RESULT(yes)
2757                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
2758                 ], [
2759                                 with_sigaltstack=no
2760                                 AC_MSG_RESULT(no)
2761                 ])
2762         fi
2764         dnl ********************************
2765         dnl *** Checks for semaphore lib ***
2766         dnl ********************************
2767         # 'Real Time' functions on Solaris
2768         # posix4 on Solaris 2.6
2769         # pthread (first!) on Linux
2770         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
2772         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
2773         AC_CHECK_FUNCS(shm_open)
2775         dnl ********************************
2776         dnl *** Checks for timezone stuff **
2777         dnl ********************************
2778         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
2779                 AC_TRY_COMPILE([
2780                         #include <time.h>
2781                         ], [
2782                         struct tm tm;
2783                         tm.tm_gmtoff = 1;
2784                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
2785         if test $ac_cv_struct_tm_gmtoff = yes; then
2786                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
2787         else
2788                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
2789                         AC_TRY_COMPILE([
2790                                 #include <time.h>
2791                         ], [
2792                                 timezone = 1;
2793                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
2794                 if test $ac_cv_var_timezone = yes; then
2795                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
2796                 else
2797                         AC_ERROR(unable to find a way to determine timezone)
2798                 fi
2799         fi
2801         dnl *********************************
2802         dnl *** Checks for math functions ***
2803         dnl *********************************
2804         AC_SEARCH_LIBS(sqrtf, m)
2806         dnl ****************************************************************
2807         dnl *** Checks for working poll() (macosx defines it but doesn't ***
2808         dnl *** have it in the library (duh))                            ***
2809         dnl ****************************************************************
2810         AC_CHECK_FUNCS(poll)
2812         dnl **********************************
2813         dnl *** epoll                      ***
2814         dnl **********************************
2815         AC_CHECK_HEADERS(sys/epoll.h)
2816         haveepoll=no
2817         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
2818         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
2819                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
2820         fi
2822         havekqueue=no
2824         AC_CHECK_HEADERS(sys/event.h)
2825         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
2827         dnl **************************************
2828         dnl * Darwin has a race that prevents us from using reliably:
2829         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
2830         dnl * Since kqueue is mostly used for scaling large web servers, 
2831         dnl * and very few folks run Mono on large web servers on OSX, falling
2832         dnl * back 
2833         dnl **************************************
2834         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
2835                 if test "x$host_darwin" = "xno"; then
2836                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
2837                 fi
2838         fi
2840         dnl ******************************
2841         dnl *** Checks for SIOCGIFCONF ***
2842         dnl ******************************
2843         AC_CHECK_HEADERS(sys/ioctl.h)
2844         AC_CHECK_HEADERS(net/if.h, [], [],
2845            [
2846            #ifdef HAVE_SYS_TYPES_H
2847            # include <sys/types.h>
2848            #endif
2849            #ifdef HAVE_SYS_SOCKET_H
2850            # include <sys/socket.h>
2851            #endif
2852            ])
2853         AC_MSG_CHECKING(for ifreq)
2854         AC_TRY_COMPILE([
2855                 #include <stdio.h>
2856                 #include <sys/ioctl.h>
2857                 #include <net/if.h>
2858                 ], [
2859                 struct ifconf ifc;
2860                 struct ifreq *ifr;
2861                 void *x;
2862                 ifc.ifc_len = 0;
2863                 ifc.ifc_buf = NULL;
2864                 x = (void *) &ifr->ifr_addr;
2865                 ],[
2866                         AC_MSG_RESULT(yes)
2867                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
2868                 ], [
2869                         AC_MSG_RESULT(no)
2870                 ])
2871         dnl **********************************
2872         dnl ***     Checks for sin_len     ***
2873         dnl **********************************
2874         AC_MSG_CHECKING(for sockaddr_in.sin_len)
2875         AC_TRY_COMPILE([
2876                 #include <netinet/in.h>
2877                 ], [
2878                 struct sockaddr_in saddr;
2879                 saddr.sin_len = sizeof (saddr);
2880                 ],[
2881                         AC_MSG_RESULT(yes)
2882                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
2883                 ], [
2884                         AC_MSG_RESULT(no)
2885                 ])      
2886         dnl **********************************
2887         dnl ***    Checks for sin6_len     ***
2888         dnl **********************************
2889         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
2890         AC_TRY_COMPILE([
2891                 #include <netinet/in.h>
2892                 ], [
2893                 struct sockaddr_in6 saddr6;
2894                 saddr6.sin6_len = sizeof (saddr6);
2895                 ],[
2896                         AC_MSG_RESULT(yes)
2897                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
2898                 ], [
2899                         AC_MSG_RESULT(no)
2900                 ])
2901         dnl **********************************
2902         dnl *** Check for getifaddrs       ***
2903         dnl **********************************
2904         AC_MSG_CHECKING(for getifaddrs)
2905                 AC_TRY_LINK([
2906                 #include <stdio.h>
2907                 #include <sys/types.h>
2908                 #include <sys/socket.h>
2909                 #include <ifaddrs.h>
2910         ], [
2911                 getifaddrs(NULL);
2912         ], [
2913                 # Yes, we have it...
2914                 AC_MSG_RESULT(yes)
2915                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
2916         ], [
2917                 AC_MSG_RESULT(no)
2918         ])
2919         dnl **********************************
2920         dnl *** Check for if_nametoindex   ***
2921         dnl **********************************
2922         AC_MSG_CHECKING(for if_nametoindex)
2923                 AC_TRY_LINK([
2924                 #include <stdio.h>
2925                 #include <sys/types.h>
2926                 #include <sys/socket.h>
2927                 #include <net/if.h>
2928         ], [
2929                 if_nametoindex(NULL);
2930         ], [
2931                 # Yes, we have it...
2932                 AC_MSG_RESULT(yes)
2933                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
2934         ], [
2935                 AC_MSG_RESULT(no)
2936         ])
2937         dnl **********************************
2938         dnl *** Check for access ***
2939         dnl **********************************
2940         AC_MSG_CHECKING(for access)
2941                 AC_TRY_LINK([
2942                 #include <unistd.h>
2943         ], [
2944                 access(NULL,0);
2945         ], [
2946                 # Yes, we have it...
2947                 AC_MSG_RESULT(yes)
2948                 AC_DEFINE(HAVE_ACCESS, 1, [Have access])
2949         ], [
2950                 AC_MSG_RESULT(no)
2951         ])
2952                         
2953         dnl **********************************
2954         dnl *** Checks for proclib         ***
2955         dnl **********************************
2956         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.)])
2957         dnl **********************************
2958         dnl *** Checks for MonoPosixHelper ***
2959         dnl **********************************
2960         AC_CHECK_HEADERS(checklist.h)
2961         AC_CHECK_HEADERS(pathconf.h)
2962         AC_CHECK_HEADERS(fstab.h)
2963         AC_CHECK_HEADERS(attr/xattr.h)
2964         AC_CHECK_HEADERS(sys/extattr.h)
2965         AC_CHECK_HEADERS(sys/sendfile.h)
2966         AC_CHECK_HEADERS(sys/statvfs.h)
2967         AC_CHECK_HEADERS(sys/statfs.h)
2968         AC_CHECK_HEADERS(sys/vfstab.h)
2969         AC_CHECK_HEADERS(sys/xattr.h)
2970         AC_CHECK_HEADERS(sys/mman.h)
2971         AC_CHECK_HEADERS(sys/param.h)
2972         AC_CHECK_HEADERS(sys/mount.h, [], [],
2973                 [
2974                 #ifdef HAVE_SYS_PARAM_H
2975                 # include <sys/param.h>
2976                 #endif
2977                 ])
2978         AC_CHECK_HEADERS(sys/mount.h)
2979         AC_CHECK_FUNCS(confstr)
2980         AC_CHECK_FUNCS(seekdir telldir)
2981         AC_CHECK_FUNCS(getdomainname)
2982         AC_CHECK_FUNCS(setdomainname)
2983         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
2984         AC_CHECK_FUNCS(setgroups)
2985         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
2986         AC_CHECK_FUNCS(getfsstat)
2987         AC_CHECK_FUNCS(lutimes futimes)
2988         AC_CHECK_FUNCS(mremap)
2989         AC_CHECK_FUNCS(remap_file_pages)
2990         AC_CHECK_FUNCS(posix_fadvise)
2991         AC_CHECK_FUNCS(posix_fallocate)
2992         AC_CHECK_FUNCS(posix_madvise)
2993         AC_CHECK_FUNCS(vsnprintf)
2994         AC_CHECK_FUNCS(sendfile)
2995         AC_CHECK_FUNCS(gethostid sethostid)
2996         AC_CHECK_FUNCS(sethostname)
2997         AC_CHECK_FUNCS(statfs)
2998         AC_CHECK_FUNCS(fstatfs)
2999         AC_CHECK_FUNCS(statvfs)
3000         AC_CHECK_FUNCS(fstatvfs)
3001         AC_CHECK_FUNCS(stime)
3002         AC_CHECK_FUNCS(ttyname_r)
3003         AC_CHECK_FUNCS(psignal)
3004         AC_CHECK_FUNCS(getlogin_r)
3005         AC_CHECK_FUNCS(lockf)
3006         AC_CHECK_FUNCS(swab)
3007         AC_CHECK_FUNCS(setusershell endusershell)
3008         AC_CHECK_FUNCS(futimens utimensat)
3009         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
3010         AC_CHECK_FUNCS(readv writev preadv pwritev)
3011         AC_CHECK_FUNCS(setpgid)
3012         AC_CHECK_FUNCS(system)
3013         AC_CHECK_FUNCS(fork execv execve)
3014         AC_CHECK_FUNCS(waitpid)
3015         AC_CHECK_FUNCS(accept4)
3016         AC_CHECK_FUNCS(localtime_r)
3017         AC_CHECK_FUNCS(mkdtemp)
3018         AC_CHECK_SIZEOF(size_t)
3019         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
3020                 [#include <sys/types.h>
3021                  #include <sys/stat.h>
3022                  #include <unistd.h>])
3023         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
3024                 [#include <sys/types.h>
3025                  #include <sys/stat.h>
3026                  #include <unistd.h>])
3027         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
3028                 [#include <sys/time.h>])
3029         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
3030                 [#include <sys/socket.h>])
3031         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
3032                 [#include <unistd.h>
3033                  #include <fcntl.h>])
3034         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
3035                 [#include <sys/uio.h>])
3036         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
3037                 [#include <sys/socket.h>])
3038         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
3039                 [#include <sys/poll.h>])
3040         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
3041                 [#include <sys/socket.h>])
3042         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
3043                 [#include <sys/socket.h>])
3044         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
3045                 [#include <netinet/in.h>])
3046         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
3047                 [#include <netinet/in.h>])
3048         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
3049                 [#include <sys/un.h>])
3050         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
3051                 [#include <sys/types.h>
3052                  #include <sys/stat.h>
3053                  #include <unistd.h>])
3054         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
3055                 [#include <time.h>])
3056         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
3057                 [#include <sys/time.h>
3058                  #include <sys/types.h>
3059                  #include <utime.h>])
3060         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
3061                 [#include <sys/time.h>])
3062         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
3063                 [#include <sys/types.h>
3064                  #include <utime.h>])
3065         AC_CHECK_MEMBERS(
3066                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
3067                 [#include <sys/types.h>
3068                  #include <dirent.h>])
3069         AC_CHECK_MEMBERS(
3070                 [struct passwd.pw_gecos],,, 
3071                 [#include <sys/types.h>
3072                  #include <pwd.h>])
3073         AC_CHECK_MEMBERS(
3074                 [struct statfs.f_flags],,, 
3075                 [#include <sys/types.h>
3076                  #include <sys/vfs.h>])
3077         AC_CHECK_MEMBERS(
3078                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
3079                 [#include <sys/types.h>
3080                  #include <sys/stat.h>
3081                  #include <unistd.h>])
3083         dnl Favour xattr through glibc, but use libattr if we have to
3084         AC_CHECK_FUNC(lsetxattr, ,
3085                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
3086         )
3087         AC_SUBST(XATTR_LIB)
3089         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
3090         AC_CHECK_MEMBERS(
3091                 [struct kinfo_proc.kp_proc],,, 
3092                 [#include <sys/types.h>
3093                  #include <sys/param.h>
3094                  #include <sys/sysctl.h>
3095                  #include <sys/proc.h>
3096                  ])
3098         dnl *********************************
3099         dnl *** Checks for Windows compilation ***
3100         dnl *********************************
3101         AC_CHECK_HEADERS(sys/time.h)
3102         AC_CHECK_HEADERS(sys/param.h)
3103         AC_CHECK_HEADERS(dirent.h)
3105         dnl ******************************************
3106         dnl *** Checks for OSX and iOS compilation ***
3107         dnl ******************************************
3108         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
3110         dnl *********************************
3111         dnl *** Check for Console 2.0 I/O ***
3112         dnl *********************************
3113         AC_CHECK_HEADERS([curses.h])
3114         AC_CHECK_HEADERS([term.h], [], [],
3115         [#if HAVE_CURSES_H
3116          #include <curses.h>
3117          #endif
3118         ])
3119         AC_CHECK_HEADERS([termios.h])
3121         dnl *********************************
3122         dnl *** Checks for random         ***
3123         dnl *********************************
3124         if test x$host_darwin = xno; then
3125                 AC_CHECK_HEADERS(sys/random.h)
3126                 AC_CHECK_FUNCS(getrandom getentropy)
3127         fi
3129         dnl *********************************
3130         dnl *** Checks for Mono.Native  ***
3131         dnl *********************************
3133         AC_MSG_CHECKING(for linux/in.h)
3134         AC_TRY_COMPILE([
3135                 #include <sys/socket.h>
3136                 #include <linux/in.h>
3137         ], [
3138         ],[
3139                 AC_MSG_RESULT(yes)
3140                 AC_DEFINE(HAVE_LINUX_IN_H, 1, [linux/in.h])
3141         ], [
3142                 AC_MSG_RESULT(no)
3143         ])
3145         AC_CHECK_HEADERS([linux/if_packet.h])
3147         AC_MSG_CHECKING(for struct in_pktinfo)
3148         AC_TRY_COMPILE([
3149                 #ifdef HAVE_LINUX_IN_H
3150                 #include <sys/socket.h>
3151                 #include <linux/in.h>
3152                 #else
3153                 #include <netinet/in.h>
3154                 #endif
3155         ], [
3156                 struct in_pktinfo pktinfo;
3157         ],[
3158                 AC_MSG_RESULT(yes)
3159                 AC_DEFINE(HAVE_IN_PKTINFO, 1, [struct in_pktinfo])
3160         ], [
3161                 AC_MSG_RESULT(no)
3162         ])
3164         AC_MSG_CHECKING(for struct ip_mreqn)
3165         AC_TRY_COMPILE([
3166                 #if HAVE_LINUX_IN_H
3167                 #include <sys/socket.h>
3168                 #include <linux/in.h>
3169                 #else
3170                 #include <netinet/in.h>
3171                 #endif
3172         ], [
3173                 struct ip_mreqn mreqn;
3174         ],[
3175                 AC_MSG_RESULT(yes)
3176                 AC_DEFINE(HAVE_IP_MREQN, 1, struct ip_mreqn)
3177         ], [
3178                 AC_MSG_RESULT(no)
3179         ])
3181         if test x$host_darwin = xno; then
3182                 AC_CHECK_TYPES([struct flock64], [AC_DEFINE(HAVE_FLOCK64, 1, struct flock64)], , [#include <fcntl.h>])
3183         fi
3185         if test x$mono_native_platform_ios = xno; then
3186                 # On iOS, `stat64()` is deprecated and there is no `struct stat64` and `stat()`
3187                 # is either 32-bit or 64-bit based on the device / simulator that you're running on.
3188                 AC_CHECK_FUNC(stat64,            [AC_DEFINE(HAVE_STAT64, 1, [stat64])])
3189         fi
3191         AC_CHECK_FUNC(lseek64,           [AC_DEFINE(HAVE_LSEEK64, 1, [lseek64])])
3192         AC_CHECK_FUNC(mmap64,            [AC_DEFINE(HAVE_MMAP64, 1, [mmap64])])
3193         AC_CHECK_FUNC(ftruncate64,       [AC_DEFINE(HAVE_FTRUNCATE64, 1, [ftruncate64])])
3194         AC_CHECK_FUNC(posix_fadvise64,   [AC_DEFINE(HAVE_POSIX_FADVISE64, 1, [posix_fadvise64])])
3195         AC_CHECK_DECL(pipe2,             [AC_DEFINE(HAVE_PIPE2, 1, [pipe2])])
3196         AC_CHECK_FUNC(getmntinfo,        [AC_DEFINE(HAVE_GETMNTINFO, 1, [getmntinfo])], [], [[#include <unistd.h>]])
3197         AC_CHECK_FUNC(strcpy_s,          [AC_DEFINE(HAVE_STRCPY_S, 1, [strcpy_s])])
3198         AC_CHECK_FUNC(strlcpy,           [AC_DEFINE(HAVE_STRLCPY, 1, [strlcpy])])
3199         AC_CHECK_FUNC(posix_fadvise,     [AC_DEFINE(HAVE_POSIX_FADVISE, 1, [posix_fadvise])])
3200         AC_CHECK_FUNC(ioctl,             [AC_DEFINE(HAVE_IOCTL, 1, [ioctl])])
3201         AC_CHECK_FUNC(sched_getaffinity, [AC_DEFINE(HAVE_SCHED_GETAFFINITY, 1, [sched_getaffinity])])
3202         AC_CHECK_FUNC(sched_setaffinity, [AC_DEFINE(HAVE_SCHED_SETAFFINITY, 1, [sched_setaffinity])])
3203         AC_CHECK_DECL(TIOCGWINSZ,        [AC_DEFINE(HAVE_TIOCGWINSZ, 1, [TIOCGWINSZ])], [], [[#include <sys/ioctl.h>]])
3204         AC_CHECK_FUNC(tcgetattr,         [AC_DEFINE(HAVE_TCGETATTR, 1, [tcgetattr])])
3205         AC_CHECK_FUNC(tcsetattr,         [AC_DEFINE(HAVE_TCSETATTR, 1, [tcsetattr])])
3206         AC_CHECK_FUNC(arc4random_buf,    [AC_DEFINE(HAVE_ARC4RANDOM_BUF, 1, [arc4random_buf])])
3207         AC_CHECK_DECL(ECHO,              [AC_DEFINE(HAVE_ECHO, 1, [ECHO])], [], [[#include <termios.h>]])
3208         AC_CHECK_DECL(ICANON,            [AC_DEFINE(HAVE_ICANON, 1, [ICANON])], [], [[#include <termios.h>]])
3209         AC_CHECK_DECL(TCSANOW,           [AC_DEFINE(HAVE_TCSANOW, 1, [TCSANOW])], [], [[#include <termios.h>]])
3211         AC_CHECK_DECL(O_CLOEXEC,         [AC_DEFINE(HAVE_O_CLOEXEC, 1, [O_CLOEXEC])], [], [[#include <fcntl.h>]])
3212         AC_CHECK_DECL(F_DUPFD_CLOEXEC,   [AC_DEFINE(HAVE_F_DUPFD_CLOEXEC, 1, [F_DUPFD_CLOEXEC])], [], [[#include <fcntl.h>]])
3214         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>]])
3215         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>]])
3216         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>]])
3217         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>]])
3218         AC_CHECK_MEMBER(struct dirent.d_namlen,       [AC_DEFINE(HAVE_DIRENT_NAME_LEN, 1, [struct dirent.d_namlen])], [], [[#include <dirent.h>]])
3219         AC_CHECK_MEMBER(struct statfs.f_fstypename,   [AC_DEFINE(HAVE_STATFS_FSTYPENAME, 1, [struct statfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3220         AC_CHECK_MEMBER(struct statvfs.f_fstypename,  [AC_DEFINE(HAVE_STATVFS_FSTYPENAME, 1, [struct statvfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3222         AC_MSG_CHECKING(for struct statfs)
3223         AC_TRY_COMPILE([
3224                 #if defined(HAVE_STATFS_FSTYPENAME) || defined(HAVE_STATVFS_FSTYPENAME)
3225                 #include <sys/mount.h>
3226                 #else
3227                 #include <sys/statfs.h>
3228                 #endif
3229         ], [
3230                 struct statfs;
3231         ],[
3232                 AC_MSG_RESULT(yes)
3233                 AC_DEFINE(HAVE_STATFS, 1, [struct statfs])
3234         ], [
3235                 AC_MSG_RESULT(no)
3236         ])
3238         if test "x$ac_cv_func_strerror_r_char_p" = "xyes" ; then
3239                 AC_DEFINE(HAVE_GNU_STRERROR_R, 1, [char* strerror(int errnum, char *buf, size_t buflen)])
3240         fi
3242         AC_MSG_CHECKING(for readdir_r)
3243         AC_TRY_COMPILE([
3244                 #include <dirent.h>
3245         ], [
3246                 DIR* dir;
3247                 struct dirent* entry;
3248                 struct dirent* result;
3249                 readdir_r(dir, entry, &result);
3250         ],[
3251                 AC_MSG_RESULT(yes)
3252                 AC_DEFINE(HAVE_READDIR_R, 1, [readdir_r])
3253         ], [
3254                 AC_MSG_RESULT(no)
3255         ])
3257         AC_MSG_CHECKING(for kevent with void *data)
3258         AC_TRY_COMPILE([
3259                 #include <sys/types.h>
3260                 #include <sys/event.h>
3261         ], [
3262                 struct kevent event;
3263                 void* data;
3264                 EV_SET(&event, 0, EVFILT_READ, 0, 0, 0, data);
3265         ],[
3266                 AC_MSG_RESULT(yes)
3267                 AC_DEFINE(KEVENT_HAS_VOID_UDATA, 1, [kevent with void *data])
3268         ], [
3269                 AC_MSG_RESULT(no)
3270         ])
3272         AC_CHECK_MEMBER(struct fd_set.fds_bits,   [AC_DEFINE(HAVE_FDS_BITS, 1, [struct fd_set.fds_bits])], [], [[#include <sys/select.h>]])
3273         AC_CHECK_MEMBER(struct fd_set.__fds_bits, [AC_DEFINE(HAVE_PRIVATE_FDS_BITS, 1, [struct fd_set.__fds_bits])], [], [[#include <sys/select.h>]])
3275         AC_MSG_CHECKING(for sendfile with 4 arguments)
3276         AC_TRY_COMPILE([
3277                 #include <sys/sendfile.h>
3278         ], [
3279                 int result = sendfile(0, 0, 0, 0);
3280         ],[
3281                 AC_MSG_RESULT(yes)
3282                 AC_DEFINE(HAVE_SENDFILE_4, 1, [sendfile with 4 arguments])
3283         ], [
3284                 AC_MSG_RESULT(no)
3285         ])
3287         AC_MSG_CHECKING(for sendfile with 6 arguments)
3288         AC_TRY_LINK([
3289                 #include <stdlib.h>
3290                 #include <sys/types.h>
3291                 #include <sys/socket.h>
3292                 #include <sys/uio.h>
3293         ], [
3294                 int result = sendfile(0, 0, 0, NULL, NULL, 0);
3295         ],[
3296                 AC_MSG_RESULT(yes)
3297                 AC_DEFINE(HAVE_SENDFILE_6, 1, [sendfile with 6 arguments])
3298         ], [
3299                 AC_MSG_RESULT(no)
3300         ])
3302         AC_CHECK_FUNC(fcopyfile,     [AC_DEFINE(HAVE_FCOPYFILE, 1, [fcopyfile])])
3303         AC_CHECK_FUNC(epoll_create1, [AC_DEFINE(HAVE_EPOLL, 1, [epoll_create1])])
3304         AC_CHECK_FUNC(accept4,       [AC_DEFINE(HAVE_ACCEPT4, 1, [accept4])])
3305         AC_CHECK_FUNC(kqueue,        [AC_DEFINE(HAVE_KQUEUE, 1, [kqueue])])
3307         ORIG_CFLAGS="$CFLAGS"
3308         CFLAGS="-Werror -Wsign-conversion"
3310         AC_MSG_CHECKING(for getnameinfo with signed flags)
3311         AC_TRY_COMPILE([
3312                 #include <sys/types.h>
3313                 #include <netdb.h>
3314         ], [
3315                 const struct sockaddr *addr;
3316                 socklen_t addrlen;
3317                 char *host;
3318                 socklen_t hostlen;
3319                 char *serv;
3320                 socklen_t servlen;
3321                 int flags;
3322                 int result = getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags);
3323         ],[
3324                 AC_MSG_RESULT(yes)
3325                 AC_DEFINE(HAVE_GETNAMEINFO_SIGNED_FLAGS, 1, [getnameinfo with signed flags])
3326         ], [
3327                 AC_MSG_RESULT(no)
3328         ])
3330         CFLAGS="$ORIG_CFLAGS"
3332         if test "x$host_linux" = "xyes"; then
3333                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 1, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3334         else
3335                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 0, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3336         fi
3338         ORIG_CFLAGS="$CFLAGS"
3339         CFLAGS="-Werror -Wsign-conversion"
3341         AC_MSG_CHECKING(for bind with unsigned addrlen)
3342         AC_TRY_COMPILE([
3343                 #include <sys/socket.h>
3344         ], [
3345                 int fd;
3346                 struct sockaddr* addr;
3347                 socklen_t addrLen;
3348                 bind(fd, addr, addrLen);
3349         ],[
3350                 AC_MSG_RESULT(yes)
3351                 AC_DEFINE(BIND_ADDRLEN_UNSIGNED, 1, [bind with unsigned addrlen])
3352         ], [
3353                 AC_MSG_RESULT(no)
3354         ])
3356         AC_MSG_CHECKING(for struct ipv6_mreq with unsigned ipv6mr_interface)
3357         AC_TRY_COMPILE([
3358                 #include <netinet/in.h>
3359                 #include <netinet/tcp.h>
3360         ], [
3361                 struct ipv6_mreq opt;
3362                 unsigned int index = 0;
3363                 opt.ipv6mr_interface = index;
3364         ],[
3365                 AC_MSG_RESULT(yes)
3366                 AC_DEFINE(IPV6MR_INTERFACE_UNSIGNED, 1, [struct ipv6_mreq with unsigned ipv6mr_interface])
3367         ], [
3368                 AC_MSG_RESULT(no)
3369         ])
3371         AC_MSG_CHECKING(for inotify_rm_watch with unsigned wd)
3372         AC_TRY_COMPILE([
3373                 #include <sys/inotify.h>
3374         ], [
3375                 intptr_t fd;
3376                 uint32_t wd;
3377                 int result = inotify_rm_watch(fd, wd);
3378         ],[
3379                 AC_MSG_RESULT(yes)
3380                 AC_DEFINE(INOTIFY_RM_WATCH_WD_UNSIGNED, 1, [inotify_rm_watch with unsigned wd])
3381         ], [
3382                 AC_MSG_RESULT(no)
3383         ])
3385         CFLAGS="$ORIG_CFLAGS"
3387         AC_MSG_CHECKING(for shm_open that works well enough with mmap)
3388         if test "x$ac_cv_func_shm_open" = "xno" -o "x$ac_cv_func_shm_open_working_with_mmap" = "xno" ; then
3389                 AC_MSG_RESULT(no)
3390         elif test "x$cross_compiling" = "xyes"; then
3391                 AC_MSG_RESULT(cross compiling, assuming yes)
3392                 AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3393         else
3394                 AC_TRY_RUN([
3395                         #include <sys/mman.h>
3396                         #include <fcntl.h>
3397                         #include <unistd.h>
3399                         int main ()
3400                         {
3401                                 int fd = shm_open("/mono_configure_shm_open", O_CREAT | O_RDWR, 0777);
3402                                 if (fd == -1)
3403                                         return -1;
3405                                 shm_unlink("/mono_configure_shm_open");
3407                                 // NOTE: PROT_EXEC and MAP_PRIVATE don't work well with shm_open
3408                                 //       on at least the current version of Mac OS X
3410                                 if (mmap(NULL, 1, PROT_EXEC, MAP_PRIVATE, fd, 0) == MAP_FAILED)
3411                                         return -1;
3413                                 return 0;
3414                         }
3415                 ],[
3416                         AC_MSG_RESULT(yes)
3417                         AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3418                 ], [
3419                         AC_MSG_RESULT(no)
3420                 ])
3421         fi
3423         AC_MSG_CHECKING(for getpriority with int who)
3424         AC_TRY_COMPILE([
3425                 #include <sys/resource.h>
3426         ], [
3427                 int which;
3428                 int who;
3429                 int result = getpriority(which, who);
3430         ],[
3431                 AC_MSG_RESULT(yes)
3432                 AC_DEFINE(PRIORITY_REQUIRES_INT_WHO, 1, [getpriority with int who])
3433         ], [
3434                 AC_MSG_RESULT(no)
3435         ])
3437         AC_MSG_CHECKING(for kevent with int parameters)
3438         AC_TRY_COMPILE([
3439                 #include <sys/types.h>
3440                 #include <sys/event.h>
3441         ], [
3442                 int kg;
3443                 const struct kevent* chagelist;
3444                 int nchanges;
3445                 struct kevent* eventlist;
3446                 int nevents;
3447                 const struct timespec* timeout;
3448                 int result = kevent(kg, chagelist, nchanges, eventlist, nevents, timeout);
3449         ],[
3450                 AC_MSG_RESULT(yes)
3451                 AC_DEFINE(KEVENT_REQUIRES_INT_PARAMS, 1, [kevent with int parameters])
3452         ], [
3453                 AC_MSG_RESULT(no)
3454         ])
3456         ORIG_CFLAGS="$CFLAGS"
3457         CFLAGS="-Werror -Wimplicit-function-declaration"
3459         AC_MSG_CHECKING(for mkstemps)
3460         AC_TRY_COMPILE([
3461                 #include <stdlib.h>
3462                 #include <unistd.h>
3463                 #include <string.h>
3464         ], [
3465                 char *template;
3466                 int suffixlen;
3467                 int result = mkstemps(template, suffixlen);
3468         ],[
3469                 AC_MSG_RESULT(yes)
3470                 AC_DEFINE(HAVE_MKSTEMPS, 1, [mkstemps])
3471                 have_mkstemps=yes
3472         ], [
3473                 AC_MSG_RESULT(no)
3474         ])
3476         CFLAGS="$ORIG_CFLAGS"
3478         if test "x$have_mkstemps" != "xyes" -a "x$ac_cv_func_mkstemp" != "xyes"; then
3479                 AC_MSG_ERROR([Cannot find mkstemps or mkstemp on this platform])
3480         fi
3482         AC_MSG_CHECKING(for tcp/var.h)
3483         AC_TRY_COMPILE([
3484                 #include <sys/types.h>
3485                 #include <sys/socketvar.h>
3486                 #include <netinet/ip.h>
3487                 #include <netinet/tcp.h>
3488                 #include <netinet/tcp_var.h>
3489         ], [
3490         ],[
3491                 AC_MSG_RESULT(yes)
3492                 AC_DEFINE(HAVE_TCP_VAR_H, 1, [tcp/var.h])
3493         ], [
3494                 AC_MSG_RESULT(no)
3495         ])
3497         AC_CHECK_HEADERS([sys/cdefs.h])
3499         AC_MSG_CHECKING(for TCPSTATE enum in netinet/tcp.h)
3500         AC_TRY_COMPILE([
3501                 #ifdef HAVE_SYS_CDEFS_H
3502                 #include <sys/cdefs.h>
3503                 #endif
3504                 #include <netinet/tcp.h>
3505         ], [
3506                 int result = TCP_ESTABLISHED;
3507         ],[
3508                 AC_MSG_RESULT(yes)
3509                 AC_DEFINE(HAVE_TCP_H_TCPSTATE_ENUM, 1, [TCPSTATE enum in netinet/tcp.h])
3510         ], [
3511                 AC_MSG_RESULT(no)
3512         ])
3514         AC_CHECK_DECL(TCPS_ESTABLISHED, [AC_DEFINE(HAVE_TCP_FSM_H, 1, [HAVE_TCP_FSM_H])], [], [[#include <netinet/tcp_fsm.h>]])
3516         AC_MSG_CHECKING(for struct rt_msghdr)
3517         AC_TRY_COMPILE([
3518                 #include <sys/types.h>
3519                 #include <net/route.h>
3520         ], [
3521                 struct rt_msghdr;
3522         ],[
3523                 AC_MSG_RESULT(yes)
3524                 AC_DEFINE(HAVE_RT_MSGHDR, 1, [struct rt_msghdr])
3525         ], [
3526                 AC_MSG_RESULT(no)
3527         ])
3529         AC_CHECK_HEADERS([sys/sysctl.h])
3530         AC_CHECK_HEADERS([linux/rtnetlink.h])
3532         AC_CHECK_FUNC(getpeereid,    [AC_DEFINE(HAVE_GETPEEREID, 1, [getpeereid])])
3533         AC_CHECK_FUNC(getdomainname, [AC_DEFINE(HAVE_GETDOMAINNAME, 1, [getdomainname])])
3534         AC_CHECK_FUNC(uname,         [AC_DEFINE(HAVE_UNAME, 1, [uname])])
3536         ORIG_CFLAGS="$CFLAGS"
3537         CFLAGS="-Werror -Weverything"
3539         AC_MSG_CHECKING(for getdomainname with size_t namelen)
3540         AC_TRY_COMPILE([
3541                 #include <unistd.h>
3542         ], [
3543                 size_t namelen = 20;
3544                 char name[20];
3545                 int result = getdomainname(name, namelen);
3546         ],[
3547                 AC_MSG_RESULT(yes)
3548                 AC_DEFINE(HAVE_GETDOMAINNAME_SIZET, 1, [getdomainname with size_t namelen])
3549         ], [
3550                 AC_MSG_RESULT(no)
3551         ])
3553         CFLAGS="$ORIG_CFLAGS"
3555         AC_CHECK_FUNC(inotify_init, [AC_DEFINE(HAVE_INOTIFY_INIT, 1, [inotify_init])])
3556         AC_CHECK_FUNC(inotify_add_watch, [AC_DEFINE(HAVE_INOTIFY_ADD_WATCH, 1, [inotify_add_watch])])
3557         AC_CHECK_FUNC(inotify_rm_watch, [AC_DEFINE(HAVE_INOTIFY_RM_WATCH, 1, [inotify_rm_watch])])
3559         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
3560                 AC_DEFINE(HAVE_INOTIFY, 1, [HAVE_INOTIFY])
3561         elif test "x$host_linux" = "xyes"; then
3562                 AC_MSG_ERROR([Cannot find inotify functions on a Linux platform.])
3563         fi
3565         AC_CHECK_HEADERS([crt_externs.h])
3567         AC_MSG_CHECKING(for _NSGetEnviron)
3568         AC_TRY_COMPILE([
3569                 #include <crt_externs.h>
3570         ], [
3571                 char **result = *(_NSGetEnviron());
3572         ],[
3573                 AC_MSG_RESULT(yes)
3574                 AC_DEFINE(HAVE_NSGETENVIRON, 1, [_NSGetEnviron])
3575         ], [
3576                 AC_MSG_RESULT(no)
3577         ])
3579         AC_CHECK_DECL(IN_EXCL_UNLINK, [AC_DEFINE(HAVE_IN_EXCL_UNLINK, 1, [IN_EXCL_UNLINK])], [], [[#include <sys/inotify.h>]])
3581 else
3582         dnl *********************************
3583         dnl *** Checks for Windows compilation ***
3584         dnl *********************************
3585         AC_CHECK_HEADERS(winternl.h)
3587         jdk_headers_found=no
3588         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
3589         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
3590         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
3591         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
3592         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
3593         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
3594         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
3596         dnl *********************************
3597         dnl *** Check for struct ip_mreqn ***
3598         dnl *********************************
3599         AC_MSG_CHECKING(for struct ip_mreqn)
3600         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3601                 struct ip_mreqn mreq;
3602                 mreq.imr_address.s_addr = 0;
3603         ], [
3604                 # Yes, we have it...
3605                 AC_MSG_RESULT(yes)
3606                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
3607         ], [
3608                 # We'll just have to try and use struct ip_mreq
3609                 AC_MSG_RESULT(no)
3610                 AC_MSG_CHECKING(for struct ip_mreq)
3611                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3612                         struct ip_mreq mreq;
3613                         mreq.imr_interface.s_addr = 0;
3614                 ], [
3615                         # Yes, we have it...
3616                         AC_MSG_RESULT(yes)
3617                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
3618                 ], [
3619                         # No multicast support
3620                         AC_MSG_RESULT(no)
3621                 ])
3622         ])
3624         dnl **********************************
3625         dnl *** Check for getaddrinfo ***
3626         dnl **********************************
3627         AC_MSG_CHECKING(for getaddrinfo)
3628                 AC_TRY_LINK([
3629                 #include <stdio.h>
3630                 #include <winsock2.h>
3631                 #include <ws2tcpip.h>
3632         ], [
3633                 getaddrinfo(NULL,NULL,NULL,NULL);
3634         ], [
3635                 # Yes, we have it...
3636                 AC_MSG_RESULT(yes)
3637                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
3638         ], [
3639                 AC_MSG_RESULT(no)
3640         ])
3642         dnl **********************************
3643         dnl *** Check for gethostbyname ***
3644         dnl **********************************
3645         AC_MSG_CHECKING(for gethostbyname)
3646                 AC_TRY_LINK([
3647                 #include <stdio.h>
3648                 #include <winsock2.h>
3649                 #include <ws2tcpip.h>
3650         ], [
3651                 gethostbyname(NULL);
3652         ], [
3653                 # Yes, we have it...
3654                 AC_MSG_RESULT(yes)
3655                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
3656         ], [
3657                 AC_MSG_RESULT(no)
3658         ])
3660         dnl **********************************
3661         dnl *** Check for getprotobyname ***
3662         dnl **********************************
3663         AC_MSG_CHECKING(for getprotobyname)
3664                 AC_TRY_LINK([
3665                 #include <stdio.h>
3666                 #include <winsock2.h>
3667                 #include <ws2tcpip.h>
3668         ], [
3669                 getprotobyname(NULL);
3670         ], [
3671                 # Yes, we have it...
3672                 AC_MSG_RESULT(yes)
3673                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
3674         ], [
3675                 AC_MSG_RESULT(no)
3676         ])
3678         dnl **********************************
3679         dnl *** Check for getnameinfo ***
3680         dnl **********************************
3681         AC_MSG_CHECKING(for getnameinfo)
3682                 AC_TRY_LINK([
3683                 #include <stdio.h>
3684                 #include <winsock2.h>
3685                 #include <ws2tcpip.h>
3686         ], [
3687                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
3688         ], [
3689                 # Yes, we have it...
3690                 AC_MSG_RESULT(yes)
3691                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
3692         ], [
3693                 AC_MSG_RESULT(no)
3694         ])
3696         dnl **********************************
3697         dnl *** Check for inet_ntop ***
3698         dnl **********************************
3699         AC_MSG_CHECKING(for inet_ntop)
3700                 AC_TRY_LINK([
3701                 #include <stdio.h>
3702                 #include <winsock2.h>
3703                 #include <ws2tcpip.h>
3704         ], [
3705                 inet_ntop (0, NULL, NULL, 0);
3706         ], [
3707                 # Yes, we have it...
3708                 AC_MSG_RESULT(yes)
3709                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
3710         ], [
3711                 AC_MSG_RESULT(no)
3712         ])
3714         dnl **********************************
3715         dnl *** Check for inet_pton ***
3716         dnl **********************************
3717         AC_MSG_CHECKING(for inet_pton)
3718                 AC_TRY_LINK([
3719                 #include <stdio.h>
3720                 #include <winsock2.h>
3721                 #include <ws2tcpip.h>
3722         ], [
3723                 #ifndef inet_pton
3724                 (void) inet_pton;
3725                 #endif
3726                 inet_pton (0, NULL, NULL);
3727         ], [
3728                 # Yes, we have it...
3729                 AC_MSG_RESULT(yes)
3730                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
3731         ], [
3732                 AC_MSG_RESULT(no)
3733         ])
3735         AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
3736         AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
3737         AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
3738         AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
3739         AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
3740         AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
3741         AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
3744 dnl socklen_t check
3745 AC_MSG_CHECKING(for socklen_t)
3746 AC_TRY_COMPILE([
3747 #include <sys/types.h>
3748 #include <sys/socket.h>
3750   socklen_t foo;
3752 ac_cv_c_socklen_t=yes
3753         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
3754         AC_MSG_RESULT(yes)
3756         AC_MSG_RESULT(no)
3759 AC_CHECK_FUNCS(execvp)
3761 dnl ****************************
3762 dnl *** Look for /dev/random ***
3763 dnl ****************************
3765 AC_MSG_CHECKING([if usage of random device is requested])
3766 AC_ARG_ENABLE(dev-random,
3767 [  --disable-dev-random    disable the use of the random device (enabled by default)],
3768 try_dev_random=$enableval, try_dev_random=yes)
3770 AC_MSG_RESULT($try_dev_random)
3772 case "{$build}" in
3774 dnl IBM i does not have /dev/random, use unblocking only
3776     *-*-os400*)
3777     NAME_DEV_RANDOM="/dev/urandom"
3778     ;;
3780 dnl Win32 does not have /dev/random, they have their own method...
3782     *-mingw*|*-*-cygwin*)
3783     ac_cv_have_dev_random=no
3784     ;;
3786 dnl Everywhere else, it's /dev/random
3788     *)
3789     NAME_DEV_RANDOM="/dev/random"
3790     ;;
3791 esac
3793 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
3795 dnl Now check if the device actually exists
3797 if test "x$try_dev_random" = "xyes"; then
3798     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
3799     [if test -r "$NAME_DEV_RANDOM" ; then
3800         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
3801     if test "x$ac_cv_have_dev_random" = "xyes"; then
3802         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
3803     fi
3804 else
3805     AC_MSG_CHECKING(for random device)
3806     ac_cv_have_dev_random=no
3807     AC_MSG_RESULT(has been disabled)
3810 if test "x$host_win32" = "xyes"; then
3811     AC_DEFINE(HAVE_CRYPT_RNG)
3814 if test "x$ac_cv_have_dev_random" = "xno" \
3815     && test "x$host_win32" = "xno"; then
3816     AC_MSG_WARN([[
3818 *** A system-provided entropy source was not found on this system.
3819 *** Because of this, the System.Security.Cryptography random number generator
3820 *** will throw a NotImplemented exception.
3822 *** If you are seeing this message, and you know your system DOES have an
3823 *** entropy collection in place, please report an issue on GitHub and
3824 *** provide information about the system and how to access the random device.
3826 *** Otherwise you can install either egd or prngd and set the environment
3827 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
3828 ***]])
3831 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)
3833 AC_MSG_CHECKING([if big-arrays are to be enabled])
3834 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)
3835 if test "x$enable_big_arrays" = "xyes" ; then
3836     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
3837         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
3838     else
3839         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
3840     fi
3842 AC_MSG_RESULT($enable_big_arrays)
3844 dnl **************
3845 dnl *** DTRACE ***
3846 dnl **************
3848 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
3850 if test "x$enable_dtrace" = "xyes"; then
3851    if test "x$has_dtrace" = "xno"; then
3852           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
3853    fi
3854    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
3855    if test "x$DTRACE" = "xno"; then
3856           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
3857           enable_dtrace=no
3858    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
3859           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
3860           enable_dtrace=no
3861    fi
3864 dtrace_g=no
3865 if test "x$enable_dtrace" = "xyes"; then
3866         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
3867         DTRACEFLAGS=
3868         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3869                 case "$host" in
3870                         powerpc-*-darwin*)
3871                         DTRACEFLAGS="-arch ppc64"
3872                         ;;
3873                         i*86-*-darwin*)
3874                         DTRACEFLAGS="-arch x86_64"
3875                         ;;
3876                         *)
3877                         DTRACEFLAGS=-64
3878                         ;;
3879                 esac
3880         else
3881                 case "$host" in
3882                         powerpc-*-darwin*)
3883                         DTRACEFLAGS="-arch ppc"
3884                         ;;
3885                         i*86-*-darwin*)
3886                         DTRACEFLAGS="-arch i386"
3887                         ;;
3888                         *)
3889                         DTRACEFLAGS=-32
3890                         ;;
3891                 esac
3892         fi
3893         AC_SUBST(DTRACEFLAGS)
3894         case "$host" in
3895                 *-*-solaris*)
3896                 dtrace_g=yes
3897                 ;;
3898         esac
3899         AC_CHECK_HEADERS([sys/sdt.h])
3901 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
3902 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
3904 dnl **************************
3905 dnl *** AOT cross offsets  ***
3906 dnl **************************
3908 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
3909     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
3911 dnl **************
3912 dnl ***  LLVM  ***
3913 dnl **************
3915 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
3916 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
3917 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)
3918 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
3919 AC_ARG_ENABLE(llvm-asserts,[  --enable-llvm-asserts Enable llvm asserts (option to LLVM in CMake)], enable_llvm_asserts=$enableval, enable_llvm_asserts=no)
3921 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
3923 if test "x$enable_llvm" = "xdefault"; then
3924    enable_llvm=$enable_llvm_default
3927 enable_llvm_msvc_only="no"
3928 if test "x$enable_llvm" = "xyes"; then
3929         if test "x$host_win32" = "xyes"; then
3930                 if test "x$cross_compiling" = "xno"; then
3931                         case "$target" in
3932                         x86_64*)
3933                                 AC_MSG_WARN("LLVM for host=Windows and target=Windows is only supported on x64 MSVC builds. Disabling LLVM for GCC build.")
3934                                 enable_llvm_msvc_only="yes"
3935                                 ;;
3936                         i686*)
3937                                 AC_MSG_ERROR("LLVM for host=Windows and target=Windows is only supported for x64 builds.")
3938                                 ;;
3939                         esac
3940                 fi
3941                 if test "x$enable_loadedllvm" = "xyes"; then
3942                         AC_MSG_WARN("Loadable LLVM currently not supported on Windows. Disabling feature.")
3943                         enable_loadedllvm=no
3944                 fi
3945         fi
3948 internal_llvm="no"
3949 if test "x$enable_llvm" = "xyes"; then
3950         if test "x$with_llvm" != "x"; then
3951                 EXTERNAL_LLVM_CONFIG=$with_llvm/bin/llvm-config
3952                 if test x$host_win32 = xyes; then
3953                         EXTERNAL_LLVM_CONFIG=$EXTERNAL_LLVM_CONFIG.exe
3954                 fi
3955                 if test ! -x $EXTERNAL_LLVM_CONFIG; then
3956                         AC_MSG_ERROR([LLVM executable $EXTERNAL_LLVM_CONFIG not found.])
3957                 fi
3958         else
3959                 if test x$host_win32 = xyes; then
3960                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config.exe, no)
3961                 else
3962                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config, no)
3963                 fi
3964                 if test "x$EXTERNAL_LLVM_CONFIG" = "xno"; then
3965                         internal_llvm=yes
3966                 fi
3967         fi
3969         LLVM_CODEGEN_LIBS="x86codegen"
3970         case "$target" in
3971         arm*)
3972                 LLVM_CODEGEN_LIBS="armcodegen"
3973                 ;;
3974         aarch64*)
3975                 LLVM_CODEGEN_LIBS="aarch64codegen"
3976                 ;;
3977         powerpc*)
3978                 LLVM_CODEGEN_LIBS="powerpccodegen"
3979                 ;;
3980         esac
3981         if test "x$host" != "x$target"; then
3982                 # No need for jit libs
3983                 LLVM_CODEGEN_LIBS=
3984         fi
3986         AC_SUBST(LLVM_CODEGEN_LIBS)
3987         AC_SUBST(EXTERNAL_LLVM_CONFIG)
3989         if test "x$host_win32" = "xyes" && test "x$cross_compiling" = "xno" &&  test "x$internal_llvm" = "xno"; then
3990                 EXTERNAL_LLVM_CONFIG_WIN32=$(cygpath -m $EXTERNAL_LLVM_CONFIG)
3991                 AC_SUBST(EXTERNAL_LLVM_CONFIG_WIN32)
3992         fi
3993         if test "x$enable_llvm_msvc_only" != "xyes"; then
3994                 AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
3995         else
3996                 AC_DEFINE(ENABLE_LLVM_MSVC_ONLY, 1, [Enable the LLVM back end])
3997         fi
3998 fi # ENABLE_LLVM
4000 # AC_DEFINE necessary for correct restore behavior on Linux
4001 AM_CONDITIONAL(INTERNAL_LLVM, [test "x$internal_llvm" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
4002 if test "x$internal_llvm" != "xno"; then
4003         if test "x$enable_llvm_msvc_only" != "xyes"; then
4004                 AC_DEFINE(INTERNAL_LLVM, 1, [LLVM used is being build during mono build])
4005         else
4006                 AC_DEFINE(INTERNAL_LLVM_MSVC_ONLY, 1, [LLVM used is being build during mono build])
4007         fi
4010 AM_CONDITIONAL(INTERNAL_LLVM_ASSERTS, [test "x$enable_llvm_asserts" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
4011 if test "x$enable_llvm_asserts" != "xno"; then
4012         if test "x$enable_llvm_msvc_only" != "xyes"; then
4013                 AC_DEFINE(INTERNAL_LLVM_ASSERTS, 1, [Build LLVM with assertions])
4014         else
4015                 AC_DEFINE(INTERNAL_LLVM_ASSERTS_MSVC_ONLY, 1, [Build LLVM with assertions])
4016         fi
4019 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes && test x$enable_llvm_msvc_only != xyes])
4021 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes && test x$enable_llvm_msvc_only != xyes])
4022 if test "x$enable_loadedllvm" = "xyes"; then
4023         if test "x$enable_llvm_msvc_only" != "xyes"; then
4024                 AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
4025         fi
4028 if test "x$enable_llvm" = "xyes"; then
4029         enable_llvm_runtime=yes
4032 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes && test x$enable_llvm_msvc_only != xyes])
4033 if test "x$enable_llvm_runtime" = "xyes"; then
4034         if test "x$enable_llvm_msvc_only" != "xyes"; then
4035                 AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
4036         else
4037                 AC_DEFINE(ENABLE_LLVM_RUNTIME_MSVC_ONLY, 1, [Runtime support code for llvm enabled])
4038         fi
4041 TARGET="unknown"
4042 ACCESS_UNALIGNED="yes"
4044 LIBC="libc.so.6"
4045 INTL="libc.so.6"
4046 SQLITE="libsqlite.so.0"
4047 SQLITE3="libsqlite3.so.0"
4048 X11="libX11.so"
4049 GDKX11="libgdk-x11-2.0.so.0"
4050 GTKX11="libgtk-x11-2.0.so.0"
4051 XINERAMA="libXinerama.so.1"
4053 sizeof_register="SIZEOF_VOID_P"
4055 jit_wanted=true
4056 boehm_supported=true
4057 BTLS_SUPPORTED=no
4058 BTLS_PLATFORM=
4060 case "$host" in
4061         wasm32*)
4062                 TARGET=WASM
4063                 arch_target=wasm
4064                 BTLS_SUPPORTED=no
4065                 ACCESS_UNALIGNED="no"
4066                 with_tls=pthread
4067                 target_wasm=yes
4068                 ;;
4069         mips*)
4070                 TARGET=MIPS;
4071                 arch_target=mips;
4072                 with_tls=pthread;
4073                 ACCESS_UNALIGNED="no"
4075                 AC_MSG_CHECKING(for mips n32)
4076                 AC_TRY_COMPILE([],[
4077                 #if _MIPS_SIM != _ABIN32
4078                 #error Not mips n32
4079                 #endif
4080                 ],[
4081                 AC_MSG_RESULT(yes)
4082                 sizeof_register=8
4083                 ],[
4084                 AC_MSG_RESULT(no)
4085                 ])
4086                 ;;
4087         i*86-*-*)
4088                 TARGET=X86;
4089                 arch_target=x86;
4090                 case $host_os in
4091                   solaris*)
4092                         LIBC="libc.so"
4093                         INTL="libintl.so"
4094                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
4095                                 TARGET=AMD64
4096                                 arch_target=amd64
4097                         fi
4099                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
4100                         # int astruct __attribute__ ((visibility ("hidden")));
4101                         # void foo ()
4102                         # {
4103                         #       void *p = &astruct;
4104                         # }
4105                         # gcc -fPIC --shared -o libfoo.so foo.c
4106                         # yields:
4107                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
4108                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
4109                         have_visibility_hidden=no
4110                         ;;
4111                   mingw*|cygwin*)
4112                         have_visibility_hidden=no
4113                         BTLS_SUPPORTED=no
4114                         BTLS_PLATFORM=i386
4115                         ;;
4116                   haiku*)
4117                         LIBC=libroot.so
4118                         ;;
4119                   linux*)
4120                         AOT_SUPPORTED="yes"
4121                         BTLS_SUPPORTED=yes
4122                         BTLS_PLATFORM=i386
4123                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4124                         ;;
4125                   darwin*)
4126                         AOT_SUPPORTED="yes"
4127                         BTLS_SUPPORTED=yes
4128                         BTLS_PLATFORM=i386
4129                         ;;
4130                   openbsd*|freebsd*|kfreebsd-gnu*)
4131                         AOT_SUPPORTED="yes"
4132                         BTLS_SUPPORTED=yes
4133                         BTLS_PLATFORM=i386
4134                         ;;
4135                 esac
4136                 ;;
4137         x86_64-*-* | amd64-*-*)
4138                 TARGET=AMD64;
4139                 arch_target=amd64;
4140                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
4141                         AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4142                         sizeof_register=8
4143                 fi
4144                 case $host_os in
4145                   linux*)
4146                         AOT_SUPPORTED="yes"
4147                         BTLS_SUPPORTED=yes
4148                         BTLS_PLATFORM=x86_64
4149                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4150                         ;;
4151                   darwin*)
4152                         AOT_SUPPORTED="yes"
4153                         BTLS_SUPPORTED=yes
4154                         BTLS_PLATFORM=x86_64
4155                         boehm_supported=false
4156                         ;;
4157                   openbsd*|freebsd*|kfreebsd-gnu*)
4158                         AOT_SUPPORTED="yes"
4159                         BTLS_SUPPORTED=yes
4160                         BTLS_PLATFORM=x86_64
4161                         ;;
4162                   mingw*|cygwin*)
4163                         BTLS_SUPPORTED=no
4164                         BTLS_PLATFORM=x86_64
4165                         ;;
4166                 esac
4167                 ;;
4168         sparc*-*-*)
4169                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4170                    TARGET=SPARC64
4171                 else
4172                         TARGET=SPARC
4173                 fi
4174                 arch_target=sparc;
4175                 ACCESS_UNALIGNED="no"
4176                 case $host_os in
4177                   linux*) ;;
4178                   *)
4179                         LIBC="libc.so"
4180                         INTL="libintl.so"
4181                 esac
4182                 if test x"$GCC" = xyes; then
4183                         # We don't support v8 cpus
4184                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
4185                 fi
4186                 if test x"$AR" = xfalse; then
4187                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
4188                 fi
4189                 ;;
4190         *-mingw*|*-*-cygwin*)
4191                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
4192                 have_visibility_hidden=no
4193                 INTL="intl"
4194                 case "$host" in
4195                         x86_64*mingw*)
4196                                 # Old Boehm fails to compile for x86_64-mingw.
4197                                 # It is trivial to fix, but just silently drop it.
4198                                 boehm_supported=false
4199                                 ;;
4200                 esac
4201                 ;;
4202         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
4203         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
4204         powerpc-*-freebsd* | powerpc*-*-aix* | powerpc*-*-os400* )
4205                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4206                         TARGET=POWERPC64;
4207                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
4208                         if ! (echo $CC | grep -q -- 'clang'); then
4209                                 CFLAGS="$CFLAGS -mminimal-toc"
4210                         fi
4211                 else
4212                         TARGET=POWERPC;
4213                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
4214                 fi
4215                 arch_target=ppc;
4216                 case $host_os in
4217                   aix*|os400*)
4218                         BTLS_SUPPORTED=yes
4219                         BTLS_PLATFORM=powerpc
4220                         dnl on AIX/PASE, shared libraries can be inside archives
4221                         dnl if they are, we specify them by lib.a(lib.so)
4222                         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX, so
4223                         LIBC="libc.a(shr_64.o)"
4224                         INTL="libintl.a(libintl.so.8)"
4225                         ;;
4226                   linux*)
4227                         BTLS_SUPPORTED=yes
4228                         BTLS_PLATFORM=powerpc
4229                         ;;
4230                 esac
4231                 ;;
4232         armv7k-*-darwin*)
4233                 TARGET=ARM;
4234                 TARGET_SYS=WATCHOS
4235                 arch_target=arm;
4236                 arm_fpu=VFP_HARD
4237                 ACCESS_UNALIGNED="no"
4238                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4239                 ;;
4241         arm*-darwin*)
4242                 TARGET=ARM;
4243                 arch_target=arm;
4244                 ACCESS_UNALIGNED="no"
4245                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4246                 ;;
4247         arm*-linux*)
4248                 TARGET=ARM;
4249                 arch_target=arm;
4250                 ACCESS_UNALIGNED="no"
4251                 AOT_SUPPORTED="yes"
4252                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4253                 BTLS_SUPPORTED=yes
4254                 BTLS_PLATFORM=arm
4255                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4256                 case "$target" in
4257                 arm*-linux*-gnueabi)
4258                         BTLS_PLATFORM=armsoft
4259                         ;;
4260                 esac
4261                 ;;
4262         arm*-netbsd*-eabi*)
4263                 TARGET=ARM;
4264                 arch_target=arm;
4265                 ACCESS_UNALIGNED="no"
4266                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4267                 ;;
4268         aarch64-*darwin*ilp32)
4269                 TARGET=ARM6432
4270                 arch_target=arm64
4271                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4272                 sizeof_register=8
4273                 # assuming no other target other than watchOS is using aarch64*darwin triple
4274                 TARGET_SYS=WATCHOS
4275                 ;;
4276         aarch64-*)
4277                 # https://lkml.org/lkml/2012/7/15/133
4278                 TARGET=ARM64
4279                 arch_target=arm64
4280                 boehm_supported=false
4281                 AOT_SUPPORTED="yes"
4282                 BTLS_SUPPORTED=yes
4283                 BTLS_PLATFORM=aarch64
4284                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4285                 ;;
4286         s390x-*-linux*)
4287                 TARGET=S390X;
4288                 arch_target=s390x;
4289                 ACCESS_UNALIGNED="yes"
4290                 BTLS_SUPPORTED=yes
4291                 BTLS_PLATFORM=s390x
4292                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
4293                 ;;
4294         riscv32-*)
4295                 TARGET=RISCV32
4296                 ACCESS_UNALIGNED=no
4297                 AOT_SUPPORTED=no
4298                 BTLS_SUPPORTED=yes
4299                 BTLS_PLATFORM=riscv32
4300                 arch_target=riscv32
4301                 boehm_supported=false
4302                 ;;
4303         riscv64*)
4304                 TARGET=RISCV64
4305                 ACCESS_UNALIGNED=no
4306                 AOT_SUPPORTED=no
4307                 BTLS_SUPPORTED=yes
4308                 BTLS_PLATFORM=riscv64
4309                 arch_target=riscv64
4310                 boehm_supported=false
4311                 ;;
4312 esac
4314 HOST=$TARGET
4316 if test "x$host" != "x$target"; then
4317    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
4318    enable_mcs_build=no
4319    enable_support_build=no
4320    BTLS_SUPPORTED=no
4321    # Can't use tls, since it depends on the runtime detection of tls offsets
4322    # in mono-compiler.h
4323    with_tls=pthread
4324    target_mach=no
4325    case "$target" in
4326    wasm32*)
4327                 TARGET=WASM
4328                 arch_target=wasm
4329                 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
4330                 ;;
4331    arm*-darwin*)
4332                 TARGET=ARM;
4333                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4334                 case "$target" in
4335                 armv7k-*)
4336                         arm_fpu=VFP_HARD
4337                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
4338                         ;;
4339                 esac            
4340                 ;;
4341    powerpc64-ps3-linux-gnu)
4342                 TARGET=POWERPC64
4343                 arch_target=powerpc64
4344                 AC_DEFINE(TARGET_PS3, 1, [...])
4345                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4346                 # uses this define
4347                 AC_DEFINE(__mono_ppc64__, 1, [...])
4348                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4349                 sizeof_register=8
4350                 target_byte_order=G_BIG_ENDIAN
4351                 ;;
4352    powerpc64-xbox360-linux-gnu)
4353                 TARGET=POWERPC64
4354                 arch_target=powerpc64
4355                 AC_DEFINE(TARGET_XBOX360, 1, [...])
4356                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4357                 # uses this define
4358                 sizeof_register=8
4359                 target_byte_order=G_BIG_ENDIAN
4360                 ;;
4361    arm*-linux-*)
4362                 TARGET=ARM;
4363                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4364                 ;;
4365    arm*-netbsd*-eabi*)
4366                 TARGET=ARM;
4367                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4368                 ;;
4369    i686*-linux-*)
4370                 TARGET=X86;
4371                 ;;
4372    i*86-apple-*)
4373                 TARGET=X86;
4374                 ;;
4375    x86_64*-linux-*)
4376                 TARGET=AMD64;
4377                 ;;
4378    x86_64-ps4-freebsd)
4379                 TARGET=AMD64;
4380                 AC_DEFINE(TARGET_PS4, 1, [...])
4381                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
4382                 CPPFLAGS="$CPPFLAGS"
4383                 target_win32=no
4384                 ;;
4385         aarch64*darwin*_ilp32)
4386                 TARGET=ARM6432;
4387                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4388                 AC_DEFINE(TARGET_WATCHOS, 1, [...])
4389                 ;;
4390         aarch64-*)
4391                 TARGET=ARM64
4392                 ;;
4393         riscv32*)
4394                 TARGET=RISCV32
4395                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4396                 AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4397                 arch_target=riscv32
4398                 target_mach=no
4399                 with_tls=pthread
4400                 ;;
4401         riscv64*)
4402                 TARGET=RISCV64
4403                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4404                 AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4405                 arch_target=riscv64
4406                 target_mach=no
4407                 with_tls=pthread
4408                 ;;
4409         x86_64-google-fuchsia)
4410                 TARGET=AMD64
4411                 target_win32=nop
4412                 AC_DEFINE(HOST_FUCHSIA,1,[Targeting the Fuchsia platform])
4413                 ;;
4414         *)
4415                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
4416         esac
4418         case "$target" in
4419         *-darwin*)
4420                 target_mach=yes
4421                 ;;
4422         *-linux-android*)
4423                 AC_DEFINE(TARGET_ANDROID, 1, [...])
4424                 ;;
4425         esac
4428 case "$TARGET" in
4429 WASM)
4430         AC_DEFINE(TARGET_WASM, 1, [...])
4431         arch_target=wasm
4432         ;;
4433 X86)
4434         AC_DEFINE(TARGET_X86, 1, [...])
4435         arch_target=x86
4436         ;;
4437 AMD64)
4438         AC_DEFINE(TARGET_AMD64, 1, [...])
4439         arch_target=amd64
4440         ;;
4441 ARM)
4442         AC_DEFINE(TARGET_ARM, 1, [...])
4443         arch_target=arm
4444         ACCESS_UNALIGNED="no"
4445         ;;
4446 ARM64|ARM6432)
4447         AC_DEFINE(TARGET_ARM64, 1, [...])
4448         arch_target=arm64
4449         ;;
4450 POWERPC)
4451         AC_DEFINE(TARGET_POWERPC, 1, [...])
4452         ;;
4453 POWERPC64)
4454         AC_DEFINE(TARGET_POWERPC, 1, [...])
4455         AC_DEFINE(TARGET_POWERPC64, 1, [...])
4456         ;;
4457 S390X)
4458         AC_DEFINE(TARGET_S390X, 1, [...])
4459         ;;
4460 MIPS)
4461         AC_DEFINE(TARGET_MIPS, 1, [...])
4462         ;;
4463 SPARC)
4464         AC_DEFINE(TARGET_SPARC, 1, [...])
4465         ;;
4466 SPARC64)
4467         AC_DEFINE(TARGET_SPARC64, 1, [...])
4468         ;;
4469 RISCV32)
4470         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4471         AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4472         ;;
4473 RISCV64)
4474         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4475         AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4476         ;;
4477 esac
4479 case "$TARGET" in
4480 *32* | ARM | X86 | POWERPC | MIPS | SPARC | WASM | ARM6432)
4481     target_sizeof_void_p=4
4482     ;;
4483 *64* | S390X)
4484     target_sizeof_void_p=8
4485     ;;
4487     AC_MSG_ERROR([unknown target])
4488     ;;
4489 esac
4491 case "$HOST" in
4492 WASM)
4493         AC_DEFINE(HOST_WASM, 1, [...])
4494         ;;
4495 X86)
4496         AC_DEFINE(HOST_X86, 1, [...])
4497         ;;
4498 AMD64)
4499         AC_DEFINE(HOST_AMD64, 1, [...])
4500         ;;
4501 ARM)
4502         AC_DEFINE(HOST_ARM, 1, [...])
4503         ;;
4504 ARM64)
4505         AC_DEFINE(HOST_ARM64, 1, [...])
4506         ;;
4507 POWERPC)
4508         AC_DEFINE(HOST_POWERPC, 1, [...])
4509         ;;
4510 POWERPC64)
4511         AC_DEFINE(HOST_POWERPC, 1, [...])
4512         AC_DEFINE(HOST_POWERPC64, 1, [...])
4513         ;;
4514 S390X)
4515         AC_DEFINE(HOST_S390X, 1, [...])
4516         ;;
4517 MIPS)
4518         AC_DEFINE(HOST_MIPS, 1, [...])
4519         ;;
4520 SPARC)
4521         AC_DEFINE(HOST_SPARC, 1, [...])
4522         ;;
4523 SPARC64)
4524         AC_DEFINE(HOST_SPARC64, 1, [...])
4525         ;;
4526 RISCV32)
4527         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4528         AC_DEFINE([HOST_RISCV32], [1], [Host is 32-bit RISC-V])
4529         ;;
4530 RISCV64)
4531         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4532         AC_DEFINE([HOST_RISCV64], [1], [Host is 64-bit RISC-V])
4533         ;;
4534 esac
4536 MONO_ARCH_GSHAREDVT_SUPPORTED=0
4537 case "$HOST" in
4538 X86 | AMD64 | ARM | ARM64)
4539         MONO_ARCH_GSHAREDVT_SUPPORTED=1 # keep in sync with mini-{x86,amd64,arm,arm64}.h
4540         ;;
4541 esac
4543 AM_CONDITIONAL(MONO_ARCH_GSHAREDVT_SUPPORTED, test $MONO_ARCH_GSHAREDVT_SUPPORTED = 1)
4544 AM_CONDITIONAL(TARGET_WASM, test $arch_target = wasm)
4546 dnl *************
4547 dnl *** VTUNE ***
4548 dnl *************
4550 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
4551 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
4553 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
4555 if test "x$enable_vtune" = "xyes"; then
4556         if test "x$with_vtune" = "x"; then
4557                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
4558         else
4559                 VTUNE_PATH=$with_vtune
4560         fi
4561         VTUNE_INCLUDE=$VTUNE_PATH/include
4562         case "$TARGET" in
4563         X86)
4564                 VTUNE_LIB=$VTUNE_PATH/lib32
4565                 ;;
4566         AMD64)
4567                 VTUNE_LIB=$VTUNE_PATH/lib64
4568                 ;;
4569         *)
4570                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
4571                 ;;
4572         esac
4573         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
4574                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
4575         fi
4576         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
4577                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
4578         fi
4580         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
4581         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
4583         AC_SUBST(VTUNE_LIBS)
4584         AC_SUBST(VTUNE_CFLAGS)
4586 dnl Use GCC atomic ops if they work on the target.
4587 if test x$GCC = "xyes"; then
4588         case $TARGET in
4589         X86 | AMD64 | ARM | ARM64 | ARM6432 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64 | RISCV32 | RISCV64)
4590                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
4591                 ;;
4592         esac
4595 if test "x$target_mach" = "xyes"; then
4597    if test "x$TARGET_SYS" = "xWATCHOS"; then
4598           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
4599           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4600           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4601           BTLS_SUPPORTED=no
4602    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64" -o "x$TARGET" = "xARM6432"; then
4603           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4604           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4605           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4606           BTLS_SUPPORTED=no
4607           target_ios=yes
4608    else
4609        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
4610        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
4611        #error fail this for ios
4612        #endif
4613        ], [
4614                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
4615           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
4616           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
4617           target_osx=yes
4618        ], [
4619           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4620           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4621           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4622           BTLS_SUPPORTED=no
4623                   target_ios=yes
4624        ])
4625         fi
4626    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
4629 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
4631 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
4633 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
4634    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
4635 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
4636    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
4637 else
4638    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
4641 AC_DEFINE_UNQUOTED(TARGET_SIZEOF_VOID_P,${target_sizeof_void_p},[wordsize of target])
4643 if test "x$sizeof_register" = "x4"; then
4644   AC_DEFINE(SIZEOF_REGISTER,4,[size of target machine integer registers])
4645 elif test "x$sizeof_register" = "x8"; then
4646   AC_DEFINE(SIZEOF_REGISTER,8,[size of target machine integer registers])
4647 else
4648   AC_DEFINE_UNQUOTED(SIZEOF_REGISTER,${target_sizeof_void_p},[size of target machine integer registers])
4651 if test "x$have_visibility_hidden" = "xyes"; then
4652    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
4655 if test "x$have_deprecated" = "xyes"; then
4656    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
4659 dnl 
4660 dnl Simple Generational checks (sgen)
4662 SGEN_DEFINES=
4663 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
4664 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
4665 if test x$buildsgen = xyes; then
4666    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
4667    SGEN_DEFINES="-DHAVE_SGEN_GC"
4669         conc_gc_msg=""
4670    if test x$with_sgen_default_concurrent != xno; then
4671        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
4672            conc_gc_msg=" (concurrent by default)"
4673    fi
4675    if test "x$gc_msg" = "x"; then
4676       gc_msg="sgen$conc_gc_msg"
4677    else
4678       gc_msg="sgen$conc_gc_msg and $gc_msg"
4679    fi
4681 AC_SUBST(SGEN_DEFINES)
4682 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
4684 jit_status="Building and using the JIT"
4686 libsuffix=".so"
4688 case "$host" in
4689      *-*-darwin*)
4690         libsuffix=".dylib"
4691         LIBC="libc.dylib"
4692         INTL="libintl.dylib"
4693         SQLITE="libsqlite.0.dylib"
4694         SQLITE3="libsqlite3.0.dylib"
4695         X11="libX11.dylib"
4696         GDKX11="libgdk-x11-2.0.dylib"
4697         GTKX11="libgtk-x11-2.0.dylib"
4698         ;;
4699      *-*-*netbsd*)
4700         LIBC="libc.so"
4701         INTL="libintl.so"
4702         SQLITE="libsqlite.so"
4703         SQLITE3="libsqlite3.so"
4704         ;;
4705      *-*-kfreebsd*-gnu)
4706         LIBC="libc.so.0.1"
4707         INTL="libc.so.0.1"
4708         X11="libX11.so.6"
4709         ;;
4710     *-*-*freebsd*)
4711         LIBC="libc.so.7"
4712         INTL="libintl.so"
4713         SQLITE="libsqlite.so"
4714         SQLITE3="libsqlite3.so"
4715         ;;
4716     *-*-*openbsd*)
4717         LIBC="libc.so"
4718         INTL="libintl.so"
4719         SQLITE="libsqlite.so"
4720         SQLITE3="libsqlite3.so"
4721         ;;
4722     *-*-*linux*)
4723         AC_PATH_X
4724         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
4725         AC_MSG_CHECKING(for the soname of libX11.so)
4726         for i in $x_libraries $dlsearch_path; do
4727                 for r in 4 5 6; do
4728                         if test -f $i/libX11.so.$r; then
4729                                 X11=libX11.so.$r
4730                                 AC_MSG_RESULT($X11)
4731                         fi
4732                 done
4733         done
4734         
4735         if test "x$X11" = "xlibX11.so"; then
4736                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
4737                 X11=libX11.so.6
4738         fi
4739         ;;
4740 esac
4742 AC_SUBST(libsuffix)
4744 ######################################
4745 # EGLIB CHECKS
4746 ######################################
4748 GNUC_PRETTY=
4749 GNUC_UNUSED=
4750 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
4751 if test x$GCC = xyes; then
4752    GNUC_UNUSED='__attribute__((__unused__))'
4753    GNUC_NORETURN='__attribute__((__noreturn__))'
4754    case $host_cpu in
4755      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
4756    esac
4758 AC_SUBST(GNUC_PRETTY)
4759 AC_SUBST(GNUC_UNUSED)
4760 AC_SUBST(GNUC_NORETURN)
4761 AC_SUBST(BREAKPOINT)
4763 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
4765 case $host in
4766 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
4767     PATHSEP='\\'
4768     SEARCHSEP=';'
4769     OS="WIN32"
4770     PIDTYPE='void *'
4771     ;;
4773     PATHSEP='/'
4774     SEARCHSEP=':'
4775     OS="UNIX"
4776     PIDTYPE='int'
4777     ;;
4778 esac
4780 case $host in
4781         *-*-solaris*)
4782         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
4783         ;;
4784 esac
4786 case $target in
4787 arm*-darwin*|aarch64*-*|riscv*)
4788     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
4789     ;;
4790 i*86-*-darwin*)
4791     ORDER=G_LITTLE_ENDIAN
4792     ;;
4793 *-*-haiku*)
4794     LDFLAGS="$LDFLAGS -ltextencoding"
4795     ;;
4796 *-*-openbsd*)
4797     CFLAGS="$CFLAGS -pthread"
4798     LDFLAGS="$LDFLAGS -pthread"
4799     ;;
4800 esac
4802 AC_SUBST(ORDER)
4803 AC_SUBST(CFLAGS)
4804 AC_SUBST(PATHSEP)
4805 AC_SUBST(SEARCHSEP)
4806 AC_SUBST(OS)
4807 AC_SUBST(PIDTYPE)
4809 # Defined for all targets/platforms using classic Windows API support.
4810 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
4811 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
4813 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf)
4814 AC_CHECK_FUNCS(getrlimit)
4815 AC_CHECK_FUNCS(fork execv execve)
4816 AC_CHECK_FUNCS(waitpid)
4818 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
4820 if test x$with_overridable_allocators = xyes; then
4821         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
4822   AC_MSG_NOTICE([Overridable allocator support enabled])
4823 else
4824   AC_MSG_NOTICE([Overridable allocator support disabled])
4828 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
4829 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
4830 # removed once support for 10.6 is dropped.
4832 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
4834 if test x$target_osx = xyes; then
4835 AC_CHECK_FUNCS(getpwuid_r)
4836 elif test x$target_ios = xno; then
4837 AC_CHECK_FUNCS(strndup getpwuid_r)
4840 AC_SEARCH_LIBS(sqrtf, m)
4842 # nanosleep may not be part of libc, also search it in other libraries
4843 AC_SEARCH_LIBS(nanosleep, rt)
4845 AC_SEARCH_LIBS(dlopen, dl)
4846 old_ldflags="${LDFLAGS}"
4847 # GNU specific option, this confuses IBM ld, but do offer alternatives when possible
4848 if test $lt_cv_prog_gnu_ld = yes; then
4849         LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4850 else
4851         case $host in
4852         *-*-aix*|*-*-os400*)
4853                 ;;
4854         *)
4855                 dnl Try to use export-dynamic anyways
4856                 LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4857                 ;;
4858         esac
4860 AC_TRY_LINK(, [int i;], found_export_dynamic=yes, found_export_dynamic=no)
4861 if test $found_export_dynamic = no; then
4862         LDFLAGS="${old_ldflags}"
4865 AC_CHECK_HEADERS(getopt.h sys/select.h sys/time.h sys/wait.h pwd.h iconv.h sys/types.h sys/resource.h)
4866 dnl giconv.c will check on HAVE_ICONV_H but we need this for link time
4867 AC_CHECK_LIB(iconv, iconv_open)
4868 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
4869 AC_SUBST(HAVE_ALLOCA_H)
4871 # Get the exact type of size_t, not just its size.
4872 # This is so we can find an exact printf format among u, lu, llu, I64u.
4873 # To avoid warnings about slight mismatches.
4874 # C99 runtime "zu" dependency is being avoided here.
4876 # We have to compile as C++ because C is too lenient
4877 # and lets the wrong thing compile, with warnings.
4879 # Note: "zu" or ifdef <something> have the advantage
4880 # of producing installable "biarch" headers. i.e. one Mac header
4881 # for Mac/x86 and Mac/amd64.
4883 AC_LANG_PUSH(C++)
4885 # Check long before int because it is the overwhelming Unix answer,
4886 # across 32bit and 64bit systems -- fewer compiler invocations in autoconf.
4888 # long ahead of int also tends to produce biarch-compatible headers except Windows.
4890 AC_MSG_CHECKING(if size_t is unsigned long)
4891 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4892         #include <stddef.h>
4893         unsigned long *a = (size_t*)0;
4894 ])], [
4895         AC_MSG_RESULT(yes)
4896         AC_SUBST(GSIZE_FORMAT, '"lu"')
4897 ], [
4898         AC_MSG_RESULT(no)
4899         AC_MSG_CHECKING(if size_t is unsigned int)
4900         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4901                 #include <stddef.h>
4902                 unsigned *a = (size_t*)0;
4903         ])], [
4904                 AC_MSG_RESULT(yes)
4905                 AC_SUBST(GSIZE_FORMAT, '"u"')
4906         ], [
4907 # At this point the majority of systems have their answer,
4908 # and we descend into non-standard or new-standard territory.
4910 # Check __int64 first because I64 on some systems predates ll, enabling
4911 # new compiler/old runtime interop, and the types always have the same size.
4912                 AC_MSG_RESULT(no)
4913                 AC_MSG_CHECKING(if size_t is unsigned __int64)
4914                 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4915                         #include <stddef.h>
4916                         unsigned __int64 *a = (size_t*)0;
4917                 ])], [
4918                         AC_MSG_RESULT(yes)
4919                         AC_SUBST(GSIZE_FORMAT, '"I64u"')
4920                 ], [
4921                         AC_MSG_RESULT(no)
4922                         AC_MSG_CHECKING(if size_t is unsigned long long)
4923                         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4924                                 #include <stddef.h>
4925                                 unsigned long long *a = (size_t*)0;
4926                         ])], [
4927                                 AC_MSG_RESULT(yes)
4928                                 AC_SUBST(GSIZE_FORMAT, '"llu"')
4929                         ], [
4930                                 AC_MSG_RESULT(no)
4931                                 AC_MSG_ERROR(Unable to determine size_t among unsigned long, int, __int64, long long)
4932                         ] )
4933                 ] )
4934         ] )
4935 ] )
4937 AC_LANG_POP
4939 # If size_t/ptrdiff_t is correct, use it. Otherwise C99 [u]intptr_t.
4940 # This provides for an exact match with functions that
4941 # take size_t like malloc and pthread_attr_getstacksize, avoiding warnings.
4942 # uintptr_t is not necessarily the same.
4944 # ptrdiff_t is preferred over ssize_t as it is C89 vs. new Posix.
4945 # ssize_t looks nicer but ptrdiff_t is wrapped up as gssize anyway.
4947 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_size_t; then
4948    GSIZE="size_t"
4949    GSSIZE="ptrdiff_t"
4950 else
4951    GSIZE="uintptr_t"
4952    GSSIZE="intptr_t"
4955 AC_SUBST(GSIZE)
4956 AC_SUBST(GSSIZE)
4957 AC_SUBST(GSIZE_FORMAT)
4960 # END OF EGLIB CHECKS
4963 AC_ARG_WITH([libgdiplus],
4964         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
4965         [], [with_libgdiplus=installed])
4967 # default install location
4968 libgdiplus_install_loc=libgdiplus${libsuffix}
4969 case "$host" in
4970     *-*-*linux*)
4971     libgdiplus_install_loc=libgdiplus${libsuffix}.0
4972     ;;
4973 esac
4975 case $with_libgdiplus in
4976     no)
4977     libgdiplus_loc=
4978     ;;
4980     installed)
4981     libgdiplus_loc=
4982     if test x$cross_compiling = xno; then
4983         if test x$host_darwin = xyes; then
4984             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
4985             if test -x $a; then
4986               libgdiplus_install_loc=$a
4987               libgdiplus_loc=$a
4988             fi
4989         fi
4990     fi
4991     ;;
4993     yes|sibling)
4994     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
4995     ;;
4997     /*) # absolute path, assume it is an install location
4998     libgdiplus_loc=$with_libgdiplus
4999     libgdiplus_install_loc=$with_libgdiplus
5000     ;;
5002     *)
5003     libgdiplus_loc=`pwd`/$with_libgdiplus
5004     ;;
5005 esac
5006 AC_SUBST(libgdiplus_loc)
5007 AC_SUBST(libgdiplus_install_loc)
5009 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)
5010 if test "x$icall_symbol_map" = "xyes"; then
5011    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
5014 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
5015 if test "x$icall_export" = "xyes"; then
5016    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
5019 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
5020 if test "x$icall_tables" = "xno"; then
5021    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
5024 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
5026 if test "x$with_tls" = "x__thread"; then
5027         AC_DEFINE(MONO_KEYWORD_THREAD, __thread, [Have __thread keyword])
5028         # Pass the information to libgc
5029         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
5030         AC_MSG_CHECKING(if the tls_model attribute is supported)
5031         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
5032                 ], [
5033                         AC_MSG_RESULT(yes)
5034                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
5035                 ], [
5036                         AC_MSG_RESULT(no)
5037         ])
5040 if test ${TARGET} = ARM; then
5041         dnl ******************************************
5042         dnl *** Check to see what FPU is available ***
5043         dnl ******************************************
5044         AC_MSG_CHECKING(which FPU to use)
5046         #
5047         # This is a bit tricky:
5048         #
5049         # if (__ARM_PCS_VFP) {
5050         #       /* mfloat-abi=hard == VFP with hard ABI */
5051         # } elif (!__SOFTFP__) {
5052         #       /* mfloat-abi=softfp == VFP with soft ABI */
5053         # } else {
5054         #       /* mfloat-abi=soft == no VFP */
5055         # }
5056         #
5057         # The exception is iOS (w/ GCC) where none of the above
5058         # are defined (but iOS always uses the 'softfp' ABI).
5059         #
5060         # No support for FPA.
5061         #
5063         fpu=NONE
5065         # iOS GCC always uses the 'softfp' ABI.
5066         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
5067                 fpu=VFP
5068         fi
5070         # Are we using the 'hard' ABI?
5071         if test x$fpu = xNONE; then
5072                 AC_TRY_COMPILE([], [
5073                         #ifndef __ARM_PCS_VFP
5074                         #error "Float ABI is not 'hard'"
5075                         #endif
5076                 ], [
5077                         fpu=VFP_HARD
5078                 ], [
5079                         fpu=NONE
5080                 ])
5081         fi
5083         # No 'hard' ABI. 'soft' or 'softfp'?
5084         if test x$fpu = xNONE; then
5085                 AC_TRY_COMPILE([], [
5086                         #ifdef __SOFTFP__
5087                         #error "Float ABI is not 'softfp'"
5088                         #endif
5089                 ], [
5090                         fpu=VFP
5091                 ], [
5092                         fpu=NONE
5093                 ])
5094         fi
5096         if test x$arm_fpu != x; then
5097            fpu=$arm_fpu
5098         fi
5100         AC_MSG_RESULT($fpu)
5101         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
5102         unset fpu
5104         dnl *********************************************
5105         dnl *** Check which ARM version(s) we can use ***
5106         dnl *********************************************
5107         AC_MSG_CHECKING(which ARM version to use)
5109         AC_TRY_COMPILE([], [
5110                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
5111                 #error Not on ARM v5.
5112                 #endif
5113         ], [
5114                 arm_v5=yes
5116                 arm_ver=ARMv5
5117         ], [])
5119         AC_TRY_COMPILE([], [
5120                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
5121                 #error Not on ARM v6.
5122                 #endif
5123         ], [
5124                 arm_v5=yes
5125                 arm_v6=yes
5127                 arm_ver=ARMv6
5128         ], [])
5130         AC_TRY_COMPILE([], [
5131                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
5132                 #error Not on ARM v7.
5133                 #endif
5134         ], [
5135                 arm_v5=yes
5136                 arm_v6=yes
5137                 arm_v7=yes
5139                 arm_ver=ARMv7
5140         ], [])
5142         AC_MSG_RESULT($arm_ver)
5144         if test x$arm_v5 = xyes; then
5145                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
5146                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
5147         fi
5149         if test x$arm_v6 = xyes; then
5150                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
5151                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
5152         fi
5154         if test x$arm_v7 = xyes; then
5155                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
5156                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
5157         fi
5160 if test ${TARGET} = RISCV32 -o ${TARGET} = RISCV64; then
5161         AC_ARG_WITH([riscv-fpabi], [  --with-riscv-fpabi=auto,double,soft   Select RISC-V floating point ABI (auto)], [fpabi=$withval], [fpabi=double])
5163         AC_MSG_CHECKING([which RISC-V floating point ABI to use])
5165         if test x$fpabi = xauto; then
5166                 AC_TRY_COMPILE([], [
5167                         #ifdef __riscv_float_abi_double
5168                         #error "double"
5169                         #endif
5170                 ], [
5171                         fpabi=auto
5172                 ], [
5173                         fpabi=double
5174                 ])
5175         fi
5177         if test x$fpabi = xauto; then
5178                 AC_TRY_COMPILE([], [
5179                         #ifdef __riscv_float_abi_single
5180                         #error "single"
5181                         #endif
5182                 ], [
5183                         fpabi=auto
5184                 ], [
5185                         fpabi=single
5186                 ])
5187         fi
5189         if test x$fpabi = xauto; then
5190                 AC_TRY_COMPILE([], [
5191                         #ifdef __riscv_float_abi_soft
5192                         #error "soft"
5193                         #endif
5194                 ], [
5195                         fpabi=auto
5196                 ], [
5197                         fpabi=soft
5198                 ])
5199         fi
5201         case $fpabi in
5202         double)
5203                 AC_DEFINE([RISCV_FPABI_DOUBLE], [1], [RISC-V FPABI is double-precision])
5204                 AC_MSG_RESULT([double-precision])
5205                 ;;
5206         single)
5207                 AC_DEFINE([RISCV_FPABI_SINGLE], [1], [RISC-V FPABI is single-precision])
5208                 AC_MSG_ERROR([single-precision, not supported])
5209                 ;;
5210         soft)
5211                 AC_DEFINE([RISCV_FPABI_SOFT], [1], [RISC-V FPABI is soft float])
5212                 AC_MSG_RESULT([soft float])
5213                 ;;
5214         auto)
5215                 AC_MSG_ERROR([unknown])
5216                 ;;
5217         *)
5218                 AC_MSG_ERROR([invalid option: $fpabi])
5219                 ;;
5220         esac
5223 if test ${TARGET} = unknown; then
5224         CPPFLAGS="$CPPFLAGS -DNO_PORT"
5225         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
5228 if test "x$platform_android" = "xyes"; then
5229         case "x${TARGET}" in
5230         xARM)
5231                 case "x$arm_ver" in
5232                 xARMv5)
5233                         BTLS_SUPPORTED=yes
5234                         BTLS_PLATFORM=android-armv5
5235                         ;;
5236                 xARMv6)
5237                         BTLS_SUPPORTED=yes
5238                         BTLS_PLATFORM=android-armv6
5239                         ;;
5240                 xARMv7)
5241                         BTLS_SUPPORTED=yes
5242                         BTLS_PLATFORM=android-armv7
5243                         ;;
5244                 *)
5245                         BTLS_SUPPORTED=no
5246                         ;;
5247                 esac
5248                 ;;
5249         xARM64)
5250                 BTLS_SUPPORTED=yes
5251                 BTLS_PLATFORM=android-v8a
5252                 ;;
5253         xX86)
5254                 BTLS_SUPPORTED=yes
5255                 BTLS_PLATFORM=android-x86
5256                 ;;
5257         xAMD64)
5258                 BTLS_SUPPORTED=yes
5259                 BTLS_PLATFORM=android-x64
5260                 ;;
5261         *)
5262                 BTLS_SUPPORTED=no
5263                 ;;
5264         esac
5267 if test ${ACCESS_UNALIGNED} = no; then
5268         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
5271 if test x$host_darwin = xyes; then
5272         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
5273         AS_IF(
5274                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
5275                 [AC_MSG_RESULT([no])],
5276                 [
5277                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
5278                         AR_FLAGS="Scru"
5279                         RANLIB="$RANLIB -no_warning_for_no_symbols"
5280                         AC_MSG_RESULT([yes])
5281                 ]
5282         )
5285 case "x$libgc" in
5286         xincluded)
5287                 # Pass CPPFLAGS to libgc configure
5288                 # We should use a separate variable for this to avoid passing useless and
5289                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
5290                 # This should be executed late so we pick up the final version of CPPFLAGS
5291                 # The problem with this approach, is that during a reconfigure, the main
5292                 # configure scripts gets invoked with these arguments, so we use separate
5293                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
5294                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
5295                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
5296                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
5297                 fi
5298                 # Don't pass -finstrument-for-thread-suspension in, 
5299                 # if these are instrumented it will be very bad news 
5300                 # (infinite recursion, undefined parking behavior, etc)
5301                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
5302                 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\""
5303                 if test "x$support_boehm" = "xyes"; then
5304                         AC_CONFIG_SUBDIRS(libgc)
5305                 fi
5306                 ;;
5307 esac
5309 MALLOC_MEMPOOLS=no
5310 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
5311         if test x$with_malloc_mempools = xyes; then
5312                 MALLOC_MEMPOOLS=yes
5313                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
5314         fi
5318 DISABLE_MCS_DOCS=default
5319 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
5320         if test x$with_mcs_docs != xyes; then
5321                 DISABLE_MCS_DOCS=yes
5322         fi
5324 if test -n "$INSTALL_4_x_TRUE"; then :
5325         DISABLE_MCS_DOCS=yes
5327 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
5328    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
5331 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)],[
5332         if test x$with_lazy_gc_thread_creation != xno ; then
5333                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
5334         fi
5335 ], [with_lazy_gc_thread_creation=no])
5337 dnl *****************************
5338 dnl *** Thread suspend policy ***
5339 dnl *****************************
5341 dnl Set a default hybrid or cooperative suspend on some platforms
5343 dnl Coop default is set by the bitcode preset.
5345 dnl If coop isn't on by default, maybe hybrid should be?
5346 if test x$enable_cooperative_suspend_default != xyes; then
5347         case $HOST in
5348         X86 | AMD64)
5349                 dnl Some host/target confusion, there's no host_osx (and
5350                 dnl host_darwin would be true on iOS not just macOS).
5351                 if test x$target_osx = xyes; then
5352                         enable_hybrid_suspend_default=yes
5353                 elif test x$host_linux = xyes -o x$host_win32 = xyes; then
5354                         enable_hybrid_suspend_default=yes
5355                 fi
5356                 ;;
5357         esac
5360 dnl Now check if there were flags overriding the defaults
5362 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])
5363 AC_ARG_ENABLE(cooperative_suspend, [  --enable-cooperative-suspend      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [], [enable_cooperative_suspend=default])
5365 if test x$enable_cooperative_suspend = xdefault -a x$with_cooperative_gc != xdefault; then
5366         enable_cooperative_suspend=$with_cooperative_gc
5369 if test x$enable_cooperative_suspend = xdefault; then
5370         enable_cooperative_suspend=$enable_cooperative_suspend_default
5373 if test x$enable_cooperative_suspend != xno; then
5374         AC_DEFINE(ENABLE_COOP_SUSPEND,1,[Enable cooperative stop-the-world garbage collection.])
5377 AM_CONDITIONAL([ENABLE_COOP_SUSPEND], [test x$enable_cooperative_suspend != xno])
5379 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])
5381 if test x$enable_hybrid_suspend = xdefault; then
5382    enable_hybrid_suspend=$enable_hybrid_suspend_default
5385 if test x$enable_hybrid_suspend != xno -a x$enable_cooperative_suspend != xno ; then
5386         AC_MSG_ERROR([Hybrid suspend and Cooperative suspend cannot be both enabled.])
5389 if test x$enable_hybrid_suspend != xno ; then
5390         AC_DEFINE(ENABLE_HYBRID_SUSPEND,1,[Enable hybrid suspend for GC stop-the-world])
5393 AM_CONDITIONAL([ENABLE_HYBRID_SUSPEND], [test x$enable_hybrid_suspend != xno])
5395 dnl End of thread suspend policy
5397 dnl ***************************
5398 dnl *** feature experiments ***
5399 dnl ***************************
5401 dnl When adding experiments, also add to mono/utils/mono-experiments.def
5402 AC_ARG_ENABLE(experiment, [ --enable-experiment=LIST       Enable experimental fatures from the comma-separate LIST.  Available experiments: null],[
5404         if test x$enable_experiment != x ; then
5405                 AC_DEFINE(ENABLE_EXPERIMENTS,1,[Enable feature experiments])
5406         fi
5407         for feature in `echo "$enable_experiment" | sed -e "s/,/ /g"`; do
5408                 eval "mono_experiment_test_enable_$feature='yes'"
5409         done
5411         if test "x$mono_experiment_test_enable_all" = "xyes"; then
5412                 eval "mono_experiment_test_enable_null='yes'"
5413                 true
5414         fi
5416         if test "x$mono_experiment_test_enable_null" = "xyes"; then
5417                 AC_DEFINE(ENABLE_EXPERIMENT_null, 1, [Enable experiment 'null'])
5418         fi
5419 ],[])
5421 dnl **********************
5422 dnl *** checked builds ***
5423 dnl **********************
5425 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],[
5427         if test x$enable_checked_build != x ; then
5428                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
5429         fi
5430         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
5431                 eval "mono_checked_build_test_enable_$feature='yes'"
5432         done
5434         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
5435                 eval "mono_checked_build_test_enable_gc='yes'"
5436                 eval "mono_checked_build_test_enable_metadata='yes'"
5437                 eval "mono_checked_build_test_enable_thread='yes'"
5438                 eval "mono_checked_build_test_enable_private_types='yes'"
5439                 eval "mono_checked_build_test_enable_crash_reporting='yes'"
5440         fi
5442         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
5443                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
5444         fi
5446         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
5447                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
5448         fi
5450         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
5451                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
5452         fi
5454         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
5455                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
5456         fi
5458         if test "x$mono_checked_build_test_enable_crash_reporting" = "xyes"; then
5459                 # Required
5460                 with_overridable_allocators=yes
5461                 AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
5463                 AC_DEFINE(ENABLE_CHECKED_BUILD_CRASH_REPORTING, 1, [Enable private types checked build])
5464         fi
5465 ], [])
5467 dnl End of checked builds
5469 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
5471 AC_CHECK_HEADER([malloc.h], 
5472                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
5473                         [Define to 1 if you have /usr/include/malloc.h.])],,)
5475 if test x"$GCC" = xyes; then
5476         # Implicit function declarations are not 64 bit safe
5477         # Do this late, since this causes lots of configure tests to fail
5478         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
5479         # jay has a lot of implicit declarations
5480         JAY_CFLAGS="-Wno-implicit-function-declaration"
5483 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
5484 # instead of libmono-static.a
5485 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
5486    LIBMONO_LA=libmini-static.la
5487 else
5488    if test x$buildsgen = xyes; then
5489       LIBMONO_LA=libmonosgen-$API_VER.la
5490    else
5491       LIBMONO_LA=libmonoboehm-$API_VER.la
5492    fi
5494 AC_SUBST(LIBMONO_LA)
5496 dnl **************
5497 dnl ***  Btls  ***
5498 dnl **************
5500 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
5501 AC_ARG_ENABLE(btls-lib, [  --disable-btls-lib             Disable building the BTLS native library], enable_btls_lib=$enableval, enable_btls_lib=$BTLS_SUPPORTED)
5502 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
5503 AC_ARG_WITH(btls_android_api, [  --with-btls-android-api        Android NDK API level for BTLS build])
5504 AC_ARG_WITH(btls_android_cmake_toolchain, [  --with-btls-android-cmake-toolchain        Path to the cmake toolchain file for Android])
5505 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])
5507 if test "x$with_btls_android_api" = "x" ; then
5508         case "$BTLS_PLATFORM" in
5509                 android-armv5)
5510                         with_btls_android_api=16" ;;
5511                 android-armv6)
5512                         with_btls_android_api=16" ;;
5513                 android-armv7)
5514                         with_btls_android_api=16 ;;
5515                 android-v8a)
5516                         with_btls_android_api=21 ;;
5517                 android-x86)
5518                         with_btls_android_api=16 ;;
5519                 android-x64)
5520                         with_btls_android_api=21 ;;
5521         esac
5524 if test "x$enable_btls" = "xno"; then
5525    enable_btls_lib=no
5528 AM_CONDITIONAL(BTLS, test x$enable_btls_lib = xyes)
5530 btls_android=no
5531 if test "x$enable_btls" = "xyes"; then
5532         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
5533         if test "x$CMAKE" = "xno"; then
5534                 AC_MSG_ERROR("cmake not found")
5535         fi
5537         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
5538         AC_SUBST(BTLS_ROOT)
5540         btls_arch=
5541         btls_cflags=
5542         BTLS_CMAKE_ARGS=
5544         if test "x$host_win32" = "xyes"; then
5545                 AC_CHECK_PROG(HAVE_YASM, yasm, yes, no)
5546         fi
5548         case "$BTLS_PLATFORM" in
5549         i386)
5550                 btls_arch=i386
5551                 btls_cflags="-m32"
5552                 case $host_os in
5553                         darwin*)
5554                                 btls_cflags="$btls_cflags -arch i386"
5555                                 ;;
5556                         mingw*|cygwin*)
5557                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5558                                 if test "x$HAVE_YASM" != "xyes"; then
5559                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5560                                 fi
5561                                 ;;
5562                 esac
5563                 ;;
5564         x86_64)
5565                 btls_arch=x86_64
5566                 case $host_os in
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         arm)
5576                 btls_arch=arm
5577                 btls_cflags="-DOPENSSL_NO_ASM=1"
5578                 ;;
5579         armsoft)
5580                 btls_arch=arm
5581                 btls_cflags="-DOPENSSL_NO_ASM=1"
5582                 ;;
5583         aarch64)
5584                 btls_arch=aarch64
5585                 btls_cflags="-march=armv8-a+crypto"
5586                 ;;
5587         s390x)
5588                 btls_arch=s390x
5589                 ;;
5590         powerpc)
5591                 btls_arch=powerpc
5592                 case $host_os in
5593                         aix*|os400*)
5594                                 btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
5595                                 BTLS_CMAKE_ARGS="-DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
5596                 esac
5597                 ;;
5598         android-armv5)
5599                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5600                 ;;
5601         android-armv6)
5602                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5603                 ;;
5604         android-armv7)
5605                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5606                 ;;
5607         android-v8a)
5608                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5609                 ;;
5610         android-x86)
5611                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5612                 ;;
5613         android-x64)
5614                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5615                 ;;
5616         riscv32)
5617                 btls_arch=riscv32
5618                 ;;
5619         riscv64)
5620                 btls_arch=riscv64
5621                 ;;
5622         *)
5623                 AC_MSG_ERROR(Invalid BTLS platform)
5624         esac
5626         if test "x$platform_android" = "xyes"; then
5627                 if test "x$with_btls_android_cmake_toolchain" = "x"; then
5628                    with_btls_android_cmake_toolchain="$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
5629                 fi
5631                 if test "x$with_btls_android_ndk_asm_workaround" != "x"; then
5632                    BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DENABLE_NDK_ARM_WORKAROUND=ON"
5633                 fi
5635                 btls_android=yes
5636                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$with_btls_android_cmake_toolchain"
5637                 if test "x$with_btls_android_ndk" != "x"; then
5638                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
5639                 else
5640                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
5641                 fi
5642         fi
5644         if test "x$btls_arch" != "x"; then
5645                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
5646         fi
5648         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
5649         AC_SUBST(BTLS_ARCH)
5650         AC_SUBST(BTLS_CFLAGS)
5651         AC_SUBST(BTLS_PLATFORM)
5652         AC_SUBST(BTLS_CMAKE_ARGS)
5654         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
5655 else
5656         enable_btls=no
5659 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
5661 if test x$DISABLE_MCS_DOCS = xyes; then
5662    docs_dir=""
5663 else
5664    docs_dir=docs
5666 AC_SUBST(docs_dir)
5668 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
5669 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
5670 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
5672 libmono_ldflags="$libmono_ldflags $LIBS"
5674 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
5675 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
5676 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
5677 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
5678 AM_CONDITIONAL(X86, test x$TARGET = xX86)
5679 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
5680 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
5681 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
5682 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
5683 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
5684 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64 -o x$TARGET = xARM6432)
5685 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
5686 AM_CONDITIONAL([RISCV], [test x$TARGET = xRISCV32 -o x$TARGET = xRISCV64])
5687 AM_CONDITIONAL([RISCV32], [test x$TARGET = xRISCV32])
5688 AM_CONDITIONAL([RISCV64], [test x$TARGET = xRISCV64])
5689 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
5690 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
5691 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
5692 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
5693 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
5694 AM_CONDITIONAL([HOST_RISCV], [test x$HOST = xRISCV32 -o x$HOST = xRISCV64])
5695 AM_CONDITIONAL([HOST_RISCV32], [test x$HOST = xRISCV32])
5696 AM_CONDITIONAL([HOST_RISCV64], [test x$HOST = xRISCV64])
5697 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
5699 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
5701 AC_SUBST(LIBC)
5702 AC_SUBST(INTL)
5703 AC_SUBST(SQLITE)
5704 AC_SUBST(SQLITE3)
5705 AC_SUBST(X11)
5706 AC_SUBST(GDKX11)
5707 AC_SUBST(GTKX11)
5708 AC_SUBST(XINERAMA)
5709 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
5710 AC_SUBST(arch_target)
5711 AC_SUBST(CFLAGS)
5712 AC_SUBST(CPPFLAGS)
5713 AC_SUBST(LDFLAGS)
5715 #This must always be defined when building the runtime
5716 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
5718 mono_build_root=`pwd`
5719 AC_SUBST(mono_build_root)
5721 AC_ARG_ENABLE(msvc,[  --enable-msvc    Build with Visual Studio (msvc) (defaults to no)], enable_msvc=$enableval, enable_msvc=no)
5722 if test x$host_win32 = xno; then
5723         if test x$enable_msvc = xyes; then
5724                 echo "Error, --enable-msvc only supported for Windows builds."
5725                 exit 1
5726         fi
5728 AM_CONDITIONAL(ENABLE_MSVC, test x$enable_msvc = xyes)
5730 if test "x$enable_msvc" = "xyes"; then
5731         if test "x$support_boehm" = "xyes"; then
5732                 echo "Error, Boehm GC is not supported when using --enable-msvc."
5733                 exit 1
5734         fi
5735         mono_msvc_build_dir='$(top_srcdir)'/msvc/build/sgen
5736         if test "x$host_cpu" = "xi686"; then
5737                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/Win32/lib/Release
5738                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/Win32/bin/Release
5739                 mono_runtime=msvc/build/sgen/Win32/bin/Release/mono-sgen.exe
5740                 mono_runtime_wrapper=$mono_runtime
5741         else
5742                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/x64/lib/Release
5743                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/x64/bin/Release
5744                 mono_runtime=msvc/build/sgen/x64/bin/Release/mono-sgen.exe
5745                 mono_runtime_wrapper=msvc/build/sgen/x64/bin/Release/mono-sgen-msvc.sh
5746         fi
5747         AC_SUBST(mono_msvc_build_dir)
5748         AC_SUBST(mono_msvc_build_lib_dir)
5749         AC_SUBST(mono_msvc_build_bin_dir)
5750 else
5751         mono_runtime=mono/mini/mono
5752         mono_runtime_wrapper=$mono_runtime
5755 AC_SUBST(mono_runtime)
5756 AC_SUBST(mono_runtime_wrapper)
5758 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/Microsoft.Net.Compilers.2.8.2/tools/csc.exe
5760 if test $csc_compiler = mcs; then
5761   CSC=$mcs_topdir/class/lib/build/mcs.exe
5762 else
5763   CSC=$CSC_LOCATION
5766 AM_CONDITIONAL([CSC_IS_ROSLYN], [test x$csc_compiler != xmcs])
5768 mono_cfg_root=$mono_build_root/runtime
5769 if test x$host_win32 = xyes; then
5770   if test "x$cross_compiling" = "xno"; then
5771     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
5772     CSC=`cygpath -m -a $CSC`
5773     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
5774   else
5775     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
5776   fi
5777 else
5778   mono_cfg_dir=$mono_cfg_root/etc
5781 if test "x$platform_android" = "xyes"; then
5782   mono_cfg_dir=
5785 AC_SUBST(mono_cfg_dir)
5787 AC_SUBST(CSC)
5789 AC_CONFIG_FILES([po/mcs/Makefile.in])
5791 AC_CONFIG_FILES([acceptance-tests/microbench-perf.sh],[chmod +x acceptance-tests/microbench-perf.sh])
5792 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
5793 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
5795 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
5796 [   depth=../../../..
5797     case $srcdir in
5798     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5799     .) reldir=$depth ;;
5800     *) reldir=$depth/$srcdir ;;
5801     esac
5802     $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
5803     cd runtime/etc/mono/1.0
5804     rm -f machine.config
5805     $LN_S $reldir/data/net_1_1/machine.config machine.config
5806     cd $depth
5807 ],[LN_S='$LN_S'])
5809 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
5810 [   depth=../../../..
5811     case $srcdir in
5812     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5813     .) reldir=$depth ;;
5814     *) reldir=$depth/$srcdir ;;
5815     esac
5816     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5817     cd runtime/etc/mono/2.0
5818     rm -f machine.config
5819     $LN_S $reldir/data/net_2_0/machine.config machine.config
5820     cd $depth
5821 ],[LN_S='$LN_S'])
5823 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
5824 [   depth=../../../..
5825     case $srcdir in
5826     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5827     .) reldir=$depth ;;
5828     *) reldir=$depth/$srcdir ;;
5829     esac
5830     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5831     cd runtime/etc/mono/2.0
5832     rm -f web.config
5833     $LN_S $reldir/data/net_2_0/web.config web.config
5834     cd $depth
5835 ],[LN_S='$LN_S'])
5837 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
5838 [   depth=../../..
5839     case $srcdir in
5840     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5841     .) reldir=$depth ;;
5842     *) reldir=$depth/$srcdir ;;
5843     esac
5844     $ac_aux_dir/install-sh -d runtime/etc/mono/
5845     cd runtime/etc/mono/
5846     rm -f browscap.ini
5847     $LN_S $reldir/data/browscap.ini browscap.ini
5848     cd $depth
5849 ],[LN_S='$LN_S'])
5851 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
5852 [   depth=../../../../..
5853     case $srcdir in
5854     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5855     .) reldir=$depth ;;
5856     *) reldir=$depth/$srcdir ;;
5857     esac
5858     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
5859     cd runtime/etc/mono/2.0/Browsers
5860     rm -f Compat.browser
5861     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5862     cd $depth
5863 ],[LN_S='$LN_S'])
5865 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
5866 [   depth=../../../../..
5867     case $srcdir in
5868     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5869     .) reldir=$depth ;;
5870     *) reldir=$depth/$srcdir ;;
5871     esac
5872     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
5873     cd runtime/etc/mono/4.0/Browsers
5874     rm -f Compat.browser
5875     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5876     cd $depth
5877 ],[LN_S='$LN_S'])
5879 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
5880 [   depth=../../../../..
5881     case $srcdir in
5882     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5883     .) reldir=$depth ;;
5884     *) reldir=$depth/$srcdir ;;
5885     esac
5886     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
5887     cd runtime/etc/mono/4.5/Browsers
5888     rm -f Compat.browser
5889     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5890     cd $depth
5891 ],[LN_S='$LN_S'])
5893 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
5894 [   depth=../../../..
5895     case $srcdir in
5896     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5897     .) reldir=$depth ;;
5898     *) reldir=$depth/$srcdir ;;
5899     esac
5900     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5901     cd runtime/etc/mono/4.0
5902     rm -f machine.config
5903     $LN_S $reldir/data/net_4_0/machine.config machine.config
5904     cd $depth
5905 ],[LN_S='$LN_S'])
5907 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
5908 [   depth=../../../..
5909     case $srcdir in
5910     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5911     .) reldir=$depth ;;
5912     *) reldir=$depth/$srcdir ;;
5913     esac
5914     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5915     cd runtime/etc/mono/4.0
5916     rm -f web.config
5917     $LN_S $reldir/data/net_4_0/web.config web.config
5918     cd $depth
5919 ],[LN_S='$LN_S'])
5921 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
5922 [   depth=../../../..
5923     case $srcdir in
5924     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5925     .) reldir=$depth ;;
5926     *) reldir=$depth/$srcdir ;;
5927     esac
5928     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5929     cd runtime/etc/mono/4.5
5930     rm -f machine.config
5931     $LN_S $reldir/data/net_4_5/machine.config machine.config
5932     cd $depth
5933 ],[LN_S='$LN_S'])
5935 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
5936 [   depth=../../../..
5937     case $srcdir in
5938     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5939     .) reldir=$depth ;;
5940     *) reldir=$depth/$srcdir ;;
5941     esac
5942     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5943     cd runtime/etc/mono/4.5
5944     rm -f web.config
5945     $LN_S $reldir/data/net_4_5/web.config web.config
5946     cd $depth
5947 ],[LN_S='$LN_S'])
5949 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])
5950 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])
5951 AC_CONFIG_COMMANDS([clean-llvm], [rm -f llvm/llvm_config.mk])
5953 # Anything involving -Werror must be done late because autoconf depends on compiling with warnings to be success.
5954 if test x"$GCC" = xyes -a "x$with_jemalloc" != "xyes"; then
5956         # incompatible-pointer-types requires gcc circa 5.x
5958         ORIG_CFLAGS=$CFLAGS
5959         CFLAGS="$CFLAGS -Wincompatible-pointer-types -Werror"
5960         AC_MSG_CHECKING(for -Wincompatible-pointer-types option to gcc)
5961         AC_TRY_COMPILE([],[
5962         ], [
5963                 AC_MSG_RESULT(yes)
5964                 CFLAGS="$ORIG_CFLAGS -Werror=incompatible-pointer-types"
5965         ], [
5966                 AC_MSG_RESULT(no)
5967                 CFLAGS=$ORIG_CFLAGS
5968         ])
5970         CFLAGS="$CFLAGS -Werror=return-type"
5974 # Mono.Native Support
5975 # -------------------
5976 # Mono.Native is the new name for both System.Native and System.Security.Cryptography.Apple.
5977 # It is built as a stand-alone shared library and not bundled with the runtime because we
5978 # may need to build two different versions of it.
5980 # Starting with macOS 10.12+ and iOS 10+, Apple introduced a new Unified API for some of the
5981 # crypto primitives that we're using as part of System.Security.Cryptography.Apple.
5983 # On Desktop, we can check at runtime whether the OS version is recent enough and switch
5984 # implementation accordingly.  We build a single `libmono-native` shared library.
5986 # However, on Mobile we cannot have any undefined symbols as this would break Bitcode.
5988 # During the mobile build, we are called with `CFLAGS` containing an explicit minium version flag,
5989 # which is eiter `-mmacosx-version-min=`, `-mios-simulator-version-min=` or `-miphoneos-version-min=`
5990 # depending on platform.
5992 # We build two versions of the shared library:
5993 # - `libmono-native-compat` is built with whichever minimum version is passed to us via `CFLAGS`.
5994 # - `libmono-native-unifed` is built with the minimum version set to macOS 10.12+ / iOS 10+.
5996 # For testing purpuses, there is a function called `mono_native_get_platform_type ()`
5997 # (see mono/native/mono-native-platform.c), which returns a `MonoNativePlatformType` enum value.
5998 # There is also `Mono.MonoNativePlatform.GetPlatformType ()` (see mcs/class/corlib/Test/Mono/MonoNativePlatform.cs).
6000 # This can be called by automated tests both to ensure that the library has been correctly installed and also
6001 # to verify that it's the correct version of it.
6004 AC_MSG_CHECKING([Mono.Native support])
6005 sed_version_pattern='[[0-9]]\{1,2\}\(\.[[0-9]]\{1,2\}\)'
6006 if test x$disable_mono_native = xyes; then
6007         mono_native=no
6008 elif test x$target_osx = xyes; then
6009         MONO_NATIVE_CC=$CC
6010         MONO_NATIVE_CXX=$CXX
6011         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6012         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6013         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6014         MONO_NATIVE_CFLAGS=$CFLAGS
6015         MONO_NATIVE_LDFLAGS=$LDFLAGS
6017         mono_native=yes
6018         MONO_NATIVE_PLATFORM=macos
6019         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_MACOS"
6021         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer],
6022                 [!(MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12)])
6024         if test x$mono_native_compat = xyes; then
6025                 mono_native_compat=yes
6026                 mono_native_text="Mac OSX (compat + unified v10.12)"
6027                 MONO_NATIVE_COMPAT_CCASFLAGS=$MONO_NATIVE_CCASFLAGS
6028                 MONO_NATIVE_COMPAT_CPPFLAGS=$MONO_NATIVE_CPPFLAGS
6029                 MONO_NATIVE_COMPAT_CXXFLAGS=$MONO_NATIVE_CXXFLAGS
6030                 MONO_NATIVE_COMPAT_CFLAGS=$MONO_NATIVE_CFLAGS
6031                 MONO_NATIVE_COMPAT_LDFLAGS=$MONO_NATIVE_LDFLAGS
6033                 sed_remove_mac_version_pattern="s/-mmacosx-version-min=$sed_version_pattern//g"
6034                 MONO_NATIVE_UNIFIED_CCASFLAGS="`echo $CCASFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6035                 MONO_NATIVE_UNIFIED_CPPFLAGS="`echo $CPPFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6036                 MONO_NATIVE_UNIFIED_CXXFLAGS="`echo $CXXFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6037                 MONO_NATIVE_UNIFIED_CFLAGS="`echo $CFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6038                 MONO_NATIVE_UNIFIED_LDFLAGS="`echo $LDFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6039         else
6040                 mono_native_compat=no
6041                 mono_native_text="Mac OSX"
6042         fi
6043 elif test x$mono_native_platform_ios = xyes; then
6044         AC_MONO_APPLE_TARGET(TARGET_OS_SIMULATOR, [mono_native_ios_sim=yes], [mono_native_ios_sim=no])
6046         AC_MONO_APPLE_TARGET(TARGET_OS_IOS, [
6047                 if test x$mono_native_ios_sim = xyes; then
6048                         mono_native_ios_target=ios-simulator
6049                         mono_native_text="iOS Simulator"
6050                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6051                 else
6052                         mono_native_ios_target=iphoneos
6053                         mono_native_text="iOS Device"
6054                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6055                 fi
6056                 mono_native_unified_version="10.0"
6057                 mono_native_compat_check="__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_10_0"
6058         ], [
6059                 AC_MONO_APPLE_TARGET(TARGET_OS_TV, [
6060                         if test x$mono_native_ios_sim = xyes; then
6061                                 mono_native_ios_target=tvos-simulator
6062                                 mono_native_text="AppleTV Simulator"
6063                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6064                         else
6065                                 mono_native_ios_target=tvos
6066                                 mono_native_text="AppleTV Device"
6067                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6068                         fi
6069                         mono_native_unified_version="10.0"
6070                         mono_native_compat_check="__TV_OS_VERSION_MIN_REQUIRED >= __TVOS_10_0"
6071                 ], [
6072                         AC_MONO_APPLE_TARGET(TARGET_OS_WATCH, [
6073                                 if test x$mono_native_ios_sim = xyes; then
6074                                         mono_native_ios_target=watchos-simulator
6075                                         mono_native_text="Apple Watch Simulator"
6076                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6077                                 else
6078                                         mono_native_ios_target=watchos
6079                                         mono_native_text="Apple Watch Device"
6080                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6081                                 fi
6082                                 mono_native_unified_version="5.0"
6083                                 mono_native_compat_check="__WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_5_0"
6084                         ], [
6085                                 AC_MSG_ERROR([Unknown iOS Target])
6086                         ])
6087                 ])
6088         ])
6090         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer], [!($mono_native_compat_check)])
6092         if test x$with_bitcode = xyes; then
6093                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -no-undefined -fatal_warnings"
6094                 MONO_NATIVE_LIBADD="../mini/$LIBMONO_LA"
6095         else
6096                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -fatal_warnings"
6097         fi
6099         if test x$enable_gss = xyes; then
6100                 mono_native_ldflags="$mono_native_ldflags -framework GSS"
6101         fi
6103         MONO_NATIVE_CC=$CC
6104         MONO_NATIVE_CXX=$CXX
6105         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6106         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6107         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6108         MONO_NATIVE_CFLAGS=$CFLAGS
6109         MONO_NATIVE_LDFLAGS="$LDFLAGS $mono_native_ldflags"
6111         if test x$mono_native_compat = xyes; then
6112                 mono_native_text="$mono_native_text (compat + unified v$mono_native_unified_version)"
6113                 MONO_NATIVE_COMPAT_CCASFLAGS=$MONO_NATIVE_CCASFLAGS
6114                 MONO_NATIVE_COMPAT_CPPFLAGS=$MONO_NATIVE_CPPFLAGS
6115                 MONO_NATIVE_COMPAT_CXXFLAGS=$MONO_NATIVE_CXXFLAGS
6116                 MONO_NATIVE_COMPAT_CFLAGS=$MONO_NATIVE_CFLAGS
6117                 MONO_NATIVE_COMPAT_LDFLAGS=$MONO_NATIVE_LDFLAGS
6119                 sed_remove_ios_version_pattern="s/-m\(.*\)-version-min=$sed_version_pattern//g"
6120                 MONO_NATIVE_UNIFIED_CCASFLAGS="`echo $CCASFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6121                 MONO_NATIVE_UNIFIED_CPPFLAGS="`echo $CPPFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6122                 MONO_NATIVE_UNIFIED_CXXFLAGS="`echo $CXXFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6123                 MONO_NATIVE_UNIFIED_CFLAGS="`echo $CFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6124                 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"
6125         fi
6127         mono_native=yes
6128         MONO_NATIVE_PLATFORM=ios
6129 elif test x$host_linux = xyes; then
6130         mono_native_text="Linux"
6131         MONO_NATIVE_CC=$CC
6132         MONO_NATIVE_CXX=$CXX
6133         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6134         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6135         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6136         MONO_NATIVE_CFLAGS=$CFLAGS
6137         MONO_NATIVE_LDFLAGS=$LDFLAGS
6139         mono_native=yes
6140         mono_native_compat=no
6141         MONO_NATIVE_PLATFORM=linux
6143         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
6144 elif test x$target_wasm = xyes; then
6145         mono_native_text="wasm"
6146         MONO_NATIVE_CC=$CC
6147         MONO_NATIVE_CXX=$CXX
6148         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6149         # The system.native code uses _WASM_ to check for wasm
6150         MONO_NATIVE_CPPFLAGS="$CPPFLAGS -D_WASM_"
6151         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6152         MONO_NATIVE_CFLAGS=$CFLAGS
6153         MONO_NATIVE_LDFLAGS=$LDFLAGS
6155         mono_native=yes
6156         mono_native_compat=no
6157         MONO_NATIVE_PLATFORM=linux
6159         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
6160 elif case $host_os in aix*|os400*) true;; *) false;; esac; then
6161         mono_native_text="AIX"
6162         MONO_NATIVE_CC=$CC
6163         MONO_NATIVE_CXX=$CXX
6164         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6165         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6166         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6167         MONO_NATIVE_CFLAGS=$CFLAGS
6168         dnl flock in AIX exists in libbsd (not the same as freedesktop.org
6169         dnl libbsd) which Mono.Native needs.
6170         dnl Because of the way that the library is built by default, unresolved
6171         dnl references are kept and resolved at runtime. Often, the dependency
6172         dnl chain means libbsd is loaded anyways, but not necessarily. It's
6173         dnl better to explicitly link it, even though it has it shadows libc's
6174         dnl ioctl with its own. (As for the other unresolved imports, those
6175         dnl should be provided by the Mono runtime loaded.)
6176         MONO_NATIVE_LDFLAGS="$LDFLAGS -lbsd"
6178         mono_native=yes
6179         mono_native_compat=no
6180         MONO_NATIVE_PLATFORM=aix
6182         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_AIX"
6183 elif case $host_os in freebsd*) true;; *) false;; esac; then
6184         mono_native_text="FreeBSD"
6185         MONO_NATIVE_CC=$CC
6186         MONO_NATIVE_CXX=$CXX
6187         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6188         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6189         MONO_NATIVE_CFLAGS=$CFLAGS
6190         MONO_NATIVE_LDFLAGS=$LDFLAGS
6192         mono_native=yes
6193         mono_native_compat=no
6194         MONO_NATIVE_PLATFORM=freebsd
6195         AC_MSG_CHECKING([Mono.Native support])
6196         AC_MSG_RESULT(freebsd)
6198         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_FREEBSD"
6199 elif test x$platform_android = xyes; then
6200         mono_native_text="Android"
6201         MONO_NATIVE_CC=$CC
6202         MONO_NATIVE_CXX=$CXX
6203         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6204         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6205         MONO_NATIVE_CFLAGS=$CFLAGS
6206         MONO_NATIVE_LDFLAGS=$LDFLAGS
6208         mono_native=yes
6209         mono_native_compat=no
6210         MONO_NATIVE_PLATFORM=android
6212         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_ANDROID"
6213 else
6214         mono_native=no
6215         mono_native_text="no"
6218 AC_MSG_RESULT($mono_native_text)
6220 if test x$mono_native_compat = xyes; then
6221         MONO_NATIVE_LIBRARY_NAME=libmono-native-compat
6222 else
6223         MONO_NATIVE_LIBRARY_NAME=libmono-native
6226 AC_SUBST(MONO_NATIVE_PLATFORM)
6227 AC_SUBST(MONO_NATIVE_CC)
6228 AC_SUBST(MONO_NATIVE_CXX)
6229 AC_SUBST(MONO_NATIVE_CCASFLAGS)
6230 AC_SUBST(MONO_NATIVE_COMPAT_CCASFLAGS)
6231 AC_SUBST(MONO_NATIVE_UNIFIED_CCASFLAGS)
6232 AC_SUBST(MONO_NATIVE_CPPFLAGS)
6233 AC_SUBST(MONO_NATIVE_COMPAT_CPPFLAGS)
6234 AC_SUBST(MONO_NATIVE_UNIFIED_CPPFLAGS)
6235 AC_SUBST(MONO_NATIVE_CXXFLAGS)
6236 AC_SUBST(MONO_NATIVE_COMPAT_CXXFLAGS)
6237 AC_SUBST(MONO_NATIVE_UNIFIED_CXXFLAGS)
6238 AC_SUBST(MONO_NATIVE_CFLAGS)
6239 AC_SUBST(MONO_NATIVE_COMPAT_CFLAGS)
6240 AC_SUBST(MONO_NATIVE_UNIFIED_CFLAGS)
6241 AC_SUBST(MONO_NATIVE_LDFLAGS)
6242 AC_SUBST(MONO_NATIVE_COMPAT_LDFLAGS)
6243 AC_SUBST(MONO_NATIVE_UNIFIED_LDFLAGS)
6244 AC_SUBST(MONO_NATIVE_LIBRARY_NAME)
6245 AC_SUBST(MONO_NATIVE_LIBADD)
6247 AM_CONDITIONAL(MONO_NATIVE, test x$mono_native = xyes)
6248 AM_CONDITIONAL(MONO_NATIVE_COMPAT, test x$mono_native_compat = xyes)
6249 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_MACOS, test x$MONO_NATIVE_PLATFORM = xmacos)
6250 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_IOS, test x$MONO_NATIVE_PLATFORM = xios)
6251 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_LINUX, test x$MONO_NATIVE_PLATFORM = xlinux)
6252 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_AIX, test x$MONO_NATIVE_PLATFORM = xaix)
6253 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_ANDROID, test x$MONO_NATIVE_PLATFORM = xandroid)
6254 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_FREEBSD, test x$MONO_NATIVE_PLATFORM = xfreebsd)
6256 MONO_NATIVE_PLATFORM_TYPE_COMPAT="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_COMPAT"
6257 MONO_NATIVE_PLATFORM_TYPE_UNIFIED="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_UNIFIED"
6258 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE)
6259 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_COMPAT)
6260 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_UNIFIED)
6262 ### C++ Linker selection
6264 # We have to lie to autotools, sometimes.
6266 # If we're building with llvm compiled into Mono, set MONO_CXXLD to CXX,
6267 # otherwise to CC.  We want C linking even if we're compiling with C++ enabled
6268 # because we do not want to link inthe C++ runtime library (-lstdc++ or -lc++),
6269 # except if we're linking with LLVM which relies on it.
6271 # Explanation of the hack:
6273 # According to
6274 # https://www.gnu.org/software/automake/manual/html_node/How-the-Linker-is-Chosen.html,
6275 # automake chooses the linker that it used to compile a target based on the
6276 # _SOURCES for that target.  If the target is comprised of only C code, it
6277 # chooses the C linker (on Linux and OSX this is just gcc or clang called with
6278 # linker arguments and a -o).  If the target _SOURCES include at least one C++ file, 
6279 # then automake chooses the C++ linker (usually g++ or clang++ called with linker arguments and -o).
6281 # The problem for Mono is that we don't want the C++ runtime library (libstdc++
6282 # or libc++) linked in - even when Mono is written in C++, we take care not to
6283 # require the runtime library.  As a result, we don't want g++ or clang++ to do
6284 # the linking.  On the other hand if LLVM is enabled, then we _must_ use the
6285 # C++ linker - LLVM doesn't have the same restrictions.
6287 # So the trick is we set MONO_CXXLD here to $CXX or $CC and in
6288 #  mono/mini/Makefile.am.in we have CCLD=$MONO_CXXLD and CXXLD=$MONO_CXXLD which bypasses
6289 #  automake's autodetection and lets us use the linker that we want.
6291 if test "x$enable_llvm_runtime" = "xyes"; then
6292         AC_SUBST(MONO_CXXLD, [$CXX])
6293 else
6294         AC_SUBST(MONO_CXXLD, [$CC])
6297 # Update all submodules recursively to ensure everything is checked out
6298 (cd $srcdir && scripts/update_submodules.sh)
6300 AC_OUTPUT([
6301 Makefile
6302 mono-uninstalled.pc
6303 acceptance-tests/Makefile
6304 llvm/Makefile
6305 scripts/mono-find-provides
6306 scripts/mono-find-requires
6307 mk/Makefile
6308 mono/Makefile
6309 mono/btls/Makefile
6310 mono/native/Makefile
6311 mono/utils/Makefile
6312 mono/utils/jemalloc/Makefile
6313 mono/metadata/Makefile
6314 mono/dis/Makefile
6315 mono/cil/Makefile
6316 mono/arch/Makefile
6317 mono/arch/x86/Makefile
6318 mono/arch/amd64/Makefile
6319 mono/arch/ppc/Makefile
6320 mono/arch/sparc/Makefile
6321 mono/arch/s390x/Makefile
6322 mono/arch/arm/Makefile
6323 mono/arch/arm64/Makefile
6324 mono/arch/mips/Makefile
6325 mono/arch/riscv/Makefile
6326 mono/sgen/Makefile
6327 mono/native/platform-type.c
6328 mono/native/platform-type-compat.c
6329 mono/native/platform-type-unified.c
6330 mono/tests/Makefile
6331 mono/tests/assembly-load-reference/Makefile
6332 mono/tests/tests-config
6333 mono/tests/gc-descriptors/Makefile
6334 mono/tests/testing_gac/Makefile
6335 mono/tests/fullaot-mixed/Makefile
6336 mono/tests/llvmonly-mixed/Makefile
6337 mono/unit-tests/Makefile
6338 mono/benchmark/Makefile
6339 mono/mini/Makefile
6340 mono/profiler/Makefile
6341 mono/eglib/Makefile
6342 mono/eglib/eglib-config.h
6343 mono/eglib/test/Makefile
6344 m4/Makefile
6345 ikvm-native/Makefile
6346 scripts/Makefile
6347 man/Makefile
6348 docs/Makefile
6349 data/Makefile
6350 data/net_2_0/Makefile
6351 data/net_4_0/Makefile
6352 data/net_4_5/Makefile
6353 data/net_2_0/Browsers/Makefile
6354 data/net_4_0/Browsers/Makefile
6355 data/net_4_5/Browsers/Makefile
6356 data/mint.pc
6357 data/mono-2.pc
6358 data/monosgen-2.pc
6359 data/mono.pc
6360 data/mono-cairo.pc
6361 data/mono-nunit.pc
6362 data/mono-options.pc
6363 data/mono-lineeditor.pc
6364 data/monodoc.pc
6365 data/dotnet.pc
6366 data/dotnet35.pc
6367 data/wcf.pc
6368 data/cecil.pc
6369 data/system.web.extensions_1.0.pc
6370 data/system.web.extensions.design_1.0.pc
6371 data/system.web.mvc.pc
6372 data/system.web.mvc2.pc
6373 data/system.web.mvc3.pc
6374 data/aspnetwebstack.pc
6375 data/reactive.pc
6376 samples/Makefile
6377 support/Makefile
6378 data/config
6379 tools/Makefile
6380 tools/locale-builder/Makefile
6381 tools/sgen/Makefile
6382 tools/monograph/Makefile
6383 tools/pedump/Makefile
6384 runtime/Makefile
6385 msvc/Makefile
6386 po/Makefile
6389 if test x$host_win32 = xyes; then
6390    # Get rid of 'cyg' prefixes in library names
6391    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6392    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
6393    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
6394    # executable doesn't work...
6395    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6398 if test x$host_darwin = xyes; then
6399    # This doesn't seem to be required and it slows down parallel builds
6400    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
6404   case $prefix in
6405   NONE) prefix=$ac_default_prefix ;;
6406   esac
6407   case $exec_prefix in
6408   NONE) exec_prefix='${prefix}' ;;
6409   esac
6411   #
6412   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
6413   # any existing config.make.  This allows people to share the same source tree
6414   # with different build directories, one native and one cross
6415   #
6416   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
6418     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
6420     echo "prefix=$prefix" > $mcs_topdir/build/config.make
6421     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
6422     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
6423     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
6424     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
6425     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
6426     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
6427     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
6428     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
6430     case $INSTALL in
6431     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
6432     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
6433     esac
6435     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
6437     export VERSION
6438     [myver=$($AWK 'BEGIN {
6439       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
6440       if(length(vsplit [1]) > 4) {
6441         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
6442       }
6443       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
6444     }')]
6446     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
6447     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
6449     if test x$host_darwin = xyes; then
6450       echo "BUILD_PLATFORM = macos" >> $mcs_topdir/build/config.make
6451       echo "HOST_PLATFORM ?= macos" >> $mcs_topdir/build/config.make
6452       echo "XTEST_PLATFORM ?= osx" >> $mcs_topdir/build/config.make
6453     elif test x$host_win32 = xyes; then
6454       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
6455       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
6456       echo "XTEST_PLATFORM ?= windows" >> $mcs_topdir/build/config.make
6457     elif test x$host_linux = xyes; then
6458       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
6459       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6460       echo "XTEST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6461     else
6462       echo "BUILD_PLATFORM = unix" >> $mcs_topdir/build/config.make
6463       echo "HOST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6464       echo "XTEST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6465     fi
6467     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
6468       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
6469     fi
6471         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
6472            enable_system_aot=yes
6473         fi
6475     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
6476       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
6477     fi
6479     if test x$DISABLE_MCS_DOCS = xyes; then
6480       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
6481     fi
6483     if test x$has_extension_module != xno; then
6484         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
6485     fi
6486     
6487     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
6488     
6489     if test "x$test_bcl_opt" = "xyes"; then    
6490       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
6491     fi
6493     echo "STANDALONE_CSC_LOCATION=$CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
6494     echo "SERVER_CSC_LOCATION?=$CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
6495     echo "VBCS_LOCATION?=" >> $srcdir/$mcsdir/build/config.make
6497     if test $csc_compiler = mcs; then
6498       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
6499     fi
6501     if test "x$AOT_BUILD_FLAGS" != "x" ; then
6502       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
6503       echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
6504       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
6505     fi
6507     if test "x$AOT_MODE" != "x" ; then
6508       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
6509     fi
6511     if test "x$enable_btls" = "xyes"; then
6512       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
6513     fi
6515     if test "x$mono_native" = "xyes"; then
6516       echo "MONO_NATIVE_SUPPORTED=true" >> $srcdir/$mcsdir/build/config.make
6517     else
6518       echo "MONO_NATIVE_SUPPORTED=false" >> $srcdir/$mcsdir/build/config.make
6519     fi
6521     if test x$mono_native_compat = xyes; then
6522       echo "MONO_NATIVE_USING_COMPAT=true" >> $srcdir/$mcsdir/build/config.make
6523     else
6524       echo "MONO_NATIVE_USING_COMPAT=false" >> $srcdir/$mcsdir/build/config.make
6525     fi
6527     echo "MONO_NATIVE_PLATFORM_TYPE=$MONO_NATIVE_PLATFORM_TYPE" >> $srcdir/$mcsdir/build/config.make
6528     echo "MONO_NATIVE_PLATFORM=$MONO_NATIVE_PLATFORM" >> $srcdir/$mcsdir/build/config.make
6529     if test x$enable_compiler_server = xyes; then
6530       echo "ENABLE_COMPILER_SERVER?=1" >> $srcdir/$mcsdir/build/config.make
6531     else
6532       echo "ENABLE_COMPILER_SERVER?=0" >> $srcdir/$mcsdir/build/config.make
6533     fi
6534     echo "COMPILER_SERVER_PIPENAME?=monomake" >> $srcdir/$mcsdir/build/config.make
6536   fi
6540 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
6542 btls_platform_string=
6543 if test x$enable_btls = xyes; then
6544         if test x$btls_android = xyes; then
6545                 btls_platform_string=" (android:$BTLS_PLATFORM)"
6546         else
6547                 btls_platform_string=" ($BTLS_PLATFORM)"
6548         fi
6551 thread_suspend_msg=
6552 if test x$buildsgen = xyes; then
6553         if test x$enable_cooperative_suspend != xno; then
6554                 thread_suspend_msg="Suspend:       Cooperative"
6555         elif test x$enable_hybrid_suspend != xno; then
6556                 thread_suspend_msg="Suspend:       Hybrid"
6557         else
6558                 thread_suspend_msg="Suspend:       Preemptive"
6559         fi
6561         
6562 echo "
6563         mcs source:    $mcsdir
6564         C# Compiler:   $csc_compiler
6566    Engine:
6567         Host:          $host
6568         Target:        $target
6569         GC:            $gc_msg 
6570         $thread_suspend_msg
6571         TLS:           $with_tls
6572         SIGALTSTACK:   $with_sigaltstack
6573         Engine:        $jit_status
6574         BigArrays:     $enable_big_arrays
6575         DTrace:        $enable_dtrace
6576         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm, built in-tree: $internal_llvm, assertions: $enable_llvm_asserts, msvc only: $enable_llvm_msvc_only)
6577         Spectre:       $spectre_mitigation_status
6578         Mono.Native:   $mono_native_text
6580    Libraries:
6581         .NET 4.x:        $with_profile4_x
6582         Xamarin.Android: $with_monodroid
6583         Xamarin.iOS:     $with_monotouch
6584         Xamarin.WatchOS: $with_monotouch_watch
6585         Xamarin.TVOS:    $with_monotouch_tv
6586         Xamarin.Mac:     $with_xammac
6587         Windows AOT:     $with_winaot
6588         Orbis:           $with_orbis
6589         Unreal:          $with_unreal
6590         WebAssembly:     $with_wasm
6591         Test profiles:   AOT Full ($with_testing_aot_full), AOT Hybrid ($with_testing_aot_hybrid)
6592         JNI support:     $jdk_headers_found
6593         libgdiplus:      $libgdiplus_msg
6594         zlib:            $zlib_msg
6595         BTLS:            $enable_btls$btls_platform_string
6596         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
6597         crash reporting: $crash_reporting (private crashes: $with_crash_privacy)
6598         .NET Core:       $with_core
6599         $disabled
6601 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
6602    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)