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