[sdks] Don't package android-sources on Windows
[mono-project.git] / configure.ac
blob2034859bb2498243faf8f4342857fdbb6af5ac45
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 # For the sake of clearer error messages, these numbers should all be different from each other.
1194 INVARIANT_AOT_OPTIONS=nimt-trampolines=2000,ntrampolines=10000,nrgctx-fetch-trampolines=256,ngsharedvt-trampolines=4400,nftnptr-arg-trampolines=4000
1196 AOT_BUILD_ATTRS=$INVARIANT_AOT_OPTIONS
1198 if test x$cross_compiling = xyes -o x$enable_mcs_build = xno; then
1199    DISABLE_MCS_DOCS_default=yes
1200 elif test x$with_runtime_preset = xnetcore; then
1201    DISABLE_MCS_DOCS_default=yes
1203    mono_feature_disable_remoting='yes'
1204    mono_feature_disable_reflection_emit_save='yes'
1205    mono_feature_disable_appdomains='yes'
1206    disable_mono_native=yes
1207 elif test x$with_runtime_preset = xnet_4_x; then
1208    with_profile4_x_default=yes
1209    TEST_PROFILE=net_4_x
1210 elif test x$with_runtime_preset = xall; then
1211    with_profile4_x_default=yes
1212    with_monodroid_default=yes
1213    with_monotouch_default=yes
1214    with_monotouch_watch_default=yes
1215    with_monotouch_tv_default=yes
1216    with_xammac_default=yes
1217    with_winaot_default=yes
1218    with_orbis_default=yes
1219    with_unreal_default=yes
1220    with_wasm_default=yes
1221    with_testing_aot_full_interp_default=yes
1222    with_testing_aot_hybrid_default=yes
1223    with_testing_aot_full_default=yes
1224    TEST_PROFILE=net_4_x
1225 elif test x$with_runtime_preset = xbitcode; then
1226    DISABLE_MCS_DOCS_default=yes
1227    with_testing_aot_full_default=yes
1228    with_bitcode_default=yes
1229    enable_cooperative_suspend_default=yes
1230    # FIXME: use TEST_PROFILE=testing_aot_full
1231    TEST_PROFILE=testing_aot_bitcode
1232    enable_llvm_default=yes
1234    mono_feature_disable_com='yes'
1235    mono_feature_disable_remoting='yes'
1236    mono_feature_disable_reflection_emit_save='yes'
1237    mono_feature_disable_reflection_emit='yes'
1238    mono_feature_disable_appdomains='yes'
1240    # We need at least clang++-6.0 to read the LLVM IR produced by the runtime
1241    AOT_BUILD_FLAGS="--runtime=mobile --aot=llvmonly,clangxx=clang++-6.0,$INVARIANT_AOT_OPTIONS"
1242    AOT_RUN_FLAGS="--runtime=mobile --llvmonly"
1243    AOT_MODE="llvmonly"
1244 elif test x$with_runtime_preset = xbitcodeinterp; then
1245    with_testing_aot_full_interp_default=yes
1246    with_bitcode_default=yes
1247    enable_cooperative_suspend_default=yes
1248    # FIXME: use TEST_PROFILE=testing_aot_full_interp
1249    TEST_PROFILE=testing_aot_bitcode_interp
1250    enable_llvm_default=yes
1252    # mscorlib.dll aot compilation crashes
1253    mono_feature_disable_com='yes'
1255    # We need at least clang++-6.0 to read the LLVM IR produced by the runtime
1256    AOT_BUILD_FLAGS="--aot=llvmonly,interp,clangxx=clang++-6.0,$INVARIANT_AOT_OPTIONS"
1257    AOT_RUN_FLAGS="--llvmonly-interp"
1258 elif test x$with_runtime_preset = xfullaot; then
1259    DISABLE_MCS_DOCS_default=yes
1260    with_testing_aot_full_default=yes
1261    TEST_PROFILE=testing_aot_full
1263    mono_feature_disable_com='yes'
1264    mono_feature_disable_remoting='yes'
1265    mono_feature_disable_reflection_emit_save='yes'
1266    mono_feature_disable_reflection_emit='yes'
1267    mono_feature_disable_appdomains='yes'
1269    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1270    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1271    AOT_MODE="full"
1272 elif test x$with_runtime_preset = xfullaot_llvm; then
1273    DISABLE_MCS_DOCS_default=yes
1274    with_testing_aot_full_default=yes
1275    TEST_PROFILE=testing_aot_full
1277    mono_feature_disable_com='yes'
1278    mono_feature_disable_remoting='yes'
1279    mono_feature_disable_reflection_emit_save='yes'
1280    mono_feature_disable_reflection_emit='yes'
1281    mono_feature_disable_appdomains='yes'
1283    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1284    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1285    AOT_MODE="full"
1286 elif test x$with_runtime_preset = xhybridaot; then
1287    DISABLE_MCS_DOCS_default=yes
1288    with_testing_aot_hybrid_default=yes
1289    TEST_PROFILE=testing_aot_hybrid 
1291    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1292    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1293 elif test x$with_runtime_preset = xhybridaot_llvm; then
1294    DISABLE_MCS_DOCS_default=yes
1295    with_testing_aot_hybrid_default=yes
1296    TEST_PROFILE=testing_aot_hybrid
1298    AOT_BUILD_FLAGS="--runtime=mobile --llvm --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1299    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1300 elif test x$with_runtime_preset = xfullaotinterp; then
1301    with_testing_aot_full_interp_default=yes
1302    TEST_PROFILE=testing_aot_full_interp
1304    # mscorlib.dll aot compilation crashes
1305    mono_feature_disable_com='yes'
1307    AOT_BUILD_FLAGS="--aot=full,interp,$INVARIANT_AOT_OPTIONS"
1308    AOT_RUN_FLAGS="--full-aot-interp"
1309 elif test x$with_runtime_preset = xfullaotinterp_llvm; then
1310    with_testing_aot_full_interp_default=yes
1311    TEST_PROFILE=testing_aot_full_interp_llvm
1313    # mscorlib.dll aot compilation crashes
1314    mono_feature_disable_com='yes'
1316    AOT_BUILD_FLAGS="-O=gsharedvt --llvm --aot=full,interp,$INVARIANT_AOT_OPTIONS"
1317    AOT_RUN_FLAGS="--full-aot-interp"
1318 elif test x$with_runtime_preset = xaot; then
1319    with_profile4_x_default=yes
1321    AOT_BUILD_FLAGS="--aot=$INVARIANT_AOT_OPTIONS"
1322    AOT_RUN_FLAGS=""
1324    DISABLE_MCS_DOCS_default=yes
1325 elif test x$with_runtime_preset = xaot_llvm; then
1326    with_profile4_x_default=yes
1328    AOT_BUILD_FLAGS="--llvm --aot=$INVARIANT_AOT_OPTIONS"
1329    AOT_RUN_FLAGS=""
1331    DISABLE_MCS_DOCS_default=yes
1332 elif test x$with_runtime_preset = xwinaot; then
1333    DISABLE_MCS_DOCS_default=yes
1334    with_winaot_default=yes
1335    TEST_PROFILE=winaot
1337    mono_feature_disable_com='yes'
1338    mono_feature_disable_remoting='yes'
1339    mono_feature_disable_reflection_emit_save='yes'
1340    mono_feature_disable_reflection_emit='yes'
1341    mono_feature_disable_appdomains='yes'
1343    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1344    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1345    AOT_MODE="full"
1346 elif test x$with_runtime_preset = xwinaot_llvm; then
1347    DISABLE_MCS_DOCS_default=yes
1348    with_winaot_default=yes
1349    TEST_PROFILE=winaot
1351    mono_feature_disable_com='yes'
1352    mono_feature_disable_remoting='yes'
1353    mono_feature_disable_reflection_emit_save='yes'
1354    mono_feature_disable_reflection_emit='yes'
1355    mono_feature_disable_appdomains='yes'
1357    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1358    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1359    AOT_MODE="full"
1360 elif test x$with_runtime_preset = xorbis; then
1361    DISABLE_MCS_DOCS_default=yes
1362    with_orbis_default=yes
1363    TEST_PROFILE=orbis
1365    mono_feature_disable_com='yes'
1366    mono_feature_disable_remoting='yes'
1367    mono_feature_disable_reflection_emit_save='yes'
1368    mono_feature_disable_reflection_emit='yes'
1369    mono_feature_disable_appdomains='yes'
1371    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1372    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1373    AOT_MODE="full"
1374 elif test x$with_runtime_preset = xunreal; then
1375    DISABLE_MCS_DOCS_default=yes
1376    with_unreal_default=yes
1377    TEST_PROFILE=unreal
1379    mono_feature_disable_com='yes'
1380    mono_feature_disable_remoting='yes'
1381    mono_feature_disable_appdomains='no'
1383    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1384    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1385 elif test x$with_runtime_preset = xwasm; then
1386    DISABLE_MCS_DOCS_default=yes
1387    with_wasm_default=yes
1388    TEST_PROFILE=wasm
1390    mono_feature_disable_com='yes'
1391    mono_feature_disable_remoting='yes'
1392    mono_feature_disable_reflection_emit_save='yes'
1393    mono_feature_disable_reflection_emit='yes'
1394    mono_feature_disable_appdomains='yes'
1396    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1397    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1398 else
1399    TEST_PROFILE=net_4_x
1400    with_profile4_x_default=yes
1403 if test "x$AOT_BUILD_FLAGS" != "x"; then :
1404    AC_SUBST(AOT_BUILD_FLAGS)
1405    AC_SUBST(AOT_RUN_FLAGS)
1406    # For llvmonlycheck + fullaotcheck
1407    AC_SUBST(INVARIANT_AOT_OPTIONS)
1410 AC_SUBST(TEST_PROFILE)
1412 if test "x$with_profile4_x" = "xdefault"; then
1413    with_profile4_x=$with_profile4_x_default
1415 if test "x$with_monodroid" = "xdefault"; then
1416    with_monodroid=$with_monodroid_default
1418 if test "x$with_monotouch" = "xdefault"; then
1419    with_monotouch=$with_monotouch_default
1421 if test "x$with_monotouch_watch" = "xdefault"; then
1422    with_monotouch_watch=$with_monotouch_watch_default
1424 if test "x$with_monotouch_tv" = "xdefault"; then
1425    with_monotouch_tv=$with_monotouch_tv_default
1427 if test "x$with_bitcode" = "xdefault"; then
1428    with_bitcode=$with_bitcode_default
1430 if test "x$with_xammac" = "xdefault"; then
1431    with_xammac=$with_xammac_default
1433 if test "x$with_testing_aot_full_interp" = "xdefault"; then
1434    with_testing_aot_full_interp=$with_testing_aot_full_interp_default
1436 if test "x$with_testing_aot_hybrid" = "xdefault"; then
1437    with_testing_aot_hybrid=$with_testing_aot_hybrid_default
1439 if test "x$with_testing_aot_full" = "xdefault"; then
1440    with_testing_aot_full=$with_testing_aot_full_default
1442 if test "x$with_winaot" = "xdefault"; then
1443    with_winaot=$with_winaot_default
1445 if test "x$with_orbis" = "xdefault"; then
1446    with_orbis=$with_orbis_default
1448 if test "x$with_unreal" = "xdefault"; then
1449    with_unreal=$with_unreal_default
1451 if test "x$with_wasm" = "xdefault"; then
1452    with_wasm=$with_wasm_default
1456 AM_CONDITIONAL(INSTALL_4_x, [test "x$with_profile4_x" = "xyes"])
1457 AM_CONDITIONAL(INSTALL_MONODROID, [test "x$with_monodroid" != "xno"])
1458 AM_CONDITIONAL(INSTALL_MONOTOUCH, [test "x$with_monotouch" != "xno"])
1459 AM_CONDITIONAL(INSTALL_MONOTOUCH_WATCH, [test "x$with_monotouch_watch" != "xno"])
1460 AM_CONDITIONAL(INSTALL_MONOTOUCH_TV, [test "x$with_monotouch_tv" != "xno"])
1461 AM_CONDITIONAL(BITCODE, test "x$with_bitcode" = "xyes")
1462 AM_CONDITIONAL(INSTALL_XAMMAC, [test "x$with_xammac" != "xno"])
1463 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL_INTERP, [test "x$with_testing_aot_full_interp" != "xno"])
1464 AM_CONDITIONAL(INSTALL_TESTING_AOT_HYBRID, [test "x$with_testing_aot_hybrid" != "xno"])
1465 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL, [test "x$with_testing_aot_full" != "xno"])
1466 AM_CONDITIONAL(INSTALL_WINAOT, [test "x$with_winaot" != "xno"])
1467 AM_CONDITIONAL(INSTALL_ORBIS, [test "x$with_orbis" != "xno"])
1468 AM_CONDITIONAL(INSTALL_UNREAL, [test "x$with_unreal" != "xno"])
1469 AM_CONDITIONAL(INSTALL_WASM, [test "x$with_wasm" != "xno"])
1470 AM_CONDITIONAL(INSTALL_NETCORE, [test "x$with_core" != "xno"])
1471 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"])
1472 AM_CONDITIONAL(HYBRID_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_hybrid"] || [test "x$TEST_PROFILE" = "xunreal"])
1473 AM_CONDITIONAL(AOT_FULL_INTERP_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full_interp"])
1474 AM_CONDITIONAL(AOT_FULL_INTERP_LLVM_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full_interp_llvm"])
1475 AM_CONDITIONAL(DEFAULT_TESTS, [test "x$TEST_PROFILE" = "xnet_4_x"])
1477 default_profile=net_4_x
1478 if test -z "$INSTALL_MONODROID_TRUE"; then :
1479    default_profile=monodroid
1481 if test -z "$INSTALL_MONOTOUCH_TRUE"; then :
1482    default_profile=monotouch
1484 if test -z "$INSTALL_XAMMAC_TRUE"; then :
1485    default_profile=xammac
1487 if test -z "$INSTALL_TESTING_AOT_FULL_INTERP_TRUE"; then :
1488    default_profile=testing_aot_full_interp
1490 if test -z "$INSTALL_TESTING_AOT_HYBRID_TRUE"; then :
1491    default_profile=testing_aot_hybrid
1493 if test -z "$INSTALL_TESTING_AOT_FULL_TRUE"; then :
1494    default_profile=testing_aot_full
1496 if test -z "$INSTALL_WINAOT_TRUE"; then :
1497    default_profile=winaot
1499 if test -z "$INSTALL_ORBIS_TRUE"; then :
1500    default_profile=orbis
1502 if test -z "$INSTALL_UNREAL_TRUE"; then :
1503    default_profile=unreal
1505 if test -z "$INSTALL_WASM_TRUE"; then :
1506    default_profile=wasm
1508 if test -z "$INSTALL_4_x_TRUE"; then :
1509    default_profile=net_4_x
1511 DEFAULT_PROFILE=$default_profile
1512 AC_SUBST(DEFAULT_PROFILE)
1515 # End build profile configuration
1518 if test x$USE_NLS = xprofile_default; then
1520         AC_MSG_CHECKING([NLS used])
1522         # We make the default value for USE_NLS
1523         # "no" on OSX because it isn't available on most
1524         # default OSX installs. The most common configurations will
1525         # all disable it, so this saves us typing.
1526         if test x$host_darwin = xyes; then
1527                 USE_NLS=no;
1528         else
1529                 USE_NLS=yes;
1530         fi
1532         AC_SUBST([USE_NLS])
1533         AC_MSG_RESULT([$USE_NLS])
1536 AC_ARG_ENABLE(static-gcc-libs, [  --enable-static-gcc-libs      Statically link GCC support libs (for MinGW32)])
1537 if test "x$enable_static_gcc_libs" = "xyes"; then
1538         # llvm/build.mk doesn't use automake, so make a regular make variable for it.
1539         AC_SUBST(STATIC_GCC_LIBS,1)
1541 AM_CONDITIONAL(ENABLE_STATIC_GCC_LIBS, test "x$enable_static_gcc_libs" = "xyes")
1543 AC_ARG_ENABLE(minimal, [  --enable-minimal=LIST      drop support for LIST subsystems.
1544      LIST is a comma-separated list from: aot, profiler, decimal, pinvoke, debug, appdomains, verifier, 
1545      reflection_emit, reflection_emit_save, large_code, logging, com, ssa, generics, attach, jit, interpreter, simd, soft_debug, perfcounters, normalization, desktop_loader, shared_perfcounters, remoting,
1546          security, lldb, mdb, assert_messages, cleanup, sgen_marksweep_conc, sgen_split_nursery, sgen_gc_bridge, sgen_debug_helpers, sockets.],
1548         for feature in `echo "$enable_minimal" | sed -e "s/,/ /g"`; do
1549                 eval "mono_feature_disable_$feature='yes'"
1550         done
1551         DISABLED_FEATURES=$enable_minimal
1552         disabled="Disabled:      $enable_minimal"
1553 ],[])
1555 AC_DEFINE_UNQUOTED(DISABLED_FEATURES, "$DISABLED_FEATURES", [String of disabled features])
1557 if test "x$mono_feature_disable_aot" = "xyes"; then
1558         AC_DEFINE(DISABLE_AOT, 1, [Disable AOT Compiler])
1559         enable_system_aot=no
1560         AC_MSG_NOTICE([Disabled AOT compiler])
1563 if test "x$mono_feature_disable_profiler" = "xyes"; then
1564         AC_DEFINE(DISABLE_PROFILER, 1, [Disable default profiler support])
1565         AC_MSG_NOTICE([Disabled support for the profiler])
1567 AM_CONDITIONAL(DISABLE_PROFILER, test x$mono_feature_disable_profiler = xyes)
1569 if test "x$mono_feature_disable_decimal" = "xyes"; then
1570         AC_DEFINE(DISABLE_DECIMAL, 1, [Disable System.Decimal support])
1571         AC_MSG_NOTICE([Disabled support for decimal])
1574 if test "x$mono_feature_disable_pinvoke" = "xyes"; then
1575         AC_DEFINE(DISABLE_PINVOKE, 1, [Disable P/Invoke support])
1576         AC_MSG_NOTICE([Disabled support for P/Invoke])
1579 if test "x$mono_feature_disable_debug" = "xyes"; then
1580         AC_DEFINE(DISABLE_DEBUG, 1, [Disable runtime debugging support])
1581         AC_MSG_NOTICE([Disabled support for runtime debugging])
1584 if test "x$mono_feature_disable_reflection_emit" = "xyes"; then
1585         AC_DEFINE(DISABLE_REFLECTION_EMIT, 1, [Disable reflection emit support])
1586         mono_feature_disable_reflection_emit_save=yes
1587         AC_MSG_NOTICE([Disabled support for Reflection.Emit])
1590 if test "x$mono_feature_disable_reflection_emit_save" = "xyes"; then
1591         AC_DEFINE(DISABLE_REFLECTION_EMIT_SAVE, 1, [Disable assembly saving support in reflection emit])
1592         AC_MSG_NOTICE([Disabled support for Reflection.Emit.Save])
1595 if test "x$mono_feature_disable_large_code" = "xyes"; then
1596         AC_DEFINE(DISABLE_LARGE_CODE, 1, [Disable support for huge assemblies])
1597         AC_MSG_NOTICE([Disabled support for large assemblies])
1600 if test "x$mono_feature_disable_logging" = "xyes"; then
1601         AC_DEFINE(DISABLE_LOGGING, 1, [Disable support debug logging])
1602         AC_MSG_NOTICE([Disabled support for logging])
1605 if test "x$mono_feature_disable_com" = "xyes"; then
1606         AC_DEFINE(DISABLE_COM, 1, [Disable COM support])
1607         AC_MSG_NOTICE([Disabled COM support])
1610 if test "x$mono_feature_disable_ssa" = "xyes"; then
1611         AC_DEFINE(DISABLE_SSA, 1, [Disable advanced SSA JIT optimizations])
1612         AC_MSG_NOTICE([Disabled SSA JIT optimizations])
1615 if test "x$mono_feature_disable_generics" = "xyes"; then
1616         AC_DEFINE(DISABLE_GENERICS, 1, [Disable generics support])
1617         AC_MSG_NOTICE([Disabled Generics Support])
1620 if test "x$mono_feature_disable_shadowcopy" = "xyes"; then
1621         AC_DEFINE(DISABLE_SHADOW_COPY, 1, [Disable Shadow Copy for AppDomains])
1622         AC_MSG_NOTICE([Disabled Shadow copy for AppDomains])
1625 if test "x$mono_feature_disable_portability" = "xyes"; then
1626         AC_DEFINE(DISABLE_PORTABILITY, 1, [Disables the IO portability layer])
1627         AC_MSG_NOTICE([Disabled IO Portability layer])
1630 if test "x$mono_feature_disable_attach" = "xyes"; then
1631         AC_DEFINE(DISABLE_ATTACH, 1, [Disable agent attach support])
1632         AC_MSG_NOTICE([Disabled agent attach])
1635 if test "x$mono_feature_disable_verifier" = "xyes"; then
1636         AC_DEFINE(DISABLE_VERIFIER, 1, [Disables the verifier])
1637         AC_MSG_NOTICE([Disabled the metadata and IL verifiers])
1640 if test "x$mono_feature_disable_jit" = "xyes"; then
1641         AC_DEFINE(DISABLE_JIT, 1, [Disable the JIT, only full-aot mode or interpreter will be supported by the runtime.])
1642         AC_MSG_NOTICE([Disabled the JIT engine, only full AOT or interpreter will be supported])
1645 AM_CONDITIONAL(DISABLE_JIT, test x$mono_feature_disable_jit = xyes)
1647 if test "x$mono_feature_disable_interpreter" = "xyes"; then
1648         AC_DEFINE(DISABLE_INTERPRETER, 1, [Disable the interpreter.])
1649         AC_MSG_NOTICE([Disabled the interpreter])
1652 AM_CONDITIONAL(DISABLE_INTERPRETER, test x$mono_feature_disable_interpreter = xyes)
1654 if test "x$mono_feature_disable_interpreter" != "xyes" -o "x$mono_feature_disable_jit" != "xyes"; then
1655         AC_DEFINE(ENABLE_ILGEN, 1, [Some VES is available at runtime])
1658 AM_CONDITIONAL(ENABLE_ILGEN, test x$mono_feature_disable_interpreter != xyes -o x$mono_feature_disable_jit != xyes)
1660 if test "x$mono_feature_disable_simd" = "xyes"; then
1661         AC_DEFINE(DISABLE_SIMD, 1, [Disable SIMD intrinsics related optimizations.])
1662         AC_MSG_NOTICE([Disabled SIMD support])
1665 if test "x$mono_feature_disable_soft_debug" = "xyes"; then
1666         AC_DEFINE(DISABLE_DEBUGGER_AGENT, 1, [Disable Soft Debugger Agent.])
1667         AC_MSG_NOTICE([Disabled Soft Debugger.])
1670 AM_CONDITIONAL(DISABLE_DEBUGGER_AGENT, test x$mono_feature_disable_debugger_agent = xyes)
1672 if test "x$mono_feature_disable_perfcounters" = "xyes"; then
1673         AC_DEFINE(DISABLE_PERFCOUNTERS, 1, [Disable Performance Counters.])
1674         AC_MSG_NOTICE([Disabled Performance Counters.])
1676 if test "x$mono_feature_disable_normalization" = "xyes"; then
1677         AC_DEFINE(DISABLE_NORMALIZATION, 1, [Disable String normalization support.])
1678         AC_MSG_NOTICE([Disabled String normalization support.])
1681 #TODO: remove assembly_remapping feature name once everyone is using desktop_loader
1682 if test "x$mono_feature_disable_assembly_remapping" = "xyes" || test "x$mono_feature_disable_desktop_loader" = "xyes"; then
1683         AC_DEFINE(DISABLE_DESKTOP_LOADER, 1, [Disable desktop assembly loader semantics.])
1684         AC_MSG_NOTICE([Disabled desktop assembly loader semantics.])
1687 if test "x$mono_feature_disable_shared_perfcounters" = "xyes"; then
1688         AC_DEFINE(DISABLE_SHARED_PERFCOUNTERS, 1, [Disable shared perfcounters.])
1689         AC_MSG_NOTICE([Disabled Shared perfcounters.])
1692 if test "x$mono_feature_disable_appdomains" = "xyes"; then
1693         AC_DEFINE(DISABLE_APPDOMAINS, 1, [Disable support for multiple appdomains.])
1694         AC_MSG_NOTICE([Disabled support for multiple appdomains.])
1697 if test "x$mono_feature_disable_remoting" = "xyes"; then
1698         AC_DEFINE(DISABLE_REMOTING, 1, [Disable remoting support (This disables type proxies and make com non-functional)])
1699         AC_MSG_NOTICE([Disabled remoting])
1702 if test "x$mono_feature_disable_security" = "xyes"; then
1703         AC_DEFINE(DISABLE_SECURITY, 1, [Disable CAS/CoreCLR security])
1704         AC_MSG_NOTICE([Disabled CAS/CoreCLR security manager (used e.g. for Moonlight)])
1707 if test "x$mono_feature_disable_lldb" = "xyes"; then
1708         AC_DEFINE(DISABLE_LLDB, 1, [Disable support code for the LLDB plugin.])
1709         AC_MSG_NOTICE([Disabled LLDB plugin support code.])
1712 if test "x$mono_feature_disable_mdb" = "xyes"; then
1713         AC_DEFINE(DISABLE_MDB, 1, [Disable support for .mdb symbol files.])
1714         AC_MSG_NOTICE([Disabled support for .mdb symbol files.])
1717 if test "x$mono_feature_disable_assert_messages" = "xyes"; then
1718         AC_DEFINE(DISABLE_ASSERT_MESSAGES, 1, [Disable assertion messages.])
1719         AC_MSG_NOTICE([Disabled assertion messages.])
1722 if test "x$mono_feature_disable_cleanup" = "xyes"; then
1723         AC_DEFINE(DISABLE_CLEANUP, 1, [Disable runtime cleanup.])
1724         AC_MSG_NOTICE([Disabled runtime cleanup.])
1727 if test "x$mono_feature_disable_sgen_marksweep_conc" = "xyes"; then
1728         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_CONC, 1, [Disable concurrent gc support in SGEN.])
1729         AC_MSG_NOTICE([Disabled concurrent gc support in SGEN.])
1733 if test "x$mono_feature_disable_sgen_split_nursery" = "xyes"; then
1734         AC_DEFINE(DISABLE_SGEN_SPLIT_NURSERY, 1, [Disable minor=split support in SGEN.])
1735         AC_MSG_NOTICE([Disabled minor=split support in SGEN.])
1738 if test "x$mono_feature_disable_sgen_gc_bridge" = "xyes"; then
1739         AC_DEFINE(DISABLE_SGEN_GC_BRIDGE, 1, [Disable gc bridge support in SGEN.])
1740         AC_MSG_NOTICE([Disabled gc bridge support in SGEN.])
1743 if test "x$mono_feature_disable_sgen_debug_helpers" = "xyes"; then
1744         AC_DEFINE(DISABLE_SGEN_DEBUG_HELPERS, 1, [Disable debug helpers in SGEN.])
1745         AC_MSG_NOTICE([Disabled debug helpers in SGEN.])
1748 if test "x$mono_feature_disable_sockets" = "xyes"; then
1749         AC_DEFINE(DISABLE_SOCKETS, 1, [Disable sockets])
1750         AC_MSG_NOTICE([Disabled sockets])
1753 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
1754 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
1756 has_extension_module=no
1757 AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
1759         for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
1760                 if test x$extension = xdefault ; then
1761                         has_extension_module=yes;
1762                 fi
1763         done
1764         if test x$enable_extension_module = xyes; then
1765                 has_extension_module=yes;
1766         fi
1767 ], [])
1769 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
1771 if test x$has_extension_module != xno ; then
1772         AC_DEFINE([ENABLE_EXTENSION_MODULE], 1, [Extension module enabled])
1773         AC_MSG_NOTICE([Enabling mono extension module.])
1776 # Deprecated
1777 AC_ARG_ENABLE(gsharedvt, [  --enable-gsharedvt Enable generic valuetype sharing (Deprecated)], enable_gsharedvt=$enableval, enable_gsharedvt=no)
1779 AC_MSG_CHECKING(for visibility __attribute__)
1780 AC_COMPILE_IFELSE([
1781         AC_LANG_SOURCE([[
1782                 void __attribute__ ((visibility ("hidden"))) doit (void) {}
1783                 int main () { doit (); return 0; }
1784         ]])
1785 ], [
1786    have_visibility_hidden=yes
1787    AC_MSG_RESULT(yes)
1788 ], [
1789    have_visibility_hidden=no
1790    AC_MSG_RESULT(no)
1794 dnl Boehm GC configuration
1797 AC_ARG_WITH(libgc,   [  --with-libgc=included,none  Controls the Boehm GC config, default=included],[libgc=$with_libgc],[libgc=included])
1799 AC_ARG_ENABLE(boehm, [  --disable-boehm            Disable the Boehm GC.], support_boehm=$enableval,support_boehm=${support_boehm:-yes})
1800 AM_CONDITIONAL(SUPPORT_BOEHM, test x$support_boehm = xyes)
1802 if test "x$support_boehm" = "xyes"; then
1804         AC_ARG_ENABLE(parallel-mark, [  --enable-parallel-mark     Enables Boehm GC Parallel Marking], enable_parallel_mark=$enableval, enable_parallel_mark=$parallel_mark)
1805         if test x$enable_parallel_mark = xyes; then
1806                 libgc_configure_args="$libgc_configure_args --enable-parallel-mark"
1807         fi
1809         gc_msg=""
1810         LIBGC_CPPFLAGS=
1811         LIBGC_LIBS=
1812         LIBGC_STATIC_LIBS=
1813         libgc_dir=
1814         case "x$libgc" in
1815                 xincluded)
1816                         if test "x$support_boehm" = "xyes"; then
1817                                 libgc_dir=libgc
1818                         fi
1820                         LIBGC_CPPFLAGS='-I$(top_srcdir)/libgc/include'
1821                         LIBGC_LIBS='$(top_builddir)/libgc/libmonogc.la'
1822                         LIBGC_STATIC_LIBS='$(top_builddir)/libgc/libmonogc-static.la'
1824                         BOEHM_DEFINES="-DHAVE_BOEHM_GC"
1826                         if test x$target_win32 = xyes; then
1827                                 BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
1828                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
1829                         fi
1831                         gc_msg="Included Boehm GC with typed GC"
1832                         if test x$enable_parallel_mark = xyes; then
1833                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
1834                                 gc_msg="$gc_msg and parallel mark"
1835                         else
1836                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC)", [GC description])
1837                         fi
1838                         ;;
1840                 xboehm|xbohem|xyes)
1841                         AC_MSG_WARN("External Boehm is no longer supported")
1842                         ;;
1844                 xsgen)
1845                         AC_MSG_WARN("Use --with-sgen instead, --with-libgc= controls Boehm configuration")
1846                         ;;
1848                 xnone)
1849                         AC_MSG_WARN("Compiling mono without GC.")
1850                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description])
1851                         AC_DEFINE(HAVE_NULL_GC,1,[No GC support.])
1852                         gc_msg="none"
1853                         ;;
1854                 *)
1855                         AC_MSG_ERROR([Invalid argument $libgc to --with-libgc.])
1856                         ;;
1857         esac
1859         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])
1860         if test "x$large_heap" = "xyes"; then
1861            CPPFLAGS="$CPPFLAGS -DLARGE_CONFIG"
1862         fi
1864         AC_SUBST(LIBGC_CPPFLAGS)
1865         AC_SUBST(LIBGC_LIBS)
1866         AC_SUBST(LIBGC_STATIC_LIBS)
1867         AC_SUBST(libgc_dir)
1868         AC_SUBST(BOEHM_DEFINES)
1871 AM_CONDITIONAL(SUPPORT_NULLGC, test "x$libgc" = "xnone")
1874 dnl End of Boehm GC Configuration
1877 dnl *************************************
1878 dnl *** Checks for zero length arrays ***
1879 dnl *************************************
1880 AC_MSG_CHECKING(whether $CC supports zero length arrays)
1881 AC_TRY_COMPILE([
1882         struct s {
1883                 int  length;
1884                 char data [0];
1885         };
1886 ], [], [
1887         AC_MSG_RESULT(yes)
1888         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 0, [Length of zero length arrays])
1889 ], [
1890         AC_MSG_RESULT(no)
1891         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
1894 dnl ***********************************
1895 dnl *** Checks for signals
1896 dnl ***********************************
1897 AC_CHECK_HEADERS(signal.h)
1898 AC_CHECK_FUNCS(sigaction)
1899 AC_CHECK_FUNCS(kill)
1900 AC_CHECK_FUNCS(signal)
1902 # signal() is declared inline in Android headers
1903 # so we need to workaround it by overriding the check.
1904 if test x$platform_android = xyes; then
1905         AC_DEFINE(HAVE_SIGNAL,1)
1908 # `target_ios=yes` does not detect watch devices and fails when cross-compiling
1909 AC_MONO_APPLE_TARGET(TARGET_OS_IPHONE, [mono_native_platform_ios=yes])
1911 if test x$host_win32 = xno; then
1912         dnl *************************************
1913         dnl *** Checks for time capabilities ***
1914         dnl *************************************
1916         AC_MSG_CHECKING(for CLOCK_MONOTONIC)
1917         AC_TRY_COMPILE([#include <time.h>], [
1918                 const int foo = CLOCK_MONOTONIC;
1919         ],[
1920                 AC_MSG_RESULT(yes)
1921                 AC_DEFINE(HAVE_CLOCK_MONOTONIC, 1, [CLOCK_MONOTONIC])
1922         ], [
1923                 AC_MSG_RESULT(no)
1924         ])
1926         AC_MSG_CHECKING(for CLOCK_MONOTONIC_COARSE)
1927         AC_TRY_COMPILE([#include <time.h>], [
1928                 const int foo = CLOCK_MONOTONIC_COARSE;
1929         ],[
1930                 AC_MSG_RESULT(yes)
1931                 AC_DEFINE(HAVE_CLOCK_MONOTONIC_COARSE, 1, [CLOCK_MONOTONIC_COARSE])
1932         ], [
1933                 AC_MSG_RESULT(no)
1934         ])
1936         AC_MSG_CHECKING(for CLOCK_REALTIME)
1937         AC_TRY_COMPILE([#include <time.h>], [
1938                 const int foo = CLOCK_REALTIME;
1939         ],[
1940                 AC_MSG_RESULT(yes)
1941                 AC_DEFINE(HAVE_CLOCK_REALTIME, 1, [CLOCK_REALTIME])
1942         ], [
1943                 AC_MSG_RESULT(no)
1944         ])
1946         AC_CHECK_FUNC(mach_absolute_time, [AC_DEFINE(HAVE_MACH_ABSOLUTE_TIME, 1, [mach_absolute_time])])
1947         AC_CHECK_FUNC(gethrtime, [AC_DEFINE(HAVE_GETHRTIME, 1, [gethrtime])])
1948         AC_CHECK_FUNC(read_real_time, [AC_DEFINE(HAVE_READ_REAL_TIME, 1, [read_real_time])])
1949         AC_CHECK_FUNC(mach_timebase_info, [AC_DEFINE(HAVE_MACH_TIMEBASE_INFO, 1, [mach_timebase_info])])
1950         AC_CHECK_FUNC(futimes,            [AC_DEFINE(HAVE_FUTIMES, 1, [futimes])])
1951         AC_CHECK_FUNC(futimens,           [AC_DEFINE(HAVE_FUTIMENS, 1, [futimens])])
1953         dnl hires monotonic clock support
1954         AC_SEARCH_LIBS(clock_gettime, rt)
1955         AC_CHECK_FUNCS(clock_nanosleep)
1957         dnl dynamic loader support
1958         AC_CHECK_FUNC(dlopen, DL_LIB="",
1959                 AC_CHECK_LIB(dl, dlopen, DL_LIB="-ldl", dl_support=no)
1960         )
1961         if test x$dl_support = xno; then
1962                 AC_MSG_WARN([No dynamic loading support available])
1963         else
1964                 LIBS="$LIBS $DL_LIB"
1965                 AC_DEFINE(HAVE_DL_LOADER,1,[dlopen-based dynamic loader available])
1966                 dnl from glib's configure.ac
1967                 AC_CACHE_CHECK([for preceeding underscore in symbols],
1968                         mono_cv_uscore,[
1969                         AC_TRY_RUN([#include <dlfcn.h>
1970                         int mono_underscore_test (void) { return 42; }
1971                         int main() {
1972                           void *f1 = (void*)0, *f2 = (void*)0, *handle;
1973                           handle = dlopen ((void*)0, 0);
1974                           if (handle) {
1975                             f1 = dlsym (handle, "mono_underscore_test");
1976                             f2 = dlsym (handle, "_mono_underscore_test");
1977                           } return (!f2 || f1);
1978                         }],
1979                                 [mono_cv_uscore=yes],
1980                                 [mono_cv_uscore=no],
1981                         [])
1982                 ])
1983                 if test "x$mono_cv_uscore" = "xyes"; then
1984                         MONO_DL_NEED_USCORE=1
1985                 else
1986                         MONO_DL_NEED_USCORE=0
1987                 fi
1988                 AC_SUBST(MONO_DL_NEED_USCORE)
1989                 AC_CHECK_FUNC(dlerror)
1990         fi
1992         dnl ******************************************************************
1993         dnl *** Checks for the IKVM JNI interface library                  ***
1994         dnl ******************************************************************
1995         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])
1997         ikvm_native_dir=
1998         if test x$with_ikvm_native = xyes; then
1999                 ikvm_native_dir=ikvm-native
2000                 jdk_headers_found="IKVM Native"
2001         fi
2003         AC_SUBST(ikvm_native_dir)
2005         AC_CHECK_HEADERS(execinfo.h)
2007         AC_CHECK_HEADERS(sys/auxv.h sys/resource.h)
2009         AC_CHECK_FUNCS(getgrgid_r)
2010         AC_CHECK_FUNCS(getgrnam_r)
2011         AC_CHECK_FUNCS(getresuid)
2012         AC_CHECK_FUNCS(setresuid)
2013         AC_CHECK_FUNCS(kqueue)
2014         AC_CHECK_FUNCS(backtrace_symbols)
2015         AC_CHECK_FUNCS(mkstemp)
2016         AC_CHECK_FUNCS(mmap)
2017         AC_CHECK_FUNCS(madvise)
2018         AC_CHECK_FUNCS(getrusage)
2019         AC_CHECK_FUNCS(getpriority)
2020         AC_CHECK_FUNCS(setpriority)
2021         AC_CHECK_FUNCS(dl_iterate_phdr)
2022         AC_CHECK_FUNCS(dladdr)
2023         AC_CHECK_FUNCS(sysconf)
2024         AC_CHECK_FUNCS(getrlimit)
2025         AC_CHECK_FUNCS(prctl)
2026         AC_CHECK_FUNCS(arc4random)
2027         AC_CHECK_FUNCS(nl_langinfo)
2029         AC_CHECK_FUNCS(sched_getaffinity)
2030         AC_CHECK_FUNCS(sched_setaffinity)
2031         AC_CHECK_FUNCS(sched_getcpu)
2033         if test x$platform_android != xyes; then
2034                 AC_CHECK_FUNCS(getpwnam_r)
2035                 AC_CHECK_FUNCS(getpwuid_r)
2036         fi
2038         AC_CHECK_FUNCS(readlink)
2039         AC_CHECK_FUNCS(chmod)
2040         AC_CHECK_FUNCS(lstat)
2041         AC_CHECK_FUNCS(getdtablesize)
2043         AC_CHECK_FUNCS(ftruncate)
2044         AC_CHECK_FUNCS(msync)
2046         AC_CHECK_FUNCS(gethostname getpeername)
2047         AC_CHECK_FUNCS(utime utimes)
2049         AC_CHECK_FUNCS(openlog closelog)
2050         AC_CHECK_FUNCS(atexit)
2052         AC_FUNC_STRERROR_R()
2054         dnl ****************************************************************
2055         dnl *** Check for sched_setaffinity from glibc versions before   ***
2056         dnl *** 2.3.4. The older versions of the function only take 2    ***
2057         dnl *** parameters, not 3.                                       ***
2058         dnl ***                                                          ***
2059         dnl *** Because the interface change was not made in a minor     ***
2060         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
2061         dnl *** won't always indicate the interface sched_affinity has.  ***
2062         dnl ****************************************************************
2063         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
2064         AC_TRY_COMPILE([#include <sched.h>], [
2065             int mask = 1; 
2066             sched_setaffinity(0, &mask);
2067         ], [
2068                 # Yes, we have it...
2069                 AC_MSG_RESULT(yes)
2070                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
2071         ], [
2072                 # We have the new, three-parameter version
2073                 AC_MSG_RESULT(no)
2074         ])
2075         AC_TRY_COMPILE([#include <sched.h>], [
2076              CPU_COUNT((void *) 0);
2077         ], [
2078                 AC_MSG_RESULT(yes)
2079                 AC_DEFINE(GLIBC_HAS_CPU_COUNT, 1, [GLIBC has CPU_COUNT macro in sched.h])
2080         ], [
2081                 # We have the new, three-parameter version
2082                 AC_MSG_RESULT(no)
2083         ])
2085         dnl ******************************************************************
2086         dnl *** Check for large file support                               ***
2087         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
2088         dnl ******************************************************************
2089         
2090         # Check that off_t can represent 2**63 - 1 correctly, working around
2091         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
2092         # CPPFLAGS and sets $large_offt to yes if the test succeeds
2093         large_offt=no
2094         AC_DEFUN([LARGE_FILES], [
2095                 large_CPPFLAGS=$CPPFLAGS
2096                 CPPFLAGS="$CPPFLAGS $1"
2097                 AC_TRY_COMPILE([
2098                         #include <sys/types.h>
2099                         #include <limits.h>
2100                 ], [
2101                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
2102                         #define COMPILE_TIME_ASSERT(pred) \
2103                                 switch(0){case 0:case pred:;}
2104                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
2105                 ], [
2106                         AC_MSG_RESULT(ok)
2107                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
2108                         large_CPPFLAGS="$large_CPPFLAGS $1"
2109                         large_offt=yes
2110                 ], [
2111                         AC_MSG_RESULT(no)
2112                 ])
2113                 CPPFLAGS=$large_CPPFLAGS
2114         ])
2116         AC_MSG_CHECKING(if off_t is 64 bits wide)
2117         LARGE_FILES("")
2118         if test $large_offt = no; then
2119                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
2120                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
2121         fi
2122         if test $large_offt = no; then
2123                 AC_MSG_WARN([No 64 bit file size support available])
2124         fi
2125         
2126         dnl *****************************
2127         dnl *** Checks for libsocket  ***
2128         dnl *****************************
2129         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
2131         case "$host" in
2132                 *-*-*freebsd*)
2133                         dnl *****************************
2134                         dnl *** Checks for libinotify ***
2135                         dnl *****************************
2136                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
2137         esac
2139         dnl *******************************
2140         dnl *** Checks for MSG_NOSIGNAL ***
2141         dnl *******************************
2142         AC_MSG_CHECKING(for MSG_NOSIGNAL)
2143         AC_TRY_COMPILE([#include <sys/socket.h>], [
2144                 int f = MSG_NOSIGNAL;
2145         ], [
2146                 # Yes, we have it...
2147                 AC_MSG_RESULT(yes)
2148                 AC_DEFINE(HAVE_MSG_NOSIGNAL, 1, [Have MSG_NOSIGNAL])
2149         ], [
2150                 # We'll have to use signals
2151                 AC_MSG_RESULT(no)
2152         ])
2154         dnl *****************************
2155         dnl *** Checks for IPPROTO_IP ***
2156         dnl *****************************
2157         AC_MSG_CHECKING(for IPPROTO_IP)
2158         AC_TRY_COMPILE([#include <netinet/in.h>], [
2159                 int level = IPPROTO_IP;
2160         ], [
2161                 # Yes, we have it...
2162                 AC_MSG_RESULT(yes)
2163                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
2164         ], [
2165                 # We'll have to use getprotobyname
2166                 AC_MSG_RESULT(no)
2167         ])
2169         dnl *******************************
2170         dnl *** Checks for IPPROTO_IPV6 ***
2171         dnl *******************************
2172         AC_MSG_CHECKING(for IPPROTO_IPV6)
2173         AC_TRY_COMPILE([#include <netinet/in.h>], [
2174                 int level = IPPROTO_IPV6;
2175         ], [
2176                 # Yes, we have it...
2177                 AC_MSG_RESULT(yes)
2178                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
2179         ], [
2180                 # We'll have to use getprotobyname
2181                 AC_MSG_RESULT(no)
2182         ])
2184         dnl ******************************
2185         dnl *** Checks for IPPROTO_TCP ***
2186         dnl ******************************
2187         AC_MSG_CHECKING(for IPPROTO_TCP)
2188         AC_TRY_COMPILE([#include <netinet/in.h>], [
2189                 int level = IPPROTO_TCP;
2190         ], [
2191                 # Yes, we have it...
2192                 AC_MSG_RESULT(yes)
2193                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
2194         ], [
2195                 # We'll have to use getprotobyname
2196                 AC_MSG_RESULT(no)
2197         ])
2199         dnl *****************************
2200         dnl *** Checks for SOL_IP     ***
2201         dnl *****************************
2202         AC_MSG_CHECKING(for SOL_IP)
2203         AC_TRY_COMPILE([#include <netdb.h>], [
2204                 int level = SOL_IP;
2205         ], [
2206                 # Yes, we have it...
2207                 AC_MSG_RESULT(yes)
2208                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
2209         ], [
2210                 # We'll have to use getprotobyname
2211                 AC_MSG_RESULT(no)
2212         ])
2214         dnl *****************************
2215         dnl *** Checks for SOL_IPV6     ***
2216         dnl *****************************
2217         AC_MSG_CHECKING(for SOL_IPV6)
2218         AC_TRY_COMPILE([#include <netdb.h>], [
2219                 int level = SOL_IPV6;
2220         ], [
2221                 # Yes, we have it...
2222                 AC_MSG_RESULT(yes)
2223                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
2224         ], [
2225                 # We'll have to use getprotobyname
2226                 AC_MSG_RESULT(no)
2227         ])
2229         dnl *****************************
2230         dnl *** Checks for SOL_TCP    ***
2231         dnl *****************************
2232         AC_MSG_CHECKING(for SOL_TCP)
2233         AC_TRY_COMPILE([#include <netdb.h>], [
2234                 int level = SOL_TCP;
2235         ], [
2236                 # Yes, we have it...
2237                 AC_MSG_RESULT(yes)
2238                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
2239         ], [
2240                 # We'll have to use getprotobyname
2241                 AC_MSG_RESULT(no)
2242         ])
2244         dnl *****************************
2245         dnl *** Checks for IP_PKTINFO ***
2246         dnl *****************************
2247         AC_MSG_CHECKING(for IP_PKTINFO)
2248         AC_TRY_COMPILE([#include <linux/in.h>], [
2249                 int level = IP_PKTINFO;
2250         ], [
2251                 # Yes, we have it...
2252                 AC_MSG_RESULT(yes)
2253                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
2254         ], [
2255                 AC_MSG_RESULT(no)
2256         ])
2258         dnl *****************************
2259         dnl *** Checks for IPV6_PKTINFO ***
2260         dnl *****************************
2261         AC_MSG_CHECKING(for IPV6_PKTINFO)
2262         AC_TRY_COMPILE([#include <netdb.h>], [
2263                 int level = IPV6_PKTINFO;
2264         ], [
2265                 # Yes, we have it...
2266                 AC_MSG_RESULT(yes)
2267                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
2268         ], [
2269                 AC_MSG_RESULT(no)
2270         ])
2272         dnl **********************************
2273         dnl *** Checks for IP_DONTFRAG     ***
2274         dnl **********************************
2275         AC_MSG_CHECKING(for IP_DONTFRAG)
2276         AC_TRY_COMPILE([#include <netinet/in.h>], [
2277                 int level = IP_DONTFRAG;
2278         ], [
2279                 # Yes, we have it...
2280                 AC_MSG_RESULT(yes)
2281                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
2282         ], [
2283                 AC_MSG_RESULT(no)
2284         ])
2286         dnl **********************************
2287         dnl *** Checks for IP_DONTFRAGMENT ***
2288         dnl **********************************
2289         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
2290         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
2291                 int level = IP_DONTFRAGMENT;
2292         ], [
2293                 # Yes, we have it...
2294                 AC_MSG_RESULT(yes)
2295                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
2296         ], [
2297                 AC_MSG_RESULT(no)
2298         ])
2300         dnl **********************************
2301         dnl *** Checks for IP_MTU_DISCOVER ***
2302         dnl **********************************
2303         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
2304         AC_TRY_COMPILE([#include <linux/in.h>], [
2305                 int level = IP_MTU_DISCOVER;
2306         ], [
2307                 # Yes, we have it...
2308                 AC_MSG_RESULT(yes)
2309                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
2310         ], [
2311                 AC_MSG_RESULT(no)
2312         ])
2314         dnl **********************************
2315         dnl *** Checks for  IP_PMTUDISC_DO ***
2316         dnl **********************************
2317         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
2318         AC_TRY_COMPILE([#include <linux/in.h>], [
2319                 int level = IP_PMTUDISC_DO;
2320         ], [
2321                 # Yes, we have it...
2322                 AC_MSG_RESULT(yes)
2323                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
2324         ], [
2325                 AC_MSG_RESULT(no)
2326         ])
2328         dnl *********************************
2329         dnl *** Check for struct ip_mreqn ***
2330         dnl *********************************
2331         AC_MSG_CHECKING(for struct ip_mreqn)
2332         AC_TRY_COMPILE([#include <netinet/in.h>], [
2333                 struct ip_mreqn mreq;
2334                 mreq.imr_address.s_addr = 0;
2335         ], [
2336                 # Yes, we have it...
2337                 AC_MSG_RESULT(yes)
2338                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
2339         ], [
2340                 # We'll just have to try and use struct ip_mreq
2341                 AC_MSG_RESULT(no)
2342                 AC_MSG_CHECKING(for struct ip_mreq)
2343                 AC_TRY_COMPILE([#include <netinet/in.h>], [
2344                         struct ip_mreq mreq;
2345                         mreq.imr_interface.s_addr = 0;
2346                 ], [
2347                         # Yes, we have it...
2348                         AC_MSG_RESULT(yes)
2349                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
2350                 ], [
2351                         # No multicast support
2352                         AC_MSG_RESULT(no)
2353                 ])
2354         ])
2355         
2356         dnl **********************************
2357         dnl *** Check for getaddrinfo ***
2358         dnl **********************************
2359         AC_MSG_CHECKING(for getaddrinfo)
2360                 AC_TRY_LINK([
2361                 #include <stdio.h>
2362                 #include <netdb.h>
2363         ], [
2364                 getaddrinfo(NULL,NULL,NULL,NULL);
2365         ], [
2366                 # Yes, we have it...
2367                 AC_MSG_RESULT(yes)
2368                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2369         ], [
2370                 AC_MSG_RESULT(no)
2371         ])
2373         dnl **********************************
2374         dnl *** Check for gethostbyname2_r ***
2375         dnl **********************************
2376         AC_MSG_CHECKING(for gethostbyname2_r)
2377                 AC_TRY_LINK([
2378                 #include <stdio.h>
2379                 #include <netdb.h>
2380         ], [
2382                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
2383         ], [
2384                 # Yes, we have it...
2385                 AC_MSG_RESULT(yes)
2386                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
2387         ], [
2388                 AC_MSG_RESULT(no)
2389         ])
2391         dnl **********************************
2392         dnl *** Check for gethostbyname2 ***
2393         dnl **********************************
2394         AC_MSG_CHECKING(for gethostbyname2)
2395                 AC_TRY_LINK([
2396                 #include <stdio.h>
2397                 #include <netdb.h>
2398         ], [
2399                 gethostbyname2(NULL,0);
2400         ], [
2401                 # Yes, we have it...
2402                 AC_MSG_RESULT(yes)
2403                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
2404         ], [
2405                 AC_MSG_RESULT(no)
2406         ])
2408         dnl **********************************
2409         dnl *** Check for gethostbyname ***
2410         dnl **********************************
2411         AC_MSG_CHECKING(for gethostbyname)
2412                 AC_TRY_LINK([
2413                 #include <stdio.h>
2414                 #include <netdb.h>
2415         ], [
2416                 gethostbyname(NULL);
2417         ], [
2418                 # Yes, we have it...
2419                 AC_MSG_RESULT(yes)
2420                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2421         ], [
2422                 AC_MSG_RESULT(no)
2423         ])
2425         dnl **********************************
2426         dnl *** Check for getprotobyname ***
2427         dnl **********************************
2428         AC_MSG_CHECKING(for getprotobyname)
2429                 AC_TRY_LINK([
2430                 #include <stdio.h>
2431                 #include <netdb.h>
2432         ], [
2433                 getprotobyname(NULL);
2434         ], [
2435                 # Yes, we have it...
2436                 AC_MSG_RESULT(yes)
2437                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2438         ], [
2439                 AC_MSG_RESULT(no)
2440         ])
2442         dnl **********************************
2443         dnl *** Check for getprotobyname_r ***
2444         dnl **********************************
2445         AC_MSG_CHECKING(for getprotobyname_r)
2446                 AC_TRY_LINK([
2447                 #include <stdio.h>
2448                 #include <netdb.h>
2449         ], [
2450                 getprotobyname_r(NULL, NULL, NULL, 0, NULL);
2451         ], [
2452                 # Yes, we have it...
2453                 AC_MSG_RESULT(yes)
2454                 AC_DEFINE(HAVE_GETPROTOBYNAME_R, 1, [Have getprotobyname_r])
2455         ], [
2456                 AC_MSG_RESULT(no)
2457         ])
2459         dnl **********************************
2460         dnl *** Check for getnameinfo ***
2461         dnl **********************************
2462         AC_MSG_CHECKING(for getnameinfo)
2463                 AC_TRY_LINK([
2464                 #include <stdio.h>
2465                 #include <netdb.h>
2466         ], [
2467                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2468         ], [
2469                 # Yes, we have it...
2470                 AC_MSG_RESULT(yes)
2471                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2472         ], [
2473                 AC_MSG_RESULT(no)
2474         ])
2477         dnl **********************************
2478         dnl *** Check for inet_ntop ***
2479         dnl **********************************
2480         AC_MSG_CHECKING(for inet_ntop)
2481                 AC_TRY_LINK([
2482                 #include <stdio.h>
2483                 #include <arpa/inet.h>
2484         ], [
2485                 inet_ntop (0, NULL, NULL, 0);
2486         ], [
2487                 # Yes, we have it...
2488                 AC_MSG_RESULT(yes)
2489                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2490         ], [
2491                 AC_MSG_RESULT(no)
2492         ])
2494         dnl *****************************
2495         dnl *** Checks for libnsl     ***
2496         dnl *****************************
2497         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
2499         AC_CHECK_FUNCS(inet_pton inet_aton)
2501         dnl *****************************
2502         dnl *** Checks for libxnet    ***
2503         dnl *****************************
2504         case "${host}" in
2505                 *solaris* )
2506                         AC_MSG_CHECKING(for Solaris XPG4 support)
2507                         if test -f /usr/lib/libxnet.so; then
2508                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
2509                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
2510                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
2511                                 LIBS="$LIBS -lxnet"
2512                                 AC_MSG_RESULT(yes)
2513                         else
2514                                 AC_MSG_RESULT(no)
2515                         fi
2517                         if test "$GCC" = "yes"; then
2518                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
2519                         fi
2520                 ;;
2521         esac
2523         dnl *****************************
2524         dnl *** Checks for libpthread ***
2525         dnl *****************************
2526 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
2527 # and libpthread does not exist
2529         case "${host}" in
2530                 *-*-*haiku*)
2531                         dnl Haiku has pthread in libroot (libc equiv)
2532                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS")
2533                 ;;
2534                 *-*-*freebsd*)
2535                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2536                 ;;
2537                 *-*-*openbsd*)
2538                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2539                 ;;
2540                 *)
2541                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
2542                 ;;
2543         esac
2544         AC_CHECK_HEADERS(pthread.h)
2545         AC_CHECK_HEADERS(pthread_np.h)
2546         AC_CHECK_FUNCS(pthread_mutex_timedlock)
2547         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_getname_np pthread_setname_np pthread_cond_timedwait_relative_np)
2548         AC_CHECK_FUNCS(pthread_kill)
2549         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
2550         AC_TRY_COMPILE([ #include <pthread.h>], [
2551                 pthread_mutexattr_t attr;
2552                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
2553         ], [
2554                 AC_MSG_RESULT(ok)
2555         ], [
2556                 AC_MSG_RESULT(no)
2557                 AC_ERROR(Posix system lacks support for recursive mutexes)
2558         ])
2559         AC_CHECK_FUNCS(pthread_attr_setstacksize)
2560         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
2561         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
2562         AC_CHECK_FUNCS(mincore mlock munlock)
2564         dnl ***********************************
2565         dnl *** Checks for working __thread ***
2566         dnl ***********************************
2567         AC_MSG_CHECKING(for working __thread)
2568         if test "x$with_tls" != "x__thread"; then
2569                 AC_MSG_RESULT(disabled)
2570         elif test "x$cross_compiling" = "xyes"; then
2571                 AC_MSG_RESULT(cross compiling, assuming yes)
2572         else
2573                 AC_TRY_RUN([
2574                         #if defined(__APPLE__) && defined(__clang__)
2575                         #error "__thread does not currently work with clang on Mac OS X"
2576                         #endif
2577                         
2578                         #include <unistd.h>
2579                         #include <pthread.h>
2580                         __thread int i;
2581                         static int res1, res2;
2583                         void thread_main (void *arg)
2584                         {
2585                                 i = arg;
2586                                 sleep (1);
2587                                 if (arg == 1)
2588                                         res1 = (i == arg);
2589                                 else
2590                                         res2 = (i == arg);
2591                         }
2593                         int main () {
2594                                 pthread_t t1, t2;
2596                                 i = 5;
2598                                 pthread_create (&t1, NULL, thread_main, 1);
2599                                 pthread_create (&t2, NULL, thread_main, 2);
2601                                 pthread_join (t1, NULL);
2602                                 pthread_join (t2, NULL);
2604                                 return !(res1 + res2 == 2);
2605                         }
2606                 ], [
2607                                 AC_MSG_RESULT(yes)
2608                 ], [
2609                                 AC_MSG_RESULT(no)
2610                                 with_tls=pthread
2611                 ])
2612         fi
2614         dnl **************************************
2615         dnl *** Checks for working sigaltstack ***
2616         dnl **************************************
2617         AC_MSG_CHECKING(for working sigaltstack)
2618         if test "x$with_sigaltstack" != "xyes"; then
2619                 AC_MSG_RESULT(disabled)
2620         elif test "x$cross_compiling" = "xyes"; then
2621                 AC_MSG_RESULT(cross compiling, assuming no)
2622                 with_sigaltstack=no
2623         else
2624                 AC_TRY_RUN([
2625                         #include <stdio.h>
2626                         #include <stdlib.h>
2627                         #include <unistd.h>
2628                         #include <signal.h>
2629                         #include <pthread.h>
2630                         #include <sys/wait.h>
2631                         #if defined(__FreeBSD__) || defined(__NetBSD__)
2632                         #define SA_STACK SA_ONSTACK
2633                         #endif
2634                         static void
2635                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
2636                         {
2637                                 exit (0);
2638                         }
2640                         volatile char*__ptr = NULL;
2641                         static void *
2642                         loop (void *ignored)
2643                         {
2644                                 *__ptr = 0;
2645                                 return NULL;
2646                         }
2648                         static void
2649                         child ()
2650                         {
2651                                 struct sigaction sa;
2652                                 stack_t sas;
2653                                 pthread_t id;
2654                                 pthread_attr_t attr;
2656                                 sa.sa_sigaction = sigsegv_signal_handler;
2657                                 sigemptyset (&sa.sa_mask);
2658                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
2659                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
2660                                         perror ("sigaction");
2661                                         return;
2662                                 }
2664                                 /* x86 darwin deliver segfaults using SIGBUS */
2665                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
2666                                         perror ("sigaction");
2667                                         return;
2668                                 }
2669                                 sas.ss_sp = malloc (SIGSTKSZ);
2670                                 sas.ss_size = SIGSTKSZ;
2671                                 sas.ss_flags = 0;
2672                                 if (sigaltstack (&sas, NULL) == -1) {
2673                                         perror ("sigaltstack");
2674                                         return;
2675                                 }
2677                                 pthread_attr_init (&attr);
2678                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
2679                                         printf ("pthread_create\n");
2680                                         return;
2681                                 }
2683                                 sleep (100);
2684                         }
2686                         int
2687                         main ()
2688                         {
2689                                 pid_t son;
2690                                 int status;
2691                                 int i;
2693                                 son = fork ();
2694                                 if (son == -1) {
2695                                         return 1;
2696                                 }
2698                                 if (son == 0) {
2699                                         child ();
2700                                         return 0;
2701                                 }
2703                                 for (i = 0; i < 300; ++i) {
2704                                         waitpid (son, &status, WNOHANG);
2705                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
2706                                                 return 0;
2707                                         usleep (10000);
2708                                 }
2710                                 kill (son, SIGKILL);
2711                                 return 1;
2712                         }
2714                 ], [
2715                                 AC_MSG_RESULT(yes)
2716                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
2717                 ], [
2718                                 with_sigaltstack=no
2719                                 AC_MSG_RESULT(no)
2720                 ])
2721         fi
2723         dnl ********************************
2724         dnl *** Checks for semaphore lib ***
2725         dnl ********************************
2726         # 'Real Time' functions on Solaris
2727         # posix4 on Solaris 2.6
2728         # pthread (first!) on Linux
2729         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
2731         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
2732         AC_CHECK_FUNCS(shm_open)
2734         dnl ********************************
2735         dnl *** Checks for timezone stuff **
2736         dnl ********************************
2737         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
2738                 AC_TRY_COMPILE([
2739                         #include <time.h>
2740                         ], [
2741                         struct tm tm;
2742                         tm.tm_gmtoff = 1;
2743                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
2744         if test $ac_cv_struct_tm_gmtoff = yes; then
2745                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
2746         else
2747                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
2748                         AC_TRY_COMPILE([
2749                                 #include <time.h>
2750                         ], [
2751                                 timezone = 1;
2752                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
2753                 if test $ac_cv_var_timezone = yes; then
2754                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
2755                 else
2756                         AC_ERROR(unable to find a way to determine timezone)
2757                 fi
2758         fi
2760         dnl *********************************
2761         dnl *** Checks for math functions ***
2762         dnl *********************************
2763         AC_SEARCH_LIBS(sqrtf, m)
2765         dnl ****************************************************************
2766         dnl *** Checks for working poll() (macosx defines it but doesn't ***
2767         dnl *** have it in the library (duh))                            ***
2768         dnl ****************************************************************
2769         AC_CHECK_FUNCS(poll)
2771         dnl **********************************
2772         dnl *** epoll                      ***
2773         dnl **********************************
2774         AC_CHECK_HEADERS(sys/epoll.h)
2775         haveepoll=no
2776         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
2777         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
2778                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
2779         fi
2781         havekqueue=no
2783         AC_CHECK_HEADERS(sys/event.h)
2784         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
2786         dnl **************************************
2787         dnl * Darwin has a race that prevents us from using reliably:
2788         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
2789         dnl * Since kqueue is mostly used for scaling large web servers, 
2790         dnl * and very few folks run Mono on large web servers on OSX, falling
2791         dnl * back 
2792         dnl **************************************
2793         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
2794                 if test "x$host_darwin" = "xno"; then
2795                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
2796                 fi
2797         fi
2799         dnl ******************************
2800         dnl *** Checks for SIOCGIFCONF ***
2801         dnl ******************************
2802         AC_CHECK_HEADERS(sys/ioctl.h)
2803         AC_CHECK_HEADERS(net/if.h, [], [],
2804            [
2805            #ifdef HAVE_SYS_TYPES_H
2806            # include <sys/types.h>
2807            #endif
2808            #ifdef HAVE_SYS_SOCKET_H
2809            # include <sys/socket.h>
2810            #endif
2811            ])
2812         AC_MSG_CHECKING(for ifreq)
2813         AC_TRY_COMPILE([
2814                 #include <stdio.h>
2815                 #include <sys/ioctl.h>
2816                 #include <net/if.h>
2817                 ], [
2818                 struct ifconf ifc;
2819                 struct ifreq *ifr;
2820                 void *x;
2821                 ifc.ifc_len = 0;
2822                 ifc.ifc_buf = NULL;
2823                 x = (void *) &ifr->ifr_addr;
2824                 ],[
2825                         AC_MSG_RESULT(yes)
2826                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
2827                 ], [
2828                         AC_MSG_RESULT(no)
2829                 ])
2830         dnl **********************************
2831         dnl ***     Checks for sin_len     ***
2832         dnl **********************************
2833         AC_MSG_CHECKING(for sockaddr_in.sin_len)
2834         AC_TRY_COMPILE([
2835                 #include <netinet/in.h>
2836                 ], [
2837                 struct sockaddr_in saddr;
2838                 saddr.sin_len = sizeof (saddr);
2839                 ],[
2840                         AC_MSG_RESULT(yes)
2841                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
2842                 ], [
2843                         AC_MSG_RESULT(no)
2844                 ])      
2845         dnl **********************************
2846         dnl ***    Checks for sin6_len     ***
2847         dnl **********************************
2848         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
2849         AC_TRY_COMPILE([
2850                 #include <netinet/in.h>
2851                 ], [
2852                 struct sockaddr_in6 saddr6;
2853                 saddr6.sin6_len = sizeof (saddr6);
2854                 ],[
2855                         AC_MSG_RESULT(yes)
2856                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
2857                 ], [
2858                         AC_MSG_RESULT(no)
2859                 ])
2860         dnl **********************************
2861         dnl *** Check for getifaddrs       ***
2862         dnl **********************************
2863         AC_MSG_CHECKING(for getifaddrs)
2864                 AC_TRY_LINK([
2865                 #include <stdio.h>
2866                 #include <sys/types.h>
2867                 #include <sys/socket.h>
2868                 #ifdef HAVE_NET_IF_H
2869                 #include <net/if.h>
2870                 #endif
2871                 #include <ifaddrs.h>
2872         ], [
2873                 getifaddrs(NULL);
2874         ], [
2875                 # Yes, we have it...
2876                 AC_MSG_RESULT(yes)
2877                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
2878         ], [
2879                 AC_MSG_RESULT(no)
2880         ])
2881         dnl **********************************
2882         dnl *** Check for if_nametoindex   ***
2883         dnl **********************************
2884         AC_MSG_CHECKING(for if_nametoindex)
2885                 AC_TRY_LINK([
2886                 #include <stdio.h>
2887                 #include <sys/types.h>
2888                 #include <sys/socket.h>
2889                 #include <net/if.h>
2890         ], [
2891                 if_nametoindex(NULL);
2892         ], [
2893                 # Yes, we have it...
2894                 AC_MSG_RESULT(yes)
2895                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
2896         ], [
2897                 AC_MSG_RESULT(no)
2898         ])
2899         dnl **********************************
2900         dnl *** Check for access ***
2901         dnl **********************************
2902         AC_MSG_CHECKING(for access)
2903                 AC_TRY_LINK([
2904                 #include <unistd.h>
2905         ], [
2906                 access(NULL,0);
2907         ], [
2908                 # Yes, we have it...
2909                 AC_MSG_RESULT(yes)
2910                 AC_DEFINE(HAVE_ACCESS, 1, [Have access])
2911         ], [
2912                 AC_MSG_RESULT(no)
2913         ])
2914                         
2915         dnl **********************************
2916         dnl *** Checks for proclib         ***
2917         dnl **********************************
2918         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.)])
2919         dnl **********************************
2920         dnl *** Checks for MonoPosixHelper ***
2921         dnl **********************************
2922         AC_CHECK_HEADERS(checklist.h)
2923         AC_CHECK_HEADERS(pathconf.h)
2924         AC_CHECK_HEADERS(fstab.h)
2925         AC_CHECK_HEADERS(attr/xattr.h)
2926         AC_CHECK_HEADERS(sys/extattr.h)
2927         AC_CHECK_HEADERS(sys/sendfile.h)
2928         AC_CHECK_HEADERS(sys/statvfs.h)
2929         AC_CHECK_HEADERS(sys/statfs.h)
2930         AC_CHECK_HEADERS(sys/vfstab.h)
2931         AC_CHECK_HEADERS(sys/xattr.h)
2932         AC_CHECK_HEADERS(sys/mman.h)
2933         AC_CHECK_HEADERS(sys/param.h)
2934         AC_CHECK_HEADERS(sys/mount.h, [], [],
2935                 [
2936                 #ifdef HAVE_SYS_PARAM_H
2937                 # include <sys/param.h>
2938                 #endif
2939                 ])
2940         AC_CHECK_HEADERS(sys/mount.h)
2941         AC_CHECK_FUNCS(confstr)
2942         AC_CHECK_FUNCS(seekdir telldir)
2943         AC_CHECK_FUNCS(getdomainname)
2944         AC_CHECK_FUNCS(setdomainname)
2945         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
2946         AC_CHECK_FUNCS(setgroups)
2947         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
2948         AC_CHECK_FUNCS(getfsstat)
2949         AC_CHECK_FUNCS(lutimes futimes)
2950         AC_CHECK_FUNCS(mremap)
2951         AC_CHECK_FUNCS(remap_file_pages)
2952         AC_CHECK_FUNCS(posix_fadvise)
2953         AC_CHECK_FUNCS(posix_fallocate)
2954         AC_CHECK_FUNCS(posix_madvise)
2955         AC_CHECK_FUNCS(vsnprintf)
2956         AC_CHECK_FUNCS(sendfile)
2957         AC_CHECK_FUNCS(gethostid sethostid)
2958         AC_CHECK_FUNCS(sethostname)
2959         AC_CHECK_FUNCS(statfs)
2960         AC_CHECK_FUNCS(fstatfs)
2961         AC_CHECK_FUNCS(statvfs)
2962         AC_CHECK_FUNCS(fstatvfs)
2963         AC_CHECK_FUNCS(stime)
2964         AC_CHECK_FUNCS(ttyname_r)
2965         AC_CHECK_FUNCS(psignal)
2966         AC_CHECK_FUNCS(getlogin_r)
2967         AC_CHECK_FUNCS(lockf)
2968         AC_CHECK_FUNCS(swab)
2969         AC_CHECK_FUNCS(setusershell endusershell)
2970         AC_CHECK_FUNCS(futimens utimensat)
2971         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
2972         AC_CHECK_FUNCS(readv writev preadv pwritev)
2973         AC_CHECK_FUNCS(setpgid)
2974         AC_CHECK_FUNCS(system)
2975         AC_CHECK_FUNCS(fork execv execve)
2976         AC_CHECK_FUNCS(waitpid)
2977         AC_CHECK_FUNCS(accept4)
2978         AC_CHECK_FUNCS(localtime_r)
2979         AC_CHECK_FUNCS(mkdtemp)
2980         AC_CHECK_SIZEOF(size_t)
2981         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
2982                 [#include <sys/types.h>
2983                  #include <sys/stat.h>
2984                  #include <unistd.h>])
2985         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
2986                 [#include <sys/types.h>
2987                  #include <sys/stat.h>
2988                  #include <unistd.h>])
2989         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
2990                 [#include <sys/time.h>])
2991         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
2992                 [#include <sys/socket.h>])
2993         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
2994                 [#include <unistd.h>
2995                  #include <fcntl.h>])
2996         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
2997                 [#include <sys/uio.h>])
2998         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
2999                 [#include <sys/socket.h>])
3000         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
3001                 [#include <sys/poll.h>])
3002         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
3003                 [#include <sys/socket.h>])
3004         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
3005                 [#include <sys/socket.h>])
3006         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
3007                 [#include <netinet/in.h>])
3008         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
3009                 [#include <netinet/in.h>])
3010         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
3011                 [#include <sys/un.h>])
3012         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
3013                 [#include <sys/types.h>
3014                  #include <sys/stat.h>
3015                  #include <unistd.h>])
3016         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
3017                 [#include <time.h>])
3018         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
3019                 [#include <sys/time.h>
3020                  #include <sys/types.h>
3021                  #include <utime.h>])
3022         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
3023                 [#include <sys/time.h>])
3024         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
3025                 [#include <sys/types.h>
3026                  #include <utime.h>])
3027         AC_CHECK_MEMBERS(
3028                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
3029                 [#include <sys/types.h>
3030                  #include <dirent.h>])
3031         AC_CHECK_MEMBERS(
3032                 [struct passwd.pw_gecos],,, 
3033                 [#include <sys/types.h>
3034                  #include <pwd.h>])
3035         AC_CHECK_MEMBERS(
3036                 [struct statfs.f_flags],,, 
3037                 [#include <sys/types.h>
3038                  #include <sys/vfs.h>])
3039         AC_CHECK_MEMBERS(
3040                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
3041                 [#include <sys/types.h>
3042                  #include <sys/stat.h>
3043                  #include <unistd.h>])
3045         dnl Favour xattr through glibc, but use libattr if we have to
3046         AC_CHECK_FUNC(lsetxattr, ,
3047                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
3048         )
3049         AC_SUBST(XATTR_LIB)
3051         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
3052         AC_CHECK_MEMBERS(
3053                 [struct kinfo_proc.kp_proc],,, 
3054                 [#include <sys/types.h>
3055                  #include <sys/param.h>
3056                  #include <sys/sysctl.h>
3057                  #include <sys/proc.h>
3058                  ])
3060         dnl *********************************
3061         dnl *** Checks for Windows compilation ***
3062         dnl *********************************
3063         AC_CHECK_HEADERS(sys/time.h)
3064         AC_CHECK_HEADERS(sys/param.h)
3065         AC_CHECK_HEADERS(dirent.h)
3067         dnl ******************************************
3068         dnl *** Checks for OSX and iOS compilation ***
3069         dnl ******************************************
3070         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
3072         dnl *********************************
3073         dnl *** Check for Console 2.0 I/O ***
3074         dnl *********************************
3075         AC_CHECK_HEADERS([curses.h])
3076         AC_CHECK_HEADERS([term.h], [], [],
3077         [#if HAVE_CURSES_H
3078          #include <curses.h>
3079          #endif
3080         ])
3081         AC_CHECK_HEADERS([termios.h])
3083         dnl *********************************
3084         dnl *** Checks for random         ***
3085         dnl *********************************
3086         if test x$host_darwin = xno; then
3087                 AC_CHECK_HEADERS(sys/random.h)
3088                 AC_CHECK_FUNCS(getrandom getentropy)
3089         fi
3091         dnl *********************************
3092         dnl *** Checks for Mono.Native    ***
3093         dnl *********************************
3095         # Translated from CMake in external/corefx/src/Native/Unix/configure.cmake, keep in sync!
3096         # Note: check_c_source_compiles in CMake is AC_TRY_LINK in autoconf
3098         AC_MSG_CHECKING(for linux/in.h)
3099         AC_TRY_COMPILE([
3100                 #include <sys/socket.h>
3101                 #include <linux/in.h>
3102         ], [
3103         ],[
3104                 AC_MSG_RESULT(yes)
3105                 AC_DEFINE(HAVE_LINUX_IN_H, 1, [linux/in.h])
3106         ], [
3107                 AC_MSG_RESULT(no)
3108         ])
3110         AC_CHECK_HEADERS([linux/if_packet.h])
3112         AC_MSG_CHECKING(for struct in_pktinfo)
3113         AC_TRY_COMPILE([
3114                 #ifdef HAVE_LINUX_IN_H
3115                 #include <sys/socket.h>
3116                 #include <linux/in.h>
3117                 #else
3118                 #include <netinet/in.h>
3119                 #endif
3120         ], [
3121                 struct in_pktinfo pktinfo;
3122         ],[
3123                 AC_MSG_RESULT(yes)
3124                 AC_DEFINE(HAVE_IN_PKTINFO, 1, [struct in_pktinfo])
3125         ], [
3126                 AC_MSG_RESULT(no)
3127         ])
3129         AC_MSG_CHECKING(for struct ip_mreqn)
3130         AC_TRY_COMPILE([
3131                 #if HAVE_LINUX_IN_H
3132                 #include <sys/socket.h>
3133                 #include <linux/in.h>
3134                 #else
3135                 #include <netinet/in.h>
3136                 #endif
3137         ], [
3138                 struct ip_mreqn mreqn;
3139         ],[
3140                 AC_MSG_RESULT(yes)
3141                 AC_DEFINE(HAVE_IP_MREQN, 1, struct ip_mreqn)
3142         ], [
3143                 AC_MSG_RESULT(no)
3144         ])
3146         if test x$host_darwin = xno; then
3147                 AC_CHECK_TYPES([struct flock64], [AC_DEFINE(HAVE_FLOCK64, 1, struct flock64)], , [#include <fcntl.h>])
3148         fi
3150         AC_CHECK_DECL(O_CLOEXEC,         [AC_DEFINE(HAVE_O_CLOEXEC, 1, [O_CLOEXEC])], [], [[#include <fcntl.h>]])
3151         AC_CHECK_DECL(F_DUPFD_CLOEXEC,   [AC_DEFINE(HAVE_F_DUPFD_CLOEXEC, 1, [F_DUPFD_CLOEXEC])], [], [[#include <fcntl.h>]])
3153         # AC_CHECK_FUNC(getifaddrs,           [AC_DEFINE(HAVE_GETIFADDRS, 1, [getifaddrs])]) # already done above
3155         AC_CHECK_FUNC(lseek64,           [AC_DEFINE(HAVE_LSEEK64, 1, [lseek64])])
3156         AC_CHECK_FUNC(mmap64,            [AC_DEFINE(HAVE_MMAP64, 1, [mmap64])])
3157         AC_CHECK_FUNC(ftruncate64,       [AC_DEFINE(HAVE_FTRUNCATE64, 1, [ftruncate64])])
3158         AC_CHECK_FUNC(posix_fadvise64,   [AC_DEFINE(HAVE_POSIX_FADVISE64, 1, [posix_fadvise64])])
3160         if test "x$mono_native_platform_ios" = "xno"; then
3161                 # On iOS, `stat64()` is deprecated and there is no `struct stat64` and `stat()`
3162                 # is either 32-bit or 64-bit based on the device / simulator that you're running on.
3163                 AC_CHECK_FUNC(stat64,            [AC_DEFINE(HAVE_STAT64, 1, [stat64])])
3164         fi
3166         AC_CHECK_DECL(pipe2,             [AC_DEFINE(HAVE_PIPE2, 1, [pipe2])])
3167         AC_CHECK_FUNC(getmntinfo,        [AC_DEFINE(HAVE_GETMNTINFO, 1, [getmntinfo])], [], [[#include <unistd.h>]])
3168         AC_CHECK_FUNC(strcpy_s,          [AC_DEFINE(HAVE_STRCPY_S, 1, [strcpy_s])])
3169         AC_CHECK_FUNC(strlcpy,           [AC_DEFINE(HAVE_STRLCPY, 1, [strlcpy])])
3170         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
3171         AC_CHECK_FUNC(ioctl,             [AC_DEFINE(HAVE_IOCTL, 1, [ioctl])])
3172         AC_CHECK_FUNC(sched_getaffinity, [AC_DEFINE(HAVE_SCHED_GETAFFINITY, 1, [sched_getaffinity])])
3173         AC_CHECK_FUNC(sched_setaffinity, [AC_DEFINE(HAVE_SCHED_SETAFFINITY, 1, [sched_setaffinity])])
3175         if test "x$platform_android" != "xyes"; then
3176                 AC_CHECK_FUNC(arc4random_buf,    [AC_DEFINE(HAVE_ARC4RANDOM_BUF, 1, [arc4random_buf])])
3177         fi
3179         AC_CHECK_DECL(TIOCGWINSZ,        [AC_DEFINE(HAVE_TIOCGWINSZ, 1, [TIOCGWINSZ])], [], [[#include <sys/ioctl.h>]])
3180         AC_CHECK_FUNC(tcgetattr,         [AC_DEFINE(HAVE_TCGETATTR, 1, [tcgetattr])])
3181         AC_CHECK_FUNC(tcsetattr,         [AC_DEFINE(HAVE_TCSETATTR, 1, [tcsetattr])])
3182         AC_CHECK_DECL(ECHO,              [AC_DEFINE(HAVE_ECHO, 1, [ECHO])], [], [[#include <termios.h>]])
3183         AC_CHECK_DECL(ICANON,            [AC_DEFINE(HAVE_ICANON, 1, [ICANON])], [], [[#include <termios.h>]])
3184         AC_CHECK_DECL(TCSANOW,           [AC_DEFINE(HAVE_TCSANOW, 1, [TCSANOW])], [], [[#include <termios.h>]])
3186         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>]])
3187         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>]])
3188         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>]])
3189         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>]])
3190         AC_CHECK_MEMBER(struct dirent.d_namlen,       [AC_DEFINE(HAVE_DIRENT_NAME_LEN, 1, [struct dirent.d_namlen])], [], [[#include <dirent.h>]])
3191         AC_CHECK_MEMBER(struct statfs.f_fstypename,   [AC_DEFINE(HAVE_STATFS_FSTYPENAME, 1, [struct statfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3192         AC_CHECK_MEMBER(struct statvfs.f_fstypename,  [AC_DEFINE(HAVE_STATVFS_FSTYPENAME, 1, [struct statvfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3194         AC_MSG_CHECKING(for struct statfs)
3195         AC_TRY_COMPILE([
3196                 #if defined(HAVE_STATFS_FSTYPENAME) || defined(HAVE_STATVFS_FSTYPENAME)
3197                 #include <sys/mount.h>
3198                 #else
3199                 #include <sys/statfs.h>
3200                 #endif
3201         ], [
3202                 struct statfs;
3203         ],[
3204                 AC_MSG_RESULT(yes)
3205                 AC_DEFINE(HAVE_STATFS, 1, [struct statfs])
3206         ], [
3207                 AC_MSG_RESULT(no)
3208         ])
3210         if test "x$ac_cv_func_strerror_r_char_p" = "xyes" ; then
3211                 AC_DEFINE(HAVE_GNU_STRERROR_R, 1, [char* strerror(int errnum, char *buf, size_t buflen)])
3212         fi
3214         AC_MSG_CHECKING(for readdir_r)
3215         AC_TRY_LINK([
3216                 #include <dirent.h>
3217         ], [
3218                 DIR* dir;
3219                 struct dirent* entry;
3220                 struct dirent* result;
3221                 readdir_r(dir, entry, &result);
3222         ],[
3223                 AC_MSG_RESULT(yes)
3224                 AC_DEFINE(HAVE_READDIR_R, 1, [readdir_r])
3225         ], [
3226                 AC_MSG_RESULT(no)
3227         ])
3229         AC_MSG_CHECKING(for kevent with void *data)
3230         AC_TRY_LINK([
3231                 #include <sys/types.h>
3232                 #include <sys/event.h>
3233         ], [
3234                 struct kevent event;
3235                 void* data;
3236                 EV_SET(&event, 0, EVFILT_READ, 0, 0, 0, data);
3237         ],[
3238                 AC_MSG_RESULT(yes)
3239                 AC_DEFINE(KEVENT_HAS_VOID_UDATA, 1, [kevent with void *data])
3240         ], [
3241                 AC_MSG_RESULT(no)
3242         ])
3244         AC_CHECK_MEMBER(struct fd_set.fds_bits,   [AC_DEFINE(HAVE_FDS_BITS, 1, [struct fd_set.fds_bits])], [], [[#include <sys/select.h>]])
3245         AC_CHECK_MEMBER(struct fd_set.__fds_bits, [AC_DEFINE(HAVE_PRIVATE_FDS_BITS, 1, [struct fd_set.__fds_bits])], [], [[#include <sys/select.h>]])
3247         AC_MSG_CHECKING(for sendfile with 4 arguments)
3248         AC_TRY_LINK([
3249                 #include <sys/sendfile.h>
3250         ], [
3251                 #if defined(TARGET_ANDROID)
3252                 #if !defined(__ANDROID_API__)
3253                 #error No definition for __ANDROID_API__ even though we're targeting TARGET_ANDROID
3254                 #elif __ANDROID_API__ < 21
3255                 #error sendfile is not supported on this Android API level
3256                 #endif
3257                 #endif
3259                 int result = sendfile(0, 0, 0, 0);
3260         ],[
3261                 AC_MSG_RESULT(yes)
3262                 AC_DEFINE(HAVE_SENDFILE_4, 1, [sendfile with 4 arguments])
3263         ], [
3264                 AC_MSG_RESULT(no)
3265         ])
3267         ORIG_CFLAGS="$CFLAGS"
3268         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
3270         AC_MSG_CHECKING(for sendfile with 6 arguments)
3271         AC_TRY_LINK([
3272                 #include <stdlib.h>
3273                 #include <sys/types.h>
3274                 #include <sys/socket.h>
3275                 #include <sys/uio.h>
3276         ], [
3277                 int result = sendfile(0, 0, 0, NULL, NULL, 0);
3278         ],[
3279                 AC_MSG_RESULT(yes)
3280                 AC_DEFINE(HAVE_SENDFILE_6, 1, [sendfile with 6 arguments])
3281         ], [
3282                 AC_MSG_RESULT(no)
3283         ])
3285         CFLAGS="$ORIG_CFLAGS"
3287         AC_CHECK_FUNC(fcopyfile,     [AC_DEFINE(HAVE_FCOPYFILE, 1, [fcopyfile])])
3288         AC_CHECK_FUNC(epoll_create1, [AC_DEFINE(HAVE_EPOLL, 1, [epoll_create1])])
3289         AC_CHECK_FUNC(accept4,       [AC_DEFINE(HAVE_ACCEPT4, 1, [accept4])])
3290         AC_CHECK_FUNC(kqueue,        [AC_DEFINE(HAVE_KQUEUE, 1, [kqueue])])
3292         ORIG_CFLAGS="$CFLAGS"
3293         CFLAGS="$CFLAGS -Werror=sign-conversion"
3295         AC_MSG_CHECKING(for getnameinfo with signed flags)
3296         AC_TRY_LINK([
3297                 #include <sys/types.h>
3298                 #include <netdb.h>
3299         ], [
3300                 const struct sockaddr *addr;
3301                 socklen_t addrlen;
3302                 char *host;
3303                 socklen_t hostlen;
3304                 char *serv;
3305                 socklen_t servlen;
3306                 int flags;
3307                 int result = getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags);
3308         ],[
3309                 AC_MSG_RESULT(yes)
3310                 AC_DEFINE(HAVE_GETNAMEINFO_SIGNED_FLAGS, 1, [getnameinfo with signed flags])
3311         ], [
3312                 AC_MSG_RESULT(no)
3313         ])
3315         CFLAGS="$ORIG_CFLAGS"
3317         if test "x$host_linux" = "xyes"; then
3318                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 1, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3319         else
3320                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 0, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3321         fi
3323         # HAVE_CLOCK_MONOTONIC check already done above
3324         # HAVE_CLOCK_REALTIME check already done above
3325         # HAVE_MACH_ABSOLUTE_TIME check already done above
3326         # HAVE_MACH_TIMEBASE_INFO check already done above
3327         # HAVE_FUTIMES check already done above
3328         # HAVE_FUTIMENS check already done above
3330         ORIG_CFLAGS="$CFLAGS"
3331         CFLAGS="$CFLAGS -Werror=sign-conversion"
3333         AC_MSG_CHECKING(for bind with unsigned addrlen)
3334         AC_TRY_LINK([
3335                 #include <sys/socket.h>
3336         ], [
3337                 int fd;
3338                 struct sockaddr* addr;
3339                 socklen_t addrLen;
3340                 bind(fd, addr, addrLen);
3341         ],[
3342                 AC_MSG_RESULT(yes)
3343                 AC_DEFINE(BIND_ADDRLEN_UNSIGNED, 1, [bind with unsigned addrlen])
3344         ], [
3345                 AC_MSG_RESULT(no)
3346         ])
3348         AC_MSG_CHECKING(for struct ipv6_mreq with unsigned ipv6mr_interface)
3349         AC_TRY_LINK([
3350                 #include <netinet/in.h>
3351                 #include <netinet/tcp.h>
3352         ], [
3353                 struct ipv6_mreq opt;
3354                 unsigned int index = 0;
3355                 opt.ipv6mr_interface = index;
3356         ],[
3357                 AC_MSG_RESULT(yes)
3358                 AC_DEFINE(IPV6MR_INTERFACE_UNSIGNED, 1, [struct ipv6_mreq with unsigned ipv6mr_interface])
3359         ], [
3360                 AC_MSG_RESULT(no)
3361         ])
3363         AC_MSG_CHECKING(for inotify_rm_watch with unsigned wd)
3364         AC_TRY_LINK([
3365                 #include <sys/inotify.h>
3366         ], [
3367                 intptr_t fd;
3368                 uint32_t wd;
3369                 int result = inotify_rm_watch(fd, wd);
3370         ],[
3371                 AC_MSG_RESULT(yes)
3372                 AC_DEFINE(INOTIFY_RM_WATCH_WD_UNSIGNED, 1, [inotify_rm_watch with unsigned wd])
3373         ], [
3374                 AC_MSG_RESULT(no)
3375         ])
3377         CFLAGS="$ORIG_CFLAGS"
3379         AC_MSG_CHECKING(for shm_open that works well enough with mmap)
3380         if test "x$ac_cv_func_shm_open" = "xno" -o "x$ac_cv_func_shm_open_working_with_mmap" = "xno" ; then
3381                 AC_MSG_RESULT(no)
3382         elif test "x$cross_compiling" = "xyes"; then
3383                 AC_MSG_RESULT(cross compiling, assuming yes)
3384                 AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3385         else
3386                 AC_TRY_RUN([
3387                         #include <sys/mman.h>
3388                         #include <fcntl.h>
3389                         #include <unistd.h>
3391                         int main ()
3392                         {
3393                                 int fd = shm_open("/mono_configure_shm_open", O_CREAT | O_RDWR, 0777);
3394                                 if (fd == -1)
3395                                         return -1;
3397                                 shm_unlink("/mono_configure_shm_open");
3399                                 // NOTE: PROT_EXEC and MAP_PRIVATE don't work well with shm_open
3400                                 //       on at least the current version of Mac OS X
3402                                 if (mmap(NULL, 1, PROT_EXEC, MAP_PRIVATE, fd, 0) == MAP_FAILED)
3403                                         return -1;
3405                                 return 0;
3406                         }
3407                 ],[
3408                         AC_MSG_RESULT(yes)
3409                         AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3410                 ], [
3411                         AC_MSG_RESULT(no)
3412                 ])
3413         fi
3415         AC_MSG_CHECKING(for getpriority with int who)
3416         AC_TRY_LINK([
3417                 #include <sys/resource.h>
3418         ], [
3419                 int which;
3420                 int who;
3421                 int result = getpriority(which, who);
3422         ],[
3423                 AC_MSG_RESULT(yes)
3424                 AC_DEFINE(PRIORITY_REQUIRES_INT_WHO, 1, [getpriority with int who])
3425         ], [
3426                 AC_MSG_RESULT(no)
3427         ])
3429         AC_MSG_CHECKING(for kevent with int parameters)
3430         AC_TRY_LINK([
3431                 #include <sys/types.h>
3432                 #include <sys/event.h>
3433         ], [
3434                 int kg;
3435                 const struct kevent* chagelist;
3436                 int nchanges;
3437                 struct kevent* eventlist;
3438                 int nevents;
3439                 const struct timespec* timeout;
3440                 int result = kevent(kg, chagelist, nchanges, eventlist, nevents, timeout);
3441         ],[
3442                 AC_MSG_RESULT(yes)
3443                 AC_DEFINE(KEVENT_REQUIRES_INT_PARAMS, 1, [kevent with int parameters])
3444         ], [
3445                 AC_MSG_RESULT(no)
3446         ])
3448         AC_CHECK_FUNCS(mkstemps)
3449         # AC_CHECK_FUNCS(mkstemp) # already done above
3451         if test "x$ac_cv_func_mkstemps" != "xyes" -a "x$ac_cv_func_mkstemp" != "xyes"; then
3452                 AC_MSG_ERROR([Cannot find mkstemps or mkstemp on this platform])
3453         fi
3455         AC_MSG_CHECKING(for tcp/var.h)
3456         AC_TRY_LINK([
3457                 #include <sys/types.h>
3458                 #include <sys/socketvar.h>
3459                 #include <netinet/ip.h>
3460                 #include <netinet/tcp.h>
3461                 #include <netinet/tcp_var.h>
3462         ], [
3463         ],[
3464                 AC_MSG_RESULT(yes)
3465                 AC_DEFINE(HAVE_TCP_VAR_H, 1, [tcp/var.h])
3466         ], [
3467                 AC_MSG_RESULT(no)
3468         ])
3470         AC_CHECK_HEADERS([sys/cdefs.h])
3472         AC_MSG_CHECKING(for TCPSTATE enum in netinet/tcp.h)
3473         AC_TRY_LINK([
3474                 #ifdef HAVE_SYS_CDEFS_H
3475                 #include <sys/cdefs.h>
3476                 #endif
3477                 #include <netinet/tcp.h>
3478         ], [
3479                 int result = TCP_ESTABLISHED;
3480         ],[
3481                 AC_MSG_RESULT(yes)
3482                 AC_DEFINE(HAVE_TCP_H_TCPSTATE_ENUM, 1, [TCPSTATE enum in netinet/tcp.h])
3483         ], [
3484                 AC_MSG_RESULT(no)
3485         ])
3487         AC_CHECK_DECL(TCPS_ESTABLISHED, [AC_DEFINE(HAVE_TCP_FSM_H, 1, [HAVE_TCP_FSM_H])], [], [[#include <netinet/tcp_fsm.h>]])
3489         AC_MSG_CHECKING(for struct rt_msghdr)
3490         AC_TRY_COMPILE([
3491                 #include <sys/types.h>
3492                 #include <net/route.h>
3493         ], [
3494                 struct rt_msghdr;
3495         ],[
3496                 AC_MSG_RESULT(yes)
3497                 AC_DEFINE(HAVE_RT_MSGHDR, 1, [struct rt_msghdr])
3498         ], [
3499                 AC_MSG_RESULT(no)
3500         ])
3502         AC_CHECK_HEADERS([sys/sysctl.h])
3503         AC_CHECK_HEADERS([linux/rtnetlink.h])
3505         AC_CHECK_FUNC(getpeereid,    [AC_DEFINE(HAVE_GETPEEREID, 1, [getpeereid])])
3506         #AC_CHECK_FUNC(getdomainname, [AC_DEFINE(HAVE_GETDOMAINNAME, 1, [getdomainname])]) # already done above
3507         AC_CHECK_FUNC(uname,         [AC_DEFINE(HAVE_UNAME, 1, [uname])])
3509         ORIG_CFLAGS="$CFLAGS"
3510         CFLAGS="$CFLAGS -Werror=shorten-64-to-32"
3512         AC_MSG_CHECKING(for getdomainname with size_t namelen)
3513         AC_TRY_LINK([
3514                 #include <unistd.h>
3515         ], [
3516                 size_t namelen = 20;
3517                 char name[20];
3518                 int result = getdomainname(name, namelen);
3519         ],[
3520                 AC_MSG_RESULT(yes)
3521                 AC_DEFINE(HAVE_GETDOMAINNAME_SIZET, 1, [getdomainname with size_t namelen])
3522         ], [
3523                 AC_MSG_RESULT(no)
3524         ])
3526         CFLAGS="$ORIG_CFLAGS"
3528         AC_CHECK_FUNC(inotify_init, [AC_DEFINE(HAVE_INOTIFY_INIT, 1, [inotify_init])])
3529         AC_CHECK_FUNC(inotify_add_watch, [AC_DEFINE(HAVE_INOTIFY_ADD_WATCH, 1, [inotify_add_watch])])
3530         AC_CHECK_FUNC(inotify_rm_watch, [AC_DEFINE(HAVE_INOTIFY_RM_WATCH, 1, [inotify_rm_watch])])
3532         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
3533                 AC_DEFINE(HAVE_INOTIFY, 1, [HAVE_INOTIFY])
3534         elif test "x$host_linux" = "xyes"; then
3535                 AC_MSG_ERROR([Cannot find inotify functions on a Linux platform.])
3536         fi
3538         # HAVE_CURLM_ADDED_ALREADY check skipped because we don't use libcurl in mono
3539         # HAVE_CURL_HTTP_VERSION_2TLS check skipped because we don't use libcurl in mono
3540         # HAVE_CURLPIPE_MULTIPLEX check skipped because we don't use libcurl in mono
3541         # HAVE_CURL_SSLVERSION_TLSv1_012 check skipped because we don't use libcurl in mono
3543         enable_gss=no;
3544         AC_MSG_CHECKING(for GSS/GSS.h)
3545         AC_TRY_COMPILE([
3546                         #include <GSS/GSS.h>
3547         ], [
3548         ],[
3549                         AC_MSG_RESULT(yes)
3550                         AC_DEFINE(HAVE_GSSFW_HEADERS, 1, [GSS/GSS.h])
3551                         AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
3552                         enable_gss=yes
3553         ], [
3554                         AC_MSG_RESULT(no)
3555         ])
3557         AC_MSG_CHECKING(for gssapi/gssapi_ext.h)
3558         AC_TRY_COMPILE([
3559                         #include <gssapi/gssapi_ext.h>
3560         ], [
3561         ],[
3562                         AC_MSG_RESULT(yes)
3563                         enable_gss=yes
3564         ], [
3565                         AC_MSG_RESULT(no)
3566         ])
3568         AC_MSG_CHECKING(for GSS_SPNEGO_MECHANISM)
3569         AC_TRY_COMPILE([
3570                         #include <gssapi/gssapi_ext.h>
3571                         #include <gssapi/gssapi_krb5.h>
3572                         gss_OID_set_desc gss_mech_spnego_OID_set_desc = {.count = 1, .elements = GSS_SPNEGO_MECHANISM};
3573         ], [
3574         ],[
3575                         AC_MSG_RESULT(yes)
3576                         AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
3577         ], [
3578                         AC_MSG_RESULT(no)
3579         ])
3581         AM_CONDITIONAL(ENABLE_GSS, test x$enable_gss = xyes)
3583         AC_CHECK_HEADERS([crt_externs.h])
3585         AC_MSG_CHECKING(for _NSGetEnviron)
3586         AC_TRY_LINK([
3587                 #include <crt_externs.h>
3588         ], [
3589                 char **result = *(_NSGetEnviron());
3590         ],[
3591                 AC_MSG_RESULT(yes)
3592                 AC_DEFINE(HAVE_NSGETENVIRON, 1, [_NSGetEnviron])
3593         ], [
3594                 AC_MSG_RESULT(no)
3595         ])
3597         AC_CHECK_DECL(IN_EXCL_UNLINK, [AC_DEFINE(HAVE_IN_EXCL_UNLINK, 1, [IN_EXCL_UNLINK])], [], [[#include <sys/inotify.h>]])
3599         # *** End of Mono.Native checks ***
3600 else
3601         AM_CONDITIONAL(ENABLE_GSS, false)
3603         dnl *********************************
3604         dnl *** Checks for Windows compilation ***
3605         dnl *********************************
3606         AC_CHECK_HEADERS(winternl.h)
3608         jdk_headers_found=no
3609         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
3610         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
3611         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
3612         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
3613         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
3614         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
3615         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
3617         dnl *********************************
3618         dnl *** Check for struct ip_mreqn ***
3619         dnl *********************************
3620         AC_MSG_CHECKING(for struct ip_mreqn)
3621         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3622                 struct ip_mreqn mreq;
3623                 mreq.imr_address.s_addr = 0;
3624         ], [
3625                 # Yes, we have it...
3626                 AC_MSG_RESULT(yes)
3627                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
3628         ], [
3629                 # We'll just have to try and use struct ip_mreq
3630                 AC_MSG_RESULT(no)
3631                 AC_MSG_CHECKING(for struct ip_mreq)
3632                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3633                         struct ip_mreq mreq;
3634                         mreq.imr_interface.s_addr = 0;
3635                 ], [
3636                         # Yes, we have it...
3637                         AC_MSG_RESULT(yes)
3638                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
3639                 ], [
3640                         # No multicast support
3641                         AC_MSG_RESULT(no)
3642                 ])
3643         ])
3645         dnl **********************************
3646         dnl *** Check for getaddrinfo ***
3647         dnl **********************************
3648         AC_MSG_CHECKING(for getaddrinfo)
3649                 AC_TRY_LINK([
3650                 #include <stdio.h>
3651                 #include <winsock2.h>
3652                 #include <ws2tcpip.h>
3653         ], [
3654                 getaddrinfo(NULL,NULL,NULL,NULL);
3655         ], [
3656                 # Yes, we have it...
3657                 AC_MSG_RESULT(yes)
3658                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
3659         ], [
3660                 AC_MSG_RESULT(no)
3661         ])
3663         dnl **********************************
3664         dnl *** Check for gethostbyname ***
3665         dnl **********************************
3666         AC_MSG_CHECKING(for gethostbyname)
3667                 AC_TRY_LINK([
3668                 #include <stdio.h>
3669                 #include <winsock2.h>
3670                 #include <ws2tcpip.h>
3671         ], [
3672                 gethostbyname(NULL);
3673         ], [
3674                 # Yes, we have it...
3675                 AC_MSG_RESULT(yes)
3676                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
3677         ], [
3678                 AC_MSG_RESULT(no)
3679         ])
3681         dnl **********************************
3682         dnl *** Check for getprotobyname ***
3683         dnl **********************************
3684         AC_MSG_CHECKING(for getprotobyname)
3685                 AC_TRY_LINK([
3686                 #include <stdio.h>
3687                 #include <winsock2.h>
3688                 #include <ws2tcpip.h>
3689         ], [
3690                 getprotobyname(NULL);
3691         ], [
3692                 # Yes, we have it...
3693                 AC_MSG_RESULT(yes)
3694                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
3695         ], [
3696                 AC_MSG_RESULT(no)
3697         ])
3699         dnl **********************************
3700         dnl *** Check for getnameinfo ***
3701         dnl **********************************
3702         AC_MSG_CHECKING(for getnameinfo)
3703                 AC_TRY_LINK([
3704                 #include <stdio.h>
3705                 #include <winsock2.h>
3706                 #include <ws2tcpip.h>
3707         ], [
3708                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
3709         ], [
3710                 # Yes, we have it...
3711                 AC_MSG_RESULT(yes)
3712                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
3713         ], [
3714                 AC_MSG_RESULT(no)
3715         ])
3717         dnl **********************************
3718         dnl *** Check for inet_ntop ***
3719         dnl **********************************
3720         AC_MSG_CHECKING(for inet_ntop)
3721                 AC_TRY_LINK([
3722                 #include <stdio.h>
3723                 #include <winsock2.h>
3724                 #include <ws2tcpip.h>
3725         ], [
3726                 inet_ntop (0, NULL, NULL, 0);
3727         ], [
3728                 # Yes, we have it...
3729                 AC_MSG_RESULT(yes)
3730                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
3731         ], [
3732                 AC_MSG_RESULT(no)
3733         ])
3735         dnl **********************************
3736         dnl *** Check for inet_pton ***
3737         dnl **********************************
3738         AC_MSG_CHECKING(for inet_pton)
3739                 AC_TRY_LINK([
3740                 #include <stdio.h>
3741                 #include <winsock2.h>
3742                 #include <ws2tcpip.h>
3743         ], [
3744                 #ifndef inet_pton
3745                 (void) inet_pton;
3746                 #endif
3747                 inet_pton (0, NULL, NULL);
3748         ], [
3749                 # Yes, we have it...
3750                 AC_MSG_RESULT(yes)
3751                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
3752         ], [
3753                 AC_MSG_RESULT(no)
3754         ])
3756         AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
3757         AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
3758         AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
3759         AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
3760         AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
3761         AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
3762         AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
3765 dnl socklen_t check
3766 AC_MSG_CHECKING(for socklen_t)
3767 AC_TRY_COMPILE([
3768 #include <sys/types.h>
3769 #include <sys/socket.h>
3771   socklen_t foo;
3773 ac_cv_c_socklen_t=yes
3774         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
3775         AC_MSG_RESULT(yes)
3777         AC_MSG_RESULT(no)
3780 AC_CHECK_FUNCS(execvp)
3782 dnl ****************************
3783 dnl *** Look for /dev/random ***
3784 dnl ****************************
3786 AC_MSG_CHECKING([if usage of random device is requested])
3787 AC_ARG_ENABLE(dev-random,
3788 [  --disable-dev-random    disable the use of the random device (enabled by default)],
3789 try_dev_random=$enableval, try_dev_random=yes)
3791 AC_MSG_RESULT($try_dev_random)
3793 case "{$build}" in
3795 dnl IBM i does not have /dev/random, use unblocking only
3797     *-*-os400*)
3798     NAME_DEV_RANDOM="/dev/urandom"
3799     ;;
3801 dnl Win32 does not have /dev/random, they have their own method...
3803     *-mingw*|*-*-cygwin*)
3804     ac_cv_have_dev_random=no
3805     ;;
3807 dnl Everywhere else, it's /dev/random
3809     *)
3810     NAME_DEV_RANDOM="/dev/random"
3811     ;;
3812 esac
3814 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
3816 dnl Now check if the device actually exists
3818 if test "x$try_dev_random" = "xyes"; then
3819     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
3820     [if test -r "$NAME_DEV_RANDOM" ; then
3821         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
3822     if test "x$ac_cv_have_dev_random" = "xyes"; then
3823         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
3824     fi
3825 else
3826     AC_MSG_CHECKING(for random device)
3827     ac_cv_have_dev_random=no
3828     AC_MSG_RESULT(has been disabled)
3831 if test "x$host_win32" = "xyes"; then
3832     AC_DEFINE(HAVE_CRYPT_RNG)
3835 if test "x$ac_cv_have_dev_random" = "xno" \
3836     && test "x$host_win32" = "xno"; then
3837     AC_MSG_WARN([[
3839 *** A system-provided entropy source was not found on this system.
3840 *** Because of this, the System.Security.Cryptography random number generator
3841 *** will throw a NotImplemented exception.
3843 *** If you are seeing this message, and you know your system DOES have an
3844 *** entropy collection in place, please report an issue on GitHub and
3845 *** provide information about the system and how to access the random device.
3847 *** Otherwise you can install either egd or prngd and set the environment
3848 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
3849 ***]])
3852 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)
3854 AC_MSG_CHECKING([if big-arrays are to be enabled])
3855 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)
3856 if test "x$enable_big_arrays" = "xyes" ; then
3857     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
3858         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
3859     else
3860         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
3861     fi
3863 AC_MSG_RESULT($enable_big_arrays)
3865 dnl **************
3866 dnl *** DTRACE ***
3867 dnl **************
3869 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
3871 if test "x$enable_dtrace" = "xyes"; then
3872    if test "x$has_dtrace" = "xno"; then
3873           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
3874    fi
3875    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
3876    if test "x$DTRACE" = "xno"; then
3877           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
3878           enable_dtrace=no
3879    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
3880           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
3881           enable_dtrace=no
3882    fi
3885 dtrace_g=no
3886 if test "x$enable_dtrace" = "xyes"; then
3887         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
3888         DTRACEFLAGS=
3889         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3890                 case "$host" in
3891                         powerpc-*-darwin*)
3892                         DTRACEFLAGS="-arch ppc64"
3893                         ;;
3894                         i*86-*-darwin*)
3895                         DTRACEFLAGS="-arch x86_64"
3896                         ;;
3897                         *)
3898                         DTRACEFLAGS=-64
3899                         ;;
3900                 esac
3901         else
3902                 case "$host" in
3903                         powerpc-*-darwin*)
3904                         DTRACEFLAGS="-arch ppc"
3905                         ;;
3906                         i*86-*-darwin*)
3907                         DTRACEFLAGS="-arch i386"
3908                         ;;
3909                         *)
3910                         DTRACEFLAGS=-32
3911                         ;;
3912                 esac
3913         fi
3914         AC_SUBST(DTRACEFLAGS)
3915         case "$host" in
3916                 *-*-solaris*)
3917                 dtrace_g=yes
3918                 ;;
3919         esac
3920         AC_CHECK_HEADERS([sys/sdt.h])
3922 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
3923 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
3925 dnl **************************
3926 dnl *** AOT cross offsets  ***
3927 dnl **************************
3929 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
3930     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
3932 dnl **************
3933 dnl ***  LLVM  ***
3934 dnl **************
3936 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
3937 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
3938 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)
3939 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
3940 AC_ARG_ENABLE(llvm-asserts,[  --enable-llvm-asserts Enable llvm asserts (option to LLVM in CMake)], enable_llvm_asserts=$enableval, enable_llvm_asserts=no)
3942 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
3944 if test "x$enable_llvm" = "xdefault"; then
3945    enable_llvm=$enable_llvm_default
3948 enable_llvm_msvc_only="no"
3949 if test "x$enable_llvm" = "xyes"; then
3950         if test "x$host_win32" = "xyes"; then
3951                 if test "x$cross_compiling" = "xno"; then
3952                         case "$target" in
3953                         x86_64*)
3954                                 AC_MSG_WARN("LLVM for host=Windows and target=Windows is only supported on x64 MSVC builds. Disabling LLVM for GCC build.")
3955                                 enable_llvm_msvc_only="yes"
3956                                 ;;
3957                         i686*)
3958                                 AC_MSG_ERROR("LLVM for host=Windows and target=Windows is only supported for x64 builds.")
3959                                 ;;
3960                         esac
3961                 fi
3962                 if test "x$enable_loadedllvm" = "xyes"; then
3963                         AC_MSG_WARN("Loadable LLVM currently not supported on Windows. Disabling feature.")
3964                         enable_loadedllvm=no
3965                 fi
3966         fi
3969 internal_llvm="no"
3970 if test "x$enable_llvm" = "xyes"; then
3971         if test "x$with_llvm" != "x"; then
3972                 EXTERNAL_LLVM_CONFIG=$with_llvm/bin/llvm-config
3973                 if test x$host_win32 = xyes; then
3974                         EXTERNAL_LLVM_CONFIG=$EXTERNAL_LLVM_CONFIG.exe
3975                 fi
3976                 if test ! -x $EXTERNAL_LLVM_CONFIG; then
3977                         AC_MSG_ERROR([LLVM executable $EXTERNAL_LLVM_CONFIG not found.])
3978                 fi
3979         else
3980                 if test x$host_win32 = xyes; then
3981                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config.exe, no)
3982                 else
3983                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config, no)
3984                 fi
3985                 if test "x$EXTERNAL_LLVM_CONFIG" = "xno"; then
3986                         internal_llvm=yes
3987                 fi
3988         fi
3990         LLVM_CODEGEN_LIBS="x86codegen"
3991         case "$target" in
3992         arm*)
3993                 LLVM_CODEGEN_LIBS="armcodegen"
3994                 ;;
3995         aarch64*)
3996                 LLVM_CODEGEN_LIBS="aarch64codegen"
3997                 ;;
3998         powerpc*)
3999                 LLVM_CODEGEN_LIBS="powerpccodegen"
4000                 ;;
4001         esac
4002         if test "x$host" != "x$target"; then
4003                 # No need for jit libs
4004                 LLVM_CODEGEN_LIBS=
4005         fi
4007         AC_SUBST(LLVM_CODEGEN_LIBS)
4008         AC_SUBST(EXTERNAL_LLVM_CONFIG)
4010         if test "x$host_win32" = "xyes" && test "x$cross_compiling" = "xno" &&  test "x$internal_llvm" = "xno"; then
4011                 EXTERNAL_LLVM_CONFIG_WIN32=$(cygpath -m $EXTERNAL_LLVM_CONFIG)
4012                 AC_SUBST(EXTERNAL_LLVM_CONFIG_WIN32)
4013         fi
4014         if test "x$enable_llvm_msvc_only" != "xyes"; then
4015                 AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
4016         else
4017                 AC_DEFINE(ENABLE_LLVM_MSVC_ONLY, 1, [Enable the LLVM back end])
4018         fi
4019 fi # ENABLE_LLVM
4021 # AC_DEFINE necessary for correct restore behavior on Linux
4022 AM_CONDITIONAL(INTERNAL_LLVM, [test "x$internal_llvm" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
4023 if test "x$internal_llvm" != "xno"; then
4024         if test "x$enable_llvm_msvc_only" != "xyes"; then
4025                 AC_DEFINE(INTERNAL_LLVM, 1, [LLVM used is being build during mono build])
4026         else
4027                 AC_DEFINE(INTERNAL_LLVM_MSVC_ONLY, 1, [LLVM used is being build during mono build])
4028         fi
4031 AM_CONDITIONAL(INTERNAL_LLVM_ASSERTS, [test "x$enable_llvm_asserts" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
4032 if test "x$enable_llvm_asserts" != "xno"; then
4033         if test "x$enable_llvm_msvc_only" != "xyes"; then
4034                 AC_DEFINE(INTERNAL_LLVM_ASSERTS, 1, [Build LLVM with assertions])
4035         else
4036                 AC_DEFINE(INTERNAL_LLVM_ASSERTS_MSVC_ONLY, 1, [Build LLVM with assertions])
4037         fi
4040 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes && test x$enable_llvm_msvc_only != xyes])
4042 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes && test x$enable_llvm_msvc_only != xyes])
4043 if test "x$enable_loadedllvm" = "xyes"; then
4044         if test "x$enable_llvm_msvc_only" != "xyes"; then
4045                 AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
4046         fi
4049 if test "x$enable_llvm" = "xyes"; then
4050         enable_llvm_runtime=yes
4053 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes && test x$enable_llvm_msvc_only != xyes])
4054 if test "x$enable_llvm_runtime" = "xyes"; then
4055         if test "x$enable_llvm_msvc_only" != "xyes"; then
4056                 AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
4057         else
4058                 AC_DEFINE(ENABLE_LLVM_RUNTIME_MSVC_ONLY, 1, [Runtime support code for llvm enabled])
4059         fi
4062 TARGET="unknown"
4063 ACCESS_UNALIGNED="yes"
4065 LIBC="libc.so.6"
4066 INTL="libc.so.6"
4067 SQLITE="libsqlite.so.0"
4068 SQLITE3="libsqlite3.so.0"
4069 X11="libX11.so"
4070 GDKX11="libgdk-x11-2.0.so.0"
4071 GTKX11="libgtk-x11-2.0.so.0"
4072 XINERAMA="libXinerama.so.1"
4074 sizeof_register="SIZEOF_VOID_P"
4076 jit_wanted=true
4077 boehm_supported=true
4078 BTLS_SUPPORTED=no
4079 BTLS_PLATFORM=
4081 case "$host" in
4082         wasm32*)
4083                 TARGET=WASM
4084                 arch_target=wasm
4085                 BTLS_SUPPORTED=no
4086                 ACCESS_UNALIGNED="no"
4087                 with_tls=pthread
4088                 target_wasm=yes
4089                 ;;
4090         mips*)
4091                 TARGET=MIPS;
4092                 arch_target=mips;
4093                 with_tls=pthread;
4094                 ACCESS_UNALIGNED="no"
4096                 AC_MSG_CHECKING(for mips n32)
4097                 AC_TRY_COMPILE([],[
4098                 #if _MIPS_SIM != _ABIN32
4099                 #error Not mips n32
4100                 #endif
4101                 ],[
4102                 AC_MSG_RESULT(yes)
4103                 sizeof_register=8
4104                 ],[
4105                 AC_MSG_RESULT(no)
4106                 ])
4107                 ;;
4108         i*86-*-*)
4109                 TARGET=X86;
4110                 arch_target=x86;
4111                 case $host_os in
4112                   solaris*)
4113                         LIBC="libc.so"
4114                         INTL="libintl.so"
4115                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
4116                                 TARGET=AMD64
4117                                 arch_target=amd64
4118                         fi
4120                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
4121                         # int astruct __attribute__ ((visibility ("hidden")));
4122                         # void foo ()
4123                         # {
4124                         #       void *p = &astruct;
4125                         # }
4126                         # gcc -fPIC --shared -o libfoo.so foo.c
4127                         # yields:
4128                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
4129                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
4130                         have_visibility_hidden=no
4131                         ;;
4132                   mingw*|cygwin*)
4133                         have_visibility_hidden=no
4134                         BTLS_SUPPORTED=no
4135                         BTLS_PLATFORM=i386
4136                         ;;
4137                   haiku*)
4138                         LIBC=libroot.so
4139                         ;;
4140                   linux*)
4141                         AOT_SUPPORTED="yes"
4142                         BTLS_SUPPORTED=yes
4143                         BTLS_PLATFORM=i386
4144                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4145                         ;;
4146                   darwin*)
4147                         AOT_SUPPORTED="yes"
4148                         BTLS_SUPPORTED=yes
4149                         BTLS_PLATFORM=i386
4150                         ;;
4151                   openbsd*|freebsd*|kfreebsd-gnu*)
4152                         AOT_SUPPORTED="yes"
4153                         BTLS_SUPPORTED=yes
4154                         BTLS_PLATFORM=i386
4155                         ;;
4156                 esac
4157                 ;;
4158         x86_64-*-* | amd64-*-*)
4159                 TARGET=AMD64;
4160                 arch_target=amd64;
4161                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
4162                         AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4163                         sizeof_register=8
4164                 fi
4165                 case $host_os in
4166                   linux*)
4167                         AOT_SUPPORTED="yes"
4168                         BTLS_SUPPORTED=yes
4169                         BTLS_PLATFORM=x86_64
4170                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4171                         ;;
4172                   darwin*)
4173                         AOT_SUPPORTED="yes"
4174                         BTLS_SUPPORTED=yes
4175                         BTLS_PLATFORM=x86_64
4176                         boehm_supported=false
4177                         ;;
4178                   openbsd*|freebsd*|kfreebsd-gnu*)
4179                         AOT_SUPPORTED="yes"
4180                         BTLS_SUPPORTED=yes
4181                         BTLS_PLATFORM=x86_64
4182                         ;;
4183                   mingw*|cygwin*)
4184                         BTLS_SUPPORTED=no
4185                         BTLS_PLATFORM=x86_64
4186                         ;;
4187                 esac
4188                 ;;
4189         sparc*-*-*)
4190                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4191                    TARGET=SPARC64
4192                 else
4193                         TARGET=SPARC
4194                 fi
4195                 arch_target=sparc;
4196                 ACCESS_UNALIGNED="no"
4197                 case $host_os in
4198                   linux*) ;;
4199                   *)
4200                         LIBC="libc.so"
4201                         INTL="libintl.so"
4202                 esac
4203                 if test x"$GCC" = xyes; then
4204                         # We don't support v8 cpus
4205                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
4206                 fi
4207                 if test x"$AR" = xfalse; then
4208                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
4209                 fi
4210                 ;;
4211         *-mingw*|*-*-cygwin*)
4212                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
4213                 have_visibility_hidden=no
4214                 INTL="intl"
4215                 case "$host" in
4216                         x86_64*mingw*)
4217                                 # Old Boehm fails to compile for x86_64-mingw.
4218                                 # It is trivial to fix, but just silently drop it.
4219                                 boehm_supported=false
4220                                 ;;
4221                 esac
4222                 ;;
4223         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
4224         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
4225         powerpc-*-freebsd* | powerpc*-*-aix* | powerpc*-*-os400* )
4226                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4227                         TARGET=POWERPC64;
4228                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
4229                         if ! (echo $CC | grep -q -- 'clang'); then
4230                                 CFLAGS="$CFLAGS -mminimal-toc"
4231                         fi
4232                 else
4233                         TARGET=POWERPC;
4234                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
4235                 fi
4236                 arch_target=ppc;
4237                 case $host_os in
4238                   aix*|os400*)
4239                         BTLS_SUPPORTED=yes
4240                         BTLS_PLATFORM=powerpc
4241                         dnl on AIX/PASE, shared libraries can be inside archives
4242                         dnl if they are, we specify them by lib.a(lib.so)
4243                         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX, so
4244                         LIBC="libc.a(shr_64.o)"
4245                         INTL="libintl.a(libintl.so.8)"
4246                         ;;
4247                   linux*)
4248                         BTLS_SUPPORTED=yes
4249                         BTLS_PLATFORM=powerpc
4250                         ;;
4251                 esac
4252                 ;;
4253         armv7k-*-darwin*)
4254                 TARGET=ARM;
4255                 TARGET_SYS=WATCHOS
4256                 arch_target=arm;
4257                 arm_fpu=VFP_HARD
4258                 ACCESS_UNALIGNED="no"
4259                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4260                 ;;
4262         arm*-darwin*)
4263                 TARGET=ARM;
4264                 arch_target=arm;
4265                 ACCESS_UNALIGNED="no"
4266                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4267                 ;;
4268         arm*-linux*)
4269                 TARGET=ARM;
4270                 arch_target=arm;
4271                 ACCESS_UNALIGNED="no"
4272                 AOT_SUPPORTED="yes"
4273                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4274                 BTLS_SUPPORTED=yes
4275                 BTLS_PLATFORM=arm
4276                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4277                 case "$target" in
4278                 arm*-linux*-gnueabi)
4279                         BTLS_PLATFORM=armsoft
4280                         ;;
4281                 esac
4282                 ;;
4283         arm*-netbsd*-eabi*)
4284                 TARGET=ARM;
4285                 arch_target=arm;
4286                 ACCESS_UNALIGNED="no"
4287                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4288                 ;;
4289         aarch64-*darwin*ilp32)
4290                 TARGET=ARM6432
4291                 arch_target=arm64
4292                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4293                 sizeof_register=8
4294                 # assuming no other target other than watchOS is using aarch64*darwin triple
4295                 TARGET_SYS=WATCHOS
4296                 ;;
4297         aarch64-*)
4298                 # https://lkml.org/lkml/2012/7/15/133
4299                 TARGET=ARM64
4300                 arch_target=arm64
4301                 boehm_supported=false
4302                 AOT_SUPPORTED="yes"
4303                 BTLS_SUPPORTED=yes
4304                 BTLS_PLATFORM=aarch64
4305                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4306                 ;;
4307         s390x-*-linux*)
4308                 TARGET=S390X;
4309                 arch_target=s390x;
4310                 ACCESS_UNALIGNED="yes"
4311                 BTLS_SUPPORTED=yes
4312                 BTLS_PLATFORM=s390x
4313                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
4314                 ;;
4315         riscv32-*)
4316                 TARGET=RISCV32
4317                 ACCESS_UNALIGNED=no
4318                 AOT_SUPPORTED=no
4319                 BTLS_SUPPORTED=yes
4320                 BTLS_PLATFORM=riscv32
4321                 arch_target=riscv32
4322                 boehm_supported=false
4323                 ;;
4324         riscv64*)
4325                 TARGET=RISCV64
4326                 ACCESS_UNALIGNED=no
4327                 AOT_SUPPORTED=no
4328                 BTLS_SUPPORTED=yes
4329                 BTLS_PLATFORM=riscv64
4330                 arch_target=riscv64
4331                 boehm_supported=false
4332                 ;;
4333 esac
4335 HOST=$TARGET
4337 if test "x$host" != "x$target"; then
4338    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
4339    enable_mcs_build=no
4340    enable_support_build=no
4341    BTLS_SUPPORTED=no
4342    # Can't use tls, since it depends on the runtime detection of tls offsets
4343    # in mono-compiler.h
4344    with_tls=pthread
4345    target_mach=no
4346    case "$target" in
4347    wasm32*)
4348                 TARGET=WASM
4349                 arch_target=wasm
4350                 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
4351                 ;;
4352    arm*-darwin*)
4353                 TARGET=ARM;
4354                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4355                 case "$target" in
4356                 armv7k-*)
4357                         arm_fpu=VFP_HARD
4358                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
4359                         ;;
4360                 esac            
4361                 ;;
4362    powerpc64-ps3-linux-gnu)
4363                 TARGET=POWERPC64
4364                 arch_target=powerpc64
4365                 AC_DEFINE(TARGET_PS3, 1, [...])
4366                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4367                 # uses this define
4368                 AC_DEFINE(__mono_ppc64__, 1, [...])
4369                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4370                 sizeof_register=8
4371                 target_byte_order=G_BIG_ENDIAN
4372                 ;;
4373    powerpc64-xbox360-linux-gnu)
4374                 TARGET=POWERPC64
4375                 arch_target=powerpc64
4376                 AC_DEFINE(TARGET_XBOX360, 1, [...])
4377                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4378                 # uses this define
4379                 sizeof_register=8
4380                 target_byte_order=G_BIG_ENDIAN
4381                 ;;
4382    arm*-linux-*)
4383                 TARGET=ARM;
4384                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4385                 ;;
4386    arm*-netbsd*-eabi*)
4387                 TARGET=ARM;
4388                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4389                 ;;
4390    i686*-linux-*)
4391                 TARGET=X86;
4392                 ;;
4393    i*86-apple-*)
4394                 TARGET=X86;
4395                 ;;
4396    x86_64*-linux-*)
4397                 TARGET=AMD64;
4398                 ;;
4399    x86_64-ps4-freebsd)
4400                 TARGET=AMD64;
4401                 AC_DEFINE(TARGET_PS4, 1, [...])
4402                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
4403                 CPPFLAGS="$CPPFLAGS"
4404                 target_win32=no
4405                 ;;
4406         aarch64*darwin*_ilp32)
4407                 TARGET=ARM6432;
4408                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4409                 AC_DEFINE(TARGET_WATCHOS, 1, [...])
4410                 ;;
4411         aarch64-*)
4412                 TARGET=ARM64
4413                 ;;
4414         riscv32*)
4415                 TARGET=RISCV32
4416                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4417                 AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4418                 arch_target=riscv32
4419                 target_mach=no
4420                 with_tls=pthread
4421                 ;;
4422         riscv64*)
4423                 TARGET=RISCV64
4424                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4425                 AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4426                 arch_target=riscv64
4427                 target_mach=no
4428                 with_tls=pthread
4429                 ;;
4430         *)
4431                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
4432         esac
4434         case "$target" in
4435         *-darwin*)
4436                 target_mach=yes
4437                 ;;
4438         *-linux-android*)
4439                 AC_DEFINE(TARGET_ANDROID, 1, [...])
4440                 ;;
4441         esac
4444 case "$TARGET" in
4445 WASM)
4446         AC_DEFINE(TARGET_WASM, 1, [...])
4447         arch_target=wasm
4448         ;;
4449 X86)
4450         AC_DEFINE(TARGET_X86, 1, [...])
4451         arch_target=x86
4452         ;;
4453 AMD64)
4454         AC_DEFINE(TARGET_AMD64, 1, [...])
4455         arch_target=amd64
4456         ;;
4457 ARM)
4458         AC_DEFINE(TARGET_ARM, 1, [...])
4459         arch_target=arm
4460         ACCESS_UNALIGNED="no"
4461         ;;
4462 ARM64|ARM6432)
4463         AC_DEFINE(TARGET_ARM64, 1, [...])
4464         arch_target=arm64
4465         ;;
4466 POWERPC)
4467         AC_DEFINE(TARGET_POWERPC, 1, [...])
4468         ;;
4469 POWERPC64)
4470         AC_DEFINE(TARGET_POWERPC, 1, [...])
4471         AC_DEFINE(TARGET_POWERPC64, 1, [...])
4472         ;;
4473 S390X)
4474         AC_DEFINE(TARGET_S390X, 1, [...])
4475         ;;
4476 MIPS)
4477         AC_DEFINE(TARGET_MIPS, 1, [...])
4478         ;;
4479 SPARC)
4480         AC_DEFINE(TARGET_SPARC, 1, [...])
4481         ;;
4482 SPARC64)
4483         AC_DEFINE(TARGET_SPARC64, 1, [...])
4484         ;;
4485 RISCV32)
4486         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4487         AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4488         ;;
4489 RISCV64)
4490         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4491         AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4492         ;;
4493 esac
4495 case "$TARGET" in
4496 *32* | ARM | X86 | POWERPC | MIPS | SPARC | WASM | ARM6432)
4497     target_sizeof_void_p=4
4498     ;;
4499 *64* | S390X)
4500     target_sizeof_void_p=8
4501     ;;
4503     AC_MSG_ERROR([unknown target])
4504     ;;
4505 esac
4507 case "$HOST" in
4508 WASM)
4509         AC_DEFINE(HOST_WASM, 1, [...])
4510         ;;
4511 X86)
4512         AC_DEFINE(HOST_X86, 1, [...])
4513         ;;
4514 AMD64)
4515         AC_DEFINE(HOST_AMD64, 1, [...])
4516         ;;
4517 ARM)
4518         AC_DEFINE(HOST_ARM, 1, [...])
4519         ;;
4520 ARM64)
4521         AC_DEFINE(HOST_ARM64, 1, [...])
4522         ;;
4523 POWERPC)
4524         AC_DEFINE(HOST_POWERPC, 1, [...])
4525         ;;
4526 POWERPC64)
4527         AC_DEFINE(HOST_POWERPC, 1, [...])
4528         AC_DEFINE(HOST_POWERPC64, 1, [...])
4529         ;;
4530 S390X)
4531         AC_DEFINE(HOST_S390X, 1, [...])
4532         ;;
4533 MIPS)
4534         AC_DEFINE(HOST_MIPS, 1, [...])
4535         ;;
4536 SPARC)
4537         AC_DEFINE(HOST_SPARC, 1, [...])
4538         ;;
4539 SPARC64)
4540         AC_DEFINE(HOST_SPARC64, 1, [...])
4541         ;;
4542 RISCV32)
4543         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4544         AC_DEFINE([HOST_RISCV32], [1], [Host is 32-bit RISC-V])
4545         ;;
4546 RISCV64)
4547         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4548         AC_DEFINE([HOST_RISCV64], [1], [Host is 64-bit RISC-V])
4549         ;;
4550 esac
4552 MONO_ARCH_GSHAREDVT_SUPPORTED=0
4553 case "$HOST" in
4554 X86 | AMD64 | ARM | ARM64)
4555         MONO_ARCH_GSHAREDVT_SUPPORTED=1 # keep in sync with mini-{x86,amd64,arm,arm64}.h
4556         ;;
4557 esac
4559 AM_CONDITIONAL(MONO_ARCH_GSHAREDVT_SUPPORTED, test $MONO_ARCH_GSHAREDVT_SUPPORTED = 1)
4560 AM_CONDITIONAL(TARGET_WASM, test $arch_target = wasm)
4562 dnl *************
4563 dnl *** VTUNE ***
4564 dnl *************
4566 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
4567 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
4569 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
4571 if test "x$enable_vtune" = "xyes"; then
4572         if test "x$with_vtune" = "x"; then
4573                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
4574         else
4575                 VTUNE_PATH=$with_vtune
4576         fi
4577         VTUNE_INCLUDE=$VTUNE_PATH/include
4578         case "$TARGET" in
4579         X86)
4580                 VTUNE_LIB=$VTUNE_PATH/lib32
4581                 ;;
4582         AMD64)
4583                 VTUNE_LIB=$VTUNE_PATH/lib64
4584                 ;;
4585         *)
4586                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
4587                 ;;
4588         esac
4589         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
4590                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
4591         fi
4592         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
4593                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
4594         fi
4596         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
4597         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
4599         AC_SUBST(VTUNE_LIBS)
4600         AC_SUBST(VTUNE_CFLAGS)
4602 dnl Use GCC atomic ops if they work on the target.
4603 if test x$GCC = "xyes"; then
4604         case $TARGET in
4605         X86 | AMD64 | ARM | ARM64 | ARM6432 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64 | RISCV32 | RISCV64)
4606                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
4607                 ;;
4608         esac
4611 if test "x$target_mach" = "xyes"; then
4613    if test "x$TARGET_SYS" = "xWATCHOS"; then
4614           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
4615           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4616           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4617           BTLS_SUPPORTED=no
4618    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64" -o "x$TARGET" = "xARM6432"; then
4619           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4620           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4621           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4622           BTLS_SUPPORTED=no
4623           target_ios=yes
4624    else
4625        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
4626        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
4627        #error fail this for ios
4628        #endif
4629        ], [
4630                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
4631           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
4632           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
4633           target_osx=yes
4634        ], [
4635           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4636           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4637           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4638           BTLS_SUPPORTED=no
4639                   target_ios=yes
4640        ])
4641         fi
4642    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
4645 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
4647 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
4649 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
4650    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
4651 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
4652    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
4653 else
4654    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
4657 AC_DEFINE_UNQUOTED(TARGET_SIZEOF_VOID_P,${target_sizeof_void_p},[wordsize of target])
4659 if test "x$sizeof_register" = "x4"; then
4660   AC_DEFINE(SIZEOF_REGISTER,4,[size of target machine integer registers])
4661 elif test "x$sizeof_register" = "x8"; then
4662   AC_DEFINE(SIZEOF_REGISTER,8,[size of target machine integer registers])
4663 else
4664   AC_DEFINE_UNQUOTED(SIZEOF_REGISTER,${target_sizeof_void_p},[size of target machine integer registers])
4667 if test "x$have_visibility_hidden" = "xyes"; then
4668    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
4671 if test "x$have_deprecated" = "xyes"; then
4672    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
4675 dnl 
4676 dnl Simple Generational checks (sgen)
4678 SGEN_DEFINES=
4679 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
4680 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
4681 if test x$buildsgen = xyes; then
4682    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
4683    SGEN_DEFINES="-DHAVE_SGEN_GC"
4685         conc_gc_msg=""
4686    if test x$with_sgen_default_concurrent != xno; then
4687        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
4688            conc_gc_msg=" (concurrent by default)"
4689    fi
4691    if test "x$gc_msg" = "x"; then
4692       gc_msg="sgen$conc_gc_msg"
4693    else
4694       gc_msg="sgen$conc_gc_msg and $gc_msg"
4695    fi
4697 AC_SUBST(SGEN_DEFINES)
4698 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
4700 jit_status="Building and using the JIT"
4702 libsuffix=".so"
4704 case "$host" in
4705      *-*-darwin*)
4706         libsuffix=".dylib"
4707         LIBC="libc.dylib"
4708         INTL="libintl.dylib"
4709         SQLITE="libsqlite.0.dylib"
4710         SQLITE3="libsqlite3.0.dylib"
4711         X11="libX11.dylib"
4712         GDKX11="libgdk-x11-2.0.dylib"
4713         GTKX11="libgtk-x11-2.0.dylib"
4714         ;;
4715      *-*-*netbsd*)
4716         LIBC="libc.so"
4717         INTL="libintl.so"
4718         SQLITE="libsqlite.so"
4719         SQLITE3="libsqlite3.so"
4720         ;;
4721      *-*-kfreebsd*-gnu)
4722         LIBC="libc.so.0.1"
4723         INTL="libc.so.0.1"
4724         X11="libX11.so.6"
4725         ;;
4726     *-*-*freebsd*)
4727         LIBC="libc.so.7"
4728         INTL="libintl.so"
4729         SQLITE="libsqlite.so"
4730         SQLITE3="libsqlite3.so"
4731         ;;
4732     *-*-*openbsd*)
4733         LIBC="libc.so"
4734         INTL="libintl.so"
4735         SQLITE="libsqlite.so"
4736         SQLITE3="libsqlite3.so"
4737         ;;
4738     *-*-*linux*)
4739         AC_PATH_X
4740         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
4741         AC_MSG_CHECKING(for the soname of libX11.so)
4742         for i in $x_libraries $dlsearch_path; do
4743                 for r in 4 5 6; do
4744                         if test -f $i/libX11.so.$r; then
4745                                 X11=libX11.so.$r
4746                                 AC_MSG_RESULT($X11)
4747                         fi
4748                 done
4749         done
4750         
4751         if test "x$X11" = "xlibX11.so"; then
4752                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
4753                 X11=libX11.so.6
4754         fi
4755         ;;
4756 esac
4758 AC_SUBST(libsuffix)
4760 ######################################
4761 # EGLIB CHECKS
4762 ######################################
4764 GNUC_PRETTY=
4765 GNUC_UNUSED=
4766 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
4767 if test x$GCC = xyes; then
4768    GNUC_UNUSED='__attribute__((__unused__))'
4769    GNUC_NORETURN='__attribute__((__noreturn__))'
4770    case $host_cpu in
4771      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
4772    esac
4774 AC_SUBST(GNUC_PRETTY)
4775 AC_SUBST(GNUC_UNUSED)
4776 AC_SUBST(GNUC_NORETURN)
4777 AC_SUBST(BREAKPOINT)
4779 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
4781 case $host in
4782 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
4783     PATHSEP='\\'
4784     SEARCHSEP=';'
4785     OS="WIN32"
4786     PIDTYPE='void *'
4787     ;;
4789     PATHSEP='/'
4790     SEARCHSEP=':'
4791     OS="UNIX"
4792     PIDTYPE='int'
4793     ;;
4794 esac
4796 case $host in
4797         *-*-solaris*)
4798         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
4799         ;;
4800 esac
4802 case $target in
4803 arm*-darwin*|aarch64*-*|riscv*)
4804     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
4805     ;;
4806 i*86-*-darwin*)
4807     ORDER=G_LITTLE_ENDIAN
4808     ;;
4809 *-*-haiku*)
4810     LDFLAGS="$LDFLAGS -ltextencoding"
4811     ;;
4812 *-*-openbsd*)
4813     CFLAGS="$CFLAGS -pthread"
4814     LDFLAGS="$LDFLAGS -pthread"
4815     ;;
4816 esac
4818 AC_SUBST(ORDER)
4819 AC_SUBST(PATHSEP)
4820 AC_SUBST(SEARCHSEP)
4821 AC_SUBST(OS)
4822 AC_SUBST(PIDTYPE)
4824 # Defined for all targets/platforms using classic Windows API support.
4825 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
4826 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
4828 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf)
4829 AC_CHECK_FUNCS(getrlimit)
4830 AC_CHECK_FUNCS(fork execv execve)
4831 AC_CHECK_FUNCS(waitpid)
4833 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
4835 if test x$with_overridable_allocators = xyes; then
4836         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
4837   AC_MSG_NOTICE([Overridable allocator support enabled])
4838 else
4839   AC_MSG_NOTICE([Overridable allocator support disabled])
4843 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
4844 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
4845 # removed once support for 10.6 is dropped.
4847 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
4849 if test x$target_osx = xyes; then
4850 AC_CHECK_FUNCS(getpwuid_r)
4851 elif test x$target_ios = xno; then
4852 AC_CHECK_FUNCS(strndup getpwuid_r)
4855 AC_SEARCH_LIBS(sqrtf, m)
4857 # nanosleep may not be part of libc, also search it in other libraries
4858 AC_SEARCH_LIBS(nanosleep, rt)
4860 AC_SEARCH_LIBS(dlopen, dl)
4861 old_ldflags="${LDFLAGS}"
4862 # GNU specific option, this confuses IBM ld, but do offer alternatives when possible
4863 if test $lt_cv_prog_gnu_ld = yes; then
4864         LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4865 else
4866         case $host in
4867         *-*-aix*|*-*-os400*)
4868                 ;;
4869         *)
4870                 dnl Try to use export-dynamic anyways
4871                 LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4872                 ;;
4873         esac
4875 AC_TRY_LINK(, [int i;], found_export_dynamic=yes, found_export_dynamic=no)
4876 if test $found_export_dynamic = no; then
4877         LDFLAGS="${old_ldflags}"
4880 AC_CHECK_HEADERS(getopt.h sys/select.h sys/time.h sys/wait.h pwd.h iconv.h sys/types.h sys/resource.h)
4881 dnl giconv.c will check on HAVE_ICONV_H but we need this for link time
4882 AC_CHECK_LIB(iconv, iconv_open)
4883 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
4884 AC_SUBST(HAVE_ALLOCA_H)
4886 # Get the exact type of size_t, not just its size.
4887 # This is so we can find an exact printf format among u, lu, llu, I64u.
4888 # To avoid warnings about slight mismatches.
4889 # C99 runtime "zu" dependency is being avoided here.
4891 # We have to compile as C++ because C is too lenient
4892 # and lets the wrong thing compile, with warnings.
4894 # Note: "zu" or ifdef <something> have the advantage
4895 # of producing installable "biarch" headers. i.e. one Mac header
4896 # for Mac/x86 and Mac/amd64.
4898 AC_LANG_PUSH(C++)
4900 # Check long before int because it is the overwhelming Unix answer,
4901 # across 32bit and 64bit systems -- fewer compiler invocations in autoconf.
4903 # long ahead of int also tends to produce biarch-compatible headers except Windows.
4905 AC_MSG_CHECKING(if size_t is unsigned long)
4906 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4907         #include <stddef.h>
4908         unsigned long *a = (size_t*)0;
4909 ])], [
4910         AC_MSG_RESULT(yes)
4911         AC_SUBST(GSIZE_FORMAT, '"lu"')
4912 ], [
4913         AC_MSG_RESULT(no)
4914         AC_MSG_CHECKING(if size_t is unsigned int)
4915         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4916                 #include <stddef.h>
4917                 unsigned *a = (size_t*)0;
4918         ])], [
4919                 AC_MSG_RESULT(yes)
4920                 AC_SUBST(GSIZE_FORMAT, '"u"')
4921         ], [
4922 # At this point the majority of systems have their answer,
4923 # and we descend into non-standard or new-standard territory.
4925 # Check __int64 first because I64 on some systems predates ll, enabling
4926 # new compiler/old runtime interop, and the types always have the same size.
4927                 AC_MSG_RESULT(no)
4928                 AC_MSG_CHECKING(if size_t is unsigned __int64)
4929                 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4930                         #include <stddef.h>
4931                         unsigned __int64 *a = (size_t*)0;
4932                 ])], [
4933                         AC_MSG_RESULT(yes)
4934                         AC_SUBST(GSIZE_FORMAT, '"I64u"')
4935                 ], [
4936                         AC_MSG_RESULT(no)
4937                         AC_MSG_CHECKING(if size_t is unsigned long long)
4938                         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4939                                 #include <stddef.h>
4940                                 unsigned long long *a = (size_t*)0;
4941                         ])], [
4942                                 AC_MSG_RESULT(yes)
4943                                 AC_SUBST(GSIZE_FORMAT, '"llu"')
4944                         ], [
4945                                 AC_MSG_RESULT(no)
4946                                 AC_MSG_ERROR(Unable to determine size_t among unsigned long, int, __int64, long long)
4947                         ] )
4948                 ] )
4949         ] )
4950 ] )
4952 AC_LANG_POP
4954 # If size_t/ptrdiff_t is correct, use it. Otherwise C99 [u]intptr_t.
4955 # This provides for an exact match with functions that
4956 # take size_t like malloc and pthread_attr_getstacksize, avoiding warnings.
4957 # uintptr_t is not necessarily the same.
4959 # ptrdiff_t is preferred over ssize_t as it is C89 vs. new Posix.
4960 # ssize_t looks nicer but ptrdiff_t is wrapped up as gssize anyway.
4962 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_size_t; then
4963    GSIZE="size_t"
4964    GSSIZE="ptrdiff_t"
4965 else
4966    GSIZE="uintptr_t"
4967    GSSIZE="intptr_t"
4970 AC_SUBST(GSIZE)
4971 AC_SUBST(GSSIZE)
4972 AC_SUBST(GSIZE_FORMAT)
4975 # END OF EGLIB CHECKS
4978 AC_ARG_WITH([libgdiplus],
4979         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
4980         [], [with_libgdiplus=installed])
4982 # default install location
4983 libgdiplus_install_loc=libgdiplus${libsuffix}
4984 case "$host" in
4985     *-*-*linux*)
4986     libgdiplus_install_loc=libgdiplus${libsuffix}.0
4987     ;;
4988 esac
4990 case $with_libgdiplus in
4991     no)
4992     libgdiplus_loc=
4993     ;;
4995     installed)
4996     libgdiplus_loc=
4997     if test x$cross_compiling = xno; then
4998         if test x$host_darwin = xyes; then
4999             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
5000             if test -x $a; then
5001               libgdiplus_install_loc=$a
5002               libgdiplus_loc=$a
5003             fi
5004         fi
5005     fi
5006     ;;
5008     yes|sibling)
5009     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
5010     ;;
5012     /*) # absolute path, assume it is an install location
5013     libgdiplus_loc=$with_libgdiplus
5014     libgdiplus_install_loc=$with_libgdiplus
5015     ;;
5017     *)
5018     libgdiplus_loc=`pwd`/$with_libgdiplus
5019     ;;
5020 esac
5021 AC_SUBST(libgdiplus_loc)
5022 AC_SUBST(libgdiplus_install_loc)
5024 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)
5025 if test "x$icall_symbol_map" = "xyes"; then
5026    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
5029 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
5030 if test "x$icall_export" = "xyes"; then
5031    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
5034 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
5035 if test "x$icall_tables" = "xno"; then
5036    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
5039 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
5041 if test "x$with_tls" = "x__thread"; then
5042         AC_DEFINE(MONO_KEYWORD_THREAD, __thread, [Have __thread keyword])
5043         # Pass the information to libgc
5044         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
5045         AC_MSG_CHECKING(if the tls_model attribute is supported)
5046         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
5047                 ], [
5048                         AC_MSG_RESULT(yes)
5049                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
5050                 ], [
5051                         AC_MSG_RESULT(no)
5052         ])
5055 if test ${TARGET} = ARM; then
5056         dnl ******************************************
5057         dnl *** Check to see what FPU is available ***
5058         dnl ******************************************
5059         AC_MSG_CHECKING(which FPU to use)
5061         #
5062         # This is a bit tricky:
5063         #
5064         # if (__ARM_PCS_VFP) {
5065         #       /* mfloat-abi=hard == VFP with hard ABI */
5066         # } elif (!__SOFTFP__) {
5067         #       /* mfloat-abi=softfp == VFP with soft ABI */
5068         # } else {
5069         #       /* mfloat-abi=soft == no VFP */
5070         # }
5071         #
5072         # The exception is iOS (w/ GCC) where none of the above
5073         # are defined (but iOS always uses the 'softfp' ABI).
5074         #
5075         # No support for FPA.
5076         #
5078         fpu=NONE
5080         # iOS GCC always uses the 'softfp' ABI.
5081         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
5082                 fpu=VFP
5083         fi
5085         # Are we using the 'hard' ABI?
5086         if test x$fpu = xNONE; then
5087                 AC_TRY_COMPILE([], [
5088                         #ifndef __ARM_PCS_VFP
5089                         #error "Float ABI is not 'hard'"
5090                         #endif
5091                 ], [
5092                         fpu=VFP_HARD
5093                 ], [
5094                         fpu=NONE
5095                 ])
5096         fi
5098         # No 'hard' ABI. 'soft' or 'softfp'?
5099         if test x$fpu = xNONE; then
5100                 AC_TRY_COMPILE([], [
5101                         #ifdef __SOFTFP__
5102                         #error "Float ABI is not 'softfp'"
5103                         #endif
5104                 ], [
5105                         fpu=VFP
5106                 ], [
5107                         fpu=NONE
5108                 ])
5109         fi
5111         if test x$arm_fpu != x; then
5112            fpu=$arm_fpu
5113         fi
5115         AC_MSG_RESULT($fpu)
5116         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
5117         unset fpu
5119         dnl *********************************************
5120         dnl *** Check which ARM version(s) we can use ***
5121         dnl *********************************************
5122         AC_MSG_CHECKING(which ARM version to use)
5124         AC_TRY_COMPILE([], [
5125                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
5126                 #error Not on ARM v5.
5127                 #endif
5128         ], [
5129                 arm_v5=yes
5131                 arm_ver=ARMv5
5132         ], [])
5134         AC_TRY_COMPILE([], [
5135                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
5136                 #error Not on ARM v6.
5137                 #endif
5138         ], [
5139                 arm_v5=yes
5140                 arm_v6=yes
5142                 arm_ver=ARMv6
5143         ], [])
5145         AC_TRY_COMPILE([], [
5146                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
5147                 #error Not on ARM v7.
5148                 #endif
5149         ], [
5150                 arm_v5=yes
5151                 arm_v6=yes
5152                 arm_v7=yes
5154                 arm_ver=ARMv7
5155         ], [])
5157         AC_MSG_RESULT($arm_ver)
5159         if test x$arm_v5 = xyes; then
5160                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
5161                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
5162         fi
5164         if test x$arm_v6 = xyes; then
5165                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
5166                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
5167         fi
5169         if test x$arm_v7 = xyes; then
5170                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
5171                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
5172         fi
5175 if test ${TARGET} = RISCV32 -o ${TARGET} = RISCV64; then
5176         AC_ARG_WITH([riscv-fpabi], [  --with-riscv-fpabi=auto,double,soft   Select RISC-V floating point ABI (auto)], [fpabi=$withval], [fpabi=double])
5178         AC_MSG_CHECKING([which RISC-V floating point ABI to use])
5180         if test x$fpabi = xauto; then
5181                 AC_TRY_COMPILE([], [
5182                         #ifdef __riscv_float_abi_double
5183                         #error "double"
5184                         #endif
5185                 ], [
5186                         fpabi=auto
5187                 ], [
5188                         fpabi=double
5189                 ])
5190         fi
5192         if test x$fpabi = xauto; then
5193                 AC_TRY_COMPILE([], [
5194                         #ifdef __riscv_float_abi_single
5195                         #error "single"
5196                         #endif
5197                 ], [
5198                         fpabi=auto
5199                 ], [
5200                         fpabi=single
5201                 ])
5202         fi
5204         if test x$fpabi = xauto; then
5205                 AC_TRY_COMPILE([], [
5206                         #ifdef __riscv_float_abi_soft
5207                         #error "soft"
5208                         #endif
5209                 ], [
5210                         fpabi=auto
5211                 ], [
5212                         fpabi=soft
5213                 ])
5214         fi
5216         case $fpabi in
5217         double)
5218                 AC_DEFINE([RISCV_FPABI_DOUBLE], [1], [RISC-V FPABI is double-precision])
5219                 AC_MSG_RESULT([double-precision])
5220                 ;;
5221         single)
5222                 AC_DEFINE([RISCV_FPABI_SINGLE], [1], [RISC-V FPABI is single-precision])
5223                 AC_MSG_ERROR([single-precision, not supported])
5224                 ;;
5225         soft)
5226                 AC_DEFINE([RISCV_FPABI_SOFT], [1], [RISC-V FPABI is soft float])
5227                 AC_MSG_RESULT([soft float])
5228                 ;;
5229         auto)
5230                 AC_MSG_ERROR([unknown])
5231                 ;;
5232         *)
5233                 AC_MSG_ERROR([invalid option: $fpabi])
5234                 ;;
5235         esac
5238 if test ${TARGET} = unknown; then
5239         CPPFLAGS="$CPPFLAGS -DNO_PORT"
5240         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
5243 if test "x$platform_android" = "xyes"; then
5244         case "x${TARGET}" in
5245         xARM)
5246                 case "x$arm_ver" in
5247                 xARMv5)
5248                         BTLS_SUPPORTED=yes
5249                         BTLS_PLATFORM=android-armv5
5250                         ;;
5251                 xARMv6)
5252                         BTLS_SUPPORTED=yes
5253                         BTLS_PLATFORM=android-armv6
5254                         ;;
5255                 xARMv7)
5256                         BTLS_SUPPORTED=yes
5257                         BTLS_PLATFORM=android-armv7
5258                         ;;
5259                 *)
5260                         BTLS_SUPPORTED=no
5261                         ;;
5262                 esac
5263                 ;;
5264         xARM64)
5265                 BTLS_SUPPORTED=yes
5266                 BTLS_PLATFORM=android-v8a
5267                 ;;
5268         xX86)
5269                 BTLS_SUPPORTED=yes
5270                 BTLS_PLATFORM=android-x86
5271                 ;;
5272         xAMD64)
5273                 BTLS_SUPPORTED=yes
5274                 BTLS_PLATFORM=android-x64
5275                 ;;
5276         *)
5277                 BTLS_SUPPORTED=no
5278                 ;;
5279         esac
5282 if test ${ACCESS_UNALIGNED} = no; then
5283         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
5286 if test x$host_darwin = xyes; then
5287         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
5288         AS_IF(
5289                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
5290                 [AC_MSG_RESULT([no])],
5291                 [
5292                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
5293                         AR_FLAGS="Scru"
5294                         RANLIB="$RANLIB -no_warning_for_no_symbols"
5295                         AC_MSG_RESULT([yes])
5296                 ]
5297         )
5300 case "x$libgc" in
5301         xincluded)
5302                 # Pass CPPFLAGS to libgc configure
5303                 # We should use a separate variable for this to avoid passing useless and
5304                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
5305                 # This should be executed late so we pick up the final version of CPPFLAGS
5306                 # The problem with this approach, is that during a reconfigure, the main
5307                 # configure scripts gets invoked with these arguments, so we use separate
5308                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
5309                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
5310                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
5311                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
5312                 fi
5313                 # Don't pass -finstrument-for-thread-suspension in, 
5314                 # if these are instrumented it will be very bad news 
5315                 # (infinite recursion, undefined parking behavior, etc)
5316                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
5317                 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\""
5318                 if test "x$support_boehm" = "xyes"; then
5319                         AC_CONFIG_SUBDIRS(libgc)
5320                 fi
5321                 ;;
5322 esac
5324 MALLOC_MEMPOOLS=no
5325 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
5326         if test x$with_malloc_mempools = xyes; then
5327                 MALLOC_MEMPOOLS=yes
5328                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
5329         fi
5333 DISABLE_MCS_DOCS=default
5334 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
5335         if test x$with_mcs_docs != xyes; then
5336                 DISABLE_MCS_DOCS=yes
5337         fi
5339 if test -n "$INSTALL_4_x_TRUE"; then :
5340         DISABLE_MCS_DOCS=yes
5342 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
5343    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
5346 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)],[
5347         if test x$with_lazy_gc_thread_creation != xno ; then
5348                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
5349         fi
5350 ], [with_lazy_gc_thread_creation=no])
5352 dnl *****************************
5353 dnl *** Thread suspend policy ***
5354 dnl *****************************
5356 dnl Set a default hybrid or cooperative suspend on some platforms
5358 dnl Coop default is set by the bitcode preset.
5360 dnl If coop isn't on by default, maybe hybrid should be?
5361 if test x$enable_cooperative_suspend_default != xyes; then
5362         case $HOST in
5363         X86 | AMD64)
5364                 dnl Some host/target confusion, there's no host_osx (and
5365                 dnl host_darwin would be true on iOS not just macOS).
5366                 if test x$target_osx = xyes; then
5367                         enable_hybrid_suspend_default=yes
5368                 elif test x$host_linux = xyes -o x$host_win32 = xyes; then
5369                         enable_hybrid_suspend_default=yes
5370                 fi
5371                 ;;
5372         esac
5375 dnl Now check if there were flags overriding the defaults
5377 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])
5378 AC_ARG_ENABLE(cooperative_suspend, [  --enable-cooperative-suspend      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [], [enable_cooperative_suspend=default])
5380 if test x$enable_cooperative_suspend = xdefault -a x$with_cooperative_gc != xdefault; then
5381         enable_cooperative_suspend=$with_cooperative_gc
5384 if test x$enable_cooperative_suspend = xdefault; then
5385         enable_cooperative_suspend=$enable_cooperative_suspend_default
5388 if test x$enable_cooperative_suspend != xno; then
5389         AC_DEFINE(ENABLE_COOP_SUSPEND,1,[Enable cooperative stop-the-world garbage collection.])
5392 AM_CONDITIONAL([ENABLE_COOP_SUSPEND], [test x$enable_cooperative_suspend != xno])
5394 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])
5396 if test x$enable_hybrid_suspend = xdefault; then
5397    enable_hybrid_suspend=$enable_hybrid_suspend_default
5400 if test x$enable_hybrid_suspend != xno -a x$enable_cooperative_suspend != xno ; then
5401         AC_MSG_ERROR([Hybrid suspend and Cooperative suspend cannot be both enabled.])
5404 if test x$enable_hybrid_suspend != xno ; then
5405         AC_DEFINE(ENABLE_HYBRID_SUSPEND,1,[Enable hybrid suspend for GC stop-the-world])
5408 AM_CONDITIONAL([ENABLE_HYBRID_SUSPEND], [test x$enable_hybrid_suspend != xno])
5410 dnl End of thread suspend policy
5412 dnl ***************************
5413 dnl *** feature experiments ***
5414 dnl ***************************
5416 dnl When adding experiments, also add to mono/utils/mono-experiments.def
5417 AC_ARG_ENABLE(experiment, [ --enable-experiment=LIST       Enable experimental fatures from the comma-separate LIST.  Available experiments: null],[
5419         if test x$enable_experiment != x ; then
5420                 AC_DEFINE(ENABLE_EXPERIMENTS,1,[Enable feature experiments])
5421         fi
5422         for feature in `echo "$enable_experiment" | sed -e "s/,/ /g"`; do
5423                 eval "mono_experiment_test_enable_$feature='yes'"
5424         done
5426         if test "x$mono_experiment_test_enable_all" = "xyes"; then
5427                 eval "mono_experiment_test_enable_null='yes'"
5428                 true
5429         fi
5431         if test "x$mono_experiment_test_enable_null" = "xyes"; then
5432                 AC_DEFINE(ENABLE_EXPERIMENT_null, 1, [Enable experiment 'null'])
5433         fi
5434 ],[])
5436 dnl **********************
5437 dnl *** checked builds ***
5438 dnl **********************
5440 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],[
5442         if test x$enable_checked_build != x ; then
5443                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
5444         fi
5445         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
5446                 eval "mono_checked_build_test_enable_$feature='yes'"
5447         done
5449         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
5450                 eval "mono_checked_build_test_enable_gc='yes'"
5451                 eval "mono_checked_build_test_enable_metadata='yes'"
5452                 eval "mono_checked_build_test_enable_thread='yes'"
5453                 eval "mono_checked_build_test_enable_private_types='yes'"
5454                 eval "mono_checked_build_test_enable_crash_reporting='yes'"
5455         fi
5457         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
5458                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
5459         fi
5461         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
5462                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
5463         fi
5465         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
5466                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
5467         fi
5469         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
5470                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
5471         fi
5473         if test "x$mono_checked_build_test_enable_crash_reporting" = "xyes"; then
5474                 # Required
5475                 with_overridable_allocators=yes
5476                 AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
5478                 AC_DEFINE(ENABLE_CHECKED_BUILD_CRASH_REPORTING, 1, [Enable private types checked build])
5479         fi
5480 ], [])
5482 dnl End of checked builds
5484 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
5486 AC_CHECK_HEADER([malloc.h], 
5487                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
5488                         [Define to 1 if you have /usr/include/malloc.h.])],,)
5490 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
5491 # instead of libmono-static.a
5492 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
5493    LIBMONO_LA=libmini-static.la
5494 else
5495    if test x$buildsgen = xyes; then
5496       LIBMONO_LA=libmonosgen-$API_VER.la
5497    else
5498       LIBMONO_LA=libmonoboehm-$API_VER.la
5499    fi
5501 AC_SUBST(LIBMONO_LA)
5503 dnl **************
5504 dnl ***  Btls  ***
5505 dnl **************
5507 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
5508 AC_ARG_ENABLE(btls-lib, [  --disable-btls-lib             Disable building the BTLS native library], enable_btls_lib=$enableval, enable_btls_lib=$BTLS_SUPPORTED)
5509 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
5510 AC_ARG_WITH(btls_android_api, [  --with-btls-android-api        Android NDK API level for BTLS build])
5511 AC_ARG_WITH(btls_android_cmake_toolchain, [  --with-btls-android-cmake-toolchain        Path to the cmake toolchain file for Android])
5512 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])
5514 if test "x$with_btls_android_api" = "x" ; then
5515         case "$BTLS_PLATFORM" in
5516                 android-armv5)
5517                         with_btls_android_api=16" ;;
5518                 android-armv6)
5519                         with_btls_android_api=16" ;;
5520                 android-armv7)
5521                         with_btls_android_api=16 ;;
5522                 android-v8a)
5523                         with_btls_android_api=21 ;;
5524                 android-x86)
5525                         with_btls_android_api=16 ;;
5526                 android-x64)
5527                         with_btls_android_api=21 ;;
5528         esac
5531 if test "x$enable_btls" = "xno"; then
5532    enable_btls_lib=no
5535 AM_CONDITIONAL(BTLS, test x$enable_btls_lib = xyes)
5537 btls_android=no
5538 if test "x$enable_btls" = "xyes"; then
5539         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
5540         if test "x$CMAKE" = "xno"; then
5541                 AC_MSG_ERROR("cmake not found")
5542         fi
5544         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
5545         AC_SUBST(BTLS_ROOT)
5547         btls_arch=
5548         btls_cflags=
5549         BTLS_CMAKE_ARGS=
5551         if test "x$host_win32" = "xyes"; then
5552                 AC_CHECK_PROG(HAVE_YASM, yasm, yes, no)
5553         fi
5555         case "$BTLS_PLATFORM" in
5556         i386)
5557                 btls_arch=i386
5558                 btls_cflags="-m32"
5559                 case $host_os in
5560                         darwin*)
5561                                 btls_cflags="$btls_cflags -arch i386"
5562                                 ;;
5563                         mingw*|cygwin*)
5564                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5565                                 if test "x$HAVE_YASM" != "xyes"; then
5566                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5567                                 fi
5568                                 ;;
5569                 esac
5570                 ;;
5571         x86_64)
5572                 btls_arch=x86_64
5573                 case $host_os in
5574                         mingw*|cygwin*)
5575                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5576                                 if test "x$HAVE_YASM" != "xyes"; then
5577                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5578                                 fi
5579                                 ;;
5580                 esac
5581                 ;;
5582         arm)
5583                 btls_arch=arm
5584                 btls_cflags="-DOPENSSL_NO_ASM=1"
5585                 ;;
5586         armsoft)
5587                 btls_arch=arm
5588                 btls_cflags="-DOPENSSL_NO_ASM=1"
5589                 ;;
5590         aarch64)
5591                 btls_arch=aarch64
5592                 btls_cflags="-march=armv8-a+crypto"
5593                 ;;
5594         s390x)
5595                 btls_arch=s390x
5596                 ;;
5597         powerpc)
5598                 btls_arch=powerpc
5599                 case $host_os in
5600                         aix*|os400*)
5601                                 btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
5602                                 BTLS_CMAKE_ARGS="-DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
5603                 esac
5604                 ;;
5605         android-armv5)
5606                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5607                 ;;
5608         android-armv6)
5609                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5610                 ;;
5611         android-armv7)
5612                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5613                 ;;
5614         android-v8a)
5615                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5616                 ;;
5617         android-x86)
5618                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5619                 ;;
5620         android-x64)
5621                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5622                 ;;
5623         riscv32)
5624                 btls_arch=riscv32
5625                 ;;
5626         riscv64)
5627                 btls_arch=riscv64
5628                 ;;
5629         *)
5630                 AC_MSG_ERROR(Invalid BTLS platform)
5631         esac
5633         if test "x$platform_android" = "xyes"; then
5634                 if test "x$with_btls_android_cmake_toolchain" = "x"; then
5635                    with_btls_android_cmake_toolchain="$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
5636                 fi
5638                 if test "x$with_btls_android_ndk_asm_workaround" != "x"; then
5639                    BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DENABLE_NDK_ARM_WORKAROUND=ON"
5640                 fi
5642                 btls_android=yes
5643                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$with_btls_android_cmake_toolchain"
5644                 if test "x$with_btls_android_ndk" != "x"; then
5645                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
5646                 else
5647                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
5648                 fi
5649         fi
5651         if test "x$btls_arch" != "x"; then
5652                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
5653         fi
5655         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
5656         AC_SUBST(BTLS_ARCH)
5657         AC_SUBST(BTLS_CFLAGS)
5658         AC_SUBST(BTLS_PLATFORM)
5659         AC_SUBST(BTLS_CMAKE_ARGS)
5661         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
5662 else
5663         enable_btls=no
5666 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
5668 if test x$DISABLE_MCS_DOCS = xyes; then
5669    docs_dir=""
5670 else
5671    docs_dir=docs
5673 AC_SUBST(docs_dir)
5675 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
5676 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
5677 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
5679 libmono_ldflags="$libmono_ldflags $LIBS"
5681 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
5682 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
5683 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
5684 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
5685 AM_CONDITIONAL(X86, test x$TARGET = xX86)
5686 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
5687 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
5688 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
5689 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
5690 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
5691 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64 -o x$TARGET = xARM6432)
5692 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
5693 AM_CONDITIONAL([RISCV], [test x$TARGET = xRISCV32 -o x$TARGET = xRISCV64])
5694 AM_CONDITIONAL([RISCV32], [test x$TARGET = xRISCV32])
5695 AM_CONDITIONAL([RISCV64], [test x$TARGET = xRISCV64])
5696 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
5697 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
5698 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
5699 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
5700 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
5701 AM_CONDITIONAL([HOST_RISCV], [test x$HOST = xRISCV32 -o x$HOST = xRISCV64])
5702 AM_CONDITIONAL([HOST_RISCV32], [test x$HOST = xRISCV32])
5703 AM_CONDITIONAL([HOST_RISCV64], [test x$HOST = xRISCV64])
5704 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
5706 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
5708 AC_SUBST(LIBC)
5709 AC_SUBST(INTL)
5710 AC_SUBST(SQLITE)
5711 AC_SUBST(SQLITE3)
5712 AC_SUBST(X11)
5713 AC_SUBST(GDKX11)
5714 AC_SUBST(GTKX11)
5715 AC_SUBST(XINERAMA)
5716 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
5717 AC_SUBST(arch_target)
5719 #This must always be defined when building the runtime
5720 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
5722 mono_build_root=`pwd`
5723 AC_SUBST(mono_build_root)
5725 AC_ARG_ENABLE(msvc,[  --enable-msvc    Build with Visual Studio (msvc) (defaults to no)], enable_msvc=$enableval, enable_msvc=no)
5726 if test x$host_win32 = xno; then
5727         if test x$enable_msvc = xyes; then
5728                 echo "Error, --enable-msvc only supported for Windows builds."
5729                 exit 1
5730         fi
5732 AM_CONDITIONAL(ENABLE_MSVC, test x$enable_msvc = xyes)
5734 if test "x$enable_msvc" = "xyes"; then
5735         if test "x$support_boehm" = "xyes"; then
5736                 echo "Error, Boehm GC is not supported when using --enable-msvc."
5737                 exit 1
5738         fi
5739         mono_msvc_build_dir='$(top_srcdir)'/msvc/build/sgen
5740         if test "x$host_cpu" = "xi686"; then
5741                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/Win32/lib/Release
5742                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/Win32/bin/Release
5743                 mono_runtime=msvc/build/sgen/Win32/bin/Release/mono-sgen.exe
5744                 mono_runtime_wrapper=$mono_runtime
5745         else
5746                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/x64/lib/Release
5747                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/x64/bin/Release
5748                 mono_runtime=msvc/build/sgen/x64/bin/Release/mono-sgen.exe
5749                 mono_runtime_wrapper=msvc/build/sgen/x64/bin/Release/mono-sgen-msvc.sh
5750         fi
5751         AC_SUBST(mono_msvc_build_dir)
5752         AC_SUBST(mono_msvc_build_lib_dir)
5753         AC_SUBST(mono_msvc_build_bin_dir)
5754 else
5755         mono_runtime=mono/mini/mono
5756         mono_runtime_wrapper=$mono_runtime
5759 AC_SUBST(mono_runtime)
5760 AC_SUBST(mono_runtime_wrapper)
5762 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/Microsoft.Net.Compilers.2.8.2/tools/csc.exe
5764 if test $csc_compiler = mcs; then
5765   CSC=$mcs_topdir/class/lib/build/mcs.exe
5766 else
5767   CSC=$CSC_LOCATION
5770 AM_CONDITIONAL([CSC_IS_ROSLYN], [test x$csc_compiler != xmcs])
5772 mono_cfg_root=$mono_build_root/runtime
5773 if test x$host_win32 = xyes; then
5774   if test "x$cross_compiling" = "xno"; then
5775     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
5776     CSC=`cygpath -m -a $CSC`
5777     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
5778   else
5779     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
5780   fi
5781 else
5782   mono_cfg_dir=$mono_cfg_root/etc
5785 if test "x$platform_android" = "xyes"; then
5786   mono_cfg_dir=
5789 AC_SUBST(mono_cfg_dir)
5791 AC_SUBST(CSC)
5793 AC_CONFIG_FILES([po/mcs/Makefile.in])
5795 AC_CONFIG_FILES([acceptance-tests/microbench-perf.sh],[chmod +x acceptance-tests/microbench-perf.sh])
5796 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
5797 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
5799 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
5800 [   depth=../../../..
5801     case $srcdir in
5802     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5803     .) reldir=$depth ;;
5804     *) reldir=$depth/$srcdir ;;
5805     esac
5806     $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
5807     cd runtime/etc/mono/1.0
5808     rm -f machine.config
5809     $LN_S $reldir/data/net_1_1/machine.config machine.config
5810     cd $depth
5811 ],[LN_S='$LN_S'])
5813 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
5814 [   depth=../../../..
5815     case $srcdir in
5816     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5817     .) reldir=$depth ;;
5818     *) reldir=$depth/$srcdir ;;
5819     esac
5820     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5821     cd runtime/etc/mono/2.0
5822     rm -f machine.config
5823     $LN_S $reldir/data/net_2_0/machine.config machine.config
5824     cd $depth
5825 ],[LN_S='$LN_S'])
5827 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
5828 [   depth=../../../..
5829     case $srcdir in
5830     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5831     .) reldir=$depth ;;
5832     *) reldir=$depth/$srcdir ;;
5833     esac
5834     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5835     cd runtime/etc/mono/2.0
5836     rm -f web.config
5837     $LN_S $reldir/data/net_2_0/web.config web.config
5838     cd $depth
5839 ],[LN_S='$LN_S'])
5841 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
5842 [   depth=../../..
5843     case $srcdir in
5844     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5845     .) reldir=$depth ;;
5846     *) reldir=$depth/$srcdir ;;
5847     esac
5848     $ac_aux_dir/install-sh -d runtime/etc/mono/
5849     cd runtime/etc/mono/
5850     rm -f browscap.ini
5851     $LN_S $reldir/data/browscap.ini browscap.ini
5852     cd $depth
5853 ],[LN_S='$LN_S'])
5855 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
5856 [   depth=../../../../..
5857     case $srcdir in
5858     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5859     .) reldir=$depth ;;
5860     *) reldir=$depth/$srcdir ;;
5861     esac
5862     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
5863     cd runtime/etc/mono/2.0/Browsers
5864     rm -f Compat.browser
5865     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5866     cd $depth
5867 ],[LN_S='$LN_S'])
5869 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
5870 [   depth=../../../../..
5871     case $srcdir in
5872     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5873     .) reldir=$depth ;;
5874     *) reldir=$depth/$srcdir ;;
5875     esac
5876     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
5877     cd runtime/etc/mono/4.0/Browsers
5878     rm -f Compat.browser
5879     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5880     cd $depth
5881 ],[LN_S='$LN_S'])
5883 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
5884 [   depth=../../../../..
5885     case $srcdir in
5886     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5887     .) reldir=$depth ;;
5888     *) reldir=$depth/$srcdir ;;
5889     esac
5890     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
5891     cd runtime/etc/mono/4.5/Browsers
5892     rm -f Compat.browser
5893     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5894     cd $depth
5895 ],[LN_S='$LN_S'])
5897 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
5898 [   depth=../../../..
5899     case $srcdir in
5900     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5901     .) reldir=$depth ;;
5902     *) reldir=$depth/$srcdir ;;
5903     esac
5904     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5905     cd runtime/etc/mono/4.0
5906     rm -f machine.config
5907     $LN_S $reldir/data/net_4_0/machine.config machine.config
5908     cd $depth
5909 ],[LN_S='$LN_S'])
5911 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
5912 [   depth=../../../..
5913     case $srcdir in
5914     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5915     .) reldir=$depth ;;
5916     *) reldir=$depth/$srcdir ;;
5917     esac
5918     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5919     cd runtime/etc/mono/4.0
5920     rm -f web.config
5921     $LN_S $reldir/data/net_4_0/web.config web.config
5922     cd $depth
5923 ],[LN_S='$LN_S'])
5925 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
5926 [   depth=../../../..
5927     case $srcdir in
5928     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5929     .) reldir=$depth ;;
5930     *) reldir=$depth/$srcdir ;;
5931     esac
5932     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5933     cd runtime/etc/mono/4.5
5934     rm -f machine.config
5935     $LN_S $reldir/data/net_4_5/machine.config machine.config
5936     cd $depth
5937 ],[LN_S='$LN_S'])
5939 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
5940 [   depth=../../../..
5941     case $srcdir in
5942     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5943     .) reldir=$depth ;;
5944     *) reldir=$depth/$srcdir ;;
5945     esac
5946     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5947     cd runtime/etc/mono/4.5
5948     rm -f web.config
5949     $LN_S $reldir/data/net_4_5/web.config web.config
5950     cd $depth
5951 ],[LN_S='$LN_S'])
5953 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])
5954 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])
5955 AC_CONFIG_COMMANDS([clean-llvm], [rm -f llvm/llvm_config.mk])
5958 # Mono.Native Support
5959 # -------------------
5960 # Mono.Native is the new name for both System.Native and System.Security.Cryptography.Apple.
5961 # It is built as a stand-alone shared library and not bundled with the runtime because we
5962 # may need to build two different versions of it.
5964 # Starting with macOS 10.12+ and iOS 10+, Apple introduced a new Unified API for some of the
5965 # crypto primitives that we're using as part of System.Security.Cryptography.Apple.
5967 # On Desktop, we can check at runtime whether the OS version is recent enough and switch
5968 # implementation accordingly.  We build a single `libmono-native` shared library.
5970 # However, on Mobile we cannot have any undefined symbols as this would break Bitcode.
5972 # During the mobile build, we are called with `CFLAGS` containing an explicit minium version flag,
5973 # which is eiter `-mmacosx-version-min=`, `-mios-simulator-version-min=` or `-miphoneos-version-min=`
5974 # depending on platform.
5976 # We build two versions of the shared library:
5977 # - `libmono-native-compat` is built with whichever minimum version is passed to us via `CFLAGS`.
5978 # - `libmono-native-unifed` is built with the minimum version set to macOS 10.12+ / iOS 10+.
5980 # For testing purpuses, there is a function called `mono_native_get_platform_type ()`
5981 # (see mono/native/mono-native-platform.c), which returns a `MonoNativePlatformType` enum value.
5982 # There is also `Mono.MonoNativePlatform.GetPlatformType ()` (see mcs/class/corlib/Test/Mono/MonoNativePlatform.cs).
5984 # This can be called by automated tests both to ensure that the library has been correctly installed and also
5985 # to verify that it's the correct version of it.
5988 AC_MSG_CHECKING([Mono.Native support])
5989 sed_version_pattern='[[0-9]]\{1,2\}\(\.[[0-9]]\{1,2\}\)'
5990 if test x$disable_mono_native = xyes; then
5991         mono_native=no
5992 elif test x$target_osx = xyes; then
5993         MONO_NATIVE_CC=$CC
5994         MONO_NATIVE_CXX=$CXX
5995         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
5996         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
5997         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
5998         MONO_NATIVE_CFLAGS=$CFLAGS
5999         MONO_NATIVE_LDFLAGS=$LDFLAGS
6001         mono_native=yes
6002         MONO_NATIVE_PLATFORM=macos
6003         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_MACOS"
6005         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer],
6006                 [!(MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12)])
6008         if test x$mono_native_compat = xyes; then
6009                 mono_native_compat=yes
6010                 mono_native_text="Mac OSX (compat + unified v10.12)"
6011                 MONO_NATIVE_COMPAT_CCASFLAGS=$MONO_NATIVE_CCASFLAGS
6012                 MONO_NATIVE_COMPAT_CPPFLAGS=$MONO_NATIVE_CPPFLAGS
6013                 MONO_NATIVE_COMPAT_CXXFLAGS=$MONO_NATIVE_CXXFLAGS
6014                 MONO_NATIVE_COMPAT_CFLAGS=$MONO_NATIVE_CFLAGS
6015                 MONO_NATIVE_COMPAT_LDFLAGS=$MONO_NATIVE_LDFLAGS
6017                 sed_remove_mac_version_pattern="s/-mmacosx-version-min=$sed_version_pattern//g"
6018                 MONO_NATIVE_UNIFIED_CCASFLAGS="`echo $CCASFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6019                 MONO_NATIVE_UNIFIED_CPPFLAGS="`echo $CPPFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6020                 MONO_NATIVE_UNIFIED_CXXFLAGS="`echo $CXXFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6021                 MONO_NATIVE_UNIFIED_CFLAGS="`echo $CFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6022                 MONO_NATIVE_UNIFIED_LDFLAGS="`echo $LDFLAGS | sed -e $sed_remove_mac_version_pattern` -mmacosx-version-min=10.12"
6023         else
6024                 mono_native_compat=no
6025                 mono_native_text="Mac OSX"
6026         fi
6027 elif test x$mono_native_platform_ios = xyes; then
6028         AC_MONO_APPLE_TARGET(TARGET_OS_SIMULATOR, [mono_native_ios_sim=yes], [mono_native_ios_sim=no])
6030         AC_MONO_APPLE_TARGET(TARGET_OS_IOS, [
6031                 if test x$mono_native_ios_sim = xyes; then
6032                         mono_native_ios_target=ios-simulator
6033                         mono_native_text="iOS Simulator"
6034                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6035                 else
6036                         mono_native_ios_target=iphoneos
6037                         mono_native_text="iOS Device"
6038                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6039                 fi
6040                 mono_native_unified_version="10.0"
6041                 mono_native_compat_check="__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_10_0"
6042         ], [
6043                 AC_MONO_APPLE_TARGET(TARGET_OS_TV, [
6044                         if test x$mono_native_ios_sim = xyes; then
6045                                 mono_native_ios_target=tvos-simulator
6046                                 mono_native_text="AppleTV Simulator"
6047                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6048                         else
6049                                 mono_native_ios_target=tvos
6050                                 mono_native_text="AppleTV Device"
6051                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6052                         fi
6053                         mono_native_unified_version="10.0"
6054                         mono_native_compat_check="__TV_OS_VERSION_MIN_REQUIRED >= __TVOS_10_0"
6055                 ], [
6056                         AC_MONO_APPLE_TARGET(TARGET_OS_WATCH, [
6057                                 if test x$mono_native_ios_sim = xyes; then
6058                                         mono_native_ios_target=watchos-simulator
6059                                         mono_native_text="Apple Watch Simulator"
6060                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
6061                                 else
6062                                         mono_native_ios_target=watchos
6063                                         mono_native_text="Apple Watch Device"
6064                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
6065                                 fi
6066                                 mono_native_unified_version="5.0"
6067                                 mono_native_compat_check="__WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_5_0"
6068                         ], [
6069                                 AC_MSG_ERROR([Unknown iOS Target])
6070                         ])
6071                 ])
6072         ])
6074         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer], [!($mono_native_compat_check)])
6076         if test x$with_bitcode = xyes; then
6077                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -no-undefined -fatal_warnings"
6078                 MONO_NATIVE_LIBADD="../mini/$LIBMONO_LA"
6079         else
6080                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -fatal_warnings"
6081         fi
6083         if test x$enable_gss = xyes; then
6084                 mono_native_ldflags="$mono_native_ldflags -framework GSS"
6085         fi
6087         MONO_NATIVE_CC=$CC
6088         MONO_NATIVE_CXX=$CXX
6089         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6090         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6091         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6092         MONO_NATIVE_CFLAGS=$CFLAGS
6093         MONO_NATIVE_LDFLAGS="$LDFLAGS $mono_native_ldflags"
6095         if test x$mono_native_compat = xyes; then
6096                 mono_native_text="$mono_native_text (compat + unified v$mono_native_unified_version)"
6097                 MONO_NATIVE_COMPAT_CCASFLAGS=$MONO_NATIVE_CCASFLAGS
6098                 MONO_NATIVE_COMPAT_CPPFLAGS=$MONO_NATIVE_CPPFLAGS
6099                 MONO_NATIVE_COMPAT_CXXFLAGS=$MONO_NATIVE_CXXFLAGS
6100                 MONO_NATIVE_COMPAT_CFLAGS=$MONO_NATIVE_CFLAGS
6101                 MONO_NATIVE_COMPAT_LDFLAGS=$MONO_NATIVE_LDFLAGS
6103                 sed_remove_ios_version_pattern="s/-m\(.*\)-version-min=$sed_version_pattern//g"
6104                 MONO_NATIVE_UNIFIED_CCASFLAGS="`echo $CCASFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6105                 MONO_NATIVE_UNIFIED_CPPFLAGS="`echo $CPPFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6106                 MONO_NATIVE_UNIFIED_CXXFLAGS="`echo $CXXFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6107                 MONO_NATIVE_UNIFIED_CFLAGS="`echo $CFLAGS | sed -e $sed_remove_ios_version_pattern` -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6108                 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"
6109         fi
6111         mono_native=yes
6112         MONO_NATIVE_PLATFORM=ios
6113 elif test x$host_linux = xyes; then
6114         mono_native_text="Linux"
6115         MONO_NATIVE_CC=$CC
6116         MONO_NATIVE_CXX=$CXX
6117         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6118         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6119         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6120         MONO_NATIVE_CFLAGS=$CFLAGS
6121         MONO_NATIVE_LDFLAGS=$LDFLAGS
6123         mono_native=yes
6124         mono_native_compat=no
6125         MONO_NATIVE_PLATFORM=linux
6127         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
6128 elif test x$target_wasm = xyes; then
6129         mono_native_text="wasm"
6130         MONO_NATIVE_CC=$CC
6131         MONO_NATIVE_CXX=$CXX
6132         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6133         # The system.native code uses _WASM_ to check for wasm
6134         MONO_NATIVE_CPPFLAGS="$CPPFLAGS -D_WASM_"
6135         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6136         MONO_NATIVE_CFLAGS=$CFLAGS
6137         MONO_NATIVE_LDFLAGS=$LDFLAGS
6139         mono_native=yes
6140         mono_native_compat=no
6141         MONO_NATIVE_PLATFORM=linux
6143         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
6144 elif case $host_os in aix*|os400*) true;; *) false;; esac; then
6145         mono_native_text="AIX"
6146         MONO_NATIVE_CC=$CC
6147         MONO_NATIVE_CXX=$CXX
6148         MONO_NATIVE_CCASFLAGS=$CCASFLAGS
6149         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6150         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6151         MONO_NATIVE_CFLAGS=$CFLAGS
6152         MONO_NATIVE_LDFLAGS=$LDFLAGS
6154         mono_native=yes
6155         mono_native_compat=no
6156         MONO_NATIVE_PLATFORM=aix
6158         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_AIX"
6159 elif test x$platform_android = xyes; then
6160         mono_native_text="Android"
6161         MONO_NATIVE_CC=$CC
6162         MONO_NATIVE_CXX=$CXX
6163         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6164         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6165         MONO_NATIVE_CFLAGS=$CFLAGS
6166         MONO_NATIVE_LDFLAGS=$LDFLAGS
6167         MONO_NATIVE_LIBADD="../mini/$LIBMONO_LA"
6169         mono_native=yes
6170         mono_native_compat=no
6171         MONO_NATIVE_PLATFORM=android
6173         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_ANDROID"
6174 else
6175         mono_native=no
6176         mono_native_text="no"
6179 AC_MSG_RESULT($mono_native_text)
6181 if test x$mono_native_compat = xyes; then
6182         MONO_NATIVE_LIBRARY_NAME=libmono-native-compat
6183 else
6184         MONO_NATIVE_LIBRARY_NAME=libmono-native
6187 AC_SUBST(MONO_NATIVE_PLATFORM)
6188 AC_SUBST(MONO_NATIVE_CC)
6189 AC_SUBST(MONO_NATIVE_CXX)
6190 AC_SUBST(MONO_NATIVE_CCASFLAGS)
6191 AC_SUBST(MONO_NATIVE_COMPAT_CCASFLAGS)
6192 AC_SUBST(MONO_NATIVE_UNIFIED_CCASFLAGS)
6193 AC_SUBST(MONO_NATIVE_CPPFLAGS)
6194 AC_SUBST(MONO_NATIVE_COMPAT_CPPFLAGS)
6195 AC_SUBST(MONO_NATIVE_UNIFIED_CPPFLAGS)
6196 AC_SUBST(MONO_NATIVE_CXXFLAGS)
6197 AC_SUBST(MONO_NATIVE_COMPAT_CXXFLAGS)
6198 AC_SUBST(MONO_NATIVE_UNIFIED_CXXFLAGS)
6199 AC_SUBST(MONO_NATIVE_CFLAGS)
6200 AC_SUBST(MONO_NATIVE_COMPAT_CFLAGS)
6201 AC_SUBST(MONO_NATIVE_UNIFIED_CFLAGS)
6202 AC_SUBST(MONO_NATIVE_LDFLAGS)
6203 AC_SUBST(MONO_NATIVE_COMPAT_LDFLAGS)
6204 AC_SUBST(MONO_NATIVE_UNIFIED_LDFLAGS)
6205 AC_SUBST(MONO_NATIVE_LIBRARY_NAME)
6206 AC_SUBST(MONO_NATIVE_LIBADD)
6208 AM_CONDITIONAL(MONO_NATIVE, test x$mono_native = xyes)
6209 AM_CONDITIONAL(MONO_NATIVE_COMPAT, test x$mono_native_compat = xyes)
6210 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_MACOS, test x$MONO_NATIVE_PLATFORM = xmacos)
6211 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_IOS, test x$MONO_NATIVE_PLATFORM = xios)
6212 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_LINUX, test x$MONO_NATIVE_PLATFORM = xlinux)
6213 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_AIX, test x$MONO_NATIVE_PLATFORM = xaix)
6214 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_ANDROID, test x$MONO_NATIVE_PLATFORM = xandroid)
6216 MONO_NATIVE_PLATFORM_TYPE_COMPAT="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_COMPAT"
6217 MONO_NATIVE_PLATFORM_TYPE_UNIFIED="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_UNIFIED"
6218 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE)
6219 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_COMPAT)
6220 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_UNIFIED)
6222 ### C++ Linker selection
6224 # We have to lie to autotools, sometimes.
6226 # If we're building with llvm compiled into Mono, set MONO_CXXLD to CXX,
6227 # otherwise to CC.  We want C linking even if we're compiling with C++ enabled
6228 # because we do not want to link inthe C++ runtime library (-lstdc++ or -lc++),
6229 # except if we're linking with LLVM which relies on it.
6231 # Explanation of the hack:
6233 # According to
6234 # https://www.gnu.org/software/automake/manual/html_node/How-the-Linker-is-Chosen.html,
6235 # automake chooses the linker that it used to compile a target based on the
6236 # _SOURCES for that target.  If the target is comprised of only C code, it
6237 # chooses the C linker (on Linux and OSX this is just gcc or clang called with
6238 # linker arguments and a -o).  If the target _SOURCES include at least one C++ file, 
6239 # then automake chooses the C++ linker (usually g++ or clang++ called with linker arguments and -o).
6241 # The problem for Mono is that we don't want the C++ runtime library (libstdc++
6242 # or libc++) linked in - even when Mono is written in C++, we take care not to
6243 # require the runtime library.  As a result, we don't want g++ or clang++ to do
6244 # the linking.  On the other hand if LLVM is enabled, then we _must_ use the
6245 # C++ linker - LLVM doesn't have the same restrictions.
6247 # So the trick is we set MONO_CXXLD here to $CXX or $CC and in
6248 #  mono/mini/Makefile.am.in we have CCLD=$MONO_CXXLD and CXXLD=$MONO_CXXLD which bypasses
6249 #  automake's autodetection and lets us use the linker that we want.
6251 if test "x$enable_llvm_runtime" = "xyes"; then
6252         AC_SUBST(MONO_CXXLD, [$CXX])
6253 else
6254         AC_SUBST(MONO_CXXLD, [$CC])
6257 ### Set -Werror options
6259 # Anything involving -Werror must be done late because autoconf depends on compiling with warnings to be success.
6261 if test x"$GCC" = xyes; then
6263         if test "x$with_jemalloc" != "xyes"; then
6265                 # incompatible-pointer-types requires gcc circa 5.x
6267                 ORIG_CFLAGS=$CFLAGS
6268                 CFLAGS="$CFLAGS -Wincompatible-pointer-types -Werror"
6269                 AC_MSG_CHECKING(for -Wincompatible-pointer-types option to gcc)
6270                 AC_TRY_COMPILE([],[
6271                 ], [
6272                         AC_MSG_RESULT(yes)
6273                         CFLAGS="$ORIG_CFLAGS -Werror=incompatible-pointer-types"
6274                 ], [
6275                         AC_MSG_RESULT(no)
6276                         CFLAGS=$ORIG_CFLAGS
6277                 ])
6279                 CFLAGS="$CFLAGS -Werror=return-type"
6280         fi
6282         # Implicit function declarations are not 64 bit safe
6283         # Do this late, since this causes lots of configure tests to fail
6284         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
6285         # jay has a lot of implicit declarations
6286         JAY_CFLAGS="-Wno-implicit-function-declaration"
6289 AC_SUBST(CFLAGS)
6290 AC_SUBST(CPPFLAGS)
6291 AC_SUBST(LDFLAGS)
6293 # Update all submodules recursively to ensure everything is checked out
6294 (cd $srcdir && scripts/update_submodules.sh)
6296 AC_OUTPUT([
6297 Makefile
6298 mono-uninstalled.pc
6299 acceptance-tests/Makefile
6300 llvm/Makefile
6301 scripts/mono-find-provides
6302 scripts/mono-find-requires
6303 mk/Makefile
6304 mono/Makefile
6305 mono/btls/Makefile
6306 mono/native/Makefile
6307 mono/utils/Makefile
6308 mono/utils/jemalloc/Makefile
6309 mono/metadata/Makefile
6310 mono/dis/Makefile
6311 mono/cil/Makefile
6312 mono/arch/Makefile
6313 mono/arch/x86/Makefile
6314 mono/arch/amd64/Makefile
6315 mono/arch/ppc/Makefile
6316 mono/arch/sparc/Makefile
6317 mono/arch/s390x/Makefile
6318 mono/arch/arm/Makefile
6319 mono/arch/arm64/Makefile
6320 mono/arch/mips/Makefile
6321 mono/arch/riscv/Makefile
6322 mono/sgen/Makefile
6323 mono/native/platform-type.c
6324 mono/native/platform-type-compat.c
6325 mono/native/platform-type-unified.c
6326 mono/tests/Makefile
6327 mono/tests/assembly-load-reference/Makefile
6328 mono/tests/tests-config
6329 mono/tests/gc-descriptors/Makefile
6330 mono/tests/testing_gac/Makefile
6331 mono/tests/llvmonly-mixed/Makefile
6332 mono/unit-tests/Makefile
6333 mono/benchmark/Makefile
6334 mono/mini/Makefile
6335 mono/profiler/Makefile
6336 mono/eglib/Makefile
6337 mono/eglib/eglib-config.h
6338 mono/eglib/test/Makefile
6339 m4/Makefile
6340 ikvm-native/Makefile
6341 scripts/Makefile
6342 man/Makefile
6343 docs/Makefile
6344 data/Makefile
6345 data/net_2_0/Makefile
6346 data/net_4_0/Makefile
6347 data/net_4_5/Makefile
6348 data/net_2_0/Browsers/Makefile
6349 data/net_4_0/Browsers/Makefile
6350 data/net_4_5/Browsers/Makefile
6351 data/mint.pc
6352 data/mono-2.pc
6353 data/monosgen-2.pc
6354 data/mono.pc
6355 data/mono-cairo.pc
6356 data/mono-options.pc
6357 data/mono-lineeditor.pc
6358 data/monodoc.pc
6359 data/dotnet.pc
6360 data/dotnet35.pc
6361 data/wcf.pc
6362 data/cecil.pc
6363 data/system.web.extensions_1.0.pc
6364 data/system.web.extensions.design_1.0.pc
6365 data/system.web.mvc.pc
6366 data/system.web.mvc2.pc
6367 data/system.web.mvc3.pc
6368 data/aspnetwebstack.pc
6369 data/reactive.pc
6370 samples/Makefile
6371 support/Makefile
6372 data/config
6373 tools/Makefile
6374 tools/locale-builder/Makefile
6375 tools/sgen/Makefile
6376 tools/pedump/Makefile
6377 runtime/Makefile
6378 msvc/Makefile
6379 po/Makefile
6382 if test x$host_win32 = xyes; then
6383    # Get rid of 'cyg' prefixes in library names
6384    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6385    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
6386    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
6387    # executable doesn't work...
6388    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6391 if test x$host_darwin = xyes; then
6392    # This doesn't seem to be required and it slows down parallel builds
6393    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
6397   case $prefix in
6398   NONE) prefix=$ac_default_prefix ;;
6399   esac
6400   case $exec_prefix in
6401   NONE) exec_prefix='${prefix}' ;;
6402   esac
6404   #
6405   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
6406   # any existing config.make.  This allows people to share the same source tree
6407   # with different build directories, one native and one cross
6408   #
6409   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
6411     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
6413     echo "prefix=$prefix" > $mcs_topdir/build/config.make
6414     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
6415     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
6416     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
6417     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
6418     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
6419     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
6420     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
6421     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
6423     case $INSTALL in
6424     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
6425     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
6426     esac
6428     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
6430     export VERSION
6431     [myver=$($AWK 'BEGIN {
6432       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
6433       if(length(vsplit [1]) > 4) {
6434         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
6435       }
6436       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
6437     }')]
6439     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
6440     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
6442     if test x$host_darwin = xyes; then
6443       echo "BUILD_PLATFORM = macos" >> $mcs_topdir/build/config.make
6444       echo "HOST_PLATFORM ?= macos" >> $mcs_topdir/build/config.make
6445       echo "XTEST_PLATFORM ?= osx" >> $mcs_topdir/build/config.make
6446     elif test x$host_win32 = xyes; then
6447       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
6448       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
6449       echo "XTEST_PLATFORM ?= windows" >> $mcs_topdir/build/config.make
6450     elif test x$host_linux = xyes; then
6451       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
6452       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6453       echo "XTEST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6454     else
6455       echo "BUILD_PLATFORM = unix" >> $mcs_topdir/build/config.make
6456       echo "HOST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6457       echo "XTEST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6458     fi
6460     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
6461       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
6462     fi
6464         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
6465            enable_system_aot=yes
6466         fi
6468     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
6469       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
6470     fi
6472     if test x$DISABLE_MCS_DOCS = xyes; then
6473       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
6474     fi
6476     if test x$has_extension_module != xno; then
6477         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
6478     fi
6479     
6480     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
6481     
6482     if test "x$test_bcl_opt" = "xyes"; then    
6483       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
6484     fi
6486     echo "STANDALONE_CSC_LOCATION=$CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
6487     echo "SERVER_CSC_LOCATION?=$CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
6488     echo "VBCS_LOCATION?=" >> $srcdir/$mcsdir/build/config.make
6490     if test $csc_compiler = mcs; then
6491       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
6492     fi
6494     if test "x$AOT_BUILD_FLAGS" != "x" ; then
6495       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
6496       echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
6497       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
6498     fi
6500     if test "x$AOT_MODE" != "x" ; then
6501       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
6502     fi
6504     if test "x$enable_btls" = "xyes"; then
6505       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
6506     fi
6508     if test "x$mono_native" = "xyes"; then
6509       echo "MONO_NATIVE_SUPPORTED=true" >> $srcdir/$mcsdir/build/config.make
6510     else
6511       echo "MONO_NATIVE_SUPPORTED=false" >> $srcdir/$mcsdir/build/config.make
6512     fi
6514     if test x$mono_native_compat = xyes; then
6515       echo "MONO_NATIVE_USING_COMPAT=true" >> $srcdir/$mcsdir/build/config.make
6516     else
6517       echo "MONO_NATIVE_USING_COMPAT=false" >> $srcdir/$mcsdir/build/config.make
6518     fi
6520     echo "MONO_NATIVE_PLATFORM_TYPE=$MONO_NATIVE_PLATFORM_TYPE" >> $srcdir/$mcsdir/build/config.make
6521     echo "MONO_NATIVE_PLATFORM=$MONO_NATIVE_PLATFORM" >> $srcdir/$mcsdir/build/config.make
6522     if test x$enable_compiler_server = xyes; then
6523       echo "ENABLE_COMPILER_SERVER?=1" >> $srcdir/$mcsdir/build/config.make
6524     else
6525       echo "ENABLE_COMPILER_SERVER?=0" >> $srcdir/$mcsdir/build/config.make
6526     fi
6527     echo "COMPILER_SERVER_PIPENAME?=monomake" >> $srcdir/$mcsdir/build/config.make
6529   fi
6533 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
6535 btls_platform_string=
6536 if test x$enable_btls = xyes; then
6537         if test x$btls_android = xyes; then
6538                 btls_platform_string=" (android:$BTLS_PLATFORM)"
6539         else
6540                 btls_platform_string=" ($BTLS_PLATFORM)"
6541         fi
6544 thread_suspend_msg=
6545 if test x$buildsgen = xyes; then
6546         if test x$enable_cooperative_suspend != xno; then
6547                 thread_suspend_msg="Suspend:       Cooperative"
6548         elif test x$enable_hybrid_suspend != xno; then
6549                 thread_suspend_msg="Suspend:       Hybrid"
6550         else
6551                 thread_suspend_msg="Suspend:       Preemptive"
6552         fi
6554         
6555 echo "
6556         mcs source:    $mcsdir
6557         C# Compiler:   $csc_compiler
6559    Engine:
6560         Host:          $host
6561         Target:        $target
6562         GC:            $gc_msg 
6563         $thread_suspend_msg
6564         TLS:           $with_tls
6565         SIGALTSTACK:   $with_sigaltstack
6566         Engine:        $jit_status
6567         BigArrays:     $enable_big_arrays
6568         DTrace:        $enable_dtrace
6569         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm, built in-tree: $internal_llvm, assertions: $enable_llvm_asserts, msvc only: $enable_llvm_msvc_only)
6570         Spectre:       $spectre_mitigation_status
6571         Mono.Native:   $mono_native_text
6573    Libraries:
6574         .NET 4.x:        $with_profile4_x
6575         Xamarin.Android: $with_monodroid
6576         Xamarin.iOS:     $with_monotouch
6577         Xamarin.WatchOS: $with_monotouch_watch
6578         Xamarin.TVOS:    $with_monotouch_tv
6579         Xamarin.Mac:     $with_xammac
6580         Windows AOT:     $with_winaot
6581         Orbis:           $with_orbis
6582         Unreal:          $with_unreal
6583         WebAssembly:     $with_wasm
6584         Test profiles:   AOT Full ($with_testing_aot_full), AOT Hybrid ($with_testing_aot_hybrid)
6585         JNI support:     $jdk_headers_found
6586         libgdiplus:      $libgdiplus_msg
6587         zlib:            $zlib_msg
6588         BTLS:            $enable_btls$btls_platform_string
6589         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
6590         crash reporting: $crash_reporting (private crashes: $with_crash_privacy)
6591         .NET Core:       $with_core
6592         $disabled
6594 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
6595    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)