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