[Mono.Runtime.Tests] Exclude simd tests
[mono-project.git] / configure.ac
blob73d8391f5a0bc002e8c25e8b923cfd6fd9fc1307
1 # Process this file with autoconf to produce a configure script.
2 #AC_PREREQ([2.62])
4 AC_INIT(mono, [6.0.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-xz 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=9032116E-BB4E-4ED5-9C71-9E5E0B0230CA
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         *-*-aix*|*-*-os400*)
404                 dnl Set up a 64-bit build
405                 CPPFLAGS="$CPPFLAGS -maix64 -DGC_AIX_THREADS -D_ALL_SOURCE -D_THREAD_SAFE -D_LARGE_FILES -D_REENTRANT"
406                 LDFLAGS="-maix64"
407                 libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
408                 dnl Would you believe GNU nm doesn't know how to process AIX libraries?
409                 dnl Hardcode IBM binutils in case GNU ones end up on our path. Also
410                 dnl specifiy 64-bit mode for tools.
411                 AR="/usr/bin/ar -X64"
412                 NM="/usr/bin/nm -X64"
413                 dnl SGen is the future (changes to Boehm support code would be
414                 dnl required if you wish to re-enable Boehm)
415                 support_boehm=no
416                 with_gc=sgen
417                 need_link_unlink=yes
418                 use_sigposix=yes
419                 dnl the valloc call to alloc the guard page bombs out, even with extending the data area
420                 with_sigaltstack=no
421                 dnl use pthread TLS, __thread has issues with the compiler flags we use
422                 with_tls=pthread
423                 dnl ppc Linux is the same? test further
424                 disable_munmap=yes
425                 ;;
426         *)
427                 AC_MSG_WARN([*** Please add $host to configure.ac checks!])
428                 libdl="-ldl"
429                 ;;
430 esac
432 AC_MSG_RESULT(ok)
434 if test x$need_link_unlink = xyes; then
435    AC_DEFINE(NEED_LINK_UNLINK, 1, [Define if Unix sockets cannot be created in an anonymous namespace])
438 if test x$host_win32 = xyes; then
439    AC_DEFINE(HOST_WIN32, 1, [Host Platform is Win32])
442 if test x$target_win32 = xyes; then
443    AC_DEFINE(TARGET_WIN32, 1, [Target Platform is Win32])
446 if test x$host_darwin = xyes; then
447    AC_DEFINE(HOST_DARWIN, 1, [Host Platform is Darwin])
450 # Defined for all targets/platforms using classic Windows API support.
451 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
452 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
454 AC_SUBST(extra_runtime_ldflags)
455 AM_CONDITIONAL(HOST_WIN32, test x$host_win32 = xyes)
456 AM_CONDITIONAL(TARGET_WIN32, test x$target_win32 = xyes)
457 AM_CONDITIONAL(HOST_LINUX, echo x$target_os | grep -q linux)
458 AM_CONDITIONAL(HOST_DARWIN, test x$host_darwin = xyes)
459 AM_CONDITIONAL(HOST_SIGPOSIX, test x$use_sigposix = xyes)
460 AM_CONDITIONAL(HOST_ANDROID, test x$platform_android = xyes)
461 AM_CONDITIONAL(HOST_TIZEN, test x$platform_tizen = xyes)
462 AM_CONDITIONAL(HOST_IOS, test x$platform_ios = xyes)
463 AM_CONDITIONAL(HOST_WASM, test x$platform_wasm = xyes)
465 if test -z "$HOST_DARWIN_TRUE"; then :
466 PLATFORM_AOT_SUFFIX=.dylib
469 if test -z "$HOST_LINUX_TRUE"; then :
470 PLATFORM_AOT_SUFFIX=.so
473 if test -z "$HOST_WIN32_TRUE"; then :
474 PLATFORM_AOT_SUFFIX=.dll
477 AC_SUBST(PLATFORM_AOT_SUFFIX)
479 if test -z "$HOST_WASM_TRUE"; then :
480 AC_DEFINE(HAVE_UTIME)
481 AC_DEFINE(HAVE_UTIMES)
484 ## PLATFORM_AOT_SUFFIX not so simple for windows :-)
486 AC_CHECK_TOOL(CC, gcc, gcc)
487 AC_PROG_CC
488 AC_CHECK_TOOL(CXX, g++, g++)
489 AC_PROG_CXX
490 AM_PROG_AS
491 AC_PROG_INSTALL
492 AC_PROG_AWK
493 AM_PROG_CC_C_O
494 dnl We should use AM_PROG_AS, but it's not available on automake/aclocal 1.4
495 : ${CCAS='$(CC)'}
496 # Set ASFLAGS if not already set.
497 : ${CCASFLAGS='$(CFLAGS)'}
498 AC_SUBST(CCAS)
499 AC_SUBST(CCASFLAGS)
501 # AC_PROG_CXX helpfully sets CXX to g++ even if no c++ compiler is found so check
502 # GXX instead. See http://lists.gnu.org/archive/html/bug-autoconf/2002-04/msg00056.html
503 if test "x$CXX" = "xg++"; then
504         if test "x$GXX" != "xyes"; then
505                 # automake/libtool is so broken, it requires g++ even if the c++ sources
506                 # are inside automake conditionals
507                 AC_MSG_ERROR([You need to install g++])
508         fi
511 dnl may require a specific autoconf version
512 dnl AC_PROG_CC_FOR_BUILD
513 dnl CC_FOR_BUILD not automatically detected
514 CC_FOR_BUILD=$CC
515 CFLAGS_FOR_BUILD=$CFLAGS
516 BUILD_EXEEXT=
517 if test "x$cross_compiling" = "xyes"; then
518         CC_FOR_BUILD=cc
519         CFLAGS_FOR_BUILD=
520         BUILD_EXEEXT=""
522 AC_SUBST(CC_FOR_BUILD)
523 AC_SUBST(CFLAGS_FOR_BUILD)
524 AC_SUBST(HOST_CC)
525 AC_SUBST(BUILD_EXEEXT)
527 AM_CONDITIONAL(CROSS_COMPILING, [test x$cross_compiling = xyes])
528 AM_CONDITIONAL(USE_BATCH_FILES, [test x$host_win32 = xyes -a x$cross_compiling = xyes])
530 # Set STDC_HEADERS
531 AC_HEADER_STDC
532 AC_LIBTOOL_WIN32_DLL
533 # This causes monodis to not link correctly
534 #AC_DISABLE_FAST_INSTALL
536 #lookup makedev() header
537 AC_HEADER_MAJOR
539 AM_PROG_LIBTOOL
540 # Use dolt (http://dolt.freedesktop.org/) instead of libtool for building.
541 DOLT
543 export_ldflags=`(./libtool --config; echo eval echo \\$export_dynamic_flag_spec) | sh`
544 AC_SUBST(export_ldflags)
546 # Test whenever ld supports -version-script
547 AC_PROG_LD
548 AC_PROG_LD_GNU
550 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)
551 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)
552 AC_CHECK_HEADER(unistd.h, [HAVE_UNISTD_H=1], [HAVE_UNISTD_H=0])
553 AC_SUBST(HAVE_UNISTD_H)
554 AC_CHECK_HEADERS([linux/netlink.h linux/rtnetlink.h],
555                   [], [], [#include <stddef.h>
556                   #include <sys/socket.h>
557                   #include <linux/socket.h>])
559 AC_CHECK_HEADERS(sys/user.h, [], [],
561 #ifdef HAVE_SYS_PARAM_H
562 # include <sys/param.h>
563 #endif
566 AC_CHECK_HEADERS(linux/serial.h)
568 AC_CHECK_HEADER(zlib.h, [have_zlib=yes], [have_zlib=no])
569 if test x$have_zlib = xyes; then
570    AC_TRY_COMPILE([#include <zlib.h>], [
571    #if defined(ZLIB_VERNUM) && (ZLIB_VERNUM >= 0x1230)
572    #else
573    #error No good zlib found
574    #endif
575    ],[
576         AC_MSG_RESULT(Using system zlib)
577         zlib_msg="system zlib"
578         AC_DEFINE(HAVE_SYS_ZLIB,1,[Have system zlib])
579    ],[
580         AC_MSG_RESULT(Using embedded zlib)
581         have_zlib=no
582         zlib_msg="bundled zlib"
583    ])
586 AC_ARG_WITH(static-zlib, [  --with-static-zlib=PATH    use the specified static zlib instead of -lz],[STATIC_ZLIB_PATH=$with_static_zlib],[STATIC_ZLIB_PATH=])
587 if test "x$STATIC_ZLIB_PATH" != "x"; then
588         have_static_zlib=yes
589         AC_SUBST(STATIC_ZLIB_PATH)
592 AM_CONDITIONAL(HAVE_STATIC_ZLIB, test x$have_static_zlib = xyes)
593 AM_CONDITIONAL(HAVE_ZLIB, test x$have_zlib = xyes)
594 AC_DEFINE(HAVE_ZLIB,1,[Have system zlib])
596 # for mono/metadata/debug-symfile.c
597 AC_CHECK_HEADERS(elf.h)
599 # for support
600 AC_CHECK_HEADERS(poll.h)
601 AC_CHECK_HEADERS(sys/poll.h)
602 AC_CHECK_HEADERS(sys/wait.h)
603 AC_CHECK_HEADERS(grp.h)
604 AC_CHECK_HEADERS(syslog.h)
605 AC_CHECK_FUNCS(vsyslog)
607 # for mono/dis
608 AC_CHECK_HEADERS(wchar.h)
610 # for Linux statfs support
611 AC_CHECK_HEADERS(linux/magic.h)
613 # For Android NDK unified headers
614 if test x$platform_android = xyes; then
615         AC_CHECK_HEADERS(machine/endian.h sys/endian.h)
616         AC_CHECK_HEADERS(android/legacy_signal_inlines.h, [have_android_signal_inlines=yes], [have_android_signal_inlines=no])
617         AC_CHECK_HEADERS(android/ndk-version.h)
619         # Make sure SIGRT{MIN,MAX} work - they will fail to work with unified headers if building for
620         # API level < 21 *and* android/legacy_signal_inlines.h doesn't declare (and define) the required
621         # libc APIs to obtain values for SIGRT{MIN,MAX}. We perform the check only if android/legacy_signal_inlines.h
622         # is found because in other cases the macros will either work (for NDK < 14) or fail if the legacy header
623         # doesn't contain the required definitions (NDK 14)
624         if test x$have_android_signal_inlines = xyes; then
625                 AC_MSG_CHECKING([Whether Android SIGRTMIN/SGRTMAX macros are valid])
626                 AC_COMPILE_IFELSE([
627                         AC_LANG_PROGRAM([#include <signal.h>
628                                 #include <android/legacy_signal_inlines.h>],[
629                                 int i;
630                                 for (i = SIGRTMIN + 1; i < SIGRTMAX; ++i) {
631                                 }
632                         ])],[
633                                 AC_MSG_RESULT(yes)
634                                 android_sigrtminmax_work=yes
635                         ],[
636                                 AC_MSG_RESULT(no)
637                                 android_sigrtminmax_work=no
638                         ]
639                 )
641                 if test x$android_sigrtminmax_work = xno; then
642                         AC_MSG_ERROR([Android SIGRTMIN/SIGRTMAX macros don't work in this NDK])
643                 fi
644         fi
646         # Attempt to detect whether we're using Android NDK unified headers
647         AC_CHECK_HEADERS(android/api-level.h, [have_android_api_level=yes], [have_android_api_level=no])
648         AC_CHECK_HEADERS(android/versioning.h, [have_android_versioning=yes], [have_android_versioning=no])
650         android_unified_headers=no
651         if test x$have_android_api_level = xyes; then
652                 if test x$have_android_versioning = xyes; then
653                         AC_MSG_CHECKING([whether using Android NDK unified headers])
655                         # Both macros are defined only in the NDK unified headers
656                         AC_COMPILE_IFELSE([
657                                 AC_LANG_PROGRAM([
658                                         #include <android/api-level.h>
659                                         #include <android/versioning.h>
660                                 ],[
661                                         #if __ANDROID_API_O__ == 26 && defined(__INTRODUCED_IN)
662                                         #else
663                                                 #error __ANDROID_API_O__ != 26 or the __INTRODUCED_IN macro not defined
664                                         #endif
665                                 ])],[
666                                         AC_MSG_RESULT(yes)
667                                         android_unified_headers=yes
668                                 ],[
669                                         AC_MSG_RESULT(no)
670                                         android_unified_headers=no
671                                 ]
672                         )
673                 fi
674         fi
676         if test x$android_unified_headers = xyes; then
677                 AC_DEFINE(ANDROID_UNIFIED_HEADERS, 1, [Whether Android NDK unified headers are used])
678         fi
679 fi # Android
681 # not 64 bit clean in cross-compile
682 AC_CHECK_SIZEOF(void *)
683 AC_CHECK_SIZEOF(long)
685 AC_CHECK_SIZEOF(int)
686 AC_CHECK_SIZEOF(long long)
688 AC_CACHE_CHECK([for clang],
689         mono_cv_clang,[
690         AC_TRY_COMPILE([], [
691                 #ifdef __clang__
692                 #else
693                 #error "FAILED"
694                 #endif
695         ],
696         [mono_cv_clang=yes],
697         [mono_cv_clang=no],
698         [])
701 AC_ARG_ENABLE(visibility-hidden,
702 [  --disable-visibility-hidden    disable usage of -fvisiblity=hidden],
703    disable_visibility_hidden=yes, disable_visibility_hidden=no)
705 WARN=''
706 if test x"$GCC" = xyes; then
707                 WARN='-Wall -Wunused -Wmissing-declarations -Wpointer-arith -Wno-cast-qual -Wwrite-strings -Wno-switch -Wno-switch-enum -Wno-unused-value -Wno-attributes'
708                 CFLAGS="$CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs -Wno-format-zero-length"
710                 # We require C99 with some GNU extensions, e.g. `linux` macro
711                 CFLAGS="$CFLAGS -std=gnu99"
713                 # The runtime code does not respect ANSI C strict aliasing rules
714                 CFLAGS="$CFLAGS -fno-strict-aliasing"
716                 # We rely on signed overflow to behave
717                 CFLAGS="$CFLAGS -fwrapv"
719                 CFLAGS="$CFLAGS -DMONO_DLL_EXPORT"
720                 if test x"$disable_visibility_hidden" = xno; then
721                    # Don't export any symbols by default
722                    SHARED_CFLAGS="-fvisibility=hidden"
723                    CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
724                 fi
726                 ORIG_CFLAGS=$CFLAGS
727                 # Check for the normal version, since gcc ignores unknown -Wno options
728                 CFLAGS="$CFLAGS -Wunused-but-set-variable -Werror"
729                 AC_MSG_CHECKING(for -Wno-unused-but-set-variable option to gcc)
730                 AC_TRY_COMPILE([],[
731                 ], [
732                    AC_MSG_RESULT(yes)
733                    CFLAGS="$ORIG_CFLAGS -Wno-unused-but-set-variable"
734                 ], [
735                    AC_MSG_RESULT(no)
736                    CFLAGS=$ORIG_CFLAGS
737                 ])
739                 if test "x$mono_cv_clang" = "xyes"; then
740                    # https://bugzilla.samba.org/show_bug.cgi?id=8118
741                    WARN="$WARN -Qunused-arguments"
742                    WARN="$WARN -Wno-unused-function -Wno-tautological-compare -Wno-parentheses-equality -Wno-self-assign -Wno-return-stack-address -Wno-constant-logical-operand"
743                    # We rely on zero length arrays in structs
744                    WARN="$WARN -Wno-zero-length-array"
745                 fi
746 else
747         # The Sun Forte compiler complains about inline functions that access static variables
748         # so disable all inlining.
749         case "$host" in
750         *-*-solaris*)
751                 CFLAGS="$CFLAGS -Dinline="
752                 ;;
753         esac
755 CFLAGS="$WARN $CFLAGS -g"
756 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -g"
757 CPPFLAGS="$WARN $CPPFLAGS -g"
759 # Where's the 'mcs' source tree?
760 if test -d $srcdir/mcs; then
761   mcsdir=mcs
762 else
763   mcsdir=../mcs
766 AC_ARG_WITH(mcs-path, [  --with-mcs-path=/path/to/mcs      Specify an alternate mcs source tree],
767         if test x$with_mcs_path != "x" -a -d $with_mcs_path ; then
768                 mcsdir=$with_mcs_path
769         fi
772 AC_ARG_WITH(jumptables, [  --with-jumptables=yes,no      enable/disable support for jumptables (ARM-only for now) (defaults to no)],[],[with_jumptables=no])
774 AC_ARG_WITH(core,       [  --with-core=only       controls whether to build Mono as a .NET Core runtime (defaults to no)],[],[with_core=no])
775 if test x$with_core = xonly; then
776     AC_DEFINE(ENABLE_NETCORE,1,[Enables the support for .NET Core Features in the MonoVM])
777     with_runtime_preset=netcore
779 AM_CONDITIONAL(ENABLE_NETCORE, test x$with_core = xonly)
782 # A sanity check to catch cases where the package was unpacked
783 # with an ancient tar program (Solaris)
785 AC_ARG_ENABLE(solaris-tar-check,
786 [  --disable-solaris-tar-check    disable solaris tar check],
787    do_solaris_tar_check=no, do_solaris_tar_check=yes)
789 if test x"$do_solaris_tar_check" = xyes -a x"$enable_solaris_tar_check" = xyes; then
790         AC_MSG_CHECKING(integrity of package)
791         if test -f $mcsdir/class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapTypeMapper.cs
792         then
793                 AC_MSG_RESULT(ok)
794         else
795                 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"
796                 AC_MSG_ERROR([$errorm])
797         fi
800 if test "x$with_mcs_path" != "x"; then
801 mcs_topdir=$(cd "$mcsdir" && pwd)
802 mcs_topdir_from_srcdir=$mcs_topdir
803 else
804 mcs_topdir=$(cd "$srcdir/$mcsdir" && pwd)
805 mcs_topdir_from_srcdir='$(top_builddir)'/$mcsdir
808 # Convert mcs_topdir* paths to Windows syntax.
809 if test x$cross_compiling$host_win32 = xnoyes; then
810   mcs_topdir=$(cygpath -m $mcs_topdir)
811   case $mcs_topdir_from_srcdir in
812     /cygdrive/*)
813         mcs_topdir_from_srcdir=$(cygpath -m $mcs_topdir_from_srcdir)
814         ;;
815   esac
818 AC_SUBST([mcs_topdir])
819 AC_SUBST([mcs_topdir_from_srcdir])
821 # gettext: prepare the translation directories. 
822 # we do not configure the full gettext, as we consume it dynamically from C#
823 AM_PO_SUBDIRS
825 if test "x$USE_NLS" = "xyes"; then
826    AC_CHECK_PROG(HAVE_MSGFMT, msgfmt,yes,no)
828    if test "x$HAVE_MSGFMT" = "xno"; then
829           AC_MSG_ERROR([msgfmt not found. You need to install the 'gettext' package, or pass --enable-nls=no to configure.])
830    fi
833 AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
835 pkg_config_path=
836 AC_ARG_WITH(crosspkgdir, [  --with-crosspkgdir=/path/to/pkg-config/dir      Change pkg-config dir to custom dir],
837         if test x$with_crosspkgdir = "x"; then
838                 if test -s $PKG_CONFIG_PATH; then
839                         pkg_config_path=$PKG_CONFIG_PATH
840                 fi
841         else
842                 pkg_config_path=$with_crosspkgdir
843                 PKG_CONFIG_PATH=$pkg_config_path
844                 export PKG_CONFIG_PATH
845         fi
848 AC_ARG_ENABLE(ninja,[  --enable-ninja    Enable using ninja where available], enable_ninja=$enableval)
849 AC_CHECK_PROG(HAVE_NINJA, ninja, yes, no)
850 AM_CONDITIONAL(NINJA, test x$enable_ninja = xyes -a x$HAVE_NINJA != xno)
852 AC_ARG_ENABLE(werror, [  --enable-werror Pass -Werror to the C compiler], werror_flag=$enableval, werror_flag=no)
853 if test x$werror_flag = xyes; then
854         WERROR_CFLAGS="-Werror"
856 AC_SUBST([WERROR_CFLAGS])
857 AC_SUBST([SHARED_CFLAGS])
859 GLIB_CFLAGS='-I$(top_srcdir)/mono/eglib -I$(top_builddir)/mono/eglib'
860   
861 AC_SUBST(GLIB_CFLAGS)
863 # Enable support for fast thread-local storage
864 # Some systems have broken support, so we allow to disable it.
865 AC_ARG_WITH(tls, [  --with-tls=__thread,pthread    select Thread Local Storage implementation (defaults to __thread)],[],[with_tls=__thread])
867 # Enable support for using sigaltstack for SIGSEGV and stack overflow handling
868 # This does not work on some platforms (bug #55253)
869 AC_ARG_WITH(sigaltstack, [  --with-sigaltstack=yes,no      enable/disable support for sigaltstack (defaults to yes)],[],[with_sigaltstack=yes])
871 AC_ARG_WITH(static_mono, [  --with-static_mono=yes,no      link mono statically to libmono (faster) (defaults to yes)],[],[with_static_mono=yes])
872 AC_ARG_WITH(shared_mono, [  --with-shared_mono=yes,no      build a shared libmono library (defaults to yes)],[],[with_shared_mono=yes])
873 # Same as --with-shared_mono=no
874 AC_ARG_ENABLE(libraries, [  --disable-libraries disable the build of libmono], enable_libraries=$enableval, enable_libraries=yes)
876 if test "x$enable_static" = "xno"; then
877    with_static_mono=no
880 if test "x$enable_shared" = "xno"; then
881    with_shared_mono=no
884 if test "x$enable_libraries" = "xno"; then
885    with_shared_mono=no
888 AM_CONDITIONAL(DISABLE_LIBRARIES, test x$enable_libraries = xno)
890 if test "x$host_win32" = "xyes"; then
891    # Boehm GC requires the runtime to be in its own dll
892    with_static_mono=no
895 AM_CONDITIONAL(STATIC_MONO, test x$with_static_mono != xno)
896 AM_CONDITIONAL(SHARED_MONO, test x$with_shared_mono != xno)
897 AC_ARG_ENABLE(mcs-build, [  --disable-mcs-build disable the build of the mcs directory], try_mcs_build=$enableval, enable_mcs_build=yes)
898 AC_ARG_ENABLE(support-build, [  --disable-support-build disable the build of the support directory], try_support_build=$enableval, enable_support_build=yes)
900 AC_ARG_WITH(xen_opt,   [  --with-xen_opt=yes,no          Enable Xen-specific behaviour (defaults to yes)],[],[with_xen_opt=yes])
901 if test "x$with_xen_opt" = "xyes" -a "x$mono_cv_clang" = "xno"; then
902         AC_DEFINE(MONO_XEN_OPT, 1, [Xen-specific behaviour])
903         ORIG_CFLAGS=$CFLAGS
904         CFLAGS="$CFLAGS -mno-tls-direct-seg-refs"
905         AC_MSG_CHECKING(for -mno-tls-direct-seg-refs option to gcc)
906         AC_TRY_COMPILE([], [
907         ], [
908            AC_MSG_RESULT(yes)
909            # Pass it to libgc as well
910            CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -mno-tls-direct-seg-refs"
911         ], [
912            AC_MSG_RESULT(no)
913            CFLAGS=$ORIG_CFLAGS
914         ])
917 AC_ARG_ENABLE(small-config, [  --enable-small-config Enable tweaks to reduce requirements (and capabilities)], enable_small_config=$enableval, enable_small_config=no)
919 if test x$enable_small_config = xyes; then
920         AC_DEFINE(MONO_SMALL_CONFIG,1,[Reduce runtime requirements (and capabilities)])
921         CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DSMALL_CONFIG"
924 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)
926 DISABLED_FEATURES=none
927 csc_compiler=default
928 endian=unknown
929 AC_C_BIGENDIAN([endian=big],[endian=little],[endian=unknown])
930 AC_MSG_CHECKING([CSharp compiler to use])
931 AC_ARG_WITH(csc, [  --with-csc=mcs,roslyn,default      Configures the CSharp compiler to use],[
932    if test x$withval = xmcs; then
933        csc_compiler=mcs
934    elif test x$withval = xroslyn; then
935        csc_compiler=roslyn
936    elif test x$withval = xdefault; then
937        :
938    else
939        AC_MSG_ERROR([You must supply one of "mcs", "roslyn" or "default" to the --with-csc option])
940    fi
941 ],[csc_compiler=default])
943 if test $csc_compiler = default; then
944    if test $endian = big; then
945       csc_compiler=mcs
946    elif test $endian = little; then
947       case "$host" in
948         powerpc*) csc_compiler=mcs ;;
949         *) csc_compiler=roslyn ;;
950       esac
951    else
952       csc_compiler=mcs
953    fi
955 AC_MSG_RESULT($csc_compiler)
957 AC_ARG_WITH(jemalloc,             [  --with-jemalloc=yes,no               If jemalloc is enabled (defaults to no)],                                     [], [with_jemalloc=no])
958 AC_ARG_WITH(jemalloc-always,      [  --with-jemalloc_always=yes,no        If jemalloc is enabled and always used (defaults to yes)],                    [], [with_jemalloc_always=no])
959 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])
962 if test x$target_win32 = xyes; then
963 with_jemalloc=no
964 with_jemalloc_assert=no
965 with_jemalloc_always=no
968 AM_CONDITIONAL(MONO_JEMALLOC_ASSERT, [test "x$with_jemalloc_assert" = "xyes"])
969 if test "x$with_jemalloc_assert" = "xyes"; then
970 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ASSERT"
971 AC_DEFINE(MONO_JEMALLOC_ASSERT, 1, [Make jemalloc assert for mono])
972 AC_SUBST(MONO_JEMALLOC_ASSERT, 1)
975 AM_CONDITIONAL(MONO_JEMALLOC_DEFAULT, [test "x$with_jemalloc_always" = "xyes"])
976 if test "x$with_jemalloc_always" = "xyes"; then
977 with_jemalloc=yes
978 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_DEFAULT"
979 AC_DEFINE(MONO_JEMALLOC_DEFAULT, 1, [Make jemalloc default for mono])
980 AC_SUBST(MONO_JEMALLOC_DEFAULT, 1)
983 AM_CONDITIONAL(MONO_JEMALLOC_ENABLED, [test "x$with_jemalloc" = "xyes"])
984 if test "x$with_jemalloc" = "xyes"; then
985 JEMALLOC_LDFLAGS="-L`pwd`/mono/utils/jemalloc/jemalloc/lib -ljemalloc_pic"
986 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ENABLED -I `pwd`/mono/utils/jemalloc/jemalloc/include"
987 JEMALLOC_AUTOCONF_FLAGS=" --build=$target --host=$host"
989 if test "x$target_mach" = "xyes"; then
990         JEMALLOC_CPPFLAGS=" -stdlib=libc++ "
993 AC_DEFINE(MONO_JEMALLOC_ENABLED, 1, [Enable jemalloc usage for mono])
994 AC_SUBST(MONO_JEMALLOC_ENABLED, 1)
996 AC_SUBST(JEMALLOC_CFLAGS)
997 AC_SUBST(JEMALLOC_CPPFLAGS)
998 AC_SUBST(JEMALLOC_LDFLAGS)
999 AC_SUBST(JEMALLOC_AUTOCONF_FLAGS)
1002 # Terminology:
1003 # Crash privacy - Attempts to not send identifying information in the crash dump / to protect the obscurity of the program control flow
1004 # MERP - The MS telemetry profile. Not for general use.
1005 # Structured crashes - crashes at runtime that trigger a stack walk by mono that happens cooperatively
1007 # 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.
1009 #--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.
1010 #--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.
1011 #--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.
1012 #--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.
1014 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])
1015 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])
1016 AC_ARG_ENABLE(crash-reporting,  [  --disable-crash-reporting            Enable or Disable crash reporting subsystem],        [crash_reporting=$enableval], [crash_reporting=yes])
1018 if test "x$with_crash_privacy" = "xyes"; then
1019 AC_DEFINE(MONO_PRIVATE_CRASHES,1,[Do not include names of unmanaged functions in the crash dump])
1022 if test "x$with_structured_crashes" = "xno"; then
1023 AC_DEFINE(DISABLE_STRUCTURED_CRASH,1,[Do not create structured crash files during unmanaged crashes])
1026 case "$host" in
1027         *-mingw*|*-*-cygwin*|*-*-aix*|*-*-os400*)
1028                 crash_reporting=no
1029                 ;;
1030 esac
1032 if test "x$crash_reporting" != "xyes"; then
1033 CFLAGS="$CFLAGS -DDISABLE_CRASH_REPORTING=1"
1034 CXXFLAGS="$CXXFLAGS -DDISABLE_CRASH_REPORTING=1"
1037 AC_ARG_ENABLE(monodroid, [ --enable-monodroid Enable runtime support for Monodroid (Xamarin.Android)], enable_monodroid=$enableval, enable_monodroid=no)
1038 AM_CONDITIONAL(ENABLE_MONODROID, test x$enable_monodroid = xyes)
1040 AC_ARG_ENABLE(monotouch, [ --enable-monotouch Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)], enable_monotouch=$enableval, enable_monotouch=no)
1041 AM_CONDITIONAL(ENABLE_MONOTOUCH, test x$enable_monotouch = xyes)
1043 if test x$enable_monodroid = xyes; then
1044         AC_DEFINE(ENABLE_MONODROID, 1, [Enable runtime support for Monodroid (Xamarin.Android)])
1047 if test x$enable_monotouch = xyes; then
1048         AC_DEFINE(ENABLE_MONOTOUCH, 1, [Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)])
1051 AC_ARG_ENABLE(cxx, [  --enable-cxx   compile some code as C++])
1053 # mono/corefx/native has a lot of invalid C++98 in its headers
1054 # dotnet/corefx/native looks a lot better, i.e. 44e5bdafb8d989a220c9cf1b94f31a64a6e4f052
1055 #CXXFLAGS_COMMON=' -std=gnu++98 -fno-exceptions -fno-rtti '
1056 CXXFLAGS_COMMON=' -std=gnu++0x -fno-exceptions -fno-rtti '
1057 # "c++0x" instead of C++11, for compat with Centos6/gcc4.4
1059 # -stdlib=libc++ is needed by clang for iOS 6.0 (-miphoneos-version-min=6.0)
1060 # to support C++11 headers but it does not seem to harm elsewhere, so over-approximate
1061 # and add it whenever we're running clang on Darwin.
1062 if test "x$mono_cv_clang" = xyes -a x$host_darwin = xyes; then
1063         CXXFLAGS_COMMON="$CXXFLAGS_COMMON -stdlib=libc++"
1066 AC_SUBST(CXXFLAGS_COMMON)
1068 if test "x$enable_cxx" = "xyes"; then
1070         CXX_ADD_CFLAGS=" -xc++ $CXXFLAGS_COMMON "
1072         # -std=gnu99 -xc++ is not allowed and errors.
1073         CXX_REMOVE_CFLAGS=-std=gnu99
1074         # These give warnings and should be removed. They are C-only.
1075         # i.e. C++ never allows these, they are always errors and their warningness is not controllable.
1076         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs"
1077         # Likewise with CentOS 6 gcc 4.4.
1078         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Werror-implicit-function-declaration"
1080         # The C-only-ness of -Wno-format-zero-length varies with gcc version.
1081         # It is C-only prior to 4.7. Using it with C++ prior to 4.7
1082         # generates a warning every time we run gcc which is very unsightly.
1083         # The warning is for e.g. sprintf(foo, "") which can just be
1084         # foo[0] = 0 but Mono's use is more elaborate, not as easy to "fix",
1085         # and completely legal and valid.
1086         # We have to switch to C++ and not just use -xc++ because of -std=gnu99 (error when combined with -xc++).
1087         # Alternatively, just run $CXX -xc++ -c /dev/null.
1088         AC_LANG_PUSH(C++)
1089         ORIG_CXXFLAGS=$CXXFLAGS
1090         CXXFLAGS="$CXXFLAGS -Werror -Wno-format-zero-length -xc++ "
1091         AC_MSG_CHECKING(or C-only-ness of -Wno-format-zero-length)
1092         AC_TRY_COMPILE([ ], [ ], [ AC_MSG_RESULT(yes) ],
1093                                  [ AC_MSG_RESULT(no)
1094                                    CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wno-format-zero-length" ])
1095         CXXFLAGS=$ORIG_CXXFLAGS
1096         AC_LANG_POP(C++)
1098 AC_SUBST(CXX_ADD_CFLAGS)
1099 AC_SUBST(CXX_REMOVE_CFLAGS)
1102 # Set the build profiles and options before things which use them
1105 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])
1106 AC_ARG_WITH(monodroid,           [  --with-monodroid=yes,no             If you want to build the MonoDroid assemblies (defaults to no)],            [], [with_monodroid=default])
1107 AC_ARG_WITH(monotouch,           [  --with-monotouch=yes,no             If you want to build the Xamarin.iOS assemblies (defaults to no)],          [], [with_monotouch=default])
1108 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])
1109 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])
1110 AC_ARG_WITH(bitcode,             [  --with-bitcode=yes,no               If bitcode is enabled (defaults to no)],                                    [], [with_bitcode=default])
1111 AC_ARG_WITH(xammac,              [  --with-xammac=yes,no                If you want to build the Xamarin.Mac assemblies (defaults to no)],          [], [with_xammac=default])
1112 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])
1113 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])
1114 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])
1115 AC_ARG_WITH(winaot,              [  --with-winaot=yes,no                If you want to build the Windows friendly AOT assemblies (defaults to no)], [], [with_winaot=default])
1116 AC_ARG_WITH(orbis,               [  --with-orbis=yes,no                 If you want to build the Orbis assemblies (defaults to no)], [], [with_orbis=default])
1117 AC_ARG_WITH(unreal,              [  --with-unreal=yes,no                If you want to build the Unreal assemblies (defaults to no)], [], [with_unreal=default])
1118 AC_ARG_WITH(wasm,                [  --with-wasm=yes,no                  If you want to build the WebAssembly (defaults to no)], [], [with_wasm=default])
1121 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])
1122 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])
1123 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])
1124 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])
1127 dnl Spectre compiler mitigation flag checks
1129 if test "x$with_spectre_mitigation" = "xyes"; then
1130    AC_MSG_NOTICE([Compiler Spectre mitigation support checks])
1131    SPECTRE_CFLAGS=
1132    SPECTRE_INDIRECT_BRANCH_KIND=
1133    case "x$with_spectre_indirect_branch_choice" in
1134        xkeep) SPECTRE_INDIRECT_BRANCH_KIND=keep ;;
1135        xthunk) SPECTRE_INDIRECT_BRANCH_KIND=thunk ;;
1136        xinline) SPECTRE_INDIRECT_BRANCH_KIND=thunk-inline ;;
1137        xextern) SPECTRE_INDIRECT_BRANCH_KIND=thunk-extern ;;
1138        *) AC_MSG_ERROR([Invalid indirect jump thunk kind ($with_spectre_indirect_branch_choice)]) ;;
1139    esac
1141    SPECTRE_FUNCTION_RETURN_KIND=""
1142    case "x$with_spectre_function_return_choice" in
1143        xkeep) SPECTRE_FUNCTION_RETURN_KIND=keep ;;
1144        xthunk) SPECTRE_FUNCTION_RETURN_KIND=thunk ;;
1145        xinline) SPECTRE_FUNCTION_RETURN_KIND=thunk-inline ;;
1146        xextern) SPECTRE_FUNCTION_RETURN_KIND=thunk-extern ;;
1147        *) AC_MSG_ERROR([Invalid function return thunk kind ($with_spectre_function_return_choice)]) ;;
1148    esac
1150    AX_CHECK_COMPILE_FLAG(
1151         [ -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND ],
1152         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND" ]
1153    )
1155    AX_CHECK_COMPILE_FLAG(
1156         [ -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND ],
1157         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND" ]
1158    )
1160    if test "x$SPECTRE_CFLAGS" != "x" ; then
1161         CFLAGS="$CFLAGS $SPECTRE_CFLAGS"
1162         CXXFLAGS="$CXXFLAGS $SPECTRE_CFLAGS"
1163         spectre_mitigation_status="mitigation enabled"
1164    fi
1165 else
1166         spectre_mitigation_status="no mitigation"
1170 dnl Profile defaults
1172 TEST_PROFILE=default
1173 enable_llvm_default=no
1175 with_profile4_x_default=no
1176 with_monodroid_default=no
1177 with_monotouch_default=no
1178 with_monotouch_watch_default=no
1179 with_monotouch_tv_default=no
1180 with_xammac_default=no
1181 with_testing_aot_full_interp_default=no
1182 with_testing_aot_hybrid_default=no
1183 with_testing_aot_full_default=no
1184 with_winaot_default=no
1185 with_orbis_default=no
1186 with_unreal_default=no
1187 with_wasm_default=no
1189 with_bitcode_default=no
1190 enable_cooperative_suspend_default=no
1191 enable_hybrid_suspend_default=no
1193 INVARIANT_AOT_OPTIONS=nimt-trampolines=2000,ntrampolines=10000,nrgctx-fetch-trampolines=256,ngsharedvt-trampolines=4000,nftnptr-arg-trampolines=4000
1195 AOT_BUILD_ATTRS=$INVARIANT_AOT_OPTIONS
1197 if test x$cross_compiling = xyes -o x$enable_mcs_build = xno; then
1198    DISABLE_MCS_DOCS_default=yes
1199 elif test x$with_runtime_preset = xnetcore; then
1200    DISABLE_MCS_DOCS_default=yes
1202    mono_feature_disable_remoting='yes'
1203    mono_feature_disable_reflection_emit_save='yes'
1204    mono_feature_disable_appdomains='yes'
1205    disable_mono_native=yes
1206 elif test x$with_runtime_preset = xnet_4_x; then
1207    with_profile4_x_default=yes
1208    TEST_PROFILE=net_4_x
1209 elif test x$with_runtime_preset = xall; then
1210    with_profile4_x_default=yes
1211    with_monodroid_default=yes
1212    with_monotouch_default=yes
1213    with_monotouch_watch_default=yes
1214    with_monotouch_tv_default=yes
1215    with_xammac_default=yes
1216    with_winaot_default=yes
1217    with_orbis_default=yes
1218    with_unreal_default=yes
1219    with_wasm_default=yes
1220    with_testing_aot_full_interp_default=yes
1221    with_testing_aot_hybrid_default=yes
1222    with_testing_aot_full_default=yes
1223    TEST_PROFILE=net_4_x
1224 elif test x$with_runtime_preset = xbitcode; then
1225    DISABLE_MCS_DOCS_default=yes
1226    with_testing_aot_full_default=yes
1227    with_bitcode_default=yes
1228    enable_cooperative_suspend_default=yes
1229    # FIXME: use TEST_PROFILE=testing_aot_full
1230    TEST_PROFILE=testing_aot_bitcode
1231    enable_llvm_default=yes
1233    mono_feature_disable_com='yes'
1234    mono_feature_disable_remoting='yes'
1235    mono_feature_disable_reflection_emit_save='yes'
1236    mono_feature_disable_reflection_emit='yes'
1237    mono_feature_disable_appdomains='yes'
1239    # We need at least clang++-6.0 to read the LLVM IR produced by the runtime
1240    AOT_BUILD_FLAGS="--runtime=mobile --aot=llvmonly,clangxx=clang++-6.0,$INVARIANT_AOT_OPTIONS"
1241    AOT_RUN_FLAGS="--runtime=mobile --llvmonly"
1242    AOT_MODE="llvmonly"
1243 elif test x$with_runtime_preset = xbitcodeinterp; then
1244    with_testing_aot_full_interp_default=yes
1245    with_bitcode_default=yes
1246    enable_cooperative_suspend_default=yes
1247    # FIXME: use TEST_PROFILE=testing_aot_full_interp
1248    TEST_PROFILE=testing_aot_bitcode_interp
1249    enable_llvm_default=yes
1251    # mscorlib.dll aot compilation crashes
1252    mono_feature_disable_com='yes'
1254    # We need at least clang++-6.0 to read the LLVM IR produced by the runtime
1255    AOT_BUILD_FLAGS="--aot=llvmonly,interp,clangxx=clang++-6.0,$INVARIANT_AOT_OPTIONS"
1256    AOT_RUN_FLAGS="--llvmonly-interp"
1257 elif test x$with_runtime_preset = xfullaot; then
1258    DISABLE_MCS_DOCS_default=yes
1259    with_testing_aot_full_default=yes
1260    TEST_PROFILE=testing_aot_full
1262    mono_feature_disable_com='yes'
1263    mono_feature_disable_remoting='yes'
1264    mono_feature_disable_reflection_emit_save='yes'
1265    mono_feature_disable_reflection_emit='yes'
1266    mono_feature_disable_appdomains='yes'
1268    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1269    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1270    AOT_MODE="full"
1271 elif test x$with_runtime_preset = xfullaot_llvm; then
1272    DISABLE_MCS_DOCS_default=yes
1273    with_testing_aot_full_default=yes
1274    TEST_PROFILE=testing_aot_full
1276    mono_feature_disable_com='yes'
1277    mono_feature_disable_remoting='yes'
1278    mono_feature_disable_reflection_emit_save='yes'
1279    mono_feature_disable_reflection_emit='yes'
1280    mono_feature_disable_appdomains='yes'
1282    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1283    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1284    AOT_MODE="full"
1285 elif test x$with_runtime_preset = xhybridaot; then
1286    DISABLE_MCS_DOCS_default=yes
1287    with_testing_aot_hybrid_default=yes
1288    TEST_PROFILE=testing_aot_hybrid 
1290    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1291    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1292 elif test x$with_runtime_preset = xhybridaot_llvm; 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 --llvm --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1298    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1299 elif test x$with_runtime_preset = xfullaotinterp; then
1300    with_testing_aot_full_interp_default=yes
1301    TEST_PROFILE=testing_aot_full_interp
1303    # mscorlib.dll aot compilation crashes
1304    mono_feature_disable_com='yes'
1306    AOT_BUILD_FLAGS="--aot=full,interp,$INVARIANT_AOT_OPTIONS"
1307    AOT_RUN_FLAGS="--full-aot-interp"
1308 elif test x$with_runtime_preset = xfullaotinterp_llvm; then
1309    with_testing_aot_full_interp_default=yes
1310    TEST_PROFILE=testing_aot_full_interp_llvm
1312    # mscorlib.dll aot compilation crashes
1313    mono_feature_disable_com='yes'
1315    AOT_BUILD_FLAGS="-O=gsharedvt --llvm --aot=full,interp,$INVARIANT_AOT_OPTIONS"
1316    AOT_RUN_FLAGS="--full-aot-interp"
1317 elif test x$with_runtime_preset = xaot; then
1318    with_profile4_x_default=yes
1320    AOT_BUILD_FLAGS="--aot=$INVARIANT_AOT_OPTIONS"
1321    AOT_RUN_FLAGS=""
1323    DISABLE_MCS_DOCS_default=yes
1324 elif test x$with_runtime_preset = xaot_llvm; then
1325    with_profile4_x_default=yes
1327    AOT_BUILD_FLAGS="--llvm --aot=$INVARIANT_AOT_OPTIONS"
1328    AOT_RUN_FLAGS=""
1330    DISABLE_MCS_DOCS_default=yes
1331 elif test x$with_runtime_preset = xwinaot; then
1332    DISABLE_MCS_DOCS_default=yes
1333    with_winaot_default=yes
1334    TEST_PROFILE=winaot
1336    mono_feature_disable_com='yes'
1337    mono_feature_disable_remoting='yes'
1338    mono_feature_disable_reflection_emit_save='yes'
1339    mono_feature_disable_reflection_emit='yes'
1340    mono_feature_disable_appdomains='yes'
1342    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1343    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1344    AOT_MODE="full"
1345 elif test x$with_runtime_preset = xwinaot_llvm; then
1346    DISABLE_MCS_DOCS_default=yes
1347    with_winaot_default=yes
1348    TEST_PROFILE=winaot
1350    mono_feature_disable_com='yes'
1351    mono_feature_disable_remoting='yes'
1352    mono_feature_disable_reflection_emit_save='yes'
1353    mono_feature_disable_reflection_emit='yes'
1354    mono_feature_disable_appdomains='yes'
1356    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1357    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1358    AOT_MODE="full"
1359 elif test x$with_runtime_preset = xorbis; then
1360    DISABLE_MCS_DOCS_default=yes
1361    with_orbis_default=yes
1362    TEST_PROFILE=orbis
1364    mono_feature_disable_com='yes'
1365    mono_feature_disable_remoting='yes'
1366    mono_feature_disable_reflection_emit_save='yes'
1367    mono_feature_disable_reflection_emit='yes'
1368    mono_feature_disable_appdomains='yes'
1370    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1371    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1372    AOT_MODE="full"
1373 elif test x$with_runtime_preset = xunreal; then
1374    DISABLE_MCS_DOCS_default=yes
1375    with_unreal_default=yes
1376    TEST_PROFILE=unreal
1378    mono_feature_disable_com='yes'
1379    mono_feature_disable_remoting='yes'
1380    mono_feature_disable_appdomains='no'
1382    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1383    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1384 elif test x$with_runtime_preset = xwasm; then
1385    DISABLE_MCS_DOCS_default=yes
1386    with_wasm_default=yes
1387    TEST_PROFILE=wasm
1389    mono_feature_disable_com='yes'
1390    mono_feature_disable_remoting='yes'
1391    mono_feature_disable_reflection_emit_save='yes'
1392    mono_feature_disable_reflection_emit='yes'
1393    mono_feature_disable_appdomains='yes'
1395    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1396    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1397 else
1398    TEST_PROFILE=net_4_x
1399    with_profile4_x_default=yes
1402 if test "x$AOT_BUILD_FLAGS" != "x"; then :
1403    AC_SUBST(AOT_BUILD_FLAGS)
1404    AC_SUBST(AOT_RUN_FLAGS)
1405    # For llvmonlycheck + fullaotcheck
1406    AC_SUBST(INVARIANT_AOT_OPTIONS)
1409 AC_SUBST(TEST_PROFILE)
1411 if test "x$with_profile4_x" = "xdefault"; then
1412    with_profile4_x=$with_profile4_x_default
1414 if test "x$with_monodroid" = "xdefault"; then
1415    with_monodroid=$with_monodroid_default
1417 if test "x$with_monotouch" = "xdefault"; then
1418    with_monotouch=$with_monotouch_default
1420 if test "x$with_monotouch_watch" = "xdefault"; then
1421    with_monotouch_watch=$with_monotouch_watch_default
1423 if test "x$with_monotouch_tv" = "xdefault"; then
1424    with_monotouch_tv=$with_monotouch_tv_default
1426 if test "x$with_bitcode" = "xdefault"; then
1427    with_bitcode=$with_bitcode_default
1429 if test "x$with_xammac" = "xdefault"; then
1430    with_xammac=$with_xammac_default
1432 if test "x$with_testing_aot_full_interp" = "xdefault"; then
1433    with_testing_aot_full_interp=$with_testing_aot_full_interp_default
1435 if test "x$with_testing_aot_hybrid" = "xdefault"; then
1436    with_testing_aot_hybrid=$with_testing_aot_hybrid_default
1438 if test "x$with_testing_aot_full" = "xdefault"; then
1439    with_testing_aot_full=$with_testing_aot_full_default
1441 if test "x$with_winaot" = "xdefault"; then
1442    with_winaot=$with_winaot_default
1444 if test "x$with_orbis" = "xdefault"; then
1445    with_orbis=$with_orbis_default
1447 if test "x$with_unreal" = "xdefault"; then
1448    with_unreal=$with_unreal_default
1450 if test "x$with_wasm" = "xdefault"; then
1451    with_wasm=$with_wasm_default
1455 AM_CONDITIONAL(INSTALL_4_x, [test "x$with_profile4_x" = "xyes"])
1456 AM_CONDITIONAL(INSTALL_MONODROID, [test "x$with_monodroid" != "xno"])
1457 AM_CONDITIONAL(INSTALL_MONOTOUCH, [test "x$with_monotouch" != "xno"])
1458 AM_CONDITIONAL(INSTALL_MONOTOUCH_WATCH, [test "x$with_monotouch_watch" != "xno"])
1459 AM_CONDITIONAL(INSTALL_MONOTOUCH_TV, [test "x$with_monotouch_tv" != "xno"])
1460 AM_CONDITIONAL(BITCODE, test "x$with_bitcode" = "xyes")
1461 AM_CONDITIONAL(INSTALL_XAMMAC, [test "x$with_xammac" != "xno"])
1462 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL_INTERP, [test "x$with_testing_aot_full_interp" != "xno"])
1463 AM_CONDITIONAL(INSTALL_TESTING_AOT_HYBRID, [test "x$with_testing_aot_hybrid" != "xno"])
1464 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL, [test "x$with_testing_aot_full" != "xno"])
1465 AM_CONDITIONAL(INSTALL_WINAOT, [test "x$with_winaot" != "xno"])
1466 AM_CONDITIONAL(INSTALL_ORBIS, [test "x$with_orbis" != "xno"])
1467 AM_CONDITIONAL(INSTALL_UNREAL, [test "x$with_unreal" != "xno"])
1468 AM_CONDITIONAL(INSTALL_WASM, [test "x$with_wasm" != "xno"])
1469 AM_CONDITIONAL(INSTALL_NETCORE, [test "x$with_core" != "xno"])
1470 AM_CONDITIONAL(FULL_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full"] || [test "x$TEST_PROFILE" = "xwinaot"] || [test "x$TEST_PROFILE" = "xorbis"] || [test "x$TEST_PROFILE" = "xwasm"])
1471 AM_CONDITIONAL(HYBRID_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_hybrid"] || [test "x$TEST_PROFILE" = "xunreal"])
1472 AM_CONDITIONAL(AOT_FULL_INTERP_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full_interp"])
1473 AM_CONDITIONAL(AOT_FULL_INTERP_LLVM_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full_interp_llvm"])
1474 AM_CONDITIONAL(DEFAULT_TESTS, [test "x$TEST_PROFILE" = "xnet_4_x"])
1476 default_profile=net_4_x
1477 if test -z "$INSTALL_MONODROID_TRUE"; then :
1478    default_profile=monodroid
1480 if test -z "$INSTALL_MONOTOUCH_TRUE"; then :
1481    default_profile=monotouch
1483 if test -z "$INSTALL_XAMMAC_TRUE"; then :
1484    default_profile=xammac
1486 if test -z "$INSTALL_TESTING_AOT_FULL_INTERP_TRUE"; then :
1487    default_profile=testing_aot_full_interp
1489 if test -z "$INSTALL_TESTING_AOT_HYBRID_TRUE"; then :
1490    default_profile=testing_aot_hybrid
1492 if test -z "$INSTALL_TESTING_AOT_FULL_TRUE"; then :
1493    default_profile=testing_aot_full
1495 if test -z "$INSTALL_WINAOT_TRUE"; then :
1496    default_profile=winaot
1498 if test -z "$INSTALL_ORBIS_TRUE"; then :
1499    default_profile=orbis
1501 if test -z "$INSTALL_UNREAL_TRUE"; then :
1502    default_profile=unreal
1504 if test -z "$INSTALL_WASM_TRUE"; then :
1505    default_profile=wasm
1507 if test -z "$INSTALL_4_x_TRUE"; then :
1508    default_profile=net_4_x
1510 DEFAULT_PROFILE=$default_profile
1511 AC_SUBST(DEFAULT_PROFILE)
1514 # End build profile configuration
1517 if test x$USE_NLS = xprofile_default; then
1519         AC_MSG_CHECKING([NLS used])
1521         # We make the default value for USE_NLS
1522         # "no" on OSX because it isn't available on most
1523         # default OSX installs. The most common configurations will
1524         # all disable it, so this saves us typing.
1525         if test x$host_darwin = xyes; then
1526                 USE_NLS=no;
1527         else
1528                 USE_NLS=yes;
1529         fi
1531         AC_SUBST([USE_NLS])
1532         AC_MSG_RESULT([$USE_NLS])
1535 AC_ARG_ENABLE(minimal, [  --enable-minimal=LIST      drop support for LIST subsystems.
1536      LIST is a comma-separated list from: aot, profiler, decimal, pinvoke, debug, appdomains, verifier, 
1537      reflection_emit, reflection_emit_save, large_code, logging, com, ssa, generics, attach, jit, interpreter, simd, soft_debug, perfcounters, normalization, desktop_loader, shared_perfcounters, remoting,
1538          security, lldb, mdb, assert_messages, cleanup, sgen_marksweep_conc, sgen_split_nursery, sgen_gc_bridge, sgen_debug_helpers, sockets.],
1540         for feature in `echo "$enable_minimal" | sed -e "s/,/ /g"`; do
1541                 eval "mono_feature_disable_$feature='yes'"
1542         done
1543         DISABLED_FEATURES=$enable_minimal
1544         disabled="Disabled:      $enable_minimal"
1545 ],[])
1547 AC_DEFINE_UNQUOTED(DISABLED_FEATURES, "$DISABLED_FEATURES", [String of disabled features])
1549 if test "x$mono_feature_disable_aot" = "xyes"; then
1550         AC_DEFINE(DISABLE_AOT, 1, [Disable AOT Compiler])
1551         enable_system_aot=no
1552         AC_MSG_NOTICE([Disabled AOT compiler])
1555 if test "x$mono_feature_disable_profiler" = "xyes"; then
1556         AC_DEFINE(DISABLE_PROFILER, 1, [Disable default profiler support])
1557         AC_MSG_NOTICE([Disabled support for the profiler])
1559 AM_CONDITIONAL(DISABLE_PROFILER, test x$mono_feature_disable_profiler = xyes)
1561 if test "x$mono_feature_disable_decimal" = "xyes"; then
1562         AC_DEFINE(DISABLE_DECIMAL, 1, [Disable System.Decimal support])
1563         AC_MSG_NOTICE([Disabled support for decimal])
1566 if test "x$mono_feature_disable_pinvoke" = "xyes"; then
1567         AC_DEFINE(DISABLE_PINVOKE, 1, [Disable P/Invoke support])
1568         AC_MSG_NOTICE([Disabled support for P/Invoke])
1571 if test "x$mono_feature_disable_debug" = "xyes"; then
1572         AC_DEFINE(DISABLE_DEBUG, 1, [Disable runtime debugging support])
1573         AC_MSG_NOTICE([Disabled support for runtime debugging])
1576 if test "x$mono_feature_disable_reflection_emit" = "xyes"; then
1577         AC_DEFINE(DISABLE_REFLECTION_EMIT, 1, [Disable reflection emit support])
1578         mono_feature_disable_reflection_emit_save=yes
1579         AC_MSG_NOTICE([Disabled support for Reflection.Emit])
1582 if test "x$mono_feature_disable_reflection_emit_save" = "xyes"; then
1583         AC_DEFINE(DISABLE_REFLECTION_EMIT_SAVE, 1, [Disable assembly saving support in reflection emit])
1584         AC_MSG_NOTICE([Disabled support for Reflection.Emit.Save])
1587 if test "x$mono_feature_disable_large_code" = "xyes"; then
1588         AC_DEFINE(DISABLE_LARGE_CODE, 1, [Disable support for huge assemblies])
1589         AC_MSG_NOTICE([Disabled support for large assemblies])
1592 if test "x$mono_feature_disable_logging" = "xyes"; then
1593         AC_DEFINE(DISABLE_LOGGING, 1, [Disable support debug logging])
1594         AC_MSG_NOTICE([Disabled support for logging])
1597 if test "x$mono_feature_disable_com" = "xyes"; then
1598         AC_DEFINE(DISABLE_COM, 1, [Disable COM support])
1599         AC_MSG_NOTICE([Disabled COM support])
1602 if test "x$mono_feature_disable_ssa" = "xyes"; then
1603         AC_DEFINE(DISABLE_SSA, 1, [Disable advanced SSA JIT optimizations])
1604         AC_MSG_NOTICE([Disabled SSA JIT optimizations])
1607 if test "x$mono_feature_disable_generics" = "xyes"; then
1608         AC_DEFINE(DISABLE_GENERICS, 1, [Disable generics support])
1609         AC_MSG_NOTICE([Disabled Generics Support])
1612 if test "x$mono_feature_disable_shadowcopy" = "xyes"; then
1613         AC_DEFINE(DISABLE_SHADOW_COPY, 1, [Disable Shadow Copy for AppDomains])
1614         AC_MSG_NOTICE([Disabled Shadow copy for AppDomains])
1617 if test "x$mono_feature_disable_portability" = "xyes"; then
1618         AC_DEFINE(DISABLE_PORTABILITY, 1, [Disables the IO portability layer])
1619         AC_MSG_NOTICE([Disabled IO Portability layer])
1622 if test "x$mono_feature_disable_attach" = "xyes"; then
1623         AC_DEFINE(DISABLE_ATTACH, 1, [Disable agent attach support])
1624         AC_MSG_NOTICE([Disabled agent attach])
1627 if test "x$mono_feature_disable_verifier" = "xyes"; then
1628         AC_DEFINE(DISABLE_VERIFIER, 1, [Disables the verifier])
1629         AC_MSG_NOTICE([Disabled the metadata and IL verifiers])
1632 if test "x$mono_feature_disable_jit" = "xyes"; then
1633         AC_DEFINE(DISABLE_JIT, 1, [Disable the JIT, only full-aot mode or interpreter will be supported by the runtime.])
1634         AC_MSG_NOTICE([Disabled the JIT engine, only full AOT or interpreter will be supported])
1637 AM_CONDITIONAL(DISABLE_JIT, test x$mono_feature_disable_jit = xyes)
1639 if test "x$mono_feature_disable_interpreter" = "xyes"; then
1640         AC_DEFINE(DISABLE_INTERPRETER, 1, [Disable the interpreter.])
1641         AC_MSG_NOTICE([Disabled the interpreter])
1644 AM_CONDITIONAL(DISABLE_INTERPRETER, test x$mono_feature_disable_interpreter = xyes)
1646 if test "x$mono_feature_disable_interpreter" != "xyes" -o "x$mono_feature_disable_jit" != "xyes"; then
1647         AC_DEFINE(ENABLE_ILGEN, 1, [Some VES is available at runtime])
1650 AM_CONDITIONAL(ENABLE_ILGEN, test x$mono_feature_disable_interpreter != xyes -o x$mono_feature_disable_jit != xyes)
1652 if test "x$mono_feature_disable_simd" = "xyes"; then
1653         AC_DEFINE(DISABLE_SIMD, 1, [Disable SIMD intrinsics related optimizations.])
1654         AC_MSG_NOTICE([Disabled SIMD support])
1657 if test "x$mono_feature_disable_soft_debug" = "xyes"; then
1658         AC_DEFINE(DISABLE_DEBUGGER_AGENT, 1, [Disable Soft Debugger Agent.])
1659         AC_MSG_NOTICE([Disabled Soft Debugger.])
1662 AM_CONDITIONAL(DISABLE_DEBUGGER_AGENT, test x$mono_feature_disable_debugger_agent = xyes)
1664 if test "x$mono_feature_disable_perfcounters" = "xyes"; then
1665         AC_DEFINE(DISABLE_PERFCOUNTERS, 1, [Disable Performance Counters.])
1666         AC_MSG_NOTICE([Disabled Performance Counters.])
1668 if test "x$mono_feature_disable_normalization" = "xyes"; then
1669         AC_DEFINE(DISABLE_NORMALIZATION, 1, [Disable String normalization support.])
1670         AC_MSG_NOTICE([Disabled String normalization support.])
1673 #TODO: remove assembly_remapping feature name once everyone is using desktop_loader
1674 if test "x$mono_feature_disable_assembly_remapping" = "xyes" || test "x$mono_feature_disable_desktop_loader" = "xyes"; then
1675         AC_DEFINE(DISABLE_DESKTOP_LOADER, 1, [Disable desktop assembly loader semantics.])
1676         AC_MSG_NOTICE([Disabled desktop assembly loader semantics.])
1679 if test "x$mono_feature_disable_shared_perfcounters" = "xyes"; then
1680         AC_DEFINE(DISABLE_SHARED_PERFCOUNTERS, 1, [Disable shared perfcounters.])
1681         AC_MSG_NOTICE([Disabled Shared perfcounters.])
1684 if test "x$mono_feature_disable_appdomains" = "xyes"; then
1685         AC_DEFINE(DISABLE_APPDOMAINS, 1, [Disable support for multiple appdomains.])
1686         AC_MSG_NOTICE([Disabled support for multiple appdomains.])
1689 if test "x$mono_feature_disable_remoting" = "xyes"; then
1690         AC_DEFINE(DISABLE_REMOTING, 1, [Disable remoting support (This disables type proxies and make com non-functional)])
1691         AC_MSG_NOTICE([Disabled remoting])
1694 if test "x$mono_feature_disable_security" = "xyes"; then
1695         AC_DEFINE(DISABLE_SECURITY, 1, [Disable CAS/CoreCLR security])
1696         AC_MSG_NOTICE([Disabled CAS/CoreCLR security manager (used e.g. for Moonlight)])
1699 if test "x$mono_feature_disable_lldb" = "xyes"; then
1700         AC_DEFINE(DISABLE_LLDB, 1, [Disable support code for the LLDB plugin.])
1701         AC_MSG_NOTICE([Disabled LLDB plugin support code.])
1704 if test "x$mono_feature_disable_mdb" = "xyes"; then
1705         AC_DEFINE(DISABLE_MDB, 1, [Disable support for .mdb symbol files.])
1706         AC_MSG_NOTICE([Disabled support for .mdb symbol files.])
1709 if test "x$mono_feature_disable_assert_messages" = "xyes"; then
1710         AC_DEFINE(DISABLE_ASSERT_MESSAGES, 1, [Disable assertion messages.])
1711         AC_MSG_NOTICE([Disabled assertion messages.])
1714 if test "x$mono_feature_disable_cleanup" = "xyes"; then
1715         AC_DEFINE(DISABLE_CLEANUP, 1, [Disable runtime cleanup.])
1716         AC_MSG_NOTICE([Disabled runtime cleanup.])
1719 if test "x$mono_feature_disable_sgen_marksweep_conc" = "xyes"; then
1720         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_CONC, 1, [Disable concurrent gc support in SGEN.])
1721         AC_MSG_NOTICE([Disabled concurrent gc support in SGEN.])
1725 if test "x$mono_feature_disable_sgen_split_nursery" = "xyes"; then
1726         AC_DEFINE(DISABLE_SGEN_SPLIT_NURSERY, 1, [Disable minor=split support in SGEN.])
1727         AC_MSG_NOTICE([Disabled minor=split support in SGEN.])
1730 if test "x$mono_feature_disable_sgen_gc_bridge" = "xyes"; then
1731         AC_DEFINE(DISABLE_SGEN_GC_BRIDGE, 1, [Disable gc bridge support in SGEN.])
1732         AC_MSG_NOTICE([Disabled gc bridge support in SGEN.])
1735 if test "x$mono_feature_disable_sgen_debug_helpers" = "xyes"; then
1736         AC_DEFINE(DISABLE_SGEN_DEBUG_HELPERS, 1, [Disable debug helpers in SGEN.])
1737         AC_MSG_NOTICE([Disabled debug helpers in SGEN.])
1740 if test "x$mono_feature_disable_sockets" = "xyes"; then
1741         AC_DEFINE(DISABLE_SOCKETS, 1, [Disable sockets])
1742         AC_MSG_NOTICE([Disabled sockets])
1745 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
1746 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
1748 has_extension_module=no
1749 AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
1751         for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
1752                 if test x$extension = xdefault ; then
1753                         has_extension_module=yes;
1754                 fi
1755         done
1756         if test x$enable_extension_module = xyes; then
1757                 has_extension_module=yes;
1758         fi
1759 ], [])
1761 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
1763 if test x$has_extension_module != xno ; then
1764         AC_DEFINE([ENABLE_EXTENSION_MODULE], 1, [Extension module enabled])
1765         AC_MSG_NOTICE([Enabling mono extension module.])
1768 # Deprecated
1769 AC_ARG_ENABLE(gsharedvt, [  --enable-gsharedvt Enable generic valuetype sharing (Deprecated)], enable_gsharedvt=$enableval, enable_gsharedvt=no)
1771 AC_MSG_CHECKING(for visibility __attribute__)
1772 AC_COMPILE_IFELSE([
1773         AC_LANG_SOURCE([[
1774                 void __attribute__ ((visibility ("hidden"))) doit (void) {}
1775                 int main () { doit (); return 0; }
1776         ]])
1777 ], [
1778    have_visibility_hidden=yes
1779    AC_MSG_RESULT(yes)
1780 ], [
1781    have_visibility_hidden=no
1782    AC_MSG_RESULT(no)
1786 dnl Boehm GC configuration
1789 AC_ARG_WITH(libgc,   [  --with-libgc=included,none  Controls the Boehm GC config, default=included],[libgc=$with_libgc],[libgc=included])
1791 AC_ARG_ENABLE(boehm, [  --disable-boehm            Disable the Boehm GC.], support_boehm=$enableval,support_boehm=${support_boehm:-yes})
1792 AM_CONDITIONAL(SUPPORT_BOEHM, test x$support_boehm = xyes)
1794 if test "x$support_boehm" = "xyes"; then
1796         AC_ARG_ENABLE(parallel-mark, [  --enable-parallel-mark     Enables Boehm GC Parallel Marking], enable_parallel_mark=$enableval, enable_parallel_mark=$parallel_mark)
1797         if test x$enable_parallel_mark = xyes; then
1798                 libgc_configure_args="$libgc_configure_args --enable-parallel-mark"
1799         fi
1801         gc_msg=""
1802         LIBGC_CPPFLAGS=
1803         LIBGC_LIBS=
1804         LIBGC_STATIC_LIBS=
1805         libgc_dir=
1806         case "x$libgc" in
1807                 xincluded)
1808                         if test "x$support_boehm" = "xyes"; then
1809                                 libgc_dir=libgc
1810                         fi
1812                         LIBGC_CPPFLAGS='-I$(top_srcdir)/libgc/include'
1813                         LIBGC_LIBS='$(top_builddir)/libgc/libmonogc.la'
1814                         LIBGC_STATIC_LIBS='$(top_builddir)/libgc/libmonogc-static.la'
1816                         BOEHM_DEFINES="-DHAVE_BOEHM_GC"
1818                         if test x$target_win32 = xyes; then
1819                                 BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
1820                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
1821                         fi
1823                         gc_msg="Included Boehm GC with typed GC"
1824                         if test x$enable_parallel_mark = xyes; then
1825                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
1826                                 gc_msg="$gc_msg and parallel mark"
1827                         else
1828                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC)", [GC description])
1829                         fi
1830                         ;;
1832                 xboehm|xbohem|xyes)
1833                         AC_MSG_WARN("External Boehm is no longer supported")
1834                         ;;
1836                 xsgen)
1837                         AC_MSG_WARN("Use --with-sgen instead, --with-libgc= controls Boehm configuration")
1838                         ;;
1840                 xnone)
1841                         AC_MSG_WARN("Compiling mono without GC.")
1842                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description])
1843                         AC_DEFINE(HAVE_NULL_GC,1,[No GC support.])
1844                         gc_msg="none"
1845                         ;;
1846                 *)
1847                         AC_MSG_ERROR([Invalid argument $libgc to --with-libgc.])
1848                         ;;
1849         esac
1851         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])
1852         if test "x$large_heap" = "xyes"; then
1853            CPPFLAGS="$CPPFLAGS -DLARGE_CONFIG"
1854         fi
1856         AC_SUBST(LIBGC_CPPFLAGS)
1857         AC_SUBST(LIBGC_LIBS)
1858         AC_SUBST(LIBGC_STATIC_LIBS)
1859         AC_SUBST(libgc_dir)
1860         AC_SUBST(BOEHM_DEFINES)
1863 AM_CONDITIONAL(SUPPORT_NULLGC, test "x$libgc" = "xnone")
1866 dnl End of Boehm GC Configuration
1869 dnl *************************************
1870 dnl *** Checks for zero length arrays ***
1871 dnl *************************************
1872 AC_MSG_CHECKING(whether $CC supports zero length arrays)
1873 AC_TRY_COMPILE([
1874         struct s {
1875                 int  length;
1876                 char data [0];
1877         };
1878 ], [], [
1879         AC_MSG_RESULT(yes)
1880         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 0, [Length of zero length arrays])
1881 ], [
1882         AC_MSG_RESULT(no)
1883         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
1886 dnl ***********************************
1887 dnl *** Checks for signals
1888 dnl ***********************************
1889 AC_CHECK_HEADERS(signal.h)
1890 AC_CHECK_FUNCS(sigaction)
1891 AC_CHECK_FUNCS(kill)
1892 AC_CHECK_FUNCS(signal)
1894 # signal() is declared inline in Android headers
1895 # so we need to workaround it by overriding the check.
1896 if test x$platform_android = xyes; then
1897         AC_DEFINE(HAVE_SIGNAL,1)
1900 # `target_ios=yes` does not detect watch devices and fails when cross-compiling
1901 AC_MONO_APPLE_TARGET(TARGET_OS_IPHONE, [mono_native_platform_ios=yes])
1903 if test x$host_win32 = xno; then
1904         dnl *************************************
1905         dnl *** Checks for time capabilities ***
1906         dnl *************************************
1908         AC_MSG_CHECKING(for CLOCK_MONOTONIC)
1909         AC_TRY_COMPILE([#include <time.h>], [
1910                 const int foo = CLOCK_MONOTONIC;
1911         ],[
1912                 AC_MSG_RESULT(yes)
1913                 AC_DEFINE(HAVE_CLOCK_MONOTONIC, 1, [CLOCK_MONOTONIC])
1914         ], [
1915                 AC_MSG_RESULT(no)
1916         ])
1918         AC_MSG_CHECKING(for CLOCK_MONOTONIC_COARSE)
1919         AC_TRY_COMPILE([#include <time.h>], [
1920                 const int foo = CLOCK_MONOTONIC_COARSE;
1921         ],[
1922                 AC_MSG_RESULT(yes)
1923                 AC_DEFINE(HAVE_CLOCK_MONOTONIC_COARSE, 1, [CLOCK_MONOTONIC_COARSE])
1924         ], [
1925                 AC_MSG_RESULT(no)
1926         ])
1928         AC_MSG_CHECKING(for CLOCK_REALTIME)
1929         AC_TRY_COMPILE([#include <time.h>], [
1930                 const int foo = CLOCK_REALTIME;
1931         ],[
1932                 AC_MSG_RESULT(yes)
1933                 AC_DEFINE(HAVE_CLOCK_REALTIME, 1, [CLOCK_REALTIME])
1934         ], [
1935                 AC_MSG_RESULT(no)
1936         ])
1938         AC_CHECK_FUNC(mach_absolute_time, [AC_DEFINE(HAVE_MACH_ABSOLUTE_TIME, 1, [mach_absolute_time])])
1939         AC_CHECK_FUNC(gethrtime, [AC_DEFINE(HAVE_GETHRTIME, 1, [gethrtime])])
1940         AC_CHECK_FUNC(read_real_time, [AC_DEFINE(HAVE_READ_REAL_TIME, 1, [read_real_time])])
1941         AC_CHECK_FUNC(mach_timebase_info, [AC_DEFINE(HAVE_MACH_TIMEBASE_INFO, 1, [mach_timebase_info])])
1942         AC_CHECK_FUNC(futimes,            [AC_DEFINE(HAVE_FUTIMES, 1, [futimes])])
1943         AC_CHECK_FUNC(futimens,           [AC_DEFINE(HAVE_FUTIMENS, 1, [futimens])])
1945         dnl hires monotonic clock support
1946         AC_SEARCH_LIBS(clock_gettime, rt)
1947         AC_CHECK_FUNCS(clock_nanosleep)
1949         dnl dynamic loader support
1950         AC_CHECK_FUNC(dlopen, DL_LIB="",
1951                 AC_CHECK_LIB(dl, dlopen, DL_LIB="-ldl", dl_support=no)
1952         )
1953         if test x$dl_support = xno; then
1954                 AC_MSG_WARN([No dynamic loading support available])
1955         else
1956                 LIBS="$LIBS $DL_LIB"
1957                 AC_DEFINE(HAVE_DL_LOADER,1,[dlopen-based dynamic loader available])
1958                 dnl from glib's configure.ac
1959                 AC_CACHE_CHECK([for preceeding underscore in symbols],
1960                         mono_cv_uscore,[
1961                         AC_TRY_RUN([#include <dlfcn.h>
1962                         int mono_underscore_test (void) { return 42; }
1963                         int main() {
1964                           void *f1 = (void*)0, *f2 = (void*)0, *handle;
1965                           handle = dlopen ((void*)0, 0);
1966                           if (handle) {
1967                             f1 = dlsym (handle, "mono_underscore_test");
1968                             f2 = dlsym (handle, "_mono_underscore_test");
1969                           } return (!f2 || f1);
1970                         }],
1971                                 [mono_cv_uscore=yes],
1972                                 [mono_cv_uscore=no],
1973                         [])
1974                 ])
1975                 if test "x$mono_cv_uscore" = "xyes"; then
1976                         MONO_DL_NEED_USCORE=1
1977                 else
1978                         MONO_DL_NEED_USCORE=0
1979                 fi
1980                 AC_SUBST(MONO_DL_NEED_USCORE)
1981                 AC_CHECK_FUNC(dlerror)
1982         fi
1984         dnl ******************************************************************
1985         dnl *** Checks for the IKVM JNI interface library                  ***
1986         dnl ******************************************************************
1987         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])
1989         ikvm_native_dir=
1990         if test x$with_ikvm_native = xyes; then
1991                 ikvm_native_dir=ikvm-native
1992                 jdk_headers_found="IKVM Native"
1993         fi
1995         AC_SUBST(ikvm_native_dir)
1997         AC_CHECK_HEADERS(execinfo.h)
1999         AC_CHECK_HEADERS(sys/auxv.h sys/resource.h)
2001         AC_CHECK_FUNCS(getgrgid_r)
2002         AC_CHECK_FUNCS(getgrnam_r)
2003         AC_CHECK_FUNCS(getresuid)
2004         AC_CHECK_FUNCS(setresuid)
2005         AC_CHECK_FUNCS(kqueue)
2006         AC_CHECK_FUNCS(backtrace_symbols)
2007         AC_CHECK_FUNCS(mkstemp)
2008         AC_CHECK_FUNCS(mmap)
2009         AC_CHECK_FUNCS(madvise)
2010         AC_CHECK_FUNCS(getrusage)
2011         AC_CHECK_FUNCS(getpriority)
2012         AC_CHECK_FUNCS(setpriority)
2013         AC_CHECK_FUNCS(dl_iterate_phdr)
2014         AC_CHECK_FUNCS(dladdr)
2015         AC_CHECK_FUNCS(sysconf)
2016         AC_CHECK_FUNCS(getrlimit)
2017         AC_CHECK_FUNCS(prctl)
2018         AC_CHECK_FUNCS(arc4random)
2019         AC_CHECK_FUNCS(nl_langinfo)
2021         AC_CHECK_FUNCS(sched_getaffinity)
2022         AC_CHECK_FUNCS(sched_setaffinity)
2023         AC_CHECK_FUNCS(sched_getcpu)
2025         if test x$platform_android != xyes; then
2026                 AC_CHECK_FUNCS(getpwnam_r)
2027                 AC_CHECK_FUNCS(getpwuid_r)
2028         fi
2030         AC_CHECK_FUNCS(readlink)
2031         AC_CHECK_FUNCS(chmod)
2032         AC_CHECK_FUNCS(lstat)
2033         AC_CHECK_FUNCS(getdtablesize)
2035         AC_CHECK_FUNCS(ftruncate)
2036         AC_CHECK_FUNCS(msync)
2038         AC_CHECK_FUNCS(gethostname getpeername)
2039         AC_CHECK_FUNCS(utime utimes)
2041         AC_CHECK_FUNCS(openlog closelog)
2042         AC_CHECK_FUNCS(atexit)
2044         AC_FUNC_STRERROR_R()
2046         dnl ****************************************************************
2047         dnl *** Check for sched_setaffinity from glibc versions before   ***
2048         dnl *** 2.3.4. The older versions of the function only take 2    ***
2049         dnl *** parameters, not 3.                                       ***
2050         dnl ***                                                          ***
2051         dnl *** Because the interface change was not made in a minor     ***
2052         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
2053         dnl *** won't always indicate the interface sched_affinity has.  ***
2054         dnl ****************************************************************
2055         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
2056         AC_TRY_COMPILE([#include <sched.h>], [
2057             int mask = 1; 
2058             sched_setaffinity(0, &mask);
2059         ], [
2060                 # Yes, we have it...
2061                 AC_MSG_RESULT(yes)
2062                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
2063         ], [
2064                 # We have the new, three-parameter version
2065                 AC_MSG_RESULT(no)
2066         ])
2067         AC_TRY_COMPILE([#include <sched.h>], [
2068              CPU_COUNT((void *) 0);
2069         ], [
2070                 AC_MSG_RESULT(yes)
2071                 AC_DEFINE(GLIBC_HAS_CPU_COUNT, 1, [GLIBC has CPU_COUNT macro in sched.h])
2072         ], [
2073                 # We have the new, three-parameter version
2074                 AC_MSG_RESULT(no)
2075         ])
2077         dnl ******************************************************************
2078         dnl *** Check for large file support                               ***
2079         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
2080         dnl ******************************************************************
2081         
2082         # Check that off_t can represent 2**63 - 1 correctly, working around
2083         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
2084         # CPPFLAGS and sets $large_offt to yes if the test succeeds
2085         large_offt=no
2086         AC_DEFUN([LARGE_FILES], [
2087                 large_CPPFLAGS=$CPPFLAGS
2088                 CPPFLAGS="$CPPFLAGS $1"
2089                 AC_TRY_COMPILE([
2090                         #include <sys/types.h>
2091                         #include <limits.h>
2092                 ], [
2093                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
2094                         #define COMPILE_TIME_ASSERT(pred) \
2095                                 switch(0){case 0:case pred:;}
2096                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
2097                 ], [
2098                         AC_MSG_RESULT(ok)
2099                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
2100                         large_CPPFLAGS="$large_CPPFLAGS $1"
2101                         large_offt=yes
2102                 ], [
2103                         AC_MSG_RESULT(no)
2104                 ])
2105                 CPPFLAGS=$large_CPPFLAGS
2106         ])
2108         AC_MSG_CHECKING(if off_t is 64 bits wide)
2109         LARGE_FILES("")
2110         if test $large_offt = no; then
2111                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
2112                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
2113         fi
2114         if test $large_offt = no; then
2115                 AC_MSG_WARN([No 64 bit file size support available])
2116         fi
2117         
2118         dnl *****************************
2119         dnl *** Checks for libsocket  ***
2120         dnl *****************************
2121         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
2123         case "$host" in
2124                 *-*-*freebsd*)
2125                         dnl *****************************
2126                         dnl *** Checks for libinotify ***
2127                         dnl *****************************
2128                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
2129         esac
2131         dnl *******************************
2132         dnl *** Checks for MSG_NOSIGNAL ***
2133         dnl *******************************
2134         AC_MSG_CHECKING(for MSG_NOSIGNAL)
2135         AC_TRY_COMPILE([#include <sys/socket.h>], [
2136                 int f = MSG_NOSIGNAL;
2137         ], [
2138                 # Yes, we have it...
2139                 AC_MSG_RESULT(yes)
2140                 AC_DEFINE(HAVE_MSG_NOSIGNAL, 1, [Have MSG_NOSIGNAL])
2141         ], [
2142                 # We'll have to use signals
2143                 AC_MSG_RESULT(no)
2144         ])
2146         dnl *****************************
2147         dnl *** Checks for IPPROTO_IP ***
2148         dnl *****************************
2149         AC_MSG_CHECKING(for IPPROTO_IP)
2150         AC_TRY_COMPILE([#include <netinet/in.h>], [
2151                 int level = IPPROTO_IP;
2152         ], [
2153                 # Yes, we have it...
2154                 AC_MSG_RESULT(yes)
2155                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
2156         ], [
2157                 # We'll have to use getprotobyname
2158                 AC_MSG_RESULT(no)
2159         ])
2161         dnl *******************************
2162         dnl *** Checks for IPPROTO_IPV6 ***
2163         dnl *******************************
2164         AC_MSG_CHECKING(for IPPROTO_IPV6)
2165         AC_TRY_COMPILE([#include <netinet/in.h>], [
2166                 int level = IPPROTO_IPV6;
2167         ], [
2168                 # Yes, we have it...
2169                 AC_MSG_RESULT(yes)
2170                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
2171         ], [
2172                 # We'll have to use getprotobyname
2173                 AC_MSG_RESULT(no)
2174         ])
2176         dnl ******************************
2177         dnl *** Checks for IPPROTO_TCP ***
2178         dnl ******************************
2179         AC_MSG_CHECKING(for IPPROTO_TCP)
2180         AC_TRY_COMPILE([#include <netinet/in.h>], [
2181                 int level = IPPROTO_TCP;
2182         ], [
2183                 # Yes, we have it...
2184                 AC_MSG_RESULT(yes)
2185                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
2186         ], [
2187                 # We'll have to use getprotobyname
2188                 AC_MSG_RESULT(no)
2189         ])
2191         dnl *****************************
2192         dnl *** Checks for SOL_IP     ***
2193         dnl *****************************
2194         AC_MSG_CHECKING(for SOL_IP)
2195         AC_TRY_COMPILE([#include <netdb.h>], [
2196                 int level = SOL_IP;
2197         ], [
2198                 # Yes, we have it...
2199                 AC_MSG_RESULT(yes)
2200                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
2201         ], [
2202                 # We'll have to use getprotobyname
2203                 AC_MSG_RESULT(no)
2204         ])
2206         dnl *****************************
2207         dnl *** Checks for SOL_IPV6     ***
2208         dnl *****************************
2209         AC_MSG_CHECKING(for SOL_IPV6)
2210         AC_TRY_COMPILE([#include <netdb.h>], [
2211                 int level = SOL_IPV6;
2212         ], [
2213                 # Yes, we have it...
2214                 AC_MSG_RESULT(yes)
2215                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
2216         ], [
2217                 # We'll have to use getprotobyname
2218                 AC_MSG_RESULT(no)
2219         ])
2221         dnl *****************************
2222         dnl *** Checks for SOL_TCP    ***
2223         dnl *****************************
2224         AC_MSG_CHECKING(for SOL_TCP)
2225         AC_TRY_COMPILE([#include <netdb.h>], [
2226                 int level = SOL_TCP;
2227         ], [
2228                 # Yes, we have it...
2229                 AC_MSG_RESULT(yes)
2230                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
2231         ], [
2232                 # We'll have to use getprotobyname
2233                 AC_MSG_RESULT(no)
2234         ])
2236         dnl *****************************
2237         dnl *** Checks for IP_PKTINFO ***
2238         dnl *****************************
2239         AC_MSG_CHECKING(for IP_PKTINFO)
2240         AC_TRY_COMPILE([#include <linux/in.h>], [
2241                 int level = IP_PKTINFO;
2242         ], [
2243                 # Yes, we have it...
2244                 AC_MSG_RESULT(yes)
2245                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
2246         ], [
2247                 AC_MSG_RESULT(no)
2248         ])
2250         dnl *****************************
2251         dnl *** Checks for IPV6_PKTINFO ***
2252         dnl *****************************
2253         AC_MSG_CHECKING(for IPV6_PKTINFO)
2254         AC_TRY_COMPILE([#include <netdb.h>], [
2255                 int level = IPV6_PKTINFO;
2256         ], [
2257                 # Yes, we have it...
2258                 AC_MSG_RESULT(yes)
2259                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
2260         ], [
2261                 AC_MSG_RESULT(no)
2262         ])
2264         dnl **********************************
2265         dnl *** Checks for IP_DONTFRAG     ***
2266         dnl **********************************
2267         AC_MSG_CHECKING(for IP_DONTFRAG)
2268         AC_TRY_COMPILE([#include <netinet/in.h>], [
2269                 int level = IP_DONTFRAG;
2270         ], [
2271                 # Yes, we have it...
2272                 AC_MSG_RESULT(yes)
2273                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
2274         ], [
2275                 AC_MSG_RESULT(no)
2276         ])
2278         dnl **********************************
2279         dnl *** Checks for IP_DONTFRAGMENT ***
2280         dnl **********************************
2281         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
2282         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
2283                 int level = IP_DONTFRAGMENT;
2284         ], [
2285                 # Yes, we have it...
2286                 AC_MSG_RESULT(yes)
2287                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
2288         ], [
2289                 AC_MSG_RESULT(no)
2290         ])
2292         dnl **********************************
2293         dnl *** Checks for IP_MTU_DISCOVER ***
2294         dnl **********************************
2295         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
2296         AC_TRY_COMPILE([#include <linux/in.h>], [
2297                 int level = IP_MTU_DISCOVER;
2298         ], [
2299                 # Yes, we have it...
2300                 AC_MSG_RESULT(yes)
2301                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
2302         ], [
2303                 AC_MSG_RESULT(no)
2304         ])
2306         dnl **********************************
2307         dnl *** Checks for  IP_PMTUDISC_DO ***
2308         dnl **********************************
2309         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
2310         AC_TRY_COMPILE([#include <linux/in.h>], [
2311                 int level = IP_PMTUDISC_DO;
2312         ], [
2313                 # Yes, we have it...
2314                 AC_MSG_RESULT(yes)
2315                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
2316         ], [
2317                 AC_MSG_RESULT(no)
2318         ])
2320         dnl *********************************
2321         dnl *** Check for struct ip_mreqn ***
2322         dnl *********************************
2323         AC_MSG_CHECKING(for struct ip_mreqn)
2324         AC_TRY_COMPILE([#include <netinet/in.h>], [
2325                 struct ip_mreqn mreq;
2326                 mreq.imr_address.s_addr = 0;
2327         ], [
2328                 # Yes, we have it...
2329                 AC_MSG_RESULT(yes)
2330                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
2331         ], [
2332                 # We'll just have to try and use struct ip_mreq
2333                 AC_MSG_RESULT(no)
2334                 AC_MSG_CHECKING(for struct ip_mreq)
2335                 AC_TRY_COMPILE([#include <netinet/in.h>], [
2336                         struct ip_mreq mreq;
2337                         mreq.imr_interface.s_addr = 0;
2338                 ], [
2339                         # Yes, we have it...
2340                         AC_MSG_RESULT(yes)
2341                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
2342                 ], [
2343                         # No multicast support
2344                         AC_MSG_RESULT(no)
2345                 ])
2346         ])
2347         
2348         dnl **********************************
2349         dnl *** Check for getaddrinfo ***
2350         dnl **********************************
2351         AC_MSG_CHECKING(for getaddrinfo)
2352                 AC_TRY_LINK([
2353                 #include <stdio.h>
2354                 #include <netdb.h>
2355         ], [
2356                 getaddrinfo(NULL,NULL,NULL,NULL);
2357         ], [
2358                 # Yes, we have it...
2359                 AC_MSG_RESULT(yes)
2360                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2361         ], [
2362                 AC_MSG_RESULT(no)
2363         ])
2365         dnl **********************************
2366         dnl *** Check for gethostbyname2_r ***
2367         dnl **********************************
2368         AC_MSG_CHECKING(for gethostbyname2_r)
2369                 AC_TRY_LINK([
2370                 #include <stdio.h>
2371                 #include <netdb.h>
2372         ], [
2374                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
2375         ], [
2376                 # Yes, we have it...
2377                 AC_MSG_RESULT(yes)
2378                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
2379         ], [
2380                 AC_MSG_RESULT(no)
2381         ])
2383         dnl **********************************
2384         dnl *** Check for gethostbyname2 ***
2385         dnl **********************************
2386         AC_MSG_CHECKING(for gethostbyname2)
2387                 AC_TRY_LINK([
2388                 #include <stdio.h>
2389                 #include <netdb.h>
2390         ], [
2391                 gethostbyname2(NULL,0);
2392         ], [
2393                 # Yes, we have it...
2394                 AC_MSG_RESULT(yes)
2395                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
2396         ], [
2397                 AC_MSG_RESULT(no)
2398         ])
2400         dnl **********************************
2401         dnl *** Check for gethostbyname ***
2402         dnl **********************************
2403         AC_MSG_CHECKING(for gethostbyname)
2404                 AC_TRY_LINK([
2405                 #include <stdio.h>
2406                 #include <netdb.h>
2407         ], [
2408                 gethostbyname(NULL);
2409         ], [
2410                 # Yes, we have it...
2411                 AC_MSG_RESULT(yes)
2412                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2413         ], [
2414                 AC_MSG_RESULT(no)
2415         ])
2417         dnl **********************************
2418         dnl *** Check for getprotobyname ***
2419         dnl **********************************
2420         AC_MSG_CHECKING(for getprotobyname)
2421                 AC_TRY_LINK([
2422                 #include <stdio.h>
2423                 #include <netdb.h>
2424         ], [
2425                 getprotobyname(NULL);
2426         ], [
2427                 # Yes, we have it...
2428                 AC_MSG_RESULT(yes)
2429                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2430         ], [
2431                 AC_MSG_RESULT(no)
2432         ])
2434         dnl **********************************
2435         dnl *** Check for getprotobyname_r ***
2436         dnl **********************************
2437         AC_MSG_CHECKING(for getprotobyname_r)
2438                 AC_TRY_LINK([
2439                 #include <stdio.h>
2440                 #include <netdb.h>
2441         ], [
2442                 getprotobyname_r(NULL, NULL, NULL, 0, NULL);
2443         ], [
2444                 # Yes, we have it...
2445                 AC_MSG_RESULT(yes)
2446                 AC_DEFINE(HAVE_GETPROTOBYNAME_R, 1, [Have getprotobyname_r])
2447         ], [
2448                 AC_MSG_RESULT(no)
2449         ])
2451         dnl **********************************
2452         dnl *** Check for getnameinfo ***
2453         dnl **********************************
2454         AC_MSG_CHECKING(for getnameinfo)
2455                 AC_TRY_LINK([
2456                 #include <stdio.h>
2457                 #include <netdb.h>
2458         ], [
2459                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2460         ], [
2461                 # Yes, we have it...
2462                 AC_MSG_RESULT(yes)
2463                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2464         ], [
2465                 AC_MSG_RESULT(no)
2466         ])
2469         dnl **********************************
2470         dnl *** Check for inet_ntop ***
2471         dnl **********************************
2472         AC_MSG_CHECKING(for inet_ntop)
2473                 AC_TRY_LINK([
2474                 #include <stdio.h>
2475                 #include <arpa/inet.h>
2476         ], [
2477                 inet_ntop (0, NULL, NULL, 0);
2478         ], [
2479                 # Yes, we have it...
2480                 AC_MSG_RESULT(yes)
2481                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2482         ], [
2483                 AC_MSG_RESULT(no)
2484         ])
2486         dnl *****************************
2487         dnl *** Checks for libnsl     ***
2488         dnl *****************************
2489         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
2491         AC_CHECK_FUNCS(inet_pton inet_aton)
2493         dnl *****************************
2494         dnl *** Checks for libxnet    ***
2495         dnl *****************************
2496         case "${host}" in
2497                 *solaris* )
2498                         AC_MSG_CHECKING(for Solaris XPG4 support)
2499                         if test -f /usr/lib/libxnet.so; then
2500                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
2501                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
2502                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
2503                                 LIBS="$LIBS -lxnet"
2504                                 AC_MSG_RESULT(yes)
2505                         else
2506                                 AC_MSG_RESULT(no)
2507                         fi
2509                         if test "$GCC" = "yes"; then
2510                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
2511                         fi
2512                 ;;
2513         esac
2515         dnl *****************************
2516         dnl *** Checks for libpthread ***
2517         dnl *****************************
2518 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
2519 # and libpthread does not exist
2521         case "${host}" in
2522                 *-*-*haiku*)
2523                         dnl Haiku has pthread in libroot (libc equiv)
2524                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS")
2525                 ;;
2526                 *-*-*freebsd*)
2527                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2528                 ;;
2529                 *-*-*openbsd*)
2530                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2531                 ;;
2532                 *)
2533                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
2534                 ;;
2535         esac
2536         AC_CHECK_HEADERS(pthread.h)
2537         AC_CHECK_HEADERS(pthread_np.h)
2538         AC_CHECK_FUNCS(pthread_mutex_timedlock)
2539         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_getname_np pthread_setname_np pthread_cond_timedwait_relative_np)
2540         AC_CHECK_FUNCS(pthread_kill)
2541         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
2542         AC_TRY_COMPILE([ #include <pthread.h>], [
2543                 pthread_mutexattr_t attr;
2544                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
2545         ], [
2546                 AC_MSG_RESULT(ok)
2547         ], [
2548                 AC_MSG_RESULT(no)
2549                 AC_ERROR(Posix system lacks support for recursive mutexes)
2550         ])
2551         AC_CHECK_FUNCS(pthread_attr_setstacksize)
2552         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
2553         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
2554         AC_CHECK_FUNCS(mincore mlock munlock)
2556         dnl ***********************************
2557         dnl *** Checks for working __thread ***
2558         dnl ***********************************
2559         AC_MSG_CHECKING(for working __thread)
2560         if test "x$with_tls" != "x__thread"; then
2561                 AC_MSG_RESULT(disabled)
2562         elif test "x$cross_compiling" = "xyes"; then
2563                 AC_MSG_RESULT(cross compiling, assuming yes)
2564         else
2565                 AC_TRY_RUN([
2566                         #if defined(__APPLE__) && defined(__clang__)
2567                         #error "__thread does not currently work with clang on Mac OS X"
2568                         #endif
2569                         
2570                         #include <unistd.h>
2571                         #include <pthread.h>
2572                         __thread int i;
2573                         static int res1, res2;
2575                         void thread_main (void *arg)
2576                         {
2577                                 i = arg;
2578                                 sleep (1);
2579                                 if (arg == 1)
2580                                         res1 = (i == arg);
2581                                 else
2582                                         res2 = (i == arg);
2583                         }
2585                         int main () {
2586                                 pthread_t t1, t2;
2588                                 i = 5;
2590                                 pthread_create (&t1, NULL, thread_main, 1);
2591                                 pthread_create (&t2, NULL, thread_main, 2);
2593                                 pthread_join (t1, NULL);
2594                                 pthread_join (t2, NULL);
2596                                 return !(res1 + res2 == 2);
2597                         }
2598                 ], [
2599                                 AC_MSG_RESULT(yes)
2600                 ], [
2601                                 AC_MSG_RESULT(no)
2602                                 with_tls=pthread
2603                 ])
2604         fi
2606         dnl **************************************
2607         dnl *** Checks for working sigaltstack ***
2608         dnl **************************************
2609         AC_MSG_CHECKING(for working sigaltstack)
2610         if test "x$with_sigaltstack" != "xyes"; then
2611                 AC_MSG_RESULT(disabled)
2612         elif test "x$cross_compiling" = "xyes"; then
2613                 AC_MSG_RESULT(cross compiling, assuming no)
2614                 with_sigaltstack=no
2615         else
2616                 AC_TRY_RUN([
2617                         #include <stdio.h>
2618                         #include <stdlib.h>
2619                         #include <unistd.h>
2620                         #include <signal.h>
2621                         #include <pthread.h>
2622                         #include <sys/wait.h>
2623                         #if defined(__FreeBSD__) || defined(__NetBSD__)
2624                         #define SA_STACK SA_ONSTACK
2625                         #endif
2626                         static void
2627                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
2628                         {
2629                                 exit (0);
2630                         }
2632                         volatile char*__ptr = NULL;
2633                         static void *
2634                         loop (void *ignored)
2635                         {
2636                                 *__ptr = 0;
2637                                 return NULL;
2638                         }
2640                         static void
2641                         child ()
2642                         {
2643                                 struct sigaction sa;
2644                                 stack_t sas;
2645                                 pthread_t id;
2646                                 pthread_attr_t attr;
2648                                 sa.sa_sigaction = sigsegv_signal_handler;
2649                                 sigemptyset (&sa.sa_mask);
2650                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
2651                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
2652                                         perror ("sigaction");
2653                                         return;
2654                                 }
2656                                 /* x86 darwin deliver segfaults using SIGBUS */
2657                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
2658                                         perror ("sigaction");
2659                                         return;
2660                                 }
2661                                 sas.ss_sp = malloc (SIGSTKSZ);
2662                                 sas.ss_size = SIGSTKSZ;
2663                                 sas.ss_flags = 0;
2664                                 if (sigaltstack (&sas, NULL) == -1) {
2665                                         perror ("sigaltstack");
2666                                         return;
2667                                 }
2669                                 pthread_attr_init (&attr);
2670                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
2671                                         printf ("pthread_create\n");
2672                                         return;
2673                                 }
2675                                 sleep (100);
2676                         }
2678                         int
2679                         main ()
2680                         {
2681                                 pid_t son;
2682                                 int status;
2683                                 int i;
2685                                 son = fork ();
2686                                 if (son == -1) {
2687                                         return 1;
2688                                 }
2690                                 if (son == 0) {
2691                                         child ();
2692                                         return 0;
2693                                 }
2695                                 for (i = 0; i < 300; ++i) {
2696                                         waitpid (son, &status, WNOHANG);
2697                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
2698                                                 return 0;
2699                                         usleep (10000);
2700                                 }
2702                                 kill (son, SIGKILL);
2703                                 return 1;
2704                         }
2706                 ], [
2707                                 AC_MSG_RESULT(yes)
2708                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
2709                 ], [
2710                                 with_sigaltstack=no
2711                                 AC_MSG_RESULT(no)
2712                 ])
2713         fi
2715         dnl ********************************
2716         dnl *** Checks for semaphore lib ***
2717         dnl ********************************
2718         # 'Real Time' functions on Solaris
2719         # posix4 on Solaris 2.6
2720         # pthread (first!) on Linux
2721         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
2723         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
2724         AC_CHECK_FUNCS(shm_open)
2726         dnl ********************************
2727         dnl *** Checks for timezone stuff **
2728         dnl ********************************
2729         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
2730                 AC_TRY_COMPILE([
2731                         #include <time.h>
2732                         ], [
2733                         struct tm tm;
2734                         tm.tm_gmtoff = 1;
2735                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
2736         if test $ac_cv_struct_tm_gmtoff = yes; then
2737                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
2738         else
2739                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
2740                         AC_TRY_COMPILE([
2741                                 #include <time.h>
2742                         ], [
2743                                 timezone = 1;
2744                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
2745                 if test $ac_cv_var_timezone = yes; then
2746                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
2747                 else
2748                         AC_ERROR(unable to find a way to determine timezone)
2749                 fi
2750         fi
2752         dnl *********************************
2753         dnl *** Checks for math functions ***
2754         dnl *********************************
2755         AC_SEARCH_LIBS(sqrtf, m)
2757         dnl ****************************************************************
2758         dnl *** Checks for working poll() (macosx defines it but doesn't ***
2759         dnl *** have it in the library (duh))                            ***
2760         dnl ****************************************************************
2761         AC_CHECK_FUNCS(poll)
2763         dnl **********************************
2764         dnl *** epoll                      ***
2765         dnl **********************************
2766         AC_CHECK_HEADERS(sys/epoll.h)
2767         haveepoll=no
2768         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
2769         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
2770                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
2771         fi
2773         havekqueue=no
2775         AC_CHECK_HEADERS(sys/event.h)
2776         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
2778         dnl **************************************
2779         dnl * Darwin has a race that prevents us from using reliably:
2780         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
2781         dnl * Since kqueue is mostly used for scaling large web servers, 
2782         dnl * and very few folks run Mono on large web servers on OSX, falling
2783         dnl * back 
2784         dnl **************************************
2785         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
2786                 if test "x$host_darwin" = "xno"; then
2787                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
2788                 fi
2789         fi
2791         dnl ******************************
2792         dnl *** Checks for SIOCGIFCONF ***
2793         dnl ******************************
2794         AC_CHECK_HEADERS(sys/ioctl.h)
2795         AC_CHECK_HEADERS(net/if.h, [], [],
2796            [
2797            #ifdef HAVE_SYS_TYPES_H
2798            # include <sys/types.h>
2799            #endif
2800            #ifdef HAVE_SYS_SOCKET_H
2801            # include <sys/socket.h>
2802            #endif
2803            ])
2804         AC_MSG_CHECKING(for ifreq)
2805         AC_TRY_COMPILE([
2806                 #include <stdio.h>
2807                 #include <sys/ioctl.h>
2808                 #include <net/if.h>
2809                 ], [
2810                 struct ifconf ifc;
2811                 struct ifreq *ifr;
2812                 void *x;
2813                 ifc.ifc_len = 0;
2814                 ifc.ifc_buf = NULL;
2815                 x = (void *) &ifr->ifr_addr;
2816                 ],[
2817                         AC_MSG_RESULT(yes)
2818                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
2819                 ], [
2820                         AC_MSG_RESULT(no)
2821                 ])
2822         dnl **********************************
2823         dnl ***     Checks for sin_len     ***
2824         dnl **********************************
2825         AC_MSG_CHECKING(for sockaddr_in.sin_len)
2826         AC_TRY_COMPILE([
2827                 #include <netinet/in.h>
2828                 ], [
2829                 struct sockaddr_in saddr;
2830                 saddr.sin_len = sizeof (saddr);
2831                 ],[
2832                         AC_MSG_RESULT(yes)
2833                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
2834                 ], [
2835                         AC_MSG_RESULT(no)
2836                 ])      
2837         dnl **********************************
2838         dnl ***    Checks for sin6_len     ***
2839         dnl **********************************
2840         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
2841         AC_TRY_COMPILE([
2842                 #include <netinet/in.h>
2843                 ], [
2844                 struct sockaddr_in6 saddr6;
2845                 saddr6.sin6_len = sizeof (saddr6);
2846                 ],[
2847                         AC_MSG_RESULT(yes)
2848                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
2849                 ], [
2850                         AC_MSG_RESULT(no)
2851                 ])
2852         dnl **********************************
2853         dnl *** Check for getifaddrs       ***
2854         dnl **********************************
2855         AC_MSG_CHECKING(for getifaddrs)
2856                 AC_TRY_LINK([
2857                 #include <stdio.h>
2858                 #include <sys/types.h>
2859                 #include <sys/socket.h>
2860                 #ifdef HAVE_NET_IF_H
2861                 #include <net/if.h>
2862                 #endif
2863                 #include <ifaddrs.h>
2864         ], [
2865                 getifaddrs(NULL);
2866         ], [
2867                 # Yes, we have it...
2868                 AC_MSG_RESULT(yes)
2869                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
2870         ], [
2871                 AC_MSG_RESULT(no)
2872         ])
2873         dnl **********************************
2874         dnl *** Check for if_nametoindex   ***
2875         dnl **********************************
2876         AC_MSG_CHECKING(for if_nametoindex)
2877                 AC_TRY_LINK([
2878                 #include <stdio.h>
2879                 #include <sys/types.h>
2880                 #include <sys/socket.h>
2881                 #include <net/if.h>
2882         ], [
2883                 if_nametoindex(NULL);
2884         ], [
2885                 # Yes, we have it...
2886                 AC_MSG_RESULT(yes)
2887                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
2888         ], [
2889                 AC_MSG_RESULT(no)
2890         ])
2891         dnl **********************************
2892         dnl *** Check for access ***
2893         dnl **********************************
2894         AC_MSG_CHECKING(for access)
2895                 AC_TRY_LINK([
2896                 #include <unistd.h>
2897         ], [
2898                 access(NULL,0);
2899         ], [
2900                 # Yes, we have it...
2901                 AC_MSG_RESULT(yes)
2902                 AC_DEFINE(HAVE_ACCESS, 1, [Have access])
2903         ], [
2904                 AC_MSG_RESULT(no)
2905         ])
2906                         
2907         dnl **********************************
2908         dnl *** Checks for proclib         ***
2909         dnl **********************************
2910         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.)])
2911         dnl **********************************
2912         dnl *** Checks for MonoPosixHelper ***
2913         dnl **********************************
2914         AC_CHECK_HEADERS(checklist.h)
2915         AC_CHECK_HEADERS(pathconf.h)
2916         AC_CHECK_HEADERS(fstab.h)
2917         AC_CHECK_HEADERS(attr/xattr.h)
2918         AC_CHECK_HEADERS(sys/extattr.h)
2919         AC_CHECK_HEADERS(sys/sendfile.h)
2920         AC_CHECK_HEADERS(sys/statvfs.h)
2921         AC_CHECK_HEADERS(sys/statfs.h)
2922         AC_CHECK_HEADERS(sys/vfstab.h)
2923         AC_CHECK_HEADERS(sys/xattr.h)
2924         AC_CHECK_HEADERS(sys/mman.h)
2925         AC_CHECK_HEADERS(sys/param.h)
2926         AC_CHECK_HEADERS(sys/mount.h, [], [],
2927                 [
2928                 #ifdef HAVE_SYS_PARAM_H
2929                 # include <sys/param.h>
2930                 #endif
2931                 ])
2932         AC_CHECK_HEADERS(sys/mount.h)
2933         AC_CHECK_FUNCS(confstr)
2934         AC_CHECK_FUNCS(seekdir telldir)
2935         AC_CHECK_FUNCS(getdomainname)
2936         AC_CHECK_FUNCS(setdomainname)
2937         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
2938         AC_CHECK_FUNCS(setgroups)
2939         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
2940         AC_CHECK_FUNCS(getfsstat)
2941         AC_CHECK_FUNCS(lutimes futimes)
2942         AC_CHECK_FUNCS(mremap)
2943         AC_CHECK_FUNCS(remap_file_pages)
2944         AC_CHECK_FUNCS(posix_fadvise)
2945         AC_CHECK_FUNCS(posix_fallocate)
2946         AC_CHECK_FUNCS(posix_madvise)
2947         AC_CHECK_FUNCS(vsnprintf)
2948         AC_CHECK_FUNCS(sendfile)
2949         AC_CHECK_FUNCS(gethostid sethostid)
2950         AC_CHECK_FUNCS(sethostname)
2951         AC_CHECK_FUNCS(statfs)
2952         AC_CHECK_FUNCS(fstatfs)
2953         AC_CHECK_FUNCS(statvfs)
2954         AC_CHECK_FUNCS(fstatvfs)
2955         AC_CHECK_FUNCS(stime)
2956         AC_CHECK_FUNCS(ttyname_r)
2957         AC_CHECK_FUNCS(psignal)
2958         AC_CHECK_FUNCS(getlogin_r)
2959         AC_CHECK_FUNCS(lockf)
2960         AC_CHECK_FUNCS(swab)
2961         AC_CHECK_FUNCS(setusershell endusershell)
2962         AC_CHECK_FUNCS(futimens utimensat)
2963         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
2964         AC_CHECK_FUNCS(readv writev preadv pwritev)
2965         AC_CHECK_FUNCS(setpgid)
2966         AC_CHECK_FUNCS(system)
2967         AC_CHECK_FUNCS(fork execv execve)
2968         AC_CHECK_FUNCS(waitpid)
2969         AC_CHECK_FUNCS(accept4)
2970         AC_CHECK_FUNCS(localtime_r)
2971         AC_CHECK_FUNCS(mkdtemp)
2972         AC_CHECK_SIZEOF(size_t)
2973         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
2974                 [#include <sys/types.h>
2975                  #include <sys/stat.h>
2976                  #include <unistd.h>])
2977         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
2978                 [#include <sys/types.h>
2979                  #include <sys/stat.h>
2980                  #include <unistd.h>])
2981         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
2982                 [#include <sys/time.h>])
2983         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
2984                 [#include <sys/socket.h>])
2985         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
2986                 [#include <unistd.h>
2987                  #include <fcntl.h>])
2988         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
2989                 [#include <sys/uio.h>])
2990         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
2991                 [#include <sys/socket.h>])
2992         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
2993                 [#include <sys/poll.h>])
2994         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
2995                 [#include <sys/socket.h>])
2996         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
2997                 [#include <sys/socket.h>])
2998         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
2999                 [#include <netinet/in.h>])
3000         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
3001                 [#include <netinet/in.h>])
3002         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
3003                 [#include <sys/un.h>])
3004         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
3005                 [#include <sys/types.h>
3006                  #include <sys/stat.h>
3007                  #include <unistd.h>])
3008         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
3009                 [#include <time.h>])
3010         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
3011                 [#include <sys/time.h>
3012                  #include <sys/types.h>
3013                  #include <utime.h>])
3014         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
3015                 [#include <sys/time.h>])
3016         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
3017                 [#include <sys/types.h>
3018                  #include <utime.h>])
3019         AC_CHECK_MEMBERS(
3020                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
3021                 [#include <sys/types.h>
3022                  #include <dirent.h>])
3023         AC_CHECK_MEMBERS(
3024                 [struct passwd.pw_gecos],,, 
3025                 [#include <sys/types.h>
3026                  #include <pwd.h>])
3027         AC_CHECK_MEMBERS(
3028                 [struct statfs.f_flags],,, 
3029                 [#include <sys/types.h>
3030                  #include <sys/vfs.h>])
3031         AC_CHECK_MEMBERS(
3032                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
3033                 [#include <sys/types.h>
3034                  #include <sys/stat.h>
3035                  #include <unistd.h>])
3037         dnl Favour xattr through glibc, but use libattr if we have to
3038         AC_CHECK_FUNC(lsetxattr, ,
3039                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
3040         )
3041         AC_SUBST(XATTR_LIB)
3043         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
3044         AC_CHECK_MEMBERS(
3045                 [struct kinfo_proc.kp_proc],,, 
3046                 [#include <sys/types.h>
3047                  #include <sys/param.h>
3048                  #include <sys/sysctl.h>
3049                  #include <sys/proc.h>
3050                  ])
3052         dnl *********************************
3053         dnl *** Checks for Windows compilation ***
3054         dnl *********************************
3055         AC_CHECK_HEADERS(sys/time.h)
3056         AC_CHECK_HEADERS(sys/param.h)
3057         AC_CHECK_HEADERS(dirent.h)
3059         dnl ******************************************
3060         dnl *** Checks for OSX and iOS compilation ***
3061         dnl ******************************************
3062         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
3064         dnl *********************************
3065         dnl *** Check for Console 2.0 I/O ***
3066         dnl *********************************
3067         AC_CHECK_HEADERS([curses.h])
3068         AC_CHECK_HEADERS([term.h], [], [],
3069         [#if HAVE_CURSES_H
3070          #include <curses.h>
3071          #endif
3072         ])
3073         AC_CHECK_HEADERS([termios.h])
3075         dnl *********************************
3076         dnl *** Checks for random         ***
3077         dnl *********************************
3078         if test x$host_darwin = xno; then
3079                 AC_CHECK_HEADERS(sys/random.h)
3080                 AC_CHECK_FUNCS(getrandom getentropy)
3081         fi
3083         dnl *********************************
3084         dnl *** Checks for Mono.Native    ***
3085         dnl *********************************
3087         # Translated from CMake in external/corefx/src/Native/Unix/configure.cmake, keep in sync!
3088         # Note: check_c_source_compiles in CMake is AC_TRY_LINK in autoconf
3090         AC_MSG_CHECKING(for linux/in.h)
3091         AC_TRY_COMPILE([
3092                 #include <sys/socket.h>
3093                 #include <linux/in.h>
3094         ], [
3095         ],[
3096                 AC_MSG_RESULT(yes)
3097                 AC_DEFINE(HAVE_LINUX_IN_H, 1, [linux/in.h])
3098         ], [
3099                 AC_MSG_RESULT(no)
3100         ])
3102         AC_CHECK_HEADERS([linux/if_packet.h])
3104         AC_MSG_CHECKING(for struct in_pktinfo)
3105         AC_TRY_COMPILE([
3106                 #ifdef HAVE_LINUX_IN_H
3107                 #include <sys/socket.h>
3108                 #include <linux/in.h>
3109                 #else
3110                 #include <netinet/in.h>
3111                 #endif
3112         ], [
3113                 struct in_pktinfo pktinfo;
3114         ],[
3115                 AC_MSG_RESULT(yes)
3116                 AC_DEFINE(HAVE_IN_PKTINFO, 1, [struct in_pktinfo])
3117         ], [
3118                 AC_MSG_RESULT(no)
3119         ])
3121         AC_MSG_CHECKING(for struct ip_mreqn)
3122         AC_TRY_COMPILE([
3123                 #if HAVE_LINUX_IN_H
3124                 #include <sys/socket.h>
3125                 #include <linux/in.h>
3126                 #else
3127                 #include <netinet/in.h>
3128                 #endif
3129         ], [
3130                 struct ip_mreqn mreqn;
3131         ],[
3132                 AC_MSG_RESULT(yes)
3133                 AC_DEFINE(HAVE_IP_MREQN, 1, struct ip_mreqn)
3134         ], [
3135                 AC_MSG_RESULT(no)
3136         ])
3138         if test x$host_darwin = xno; then
3139                 AC_CHECK_TYPES([struct flock64], [AC_DEFINE(HAVE_FLOCK64, 1, struct flock64)], , [#include <fcntl.h>])
3140         fi
3142         AC_CHECK_DECL(O_CLOEXEC,         [AC_DEFINE(HAVE_O_CLOEXEC, 1, [O_CLOEXEC])], [], [[#include <fcntl.h>]])
3143         AC_CHECK_DECL(F_DUPFD_CLOEXEC,   [AC_DEFINE(HAVE_F_DUPFD_CLOEXEC, 1, [F_DUPFD_CLOEXEC])], [], [[#include <fcntl.h>]])
3145         # AC_CHECK_FUNC(getifaddrs,           [AC_DEFINE(HAVE_GETIFADDRS, 1, [getifaddrs])]) # already done above
3147         AC_CHECK_FUNC(lseek64,           [AC_DEFINE(HAVE_LSEEK64, 1, [lseek64])])
3148         AC_CHECK_FUNC(mmap64,            [AC_DEFINE(HAVE_MMAP64, 1, [mmap64])])
3149         AC_CHECK_FUNC(ftruncate64,       [AC_DEFINE(HAVE_FTRUNCATE64, 1, [ftruncate64])])
3150         AC_CHECK_FUNC(posix_fadvise64,   [AC_DEFINE(HAVE_POSIX_FADVISE64, 1, [posix_fadvise64])])
3152         if test "x$mono_native_platform_ios" = "xno"; then
3153                 # On iOS, `stat64()` is deprecated and there is no `struct stat64` and `stat()`
3154                 # is either 32-bit or 64-bit based on the device / simulator that you're running on.
3155                 AC_CHECK_FUNC(stat64,            [AC_DEFINE(HAVE_STAT64, 1, [stat64])])
3156         fi
3158         AC_CHECK_DECL(pipe2,             [AC_DEFINE(HAVE_PIPE2, 1, [pipe2])])
3159         AC_CHECK_FUNC(getmntinfo,        [AC_DEFINE(HAVE_GETMNTINFO, 1, [getmntinfo])], [], [[#include <unistd.h>]])
3160         AC_CHECK_FUNC(strcpy_s,          [AC_DEFINE(HAVE_STRCPY_S, 1, [strcpy_s])])
3161         AC_CHECK_FUNC(strlcpy,           [AC_DEFINE(HAVE_STRLCPY, 1, [strlcpy])])
3162         AC_CHECK_FUNC(posix_fadvise,     [AC_DEFINE(HAVE_POSIX_ADVISE, 1, [posix_fadvise])]) # the define is called HAVE_POSIX_ADVISE in corefx, not a typo
3163         AC_CHECK_FUNC(ioctl,             [AC_DEFINE(HAVE_IOCTL, 1, [ioctl])])
3164         AC_CHECK_FUNC(sched_getaffinity, [AC_DEFINE(HAVE_SCHED_GETAFFINITY, 1, [sched_getaffinity])])
3165         AC_CHECK_FUNC(sched_setaffinity, [AC_DEFINE(HAVE_SCHED_SETAFFINITY, 1, [sched_setaffinity])])
3167         if test "x$platform_android" != "xyes"; then
3168                 AC_CHECK_FUNC(arc4random_buf,    [AC_DEFINE(HAVE_ARC4RANDOM_BUF, 1, [arc4random_buf])])
3169         fi
3171         AC_CHECK_DECL(TIOCGWINSZ,        [AC_DEFINE(HAVE_TIOCGWINSZ, 1, [TIOCGWINSZ])], [], [[#include <sys/ioctl.h>]])
3172         AC_CHECK_FUNC(tcgetattr,         [AC_DEFINE(HAVE_TCGETATTR, 1, [tcgetattr])])
3173         AC_CHECK_FUNC(tcsetattr,         [AC_DEFINE(HAVE_TCSETATTR, 1, [tcsetattr])])
3174         AC_CHECK_DECL(ECHO,              [AC_DEFINE(HAVE_ECHO, 1, [ECHO])], [], [[#include <termios.h>]])
3175         AC_CHECK_DECL(ICANON,            [AC_DEFINE(HAVE_ICANON, 1, [ICANON])], [], [[#include <termios.h>]])
3176         AC_CHECK_DECL(TCSANOW,           [AC_DEFINE(HAVE_TCSANOW, 1, [TCSANOW])], [], [[#include <termios.h>]])
3178         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>]])
3179         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>]])
3180         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>]])
3181         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>]])
3182         AC_CHECK_MEMBER(struct dirent.d_namlen,       [AC_DEFINE(HAVE_DIRENT_NAME_LEN, 1, [struct dirent.d_namlen])], [], [[#include <dirent.h>]])
3183         AC_CHECK_MEMBER(struct statfs.f_fstypename,   [AC_DEFINE(HAVE_STATFS_FSTYPENAME, 1, [struct statfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3184         AC_CHECK_MEMBER(struct statvfs.f_fstypename,  [AC_DEFINE(HAVE_STATVFS_FSTYPENAME, 1, [struct statvfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3186         AC_MSG_CHECKING(for struct statfs)
3187         AC_TRY_COMPILE([
3188                 #if defined(HAVE_STATFS_FSTYPENAME) || defined(HAVE_STATVFS_FSTYPENAME)
3189                 #include <sys/mount.h>
3190                 #else
3191                 #include <sys/statfs.h>
3192                 #endif
3193         ], [
3194                 struct statfs;
3195         ],[
3196                 AC_MSG_RESULT(yes)
3197                 AC_DEFINE(HAVE_STATFS, 1, [struct statfs])
3198         ], [
3199                 AC_MSG_RESULT(no)
3200         ])
3202         if test "x$ac_cv_func_strerror_r_char_p" = "xyes" ; then
3203                 AC_DEFINE(HAVE_GNU_STRERROR_R, 1, [char* strerror(int errnum, char *buf, size_t buflen)])
3204         fi
3206         AC_MSG_CHECKING(for readdir_r)
3207         AC_TRY_LINK([
3208                 #include <dirent.h>
3209         ], [
3210                 DIR* dir;
3211                 struct dirent* entry;
3212                 struct dirent* result;
3213                 readdir_r(dir, entry, &result);
3214         ],[
3215                 AC_MSG_RESULT(yes)
3216                 AC_DEFINE(HAVE_READDIR_R, 1, [readdir_r])
3217         ], [
3218                 AC_MSG_RESULT(no)
3219         ])
3221         AC_MSG_CHECKING(for kevent with void *data)
3222         AC_TRY_LINK([
3223                 #include <sys/types.h>
3224                 #include <sys/event.h>
3225         ], [
3226                 struct kevent event;
3227                 void* data;
3228                 EV_SET(&event, 0, EVFILT_READ, 0, 0, 0, data);
3229         ],[
3230                 AC_MSG_RESULT(yes)
3231                 AC_DEFINE(KEVENT_HAS_VOID_UDATA, 1, [kevent with void *data])
3232         ], [
3233                 AC_MSG_RESULT(no)
3234         ])
3236         AC_CHECK_MEMBER(struct fd_set.fds_bits,   [AC_DEFINE(HAVE_FDS_BITS, 1, [struct fd_set.fds_bits])], [], [[#include <sys/select.h>]])
3237         AC_CHECK_MEMBER(struct fd_set.__fds_bits, [AC_DEFINE(HAVE_PRIVATE_FDS_BITS, 1, [struct fd_set.__fds_bits])], [], [[#include <sys/select.h>]])
3239         AC_MSG_CHECKING(for sendfile with 4 arguments)
3240         AC_TRY_LINK([
3241                 #include <sys/sendfile.h>
3242         ], [
3243                 #if defined(TARGET_ANDROID)
3244                 #if !defined(__ANDROID_API__)
3245                 #error No definition for __ANDROID_API__ even though we're targeting TARGET_ANDROID
3246                 #elif __ANDROID_API__ < 21
3247                 #error sendfile is not supported on this Android API level
3248                 #endif
3249                 #endif
3251                 int result = sendfile(0, 0, 0, 0);
3252         ],[
3253                 AC_MSG_RESULT(yes)
3254                 AC_DEFINE(HAVE_SENDFILE_4, 1, [sendfile with 4 arguments])
3255         ], [
3256                 AC_MSG_RESULT(no)
3257         ])
3259         ORIG_CFLAGS="$CFLAGS"
3260         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
3262         AC_MSG_CHECKING(for sendfile with 6 arguments)
3263         AC_TRY_LINK([
3264                 #include <stdlib.h>
3265                 #include <sys/types.h>
3266                 #include <sys/socket.h>
3267                 #include <sys/uio.h>
3268         ], [
3269                 int result = sendfile(0, 0, 0, NULL, NULL, 0);
3270         ],[
3271                 AC_MSG_RESULT(yes)
3272                 AC_DEFINE(HAVE_SENDFILE_6, 1, [sendfile with 6 arguments])
3273         ], [
3274                 AC_MSG_RESULT(no)
3275         ])
3277         CFLAGS="$ORIG_CFLAGS"
3279         AC_CHECK_FUNC(fcopyfile,     [AC_DEFINE(HAVE_FCOPYFILE, 1, [fcopyfile])])
3280         AC_CHECK_FUNC(epoll_create1, [AC_DEFINE(HAVE_EPOLL, 1, [epoll_create1])])
3281         AC_CHECK_FUNC(accept4,       [AC_DEFINE(HAVE_ACCEPT4, 1, [accept4])])
3282         AC_CHECK_FUNC(kqueue,        [AC_DEFINE(HAVE_KQUEUE, 1, [kqueue])])
3284         ORIG_CFLAGS="$CFLAGS"
3285         CFLAGS="$CFLAGS -Werror=sign-conversion"
3287         AC_MSG_CHECKING(for getnameinfo with signed flags)
3288         AC_TRY_LINK([
3289                 #include <sys/types.h>
3290                 #include <netdb.h>
3291         ], [
3292                 const struct sockaddr *addr;
3293                 socklen_t addrlen;
3294                 char *host;
3295                 socklen_t hostlen;
3296                 char *serv;
3297                 socklen_t servlen;
3298                 int flags;
3299                 int result = getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags);
3300         ],[
3301                 AC_MSG_RESULT(yes)
3302                 AC_DEFINE(HAVE_GETNAMEINFO_SIGNED_FLAGS, 1, [getnameinfo with signed flags])
3303         ], [
3304                 AC_MSG_RESULT(no)
3305         ])
3307         CFLAGS="$ORIG_CFLAGS"
3309         if test "x$host_linux" = "xyes"; then
3310                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 1, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3311         else
3312                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 0, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3313         fi
3315         # HAVE_CLOCK_MONOTONIC check already done above
3316         # HAVE_CLOCK_REALTIME check already done above
3317         # HAVE_MACH_ABSOLUTE_TIME check already done above
3318         # HAVE_MACH_TIMEBASE_INFO check already done above
3319         # HAVE_FUTIMES check already done above
3320         # HAVE_FUTIMENS check already done above
3322         ORIG_CFLAGS="$CFLAGS"
3323         CFLAGS="$CFLAGS -Werror=sign-conversion"
3325         AC_MSG_CHECKING(for bind with unsigned addrlen)
3326         AC_TRY_LINK([
3327                 #include <sys/socket.h>
3328         ], [
3329                 int fd;
3330                 struct sockaddr* addr;
3331                 socklen_t addrLen;
3332                 bind(fd, addr, addrLen);
3333         ],[
3334                 AC_MSG_RESULT(yes)
3335                 AC_DEFINE(BIND_ADDRLEN_UNSIGNED, 1, [bind with unsigned addrlen])
3336         ], [
3337                 AC_MSG_RESULT(no)
3338         ])
3340         AC_MSG_CHECKING(for struct ipv6_mreq with unsigned ipv6mr_interface)
3341         AC_TRY_LINK([
3342                 #include <netinet/in.h>
3343                 #include <netinet/tcp.h>
3344         ], [
3345                 struct ipv6_mreq opt;
3346                 unsigned int index = 0;
3347                 opt.ipv6mr_interface = index;
3348         ],[
3349                 AC_MSG_RESULT(yes)
3350                 AC_DEFINE(IPV6MR_INTERFACE_UNSIGNED, 1, [struct ipv6_mreq with unsigned ipv6mr_interface])
3351         ], [
3352                 AC_MSG_RESULT(no)
3353         ])
3355         AC_MSG_CHECKING(for inotify_rm_watch with unsigned wd)
3356         AC_TRY_LINK([
3357                 #include <sys/inotify.h>
3358         ], [
3359                 intptr_t fd;
3360                 uint32_t wd;
3361                 int result = inotify_rm_watch(fd, wd);
3362         ],[
3363                 AC_MSG_RESULT(yes)
3364                 AC_DEFINE(INOTIFY_RM_WATCH_WD_UNSIGNED, 1, [inotify_rm_watch with unsigned wd])
3365         ], [
3366                 AC_MSG_RESULT(no)
3367         ])
3369         CFLAGS="$ORIG_CFLAGS"
3371         AC_MSG_CHECKING(for shm_open that works well enough with mmap)
3372         if test "x$ac_cv_func_shm_open" = "xno" -o "x$ac_cv_func_shm_open_working_with_mmap" = "xno" ; then
3373                 AC_MSG_RESULT(no)
3374         elif test "x$cross_compiling" = "xyes"; then
3375                 AC_MSG_RESULT(cross compiling, assuming yes)
3376                 AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3377         else
3378                 AC_TRY_RUN([
3379                         #include <sys/mman.h>
3380                         #include <fcntl.h>
3381                         #include <unistd.h>
3383                         int main ()
3384                         {
3385                                 int fd = shm_open("/mono_configure_shm_open", O_CREAT | O_RDWR, 0777);
3386                                 if (fd == -1)
3387                                         return -1;
3389                                 shm_unlink("/mono_configure_shm_open");
3391                                 // NOTE: PROT_EXEC and MAP_PRIVATE don't work well with shm_open
3392                                 //       on at least the current version of Mac OS X
3394                                 if (mmap(NULL, 1, PROT_EXEC, MAP_PRIVATE, fd, 0) == MAP_FAILED)
3395                                         return -1;
3397                                 return 0;
3398                         }
3399                 ],[
3400                         AC_MSG_RESULT(yes)
3401                         AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3402                 ], [
3403                         AC_MSG_RESULT(no)
3404                 ])
3405         fi
3407         AC_MSG_CHECKING(for getpriority with int who)
3408         AC_TRY_LINK([
3409                 #include <sys/resource.h>
3410         ], [
3411                 int which;
3412                 int who;
3413                 int result = getpriority(which, who);
3414         ],[
3415                 AC_MSG_RESULT(yes)
3416                 AC_DEFINE(PRIORITY_REQUIRES_INT_WHO, 1, [getpriority with int who])
3417         ], [
3418                 AC_MSG_RESULT(no)
3419         ])
3421         AC_MSG_CHECKING(for kevent with int parameters)
3422         AC_TRY_LINK([
3423                 #include <sys/types.h>
3424                 #include <sys/event.h>
3425         ], [
3426                 int kg;
3427                 const struct kevent* chagelist;
3428                 int nchanges;
3429                 struct kevent* eventlist;
3430                 int nevents;
3431                 const struct timespec* timeout;
3432                 int result = kevent(kg, chagelist, nchanges, eventlist, nevents, timeout);
3433         ],[
3434                 AC_MSG_RESULT(yes)
3435                 AC_DEFINE(KEVENT_REQUIRES_INT_PARAMS, 1, [kevent with int parameters])
3436         ], [
3437                 AC_MSG_RESULT(no)
3438         ])
3440         AC_CHECK_FUNCS(mkstemps)
3441         # AC_CHECK_FUNCS(mkstemp) # already done above
3443         if test "x$ac_cv_func_mkstemps" != "xyes" -a "x$ac_cv_func_mkstemp" != "xyes"; then
3444                 AC_MSG_ERROR([Cannot find mkstemps or mkstemp on this platform])
3445         fi
3447         AC_MSG_CHECKING(for tcp/var.h)
3448         AC_TRY_LINK([
3449                 #include <sys/types.h>
3450                 #include <sys/socketvar.h>
3451                 #include <netinet/ip.h>
3452                 #include <netinet/tcp.h>
3453                 #include <netinet/tcp_var.h>
3454         ], [
3455         ],[
3456                 AC_MSG_RESULT(yes)
3457                 AC_DEFINE(HAVE_TCP_VAR_H, 1, [tcp/var.h])
3458         ], [
3459                 AC_MSG_RESULT(no)
3460         ])
3462         AC_CHECK_HEADERS([sys/cdefs.h])
3464         AC_MSG_CHECKING(for TCPSTATE enum in netinet/tcp.h)
3465         AC_TRY_LINK([
3466                 #ifdef HAVE_SYS_CDEFS_H
3467                 #include <sys/cdefs.h>
3468                 #endif
3469                 #include <netinet/tcp.h>
3470         ], [
3471                 int result = TCP_ESTABLISHED;
3472         ],[
3473                 AC_MSG_RESULT(yes)
3474                 AC_DEFINE(HAVE_TCP_H_TCPSTATE_ENUM, 1, [TCPSTATE enum in netinet/tcp.h])
3475         ], [
3476                 AC_MSG_RESULT(no)
3477         ])
3479         AC_CHECK_DECL(TCPS_ESTABLISHED, [AC_DEFINE(HAVE_TCP_FSM_H, 1, [HAVE_TCP_FSM_H])], [], [[#include <netinet/tcp_fsm.h>]])
3481         AC_MSG_CHECKING(for struct rt_msghdr)
3482         AC_TRY_COMPILE([
3483                 #include <sys/types.h>
3484                 #include <net/route.h>
3485         ], [
3486                 struct rt_msghdr;
3487         ],[
3488                 AC_MSG_RESULT(yes)
3489                 AC_DEFINE(HAVE_RT_MSGHDR, 1, [struct rt_msghdr])
3490         ], [
3491                 AC_MSG_RESULT(no)
3492         ])
3494         AC_CHECK_HEADERS([sys/sysctl.h])
3495         AC_CHECK_HEADERS([linux/rtnetlink.h])
3497         AC_CHECK_FUNC(getpeereid,    [AC_DEFINE(HAVE_GETPEEREID, 1, [getpeereid])])
3498         #AC_CHECK_FUNC(getdomainname, [AC_DEFINE(HAVE_GETDOMAINNAME, 1, [getdomainname])]) # already done above
3499         AC_CHECK_FUNC(uname,         [AC_DEFINE(HAVE_UNAME, 1, [uname])])
3501         ORIG_CFLAGS="$CFLAGS"
3502         CFLAGS="$CFLAGS -Werror=shorten-64-to-32"
3504         AC_MSG_CHECKING(for getdomainname with size_t namelen)
3505         AC_TRY_LINK([
3506                 #include <unistd.h>
3507         ], [
3508                 size_t namelen = 20;
3509                 char name[20];
3510                 int result = getdomainname(name, namelen);
3511         ],[
3512                 AC_MSG_RESULT(yes)
3513                 AC_DEFINE(HAVE_GETDOMAINNAME_SIZET, 1, [getdomainname with size_t namelen])
3514         ], [
3515                 AC_MSG_RESULT(no)
3516         ])
3518         CFLAGS="$ORIG_CFLAGS"
3520         AC_CHECK_FUNC(inotify_init, [AC_DEFINE(HAVE_INOTIFY_INIT, 1, [inotify_init])])
3521         AC_CHECK_FUNC(inotify_add_watch, [AC_DEFINE(HAVE_INOTIFY_ADD_WATCH, 1, [inotify_add_watch])])
3522         AC_CHECK_FUNC(inotify_rm_watch, [AC_DEFINE(HAVE_INOTIFY_RM_WATCH, 1, [inotify_rm_watch])])
3524         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
3525                 AC_DEFINE(HAVE_INOTIFY, 1, [HAVE_INOTIFY])
3526         elif test "x$host_linux" = "xyes"; then
3527                 AC_MSG_ERROR([Cannot find inotify functions on a Linux platform.])
3528         fi
3530         # HAVE_CURLM_ADDED_ALREADY check skipped because we don't use libcurl in mono
3531         # HAVE_CURL_HTTP_VERSION_2TLS check skipped because we don't use libcurl in mono
3532         # HAVE_CURLPIPE_MULTIPLEX check skipped because we don't use libcurl in mono
3533         # HAVE_CURL_SSLVERSION_TLSv1_012 check skipped because we don't use libcurl in mono
3535         enable_gss=no;
3536         AC_MSG_CHECKING(for GSS/GSS.h)
3537         AC_TRY_COMPILE([
3538                         #include <GSS/GSS.h>
3539         ], [
3540         ],[
3541                         AC_MSG_RESULT(yes)
3542                         AC_DEFINE(HAVE_GSSFW_HEADERS, 1, [GSS/GSS.h])
3543                         AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
3544                         enable_gss=yes
3545         ], [
3546                         AC_MSG_RESULT(no)
3547         ])
3549         AC_MSG_CHECKING(for gssapi/gssapi_ext.h)
3550         AC_TRY_COMPILE([
3551                         #include <gssapi/gssapi_ext.h>
3552         ], [
3553         ],[
3554                         AC_MSG_RESULT(yes)
3555                         enable_gss=yes
3556         ], [
3557                         AC_MSG_RESULT(no)
3558         ])
3560         AC_MSG_CHECKING(for GSS_SPNEGO_MECHANISM)
3561         AC_TRY_COMPILE([
3562                         #include <gssapi/gssapi_ext.h>
3563                         #include <gssapi/gssapi_krb5.h>
3564                         gss_OID_set_desc gss_mech_spnego_OID_set_desc = {.count = 1, .elements = GSS_SPNEGO_MECHANISM};
3565         ], [
3566         ],[
3567                         AC_MSG_RESULT(yes)
3568                         AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
3569         ], [
3570                         AC_MSG_RESULT(no)
3571         ])
3573         AM_CONDITIONAL(ENABLE_GSS, test x$enable_gss = xyes)
3575         AC_CHECK_HEADERS([crt_externs.h])
3577         AC_MSG_CHECKING(for _NSGetEnviron)
3578         AC_TRY_LINK([
3579                 #include <crt_externs.h>
3580         ], [
3581                 char **result = *(_NSGetEnviron());
3582         ],[
3583                 AC_MSG_RESULT(yes)
3584                 AC_DEFINE(HAVE_NSGETENVIRON, 1, [_NSGetEnviron])
3585         ], [
3586                 AC_MSG_RESULT(no)
3587         ])
3589         AC_CHECK_DECL(IN_EXCL_UNLINK, [AC_DEFINE(HAVE_IN_EXCL_UNLINK, 1, [IN_EXCL_UNLINK])], [], [[#include <sys/inotify.h>]])
3591         # *** End of Mono.Native checks ***
3592 else
3593         AM_CONDITIONAL(ENABLE_GSS, false)
3595         dnl *********************************
3596         dnl *** Checks for Windows compilation ***
3597         dnl *********************************
3598         AC_CHECK_HEADERS(winternl.h)
3600         jdk_headers_found=no
3601         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
3602         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
3603         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
3604         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
3605         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
3606         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
3607         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
3609         dnl *********************************
3610         dnl *** Check for struct ip_mreqn ***
3611         dnl *********************************
3612         AC_MSG_CHECKING(for struct ip_mreqn)
3613         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3614                 struct ip_mreqn mreq;
3615                 mreq.imr_address.s_addr = 0;
3616         ], [
3617                 # Yes, we have it...
3618                 AC_MSG_RESULT(yes)
3619                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
3620         ], [
3621                 # We'll just have to try and use struct ip_mreq
3622                 AC_MSG_RESULT(no)
3623                 AC_MSG_CHECKING(for struct ip_mreq)
3624                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3625                         struct ip_mreq mreq;
3626                         mreq.imr_interface.s_addr = 0;
3627                 ], [
3628                         # Yes, we have it...
3629                         AC_MSG_RESULT(yes)
3630                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
3631                 ], [
3632                         # No multicast support
3633                         AC_MSG_RESULT(no)
3634                 ])
3635         ])
3637         dnl **********************************
3638         dnl *** Check for getaddrinfo ***
3639         dnl **********************************
3640         AC_MSG_CHECKING(for getaddrinfo)
3641                 AC_TRY_LINK([
3642                 #include <stdio.h>
3643                 #include <winsock2.h>
3644                 #include <ws2tcpip.h>
3645         ], [
3646                 getaddrinfo(NULL,NULL,NULL,NULL);
3647         ], [
3648                 # Yes, we have it...
3649                 AC_MSG_RESULT(yes)
3650                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
3651         ], [
3652                 AC_MSG_RESULT(no)
3653         ])
3655         dnl **********************************
3656         dnl *** Check for gethostbyname ***
3657         dnl **********************************
3658         AC_MSG_CHECKING(for gethostbyname)
3659                 AC_TRY_LINK([
3660                 #include <stdio.h>
3661                 #include <winsock2.h>
3662                 #include <ws2tcpip.h>
3663         ], [
3664                 gethostbyname(NULL);
3665         ], [
3666                 # Yes, we have it...
3667                 AC_MSG_RESULT(yes)
3668                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
3669         ], [
3670                 AC_MSG_RESULT(no)
3671         ])
3673         dnl **********************************
3674         dnl *** Check for getprotobyname ***
3675         dnl **********************************
3676         AC_MSG_CHECKING(for getprotobyname)
3677                 AC_TRY_LINK([
3678                 #include <stdio.h>
3679                 #include <winsock2.h>
3680                 #include <ws2tcpip.h>
3681         ], [
3682                 getprotobyname(NULL);
3683         ], [
3684                 # Yes, we have it...
3685                 AC_MSG_RESULT(yes)
3686                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
3687         ], [
3688                 AC_MSG_RESULT(no)
3689         ])
3691         dnl **********************************
3692         dnl *** Check for getnameinfo ***
3693         dnl **********************************
3694         AC_MSG_CHECKING(for getnameinfo)
3695                 AC_TRY_LINK([
3696                 #include <stdio.h>
3697                 #include <winsock2.h>
3698                 #include <ws2tcpip.h>
3699         ], [
3700                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
3701         ], [
3702                 # Yes, we have it...
3703                 AC_MSG_RESULT(yes)
3704                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
3705         ], [
3706                 AC_MSG_RESULT(no)
3707         ])
3709         dnl **********************************
3710         dnl *** Check for inet_ntop ***
3711         dnl **********************************
3712         AC_MSG_CHECKING(for inet_ntop)
3713                 AC_TRY_LINK([
3714                 #include <stdio.h>
3715                 #include <winsock2.h>
3716                 #include <ws2tcpip.h>
3717         ], [
3718                 inet_ntop (0, NULL, NULL, 0);
3719         ], [
3720                 # Yes, we have it...
3721                 AC_MSG_RESULT(yes)
3722                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
3723         ], [
3724                 AC_MSG_RESULT(no)
3725         ])
3727         dnl **********************************
3728         dnl *** Check for inet_pton ***
3729         dnl **********************************
3730         AC_MSG_CHECKING(for inet_pton)
3731                 AC_TRY_LINK([
3732                 #include <stdio.h>
3733                 #include <winsock2.h>
3734                 #include <ws2tcpip.h>
3735         ], [
3736                 #ifndef inet_pton
3737                 (void) inet_pton;
3738                 #endif
3739                 inet_pton (0, NULL, NULL);
3740         ], [
3741                 # Yes, we have it...
3742                 AC_MSG_RESULT(yes)
3743                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
3744         ], [
3745                 AC_MSG_RESULT(no)
3746         ])
3748         AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
3749         AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
3750         AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
3751         AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
3752         AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
3753         AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
3754         AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
3757 dnl socklen_t check
3758 AC_MSG_CHECKING(for socklen_t)
3759 AC_TRY_COMPILE([
3760 #include <sys/types.h>
3761 #include <sys/socket.h>
3763   socklen_t foo;
3765 ac_cv_c_socklen_t=yes
3766         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
3767         AC_MSG_RESULT(yes)
3769         AC_MSG_RESULT(no)
3772 AC_CHECK_FUNCS(execvp)
3774 dnl ****************************
3775 dnl *** Look for /dev/random ***
3776 dnl ****************************
3778 AC_MSG_CHECKING([if usage of random device is requested])
3779 AC_ARG_ENABLE(dev-random,
3780 [  --disable-dev-random    disable the use of the random device (enabled by default)],
3781 try_dev_random=$enableval, try_dev_random=yes)
3783 AC_MSG_RESULT($try_dev_random)
3785 case "{$build}" in
3787 dnl IBM i does not have /dev/random, use unblocking only
3789     *-*-os400*)
3790     NAME_DEV_RANDOM="/dev/urandom"
3791     ;;
3793 dnl Win32 does not have /dev/random, they have their own method...
3795     *-mingw*|*-*-cygwin*)
3796     ac_cv_have_dev_random=no
3797     ;;
3799 dnl Everywhere else, it's /dev/random
3801     *)
3802     NAME_DEV_RANDOM="/dev/random"
3803     ;;
3804 esac
3806 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
3808 dnl Now check if the device actually exists
3810 if test "x$try_dev_random" = "xyes"; then
3811     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
3812     [if test -r "$NAME_DEV_RANDOM" ; then
3813         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
3814     if test "x$ac_cv_have_dev_random" = "xyes"; then
3815         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
3816     fi
3817 else
3818     AC_MSG_CHECKING(for random device)
3819     ac_cv_have_dev_random=no
3820     AC_MSG_RESULT(has been disabled)
3823 if test "x$host_win32" = "xyes"; then
3824     AC_DEFINE(HAVE_CRYPT_RNG)
3827 if test "x$ac_cv_have_dev_random" = "xno" \
3828     && test "x$host_win32" = "xno"; then
3829     AC_MSG_WARN([[
3831 *** A system-provided entropy source was not found on this system.
3832 *** Because of this, the System.Security.Cryptography random number generator
3833 *** will throw a NotImplemented exception.
3835 *** If you are seeing this message, and you know your system DOES have an
3836 *** entropy collection in place, please report an issue on GitHub and
3837 *** provide information about the system and how to access the random device.
3839 *** Otherwise you can install either egd or prngd and set the environment
3840 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
3841 ***]])
3844 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)
3846 AC_MSG_CHECKING([if big-arrays are to be enabled])
3847 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)
3848 if test "x$enable_big_arrays" = "xyes" ; then
3849     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
3850         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
3851     else
3852         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
3853     fi
3855 AC_MSG_RESULT($enable_big_arrays)
3857 dnl **************
3858 dnl *** DTRACE ***
3859 dnl **************
3861 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
3863 if test "x$enable_dtrace" = "xyes"; then
3864    if test "x$has_dtrace" = "xno"; then
3865           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
3866    fi
3867    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
3868    if test "x$DTRACE" = "xno"; then
3869           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
3870           enable_dtrace=no
3871    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
3872           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
3873           enable_dtrace=no
3874    fi
3877 dtrace_g=no
3878 if test "x$enable_dtrace" = "xyes"; then
3879         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
3880         DTRACEFLAGS=
3881         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3882                 case "$host" in
3883                         powerpc-*-darwin*)
3884                         DTRACEFLAGS="-arch ppc64"
3885                         ;;
3886                         i*86-*-darwin*)
3887                         DTRACEFLAGS="-arch x86_64"
3888                         ;;
3889                         *)
3890                         DTRACEFLAGS=-64
3891                         ;;
3892                 esac
3893         else
3894                 case "$host" in
3895                         powerpc-*-darwin*)
3896                         DTRACEFLAGS="-arch ppc"
3897                         ;;
3898                         i*86-*-darwin*)
3899                         DTRACEFLAGS="-arch i386"
3900                         ;;
3901                         *)
3902                         DTRACEFLAGS=-32
3903                         ;;
3904                 esac
3905         fi
3906         AC_SUBST(DTRACEFLAGS)
3907         case "$host" in
3908                 *-*-solaris*)
3909                 dtrace_g=yes
3910                 ;;
3911         esac
3912         AC_CHECK_HEADERS([sys/sdt.h])
3914 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
3915 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
3917 dnl **************************
3918 dnl *** AOT cross offsets  ***
3919 dnl **************************
3921 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
3922     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
3924 dnl **************
3925 dnl ***  LLVM  ***
3926 dnl **************
3928 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
3929 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
3930 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)
3931 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
3932 AC_ARG_ENABLE(llvm-asserts,[  --enable-llvm-asserts Enable llvm asserts (option to LLVM in CMake)], enable_llvm_asserts=$enableval, enable_llvm_asserts=no)
3934 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
3936 if test "x$enable_llvm" = "xdefault"; then
3937    enable_llvm=$enable_llvm_default
3940 enable_llvm_msvc_only="no"
3941 if test "x$enable_llvm" = "xyes"; then
3942         if test "x$host_win32" = "xyes"; then
3943                 if test "x$cross_compiling" = "xno"; then
3944                         case "$target" in
3945                         x86_64*)
3946                                 AC_MSG_WARN("LLVM for host=Windows and target=Windows is only supported on x64 MSVC builds. Disabling LLVM for GCC build.")
3947                                 enable_llvm_msvc_only="yes"
3948                                 ;;
3949                         i686*)
3950                                 AC_MSG_ERROR("LLVM for host=Windows and target=Windows is only supported for x64 builds.")
3951                                 ;;
3952                         esac
3953                 fi
3954                 if test "x$enable_loadedllvm" = "xyes"; then
3955                         AC_MSG_WARN("Loadable LLVM currently not supported on Windows. Disabling feature.")
3956                         enable_loadedllvm=no
3957                 fi
3958         fi
3961 internal_llvm="no"
3962 if test "x$enable_llvm" = "xyes"; then
3963         if test "x$with_llvm" != "x"; then
3964                 EXTERNAL_LLVM_CONFIG=$with_llvm/bin/llvm-config
3965                 if test x$host_win32 = xyes; then
3966                         EXTERNAL_LLVM_CONFIG=$EXTERNAL_LLVM_CONFIG.exe
3967                 fi
3968                 if test ! -x $EXTERNAL_LLVM_CONFIG; then
3969                         AC_MSG_ERROR([LLVM executable $EXTERNAL_LLVM_CONFIG not found.])
3970                 fi
3971         else
3972                 if test x$host_win32 = xyes; then
3973                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config.exe, no)
3974                 else
3975                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config, no)
3976                 fi
3977                 if test "x$EXTERNAL_LLVM_CONFIG" = "xno"; then
3978                         internal_llvm=yes
3979                 fi
3980         fi
3982         LLVM_CODEGEN_LIBS="x86codegen"
3983         case "$target" in
3984         arm*)
3985                 LLVM_CODEGEN_LIBS="armcodegen"
3986                 ;;
3987         aarch64*)
3988                 LLVM_CODEGEN_LIBS="aarch64codegen"
3989                 ;;
3990         powerpc*)
3991                 LLVM_CODEGEN_LIBS="powerpccodegen"
3992                 ;;
3993         esac
3994         if test "x$host" != "x$target"; then
3995                 # No need for jit libs
3996                 LLVM_CODEGEN_LIBS=
3997         fi
3999         AC_SUBST(LLVM_CODEGEN_LIBS)
4000         AC_SUBST(EXTERNAL_LLVM_CONFIG)
4002         if test "x$host_win32" = "xyes" && test "x$cross_compiling" = "xno" &&  test "x$internal_llvm" = "xno"; then
4003                 EXTERNAL_LLVM_CONFIG_WIN32=$(cygpath -m $EXTERNAL_LLVM_CONFIG)
4004                 AC_SUBST(EXTERNAL_LLVM_CONFIG_WIN32)
4005         fi
4006         if test "x$enable_llvm_msvc_only" != "xyes"; then
4007                 AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
4008         else
4009                 AC_DEFINE(ENABLE_LLVM_MSVC_ONLY, 1, [Enable the LLVM back end])
4010         fi
4011 fi # ENABLE_LLVM
4013 # AC_DEFINE necessary for correct restore behavior on Linux
4014 AM_CONDITIONAL(INTERNAL_LLVM, [test "x$internal_llvm" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
4015 if test "x$internal_llvm" != "xno"; then
4016         if test "x$enable_llvm_msvc_only" != "xyes"; then
4017                 AC_DEFINE(INTERNAL_LLVM, 1, [LLVM used is being build during mono build])
4018         else
4019                 AC_DEFINE(INTERNAL_LLVM_MSVC_ONLY, 1, [LLVM used is being build during mono build])
4020         fi
4023 AM_CONDITIONAL(INTERNAL_LLVM_ASSERTS, [test "x$enable_llvm_asserts" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
4024 if test "x$enable_llvm_asserts" != "xno"; then
4025         if test "x$enable_llvm_msvc_only" != "xyes"; then
4026                 AC_DEFINE(INTERNAL_LLVM_ASSERTS, 1, [Build LLVM with assertions])
4027         else
4028                 AC_DEFINE(INTERNAL_LLVM_ASSERTS_MSVC_ONLY, 1, [Build LLVM with assertions])
4029         fi
4032 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes && test x$enable_llvm_msvc_only != xyes])
4034 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes && test x$enable_llvm_msvc_only != xyes])
4035 if test "x$enable_loadedllvm" = "xyes"; then
4036         if test "x$enable_llvm_msvc_only" != "xyes"; then
4037                 AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
4038         fi
4041 if test "x$enable_llvm" = "xyes"; then
4042         enable_llvm_runtime=yes
4045 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes && test x$enable_llvm_msvc_only != xyes])
4046 if test "x$enable_llvm_runtime" = "xyes"; then
4047         if test "x$enable_llvm_msvc_only" != "xyes"; then
4048                 AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
4049         else
4050                 AC_DEFINE(ENABLE_LLVM_RUNTIME_MSVC_ONLY, 1, [Runtime support code for llvm enabled])
4051         fi
4054 TARGET="unknown"
4055 ACCESS_UNALIGNED="yes"
4057 LIBC="libc.so.6"
4058 INTL="libc.so.6"
4059 SQLITE="libsqlite.so.0"
4060 SQLITE3="libsqlite3.so.0"
4061 X11="libX11.so"
4062 GDKX11="libgdk-x11-2.0.so.0"
4063 GTKX11="libgtk-x11-2.0.so.0"
4064 XINERAMA="libXinerama.so.1"
4066 sizeof_register="SIZEOF_VOID_P"
4068 jit_wanted=true
4069 boehm_supported=true
4070 BTLS_SUPPORTED=no
4071 BTLS_PLATFORM=
4073 case "$host" in
4074         wasm32*)
4075                 TARGET=WASM
4076                 arch_target=wasm
4077                 BTLS_SUPPORTED=no
4078                 ACCESS_UNALIGNED="no"
4079                 with_tls=pthread
4080                 target_wasm=yes
4081                 ;;
4082         mips*)
4083                 TARGET=MIPS;
4084                 arch_target=mips;
4085                 with_tls=pthread;
4086                 ACCESS_UNALIGNED="no"
4088                 AC_MSG_CHECKING(for mips n32)
4089                 AC_TRY_COMPILE([],[
4090                 #if _MIPS_SIM != _ABIN32
4091                 #error Not mips n32
4092                 #endif
4093                 ],[
4094                 AC_MSG_RESULT(yes)
4095                 sizeof_register=8
4096                 ],[
4097                 AC_MSG_RESULT(no)
4098                 ])
4099                 ;;
4100         i*86-*-*)
4101                 TARGET=X86;
4102                 arch_target=x86;
4103                 case $host_os in
4104                   solaris*)
4105                         LIBC="libc.so"
4106                         INTL="libintl.so"
4107                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
4108                                 TARGET=AMD64
4109                                 arch_target=amd64
4110                         fi
4112                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
4113                         # int astruct __attribute__ ((visibility ("hidden")));
4114                         # void foo ()
4115                         # {
4116                         #       void *p = &astruct;
4117                         # }
4118                         # gcc -fPIC --shared -o libfoo.so foo.c
4119                         # yields:
4120                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
4121                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
4122                         have_visibility_hidden=no
4123                         ;;
4124                   mingw*|cygwin*)
4125                         have_visibility_hidden=no
4126                         BTLS_SUPPORTED=no
4127                         BTLS_PLATFORM=i386
4128                         ;;
4129                   haiku*)
4130                         LIBC=libroot.so
4131                         ;;
4132                   linux*)
4133                         AOT_SUPPORTED="yes"
4134                         BTLS_SUPPORTED=yes
4135                         BTLS_PLATFORM=i386
4136                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4137                         ;;
4138                   darwin*)
4139                         AOT_SUPPORTED="yes"
4140                         BTLS_SUPPORTED=yes
4141                         BTLS_PLATFORM=i386
4142                         ;;
4143                   openbsd*|freebsd*|kfreebsd-gnu*)
4144                         AOT_SUPPORTED="yes"
4145                         BTLS_SUPPORTED=yes
4146                         BTLS_PLATFORM=i386
4147                         ;;
4148                 esac
4149                 ;;
4150         x86_64-*-* | amd64-*-*)
4151                 TARGET=AMD64;
4152                 arch_target=amd64;
4153                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
4154                         AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4155                         sizeof_register=8
4156                 fi
4157                 case $host_os in
4158                   linux*)
4159                         AOT_SUPPORTED="yes"
4160                         BTLS_SUPPORTED=yes
4161                         BTLS_PLATFORM=x86_64
4162                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4163                         ;;
4164                   darwin*)
4165                         AOT_SUPPORTED="yes"
4166                         BTLS_SUPPORTED=yes
4167                         BTLS_PLATFORM=x86_64
4168                         boehm_supported=false
4169                         ;;
4170                   openbsd*|freebsd*|kfreebsd-gnu*)
4171                         AOT_SUPPORTED="yes"
4172                         BTLS_SUPPORTED=yes
4173                         BTLS_PLATFORM=x86_64
4174                         ;;
4175                   mingw*|cygwin*)
4176                         BTLS_SUPPORTED=no
4177                         BTLS_PLATFORM=x86_64
4178                         ;;
4179                 esac
4180                 ;;
4181         sparc*-*-*)
4182                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4183                    TARGET=SPARC64
4184                 else
4185                         TARGET=SPARC
4186                 fi
4187                 arch_target=sparc;
4188                 ACCESS_UNALIGNED="no"
4189                 case $host_os in
4190                   linux*) ;;
4191                   *)
4192                         LIBC="libc.so"
4193                         INTL="libintl.so"
4194                 esac
4195                 if test x"$GCC" = xyes; then
4196                         # We don't support v8 cpus
4197                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
4198                 fi
4199                 if test x"$AR" = xfalse; then
4200                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
4201                 fi
4202                 ;;
4203         *-mingw*|*-*-cygwin*)
4204                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
4205                 have_visibility_hidden=no
4206                 INTL="intl"
4207                 case "$host" in
4208                         x86_64*mingw*)
4209                                 # Old Boehm fails to compile for x86_64-mingw.
4210                                 # It is trivial to fix, but just silently drop it.
4211                                 boehm_supported=false
4212                                 ;;
4213                 esac
4214                 ;;
4215         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
4216         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
4217         powerpc-*-freebsd* | powerpc*-*-aix* | powerpc*-*-os400* )
4218                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4219                         TARGET=POWERPC64;
4220                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
4221                         if ! (echo $CC | grep -q -- 'clang'); then
4222                                 CFLAGS="$CFLAGS -mminimal-toc"
4223                         fi
4224                 else
4225                         TARGET=POWERPC;
4226                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
4227                 fi
4228                 arch_target=ppc;
4229                 case $host_os in
4230                   aix*|os400*)
4231                         BTLS_SUPPORTED=yes
4232                         BTLS_PLATFORM=powerpc
4233                         dnl on AIX/PASE, shared libraries can be inside archives
4234                         dnl if they are, we specify them by lib.a(lib.so)
4235                         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX, so
4236                         LIBC="libc.a(shr_64.o)"
4237                         INTL="libintl.a(libintl.so.8)"
4238                         ;;
4239                   linux*)
4240                         BTLS_SUPPORTED=yes
4241                         BTLS_PLATFORM=powerpc
4242                         ;;
4243                 esac
4244                 ;;
4245         armv7k-*-darwin*)
4246                 TARGET=ARM;
4247                 TARGET_SYS=WATCHOS
4248                 arch_target=arm;
4249                 arm_fpu=VFP_HARD
4250                 ACCESS_UNALIGNED="no"
4251                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4252                 ;;
4254         arm*-darwin*)
4255                 TARGET=ARM;
4256                 arch_target=arm;
4257                 ACCESS_UNALIGNED="no"
4258                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4259                 ;;
4260         arm*-linux*)
4261                 TARGET=ARM;
4262                 arch_target=arm;
4263                 ACCESS_UNALIGNED="no"
4264                 AOT_SUPPORTED="yes"
4265                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4266                 BTLS_SUPPORTED=yes
4267                 BTLS_PLATFORM=arm
4268                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4269                 case "$target" in
4270                 arm*-linux*-gnueabi)
4271                         BTLS_PLATFORM=armsoft
4272                         ;;
4273                 esac
4274                 ;;
4275         arm*-netbsd*-eabi*)
4276                 TARGET=ARM;
4277                 arch_target=arm;
4278                 ACCESS_UNALIGNED="no"
4279                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4280                 ;;
4281         aarch64-*darwin*ilp32)
4282                 TARGET=ARM6432
4283                 arch_target=arm64
4284                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4285                 sizeof_register=8
4286                 # assuming no other target other than watchOS is using aarch64*darwin triple
4287                 TARGET_SYS=WATCHOS
4288                 ;;
4289         aarch64-*)
4290                 # https://lkml.org/lkml/2012/7/15/133
4291                 TARGET=ARM64
4292                 arch_target=arm64
4293                 boehm_supported=false
4294                 AOT_SUPPORTED="yes"
4295                 BTLS_SUPPORTED=yes
4296                 BTLS_PLATFORM=aarch64
4297                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4298                 ;;
4299         s390x-*-linux*)
4300                 TARGET=S390X;
4301                 arch_target=s390x;
4302                 ACCESS_UNALIGNED="yes"
4303                 BTLS_SUPPORTED=yes
4304                 BTLS_PLATFORM=s390x
4305                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
4306                 ;;
4307         riscv32-*)
4308                 TARGET=RISCV32
4309                 ACCESS_UNALIGNED=no
4310                 AOT_SUPPORTED=no
4311                 BTLS_SUPPORTED=yes
4312                 BTLS_PLATFORM=riscv32
4313                 arch_target=riscv32
4314                 boehm_supported=false
4315                 ;;
4316         riscv64*)
4317                 TARGET=RISCV64
4318                 ACCESS_UNALIGNED=no
4319                 AOT_SUPPORTED=no
4320                 BTLS_SUPPORTED=yes
4321                 BTLS_PLATFORM=riscv64
4322                 arch_target=riscv64
4323                 boehm_supported=false
4324                 ;;
4325 esac
4327 HOST=$TARGET
4329 if test "x$host" != "x$target"; then
4330    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
4331    enable_mcs_build=no
4332    enable_support_build=no
4333    BTLS_SUPPORTED=no
4334    # Can't use tls, since it depends on the runtime detection of tls offsets
4335    # in mono-compiler.h
4336    with_tls=pthread
4337    target_mach=no
4338    case "$target" in
4339    wasm32*)
4340                 TARGET=WASM
4341                 arch_target=wasm
4342                 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
4343                 ;;
4344    arm*-darwin*)
4345                 TARGET=ARM;
4346                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4347                 case "$target" in
4348                 armv7k-*)
4349                         arm_fpu=VFP_HARD
4350                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
4351                         ;;
4352                 esac            
4353                 ;;
4354    powerpc64-ps3-linux-gnu)
4355                 TARGET=POWERPC64
4356                 arch_target=powerpc64
4357                 AC_DEFINE(TARGET_PS3, 1, [...])
4358                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4359                 # uses this define
4360                 AC_DEFINE(__mono_ppc64__, 1, [...])
4361                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4362                 sizeof_register=8
4363                 target_byte_order=G_BIG_ENDIAN
4364                 ;;
4365    powerpc64-xbox360-linux-gnu)
4366                 TARGET=POWERPC64
4367                 arch_target=powerpc64
4368                 AC_DEFINE(TARGET_XBOX360, 1, [...])
4369                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4370                 # uses this define
4371                 sizeof_register=8
4372                 target_byte_order=G_BIG_ENDIAN
4373                 ;;
4374    arm*-linux-*)
4375                 TARGET=ARM;
4376                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4377                 ;;
4378    arm*-netbsd*-eabi*)
4379                 TARGET=ARM;
4380                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4381                 ;;
4382    i686*-linux-*)
4383                 TARGET=X86;
4384                 ;;
4385    i*86-apple-*)
4386                 TARGET=X86;
4387                 ;;
4388    x86_64*-linux-*)
4389                 TARGET=AMD64;
4390                 ;;
4391    x86_64-ps4-freebsd)
4392                 TARGET=AMD64;
4393                 AC_DEFINE(TARGET_PS4, 1, [...])
4394                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
4395                 CPPFLAGS="$CPPFLAGS"
4396                 target_win32=no
4397                 ;;
4398         aarch64*darwin*_ilp32)
4399                 TARGET=ARM6432;
4400                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4401                 AC_DEFINE(TARGET_WATCHOS, 1, [...])
4402                 ;;
4403         aarch64-*)
4404                 TARGET=ARM64
4405                 ;;
4406         riscv32*)
4407                 TARGET=RISCV32
4408                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4409                 AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4410                 arch_target=riscv32
4411                 target_mach=no
4412                 with_tls=pthread
4413                 ;;
4414         riscv64*)
4415                 TARGET=RISCV64
4416                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4417                 AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4418                 arch_target=riscv64
4419                 target_mach=no
4420                 with_tls=pthread
4421                 ;;
4422         *)
4423                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
4424         esac
4426         case "$target" in
4427         *-darwin*)
4428                 target_mach=yes
4429                 ;;
4430         *-linux-android*)
4431                 AC_DEFINE(TARGET_ANDROID, 1, [...])
4432                 ;;
4433         esac
4436 case "$TARGET" in
4437 WASM)
4438         AC_DEFINE(TARGET_WASM, 1, [...])
4439         arch_target=wasm
4440         ;;
4441 X86)
4442         AC_DEFINE(TARGET_X86, 1, [...])
4443         arch_target=x86
4444         ;;
4445 AMD64)
4446         AC_DEFINE(TARGET_AMD64, 1, [...])
4447         arch_target=amd64
4448         ;;
4449 ARM)
4450         AC_DEFINE(TARGET_ARM, 1, [...])
4451         arch_target=arm
4452         ACCESS_UNALIGNED="no"
4453         ;;
4454 ARM64|ARM6432)
4455         AC_DEFINE(TARGET_ARM64, 1, [...])
4456         arch_target=arm64
4457         ;;
4458 POWERPC)
4459         AC_DEFINE(TARGET_POWERPC, 1, [...])
4460         ;;
4461 POWERPC64)
4462         AC_DEFINE(TARGET_POWERPC, 1, [...])
4463         AC_DEFINE(TARGET_POWERPC64, 1, [...])
4464         ;;
4465 S390X)
4466         AC_DEFINE(TARGET_S390X, 1, [...])
4467         ;;
4468 MIPS)
4469         AC_DEFINE(TARGET_MIPS, 1, [...])
4470         ;;
4471 SPARC)
4472         AC_DEFINE(TARGET_SPARC, 1, [...])
4473         ;;
4474 SPARC64)
4475         AC_DEFINE(TARGET_SPARC64, 1, [...])
4476         ;;
4477 RISCV32)
4478         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4479         AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4480         ;;
4481 RISCV64)
4482         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4483         AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4484         ;;
4485 esac
4487 case "$TARGET" in
4488 *32* | ARM | X86 | POWERPC | MIPS | SPARC | WASM | ARM6432)
4489     target_sizeof_void_p=4
4490     ;;
4491 *64* | S390X)
4492     target_sizeof_void_p=8
4493     ;;
4495     AC_MSG_ERROR([unknown target])
4496     ;;
4497 esac
4499 case "$HOST" in
4500 WASM)
4501         AC_DEFINE(HOST_WASM, 1, [...])
4502         ;;
4503 X86)
4504         AC_DEFINE(HOST_X86, 1, [...])
4505         ;;
4506 AMD64)
4507         AC_DEFINE(HOST_AMD64, 1, [...])
4508         ;;
4509 ARM)
4510         AC_DEFINE(HOST_ARM, 1, [...])
4511         ;;
4512 ARM64)
4513         AC_DEFINE(HOST_ARM64, 1, [...])
4514         ;;
4515 POWERPC)
4516         AC_DEFINE(HOST_POWERPC, 1, [...])
4517         ;;
4518 POWERPC64)
4519         AC_DEFINE(HOST_POWERPC, 1, [...])
4520         AC_DEFINE(HOST_POWERPC64, 1, [...])
4521         ;;
4522 S390X)
4523         AC_DEFINE(HOST_S390X, 1, [...])
4524         ;;
4525 MIPS)
4526         AC_DEFINE(HOST_MIPS, 1, [...])
4527         ;;
4528 SPARC)
4529         AC_DEFINE(HOST_SPARC, 1, [...])
4530         ;;
4531 SPARC64)
4532         AC_DEFINE(HOST_SPARC64, 1, [...])
4533         ;;
4534 RISCV32)
4535         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4536         AC_DEFINE([HOST_RISCV32], [1], [Host is 32-bit RISC-V])
4537         ;;
4538 RISCV64)
4539         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4540         AC_DEFINE([HOST_RISCV64], [1], [Host is 64-bit RISC-V])
4541         ;;
4542 esac
4544 MONO_ARCH_GSHAREDVT_SUPPORTED=0
4545 case "$HOST" in
4546 X86 | AMD64 | ARM | ARM64)
4547         MONO_ARCH_GSHAREDVT_SUPPORTED=1 # keep in sync with mini-{x86,amd64,arm,arm64}.h
4548         ;;
4549 esac
4551 AM_CONDITIONAL(MONO_ARCH_GSHAREDVT_SUPPORTED, test $MONO_ARCH_GSHAREDVT_SUPPORTED = 1)
4552 AM_CONDITIONAL(TARGET_WASM, test $arch_target = wasm)
4554 dnl *************
4555 dnl *** VTUNE ***
4556 dnl *************
4558 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
4559 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
4561 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
4563 if test "x$enable_vtune" = "xyes"; then
4564         if test "x$with_vtune" = "x"; then
4565                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
4566         else
4567                 VTUNE_PATH=$with_vtune
4568         fi
4569         VTUNE_INCLUDE=$VTUNE_PATH/include
4570         case "$TARGET" in
4571         X86)
4572                 VTUNE_LIB=$VTUNE_PATH/lib32
4573                 ;;
4574         AMD64)
4575                 VTUNE_LIB=$VTUNE_PATH/lib64
4576                 ;;
4577         *)
4578                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
4579                 ;;
4580         esac
4581         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
4582                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
4583         fi
4584         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
4585                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
4586         fi
4588         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
4589         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
4591         AC_SUBST(VTUNE_LIBS)
4592         AC_SUBST(VTUNE_CFLAGS)
4594 dnl Use GCC atomic ops if they work on the target.
4595 if test x$GCC = "xyes"; then
4596         case $TARGET in
4597         X86 | AMD64 | ARM | ARM64 | ARM6432 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64 | RISCV32 | RISCV64)
4598                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
4599                 ;;
4600         esac
4603 if test "x$target_mach" = "xyes"; then
4605    if test "x$TARGET_SYS" = "xWATCHOS"; then
4606           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
4607           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4608           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4609           BTLS_SUPPORTED=no
4610    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64" -o "x$TARGET" = "xARM6432"; then
4611           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4612           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4613           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4614           BTLS_SUPPORTED=no
4615           target_ios=yes
4616    else
4617        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
4618        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
4619        #error fail this for ios
4620        #endif
4621        ], [
4622                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
4623           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
4624           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
4625           target_osx=yes
4626        ], [
4627           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4628           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4629           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4630           BTLS_SUPPORTED=no
4631                   target_ios=yes
4632        ])
4633         fi
4634    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
4637 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
4639 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
4641 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
4642    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
4643 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
4644    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
4645 else
4646    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
4649 AC_DEFINE_UNQUOTED(TARGET_SIZEOF_VOID_P,${target_sizeof_void_p},[wordsize of target])
4651 if test "x$sizeof_register" = "x4"; then
4652   AC_DEFINE(SIZEOF_REGISTER,4,[size of target machine integer registers])
4653 elif test "x$sizeof_register" = "x8"; then
4654   AC_DEFINE(SIZEOF_REGISTER,8,[size of target machine integer registers])
4655 else
4656   AC_DEFINE_UNQUOTED(SIZEOF_REGISTER,${target_sizeof_void_p},[size of target machine integer registers])
4659 if test "x$have_visibility_hidden" = "xyes"; then
4660    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
4663 if test "x$have_deprecated" = "xyes"; then
4664    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
4667 dnl 
4668 dnl Simple Generational checks (sgen)
4670 SGEN_DEFINES=
4671 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
4672 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
4673 if test x$buildsgen = xyes; then
4674    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
4675    SGEN_DEFINES="-DHAVE_SGEN_GC"
4677         conc_gc_msg=""
4678    if test x$with_sgen_default_concurrent != xno; then
4679        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
4680            conc_gc_msg=" (concurrent by default)"
4681    fi
4683    if test "x$gc_msg" = "x"; then
4684       gc_msg="sgen$conc_gc_msg"
4685    else
4686       gc_msg="sgen$conc_gc_msg and $gc_msg"
4687    fi
4689 AC_SUBST(SGEN_DEFINES)
4690 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
4692 jit_status="Building and using the JIT"
4694 libsuffix=".so"
4696 case "$host" in
4697      *-*-darwin*)
4698         libsuffix=".dylib"
4699         LIBC="libc.dylib"
4700         INTL="libintl.dylib"
4701         SQLITE="libsqlite.0.dylib"
4702         SQLITE3="libsqlite3.0.dylib"
4703         X11="libX11.dylib"
4704         GDKX11="libgdk-x11-2.0.dylib"
4705         GTKX11="libgtk-x11-2.0.dylib"
4706         ;;
4707      *-*-*netbsd*)
4708         LIBC="libc.so"
4709         INTL="libintl.so"
4710         SQLITE="libsqlite.so"
4711         SQLITE3="libsqlite3.so"
4712         ;;
4713      *-*-kfreebsd*-gnu)
4714         LIBC="libc.so.0.1"
4715         INTL="libc.so.0.1"
4716         X11="libX11.so.6"
4717         ;;
4718     *-*-*freebsd*)
4719         LIBC="libc.so.7"
4720         INTL="libintl.so"
4721         SQLITE="libsqlite.so"
4722         SQLITE3="libsqlite3.so"
4723         ;;
4724     *-*-*openbsd*)
4725         LIBC="libc.so"
4726         INTL="libintl.so"
4727         SQLITE="libsqlite.so"
4728         SQLITE3="libsqlite3.so"
4729         ;;
4730     *-*-*linux*)
4731         AC_PATH_X
4732         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
4733         AC_MSG_CHECKING(for the soname of libX11.so)
4734         for i in $x_libraries $dlsearch_path; do
4735                 for r in 4 5 6; do
4736                         if test -f $i/libX11.so.$r; then
4737                                 X11=libX11.so.$r
4738                                 AC_MSG_RESULT($X11)
4739                         fi
4740                 done
4741         done
4742         
4743         if test "x$X11" = "xlibX11.so"; then
4744                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
4745                 X11=libX11.so.6
4746         fi
4747         ;;
4748 esac
4750 AC_SUBST(libsuffix)
4752 ######################################
4753 # EGLIB CHECKS
4754 ######################################
4756 GNUC_PRETTY=
4757 GNUC_UNUSED=
4758 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
4759 if test x$GCC = xyes; then
4760    GNUC_UNUSED='__attribute__((__unused__))'
4761    GNUC_NORETURN='__attribute__((__noreturn__))'
4762    case $host_cpu in
4763      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
4764    esac
4766 AC_SUBST(GNUC_PRETTY)
4767 AC_SUBST(GNUC_UNUSED)
4768 AC_SUBST(GNUC_NORETURN)
4769 AC_SUBST(BREAKPOINT)
4771 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
4773 case $host in
4774 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
4775     PATHSEP='\\'
4776     SEARCHSEP=';'
4777     OS="WIN32"
4778     PIDTYPE='void *'
4779     ;;
4781     PATHSEP='/'
4782     SEARCHSEP=':'
4783     OS="UNIX"
4784     PIDTYPE='int'
4785     ;;
4786 esac
4788 case $host in
4789         *-*-solaris*)
4790         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
4791         ;;
4792 esac
4794 case $target in
4795 arm*-darwin*|aarch64*-*|riscv*)
4796     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
4797     ;;
4798 i*86-*-darwin*)
4799     ORDER=G_LITTLE_ENDIAN
4800     ;;
4801 *-*-haiku*)
4802     LDFLAGS="$LDFLAGS -ltextencoding"
4803     ;;
4804 *-*-openbsd*)
4805     CFLAGS="$CFLAGS -pthread"
4806     LDFLAGS="$LDFLAGS -pthread"
4807     ;;
4808 esac
4810 AC_SUBST(ORDER)
4811 AC_SUBST(PATHSEP)
4812 AC_SUBST(SEARCHSEP)
4813 AC_SUBST(OS)
4814 AC_SUBST(PIDTYPE)
4816 # Defined for all targets/platforms using classic Windows API support.
4817 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
4818 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
4820 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf)
4821 AC_CHECK_FUNCS(getrlimit)
4822 AC_CHECK_FUNCS(fork execv execve)
4823 AC_CHECK_FUNCS(waitpid)
4825 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
4827 if test x$with_overridable_allocators = xyes; then
4828         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
4829   AC_MSG_NOTICE([Overridable allocator support enabled])
4830 else
4831   AC_MSG_NOTICE([Overridable allocator support disabled])
4835 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
4836 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
4837 # removed once support for 10.6 is dropped.
4839 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
4841 if test x$target_osx = xyes; then
4842 AC_CHECK_FUNCS(getpwuid_r)
4843 elif test x$target_ios = xno; then
4844 AC_CHECK_FUNCS(strndup getpwuid_r)
4847 AC_SEARCH_LIBS(sqrtf, m)
4849 # nanosleep may not be part of libc, also search it in other libraries
4850 AC_SEARCH_LIBS(nanosleep, rt)
4852 AC_SEARCH_LIBS(dlopen, dl)
4853 old_ldflags="${LDFLAGS}"
4854 # GNU specific option, this confuses IBM ld, but do offer alternatives when possible
4855 if test $lt_cv_prog_gnu_ld = yes; then
4856         LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4857 else
4858         case $host in
4859         *-*-aix*|*-*-os400*)
4860                 ;;
4861         *)
4862                 dnl Try to use export-dynamic anyways
4863                 LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4864                 ;;
4865         esac
4867 AC_TRY_LINK(, [int i;], found_export_dynamic=yes, found_export_dynamic=no)
4868 if test $found_export_dynamic = no; then
4869         LDFLAGS="${old_ldflags}"
4872 AC_CHECK_HEADERS(getopt.h sys/select.h sys/time.h sys/wait.h pwd.h iconv.h sys/types.h sys/resource.h)
4873 dnl giconv.c will check on HAVE_ICONV_H but we need this for link time
4874 AC_CHECK_LIB(iconv, iconv_open)
4875 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
4876 AC_SUBST(HAVE_ALLOCA_H)
4878 # Get the exact type of size_t, not just its size.
4879 # This is so we can find an exact printf format among u, lu, llu, I64u.
4880 # To avoid warnings about slight mismatches.
4881 # C99 runtime "zu" dependency is being avoided here.
4883 # We have to compile as C++ because C is too lenient
4884 # and lets the wrong thing compile, with warnings.
4886 # Note: "zu" or ifdef <something> have the advantage
4887 # of producing installable "biarch" headers. i.e. one Mac header
4888 # for Mac/x86 and Mac/amd64.
4890 AC_LANG_PUSH(C++)
4892 # Check long before int because it is the overwhelming Unix answer,
4893 # across 32bit and 64bit systems -- fewer compiler invocations in autoconf.
4895 # long ahead of int also tends to produce biarch-compatible headers except Windows.
4897 AC_MSG_CHECKING(if size_t is unsigned long)
4898 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4899         #include <stddef.h>
4900         unsigned long *a = (size_t*)0;
4901 ])], [
4902         AC_MSG_RESULT(yes)
4903         AC_SUBST(GSIZE_FORMAT, '"lu"')
4904 ], [
4905         AC_MSG_RESULT(no)
4906         AC_MSG_CHECKING(if size_t is unsigned int)
4907         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4908                 #include <stddef.h>
4909                 unsigned *a = (size_t*)0;
4910         ])], [
4911                 AC_MSG_RESULT(yes)
4912                 AC_SUBST(GSIZE_FORMAT, '"u"')
4913         ], [
4914 # At this point the majority of systems have their answer,
4915 # and we descend into non-standard or new-standard territory.
4917 # Check __int64 first because I64 on some systems predates ll, enabling
4918 # new compiler/old runtime interop, and the types always have the same size.
4919                 AC_MSG_RESULT(no)
4920                 AC_MSG_CHECKING(if size_t is unsigned __int64)
4921                 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4922                         #include <stddef.h>
4923                         unsigned __int64 *a = (size_t*)0;
4924                 ])], [
4925                         AC_MSG_RESULT(yes)
4926                         AC_SUBST(GSIZE_FORMAT, '"I64u"')
4927                 ], [
4928                         AC_MSG_RESULT(no)
4929                         AC_MSG_CHECKING(if size_t is unsigned long long)
4930                         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4931                                 #include <stddef.h>
4932                                 unsigned long long *a = (size_t*)0;
4933                         ])], [
4934                                 AC_MSG_RESULT(yes)
4935                                 AC_SUBST(GSIZE_FORMAT, '"llu"')
4936                         ], [
4937                                 AC_MSG_RESULT(no)
4938                                 AC_MSG_ERROR(Unable to determine size_t among unsigned long, int, __int64, long long)
4939                         ] )
4940                 ] )
4941         ] )
4942 ] )
4944 AC_LANG_POP
4946 # If size_t/ptrdiff_t is correct, use it. Otherwise C99 [u]intptr_t.
4947 # This provides for an exact match with functions that
4948 # take size_t like malloc and pthread_attr_getstacksize, avoiding warnings.
4949 # uintptr_t is not necessarily the same.
4951 # ptrdiff_t is preferred over ssize_t as it is C89 vs. new Posix.
4952 # ssize_t looks nicer but ptrdiff_t is wrapped up as gssize anyway.
4954 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_size_t; then
4955    GSIZE="size_t"
4956    GSSIZE="ptrdiff_t"
4957 else
4958    GSIZE="uintptr_t"
4959    GSSIZE="intptr_t"
4962 AC_SUBST(GSIZE)
4963 AC_SUBST(GSSIZE)
4964 AC_SUBST(GSIZE_FORMAT)
4967 # END OF EGLIB CHECKS
4970 AC_ARG_WITH([libgdiplus],
4971         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
4972         [], [with_libgdiplus=installed])
4974 # default install location
4975 libgdiplus_install_loc=libgdiplus${libsuffix}
4976 case "$host" in
4977     *-*-*linux*)
4978     libgdiplus_install_loc=libgdiplus${libsuffix}.0
4979     ;;
4980 esac
4982 case $with_libgdiplus in
4983     no)
4984     libgdiplus_loc=
4985     ;;
4987     installed)
4988     libgdiplus_loc=
4989     if test x$cross_compiling = xno; then
4990         if test x$host_darwin = xyes; then
4991             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
4992             if test -x $a; then
4993               libgdiplus_install_loc=$a
4994               libgdiplus_loc=$a
4995             fi
4996         fi
4997     fi
4998     ;;
5000     yes|sibling)
5001     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
5002     ;;
5004     /*) # absolute path, assume it is an install location
5005     libgdiplus_loc=$with_libgdiplus
5006     libgdiplus_install_loc=$with_libgdiplus
5007     ;;
5009     *)
5010     libgdiplus_loc=`pwd`/$with_libgdiplus
5011     ;;
5012 esac
5013 AC_SUBST(libgdiplus_loc)
5014 AC_SUBST(libgdiplus_install_loc)
5016 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)
5017 if test "x$icall_symbol_map" = "xyes"; then
5018    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
5021 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
5022 if test "x$icall_export" = "xyes"; then
5023    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
5026 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
5027 if test "x$icall_tables" = "xno"; then
5028    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
5031 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
5033 if test "x$with_tls" = "x__thread"; then
5034         AC_DEFINE(MONO_KEYWORD_THREAD, __thread, [Have __thread keyword])
5035         # Pass the information to libgc
5036         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
5037         AC_MSG_CHECKING(if the tls_model attribute is supported)
5038         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
5039                 ], [
5040                         AC_MSG_RESULT(yes)
5041                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
5042                 ], [
5043                         AC_MSG_RESULT(no)
5044         ])
5047 if test ${TARGET} = ARM; then
5048         dnl ******************************************
5049         dnl *** Check to see what FPU is available ***
5050         dnl ******************************************
5051         AC_MSG_CHECKING(which FPU to use)
5053         #
5054         # This is a bit tricky:
5055         #
5056         # if (__ARM_PCS_VFP) {
5057         #       /* mfloat-abi=hard == VFP with hard ABI */
5058         # } elif (!__SOFTFP__) {
5059         #       /* mfloat-abi=softfp == VFP with soft ABI */
5060         # } else {
5061         #       /* mfloat-abi=soft == no VFP */
5062         # }
5063         #
5064         # The exception is iOS (w/ GCC) where none of the above
5065         # are defined (but iOS always uses the 'softfp' ABI).
5066         #
5067         # No support for FPA.
5068         #
5070         fpu=NONE
5072         # iOS GCC always uses the 'softfp' ABI.
5073         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
5074                 fpu=VFP
5075         fi
5077         # Are we using the 'hard' ABI?
5078         if test x$fpu = xNONE; then
5079                 AC_TRY_COMPILE([], [
5080                         #ifndef __ARM_PCS_VFP
5081                         #error "Float ABI is not 'hard'"
5082                         #endif
5083                 ], [
5084                         fpu=VFP_HARD
5085                 ], [
5086                         fpu=NONE
5087                 ])
5088         fi
5090         # No 'hard' ABI. 'soft' or 'softfp'?
5091         if test x$fpu = xNONE; then
5092                 AC_TRY_COMPILE([], [
5093                         #ifdef __SOFTFP__
5094                         #error "Float ABI is not 'softfp'"
5095                         #endif
5096                 ], [
5097                         fpu=VFP
5098                 ], [
5099                         fpu=NONE
5100                 ])
5101         fi
5103         if test x$arm_fpu != x; then
5104            fpu=$arm_fpu
5105         fi
5107         AC_MSG_RESULT($fpu)
5108         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
5109         unset fpu
5111         dnl *********************************************
5112         dnl *** Check which ARM version(s) we can use ***
5113         dnl *********************************************
5114         AC_MSG_CHECKING(which ARM version to use)
5116         AC_TRY_COMPILE([], [
5117                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
5118                 #error Not on ARM v5.
5119                 #endif
5120         ], [
5121                 arm_v5=yes
5123                 arm_ver=ARMv5
5124         ], [])
5126         AC_TRY_COMPILE([], [
5127                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
5128                 #error Not on ARM v6.
5129                 #endif
5130         ], [
5131                 arm_v5=yes
5132                 arm_v6=yes
5134                 arm_ver=ARMv6
5135         ], [])
5137         AC_TRY_COMPILE([], [
5138                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
5139                 #error Not on ARM v7.
5140                 #endif
5141         ], [
5142                 arm_v5=yes
5143                 arm_v6=yes
5144                 arm_v7=yes
5146                 arm_ver=ARMv7
5147         ], [])
5149         AC_MSG_RESULT($arm_ver)
5151         if test x$arm_v5 = xyes; then
5152                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
5153                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
5154         fi
5156         if test x$arm_v6 = xyes; then
5157                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
5158                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
5159         fi
5161         if test x$arm_v7 = xyes; then
5162                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
5163                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
5164         fi
5167 if test ${TARGET} = RISCV32 -o ${TARGET} = RISCV64; then
5168         AC_ARG_WITH([riscv-fpabi], [  --with-riscv-fpabi=auto,double,soft   Select RISC-V floating point ABI (auto)], [fpabi=$withval], [fpabi=double])
5170         AC_MSG_CHECKING([which RISC-V floating point ABI to use])
5172         if test x$fpabi = xauto; then
5173                 AC_TRY_COMPILE([], [
5174                         #ifdef __riscv_float_abi_double
5175                         #error "double"
5176                         #endif
5177                 ], [
5178                         fpabi=auto
5179                 ], [
5180                         fpabi=double
5181                 ])
5182         fi
5184         if test x$fpabi = xauto; then
5185                 AC_TRY_COMPILE([], [
5186                         #ifdef __riscv_float_abi_single
5187                         #error "single"
5188                         #endif
5189                 ], [
5190                         fpabi=auto
5191                 ], [
5192                         fpabi=single
5193                 ])
5194         fi
5196         if test x$fpabi = xauto; then
5197                 AC_TRY_COMPILE([], [
5198                         #ifdef __riscv_float_abi_soft
5199                         #error "soft"
5200                         #endif
5201                 ], [
5202                         fpabi=auto
5203                 ], [
5204                         fpabi=soft
5205                 ])
5206         fi
5208         case $fpabi in
5209         double)
5210                 AC_DEFINE([RISCV_FPABI_DOUBLE], [1], [RISC-V FPABI is double-precision])
5211                 AC_MSG_RESULT([double-precision])
5212                 ;;
5213         single)
5214                 AC_DEFINE([RISCV_FPABI_SINGLE], [1], [RISC-V FPABI is single-precision])
5215                 AC_MSG_ERROR([single-precision, not supported])
5216                 ;;
5217         soft)
5218                 AC_DEFINE([RISCV_FPABI_SOFT], [1], [RISC-V FPABI is soft float])
5219                 AC_MSG_RESULT([soft float])
5220                 ;;
5221         auto)
5222                 AC_MSG_ERROR([unknown])
5223                 ;;
5224         *)
5225                 AC_MSG_ERROR([invalid option: $fpabi])
5226                 ;;
5227         esac
5230 if test ${TARGET} = unknown; then
5231         CPPFLAGS="$CPPFLAGS -DNO_PORT"
5232         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
5235 if test "x$platform_android" = "xyes"; then
5236         case "x${TARGET}" in
5237         xARM)
5238                 case "x$arm_ver" in
5239                 xARMv5)
5240                         BTLS_SUPPORTED=yes
5241                         BTLS_PLATFORM=android-armv5
5242                         ;;
5243                 xARMv6)
5244                         BTLS_SUPPORTED=yes
5245                         BTLS_PLATFORM=android-armv6
5246                         ;;
5247                 xARMv7)
5248                         BTLS_SUPPORTED=yes
5249                         BTLS_PLATFORM=android-armv7
5250                         ;;
5251                 *)
5252                         BTLS_SUPPORTED=no
5253                         ;;
5254                 esac
5255                 ;;
5256         xARM64)
5257                 BTLS_SUPPORTED=yes
5258                 BTLS_PLATFORM=android-v8a
5259                 ;;
5260         xX86)
5261                 BTLS_SUPPORTED=yes
5262                 BTLS_PLATFORM=android-x86
5263                 ;;
5264         xAMD64)
5265                 BTLS_SUPPORTED=yes
5266                 BTLS_PLATFORM=android-x64
5267                 ;;
5268         *)
5269                 BTLS_SUPPORTED=no
5270                 ;;
5271         esac
5274 if test ${ACCESS_UNALIGNED} = no; then
5275         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
5278 if test x$host_darwin = xyes; then
5279         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
5280         AS_IF(
5281                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
5282                 [AC_MSG_RESULT([no])],
5283                 [
5284                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
5285                         AR_FLAGS="Scru"
5286                         RANLIB="$RANLIB -no_warning_for_no_symbols"
5287                         AC_MSG_RESULT([yes])
5288                 ]
5289         )
5292 case "x$libgc" in
5293         xincluded)
5294                 # Pass CPPFLAGS to libgc configure
5295                 # We should use a separate variable for this to avoid passing useless and
5296                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
5297                 # This should be executed late so we pick up the final version of CPPFLAGS
5298                 # The problem with this approach, is that during a reconfigure, the main
5299                 # configure scripts gets invoked with these arguments, so we use separate
5300                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
5301                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
5302                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
5303                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
5304                 fi
5305                 # Don't pass -finstrument-for-thread-suspension in, 
5306                 # if these are instrumented it will be very bad news 
5307                 # (infinite recursion, undefined parking behavior, etc)
5308                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
5309                 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\""
5310                 if test "x$support_boehm" = "xyes"; then
5311                         AC_CONFIG_SUBDIRS(libgc)
5312                 fi
5313                 ;;
5314 esac
5316 MALLOC_MEMPOOLS=no
5317 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
5318         if test x$with_malloc_mempools = xyes; then
5319                 MALLOC_MEMPOOLS=yes
5320                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
5321         fi
5325 DISABLE_MCS_DOCS=default
5326 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
5327         if test x$with_mcs_docs != xyes; then
5328                 DISABLE_MCS_DOCS=yes
5329         fi
5331 if test -n "$INSTALL_4_x_TRUE"; then :
5332         DISABLE_MCS_DOCS=yes
5334 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
5335    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
5338 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)],[
5339         if test x$with_lazy_gc_thread_creation != xno ; then
5340                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
5341         fi
5342 ], [with_lazy_gc_thread_creation=no])
5344 dnl *****************************
5345 dnl *** Thread suspend policy ***
5346 dnl *****************************
5348 dnl Set a default hybrid or cooperative suspend on some platforms
5350 dnl Coop default is set by the bitcode preset.
5352 dnl If coop isn't on by default, maybe hybrid should be?
5353 if test x$enable_cooperative_suspend_default != xyes; then
5354         case $HOST in
5355         X86 | AMD64)
5356                 dnl Some host/target confusion, there's no host_osx (and
5357                 dnl host_darwin would be true on iOS not just macOS).
5358                 if test x$target_osx = xyes; then
5359                         enable_hybrid_suspend_default=yes
5360                 elif test x$host_linux = xyes -o x$host_win32 = xyes; then
5361                         enable_hybrid_suspend_default=yes
5362                 fi
5363                 ;;
5364         esac
5367 dnl Now check if there were flags overriding the defaults
5369 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])
5370 AC_ARG_ENABLE(cooperative_suspend, [  --enable-cooperative-suspend      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [], [enable_cooperative_suspend=default])
5372 if test x$enable_cooperative_suspend = xdefault -a x$with_cooperative_gc != xdefault; then
5373         enable_cooperative_suspend=$with_cooperative_gc
5376 if test x$enable_cooperative_suspend = xdefault; then
5377         enable_cooperative_suspend=$enable_cooperative_suspend_default
5380 if test x$enable_cooperative_suspend != xno; then
5381         AC_DEFINE(ENABLE_COOP_SUSPEND,1,[Enable cooperative stop-the-world garbage collection.])
5384 AM_CONDITIONAL([ENABLE_COOP_SUSPEND], [test x$enable_cooperative_suspend != xno])
5386 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])
5388 if test x$enable_hybrid_suspend = xdefault; then
5389    enable_hybrid_suspend=$enable_hybrid_suspend_default
5392 if test x$enable_hybrid_suspend != xno -a x$enable_cooperative_suspend != xno ; then
5393         AC_MSG_ERROR([Hybrid suspend and Cooperative suspend cannot be both enabled.])
5396 if test x$enable_hybrid_suspend != xno ; then
5397         AC_DEFINE(ENABLE_HYBRID_SUSPEND,1,[Enable hybrid suspend for GC stop-the-world])
5400 AM_CONDITIONAL([ENABLE_HYBRID_SUSPEND], [test x$enable_hybrid_suspend != xno])
5402 dnl End of thread suspend policy
5404 dnl ***************************
5405 dnl *** feature experiments ***
5406 dnl ***************************
5408 dnl When adding experiments, also add to mono/utils/mono-experiments.def
5409 AC_ARG_ENABLE(experiment, [ --enable-experiment=LIST       Enable experimental fatures from the comma-separate LIST.  Available experiments: null],[
5411         if test x$enable_experiment != x ; then
5412                 AC_DEFINE(ENABLE_EXPERIMENTS,1,[Enable feature experiments])
5413         fi
5414         for feature in `echo "$enable_experiment" | sed -e "s/,/ /g"`; do
5415                 eval "mono_experiment_test_enable_$feature='yes'"
5416         done
5418         if test "x$mono_experiment_test_enable_all" = "xyes"; then
5419                 eval "mono_experiment_test_enable_null='yes'"
5420                 true
5421         fi
5423         if test "x$mono_experiment_test_enable_null" = "xyes"; then
5424                 AC_DEFINE(ENABLE_EXPERIMENT_null, 1, [Enable experiment 'null'])
5425         fi
5426 ],[])
5428 dnl **********************
5429 dnl *** checked builds ***
5430 dnl **********************
5432 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],[
5434         if test x$enable_checked_build != x ; then
5435                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
5436         fi
5437         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
5438                 eval "mono_checked_build_test_enable_$feature='yes'"
5439         done
5441         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
5442                 eval "mono_checked_build_test_enable_gc='yes'"
5443                 eval "mono_checked_build_test_enable_metadata='yes'"
5444                 eval "mono_checked_build_test_enable_thread='yes'"
5445                 eval "mono_checked_build_test_enable_private_types='yes'"
5446                 eval "mono_checked_build_test_enable_crash_reporting='yes'"
5447         fi
5449         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
5450                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
5451         fi
5453         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
5454                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
5455         fi
5457         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
5458                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
5459         fi
5461         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
5462                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
5463         fi
5465         if test "x$mono_checked_build_test_enable_crash_reporting" = "xyes"; then
5466                 # Required
5467                 with_overridable_allocators=yes
5468                 AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
5470                 AC_DEFINE(ENABLE_CHECKED_BUILD_CRASH_REPORTING, 1, [Enable private types checked build])
5471         fi
5472 ], [])
5474 dnl End of checked builds
5476 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
5478 AC_CHECK_HEADER([malloc.h], 
5479                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
5480                         [Define to 1 if you have /usr/include/malloc.h.])],,)
5482 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
5483 # instead of libmono-static.a
5484 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
5485    LIBMONO_LA=libmini-static.la
5486 else
5487    if test x$buildsgen = xyes; then
5488       LIBMONO_LA=libmonosgen-$API_VER.la
5489    else
5490       LIBMONO_LA=libmonoboehm-$API_VER.la
5491    fi
5493 AC_SUBST(LIBMONO_LA)
5495 dnl **************
5496 dnl ***  Btls  ***
5497 dnl **************
5499 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
5500 AC_ARG_ENABLE(btls-lib, [  --disable-btls-lib             Disable building the BTLS native library], enable_btls_lib=$enableval, enable_btls_lib=$BTLS_SUPPORTED)
5501 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
5502 AC_ARG_WITH(btls_android_api, [  --with-btls-android-api        Android NDK API level for BTLS build])
5503 AC_ARG_WITH(btls_android_cmake_toolchain, [  --with-btls-android-cmake-toolchain        Path to the cmake toolchain file for Android])
5504 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])
5506 if test "x$with_btls_android_api" = "x" ; then
5507         case "$BTLS_PLATFORM" in
5508                 android-armv5)
5509                         with_btls_android_api=16" ;;
5510                 android-armv6)
5511                         with_btls_android_api=16" ;;
5512                 android-armv7)
5513                         with_btls_android_api=16 ;;
5514                 android-v8a)
5515                         with_btls_android_api=21 ;;
5516                 android-x86)
5517                         with_btls_android_api=16 ;;
5518                 android-x64)
5519                         with_btls_android_api=21 ;;
5520         esac
5523 if test "x$enable_btls" = "xno"; then
5524    enable_btls_lib=no
5527 AM_CONDITIONAL(BTLS, test x$enable_btls_lib = xyes)
5529 btls_android=no
5530 if test "x$enable_btls" = "xyes"; then
5531         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
5532         if test "x$CMAKE" = "xno"; then
5533                 AC_MSG_ERROR("cmake not found")
5534         fi
5536         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
5537         AC_SUBST(BTLS_ROOT)
5539         btls_arch=
5540         btls_cflags=
5541         BTLS_CMAKE_ARGS=
5543         if test "x$host_win32" = "xyes"; then
5544                 AC_CHECK_PROG(HAVE_YASM, yasm, yes, no)
5545         fi
5547         case "$BTLS_PLATFORM" in
5548         i386)
5549                 btls_arch=i386
5550                 btls_cflags="-m32"
5551                 case $host_os in
5552                         darwin*)
5553                                 btls_cflags="$btls_cflags -arch i386"
5554                                 ;;
5555                         mingw*|cygwin*)
5556                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5557                                 if test "x$HAVE_YASM" != "xyes"; then
5558                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5559                                 fi
5560                                 ;;
5561                 esac
5562                 ;;
5563         x86_64)
5564                 btls_arch=x86_64
5565                 case $host_os in
5566                         mingw*|cygwin*)
5567                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5568                                 if test "x$HAVE_YASM" != "xyes"; then
5569                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5570                                 fi
5571                                 ;;
5572                 esac
5573                 ;;
5574         arm)
5575                 btls_arch=arm
5576                 btls_cflags="-DOPENSSL_NO_ASM=1"
5577                 ;;
5578         armsoft)
5579                 btls_arch=arm
5580                 btls_cflags="-DOPENSSL_NO_ASM=1"
5581                 ;;
5582         aarch64)
5583                 btls_arch=aarch64
5584                 btls_cflags="-march=armv8-a+crypto"
5585                 ;;
5586         s390x)
5587                 btls_arch=s390x
5588                 ;;
5589         powerpc)
5590                 btls_arch=powerpc
5591                 case $host_os in
5592                         aix*|os400*)
5593                                 btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
5594                                 BTLS_CMAKE_ARGS="-DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
5595                 esac
5596                 ;;
5597         android-armv5)
5598                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5599                 ;;
5600         android-armv6)
5601                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5602                 ;;
5603         android-armv7)
5604                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5605                 ;;
5606         android-v8a)
5607                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5608                 ;;
5609         android-x86)
5610                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5611                 ;;
5612         android-x64)
5613                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5614                 ;;
5615         riscv32)
5616                 btls_arch=riscv32
5617                 ;;
5618         riscv64)
5619                 btls_arch=riscv64
5620                 ;;
5621         *)
5622                 AC_MSG_ERROR(Invalid BTLS platform)
5623         esac
5625         if test "x$platform_android" = "xyes"; then
5626                 if test "x$with_btls_android_cmake_toolchain" = "x"; then
5627                    with_btls_android_cmake_toolchain="$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
5628                 fi
5630                 if test "x$with_btls_android_ndk_asm_workaround" != "x"; then
5631                    BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DENABLE_NDK_ARM_WORKAROUND=ON"
5632                 fi
5634                 btls_android=yes
5635                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$with_btls_android_cmake_toolchain"
5636                 if test "x$with_btls_android_ndk" != "x"; then
5637                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
5638                 else
5639                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
5640                 fi
5641         fi
5643         if test "x$btls_arch" != "x"; then
5644                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
5645         fi
5647         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
5648         AC_SUBST(BTLS_ARCH)
5649         AC_SUBST(BTLS_CFLAGS)
5650         AC_SUBST(BTLS_PLATFORM)
5651         AC_SUBST(BTLS_CMAKE_ARGS)
5653         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
5654 else
5655         enable_btls=no
5658 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
5660 if test x$DISABLE_MCS_DOCS = xyes; then
5661    docs_dir=""
5662 else
5663    docs_dir=docs
5665 AC_SUBST(docs_dir)
5667 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
5668 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
5669 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
5671 libmono_ldflags="$libmono_ldflags $LIBS"
5673 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
5674 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
5675 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
5676 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
5677 AM_CONDITIONAL(X86, test x$TARGET = xX86)
5678 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
5679 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
5680 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
5681 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
5682 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
5683 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64 -o x$TARGET = xARM6432)
5684 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
5685 AM_CONDITIONAL([RISCV], [test x$TARGET = xRISCV32 -o x$TARGET = xRISCV64])
5686 AM_CONDITIONAL([RISCV32], [test x$TARGET = xRISCV32])
5687 AM_CONDITIONAL([RISCV64], [test x$TARGET = xRISCV64])
5688 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
5689 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
5690 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
5691 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
5692 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
5693 AM_CONDITIONAL([HOST_RISCV], [test x$HOST = xRISCV32 -o x$HOST = xRISCV64])
5694 AM_CONDITIONAL([HOST_RISCV32], [test x$HOST = xRISCV32])
5695 AM_CONDITIONAL([HOST_RISCV64], [test x$HOST = xRISCV64])
5696 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
5698 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
5700 AC_SUBST(LIBC)
5701 AC_SUBST(INTL)
5702 AC_SUBST(SQLITE)
5703 AC_SUBST(SQLITE3)
5704 AC_SUBST(X11)
5705 AC_SUBST(GDKX11)
5706 AC_SUBST(GTKX11)
5707 AC_SUBST(XINERAMA)
5708 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
5709 AC_SUBST(arch_target)
5711 #This must always be defined when building the runtime
5712 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
5714 mono_build_root=`pwd`
5715 AC_SUBST(mono_build_root)
5717 AC_ARG_ENABLE(msvc,[  --enable-msvc    Build with Visual Studio (msvc) (defaults to no)], enable_msvc=$enableval, enable_msvc=no)
5718 if test x$host_win32 = xno; then
5719         if test x$enable_msvc = xyes; then
5720                 echo "Error, --enable-msvc only supported for Windows builds."
5721                 exit 1
5722         fi
5724 AM_CONDITIONAL(ENABLE_MSVC, test x$enable_msvc = xyes)
5726 if test "x$enable_msvc" = "xyes"; then
5727         if test "x$support_boehm" = "xyes"; then
5728                 echo "Error, Boehm GC is not supported when using --enable-msvc."
5729                 exit 1
5730         fi
5731         mono_msvc_build_dir='$(top_srcdir)'/msvc/build/sgen
5732         if test "x$host_cpu" = "xi686"; then
5733                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/Win32/lib/Release
5734                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/Win32/bin/Release
5735                 mono_runtime=msvc/build/sgen/Win32/bin/Release/mono-sgen.exe
5736                 mono_runtime_wrapper=$mono_runtime
5737         else
5738                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/x64/lib/Release
5739                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/x64/bin/Release
5740                 mono_runtime=msvc/build/sgen/x64/bin/Release/mono-sgen.exe
5741                 mono_runtime_wrapper=msvc/build/sgen/x64/bin/Release/mono-sgen-msvc.sh
5742         fi
5743         AC_SUBST(mono_msvc_build_dir)
5744         AC_SUBST(mono_msvc_build_lib_dir)
5745         AC_SUBST(mono_msvc_build_bin_dir)
5746 else
5747         mono_runtime=mono/mini/mono
5748         mono_runtime_wrapper=$mono_runtime
5751 AC_SUBST(mono_runtime)
5752 AC_SUBST(mono_runtime_wrapper)
5754 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/Microsoft.Net.Compilers.2.8.2/tools/csc.exe
5756 if test $csc_compiler = mcs; then
5757   CSC=$mcs_topdir/class/lib/build/mcs.exe
5758 else
5759   CSC=$CSC_LOCATION
5762 AM_CONDITIONAL([CSC_IS_ROSLYN], [test x$csc_compiler != xmcs])
5764 mono_cfg_root=$mono_build_root/runtime
5765 if test x$host_win32 = xyes; then
5766   if test "x$cross_compiling" = "xno"; then
5767     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
5768     CSC=`cygpath -m -a $CSC`
5769     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
5770   else
5771     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
5772   fi
5773 else
5774   mono_cfg_dir=$mono_cfg_root/etc
5777 if test "x$platform_android" = "xyes"; then
5778   mono_cfg_dir=
5781 AC_SUBST(mono_cfg_dir)
5783 AC_SUBST(CSC)
5785 AC_CONFIG_FILES([po/mcs/Makefile.in])
5787 AC_CONFIG_FILES([acceptance-tests/microbench-perf.sh],[chmod +x acceptance-tests/microbench-perf.sh])
5788 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
5789 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
5791 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
5792 [   depth=../../../..
5793     case $srcdir in
5794     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5795     .) reldir=$depth ;;
5796     *) reldir=$depth/$srcdir ;;
5797     esac
5798     $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
5799     cd runtime/etc/mono/1.0
5800     rm -f machine.config
5801     $LN_S $reldir/data/net_1_1/machine.config machine.config
5802     cd $depth
5803 ],[LN_S='$LN_S'])
5805 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
5806 [   depth=../../../..
5807     case $srcdir in
5808     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5809     .) reldir=$depth ;;
5810     *) reldir=$depth/$srcdir ;;
5811     esac
5812     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5813     cd runtime/etc/mono/2.0
5814     rm -f machine.config
5815     $LN_S $reldir/data/net_2_0/machine.config machine.config
5816     cd $depth
5817 ],[LN_S='$LN_S'])
5819 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
5820 [   depth=../../../..
5821     case $srcdir in
5822     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5823     .) reldir=$depth ;;
5824     *) reldir=$depth/$srcdir ;;
5825     esac
5826     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5827     cd runtime/etc/mono/2.0
5828     rm -f web.config
5829     $LN_S $reldir/data/net_2_0/web.config web.config
5830     cd $depth
5831 ],[LN_S='$LN_S'])
5833 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
5834 [   depth=../../..
5835     case $srcdir in
5836     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5837     .) reldir=$depth ;;
5838     *) reldir=$depth/$srcdir ;;
5839     esac
5840     $ac_aux_dir/install-sh -d runtime/etc/mono/
5841     cd runtime/etc/mono/
5842     rm -f browscap.ini
5843     $LN_S $reldir/data/browscap.ini browscap.ini
5844     cd $depth
5845 ],[LN_S='$LN_S'])
5847 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
5848 [   depth=../../../../..
5849     case $srcdir in
5850     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5851     .) reldir=$depth ;;
5852     *) reldir=$depth/$srcdir ;;
5853     esac
5854     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
5855     cd runtime/etc/mono/2.0/Browsers
5856     rm -f Compat.browser
5857     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5858     cd $depth
5859 ],[LN_S='$LN_S'])
5861 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
5862 [   depth=../../../../..
5863     case $srcdir in
5864     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5865     .) reldir=$depth ;;
5866     *) reldir=$depth/$srcdir ;;
5867     esac
5868     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
5869     cd runtime/etc/mono/4.0/Browsers
5870     rm -f Compat.browser
5871     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5872     cd $depth
5873 ],[LN_S='$LN_S'])
5875 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
5876 [   depth=../../../../..
5877     case $srcdir in
5878     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5879     .) reldir=$depth ;;
5880     *) reldir=$depth/$srcdir ;;
5881     esac
5882     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
5883     cd runtime/etc/mono/4.5/Browsers
5884     rm -f Compat.browser
5885     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5886     cd $depth
5887 ],[LN_S='$LN_S'])
5889 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
5890 [   depth=../../../..
5891     case $srcdir in
5892     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5893     .) reldir=$depth ;;
5894     *) reldir=$depth/$srcdir ;;
5895     esac
5896     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5897     cd runtime/etc/mono/4.0
5898     rm -f machine.config
5899     $LN_S $reldir/data/net_4_0/machine.config machine.config
5900     cd $depth
5901 ],[LN_S='$LN_S'])
5903 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
5904 [   depth=../../../..
5905     case $srcdir in
5906     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5907     .) reldir=$depth ;;
5908     *) reldir=$depth/$srcdir ;;
5909     esac
5910     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5911     cd runtime/etc/mono/4.0
5912     rm -f web.config
5913     $LN_S $reldir/data/net_4_0/web.config web.config
5914     cd $depth
5915 ],[LN_S='$LN_S'])
5917 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
5918 [   depth=../../../..
5919     case $srcdir in
5920     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5921     .) reldir=$depth ;;
5922     *) reldir=$depth/$srcdir ;;
5923     esac
5924     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5925     cd runtime/etc/mono/4.5
5926     rm -f machine.config
5927     $LN_S $reldir/data/net_4_5/machine.config machine.config
5928     cd $depth
5929 ],[LN_S='$LN_S'])
5931 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
5932 [   depth=../../../..
5933     case $srcdir in
5934     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5935     .) reldir=$depth ;;
5936     *) reldir=$depth/$srcdir ;;
5937     esac
5938     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5939     cd runtime/etc/mono/4.5
5940     rm -f web.config
5941     $LN_S $reldir/data/net_4_5/web.config web.config
5942     cd $depth
5943 ],[LN_S='$LN_S'])
5945 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])
5946 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])
5947 AC_CONFIG_COMMANDS([clean-llvm], [rm -f llvm/llvm_config.mk])
5950 # Mono.Native Support
5951 # -------------------
5952 # Mono.Native is the new name for both System.Native and System.Security.Cryptography.Apple.
5953 # It is built as a stand-alone shared library and not bundled with the runtime because we
5954 # may need to build two different versions of it.
5956 # Starting with macOS 10.12+ and iOS 10+, Apple introduced a new Unified API for some of the
5957 # crypto primitives that we're using as part of System.Security.Cryptography.Apple.
5959 # On Desktop, we can check at runtime whether the OS version is recent enough and switch
5960 # implementation accordingly.  We build a single `libmono-native` shared library.
5962 # However, on Mobile we cannot have any undefined symbols as this would break Bitcode.
5964 # During the mobile build, we are called with `CFLAGS` containing an explicit minium version flag,
5965 # which is eiter `-mmacosx-version-min=`, `-mios-simulator-version-min=` or `-miphoneos-version-min=`
5966 # depending on platform.
5968 # We build two versions of the shared library:
5969 # - `libmono-native-compat` is built with whichever minimum version is passed to us via `CFLAGS`.
5970 # - `libmono-native-unifed` is built with the minimum version set to macOS 10.12+ / iOS 10+.
5972 # For testing purpuses, there is a function called `mono_native_get_platform_type ()`
5973 # (see mono/native/mono-native-platform.c), which returns a `MonoNativePlatformType` enum value.
5974 # There is also `Mono.MonoNativePlatform.GetPlatformType ()` (see mcs/class/corlib/Test/Mono/MonoNativePlatform.cs).
5976 # This can be called by automated tests both to ensure that the library has been correctly installed and also
5977 # to verify that it's the correct version of it.
5980 AC_MSG_CHECKING([Mono.Native support])
5981 sed_version_pattern='[[0-9]]\{1,2\}\(\.[[0-9]]\{1,2\}\)'
5982 if test x$disable_mono_native = xyes; then
5983         mono_native=no
5984 elif test x$target_osx = xyes; then
5985         MONO_NATIVE_CC=$CC
5986         MONO_NATIVE_CXX=$CXX
5987         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
5988         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
5989         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
5990         MONO_NATIVE_CFLAGS=$CFLAGS
5991         MONO_NATIVE_LDFLAGS=$LDFLAGS
5993         mono_native=yes
5994         MONO_NATIVE_PLATFORM=macos
5995         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_MACOS"
5997         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer],
5998                 [!(MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12)])
6000         if test x$mono_native_compat = xyes; then
6001                 mono_native_compat=yes
6002                 mono_native_text="Mac OSX (compat + unified v10.12)"
6003                 MONO_NATIVE_COMPAT_CCASFLAGS=$MONO_NATIVE_CCASFLAGS
6004                 MONO_NATIVE_COMPAT_CPPFLAGS=$MONO_NATIVE_CPPFLAGS
6005                 MONO_NATIVE_COMPAT_CXXFLAGS=$MONO_NATIVE_CXXFLAGS
6006                 MONO_NATIVE_COMPAT_CFLAGS=$MONO_NATIVE_CFLAGS
6007                 MONO_NATIVE_COMPAT_LDFLAGS=$MONO_NATIVE_LDFLAGS
6009                 sed_remove_mac_version_pattern="s/-mmacosx-version-min=$sed_version_pattern//g"
6010                 MONO_NATIVE_UNIFIED_CCASFLAGS="`echo $CCASFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6011                 MONO_NATIVE_UNIFIED_CPPFLAGS="`echo $CPPFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6012                 MONO_NATIVE_UNIFIED_CXXFLAGS="`echo $CXXFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6013                 MONO_NATIVE_UNIFIED_CFLAGS="`echo $CFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6014                 MONO_NATIVE_UNIFIED_LDFLAGS="`echo $LDFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6015         else
6016                 mono_native_compat=no
6017                 mono_native_text="Mac OSX"
6018         fi
6019 elif test x$mono_native_platform_ios = xyes; then
6020         AC_MONO_APPLE_TARGET(TARGET_OS_SIMULATOR, [mono_native_ios_sim=yes], [mono_native_ios_sim=no])
6022         AC_MONO_APPLE_TARGET(TARGET_OS_IOS, [
6023                 if test x$mono_native_ios_sim = xyes; then
6024                         mono_native_ios_target=ios-simulator
6025                         mono_native_text="iOS Simulator"
6026                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6027                 else
6028                         mono_native_ios_target=iphoneos
6029                         mono_native_text="iOS Device"
6030                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6031                 fi
6032                 mono_native_unified_version="10.0"
6033                 mono_native_compat_check="__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_10_0"
6034         ], [
6035                 AC_MONO_APPLE_TARGET(TARGET_OS_TV, [
6036                         if test x$mono_native_ios_sim = xyes; then
6037                                 mono_native_ios_target=tvos-simulator
6038                                 mono_native_text="AppleTV Simulator"
6039                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6040                         else
6041                                 mono_native_ios_target=tvos
6042                                 mono_native_text="AppleTV Device"
6043                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6044                         fi
6045                         mono_native_unified_version="10.0"
6046                         mono_native_compat_check="__TV_OS_VERSION_MIN_REQUIRED >= __TVOS_10_0"
6047                 ], [
6048                         AC_MONO_APPLE_TARGET(TARGET_OS_WATCH, [
6049                                 if test x$mono_native_ios_sim = xyes; then
6050                                         mono_native_ios_target=watchos-simulator
6051                                         mono_native_text="Apple Watch Simulator"
6052                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6053                                 else
6054                                         mono_native_ios_target=watchos
6055                                         mono_native_text="Apple Watch Device"
6056                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6057                                 fi
6058                                 mono_native_unified_version="5.0"
6059                                 mono_native_compat_check="__WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_5_0"
6060                         ], [
6061                                 AC_MSG_ERROR([Unknown iOS Target])
6062                         ])
6063                 ])
6064         ])
6066         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer], [!($mono_native_compat_check)])
6068         if test x$with_bitcode = xyes; then
6069                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -no-undefined -fatal_warnings"
6070                 MONO_NATIVE_LIBADD="../mini/$LIBMONO_LA"
6071         else
6072                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -fatal_warnings"
6073         fi
6075         if test x$enable_gss = xyes; then
6076                 mono_native_ldflags="$mono_native_ldflags -framework GSS"
6077         fi
6079         MONO_NATIVE_CC=$CC
6080         MONO_NATIVE_CXX=$CXX
6081         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6082         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6083         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6084         MONO_NATIVE_CFLAGS=$CFLAGS
6085         MONO_NATIVE_LDFLAGS="$LDFLAGS $mono_native_ldflags"
6087         if test x$mono_native_compat = xyes; then
6088                 mono_native_text="$mono_native_text (compat + unified v$mono_native_unified_version)"
6089                 MONO_NATIVE_COMPAT_CCASFLAGS=$MONO_NATIVE_CCASFLAGS
6090                 MONO_NATIVE_COMPAT_CPPFLAGS=$MONO_NATIVE_CPPFLAGS
6091                 MONO_NATIVE_COMPAT_CXXFLAGS=$MONO_NATIVE_CXXFLAGS
6092                 MONO_NATIVE_COMPAT_CFLAGS=$MONO_NATIVE_CFLAGS
6093                 MONO_NATIVE_COMPAT_LDFLAGS=$MONO_NATIVE_LDFLAGS
6095                 sed_remove_ios_version_pattern="s/-m\(.*\)-version-min=$sed_version_pattern//g"
6096                 MONO_NATIVE_UNIFIED_CCASFLAGS="`echo $CCASFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6097                 MONO_NATIVE_UNIFIED_CPPFLAGS="`echo $CPPFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6098                 MONO_NATIVE_UNIFIED_CXXFLAGS="`echo $CXXFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6099                 MONO_NATIVE_UNIFIED_CFLAGS="`echo $CFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6100                 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"
6101         fi
6103         mono_native=yes
6104         MONO_NATIVE_PLATFORM=ios
6105 elif test x$host_linux = xyes; then
6106         mono_native_text="Linux"
6107         MONO_NATIVE_CC=$CC
6108         MONO_NATIVE_CXX=$CXX
6109         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6110         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6111         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6112         MONO_NATIVE_CFLAGS=$CFLAGS
6113         MONO_NATIVE_LDFLAGS=$LDFLAGS
6115         mono_native=yes
6116         mono_native_compat=no
6117         MONO_NATIVE_PLATFORM=linux
6119         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
6120 elif test x$target_wasm = xyes; then
6121         mono_native_text="wasm"
6122         MONO_NATIVE_CC=$CC
6123         MONO_NATIVE_CXX=$CXX
6124         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6125         # The system.native code uses _WASM_ to check for wasm
6126         MONO_NATIVE_CPPFLAGS="$CPPFLAGS -D_WASM_"
6127         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6128         MONO_NATIVE_CFLAGS=$CFLAGS
6129         MONO_NATIVE_LDFLAGS=$LDFLAGS
6131         mono_native=yes
6132         mono_native_compat=no
6133         MONO_NATIVE_PLATFORM=linux
6135         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
6136 elif case $host_os in aix*|os400*) true;; *) false;; esac; then
6137         mono_native_text="AIX"
6138         MONO_NATIVE_CC=$CC
6139         MONO_NATIVE_CXX=$CXX
6140         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6141         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6142         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6143         MONO_NATIVE_CFLAGS=$CFLAGS
6144         MONO_NATIVE_LDFLAGS=$LDFLAGS
6146         mono_native=yes
6147         mono_native_compat=no
6148         MONO_NATIVE_PLATFORM=aix
6150         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_AIX"
6151 elif test x$platform_android = xyes; then
6152         mono_native_text="Android"
6153         MONO_NATIVE_CC=$CC
6154         MONO_NATIVE_CXX=$CXX
6155         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6156         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6157         MONO_NATIVE_CFLAGS=$CFLAGS
6158         MONO_NATIVE_LDFLAGS=$LDFLAGS
6159         MONO_NATIVE_LIBADD="../mini/$LIBMONO_LA"
6161         mono_native=yes
6162         mono_native_compat=no
6163         MONO_NATIVE_PLATFORM=android
6165         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_ANDROID"
6166 else
6167         mono_native=no
6168         mono_native_text="no"
6171 AC_MSG_RESULT($mono_native_text)
6173 if test x$mono_native_compat = xyes; then
6174         MONO_NATIVE_LIBRARY_NAME=libmono-native-compat
6175 else
6176         MONO_NATIVE_LIBRARY_NAME=libmono-native
6179 AC_SUBST(MONO_NATIVE_PLATFORM)
6180 AC_SUBST(MONO_NATIVE_CC)
6181 AC_SUBST(MONO_NATIVE_CXX)
6182 AC_SUBST(MONO_NATIVE_CCASFLAGS)
6183 AC_SUBST(MONO_NATIVE_COMPAT_CCASFLAGS)
6184 AC_SUBST(MONO_NATIVE_UNIFIED_CCASFLAGS)
6185 AC_SUBST(MONO_NATIVE_CPPFLAGS)
6186 AC_SUBST(MONO_NATIVE_COMPAT_CPPFLAGS)
6187 AC_SUBST(MONO_NATIVE_UNIFIED_CPPFLAGS)
6188 AC_SUBST(MONO_NATIVE_CXXFLAGS)
6189 AC_SUBST(MONO_NATIVE_COMPAT_CXXFLAGS)
6190 AC_SUBST(MONO_NATIVE_UNIFIED_CXXFLAGS)
6191 AC_SUBST(MONO_NATIVE_CFLAGS)
6192 AC_SUBST(MONO_NATIVE_COMPAT_CFLAGS)
6193 AC_SUBST(MONO_NATIVE_UNIFIED_CFLAGS)
6194 AC_SUBST(MONO_NATIVE_LDFLAGS)
6195 AC_SUBST(MONO_NATIVE_COMPAT_LDFLAGS)
6196 AC_SUBST(MONO_NATIVE_UNIFIED_LDFLAGS)
6197 AC_SUBST(MONO_NATIVE_LIBRARY_NAME)
6198 AC_SUBST(MONO_NATIVE_LIBADD)
6200 AM_CONDITIONAL(MONO_NATIVE, test x$mono_native = xyes)
6201 AM_CONDITIONAL(MONO_NATIVE_COMPAT, test x$mono_native_compat = xyes)
6202 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_MACOS, test x$MONO_NATIVE_PLATFORM = xmacos)
6203 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_IOS, test x$MONO_NATIVE_PLATFORM = xios)
6204 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_LINUX, test x$MONO_NATIVE_PLATFORM = xlinux)
6205 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_AIX, test x$MONO_NATIVE_PLATFORM = xaix)
6206 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_ANDROID, test x$MONO_NATIVE_PLATFORM = xandroid)
6208 MONO_NATIVE_PLATFORM_TYPE_COMPAT="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_COMPAT"
6209 MONO_NATIVE_PLATFORM_TYPE_UNIFIED="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_UNIFIED"
6210 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE)
6211 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_COMPAT)
6212 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_UNIFIED)
6214 ### C++ Linker selection
6216 # We have to lie to autotools, sometimes.
6218 # If we're building with llvm compiled into Mono, set MONO_CXXLD to CXX,
6219 # otherwise to CC.  We want C linking even if we're compiling with C++ enabled
6220 # because we do not want to link inthe C++ runtime library (-lstdc++ or -lc++),
6221 # except if we're linking with LLVM which relies on it.
6223 # Explanation of the hack:
6225 # According to
6226 # https://www.gnu.org/software/automake/manual/html_node/How-the-Linker-is-Chosen.html,
6227 # automake chooses the linker that it used to compile a target based on the
6228 # _SOURCES for that target.  If the target is comprised of only C code, it
6229 # chooses the C linker (on Linux and OSX this is just gcc or clang called with
6230 # linker arguments and a -o).  If the target _SOURCES include at least one C++ file, 
6231 # then automake chooses the C++ linker (usually g++ or clang++ called with linker arguments and -o).
6233 # The problem for Mono is that we don't want the C++ runtime library (libstdc++
6234 # or libc++) linked in - even when Mono is written in C++, we take care not to
6235 # require the runtime library.  As a result, we don't want g++ or clang++ to do
6236 # the linking.  On the other hand if LLVM is enabled, then we _must_ use the
6237 # C++ linker - LLVM doesn't have the same restrictions.
6239 # So the trick is we set MONO_CXXLD here to $CXX or $CC and in
6240 #  mono/mini/Makefile.am.in we have CCLD=$MONO_CXXLD and CXXLD=$MONO_CXXLD which bypasses
6241 #  automake's autodetection and lets us use the linker that we want.
6243 if test "x$enable_llvm_runtime" = "xyes"; then
6244         AC_SUBST(MONO_CXXLD, [$CXX])
6245 else
6246         AC_SUBST(MONO_CXXLD, [$CC])
6249 ### Set -Werror options
6251 # Anything involving -Werror must be done late because autoconf depends on compiling with warnings to be success.
6253 if test x"$GCC" = xyes; then
6255         if test "x$with_jemalloc" != "xyes"; then
6257                 # incompatible-pointer-types requires gcc circa 5.x
6259                 ORIG_CFLAGS=$CFLAGS
6260                 CFLAGS="$CFLAGS -Wincompatible-pointer-types -Werror"
6261                 AC_MSG_CHECKING(for -Wincompatible-pointer-types option to gcc)
6262                 AC_TRY_COMPILE([],[
6263                 ], [
6264                         AC_MSG_RESULT(yes)
6265                         CFLAGS="$ORIG_CFLAGS -Werror=incompatible-pointer-types"
6266                 ], [
6267                         AC_MSG_RESULT(no)
6268                         CFLAGS=$ORIG_CFLAGS
6269                 ])
6271                 CFLAGS="$CFLAGS -Werror=return-type"
6272         fi
6274         # Implicit function declarations are not 64 bit safe
6275         # Do this late, since this causes lots of configure tests to fail
6276         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
6277         # jay has a lot of implicit declarations
6278         JAY_CFLAGS="-Wno-implicit-function-declaration"
6281 AC_SUBST(CFLAGS)
6282 AC_SUBST(CPPFLAGS)
6283 AC_SUBST(LDFLAGS)
6285 # Update all submodules recursively to ensure everything is checked out
6286 (cd $srcdir && scripts/update_submodules.sh)
6288 AC_OUTPUT([
6289 Makefile
6290 mono-uninstalled.pc
6291 acceptance-tests/Makefile
6292 llvm/Makefile
6293 scripts/mono-find-provides
6294 scripts/mono-find-requires
6295 mk/Makefile
6296 mono/Makefile
6297 mono/btls/Makefile
6298 mono/native/Makefile
6299 mono/utils/Makefile
6300 mono/utils/jemalloc/Makefile
6301 mono/metadata/Makefile
6302 mono/dis/Makefile
6303 mono/cil/Makefile
6304 mono/arch/Makefile
6305 mono/arch/x86/Makefile
6306 mono/arch/amd64/Makefile
6307 mono/arch/ppc/Makefile
6308 mono/arch/sparc/Makefile
6309 mono/arch/s390x/Makefile
6310 mono/arch/arm/Makefile
6311 mono/arch/arm64/Makefile
6312 mono/arch/mips/Makefile
6313 mono/arch/riscv/Makefile
6314 mono/sgen/Makefile
6315 mono/native/platform-type.c
6316 mono/native/platform-type-compat.c
6317 mono/native/platform-type-unified.c
6318 mono/tests/Makefile
6319 mono/tests/assembly-load-reference/Makefile
6320 mono/tests/tests-config
6321 mono/tests/gc-descriptors/Makefile
6322 mono/tests/testing_gac/Makefile
6323 mono/tests/llvmonly-mixed/Makefile
6324 mono/unit-tests/Makefile
6325 mono/benchmark/Makefile
6326 mono/mini/Makefile
6327 mono/profiler/Makefile
6328 mono/eglib/Makefile
6329 mono/eglib/eglib-config.h
6330 mono/eglib/test/Makefile
6331 m4/Makefile
6332 ikvm-native/Makefile
6333 scripts/Makefile
6334 man/Makefile
6335 docs/Makefile
6336 data/Makefile
6337 data/net_2_0/Makefile
6338 data/net_4_0/Makefile
6339 data/net_4_5/Makefile
6340 data/net_2_0/Browsers/Makefile
6341 data/net_4_0/Browsers/Makefile
6342 data/net_4_5/Browsers/Makefile
6343 data/mint.pc
6344 data/mono-2.pc
6345 data/monosgen-2.pc
6346 data/mono.pc
6347 data/mono-cairo.pc
6348 data/mono-options.pc
6349 data/mono-lineeditor.pc
6350 data/monodoc.pc
6351 data/dotnet.pc
6352 data/dotnet35.pc
6353 data/wcf.pc
6354 data/cecil.pc
6355 data/system.web.extensions_1.0.pc
6356 data/system.web.extensions.design_1.0.pc
6357 data/system.web.mvc.pc
6358 data/system.web.mvc2.pc
6359 data/system.web.mvc3.pc
6360 data/aspnetwebstack.pc
6361 data/reactive.pc
6362 samples/Makefile
6363 support/Makefile
6364 data/config
6365 tools/Makefile
6366 tools/locale-builder/Makefile
6367 tools/sgen/Makefile
6368 tools/pedump/Makefile
6369 runtime/Makefile
6370 msvc/Makefile
6371 po/Makefile
6374 if test x$host_win32 = xyes; then
6375    # Get rid of 'cyg' prefixes in library names
6376    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6377    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
6378    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
6379    # executable doesn't work...
6380    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6383 if test x$host_darwin = xyes; then
6384    # This doesn't seem to be required and it slows down parallel builds
6385    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
6389   case $prefix in
6390   NONE) prefix=$ac_default_prefix ;;
6391   esac
6392   case $exec_prefix in
6393   NONE) exec_prefix='${prefix}' ;;
6394   esac
6396   #
6397   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
6398   # any existing config.make.  This allows people to share the same source tree
6399   # with different build directories, one native and one cross
6400   #
6401   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
6403     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
6405     echo "prefix=$prefix" > $mcs_topdir/build/config.make
6406     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
6407     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
6408     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
6409     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
6410     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
6411     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
6412     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
6413     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
6415     case $INSTALL in
6416     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
6417     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
6418     esac
6420     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
6422     export VERSION
6423     [myver=$($AWK 'BEGIN {
6424       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
6425       if(length(vsplit [1]) > 4) {
6426         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
6427       }
6428       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
6429     }')]
6431     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
6432     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
6434     if test x$host_darwin = xyes; then
6435       echo "BUILD_PLATFORM = macos" >> $mcs_topdir/build/config.make
6436       echo "HOST_PLATFORM ?= macos" >> $mcs_topdir/build/config.make
6437       echo "XTEST_PLATFORM ?= osx" >> $mcs_topdir/build/config.make
6438     elif test x$host_win32 = xyes; then
6439       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
6440       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
6441       echo "XTEST_PLATFORM ?= windows" >> $mcs_topdir/build/config.make
6442     elif test x$host_linux = xyes; then
6443       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
6444       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6445       echo "XTEST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6446     else
6447       echo "BUILD_PLATFORM = unix" >> $mcs_topdir/build/config.make
6448       echo "HOST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6449       echo "XTEST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6450     fi
6452     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
6453       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
6454     fi
6456         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
6457            enable_system_aot=yes
6458         fi
6460     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
6461       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
6462     fi
6464     if test x$DISABLE_MCS_DOCS = xyes; then
6465       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
6466     fi
6468     if test x$has_extension_module != xno; then
6469         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
6470     fi
6471     
6472     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
6473     
6474     if test "x$test_bcl_opt" = "xyes"; then    
6475       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
6476     fi
6478     echo "STANDALONE_CSC_LOCATION=$CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
6479     echo "SERVER_CSC_LOCATION?=$CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
6480     echo "VBCS_LOCATION?=" >> $srcdir/$mcsdir/build/config.make
6482     if test $csc_compiler = mcs; then
6483       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
6484     fi
6486     if test "x$AOT_BUILD_FLAGS" != "x" ; then
6487       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
6488       echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
6489       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
6490     fi
6492     if test "x$AOT_MODE" != "x" ; then
6493       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
6494     fi
6496     if test "x$enable_btls" = "xyes"; then
6497       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
6498     fi
6500     if test "x$mono_native" = "xyes"; then
6501       echo "MONO_NATIVE_SUPPORTED=true" >> $srcdir/$mcsdir/build/config.make
6502     else
6503       echo "MONO_NATIVE_SUPPORTED=false" >> $srcdir/$mcsdir/build/config.make
6504     fi
6506     if test x$mono_native_compat = xyes; then
6507       echo "MONO_NATIVE_USING_COMPAT=true" >> $srcdir/$mcsdir/build/config.make
6508     else
6509       echo "MONO_NATIVE_USING_COMPAT=false" >> $srcdir/$mcsdir/build/config.make
6510     fi
6512     echo "MONO_NATIVE_PLATFORM_TYPE=$MONO_NATIVE_PLATFORM_TYPE" >> $srcdir/$mcsdir/build/config.make
6513     echo "MONO_NATIVE_PLATFORM=$MONO_NATIVE_PLATFORM" >> $srcdir/$mcsdir/build/config.make
6514     if test x$enable_compiler_server = xyes; then
6515       echo "ENABLE_COMPILER_SERVER?=1" >> $srcdir/$mcsdir/build/config.make
6516     else
6517       echo "ENABLE_COMPILER_SERVER?=0" >> $srcdir/$mcsdir/build/config.make
6518     fi
6519     echo "COMPILER_SERVER_PIPENAME?=monomake" >> $srcdir/$mcsdir/build/config.make
6521   fi
6525 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
6527 btls_platform_string=
6528 if test x$enable_btls = xyes; then
6529         if test x$btls_android = xyes; then
6530                 btls_platform_string=" (android:$BTLS_PLATFORM)"
6531         else
6532                 btls_platform_string=" ($BTLS_PLATFORM)"
6533         fi
6536 thread_suspend_msg=
6537 if test x$buildsgen = xyes; then
6538         if test x$enable_cooperative_suspend != xno; then
6539                 thread_suspend_msg="Suspend:       Cooperative"
6540         elif test x$enable_hybrid_suspend != xno; then
6541                 thread_suspend_msg="Suspend:       Hybrid"
6542         else
6543                 thread_suspend_msg="Suspend:       Preemptive"
6544         fi
6546         
6547 echo "
6548         mcs source:    $mcsdir
6549         C# Compiler:   $csc_compiler
6551    Engine:
6552         Host:          $host
6553         Target:        $target
6554         GC:            $gc_msg 
6555         $thread_suspend_msg
6556         TLS:           $with_tls
6557         SIGALTSTACK:   $with_sigaltstack
6558         Engine:        $jit_status
6559         BigArrays:     $enable_big_arrays
6560         DTrace:        $enable_dtrace
6561         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm, built in-tree: $internal_llvm, assertions: $enable_llvm_asserts, msvc only: $enable_llvm_msvc_only)
6562         Spectre:       $spectre_mitigation_status
6563         Mono.Native:   $mono_native_text
6565    Libraries:
6566         .NET 4.x:        $with_profile4_x
6567         Xamarin.Android: $with_monodroid
6568         Xamarin.iOS:     $with_monotouch
6569         Xamarin.WatchOS: $with_monotouch_watch
6570         Xamarin.TVOS:    $with_monotouch_tv
6571         Xamarin.Mac:     $with_xammac
6572         Windows AOT:     $with_winaot
6573         Orbis:           $with_orbis
6574         Unreal:          $with_unreal
6575         WebAssembly:     $with_wasm
6576         Test profiles:   AOT Full ($with_testing_aot_full), AOT Hybrid ($with_testing_aot_hybrid)
6577         JNI support:     $jdk_headers_found
6578         libgdiplus:      $libgdiplus_msg
6579         zlib:            $zlib_msg
6580         BTLS:            $enable_btls$btls_platform_string
6581         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
6582         crash reporting: $crash_reporting (private crashes: $with_crash_privacy)
6583         .NET Core:       $with_core
6584         $disabled
6586 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
6587    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)