[WIP] [WASM] AOT work (#11746)
[mono-project.git] / configure.ac
blob31bc6e0a60c83dc4b4a2ccfd13953332955f2091
1 # Process this file with autoconf to produce a configure script.
2 #AC_PREREQ([2.62])
4 AC_INIT(mono, [5.21.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 AM_EXTRA_RECURSIVE_TARGETS([test])
24 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=5FEF1218-A70A-4752-9D8E-0A73E497190B
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 platform_android=no
121 platform_tizen=no
122 platform_ios=no
123 host_darwin=no
124 host_linux=no
126 case "$host" in
127         wasm32*)
128                 CFLAGS="$CFLAGS -D_REENTRANT -D_GNU_SOURCE -s WASM=1"
129                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DUSE_MMAP -s WASM=1"
130                 libdl="-ldl"
131                 libgc_threads=pthreads
132                 platform_wasm=yes
133                 ;;
134         *-mingw*|*-*-cygwin*)
135                 AC_DEFINE(DISABLE_PORTABILITY,1,[Disable the io-portability layer])
136                 AC_DEFINE(HOST_NO_SYMLINKS,1,[This platform does not support symlinks])
137                 host_win32=yes
138                 mono_cv_clang=no
139                 if test "x$cross_compiling" = "xno"; then
140                         if test "x$host" = "x$build" -a "x$host" = "x$target"; then
141                                 target_win32=yes
142                         fi
143                 else
144                         if test "x$host" = "x$target"; then
145                                 target_win32=yes
146                         fi
147                 fi
148                 HOST_CC="gcc"
150                 # Windows 7 or later is required
151                 WIN32_CPPFLAGS="-DWINVER=0x0601 -D_WIN32_WINNT=0x0601 -D_WIN32_IE=0x0501 -D_UNICODE -DUNICODE -DWIN32_THREADS -DFD_SETSIZE=1024"
152                 CPPFLAGS="$CPPFLAGS $WIN32_CPPFLAGS"
153                 WIN32_LDFLAGS="-lbcrypt -lmswsock -lws2_32 -lole32 -loleaut32 -lpsapi -lversion -ladvapi32 -lwinmm -lkernel32 -liphlpapi"
154                 LDFLAGS="$LDFLAGS $WIN32_LDFLAGS"
155                 libmono_cflags="-mms-bitfields -mwindows"
156                 libmono_ldflags="-mms-bitfields -mwindows"
157                 libdl=
158                 libgc_threads=win32
159                 with_sigaltstack=no
160                 with_tls=pthread
161                 with_sgen_default_concurrent=yes
162                 LN_S=cp
163                 # This forces libgc to use the DllMain based thread registration code on win32
164                 libgc_configure_args="$libgc_configure_args --enable-win32-dllmain=yes"
165                 ;;
166         *-*-*netbsd*)
167                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DGC_NETBSD_THREADS -D_GNU_SOURCE"
168                 libmono_cflags="-D_REENTRANT"
169                 LDFLAGS="$LDFLAGS -pthread"
170                 CPPFLAGS="$CPPFLAGS -DHOST_BSD"
171                 libmono_ldflags="-pthread"
172                 need_link_unlink=yes
173                 libdl="-ldl"
174                 libgc_threads=pthreads
175                 with_sigaltstack=no
176                 use_sigposix=yes
177                 with_sgen_default_concurrent=yes
178                 ;;
179         *-*-kfreebsd*-gnu)
180                 CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP -DUSE_MUNMAP -DTHREAD_LOCAL_ALLOC -pthread"
181                 libmono_cflags="-D_REENTRANT -DTHREAD_LOCAL_ALLOC -pthread"
182                 libmono_ldflags="-lpthread -pthread"
183                 libdl="-ldl"
184                 libgc_threads=pthreads
185                 need_link_unlink=yes
186                 with_sigaltstack=no
187                 use_sigposix=yes
188                 with_sgen_default_concurrent=yes
189                 ;;
190         *-*-*freebsd*)
191                 dnl For close_my_fds
192                 LDFLAGS="$LDFLAGS -lutil"
193                 if test "x$PTHREAD_CFLAGS" = "x"; then
194                         CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS"
195                         libmono_cflags=
196                 else
197                         CPPFLAGS="$CPPFLAGS $PTHREAD_CFLAGS -DGC_FREEBSD_THREADS"
198                         libmono_cflags="$PTHREAD_CFLAGS"
199                 fi
200                 if test "x$PTHREAD_LIBS" = "x"; then
201                         LDFLAGS="$LDFLAGS -pthread -L/usr/local/lib"
202                         libmono_ldflags="-pthread"
203                 else
204                         LDFLAGS="$LDFLAGS $PTHREAD_LIBS -L/usr/local/lib"
205                         libmono_ldflags="$PTHREAD_LIBS"
206                 fi
207                 CPPFLAGS="$CPPFLAGS -DHOST_BSD -D_WITH_GETLINE"
208                 need_link_unlink=yes
209                 AC_DEFINE(PTHREAD_POINTER_ID, 1, [pthread is a pointer])
210                 libdl=
211                 libgc_threads=pthreads
212                 use_sigposix=yes
213                 has_dtrace=yes
214                 case "$host" in
215                 aarch64-*)
216                         support_boehm=no
217                         with_gc=sgen
218                         ;;
219                 riscv*)
220                         support_boehm=no
221                         with_gc=sgen
222                         ;;
223                 esac
224                 with_sgen_default_concurrent=yes
225                 ;;
226         *-*-*openbsd*)
227                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_OPENBSD_THREADS -DHOST_BSD -D_REENTRANT -DUSE_MMAP"
228                 LDFLAGS="${LDFLAGS} -Wl,-zwxneeded"
229                 if test "x$disable_munmap" != "xyes"; then
230                 CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
231                 fi
232                 libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
233                 LDFLAGS="$LDFLAGS -pthread"
234                 need_link_unlink=yes
235                 AC_DEFINE(PTHREAD_POINTER_ID)
236                 libdl=
237                 libgc_threads=pthreads
238                 with_tls=pthread
239                 with_sigaltstack=no
240                 use_sigposix=yes
241                 with_sgen_default_concurrent=yes
242                 ;;
243         *-*-linux-android*)
244                 platform_android=yes
245                 AC_DEFINE(HOST_ANDROID,1,[Targeting the Android platform])
246                 AC_DEFINE(TARGET_ANDROID,1,[Targeting the Android platform])
248                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
249                 if test "x$disable_munmap" != "xyes"; then
250                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
251                 fi
252                 libmono_cflags="-D_REENTRANT"
253                 libdl="-ldl"
254                 libgc_threads=pthreads
255                 use_sigposix=yes
257                 with_tls=pthread
258                 with_sigaltstack=no
259                 with_static_mono=no
261                 # Android doesn't support boehm, as it's missing <link.h>
262                 support_boehm=no
263                 with_gc=sgen
265                 # isinf(3) requires -lm
266                 LDFLAGS="$LDFLAGS -lm"
268                 # Bionic's <pthread.h> sets PTHREAD_STACK_MIN=2*PAGE_SIZE; doesn't define
269                 # PAGE_SIZE; breaks mono/io-layer/collection.c
270                 # Bionic doesn't provide S_IWRITE; breaks io-layer/io.c
271                 CFLAGS="$CFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
272                 CXXFLAGS="$CXXFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
274                 # to bypass the underscore linker check, can't work when cross-compiling
275                 mono_cv_uscore=yes
276                 mono_cv_clang=no
277                 ;;
278         *-*-linux*)
279                 host_linux=yes
280                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
281                 if test "x$disable_munmap" != "xyes"; then
282                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
283                 fi
284                 libmono_cflags="-D_REENTRANT"
285                 libdl="-ldl"
286                 libgc_threads=pthreads
287                 use_sigposix=yes
288                 if test "x$cross_compiling" != "xno"; then
289                         # to bypass the underscore linker check, not
290                         # available during cross-compilation
291                         mono_cv_uscore=no
292                 fi
293                 case "$host" in
294                 *-tizen-linux-*)
295                         platform_tizen=yes
296                         ;;
297                 esac
298                 case "$host" in
299                 aarch64-*)
300                         support_boehm=no
301                         with_gc=sgen
302                         ;;
303                 powerpc*-*-linux*)
304                         # https://bugzilla.novell.com/show_bug.cgi?id=504411
305                         disable_munmap=yes
306                         ;;
307                 riscv*)
308                         support_boehm=no
309                         with_gc=sgen
310                         ;;
311                 esac
312                 with_sgen_default_concurrent=yes
313                 ;;
314         *-*-nacl*)
315                 echo "nacl no longer supported."
316                 exit 1
317                 ;;
318         *-*-hpux*)
319                 CPPFLAGS="$CPPFLAGS -DGC_HPUX_THREADS -D_HPUX_SOURCE -D_XOPEN_SOURCE_EXTENDED -D_REENTRANT"
320                 # +ESdbgasm only valid on bundled cc on RISC
321                 # silently ignored for ia64
322                 if test $GCC != "yes"; then
323                         CFLAGS="$CFLAGS +ESdbgasm"
324                         # Arrange for run-time dereferencing of null
325                         # pointers to produce a SIGSEGV signal.
326                         LDFLAGS="$LDFLAGS -z"
327                 fi
328                 CFLAGS="$CFLAGS +ESdbgasm"
329                 LDFLAGS="$LDFLAGS -z"
330                 libmono_cflags="-D_REENTRANT"
331                 libmono_ldflags="-lpthread"
332                 libgc_threads=pthreads
333                 need_link_unlink=yes
334                 use_sigposix=yes
335                 ;;
336         *-*-solaris*)
337                 CPPFLAGS="$CPPFLAGS -DGC_SOLARIS_THREADS -DGC_SOLARIS_PTHREADS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -DUSE_MMAP -DUSE_MUNMAP -DHOST_SOLARIS"
338                 need_link_unlink=yes
339                 libmono_cflags="-D_REENTRANT"
340                 libgc_threads=pthreads
341                 has_dtrace=yes
342                 use_sigposix=yes
343                 enable_solaris_tar_check=yes
344                 ;;
345         *-*-darwin*)
346                 parallel_mark="Disabled_Currently_Hangs_On_MacOSX"
347                 host_darwin=yes
348                 target_mach=yes
349                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_MACOSX_THREADS -DUSE_MMAP -DUSE_MUNMAP"
350                 libmono_cflags="-D_THREAD_SAFE"
351                 need_link_unlink=yes
352                 AC_DEFINE(PTHREAD_POINTER_ID)
353                 AC_DEFINE(USE_MACH_SEMA, 1, [...])
354                 libdl=
355                 libgc_threads=pthreads
356                 has_dtrace=yes
357                 if test "x$cross_compiling" = "xyes"; then
358                         has_broken_apple_cpp=yes
359                 fi
360                 dnl Snow Leopard is horribly broken -- it reports itself as i386-apple-darwin*, but
361                 dnl its gcc defaults to 64-bit mode.  They have also deprecated the usage of ucontext
362                 dnl we need to set some flags to build our 32-bit binaries on 10.6 properly
363                 case "$host" in
364                         dnl Snow Leopard and newer config.guess reports as this
365                         i*86-*-darwin*)
366                                 BROKEN_DARWIN_FLAGS="-arch i386"
367                                 BROKEN_DARWIN_CPPFLAGS=""
368                                 CPPFLAGS="$CPPFLAGS $BROKEN_DARWIN_CPPFLAGS"
369                                 CFLAGS="$CFLAGS $BROKEN_DARWIN_FLAGS"
370                                 CXXFLAGS="$CXXFLAGS $BROKEN_DARWIN_FLAGS"
371                                 CCASFLAGS="$CCASFLAGS $BROKEN_DARWIN_FLAGS"
372                                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC $BROKEN_DARWIN_CPPFLAGS"
373                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC $BROKEN_DARWIN_FLAGS"
374                                 with_sgen_default_concurrent=yes
375                                 ;;
376                         x*64-*-darwin*)
377                                 with_sgen_default_concurrent=yes
378                                 ;;
379                         arm*-darwin*)
380                                 platform_ios=yes
381                                 has_dtrace=no
382                                 ;;
383                         aarch64*-darwin*)
384                                 platform_ios=yes
385                                 ;;
386                 esac
387                 ;;
388         *-*-haiku*)
389                 dnl BSD_SOURCE is for getifaddrs
390                 CPPFLAGS="$CPPFLAGS -D_BSD_SOURCE -D_REENTRANT -D_THREAD_SAFE"
391                 libmono_cflags="-D_REENTRANT -D_THREAD_SAFE"
392                 libdl=
393                 LIBS="$LIBS -lnetwork -ltextencoding"
394                 need_link_unlink=yes
395                 AC_DEFINE(PTHREAD_POINTER_ID)
396                 dnl Haiku does not support static TLS with __thread
397                 with_tls=pthread
398                 libgc_threads=pthreads
399                 use_sigposix=yes
400                 with_sigaltstack=no
401                 ;;
402         *-*-aix*|*-*-os400*)
403                 dnl Set up a 64-bit build
404                 CPPFLAGS="$CPPFLAGS -maix64 -DGC_AIX_THREADS -D_ALL_SOURCE -D_THREAD_SAFE -D_LARGE_FILES -D_REENTRANT"
405                 LDFLAGS="-maix64"
406                 libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
407                 dnl Would you believe GNU nm doesn't know how to process AIX libraries?
408                 dnl Hardcode IBM binutils in case GNU ones end up on our path. Also
409                 dnl specifiy 64-bit mode for tools.
410                 AR="/usr/bin/ar -X64"
411                 NM="/usr/bin/nm -X64"
412                 dnl SGen is the future (changes to Boehm support code would be
413                 dnl required if you wish to re-enable Boehm)
414                 support_boehm=no
415                 with_gc=sgen
416                 need_link_unlink=yes
417                 use_sigposix=yes
418                 dnl the valloc call to alloc the guard page bombs out, even with extending the data area
419                 with_sigaltstack=no
420                 dnl use pthread TLS, __thread has issues with the compiler flags we use
421                 with_tls=pthread
422                 dnl ppc Linux is the same? test further
423                 disable_munmap=yes
424                 ;;
425         *)
426                 AC_MSG_WARN([*** Please add $host to configure.ac checks!])
427                 libdl="-ldl"
428                 ;;
429 esac
431 AC_MSG_RESULT(ok)
433 if test x$need_link_unlink = xyes; then
434    AC_DEFINE(NEED_LINK_UNLINK, 1, [Define if Unix sockets cannot be created in an anonymous namespace])
437 if test x$host_win32 = xyes; then
438    AC_DEFINE(HOST_WIN32, 1, [Host Platform is Win32])
441 if test x$target_win32 = xyes; then
442    AC_DEFINE(TARGET_WIN32, 1, [Target Platform is Win32])
445 if test x$host_darwin = xyes; then
446    AC_DEFINE(HOST_DARWIN, 1, [Host Platform is Darwin])
449 # Defined for all targets/platforms using classic Windows API support.
450 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
451 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
453 AC_SUBST(extra_runtime_ldflags)
454 AM_CONDITIONAL(HOST_WIN32, test x$host_win32 = xyes)
455 AM_CONDITIONAL(TARGET_WIN32, test x$target_win32 = xyes)
456 AM_CONDITIONAL(HOST_LINUX, echo x$target_os | grep -q linux)
457 AM_CONDITIONAL(HOST_DARWIN, test x$host_darwin = xyes)
458 AM_CONDITIONAL(HOST_SIGPOSIX, test x$use_sigposix = xyes)
459 AM_CONDITIONAL(HOST_ANDROID, test x$platform_android = xyes)
460 AM_CONDITIONAL(HOST_TIZEN, test x$platform_tizen = xyes)
461 AM_CONDITIONAL(HOST_IOS, test x$platform_ios = xyes)
462 AM_CONDITIONAL(HOST_WASM, test x$platform_wasm = xyes)
464 if test -z "$HOST_DARWIN_TRUE"; then :
465 PLATFORM_AOT_SUFFIX=.dylib
468 if test -z "$HOST_LINUX_TRUE"; then :
469 PLATFORM_AOT_SUFFIX=.so
472 if test -z "$HOST_WIN32_TRUE"; then :
473 PLATFORM_AOT_SUFFIX=.dll
476 AC_SUBST(PLATFORM_AOT_SUFFIX)
478 ## PLATFORM_AOT_SUFFIX not so simple for windows :-)
480 AC_CHECK_TOOL(CC, gcc, gcc)
481 AC_PROG_CC
482 AC_CHECK_TOOL(CXX, g++, g++)
483 AC_PROG_CXX
484 AM_PROG_AS
485 AC_PROG_INSTALL
486 AC_PROG_AWK
487 AM_PROG_CC_C_O
488 dnl We should use AM_PROG_AS, but it's not available on automake/aclocal 1.4
489 : ${CCAS='$(CC)'}
490 # Set ASFLAGS if not already set.
491 : ${CCASFLAGS='$(CFLAGS)'}
492 AC_SUBST(CCAS)
493 AC_SUBST(CCASFLAGS)
495 # AC_PROG_CXX helpfully sets CXX to g++ even if no c++ compiler is found so check
496 # GXX instead. See http://lists.gnu.org/archive/html/bug-autoconf/2002-04/msg00056.html
497 if test "x$CXX" = "xg++"; then
498         if test "x$GXX" != "xyes"; then
499                 # automake/libtool is so broken, it requires g++ even if the c++ sources
500                 # are inside automake conditionals
501                 AC_MSG_ERROR([You need to install g++])
502         fi
505 dnl may require a specific autoconf version
506 dnl AC_PROG_CC_FOR_BUILD
507 dnl CC_FOR_BUILD not automatically detected
508 CC_FOR_BUILD=$CC
509 CFLAGS_FOR_BUILD=$CFLAGS
510 BUILD_EXEEXT=
511 if test "x$cross_compiling" = "xyes"; then
512         CC_FOR_BUILD=cc
513         CFLAGS_FOR_BUILD=
514         BUILD_EXEEXT=""
516 AC_SUBST(CC_FOR_BUILD)
517 AC_SUBST(CFLAGS_FOR_BUILD)
518 AC_SUBST(HOST_CC)
519 AC_SUBST(BUILD_EXEEXT)
521 AM_CONDITIONAL(CROSS_COMPILING, [test x$cross_compiling = xyes])
522 AM_CONDITIONAL(USE_BATCH_FILES, [test x$host_win32 = xyes -a x$cross_compiling = xyes])
524 # Set STDC_HEADERS
525 AC_HEADER_STDC
526 AC_LIBTOOL_WIN32_DLL
527 # This causes monodis to not link correctly
528 #AC_DISABLE_FAST_INSTALL
530 #lookup makedev() header
531 AC_HEADER_MAJOR
533 AM_PROG_LIBTOOL
534 # Use dolt (http://dolt.freedesktop.org/) instead of libtool for building.
535 DOLT
537 export_ldflags=`(./libtool --config; echo eval echo \\$export_dynamic_flag_spec) | sh`
538 AC_SUBST(export_ldflags)
540 # Test whenever ld supports -version-script
541 AC_PROG_LD
542 AC_PROG_LD_GNU
544 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)
545 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)
546 AC_CHECK_HEADERS([linux/netlink.h linux/rtnetlink.h],
547                   [], [], [#include <stddef.h>
548                   #include <sys/socket.h>
549                   #include <linux/socket.h>])
551 AC_CHECK_HEADERS(sys/user.h, [], [],
553 #ifdef HAVE_SYS_PARAM_H
554 # include <sys/param.h>
555 #endif
558 AC_CHECK_HEADERS(linux/serial.h)
560 AC_CHECK_HEADER(zlib.h, [have_zlib=yes], [have_zlib=no])
561 if test x$have_zlib = xyes; then
562    AC_TRY_COMPILE([#include <zlib.h>], [
563    #if defined(ZLIB_VERNUM) && (ZLIB_VERNUM >= 0x1230)
564    #else
565    #error No good zlib found
566    #endif
567    ],[
568         AC_MSG_RESULT(Using system zlib)
569         zlib_msg="system zlib"
570         AC_DEFINE(HAVE_SYS_ZLIB,1,[Have system zlib])
571    ],[
572         AC_MSG_RESULT(Using embedded zlib)
573         have_zlib=no
574         zlib_msg="bundled zlib"
575    ])
578 AM_CONDITIONAL(HAVE_ZLIB, test x$have_zlib = xyes)
579 AC_DEFINE(HAVE_ZLIB,1,[Have system zlib])
581 # for mono/metadata/debug-symfile.c
582 AC_CHECK_HEADERS(elf.h)
584 # for support
585 AC_CHECK_HEADERS(poll.h)
586 AC_CHECK_HEADERS(sys/poll.h)
587 AC_CHECK_HEADERS(sys/wait.h)
588 AC_CHECK_HEADERS(grp.h)
589 AC_CHECK_HEADERS(syslog.h)
590 AC_CHECK_FUNCS(vsyslog)
592 # for mono/dis
593 AC_CHECK_HEADERS(wchar.h)
595 # for Linux statfs support
596 AC_CHECK_HEADERS(linux/magic.h)
598 # For Android NDK unified headers
599 if test x$platform_android = xyes; then
600         AC_CHECK_HEADERS(machine/endian.h sys/endian.h)
601         AC_CHECK_HEADERS(android/legacy_signal_inlines.h, [have_android_signal_inlines=yes], [have_android_signal_inlines=no])
603         # Make sure SIGRT{MIN,MAX} work - they will fail to work with unified headers if building for
604         # API level < 21 *and* android/legacy_signal_inlines.h doesn't declare (and define) the required
605         # libc APIs to obtain values for SIGRT{MIN,MAX}. We perform the check only if android/legacy_signal_inlines.h
606         # is found because in other cases the macros will either work (for NDK < 14) or fail if the legacy header
607         # doesn't contain the required definitions (NDK 14)
608         if test x$have_android_signal_inlines = xyes; then
609                 AC_MSG_CHECKING([Whether Android SIGRTMIN/SGRTMAX macros are valid])
610                 AC_COMPILE_IFELSE([
611                         AC_LANG_PROGRAM([#include <android/legacy_signal_inlines.h>],[
612                                 int i;
613                                 for (i = SIGRTMIN + 1; i < SIGRTMAX; ++i) {
614                                 }
615                         ])],[
616                                 AC_MSG_RESULT(yes)
617                                 android_sigrtminmax_work=yes
618                         ],[
619                                 AC_MSG_RESULT(no)
620                                 android_sigrtminmax_work=no
621                         ]
622                 )
624                 if test x$android_sigrtminmax_work = xno; then
625                         AC_MSG_ERROR([Android SIGRTMIN/SIGRTMAX macros don't work in this NDK])
626                 fi
627         fi
629         # Attempt to detect whether we're using Android NDK unified headers
630         AC_CHECK_HEADERS(android/api-level.h, [have_android_api_level=yes], [have_android_api_level=no])
631         AC_CHECK_HEADERS(android/versioning.h, [have_android_versioning=yes], [have_android_versioning=no])
633         android_unified_headers=no
634         if test x$have_android_api_level = xyes; then
635                 if test x$have_android_versioning = xyes; then
636                         AC_MSG_CHECKING([whether using Android NDK unified headers])
638                         # Both macros are defined only in the NDK unified headers
639                         AC_COMPILE_IFELSE([
640                                 AC_LANG_PROGRAM([
641                                         #include <android/api-level.h>
642                                         #include <android/versioning.h>
643                                 ],[
644                                         #if __ANDROID_API_O__ == 26 && defined(__INTRODUCED_IN)
645                                         #else
646                                                 #error __ANDROID_API_O__ != 26 or the __INTRODUCED_IN macro not defined
647                                         #endif
648                                 ])],[
649                                         AC_MSG_RESULT(yes)
650                                         android_unified_headers=yes
651                                 ],[
652                                         AC_MSG_RESULT(no)
653                                         android_unified_headers=no
654                                 ]
655                         )
656                 fi
657         fi
659         if test x$android_unified_headers = xyes; then
660                 AC_DEFINE(ANDROID_UNIFIED_HEADERS, 1, [Whether Android NDK unified headers are used])
661         fi
662 fi # Android
664 # not 64 bit clean in cross-compile
665 AC_CHECK_SIZEOF(void *)
666 AC_CHECK_SIZEOF(long)
668 AC_CHECK_SIZEOF(int)
669 AC_CHECK_SIZEOF(long long)
671 AC_CACHE_CHECK([for clang],
672         mono_cv_clang,[
673         AC_TRY_COMPILE([], [
674                 #ifdef __clang__
675                 #else
676                 #error "FAILED"
677                 #endif
678         ],
679         [mono_cv_clang=yes],
680         [mono_cv_clang=no],
681         [])
684 AC_ARG_ENABLE(visibility-hidden,
685 [  --disable-visibility-hidden    disable usage of -fvisiblity=hidden],
686    disable_visibility_hidden=yes, disable_visibility_hidden=no)
688 WARN=''
689 if test x"$GCC" = xyes; then
690                 WARN='-Wall -Wunused -Wmissing-declarations -Wpointer-arith -Wno-cast-qual -Wwrite-strings -Wno-switch -Wno-switch-enum -Wno-unused-value -Wno-attributes'
691                 CFLAGS="$CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs -Wno-format-zero-length"
693                 # We require C99 with some GNU extensions, e.g. `linux` macro
694                 CFLAGS="$CFLAGS -std=gnu99"
696                 # The runtime code does not respect ANSI C strict aliasing rules
697                 CFLAGS="$CFLAGS -fno-strict-aliasing"
699                 # We rely on signed overflow to behave
700                 CFLAGS="$CFLAGS -fwrapv"
702                 CFLAGS="$CFLAGS -DMONO_DLL_EXPORT"
703                 if test x"$disable_visibility_hidden" = xno; then
704                    # Don't export any symbols by default
705                    SHARED_CFLAGS="-fvisibility=hidden"
706                    CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
707                 fi
709                 ORIG_CFLAGS=$CFLAGS
710                 # Check for the normal version, since gcc ignores unknown -Wno options
711                 CFLAGS="$CFLAGS -Wunused-but-set-variable -Werror"
712                 AC_MSG_CHECKING(for -Wno-unused-but-set-variable option to gcc)
713                 AC_TRY_COMPILE([],[
714                 ], [
715                    AC_MSG_RESULT(yes)
716                    CFLAGS="$ORIG_CFLAGS -Wno-unused-but-set-variable"
717                 ], [
718                    AC_MSG_RESULT(no)
719                    CFLAGS=$ORIG_CFLAGS
720                 ])
722                 if test "x$mono_cv_clang" = "xyes"; then
723                    # https://bugzilla.samba.org/show_bug.cgi?id=8118
724                    WARN="$WARN -Qunused-arguments"
725                    WARN="$WARN -Wno-unused-function -Wno-tautological-compare -Wno-parentheses-equality -Wno-self-assign -Wno-return-stack-address -Wno-constant-logical-operand"
726                    # We rely on zero length arrays in structs
727                    WARN="$WARN -Wno-zero-length-array"
728                 fi
729 else
730         # The Sun Forte compiler complains about inline functions that access static variables
731         # so disable all inlining.
732         case "$host" in
733         *-*-solaris*)
734                 CFLAGS="$CFLAGS -Dinline="
735                 ;;
736         esac
738 CFLAGS="$WARN $CFLAGS -g"
739 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -g"
740 CPPFLAGS="$WARN $CPPFLAGS -g"
742 # Where's the 'mcs' source tree?
743 if test -d $srcdir/mcs; then
744   mcsdir=mcs
745 else
746   mcsdir=../mcs
749 AC_ARG_WITH(mcs-path, [  --with-mcs-path=/path/to/mcs      Specify an alternate mcs source tree],
750         if test x$with_mcs_path != "x" -a -d $with_mcs_path ; then
751                 mcsdir=$with_mcs_path
752         fi
755 AC_ARG_WITH(jumptables, [  --with-jumptables=yes,no      enable/disable support for jumptables (ARM-only for now) (defaults to no)],[],[with_jumptables=no])
758 # A sanity check to catch cases where the package was unpacked
759 # with an ancient tar program (Solaris)
761 AC_ARG_ENABLE(solaris-tar-check,
762 [  --disable-solaris-tar-check    disable solaris tar check],
763    do_solaris_tar_check=no, do_solaris_tar_check=yes)
765 if test x"$do_solaris_tar_check" = xyes -a x"$enable_solaris_tar_check" = xyes; then
766         AC_MSG_CHECKING(integrity of package)
767         if test -f $mcsdir/class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapTypeMapper.cs
768         then
769                 AC_MSG_RESULT(ok)
770         else
771                 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"
772                 AC_MSG_ERROR([$errorm])
773         fi
776 if test "x$with_mcs_path" != "x"; then
777 mcs_topdir=$(cd "$mcsdir" && pwd)
778 mcs_topdir_from_srcdir=$mcs_topdir
779 else
780 mcs_topdir=$(cd "$srcdir/$mcsdir" && pwd)
781 mcs_topdir_from_srcdir='$(top_builddir)'/$mcsdir
784 # Convert mcs_topdir* paths to Windows syntax.
785 if test x$cross_compiling$host_win32 = xnoyes; then
786   mcs_topdir=$(cygpath -m $mcs_topdir)
787   case $mcs_topdir_from_srcdir in
788     /cygdrive/*)
789         mcs_topdir_from_srcdir=$(cygpath -m $mcs_topdir_from_srcdir)
790         ;;
791   esac
794 AC_SUBST([mcs_topdir])
795 AC_SUBST([mcs_topdir_from_srcdir])
797 # gettext: prepare the translation directories. 
798 # we do not configure the full gettext, as we consume it dynamically from C#
799 AM_PO_SUBDIRS
801 if test "x$USE_NLS" = "xyes"; then
802    AC_CHECK_PROG(HAVE_MSGFMT, msgfmt,yes,no)
804    if test "x$HAVE_MSGFMT" = "xno"; then
805           AC_MSG_ERROR([msgfmt not found. You need to install the 'gettext' package, or pass --enable-nls=no to configure.])
806    fi
809 AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
811 pkg_config_path=
812 AC_ARG_WITH(crosspkgdir, [  --with-crosspkgdir=/path/to/pkg-config/dir      Change pkg-config dir to custom dir],
813         if test x$with_crosspkgdir = "x"; then
814                 if test -s $PKG_CONFIG_PATH; then
815                         pkg_config_path=$PKG_CONFIG_PATH
816                 fi
817         else
818                 pkg_config_path=$with_crosspkgdir
819                 PKG_CONFIG_PATH=$pkg_config_path
820                 export PKG_CONFIG_PATH
821         fi
824 AC_ARG_ENABLE(ninja,[  --enable-ninja    Enable using ninja where available], enable_ninja=$enableval)
825 AC_CHECK_PROG(HAVE_NINJA, ninja, yes, no)
826 AM_CONDITIONAL(NINJA, test x$enable_ninja = xyes -a x$HAVE_NINJA != xno)
828 AC_ARG_ENABLE(werror, [  --enable-werror Pass -Werror to the C compiler], werror_flag=$enableval, werror_flag=no)
829 if test x$werror_flag = xyes; then
830         WERROR_CFLAGS="-Werror"
832 AC_SUBST([WERROR_CFLAGS])
833 AC_SUBST([SHARED_CFLAGS])
835 GLIB_CFLAGS='-I$(top_srcdir)/mono/eglib -I$(top_builddir)/mono/eglib'
836   
837 AC_SUBST(GLIB_CFLAGS)
839 # Enable support for fast thread-local storage
840 # Some systems have broken support, so we allow to disable it.
841 AC_ARG_WITH(tls, [  --with-tls=__thread,pthread    select Thread Local Storage implementation (defaults to __thread)],[],[with_tls=__thread])
843 # Enable support for using sigaltstack for SIGSEGV and stack overflow handling
844 # This does not work on some platforms (bug #55253)
845 AC_ARG_WITH(sigaltstack, [  --with-sigaltstack=yes,no      enable/disable support for sigaltstack (defaults to yes)],[],[with_sigaltstack=yes])
847 AC_ARG_WITH(static_mono, [  --with-static_mono=yes,no      link mono statically to libmono (faster) (defaults to yes)],[],[with_static_mono=yes])
848 AC_ARG_WITH(shared_mono, [  --with-shared_mono=yes,no      build a shared libmono library (defaults to yes)],[],[with_shared_mono=yes])
849 # Same as --with-shared_mono=no
850 AC_ARG_ENABLE(libraries, [  --disable-libraries disable the build of libmono], enable_libraries=$enableval, enable_libraries=yes)
852 if test "x$enable_static" = "xno"; then
853    with_static_mono=no
856 if test "x$enable_shared" = "xno"; then
857    with_shared_mono=no
860 if test "x$enable_libraries" = "xno"; then
861    with_shared_mono=no
864 AM_CONDITIONAL(DISABLE_LIBRARIES, test x$enable_libraries = xno)
866 if test "x$host_win32" = "xyes"; then
867    # Boehm GC requires the runtime to be in its own dll
868    with_static_mono=no
871 AM_CONDITIONAL(STATIC_MONO, test x$with_static_mono != xno)
872 AM_CONDITIONAL(SHARED_MONO, test x$with_shared_mono != xno)
873 AC_ARG_ENABLE(mcs-build, [  --disable-mcs-build disable the build of the mcs directory], try_mcs_build=$enableval, enable_mcs_build=yes)
874 AC_ARG_ENABLE(support-build, [  --disable-support-build disable the build of the support directory], try_support_build=$enableval, enable_support_build=yes)
876 AC_ARG_WITH(xen_opt,   [  --with-xen_opt=yes,no          Enable Xen-specific behaviour (defaults to yes)],[],[with_xen_opt=yes])
877 if test "x$with_xen_opt" = "xyes" -a "x$mono_cv_clang" = "xno"; then
878         AC_DEFINE(MONO_XEN_OPT, 1, [Xen-specific behaviour])
879         ORIG_CFLAGS=$CFLAGS
880         CFLAGS="$CFLAGS -mno-tls-direct-seg-refs"
881         AC_MSG_CHECKING(for -mno-tls-direct-seg-refs option to gcc)
882         AC_TRY_COMPILE([], [
883         ], [
884            AC_MSG_RESULT(yes)
885            # Pass it to libgc as well
886            CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -mno-tls-direct-seg-refs"
887         ], [
888            AC_MSG_RESULT(no)
889            CFLAGS=$ORIG_CFLAGS
890         ])
893 AC_ARG_ENABLE(small-config, [  --enable-small-config Enable tweaks to reduce requirements (and capabilities)], enable_small_config=$enableval, enable_small_config=no)
895 if test x$enable_small_config = xyes; then
896         AC_DEFINE(MONO_SMALL_CONFIG,1,[Reduce runtime requirements (and capabilities)])
897         CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DSMALL_CONFIG"
900 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)
902 DISABLED_FEATURES=none
903 csc_compiler=default
904 endian=unknown
905 AC_C_BIGENDIAN([endian=big],[endian=little],[endian=unknown])
906 AC_MSG_CHECKING([CSharp compiler to use])
907 AC_ARG_WITH(csc, [  --with-csc=mcs,roslyn,default      Configures the CSharp compiler to use],[
908    if test x$withval = xmcs; then
909        csc_compiler=mcs
910    elif test x$withval = xroslyn; then
911        csc_compiler=roslyn
912    elif test x$withval = xdefault; then
913        :
914    else
915        AC_MSG_ERROR([You must supply one of "mcs", "roslyn" or "default" to the --with-csc option])
916    fi
917 ],[csc_compiler=default])
919 if test $csc_compiler = default; then
920    if test $endian = big; then
921       csc_compiler=mcs
922    elif test $endian = little; then
923       case "$host" in
924         powerpc*) csc_compiler=mcs ;;
925         *) csc_compiler=roslyn ;;
926       esac
927    else
928       csc_compiler=mcs
929    fi
931 AC_MSG_RESULT($csc_compiler)
933 AC_ARG_WITH(jemalloc,             [  --with-jemalloc=yes,no               If jemalloc is enabled (defaults to no)],                                     [], [with_jemalloc=no])
934 AC_ARG_WITH(jemalloc-always,      [  --with-jemalloc_always=yes,no        If jemalloc is enabled and always used (defaults to yes)],                    [], [with_jemalloc_always=no])
935 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])
938 if test x$target_win32 = xyes; then
939 with_jemalloc=no
940 with_jemalloc_assert=no
941 with_jemalloc_always=no
944 AM_CONDITIONAL(MONO_JEMALLOC_ASSERT, [test "x$with_jemalloc_assert" = "xyes"])
945 if test "x$with_jemalloc_assert" = "xyes"; then
946 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ASSERT"
947 AC_DEFINE(MONO_JEMALLOC_ASSERT, 1, [Make jemalloc assert for mono])
948 AC_SUBST(MONO_JEMALLOC_ASSERT, 1)
951 AM_CONDITIONAL(MONO_JEMALLOC_DEFAULT, [test "x$with_jemalloc_always" = "xyes"])
952 if test "x$with_jemalloc_always" = "xyes"; then
953 with_jemalloc=yes
954 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_DEFAULT"
955 AC_DEFINE(MONO_JEMALLOC_DEFAULT, 1, [Make jemalloc default for mono])
956 AC_SUBST(MONO_JEMALLOC_DEFAULT, 1)
959 AM_CONDITIONAL(MONO_JEMALLOC_ENABLED, [test "x$with_jemalloc" = "xyes"])
960 if test "x$with_jemalloc" = "xyes"; then
961 JEMALLOC_LDFLAGS="-L`pwd`/mono/utils/jemalloc/jemalloc/lib -ljemalloc_pic"
962 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ENABLED -I `pwd`/mono/utils/jemalloc/jemalloc/include"
963 JEMALLOC_AUTOCONF_FLAGS=" --build=$target --host=$host"
965 if test "x$target_mach" = "xyes"; then
966         JEMALLOC_CPPFLAGS=" -stdlib=libc++ "
969 AC_DEFINE(MONO_JEMALLOC_ENABLED, 1, [Enable jemalloc usage for mono])
970 AC_SUBST(MONO_JEMALLOC_ENABLED, 1)
972 AC_SUBST(JEMALLOC_CFLAGS)
973 AC_SUBST(JEMALLOC_CPPFLAGS)
974 AC_SUBST(JEMALLOC_LDFLAGS)
975 AC_SUBST(JEMALLOC_AUTOCONF_FLAGS)
978 # Terminology:
979 # Crash privacy - Attempts to not send identifying information in the crash dump / to protect the obscurity of the program control flow
980 # MERP - The MS telemetry profile. Not for general use.
981 # Structured crashes - crashes at runtime that trigger a stack walk by mono that happens cooperatively
983 # 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.
985 #--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.
986 #--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.
987 #--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.
988 #--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.
990 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])
991 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])
992 AC_ARG_ENABLE(crash-reporting,  [  --disable-crash-reporting            Enable or Disable crash reporting subsystem],        [crash_reporting=$enableval], [crash_reporting=yes])
994 if test "x$with_crash_privacy" = "xyes"; then
995 AC_DEFINE(MONO_PRIVATE_CRASHES,1,[Do not include names of unmanaged functions in the crash dump])
998 if test "x$with_structured_crashes" = "xno"; then
999 AC_DEFINE(DISABLE_STRUCTURED_CRASH,1,[Do not create structured crash files during unmanaged crashes])
1002 case "$host" in
1003         *-mingw*|*-*-cygwin*|*-*-aix*|*-*-os400*)
1004                 crash_reporting=no
1005                 ;;
1006 esac
1008 if test "x$crash_reporting" != "xyes"; then
1009 CFLAGS="$CFLAGS -DDISABLE_CRASH_REPORTING=1"
1010 CXXFLAGS="$CXXFLAGS -DDISABLE_CRASH_REPORTING=1"
1013 AC_ARG_ENABLE(monodroid, [ --enable-monodroid Enable runtime support for Monodroid (Xamarin.Android)], enable_monodroid=$enableval, enable_monodroid=no)
1014 AM_CONDITIONAL(ENABLE_MONODROID, test x$enable_monodroid = xyes)
1016 AC_ARG_ENABLE(monotouch, [ --enable-monotouch Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)], enable_monotouch=$enableval, enable_monotouch=no)
1017 AM_CONDITIONAL(ENABLE_MONOTOUCH, test x$enable_monotouch = xyes)
1019 if test x$enable_monodroid = xyes; then
1020         AC_DEFINE(ENABLE_MONODROID, 1, [Enable runtime support for Monodroid (Xamarin.Android)])
1023 if test x$enable_monotouch = xyes; then
1024         AC_DEFINE(ENABLE_MONOTOUCH, 1, [Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)])
1027 AC_ARG_ENABLE(cxx, [  --enable-cxx   compile some code as C++])
1029 # mono/corefx/native has a lot of invalid C++98 in its headers
1030 # dotnet/corefx/native looks a lot better, i.e. 44e5bdafb8d989a220c9cf1b94f31a64a6e4f052
1031 #CXXFLAGS_COMMON=' -std=gnu++98 -fno-exceptions -fno-rtti '
1032 CXXFLAGS_COMMON=' -std=gnu++0x -fno-exceptions -fno-rtti '
1033 # "c++0x" instead of C++11, for compat with Centos6/gcc4.4
1035 # -stdlib=libc++ is needed by clang for iOS 6.0 (-miphoneos-version-min=6.0)
1036 # to support C++11 headers but it does not seem to harm elsewhere, so over-approximate
1037 # and add it whenever we're running clang on Darwin.
1038 if test "x$mono_cv_clang" = xyes -a x$host_darwin = xyes; then
1039         CXXFLAGS_COMMON="$CXXFLAGS_COMMON -stdlib=libc++"
1042 AC_SUBST(CXXFLAGS_COMMON)
1044 if test "x$enable_cxx" = "xyes"; then
1046         CXX_ADD_CFLAGS=" -xc++ $CXXFLAGS_COMMON "
1048         # -std=gnu99 -xc++ is not allowed and errors.
1049         CXX_REMOVE_CFLAGS=-std=gnu99
1050         # These give warnings and should be removed. They are C-only.
1051         # i.e. C++ never allows these, they are always errors and their warningness is not controllable.
1052         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs"
1053         # Likewise with CentOS 6 gcc 4.4.
1054         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Werror-implicit-function-declaration"
1056         # The C-only-ness of -Wno-format-zero-length varies with gcc version.
1057         # It is C-only prior to 4.7. Using it with C++ prior to 4.7
1058         # generates a warning every time we run gcc which is very unsightly.
1059         # The warning is for e.g. sprintf(foo, "") which can just be
1060         # foo[0] = 0 but Mono's use is more elaborate, not as easy to "fix",
1061         # and completely legal and valid.
1062         # We have to switch to C++ and not just use -xc++ because of -std=gnu99 (error when combined with -xc++).
1063         # Alternatively, just run $CXX -xc++ -c /dev/null.
1064         AC_LANG_PUSH(C++)
1065         ORIG_CXXFLAGS=$CXXFLAGS
1066         CXXFLAGS="$CXXFLAGS -Werror -Wno-format-zero-length -xc++ "
1067         AC_MSG_CHECKING(or C-only-ness of -Wno-format-zero-length)
1068         AC_TRY_COMPILE([ ], [ ], [ AC_MSG_RESULT(yes) ],
1069                                  [ AC_MSG_RESULT(no)
1070                                    CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wno-format-zero-length" ])
1071         CXXFLAGS=$ORIG_CXXFLAGS
1072         AC_LANG_POP(C++)
1074 AC_SUBST(CXX_ADD_CFLAGS)
1075 AC_SUBST(CXX_REMOVE_CFLAGS)
1078 # Set the build profiles and options before things which use them
1081 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])
1082 AC_ARG_WITH(monodroid,           [  --with-monodroid=yes,no             If you want to build the MonoDroid assemblies (defaults to no)],            [], [with_monodroid=default])
1083 AC_ARG_WITH(monotouch,           [  --with-monotouch=yes,no             If you want to build the Xamarin.iOS assemblies (defaults to no)],          [], [with_monotouch=default])
1084 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])
1085 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])
1086 AC_ARG_WITH(bitcode,             [  --with-bitcode=yes,no               If bitcode is enabled (defaults to no)],                                    [], [with_bitcode=default])
1087 AC_ARG_WITH(xammac,              [  --with-xammac=yes,no                If you want to build the Xamarin.Mac assemblies (defaults to no)],          [], [with_xammac=default])
1088 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])
1089 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])
1090 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])
1091 AC_ARG_WITH(winaot,              [  --with-winaot=yes,no                If you want to build the Windows friendly AOT assemblies (defaults to no)], [], [with_winaot=default])
1092 AC_ARG_WITH(orbis,               [  --with-orbis=yes,no                 If you want to build the Orbis assemblies (defaults to no)], [], [with_orbis=default])
1093 AC_ARG_WITH(unreal,              [  --with-unreal=yes,no                If you want to build the Unreal assemblies (defaults to no)], [], [with_unreal=default])
1094 AC_ARG_WITH(wasm,                [  --with-wasm=yes,no                  If you want to build the WebAssembly (defaults to no)], [], [with_wasm=default])
1097 AC_ARG_WITH(runtime-preset, [  --with-runtime-preset=net_4_x,all,aot,aot_llvm,hybridaot,hybridaot_llvm,fullaot,fullaot_llvm,bitcode,unreal,fullaotinterp  Which default profile to build (defaults to net_4_x)],  [], [with_runtime_preset=net_4_x])
1098 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])
1099 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])
1100 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])
1103 dnl Spectre compiler mitigation flag checks
1105 if test "x$with_spectre_mitigation" = "xyes"; then
1106    AC_MSG_NOTICE([Compiler Spectre mitigation support checks])
1107    SPECTRE_CFLAGS=
1108    SPECTRE_INDIRECT_BRANCH_KIND=
1109    case "x$with_spectre_indirect_branch_choice" in
1110        xkeep) SPECTRE_INDIRECT_BRANCH_KIND=keep ;;
1111        xthunk) SPECTRE_INDIRECT_BRANCH_KIND=thunk ;;
1112        xinline) SPECTRE_INDIRECT_BRANCH_KIND=thunk-inline ;;
1113        xextern) SPECTRE_INDIRECT_BRANCH_KIND=thunk-extern ;;
1114        *) AC_MSG_ERROR([Invalid indirect jump thunk kind ($with_spectre_indirect_branch_choice)]) ;;
1115    esac
1117    SPECTRE_FUNCTION_RETURN_KIND=""
1118    case "x$with_spectre_function_return_choice" in
1119        xkeep) SPECTRE_FUNCTION_RETURN_KIND=keep ;;
1120        xthunk) SPECTRE_FUNCTION_RETURN_KIND=thunk ;;
1121        xinline) SPECTRE_FUNCTION_RETURN_KIND=thunk-inline ;;
1122        xextern) SPECTRE_FUNCTION_RETURN_KIND=thunk-extern ;;
1123        *) AC_MSG_ERROR([Invalid function return thunk kind ($with_spectre_function_return_choice)]) ;;
1124    esac
1126    AX_CHECK_COMPILE_FLAG(
1127         [ -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND ],
1128         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND" ]
1129    )
1131    AX_CHECK_COMPILE_FLAG(
1132         [ -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND ],
1133         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND" ]
1134    )
1136    if test "x$SPECTRE_CFLAGS" != "x" ; then
1137         CFLAGS="$CFLAGS $SPECTRE_CFLAGS"
1138         CXXFLAGS="$CXXFLAGS $SPECTRE_CFLAGS"
1139         spectre_mitigation_status="mitigation enabled"
1140    fi
1141 else
1142         spectre_mitigation_status="no mitigation"
1146 dnl Profile defaults
1148 TEST_PROFILE=default
1149 enable_llvm_default=no
1151 with_profile4_x_default=no
1152 with_monodroid_default=no
1153 with_monotouch_default=no
1154 with_monotouch_watch_default=no
1155 with_monotouch_tv_default=no
1156 with_xammac_default=no
1157 with_testing_aot_full_interp_default=no
1158 with_testing_aot_hybrid_default=no
1159 with_testing_aot_full_default=no
1160 with_winaot_default=no
1161 with_orbis_default=no
1162 with_unreal_default=no
1163 with_wasm_default=no
1165 with_bitcode_default=no
1166 enable_cooperative_suspend_default=no
1167 enable_hybrid_suspend_default=no
1169 INVARIANT_AOT_OPTIONS=nimt-trampolines=2000,ntrampolines=10000,nrgctx-fetch-trampolines=256,ngsharedvt-trampolines=4000
1171 AOT_BUILD_ATTRS=$INVARIANT_AOT_OPTIONS
1173 if test x$cross_compiling = xyes -o x$enable_mcs_build = xno; then
1174    DISABLE_MCS_DOCS_default=yes
1175 elif test x$with_runtime_preset = xnet_4_x; then
1176    with_profile4_x_default=yes
1177 elif test x$with_runtime_preset = xall; then
1178    with_profile4_x_default=yes
1179    with_monodroid_default=yes
1180    with_monotouch_default=yes
1181    with_monotouch_watch_default=yes
1182    with_monotouch_tv_default=yes
1183    with_xammac_default=yes
1184    with_winaot_default=yes
1185    with_orbis_default=yes
1186    with_unreal_default=yes
1187    with_wasm_default=yes
1188    with_testing_aot_full_interp_default=yes
1189    with_testing_aot_hybrid_default=yes
1190    with_testing_aot_full_default=yes
1191 elif test x$with_runtime_preset = xbitcode; then
1192    DISABLE_MCS_DOCS_default=yes
1193    with_testing_aot_full_default=yes
1194    with_bitcode_default=yes
1195    enable_cooperative_suspend_default=yes
1196    TEST_PROFILE=testing_aot_full
1197    enable_llvm_default=yes
1199    mono_feature_disable_com='yes'
1200    mono_feature_disable_remoting='yes'
1201    mono_feature_disable_reflection_emit_save='yes'
1202    mono_feature_disable_reflection_emit='yes'
1203    mono_feature_disable_appdomains='yes'
1205    AOT_BUILD_FLAGS="--runtime=mobile --aot=llvmonly,$INVARIANT_AOT_OPTIONS"
1206    AOT_RUN_FLAGS="--runtime=mobile --llvmonly"
1207    AOT_MODE="llvmonly"
1208 elif test x$with_runtime_preset = xfullaot; then
1209    DISABLE_MCS_DOCS_default=yes
1210    with_testing_aot_full_default=yes
1211    TEST_PROFILE=testing_aot_full
1213    mono_feature_disable_com='yes'
1214    mono_feature_disable_remoting='yes'
1215    mono_feature_disable_reflection_emit_save='yes'
1216    mono_feature_disable_reflection_emit='yes'
1217    mono_feature_disable_appdomains='yes'
1219    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1220    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1221    AOT_MODE="full"
1222 elif test x$with_runtime_preset = xfullaot_llvm; then
1223    DISABLE_MCS_DOCS_default=yes
1224    with_testing_aot_full_default=yes
1225    TEST_PROFILE=testing_aot_full
1227    mono_feature_disable_com='yes'
1228    mono_feature_disable_remoting='yes'
1229    mono_feature_disable_reflection_emit_save='yes'
1230    mono_feature_disable_reflection_emit='yes'
1231    mono_feature_disable_appdomains='yes'
1233    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1234    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1235    AOT_MODE="full"
1236 elif test x$with_runtime_preset = xhybridaot; then
1237    DISABLE_MCS_DOCS_default=yes
1238    with_testing_aot_hybrid_default=yes
1239    TEST_PROFILE=testing_aot_hybrid 
1241    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1242    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1243 elif test x$with_runtime_preset = xhybridaot_llvm; then
1244    DISABLE_MCS_DOCS_default=yes
1245    with_testing_aot_hybrid_default=yes
1246    TEST_PROFILE=testing_aot_hybrid
1248    AOT_BUILD_FLAGS="--runtime=mobile --llvm --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1249    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1250 elif test x$with_runtime_preset = xfullaotinterp; then
1251    with_testing_aot_full_interp_default=yes
1252    TEST_PROFILE=testing_aot_full_interp
1254    # mscorlib.dll aot compilation crashes
1255    mono_feature_disable_com='yes'
1257    AOT_BUILD_FLAGS="--aot=full,interp,$INVARIANT_AOT_OPTIONS"
1258    AOT_RUN_FLAGS="--full-aot-interp"
1259 elif test x$with_runtime_preset = xaot; then
1260    with_profile4_x_default=yes
1262    AOT_BUILD_FLAGS="--aot=$INVARIANT_AOT_OPTIONS"
1263    AOT_RUN_FLAGS=""
1265    DISABLE_MCS_DOCS_default=yes
1266 elif test x$with_runtime_preset = xaot_llvm; then
1267    with_profile4_x_default=yes
1269    AOT_BUILD_FLAGS="--llvm --aot=$INVARIANT_AOT_OPTIONS"
1270    AOT_RUN_FLAGS=""
1272    DISABLE_MCS_DOCS_default=yes
1273 elif test x$with_runtime_preset = xwinaot; then
1274    DISABLE_MCS_DOCS_default=yes
1275    with_winaot_default=yes
1276    TEST_PROFILE=winaot
1278    mono_feature_disable_com='yes'
1279    mono_feature_disable_remoting='yes'
1280    mono_feature_disable_reflection_emit_save='yes'
1281    mono_feature_disable_reflection_emit='yes'
1282    mono_feature_disable_appdomains='yes'
1284    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1285    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1286    AOT_MODE="llvmonly"
1287 elif test x$with_runtime_preset = xorbis; then
1288    DISABLE_MCS_DOCS_default=yes
1289    with_orbis_default=yes
1290    TEST_PROFILE=orbis
1292    mono_feature_disable_com='yes'
1293    mono_feature_disable_remoting='yes'
1294    mono_feature_disable_reflection_emit_save='yes'
1295    mono_feature_disable_reflection_emit='yes'
1296    mono_feature_disable_appdomains='yes'
1298    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1299    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1300    AOT_MODE="full"
1301 elif test x$with_runtime_preset = xunreal; then
1302    DISABLE_MCS_DOCS_default=yes
1303    with_unreal_default=yes
1304    TEST_PROFILE=unreal
1306    mono_feature_disable_com='yes'
1307    mono_feature_disable_remoting='yes'
1308    mono_feature_disable_appdomains='no'
1310    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1311    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1312 elif test x$with_runtime_preset = xwasm; then
1313    DISABLE_MCS_DOCS_default=yes
1314    with_wasm_default=yes
1315    TEST_PROFILE=wasm
1317    mono_feature_disable_com='yes'
1318    mono_feature_disable_remoting='yes'
1319    mono_feature_disable_reflection_emit_save='yes'
1320    mono_feature_disable_reflection_emit='yes'
1321    mono_feature_disable_appdomains='yes'
1323    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1324    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1325 else
1326    with_profile4_x_default=yes
1329 if test "x$AOT_BUILD_FLAGS" != "x"; then :
1330    AC_SUBST(AOT_BUILD_FLAGS)
1331    AC_SUBST(AOT_RUN_FLAGS)
1332    # For llvmonlycheck + fullaotcheck
1333    AC_SUBST(INVARIANT_AOT_OPTIONS)
1336 AC_SUBST(TEST_PROFILE)
1338 if test "x$with_profile4_x" = "xdefault"; then
1339    with_profile4_x=$with_profile4_x_default
1341 if test "x$with_monodroid" = "xdefault"; then
1342    with_monodroid=$with_monodroid_default
1344 if test "x$with_monotouch" = "xdefault"; then
1345    with_monotouch=$with_monotouch_default
1347 if test "x$with_monotouch_watch" = "xdefault"; then
1348    with_monotouch_watch=$with_monotouch_watch_default
1350 if test "x$with_monotouch_tv" = "xdefault"; then
1351    with_monotouch_tv=$with_monotouch_tv_default
1353 if test "x$with_bitcode" = "xdefault"; then
1354    with_bitcode=$with_bitcode_default
1356 if test "x$with_xammac" = "xdefault"; then
1357    with_xammac=$with_xammac_default
1359 if test "x$with_testing_aot_full_interp" = "xdefault"; then
1360    with_testing_aot_full_interp=$with_testing_aot_full_interp_default
1362 if test "x$with_testing_aot_hybrid" = "xdefault"; then
1363    with_testing_aot_hybrid=$with_testing_aot_hybrid_default
1365 if test "x$with_testing_aot_full" = "xdefault"; then
1366    with_testing_aot_full=$with_testing_aot_full_default
1368 if test "x$with_winaot" = "xdefault"; then
1369    with_winaot=$with_winaot_default
1371 if test "x$with_orbis" = "xdefault"; then
1372    with_orbis=$with_orbis_default
1374 if test "x$with_unreal" = "xdefault"; then
1375    with_unreal=$with_unreal_default
1377 if test "x$with_wasm" = "xdefault"; then
1378    with_wasm=$with_wasm_default
1382 AM_CONDITIONAL(INSTALL_4_x, [test "x$with_profile4_x" = "xyes"])
1383 AM_CONDITIONAL(INSTALL_MONODROID, [test "x$with_monodroid" != "xno"])
1384 AM_CONDITIONAL(INSTALL_MONOTOUCH, [test "x$with_monotouch" != "xno"])
1385 AM_CONDITIONAL(INSTALL_MONOTOUCH_WATCH, [test "x$with_monotouch_watch" != "xno"])
1386 AM_CONDITIONAL(INSTALL_MONOTOUCH_TV, [test "x$with_monotouch_tv" != "xno"])
1387 AM_CONDITIONAL(BITCODE, test "x$with_bitcode" = "xyes")
1388 AM_CONDITIONAL(INSTALL_XAMMAC, [test "x$with_xammac" != "xno"])
1389 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL_INTERP, [test "x$with_testing_aot_full_interp" != "xno"])
1390 AM_CONDITIONAL(INSTALL_TESTING_AOT_HYBRID, [test "x$with_testing_aot_hybrid" != "xno"])
1391 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL, [test "x$with_testing_aot_full" != "xno"])
1392 AM_CONDITIONAL(INSTALL_WINAOT, [test "x$with_winaot" != "xno"])
1393 AM_CONDITIONAL(INSTALL_ORBIS, [test "x$with_orbis" != "xno"])
1394 AM_CONDITIONAL(INSTALL_UNREAL, [test "x$with_unreal" != "xno"])
1395 AM_CONDITIONAL(INSTALL_WASM, [test "x$with_wasm" != "xno"])
1396 AM_CONDITIONAL(FULL_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full"] || [test "x$TEST_PROFILE" = "xwinaot"] || [test "x$TEST_PROFILE" = "xorbis"] || [test "x$TEST_PROFILE" = "xwasm"])
1397 AM_CONDITIONAL(HYBRID_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_hybrid"] || [test "x$TEST_PROFILE" = "xunreal"])
1398 AM_CONDITIONAL(AOT_FULL_INTERP_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full_interp"])
1400 default_profile=net_4_x
1401 if test -z "$INSTALL_MONODROID_TRUE"; then :
1402    default_profile=monodroid
1404 if test -z "$INSTALL_MONOTOUCH_TRUE"; then :
1405    default_profile=monotouch
1407 if test -z "$INSTALL_XAMMAC_TRUE"; then :
1408    default_profile=xammac
1410 if test -z "$INSTALL_TESTING_AOT_FULL_INTERP_TRUE"; then :
1411    default_profile=testing_aot_full_interp
1413 if test -z "$INSTALL_TESTING_AOT_HYBRID_TRUE"; then :
1414    default_profile=testing_aot_hybrid
1416 if test -z "$INSTALL_TESTING_AOT_FULL_TRUE"; then :
1417    default_profile=testing_aot_full
1419 if test -z "$INSTALL_WINAOT_TRUE"; then :
1420    default_profile=winaot
1422 if test -z "$INSTALL_ORBIS_TRUE"; then :
1423    default_profile=orbis
1425 if test -z "$INSTALL_UNREAL_TRUE"; then :
1426    default_profile=unreal
1428 if test -z "$INSTALL_WASM_TRUE"; then :
1429    default_profile=wasm
1431 if test -z "$INSTALL_4_x_TRUE"; then :
1432    default_profile=net_4_x
1434 DEFAULT_PROFILE=$default_profile
1435 AC_SUBST(DEFAULT_PROFILE)
1438 # End build profile configuration
1441 if test x$USE_NLS = xprofile_default; then
1443         AC_MSG_CHECKING([NLS used])
1445         # We make the default value for USE_NLS
1446         # "no" on OSX because it isn't available on most
1447         # default OSX installs. The most common configurations will
1448         # all disable it, so this saves us typing.
1449         if test x$host_darwin = xyes; then
1450                 USE_NLS=no;
1451         else
1452                 USE_NLS=yes;
1453         fi
1455         AC_SUBST([USE_NLS])
1456         AC_MSG_RESULT([$USE_NLS])
1459 AC_ARG_ENABLE(minimal, [  --enable-minimal=LIST      drop support for LIST subsystems.
1460      LIST is a comma-separated list from: aot, profiler, decimal, pinvoke, debug, appdomains, verifier, 
1461      reflection_emit, reflection_emit_save, large_code, logging, com, ssa, generics, attach, jit, interpreter, simd, soft_debug, perfcounters, normalization, desktop_loader, shared_perfcounters, remoting,
1462          security, lldb, mdb, assert_messages, sgen_marksweep_conc, sgen_split_nursery, sgen_gc_bridge, sgen_debug_helpers.],
1464         for feature in `echo "$enable_minimal" | sed -e "s/,/ /g"`; do
1465                 eval "mono_feature_disable_$feature='yes'"
1466         done
1467         DISABLED_FEATURES=$enable_minimal
1468         disabled="Disabled:      $enable_minimal"
1469 ],[])
1471 AC_DEFINE_UNQUOTED(DISABLED_FEATURES, "$DISABLED_FEATURES", [String of disabled features])
1473 if test "x$mono_feature_disable_aot" = "xyes"; then
1474         AC_DEFINE(DISABLE_AOT, 1, [Disable AOT Compiler])
1475         enable_system_aot=no
1476         AC_MSG_NOTICE([Disabled AOT compiler])
1479 if test "x$mono_feature_disable_profiler" = "xyes"; then
1480         AC_DEFINE(DISABLE_PROFILER, 1, [Disable default profiler support])
1481         AC_MSG_NOTICE([Disabled support for the profiler])
1483 AM_CONDITIONAL(DISABLE_PROFILER, test x$mono_feature_disable_profiler = xyes)
1485 if test "x$mono_feature_disable_decimal" = "xyes"; then
1486         AC_DEFINE(DISABLE_DECIMAL, 1, [Disable System.Decimal support])
1487         AC_MSG_NOTICE([Disabled support for decimal])
1490 if test "x$mono_feature_disable_pinvoke" = "xyes"; then
1491         AC_DEFINE(DISABLE_PINVOKE, 1, [Disable P/Invoke support])
1492         AC_MSG_NOTICE([Disabled support for P/Invoke])
1495 if test "x$mono_feature_disable_debug" = "xyes"; then
1496         AC_DEFINE(DISABLE_DEBUG, 1, [Disable runtime debugging support])
1497         AC_MSG_NOTICE([Disabled support for runtime debugging])
1500 if test "x$mono_feature_disable_reflection_emit" = "xyes"; then
1501         AC_DEFINE(DISABLE_REFLECTION_EMIT, 1, [Disable reflection emit support])
1502         mono_feature_disable_reflection_emit_save=yes
1503         AC_MSG_NOTICE([Disabled support for Reflection.Emit])
1506 if test "x$mono_feature_disable_reflection_emit_save" = "xyes"; then
1507         AC_DEFINE(DISABLE_REFLECTION_EMIT_SAVE, 1, [Disable assembly saving support in reflection emit])
1508         AC_MSG_NOTICE([Disabled support for Reflection.Emit.Save])
1511 if test "x$mono_feature_disable_large_code" = "xyes"; then
1512         AC_DEFINE(DISABLE_LARGE_CODE, 1, [Disable support for huge assemblies])
1513         AC_MSG_NOTICE([Disabled support for large assemblies])
1516 if test "x$mono_feature_disable_logging" = "xyes"; then
1517         AC_DEFINE(DISABLE_LOGGING, 1, [Disable support debug logging])
1518         AC_MSG_NOTICE([Disabled support for logging])
1521 if test "x$mono_feature_disable_com" = "xyes"; then
1522         AC_DEFINE(DISABLE_COM, 1, [Disable COM support])
1523         AC_MSG_NOTICE([Disabled COM support])
1526 if test "x$mono_feature_disable_ssa" = "xyes"; then
1527         AC_DEFINE(DISABLE_SSA, 1, [Disable advanced SSA JIT optimizations])
1528         AC_MSG_NOTICE([Disabled SSA JIT optimizations])
1531 if test "x$mono_feature_disable_generics" = "xyes"; then
1532         AC_DEFINE(DISABLE_GENERICS, 1, [Disable generics support])
1533         AC_MSG_NOTICE([Disabled Generics Support])
1536 if test "x$mono_feature_disable_shadowcopy" = "xyes"; then
1537         AC_DEFINE(DISABLE_SHADOW_COPY, 1, [Disable Shadow Copy for AppDomains])
1538         AC_MSG_NOTICE([Disabled Shadow copy for AppDomains])
1541 if test "x$mono_feature_disable_portability" = "xyes"; then
1542         AC_DEFINE(DISABLE_PORTABILITY, 1, [Disables the IO portability layer])
1543         AC_MSG_NOTICE([Disabled IO Portability layer])
1546 if test "x$mono_feature_disable_attach" = "xyes"; then
1547         AC_DEFINE(DISABLE_ATTACH, 1, [Disable agent attach support])
1548         AC_MSG_NOTICE([Disabled agent attach])
1551 if test "x$mono_feature_disable_verifier" = "xyes"; then
1552         AC_DEFINE(DISABLE_VERIFIER, 1, [Disables the verifier])
1553         AC_MSG_NOTICE([Disabled the metadata and IL verifiers])
1556 if test "x$mono_feature_disable_jit" = "xyes"; then
1557         AC_DEFINE(DISABLE_JIT, 1, [Disable the JIT, only full-aot mode or interpreter will be supported by the runtime.])
1558         AC_MSG_NOTICE([Disabled the JIT engine, only full AOT or interpreter will be supported])
1561 AM_CONDITIONAL(DISABLE_JIT, test x$mono_feature_disable_jit = xyes)
1563 if test "x$mono_feature_disable_interpreter" = "xyes"; then
1564         AC_DEFINE(DISABLE_INTERPRETER, 1, [Disable the interpreter.])
1565         AC_MSG_NOTICE([Disabled the interpreter])
1568 AM_CONDITIONAL(DISABLE_INTERPRETER, test x$mono_feature_disable_interpreter = xyes)
1570 if test "x$mono_feature_disable_interpreter" != "xyes" -o "x$mono_feature_disable_jit" != "xyes"; then
1571         AC_DEFINE(ENABLE_ILGEN, 1, [Some VES is available at runtime])
1574 AM_CONDITIONAL(ENABLE_ILGEN, test x$mono_feature_disable_interpreter != xyes -o x$mono_feature_disable_jit != xyes)
1576 if test "x$mono_feature_disable_simd" = "xyes"; then
1577         AC_DEFINE(DISABLE_SIMD, 1, [Disable SIMD intrinsics related optimizations.])
1578         AC_MSG_NOTICE([Disabled SIMD support])
1581 if test "x$mono_feature_disable_soft_debug" = "xyes"; then
1582         AC_DEFINE(DISABLE_DEBUGGER_AGENT, 1, [Disable Soft Debugger Agent.])
1583         AC_MSG_NOTICE([Disabled Soft Debugger.])
1586 AM_CONDITIONAL(DISABLE_DEBUGGER_AGENT, test x$mono_feature_disable_debugger_agent = xyes)
1588 if test "x$mono_feature_disable_perfcounters" = "xyes"; then
1589         AC_DEFINE(DISABLE_PERFCOUNTERS, 1, [Disable Performance Counters.])
1590         AC_MSG_NOTICE([Disabled Performance Counters.])
1592 if test "x$mono_feature_disable_normalization" = "xyes"; then
1593         AC_DEFINE(DISABLE_NORMALIZATION, 1, [Disable String normalization support.])
1594         AC_MSG_NOTICE([Disabled String normalization support.])
1597 #TODO: remove assembly_remapping feature name once everyone is using desktop_loader
1598 if test "x$mono_feature_disable_assembly_remapping" = "xyes" || test "x$mono_feature_disable_desktop_loader" = "xyes"; then
1599         AC_DEFINE(DISABLE_DESKTOP_LOADER, 1, [Disable desktop assembly loader semantics.])
1600         AC_MSG_NOTICE([Disabled desktop assembly loader semantics.])
1603 if test "x$mono_feature_disable_shared_perfcounters" = "xyes"; then
1604         AC_DEFINE(DISABLE_SHARED_PERFCOUNTERS, 1, [Disable shared perfcounters.])
1605         AC_MSG_NOTICE([Disabled Shared perfcounters.])
1608 if test "x$mono_feature_disable_appdomains" = "xyes"; then
1609         AC_DEFINE(DISABLE_APPDOMAINS, 1, [Disable support for multiple appdomains.])
1610         AC_MSG_NOTICE([Disabled support for multiple appdomains.])
1613 if test "x$mono_feature_disable_remoting" = "xyes"; then
1614         AC_DEFINE(DISABLE_REMOTING, 1, [Disable remoting support (This disables type proxies and make com non-functional)])
1615         AC_MSG_NOTICE([Disabled remoting])
1618 if test "x$mono_feature_disable_security" = "xyes"; then
1619         AC_DEFINE(DISABLE_SECURITY, 1, [Disable CAS/CoreCLR security])
1620         AC_MSG_NOTICE([Disabled CAS/CoreCLR security manager (used e.g. for Moonlight)])
1623 if test "x$mono_feature_disable_lldb" = "xyes"; then
1624         AC_DEFINE(DISABLE_LLDB, 1, [Disable support code for the LLDB plugin.])
1625         AC_MSG_NOTICE([Disabled LLDB plugin support code.])
1628 if test "x$mono_feature_disable_mdb" = "xyes"; then
1629         AC_DEFINE(DISABLE_MDB, 1, [Disable support for .mdb symbol files.])
1630         AC_MSG_NOTICE([Disabled support for .mdb symbol files.])
1633 if test "x$mono_feature_disable_assert_messages" = "xyes"; then
1634         AC_DEFINE(DISABLE_ASSERT_MESSAGES, 1, [Disable assertion messages.])
1635         AC_MSG_NOTICE([Disabled assertion messages.])
1638 if test "x$mono_feature_disable_sgen_marksweep_conc" = "xyes"; then
1639         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_CONC, 1, [Disable concurrent gc support in SGEN.])
1640         AC_MSG_NOTICE([Disabled concurrent gc support in SGEN.])
1644 if test "x$mono_feature_disable_sgen_split_nursery" = "xyes"; then
1645         AC_DEFINE(DISABLE_SGEN_SPLIT_NURSERY, 1, [Disable minor=split support in SGEN.])
1646         AC_MSG_NOTICE([Disabled minor=split support in SGEN.])
1649 if test "x$mono_feature_disable_sgen_gc_bridge" = "xyes"; then
1650         AC_DEFINE(DISABLE_SGEN_GC_BRIDGE, 1, [Disable gc bridge support in SGEN.])
1651         AC_MSG_NOTICE([Disabled gc bridge support in SGEN.])
1654 if test "x$mono_feature_disable_sgen_debug_helpers" = "xyes"; then
1655         AC_DEFINE(DISABLE_SGEN_DEBUG_HELPERS, 1, [Disable debug helpers in SGEN.])
1656         AC_MSG_NOTICE([Disabled debug helpers in SGEN.])
1659 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
1660 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
1662 has_extension_module=no
1663 AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
1665         for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
1666                 if test x$extension = xdefault ; then
1667                         has_extension_module=yes;
1668                 fi
1669         done
1670         if test x$enable_extension_module = xyes; then
1671                 has_extension_module=yes;
1672         fi
1673 ], [])
1675 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
1677 if test x$has_extension_module != xno ; then
1678         AC_DEFINE([ENABLE_EXTENSION_MODULE], 1, [Extension module enabled])
1679         AC_MSG_NOTICE([Enabling mono extension module.])
1682 # Deprecated
1683 AC_ARG_ENABLE(gsharedvt, [  --enable-gsharedvt Enable generic valuetype sharing (Deprecated)], enable_gsharedvt=$enableval, enable_gsharedvt=no)
1685 AC_MSG_CHECKING(for visibility __attribute__)
1686 AC_COMPILE_IFELSE([
1687         AC_LANG_SOURCE([[
1688                 void __attribute__ ((visibility ("hidden"))) doit (void) {}
1689                 int main () { doit (); return 0; }
1690         ]])
1691 ], [
1692    have_visibility_hidden=yes
1693    AC_MSG_RESULT(yes)
1694 ], [
1695    have_visibility_hidden=no
1696    AC_MSG_RESULT(no)
1700 dnl Boehm GC configuration
1703 AC_ARG_WITH(libgc,   [  --with-libgc=included,none  Controls the Boehm GC config, default=included],[libgc=$with_libgc],[libgc=included])
1705 AC_ARG_ENABLE(boehm, [  --disable-boehm            Disable the Boehm GC.], support_boehm=$enableval,support_boehm=${support_boehm:-yes})
1706 AM_CONDITIONAL(SUPPORT_BOEHM, test x$support_boehm = xyes)
1708 if test "x$support_boehm" = "xyes"; then
1710         AC_ARG_ENABLE(parallel-mark, [  --enable-parallel-mark     Enables Boehm GC Parallel Marking], enable_parallel_mark=$enableval, enable_parallel_mark=$parallel_mark)
1711         if test x$enable_parallel_mark = xyes; then
1712                 libgc_configure_args="$libgc_configure_args --enable-parallel-mark"
1713         fi
1715         gc_msg=""
1716         LIBGC_CPPFLAGS=
1717         LIBGC_LIBS=
1718         LIBGC_STATIC_LIBS=
1719         libgc_dir=
1720         case "x$libgc" in
1721                 xincluded)
1722                         if test "x$support_boehm" = "xyes"; then
1723                                 libgc_dir=libgc
1724                         fi
1726                         LIBGC_CPPFLAGS='-I$(top_srcdir)/libgc/include'
1727                         LIBGC_LIBS='$(top_builddir)/libgc/libmonogc.la'
1728                         LIBGC_STATIC_LIBS='$(top_builddir)/libgc/libmonogc-static.la'
1730                         BOEHM_DEFINES="-DHAVE_BOEHM_GC"
1732                         if test x$target_win32 = xyes; then
1733                                 BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
1734                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
1735                         fi
1737                         gc_msg="Included Boehm GC with typed GC"
1738                         if test x$enable_parallel_mark = xyes; then
1739                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
1740                                 gc_msg="$gc_msg and parallel mark"
1741                         else
1742                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC)", [GC description])
1743                         fi
1744                         ;;
1746                 xboehm|xbohem|xyes)
1747                         AC_MSG_WARN("External Boehm is no longer supported")
1748                         ;;
1750                 xsgen)
1751                         AC_MSG_WARN("Use --with-sgen instead, --with-libgc= controls Boehm configuration")
1752                         ;;
1754                 xnone)
1755                         AC_MSG_WARN("Compiling mono without GC.")
1756                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description])
1757                         AC_DEFINE(HAVE_NULL_GC,1,[No GC support.])
1758                         gc_msg="none"
1759                         ;;
1760                 *)
1761                         AC_MSG_ERROR([Invalid argument $libgc to --with-libgc.])
1762                         ;;
1763         esac
1765         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])
1766         if test "x$large_heap" = "xyes"; then
1767            CPPFLAGS="$CPPFLAGS -DLARGE_CONFIG"
1768         fi
1770         AC_SUBST(LIBGC_CPPFLAGS)
1771         AC_SUBST(LIBGC_LIBS)
1772         AC_SUBST(LIBGC_STATIC_LIBS)
1773         AC_SUBST(libgc_dir)
1774         AC_SUBST(BOEHM_DEFINES)
1777 AM_CONDITIONAL(SUPPORT_NULLGC, test "x$libgc" = "xnone")
1780 dnl End of Boehm GC Configuration
1783 dnl *************************************
1784 dnl *** Checks for zero length arrays ***
1785 dnl *************************************
1786 AC_MSG_CHECKING(whether $CC supports zero length arrays)
1787 AC_TRY_COMPILE([
1788         struct s {
1789                 int  length;
1790                 char data [0];
1791         };
1792 ], [], [
1793         AC_MSG_RESULT(yes)
1794         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 0, [Length of zero length arrays])
1795 ], [
1796         AC_MSG_RESULT(no)
1797         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
1800 dnl ***********************************
1801 dnl *** Checks for signals
1802 dnl ***********************************
1803 AC_CHECK_HEADERS(signal.h)
1804 AC_CHECK_FUNCS(sigaction)
1805 AC_CHECK_FUNCS(kill)
1806 AC_CHECK_FUNCS(signal)
1808 # signal() is declared inline in Android headers
1809 # so we need to workaround it by overriding the check.
1810 if test x$platform_android = xyes; then
1811         AC_DEFINE(HAVE_SIGNAL,1)
1814 dnl ***********************************
1815 dnl *** Checks for availability of GSS dependencies (krb5, gss.framework, etc)
1816 dnl ***********************************
1817 enable_gss=no;
1818 AC_MSG_CHECKING(for GSS/GSS.h)
1819 AC_TRY_COMPILE([
1820     #include <GSS/GSS.h>
1821 ], [
1823     AC_MSG_RESULT(yes)
1824     AC_DEFINE(HAVE_GSSFW_HEADERS, 1, [GSS/GSS.h])
1825     AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
1826     enable_gss=yes
1827 ], [
1828     AC_MSG_RESULT(no)
1831 AC_MSG_CHECKING(for gssapi/gssapi_ext.h)
1832 AC_TRY_COMPILE([
1833     #include <gssapi/gssapi_ext.h>
1834 ], [
1836     AC_MSG_RESULT(yes)
1837     enable_gss=yes
1838 ], [
1839     AC_MSG_RESULT(no)
1842 AC_MSG_CHECKING(for GSS_SPNEGO_MECHANISM)
1843 AC_TRY_COMPILE([
1844     #include <gssapi/gssapi_ext.h>
1845     #include <gssapi/gssapi_krb5.h>
1846     gss_OID_set_desc gss_mech_spnego_OID_set_desc = {.count = 1, .elements = GSS_SPNEGO_MECHANISM};
1847 ], [
1849     AC_MSG_RESULT(yes)
1850     AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
1851 ], [
1852     AC_MSG_RESULT(no)
1855 AM_CONDITIONAL(ENABLE_GSS, test x$enable_gss = xyes)
1857 # `target_ios=yes` does not detect watch devices and fails when cross-compiling
1858 AC_MONO_APPLE_TARGET(TARGET_OS_IPHONE, [mono_native_platform_ios=yes])
1860 if test x$host_win32 = xno; then
1861         dnl *************************************
1862         dnl *** Checks for time capabilities ***
1863         dnl *************************************
1865         AC_MSG_CHECKING(for CLOCK_MONOTONIC)
1866         AC_TRY_COMPILE([#include <time.h>], [
1867                 const int foo = CLOCK_MONOTONIC;
1868         ],[
1869                 AC_MSG_RESULT(yes)
1870                 AC_DEFINE(HAVE_CLOCK_MONOTONIC, 1, [CLOCK_MONOTONIC])
1871         ], [
1872                 AC_MSG_RESULT(no)
1873         ])
1875         AC_MSG_CHECKING(for CLOCK_MONOTONIC_COARSE)
1876         AC_TRY_COMPILE([#include <time.h>], [
1877                 const int foo = CLOCK_MONOTONIC_COARSE;
1878         ],[
1879                 AC_MSG_RESULT(yes)
1880                 AC_DEFINE(HAVE_CLOCK_MONOTONIC_COARSE, 1, [CLOCK_MONOTONIC_COARSE])
1881         ], [
1882                 AC_MSG_RESULT(no)
1883         ])
1885         AC_MSG_CHECKING(for CLOCK_REALTIME)
1886         AC_TRY_COMPILE([#include <time.h>], [
1887                 const int foo = CLOCK_REALTIME;
1888         ],[
1889                 AC_MSG_RESULT(yes)
1890                 AC_DEFINE(HAVE_CLOCK_REALTIME, 1, [CLOCK_REALTIME])
1891         ], [
1892                 AC_MSG_RESULT(no)
1893         ])
1895         AC_CHECK_FUNC(mach_absolute_time, [AC_DEFINE(HAVE_MACH_ABSOLUTE_TIME, 1, [mach_absolute_time])])
1896         AC_CHECK_FUNC(gethrtime, [AC_DEFINE(HAVE_GETHRTIME, 1, [gethrtime])])
1897         AC_CHECK_FUNC(read_real_time, [AC_DEFINE(HAVE_READ_REAL_TIME, 1, [read_real_time])])
1898         AC_CHECK_FUNC(mach_timebase_info, [AC_DEFINE(HAVE_MACH_TIMEBASE_INFO, 1, [mach_timebase_info])])
1899         AC_CHECK_FUNC(futimes,            [AC_DEFINE(HAVE_FUTIMES, 1, [futimes])])
1900         AC_CHECK_FUNC(futimens,           [AC_DEFINE(HAVE_FUTIMENS, 1, [futimens])])
1902         dnl hires monotonic clock support
1903         AC_SEARCH_LIBS(clock_gettime, rt)
1904         AC_CHECK_FUNCS(clock_nanosleep)
1906         dnl dynamic loader support
1907         AC_CHECK_FUNC(dlopen, DL_LIB="",
1908                 AC_CHECK_LIB(dl, dlopen, DL_LIB="-ldl", dl_support=no)
1909         )
1910         if test x$dl_support = xno; then
1911                 AC_MSG_WARN([No dynamic loading support available])
1912         else
1913                 LIBS="$LIBS $DL_LIB"
1914                 AC_DEFINE(HAVE_DL_LOADER,1,[dlopen-based dynamic loader available])
1915                 dnl from glib's configure.ac
1916                 AC_CACHE_CHECK([for preceeding underscore in symbols],
1917                         mono_cv_uscore,[
1918                         AC_TRY_RUN([#include <dlfcn.h>
1919                         int mono_underscore_test (void) { return 42; }
1920                         int main() {
1921                           void *f1 = (void*)0, *f2 = (void*)0, *handle;
1922                           handle = dlopen ((void*)0, 0);
1923                           if (handle) {
1924                             f1 = dlsym (handle, "mono_underscore_test");
1925                             f2 = dlsym (handle, "_mono_underscore_test");
1926                           } return (!f2 || f1);
1927                         }],
1928                                 [mono_cv_uscore=yes],
1929                                 [mono_cv_uscore=no],
1930                         [])
1931                 ])
1932                 if test "x$mono_cv_uscore" = "xyes"; then
1933                         MONO_DL_NEED_USCORE=1
1934                 else
1935                         MONO_DL_NEED_USCORE=0
1936                 fi
1937                 AC_SUBST(MONO_DL_NEED_USCORE)
1938                 AC_CHECK_FUNC(dlerror)
1939         fi
1941         dnl ******************************************************************
1942         dnl *** Checks for the IKVM JNI interface library                  ***
1943         dnl ******************************************************************
1944         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])
1946         ikvm_native_dir=
1947         if test x$with_ikvm_native = xyes; then
1948                 ikvm_native_dir=ikvm-native
1949                 jdk_headers_found="IKVM Native"
1950         fi
1952         AC_SUBST(ikvm_native_dir)
1954         AC_CHECK_HEADERS(execinfo.h)
1956         AC_CHECK_HEADERS(sys/auxv.h sys/resource.h)
1958         AC_CHECK_FUNCS(getgrgid_r)
1959         AC_CHECK_FUNCS(getgrnam_r)
1960         AC_CHECK_FUNCS(getresuid)
1961         AC_CHECK_FUNCS(setresuid)
1962         AC_CHECK_FUNCS(kqueue)
1963         AC_CHECK_FUNCS(backtrace_symbols)
1964         AC_CHECK_FUNCS(mkstemp)
1965         AC_CHECK_FUNCS(mmap)
1966         AC_CHECK_FUNCS(madvise)
1967         AC_CHECK_FUNCS(getrusage)
1968         AC_CHECK_FUNCS(getpriority)
1969         AC_CHECK_FUNCS(setpriority)
1970         AC_CHECK_FUNCS(dl_iterate_phdr)
1971         AC_CHECK_FUNCS(dladdr)
1972         AC_CHECK_FUNCS(sysconf)
1973         AC_CHECK_FUNCS(getrlimit)
1974         AC_CHECK_FUNCS(prctl)
1975         AC_CHECK_FUNCS(arc4random)
1976         AC_CHECK_FUNCS(nl_langinfo)
1978         AC_CHECK_FUNCS(sched_getaffinity)
1979         AC_CHECK_FUNCS(sched_setaffinity)
1980         AC_CHECK_FUNCS(sched_getcpu)
1982         if test x$platform_android != xyes; then
1983                 AC_CHECK_FUNCS(getpwnam_r)
1984                 AC_CHECK_FUNCS(getpwuid_r)
1985         fi
1987         AC_FUNC_STRERROR_R()
1989         dnl ****************************************************************
1990         dnl *** Check for sched_setaffinity from glibc versions before   ***
1991         dnl *** 2.3.4. The older versions of the function only take 2    ***
1992         dnl *** parameters, not 3.                                       ***
1993         dnl ***                                                          ***
1994         dnl *** Because the interface change was not made in a minor     ***
1995         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
1996         dnl *** won't always indicate the interface sched_affinity has.  ***
1997         dnl ****************************************************************
1998         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
1999         AC_TRY_COMPILE([#include <sched.h>], [
2000             int mask = 1; 
2001             sched_setaffinity(0, &mask);
2002         ], [
2003                 # Yes, we have it...
2004                 AC_MSG_RESULT(yes)
2005                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
2006         ], [
2007                 # We have the new, three-parameter version
2008                 AC_MSG_RESULT(no)
2009         ])
2010         AC_TRY_COMPILE([#include <sched.h>], [
2011              CPU_COUNT((void *) 0);
2012         ], [
2013                 AC_MSG_RESULT(yes)
2014                 AC_DEFINE(GLIBC_HAS_CPU_COUNT, 1, [GLIBC has CPU_COUNT macro in sched.h])
2015         ], [
2016                 # We have the new, three-parameter version
2017                 AC_MSG_RESULT(no)
2018         ])
2020         dnl ******************************************************************
2021         dnl *** Check for large file support                               ***
2022         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
2023         dnl ******************************************************************
2024         
2025         # Check that off_t can represent 2**63 - 1 correctly, working around
2026         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
2027         # CPPFLAGS and sets $large_offt to yes if the test succeeds
2028         large_offt=no
2029         AC_DEFUN([LARGE_FILES], [
2030                 large_CPPFLAGS=$CPPFLAGS
2031                 CPPFLAGS="$CPPFLAGS $1"
2032                 AC_TRY_COMPILE([
2033                         #include <sys/types.h>
2034                         #include <limits.h>
2035                 ], [
2036                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
2037                         #define COMPILE_TIME_ASSERT(pred) \
2038                                 switch(0){case 0:case pred:;}
2039                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
2040                 ], [
2041                         AC_MSG_RESULT(ok)
2042                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
2043                         large_CPPFLAGS="$large_CPPFLAGS $1"
2044                         large_offt=yes
2045                 ], [
2046                         AC_MSG_RESULT(no)
2047                 ])
2048                 CPPFLAGS=$large_CPPFLAGS
2049         ])
2051         AC_MSG_CHECKING(if off_t is 64 bits wide)
2052         LARGE_FILES("")
2053         if test $large_offt = no; then
2054                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
2055                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
2056         fi
2057         if test $large_offt = no; then
2058                 AC_MSG_WARN([No 64 bit file size support available])
2059         fi
2060         
2061         dnl *****************************
2062         dnl *** Checks for libsocket  ***
2063         dnl *****************************
2064         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
2066         case "$host" in
2067                 *-*-*freebsd*)
2068                         dnl *****************************
2069                         dnl *** Checks for libinotify ***
2070                         dnl *****************************
2071                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
2072         esac
2074         dnl *******************************
2075         dnl *** Checks for MSG_NOSIGNAL ***
2076         dnl *******************************
2077         AC_MSG_CHECKING(for MSG_NOSIGNAL)
2078         AC_TRY_COMPILE([#include <sys/socket.h>], [
2079                 int f = MSG_NOSIGNAL;
2080         ], [
2081                 # Yes, we have it...
2082                 AC_MSG_RESULT(yes)
2083                 AC_DEFINE(HAVE_MSG_NOSIGNAL, 1, [Have MSG_NOSIGNAL])
2084         ], [
2085                 # We'll have to use signals
2086                 AC_MSG_RESULT(no)
2087         ])
2089         dnl *****************************
2090         dnl *** Checks for IPPROTO_IP ***
2091         dnl *****************************
2092         AC_MSG_CHECKING(for IPPROTO_IP)
2093         AC_TRY_COMPILE([#include <netinet/in.h>], [
2094                 int level = IPPROTO_IP;
2095         ], [
2096                 # Yes, we have it...
2097                 AC_MSG_RESULT(yes)
2098                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
2099         ], [
2100                 # We'll have to use getprotobyname
2101                 AC_MSG_RESULT(no)
2102         ])
2104         dnl *******************************
2105         dnl *** Checks for IPPROTO_IPV6 ***
2106         dnl *******************************
2107         AC_MSG_CHECKING(for IPPROTO_IPV6)
2108         AC_TRY_COMPILE([#include <netinet/in.h>], [
2109                 int level = IPPROTO_IPV6;
2110         ], [
2111                 # Yes, we have it...
2112                 AC_MSG_RESULT(yes)
2113                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
2114         ], [
2115                 # We'll have to use getprotobyname
2116                 AC_MSG_RESULT(no)
2117         ])
2119         dnl ******************************
2120         dnl *** Checks for IPPROTO_TCP ***
2121         dnl ******************************
2122         AC_MSG_CHECKING(for IPPROTO_TCP)
2123         AC_TRY_COMPILE([#include <netinet/in.h>], [
2124                 int level = IPPROTO_TCP;
2125         ], [
2126                 # Yes, we have it...
2127                 AC_MSG_RESULT(yes)
2128                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
2129         ], [
2130                 # We'll have to use getprotobyname
2131                 AC_MSG_RESULT(no)
2132         ])
2134         dnl *****************************
2135         dnl *** Checks for SOL_IP     ***
2136         dnl *****************************
2137         AC_MSG_CHECKING(for SOL_IP)
2138         AC_TRY_COMPILE([#include <netdb.h>], [
2139                 int level = SOL_IP;
2140         ], [
2141                 # Yes, we have it...
2142                 AC_MSG_RESULT(yes)
2143                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
2144         ], [
2145                 # We'll have to use getprotobyname
2146                 AC_MSG_RESULT(no)
2147         ])
2149         dnl *****************************
2150         dnl *** Checks for SOL_IPV6     ***
2151         dnl *****************************
2152         AC_MSG_CHECKING(for SOL_IPV6)
2153         AC_TRY_COMPILE([#include <netdb.h>], [
2154                 int level = SOL_IPV6;
2155         ], [
2156                 # Yes, we have it...
2157                 AC_MSG_RESULT(yes)
2158                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
2159         ], [
2160                 # We'll have to use getprotobyname
2161                 AC_MSG_RESULT(no)
2162         ])
2164         dnl *****************************
2165         dnl *** Checks for SOL_TCP    ***
2166         dnl *****************************
2167         AC_MSG_CHECKING(for SOL_TCP)
2168         AC_TRY_COMPILE([#include <netdb.h>], [
2169                 int level = SOL_TCP;
2170         ], [
2171                 # Yes, we have it...
2172                 AC_MSG_RESULT(yes)
2173                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
2174         ], [
2175                 # We'll have to use getprotobyname
2176                 AC_MSG_RESULT(no)
2177         ])
2179         dnl *****************************
2180         dnl *** Checks for IP_PKTINFO ***
2181         dnl *****************************
2182         AC_MSG_CHECKING(for IP_PKTINFO)
2183         AC_TRY_COMPILE([#include <linux/in.h>], [
2184                 int level = IP_PKTINFO;
2185         ], [
2186                 # Yes, we have it...
2187                 AC_MSG_RESULT(yes)
2188                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
2189         ], [
2190                 AC_MSG_RESULT(no)
2191         ])
2193         dnl *****************************
2194         dnl *** Checks for IPV6_PKTINFO ***
2195         dnl *****************************
2196         AC_MSG_CHECKING(for IPV6_PKTINFO)
2197         AC_TRY_COMPILE([#include <netdb.h>], [
2198                 int level = IPV6_PKTINFO;
2199         ], [
2200                 # Yes, we have it...
2201                 AC_MSG_RESULT(yes)
2202                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
2203         ], [
2204                 AC_MSG_RESULT(no)
2205         ])
2207         dnl **********************************
2208         dnl *** Checks for IP_DONTFRAG     ***
2209         dnl **********************************
2210         AC_MSG_CHECKING(for IP_DONTFRAG)
2211         AC_TRY_COMPILE([#include <netinet/in.h>], [
2212                 int level = IP_DONTFRAG;
2213         ], [
2214                 # Yes, we have it...
2215                 AC_MSG_RESULT(yes)
2216                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
2217         ], [
2218                 AC_MSG_RESULT(no)
2219         ])
2221         dnl **********************************
2222         dnl *** Checks for IP_DONTFRAGMENT ***
2223         dnl **********************************
2224         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
2225         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
2226                 int level = IP_DONTFRAGMENT;
2227         ], [
2228                 # Yes, we have it...
2229                 AC_MSG_RESULT(yes)
2230                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
2231         ], [
2232                 AC_MSG_RESULT(no)
2233         ])
2235         dnl **********************************
2236         dnl *** Checks for IP_MTU_DISCOVER ***
2237         dnl **********************************
2238         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
2239         AC_TRY_COMPILE([#include <linux/in.h>], [
2240                 int level = IP_MTU_DISCOVER;
2241         ], [
2242                 # Yes, we have it...
2243                 AC_MSG_RESULT(yes)
2244                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
2245         ], [
2246                 AC_MSG_RESULT(no)
2247         ])
2249         dnl **********************************
2250         dnl *** Checks for  IP_PMTUDISC_DO ***
2251         dnl **********************************
2252         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
2253         AC_TRY_COMPILE([#include <linux/in.h>], [
2254                 int level = IP_PMTUDISC_DO;
2255         ], [
2256                 # Yes, we have it...
2257                 AC_MSG_RESULT(yes)
2258                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
2259         ], [
2260                 AC_MSG_RESULT(no)
2261         ])
2263         dnl *********************************
2264         dnl *** Check for struct ip_mreqn ***
2265         dnl *********************************
2266         AC_MSG_CHECKING(for struct ip_mreqn)
2267         AC_TRY_COMPILE([#include <netinet/in.h>], [
2268                 struct ip_mreqn mreq;
2269                 mreq.imr_address.s_addr = 0;
2270         ], [
2271                 # Yes, we have it...
2272                 AC_MSG_RESULT(yes)
2273                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
2274         ], [
2275                 # We'll just have to try and use struct ip_mreq
2276                 AC_MSG_RESULT(no)
2277                 AC_MSG_CHECKING(for struct ip_mreq)
2278                 AC_TRY_COMPILE([#include <netinet/in.h>], [
2279                         struct ip_mreq mreq;
2280                         mreq.imr_interface.s_addr = 0;
2281                 ], [
2282                         # Yes, we have it...
2283                         AC_MSG_RESULT(yes)
2284                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
2285                 ], [
2286                         # No multicast support
2287                         AC_MSG_RESULT(no)
2288                 ])
2289         ])
2290         
2291         dnl **********************************
2292         dnl *** Check for getaddrinfo ***
2293         dnl **********************************
2294         AC_MSG_CHECKING(for getaddrinfo)
2295                 AC_TRY_LINK([
2296                 #include <stdio.h>
2297                 #include <netdb.h>
2298         ], [
2299                 getaddrinfo(NULL,NULL,NULL,NULL);
2300         ], [
2301                 # Yes, we have it...
2302                 AC_MSG_RESULT(yes)
2303                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2304         ], [
2305                 AC_MSG_RESULT(no)
2306         ])
2308         dnl **********************************
2309         dnl *** Check for gethostbyname2_r ***
2310         dnl **********************************
2311         AC_MSG_CHECKING(for gethostbyname2_r)
2312                 AC_TRY_LINK([
2313                 #include <stdio.h>
2314                 #include <netdb.h>
2315         ], [
2317                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
2318         ], [
2319                 # Yes, we have it...
2320                 AC_MSG_RESULT(yes)
2321                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
2322         ], [
2323                 AC_MSG_RESULT(no)
2324         ])
2326         dnl **********************************
2327         dnl *** Check for gethostbyname2 ***
2328         dnl **********************************
2329         AC_MSG_CHECKING(for gethostbyname2)
2330                 AC_TRY_LINK([
2331                 #include <stdio.h>
2332                 #include <netdb.h>
2333         ], [
2334                 gethostbyname2(NULL,0);
2335         ], [
2336                 # Yes, we have it...
2337                 AC_MSG_RESULT(yes)
2338                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
2339         ], [
2340                 AC_MSG_RESULT(no)
2341         ])
2343         dnl **********************************
2344         dnl *** Check for gethostbyname ***
2345         dnl **********************************
2346         AC_MSG_CHECKING(for gethostbyname)
2347                 AC_TRY_LINK([
2348                 #include <stdio.h>
2349                 #include <netdb.h>
2350         ], [
2351                 gethostbyname(NULL);
2352         ], [
2353                 # Yes, we have it...
2354                 AC_MSG_RESULT(yes)
2355                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2356         ], [
2357                 AC_MSG_RESULT(no)
2358         ])
2360         dnl **********************************
2361         dnl *** Check for getprotobyname ***
2362         dnl **********************************
2363         AC_MSG_CHECKING(for getprotobyname)
2364                 AC_TRY_LINK([
2365                 #include <stdio.h>
2366                 #include <netdb.h>
2367         ], [
2368                 getprotobyname(NULL);
2369         ], [
2370                 # Yes, we have it...
2371                 AC_MSG_RESULT(yes)
2372                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2373         ], [
2374                 AC_MSG_RESULT(no)
2375         ])
2377         dnl **********************************
2378         dnl *** Check for getprotobyname_r ***
2379         dnl **********************************
2380         AC_MSG_CHECKING(for getprotobyname_r)
2381                 AC_TRY_LINK([
2382                 #include <stdio.h>
2383                 #include <netdb.h>
2384         ], [
2385                 getprotobyname_r(NULL, NULL, NULL, 0, NULL);
2386         ], [
2387                 # Yes, we have it...
2388                 AC_MSG_RESULT(yes)
2389                 AC_DEFINE(HAVE_GETPROTOBYNAME_R, 1, [Have getprotobyname_r])
2390         ], [
2391                 AC_MSG_RESULT(no)
2392         ])
2394         dnl **********************************
2395         dnl *** Check for getnameinfo ***
2396         dnl **********************************
2397         AC_MSG_CHECKING(for getnameinfo)
2398                 AC_TRY_LINK([
2399                 #include <stdio.h>
2400                 #include <netdb.h>
2401         ], [
2402                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2403         ], [
2404                 # Yes, we have it...
2405                 AC_MSG_RESULT(yes)
2406                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2407         ], [
2408                 AC_MSG_RESULT(no)
2409         ])
2412         dnl **********************************
2413         dnl *** Check for inet_ntop ***
2414         dnl **********************************
2415         AC_MSG_CHECKING(for inet_ntop)
2416                 AC_TRY_LINK([
2417                 #include <stdio.h>
2418                 #include <arpa/inet.h>
2419         ], [
2420                 inet_ntop (0, NULL, NULL, 0);
2421         ], [
2422                 # Yes, we have it...
2423                 AC_MSG_RESULT(yes)
2424                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2425         ], [
2426                 AC_MSG_RESULT(no)
2427         ])
2429         dnl *****************************
2430         dnl *** Checks for libnsl     ***
2431         dnl *****************************
2432         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
2434         AC_CHECK_FUNCS(inet_pton inet_aton)
2436         dnl *****************************
2437         dnl *** Checks for libxnet    ***
2438         dnl *****************************
2439         case "${host}" in
2440                 *solaris* )
2441                         AC_MSG_CHECKING(for Solaris XPG4 support)
2442                         if test -f /usr/lib/libxnet.so; then
2443                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
2444                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
2445                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
2446                                 LIBS="$LIBS -lxnet"
2447                                 AC_MSG_RESULT(yes)
2448                         else
2449                                 AC_MSG_RESULT(no)
2450                         fi
2452                         if test "$GCC" = "yes"; then
2453                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
2454                         fi
2455                 ;;
2456         esac
2458         dnl *****************************
2459         dnl *** Checks for libpthread ***
2460         dnl *****************************
2461 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
2462 # and libpthread does not exist
2464         case "${host}" in
2465                 *-*-*haiku*)
2466                         dnl Haiku has pthread in libroot (libc equiv)
2467                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS")
2468                 ;;
2469                 *-*-*freebsd*)
2470                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2471                 ;;
2472                 *-*-*openbsd*)
2473                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2474                 ;;
2475                 *)
2476                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
2477                 ;;
2478         esac
2479         AC_CHECK_HEADERS(pthread.h)
2480         AC_CHECK_HEADERS(pthread_np.h)
2481         AC_CHECK_FUNCS(pthread_mutex_timedlock)
2482         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_getname_np pthread_setname_np pthread_cond_timedwait_relative_np)
2483         AC_CHECK_FUNCS(pthread_kill)
2484         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
2485         AC_TRY_COMPILE([ #include <pthread.h>], [
2486                 pthread_mutexattr_t attr;
2487                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
2488         ], [
2489                 AC_MSG_RESULT(ok)
2490         ], [
2491                 AC_MSG_RESULT(no)
2492                 AC_ERROR(Posix system lacks support for recursive mutexes)
2493         ])
2494         AC_CHECK_FUNCS(pthread_attr_setstacksize)
2495         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
2496         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
2497         AC_CHECK_FUNCS(mincore mlock munlock)
2499         dnl ***********************************
2500         dnl *** Checks for working __thread ***
2501         dnl ***********************************
2502         AC_MSG_CHECKING(for working __thread)
2503         if test "x$with_tls" != "x__thread"; then
2504                 AC_MSG_RESULT(disabled)
2505         elif test "x$cross_compiling" = "xyes"; then
2506                 AC_MSG_RESULT(cross compiling, assuming yes)
2507         else
2508                 AC_TRY_RUN([
2509                         #if defined(__APPLE__) && defined(__clang__)
2510                         #error "__thread does not currently work with clang on Mac OS X"
2511                         #endif
2512                         
2513                         #include <pthread.h>
2514                         __thread int i;
2515                         static int res1, res2;
2517                         void thread_main (void *arg)
2518                         {
2519                                 i = arg;
2520                                 sleep (1);
2521                                 if (arg == 1)
2522                                         res1 = (i == arg);
2523                                 else
2524                                         res2 = (i == arg);
2525                         }
2527                         int main () {
2528                                 pthread_t t1, t2;
2530                                 i = 5;
2532                                 pthread_create (&t1, NULL, thread_main, 1);
2533                                 pthread_create (&t2, NULL, thread_main, 2);
2535                                 pthread_join (t1, NULL);
2536                                 pthread_join (t2, NULL);
2538                                 return !(res1 + res2 == 2);
2539                         }
2540                 ], [
2541                                 AC_MSG_RESULT(yes)
2542                 ], [
2543                                 AC_MSG_RESULT(no)
2544                                 with_tls=pthread
2545                 ])
2546         fi
2548         dnl **************************************
2549         dnl *** Checks for working sigaltstack ***
2550         dnl **************************************
2551         AC_MSG_CHECKING(for working sigaltstack)
2552         if test "x$with_sigaltstack" != "xyes"; then
2553                 AC_MSG_RESULT(disabled)
2554         elif test "x$cross_compiling" = "xyes"; then
2555                 AC_MSG_RESULT(cross compiling, assuming yes)
2556         else
2557                 AC_TRY_RUN([
2558                         #include <stdio.h>
2559                         #include <stdlib.h>
2560                         #include <unistd.h>
2561                         #include <signal.h>
2562                         #include <pthread.h>
2563                         #include <sys/wait.h>
2564                         #if defined(__FreeBSD__) || defined(__NetBSD__)
2565                         #define SA_STACK SA_ONSTACK
2566                         #endif
2567                         static void
2568                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
2569                         {
2570                                 exit (0);
2571                         }
2573                         volatile char*__ptr = NULL;
2574                         static void *
2575                         loop (void *ignored)
2576                         {
2577                                 *__ptr = 0;
2578                                 return NULL;
2579                         }
2581                         static void
2582                         child ()
2583                         {
2584                                 struct sigaction sa;
2585                                 stack_t sas;
2586                                 pthread_t id;
2587                                 pthread_attr_t attr;
2589                                 sa.sa_sigaction = sigsegv_signal_handler;
2590                                 sigemptyset (&sa.sa_mask);
2591                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
2592                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
2593                                         perror ("sigaction");
2594                                         return;
2595                                 }
2597                                 /* x86 darwin deliver segfaults using SIGBUS */
2598                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
2599                                         perror ("sigaction");
2600                                         return;
2601                                 }
2602                                 sas.ss_sp = malloc (SIGSTKSZ);
2603                                 sas.ss_size = SIGSTKSZ;
2604                                 sas.ss_flags = 0;
2605                                 if (sigaltstack (&sas, NULL) == -1) {
2606                                         perror ("sigaltstack");
2607                                         return;
2608                                 }
2610                                 pthread_attr_init (&attr);
2611                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
2612                                         printf ("pthread_create\n");
2613                                         return;
2614                                 }
2616                                 sleep (100);
2617                         }
2619                         int
2620                         main ()
2621                         {
2622                                 pid_t son;
2623                                 int status;
2624                                 int i;
2626                                 son = fork ();
2627                                 if (son == -1) {
2628                                         return 1;
2629                                 }
2631                                 if (son == 0) {
2632                                         child ();
2633                                         return 0;
2634                                 }
2636                                 for (i = 0; i < 300; ++i) {
2637                                         waitpid (son, &status, WNOHANG);
2638                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
2639                                                 return 0;
2640                                         usleep (10000);
2641                                 }
2643                                 kill (son, SIGKILL);
2644                                 return 1;
2645                         }
2647                 ], [
2648                                 AC_MSG_RESULT(yes)
2649                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
2650                 ], [
2651                                 with_sigaltstack=no
2652                                 AC_MSG_RESULT(no)
2653                 ])
2654         fi
2656         dnl ********************************
2657         dnl *** Checks for semaphore lib ***
2658         dnl ********************************
2659         # 'Real Time' functions on Solaris
2660         # posix4 on Solaris 2.6
2661         # pthread (first!) on Linux
2662         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
2664         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
2665         AC_CHECK_FUNCS(shm_open)
2667         dnl ********************************
2668         dnl *** Checks for timezone stuff **
2669         dnl ********************************
2670         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
2671                 AC_TRY_COMPILE([
2672                         #include <time.h>
2673                         ], [
2674                         struct tm tm;
2675                         tm.tm_gmtoff = 1;
2676                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
2677         if test $ac_cv_struct_tm_gmtoff = yes; then
2678                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
2679         else
2680                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
2681                         AC_TRY_COMPILE([
2682                                 #include <time.h>
2683                         ], [
2684                                 timezone = 1;
2685                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
2686                 if test $ac_cv_var_timezone = yes; then
2687                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
2688                 else
2689                         AC_ERROR(unable to find a way to determine timezone)
2690                 fi
2691         fi
2693         dnl *********************************
2694         dnl *** Checks for math functions ***
2695         dnl *********************************
2696         AC_SEARCH_LIBS(sqrtf, m)
2698         dnl ****************************************************************
2699         dnl *** Checks for working poll() (macosx defines it but doesn't ***
2700         dnl *** have it in the library (duh))                            ***
2701         dnl ****************************************************************
2702         AC_CHECK_FUNCS(poll)
2704         dnl **********************************
2705         dnl *** epoll                      ***
2706         dnl **********************************
2707         AC_CHECK_HEADERS(sys/epoll.h)
2708         haveepoll=no
2709         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
2710         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
2711                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
2712         fi
2714         havekqueue=no
2716         AC_CHECK_HEADERS(sys/event.h)
2717         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
2719         dnl **************************************
2720         dnl * Darwin has a race that prevents us from using reliably:
2721         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
2722         dnl * Since kqueue is mostly used for scaling large web servers, 
2723         dnl * and very few folks run Mono on large web servers on OSX, falling
2724         dnl * back 
2725         dnl **************************************
2726         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
2727                 if test "x$host_darwin" = "xno"; then
2728                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
2729                 fi
2730         fi
2732         dnl ******************************
2733         dnl *** Checks for SIOCGIFCONF ***
2734         dnl ******************************
2735         AC_CHECK_HEADERS(sys/ioctl.h)
2736         AC_CHECK_HEADERS(net/if.h, [], [],
2737            [
2738            #ifdef HAVE_SYS_TYPES_H
2739            # include <sys/types.h>
2740            #endif
2741            #ifdef HAVE_SYS_SOCKET_H
2742            # include <sys/socket.h>
2743            #endif
2744            ])
2745         AC_MSG_CHECKING(for ifreq)
2746         AC_TRY_COMPILE([
2747                 #include <stdio.h>
2748                 #include <sys/ioctl.h>
2749                 #include <net/if.h>
2750                 ], [
2751                 struct ifconf ifc;
2752                 struct ifreq *ifr;
2753                 void *x;
2754                 ifc.ifc_len = 0;
2755                 ifc.ifc_buf = NULL;
2756                 x = (void *) &ifr->ifr_addr;
2757                 ],[
2758                         AC_MSG_RESULT(yes)
2759                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
2760                 ], [
2761                         AC_MSG_RESULT(no)
2762                 ])
2763         dnl **********************************
2764         dnl ***     Checks for sin_len     ***
2765         dnl **********************************
2766         AC_MSG_CHECKING(for sockaddr_in.sin_len)
2767         AC_TRY_COMPILE([
2768                 #include <netinet/in.h>
2769                 ], [
2770                 struct sockaddr_in saddr;
2771                 saddr.sin_len = sizeof (saddr);
2772                 ],[
2773                         AC_MSG_RESULT(yes)
2774                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
2775                 ], [
2776                         AC_MSG_RESULT(no)
2777                 ])      
2778         dnl **********************************
2779         dnl ***    Checks for sin6_len     ***
2780         dnl **********************************
2781         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
2782         AC_TRY_COMPILE([
2783                 #include <netinet/in.h>
2784                 ], [
2785                 struct sockaddr_in6 saddr6;
2786                 saddr6.sin6_len = sizeof (saddr6);
2787                 ],[
2788                         AC_MSG_RESULT(yes)
2789                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
2790                 ], [
2791                         AC_MSG_RESULT(no)
2792                 ])
2793         dnl **********************************
2794         dnl *** Check for getifaddrs       ***
2795         dnl **********************************
2796         AC_MSG_CHECKING(for getifaddrs)
2797                 AC_TRY_LINK([
2798                 #include <stdio.h>
2799                 #include <sys/types.h>
2800                 #include <sys/socket.h>
2801                 #include <ifaddrs.h>
2802         ], [
2803                 getifaddrs(NULL);
2804         ], [
2805                 # Yes, we have it...
2806                 AC_MSG_RESULT(yes)
2807                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
2808         ], [
2809                 AC_MSG_RESULT(no)
2810         ])
2811         dnl **********************************
2812         dnl *** Check for if_nametoindex   ***
2813         dnl **********************************
2814         AC_MSG_CHECKING(for if_nametoindex)
2815                 AC_TRY_LINK([
2816                 #include <stdio.h>
2817                 #include <sys/types.h>
2818                 #include <sys/socket.h>
2819                 #include <net/if.h>
2820         ], [
2821                 if_nametoindex(NULL);
2822         ], [
2823                 # Yes, we have it...
2824                 AC_MSG_RESULT(yes)
2825                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
2826         ], [
2827                 AC_MSG_RESULT(no)
2828         ])
2829         dnl **********************************
2830         dnl *** Check for access ***
2831         dnl **********************************
2832         AC_MSG_CHECKING(for access)
2833                 AC_TRY_LINK([
2834                 #include <unistd.h>
2835         ], [
2836                 access(NULL,0);
2837         ], [
2838                 # Yes, we have it...
2839                 AC_MSG_RESULT(yes)
2840                 AC_DEFINE(HAVE_ACCESS, 1, [Have access])
2841         ], [
2842                 AC_MSG_RESULT(no)
2843         ])
2844                         
2845         dnl **********************************
2846         dnl *** Checks for proclib         ***
2847         dnl **********************************
2848         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.)])
2849         dnl **********************************
2850         dnl *** Checks for MonoPosixHelper ***
2851         dnl **********************************
2852         AC_CHECK_HEADERS(checklist.h)
2853         AC_CHECK_HEADERS(pathconf.h)
2854         AC_CHECK_HEADERS(fstab.h)
2855         AC_CHECK_HEADERS(attr/xattr.h)
2856         AC_CHECK_HEADERS(sys/extattr.h)
2857         AC_CHECK_HEADERS(sys/sendfile.h)
2858         AC_CHECK_HEADERS(sys/statvfs.h)
2859         AC_CHECK_HEADERS(sys/statfs.h)
2860         AC_CHECK_HEADERS(sys/vfstab.h)
2861         AC_CHECK_HEADERS(sys/xattr.h)
2862         AC_CHECK_HEADERS(sys/mman.h)
2863         AC_CHECK_HEADERS(sys/param.h)
2864         AC_CHECK_HEADERS(sys/mount.h, [], [],
2865                 [
2866                 #ifdef HAVE_SYS_PARAM_H
2867                 # include <sys/param.h>
2868                 #endif
2869                 ])
2870         AC_CHECK_HEADERS(sys/mount.h)
2871         AC_CHECK_FUNCS(confstr)
2872         AC_CHECK_FUNCS(seekdir telldir)
2873         AC_CHECK_FUNCS(getdomainname)
2874         AC_CHECK_FUNCS(setdomainname)
2875         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
2876         AC_CHECK_FUNCS(setgroups)
2877         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
2878         AC_CHECK_FUNCS(getfsstat)
2879         AC_CHECK_FUNCS(lutimes futimes)
2880         AC_CHECK_FUNCS(mremap)
2881         AC_CHECK_FUNCS(remap_file_pages)
2882         AC_CHECK_FUNCS(posix_fadvise)
2883         AC_CHECK_FUNCS(posix_fallocate)
2884         AC_CHECK_FUNCS(posix_madvise)
2885         AC_CHECK_FUNCS(vsnprintf)
2886         AC_CHECK_FUNCS(sendfile)
2887         AC_CHECK_FUNCS(gethostid sethostid)
2888         AC_CHECK_FUNCS(sethostname)
2889         AC_CHECK_FUNCS(statfs)
2890         AC_CHECK_FUNCS(fstatfs)
2891         AC_CHECK_FUNCS(statvfs)
2892         AC_CHECK_FUNCS(fstatvfs)
2893         AC_CHECK_FUNCS(stime)
2894         AC_CHECK_FUNCS(ttyname_r)
2895         AC_CHECK_FUNCS(psignal)
2896         AC_CHECK_FUNCS(getlogin_r)
2897         AC_CHECK_FUNCS(lockf)
2898         AC_CHECK_FUNCS(swab)
2899         AC_CHECK_FUNCS(setusershell endusershell)
2900         AC_CHECK_FUNCS(futimens utimensat)
2901         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
2902         AC_CHECK_FUNCS(readv writev preadv pwritev)
2903         AC_CHECK_FUNCS(setpgid)
2904         AC_CHECK_FUNCS(system)
2905         AC_CHECK_FUNCS(fork execv execve)
2906         AC_CHECK_FUNCS(accept4)
2907         AC_CHECK_FUNCS(localtime_r)
2908         AC_CHECK_FUNCS(mkdtemp)
2909         AC_CHECK_SIZEOF(size_t)
2910         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
2911                 [#include <sys/types.h>
2912                  #include <sys/stat.h>
2913                  #include <unistd.h>])
2914         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
2915                 [#include <sys/types.h>
2916                  #include <sys/stat.h>
2917                  #include <unistd.h>])
2918         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
2919                 [#include <sys/time.h>])
2920         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
2921                 [#include <sys/socket.h>])
2922         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
2923                 [#include <unistd.h>
2924                  #include <fcntl.h>])
2925         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
2926                 [#include <sys/uio.h>])
2927         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
2928                 [#include <sys/socket.h>])
2929         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
2930                 [#include <sys/poll.h>])
2931         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
2932                 [#include <sys/socket.h>])
2933         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
2934                 [#include <sys/socket.h>])
2935         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
2936                 [#include <netinet/in.h>])
2937         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
2938                 [#include <netinet/in.h>])
2939         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
2940                 [#include <sys/un.h>])
2941         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
2942                 [#include <sys/types.h>
2943                  #include <sys/stat.h>
2944                  #include <unistd.h>])
2945         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
2946                 [#include <time.h>])
2947         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
2948                 [#include <sys/time.h>
2949                  #include <sys/types.h>
2950                  #include <utime.h>])
2951         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
2952                 [#include <sys/time.h>])
2953         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
2954                 [#include <sys/types.h>
2955                  #include <utime.h>])
2956         AC_CHECK_MEMBERS(
2957                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
2958                 [#include <sys/types.h>
2959                  #include <dirent.h>])
2960         AC_CHECK_MEMBERS(
2961                 [struct passwd.pw_gecos],,, 
2962                 [#include <sys/types.h>
2963                  #include <pwd.h>])
2964         AC_CHECK_MEMBERS(
2965                 [struct statfs.f_flags],,, 
2966                 [#include <sys/types.h>
2967                  #include <sys/vfs.h>])
2968         AC_CHECK_MEMBERS(
2969                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
2970                 [#include <sys/types.h>
2971                  #include <sys/stat.h>
2972                  #include <unistd.h>])
2974         dnl Favour xattr through glibc, but use libattr if we have to
2975         AC_CHECK_FUNC(lsetxattr, ,
2976                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
2977         )
2978         AC_SUBST(XATTR_LIB)
2980         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
2981         AC_CHECK_MEMBERS(
2982                 [struct kinfo_proc.kp_proc],,, 
2983                 [#include <sys/types.h>
2984                  #include <sys/param.h>
2985                  #include <sys/sysctl.h>
2986                  #include <sys/proc.h>
2987                  ])
2989         dnl *********************************
2990         dnl *** Checks for Windows compilation ***
2991         dnl *********************************
2992         AC_CHECK_HEADERS(sys/time.h)
2993         AC_CHECK_HEADERS(sys/param.h)
2994         AC_CHECK_HEADERS(dirent.h)
2996         dnl ******************************************
2997         dnl *** Checks for OSX and iOS compilation ***
2998         dnl ******************************************
2999         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
3001         dnl *********************************
3002         dnl *** Check for Console 2.0 I/O ***
3003         dnl *********************************
3004         AC_CHECK_HEADERS([curses.h])
3005         AC_CHECK_HEADERS([term.h], [], [],
3006         [#if HAVE_CURSES_H
3007          #include <curses.h>
3008          #endif
3009         ])
3010         AC_CHECK_HEADERS([termios.h])
3012         dnl *********************************
3013         dnl *** Checks for random         ***
3014         dnl *********************************
3015         if test x$host_darwin = xno; then
3016                 AC_CHECK_HEADERS(sys/random.h)
3017                 AC_CHECK_FUNCS(getrandom getentropy)
3018         fi
3020         dnl *********************************
3021         dnl *** Checks for Mono.Native  ***
3022         dnl *********************************
3024         AC_MSG_CHECKING(for linux/in.h)
3025         AC_TRY_COMPILE([
3026                 #include <sys/socket.h>
3027                 #include <linux/in.h>
3028         ], [
3029         ],[
3030                 AC_MSG_RESULT(yes)
3031                 AC_DEFINE(HAVE_LINUX_IN_H, 1, [linux/in.h])
3032         ], [
3033                 AC_MSG_RESULT(no)
3034         ])
3036         AC_MSG_CHECKING(for struct in_pktinfo)
3037         AC_TRY_COMPILE([
3038                 #ifdef HAVE_LINUX_IN_H
3039                 #include <sys/socket.h>
3040                 #include <linux/in.h>
3041                 #else
3042                 #include <netinet/in.h>
3043                 #endif
3044         ], [
3045                 struct in_pktinfo pktinfo;
3046         ],[
3047                 AC_MSG_RESULT(yes)
3048                 AC_DEFINE(HAVE_IN_PKTINFO, 1, [struct in_pktinfo])
3049         ], [
3050                 AC_MSG_RESULT(no)
3051         ])
3053         AC_MSG_CHECKING(for struct ip_mreqn)
3054         AC_TRY_COMPILE([
3055                 #if HAVE_LINUX_IN_H
3056                 #include <sys/socket.h>
3057                 #include <linux/in.h>
3058                 #else
3059                 #include <netinet/in.h>
3060                 #endif
3061         ], [
3062                 struct ip_mreqn mreqn;
3063         ],[
3064                 AC_MSG_RESULT(yes)
3065                 AC_DEFINE(HAVE_IP_MREQN, 1, struct ip_mreqn)
3066         ], [
3067                 AC_MSG_RESULT(no)
3068         ])
3070         if test x$host_darwin = xno; then
3071                 AC_CHECK_TYPES([struct flock64], [AC_DEFINE(HAVE_FLOCK64, 1, struct flock64)], , [#include <fcntl.h>])
3072         fi
3074         if test x$mono_native_platform_ios = xno; then
3075                 # On iOS, `stat64()` is deprecated and there is no `struct stat64` and `stat()`
3076                 # is either 32-bit or 64-bit based on the device / simulator that you're running on.
3077                 AC_CHECK_FUNC(stat64,            [AC_DEFINE(HAVE_STAT64, 1, [stat64])])
3078         fi
3080         AC_CHECK_FUNC(lseek64,           [AC_DEFINE(HAVE_LSEEK64, 1, [lseek64])])
3081         AC_CHECK_FUNC(mmap64,            [AC_DEFINE(HAVE_MMAP64, 1, [mmap64])])
3082         AC_CHECK_FUNC(ftruncate64,       [AC_DEFINE(HAVE_FTRUNCATE64, 1, [ftruncate64])])
3083         AC_CHECK_FUNC(posix_fadvise64,   [AC_DEFINE(HAVE_POSIX_FADVISE64, 1, [posix_fadvise64])])
3084         AC_CHECK_DECL(pipe2,             [AC_DEFINE(HAVE_PIPE2, 1, [pipe2])])
3085         AC_CHECK_FUNC(getmntinfo,        [AC_DEFINE(HAVE_GETMNTINFO, 1, [getmntinfo])], [], [[#include <unistd.h>]])
3086         AC_CHECK_FUNC(strcpy_s,          [AC_DEFINE(HAVE_STRCPY_S, 1, [strcpy_s])])
3087         AC_CHECK_FUNC(strlcpy,           [AC_DEFINE(HAVE_STRLCPY, 1, [strlcpy])])
3088         AC_CHECK_FUNC(posix_fadvise,     [AC_DEFINE(HAVE_POSIX_FADVISE, 1, [posix_fadvise])])
3089         AC_CHECK_FUNC(ioctl,             [AC_DEFINE(HAVE_IOCTL, 1, [ioctl])])
3090         AC_CHECK_FUNC(sched_getaffinity, [AC_DEFINE(HAVE_SCHED_GETAFFINITY, 1, [sched_getaffinity])])
3091         AC_CHECK_FUNC(sched_setaffinity, [AC_DEFINE(HAVE_SCHED_SETAFFINITY, 1, [sched_setaffinity])])
3092         AC_CHECK_DECL(TIOCGWINSZ,        [AC_DEFINE(HAVE_TIOCGWINSZ, 1, [TIOCGWINSZ])], [], [[#include <sys/ioctl.h>]])
3093         AC_CHECK_FUNC(tcgetattr,         [AC_DEFINE(HAVE_TCGETATTR, 1, [tcgetattr])])
3094         AC_CHECK_FUNC(tcsetattr,         [AC_DEFINE(HAVE_TCSETATTR, 1, [tcsetattr])])
3095         AC_CHECK_FUNC(arc4random,        [AC_DEFINE(HAVE_ARC4RANDOM, 1, [arc4random])])
3096         AC_CHECK_DECL(ECHO,              [AC_DEFINE(HAVE_ECHO, 1, [ECHO])], [], [[#include <termios.h>]])
3097         AC_CHECK_DECL(ICANON,            [AC_DEFINE(HAVE_ICANON, 1, [ICANON])], [], [[#include <termios.h>]])
3098         AC_CHECK_DECL(TCSANOW,           [AC_DEFINE(HAVE_TCSANOW, 1, [TCSANOW])], [], [[#include <termios.h>]])
3100         AC_CHECK_DECL(O_CLOEXEC,         [AC_DEFINE(HAVE_O_CLOEXEC, 1, [O_CLOEXEC])], [], [[#include <fcntl.h>]])
3101         AC_CHECK_DECL(F_DUPFD_CLOEXEC,   [AC_DEFINE(HAVE_F_DUPFD_CLOEXEC, 1, [F_DUPFD_CLOEXEC])], [], [[#include <fcntl.h>]])
3103         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>]])
3104         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>]])
3105         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>]])
3106         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>]])
3107         AC_CHECK_MEMBER(struct dirent.d_namlen,       [AC_DEFINE(HAVE_DIRENT_NAME_LEN, 1, [struct dirent.d_namlen])], [], [[#include <dirent.h>]])
3108         AC_CHECK_MEMBER(struct statfs.f_fstypename,   [AC_DEFINE(HAVE_STATFS_FSTYPENAME, 1, [struct statfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3109         AC_CHECK_MEMBER(struct statvfs.f_fstypename,  [AC_DEFINE(HAVE_STATVFS_FSTYPENAME, 1, [struct statvfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3111         AC_MSG_CHECKING(for struct statfs)
3112         AC_TRY_COMPILE([
3113                 #if defined(HAVE_STATFS_FSTYPENAME) || defined(HAVE_STATVFS_FSTYPENAME)
3114                 #include <sys/mount.h>
3115                 #else
3116                 #include <sys/statfs.h>
3117                 #endif
3118         ], [
3119                 struct statfs;
3120         ],[
3121                 AC_MSG_RESULT(yes)
3122                 AC_DEFINE(HAVE_STATFS, 1, [struct statfs])
3123         ], [
3124                 AC_MSG_RESULT(no)
3125         ])
3127         if test "x$ac_cv_func_strerror_r_char_p" = "xyes" ; then
3128                 AC_DEFINE(HAVE_GNU_STRERROR_R, 1, [char* strerror(int errnum, char *buf, size_t buflen)])
3129         fi
3131         AC_MSG_CHECKING(for readdir_r)
3132         AC_TRY_COMPILE([
3133                 #include <dirent.h>
3134         ], [
3135                 DIR* dir;
3136                 struct dirent* entry;
3137                 struct dirent* result;
3138                 readdir_r(dir, entry, &result);
3139         ],[
3140                 AC_MSG_RESULT(yes)
3141                 AC_DEFINE(HAVE_READDIR_R, 1, [readdir_r])
3142         ], [
3143                 AC_MSG_RESULT(no)
3144         ])
3146         AC_MSG_CHECKING(for kevent with void *data)
3147         AC_TRY_COMPILE([
3148                 #include <sys/types.h>
3149                 #include <sys/event.h>
3150         ], [
3151                 struct kevent event;
3152                 void* data;
3153                 EV_SET(&event, 0, EVFILT_READ, 0, 0, 0, data);
3154         ],[
3155                 AC_MSG_RESULT(yes)
3156                 AC_DEFINE(KEVENT_HAS_VOID_UDATA, 1, [kevent with void *data])
3157         ], [
3158                 AC_MSG_RESULT(no)
3159         ])
3161         AC_CHECK_MEMBER(struct fd_set.fds_bits,   [AC_DEFINE(HAVE_FDS_BITS, 1, [struct fd_set.fds_bits])], [], [[#include <sys/select.h>]])
3162         AC_CHECK_MEMBER(struct fd_set.__fds_bits, [AC_DEFINE(HAVE_PRIVATE_FDS_BITS, 1, [struct fd_set.__fds_bits])], [], [[#include <sys/select.h>]])
3164         AC_MSG_CHECKING(for sendfile with 4 arguments)
3165         AC_TRY_COMPILE([
3166                 #include <sys/sendfile.h>
3167         ], [
3168                 int result = sendfile(0, 0, 0, 0);
3169         ],[
3170                 AC_MSG_RESULT(yes)
3171                 AC_DEFINE(HAVE_SENDFILE_4, 1, [sendfile with 4 arguments])
3172         ], [
3173                 AC_MSG_RESULT(no)
3174         ])
3176         AC_MSG_CHECKING(for sendfile with 6 arguments)
3177         AC_TRY_LINK([
3178                 #include <stdlib.h>
3179                 #include <sys/types.h>
3180                 #include <sys/socket.h>
3181                 #include <sys/uio.h>
3182         ], [
3183                 int result = sendfile(0, 0, 0, NULL, NULL, 0);
3184         ],[
3185                 AC_MSG_RESULT(yes)
3186                 AC_DEFINE(HAVE_SENDFILE_6, 1, [sendfile with 6 arguments])
3187         ], [
3188                 AC_MSG_RESULT(no)
3189         ])
3191         AC_CHECK_FUNC(fcopyfile,     [AC_DEFINE(HAVE_FCOPYFILE, 1, [fcopyfile])])
3192         AC_CHECK_FUNC(epoll_create1, [AC_DEFINE(HAVE_EPOLL, 1, [epoll_create1])])
3193         AC_CHECK_FUNC(accept4,       [AC_DEFINE(HAVE_ACCEPT4, 1, [accept4])])
3194         AC_CHECK_FUNC(kqueue,        [AC_DEFINE(HAVE_KQUEUE, 1, [kqueue])])
3196         ORIG_CFLAGS="$CFLAGS"
3197         CFLAGS="-Werror -Wsign-conversion"
3199         AC_MSG_CHECKING(for getnameinfo with signed flags)
3200         AC_TRY_COMPILE([
3201                 #include <sys/types.h>
3202                 #include <netdb.h>
3203         ], [
3204                 const struct sockaddr *addr;
3205                 socklen_t addrlen;
3206                 char *host;
3207                 socklen_t hostlen;
3208                 char *serv;
3209                 socklen_t servlen;
3210                 int flags;
3211                 int result = getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags);
3212         ],[
3213                 AC_MSG_RESULT(yes)
3214                 AC_DEFINE(HAVE_GETNAMEINFO_SIGNED_FLAGS, 1, [getnameinfo with signed flags])
3215         ], [
3216                 AC_MSG_RESULT(no)
3217         ])
3219         CFLAGS="$ORIG_CFLAGS"
3221         if test "x$host_linux" = "xyes"; then
3222                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 1, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3223         else
3224                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 0, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3225         fi
3227         ORIG_CFLAGS="$CFLAGS"
3228         CFLAGS="-Werror -Wsign-conversion"
3230         AC_MSG_CHECKING(for bind with unsigned addrlen)
3231         AC_TRY_COMPILE([
3232                 #include <sys/socket.h>
3233         ], [
3234                 int fd;
3235                 struct sockaddr* addr;
3236                 socklen_t addrLen;
3237                 bind(fd, addr, addrLen);
3238         ],[
3239                 AC_MSG_RESULT(yes)
3240                 AC_DEFINE(BIND_ADDRLEN_UNSIGNED, 1, [bind with unsigned addrlen])
3241         ], [
3242                 AC_MSG_RESULT(no)
3243         ])
3245         AC_MSG_CHECKING(for struct ipv6_mreq with unsigned ipv6mr_interface)
3246         AC_TRY_COMPILE([
3247                 #include <netinet/in.h>
3248                 #include <netinet/tcp.h>
3249         ], [
3250                 struct ipv6_mreq opt;
3251                 unsigned int index = 0;
3252                 opt.ipv6mr_interface = index;
3253         ],[
3254                 AC_MSG_RESULT(yes)
3255                 AC_DEFINE(IPV6MR_INTERFACE_UNSIGNED, 1, [struct ipv6_mreq with unsigned ipv6mr_interface])
3256         ], [
3257                 AC_MSG_RESULT(no)
3258         ])
3260         AC_MSG_CHECKING(for inotify_rm_watch with unsigned wd)
3261         AC_TRY_COMPILE([
3262                 #include <sys/inotify.h>
3263         ], [
3264                 intptr_t fd;
3265                 uint32_t wd;
3266                 int result = inotify_rm_watch(fd, wd);
3267         ],[
3268                 AC_MSG_RESULT(yes)
3269                 AC_DEFINE(INOTIFY_RM_WATCH_WD_UNSIGNED, 1, [inotify_rm_watch with unsigned wd])
3270         ], [
3271                 AC_MSG_RESULT(no)
3272         ])
3274         CFLAGS="$ORIG_CFLAGS"
3276         AC_MSG_CHECKING(for shm_open that works well enough with mmap)
3277         if test "x$ac_cv_func_shm_open" = "xno" -o "x$ac_cv_func_shm_open_working_with_mmap" = "xno" ; then
3278                 AC_MSG_RESULT(no)
3279         else
3280                 AC_TRY_RUN([
3281                         #include <sys/mman.h>
3282                         #include <fcntl.h>
3283                         #include <unistd.h>
3285                         int main ()
3286                         {
3287                                 int fd = shm_open("/mono_configure_shm_open", O_CREAT | O_RDWR, 0777);
3288                                 if (fd == -1)
3289                                         return -1;
3291                                 shm_unlink("/mono_configure_shm_open");
3293                                 // NOTE: PROT_EXEC and MAP_PRIVATE don't work well with shm_open
3294                                 //       on at least the current version of Mac OS X
3296                                 if (mmap(NULL, 1, PROT_EXEC, MAP_PRIVATE, fd, 0) == MAP_FAILED)
3297                                         return -1;
3299                                 return 0;
3300                         }
3301                 ],[
3302                         AC_MSG_RESULT(yes)
3303                         AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3304                 ], [
3305                         AC_MSG_RESULT(no)
3306                 ])
3307         fi
3309         AC_MSG_CHECKING(for getpriority with int who)
3310         AC_TRY_COMPILE([
3311                 #include <sys/resource.h>
3312         ], [
3313                 int which;
3314                 int who;
3315                 int result = getpriority(which, who);
3316         ],[
3317                 AC_MSG_RESULT(yes)
3318                 AC_DEFINE(PRIORITY_REQUIRES_INT_WHO, 1, [getpriority with int who])
3319         ], [
3320                 AC_MSG_RESULT(no)
3321         ])
3323         AC_MSG_CHECKING(for kevent with int parameters)
3324         AC_TRY_COMPILE([
3325                 #include <sys/types.h>
3326                 #include <sys/event.h>
3327         ], [
3328                 int kg;
3329                 const struct kevent* chagelist;
3330                 int nchanges;
3331                 struct kevent* eventlist;
3332                 int nevents;
3333                 const struct timespec* timeout;
3334                 int result = kevent(kg, chagelist, nchanges, eventlist, nevents, timeout);
3335         ],[
3336                 AC_MSG_RESULT(yes)
3337                 AC_DEFINE(KEVENT_REQUIRES_INT_PARAMS, 1, [kevent with int parameters])
3338         ], [
3339                 AC_MSG_RESULT(no)
3340         ])
3342         ORIG_CFLAGS="$CFLAGS"
3343         CFLAGS="-Werror -Wimplicit-function-declaration"
3345         AC_MSG_CHECKING(for mkstemps)
3346         AC_TRY_COMPILE([
3347                 #include <stdlib.h>
3348                 #include <unistd.h>
3349                 #include <string.h>
3350         ], [
3351                 char *template;
3352                 int suffixlen;
3353                 int result = mkstemps(template, suffixlen);
3354         ],[
3355                 AC_MSG_RESULT(yes)
3356                 AC_DEFINE(HAVE_MKSTEMPS, 1, [mkstemps])
3357                 have_mkstemps=yes
3358         ], [
3359                 AC_MSG_RESULT(no)
3360         ])
3362         CFLAGS="$ORIG_CFLAGS"
3364         if test "x$have_mkstemps" != "xyes" -a "x$ac_cv_func_mkstemp" != "xyes"; then
3365                 AC_MSG_ERROR([Cannot find mkstemps or mkstemp on this platform])
3366         fi
3368         AC_MSG_CHECKING(for tcp/var.h)
3369         AC_TRY_COMPILE([
3370                 #include <sys/types.h>
3371                 #include <sys/socketvar.h>
3372                 #include <netinet/ip.h>
3373                 #include <netinet/tcp.h>
3374                 #include <netinet/tcp_var.h>
3375         ], [
3376         ],[
3377                 AC_MSG_RESULT(yes)
3378                 AC_DEFINE(HAVE_TCP_VAR_H, 1, [tcp/var.h])
3379         ], [
3380                 AC_MSG_RESULT(no)
3381         ])
3383         AC_CHECK_HEADERS([sys/cdefs.h])
3385         AC_MSG_CHECKING(for TCPSTATE enum in netinet/tcp.h)
3386         AC_TRY_COMPILE([
3387                 #ifdef HAVE_SYS_CDEFS_H
3388                 #include <sys/cdefs.h>
3389                 #endif
3390                 #include <netinet/tcp.h>
3391         ], [
3392                 int result = TCP_ESTABLISHED;
3393         ],[
3394                 AC_MSG_RESULT(yes)
3395                 AC_DEFINE(HAVE_TCP_H_TCPSTATE_ENUM, 1, [TCPSTATE enum in netinet/tcp.h])
3396         ], [
3397                 AC_MSG_RESULT(no)
3398         ])
3400         AC_CHECK_DECL(TCPS_ESTABLISHED, [AC_DEFINE(HAVE_TCP_FSM_H, 1, [HAVE_TCP_FSM_H])], [], [[#include <netinet/tcp_fsm.h>]])
3402         AC_MSG_CHECKING(for struct rt_msghdr)
3403         AC_TRY_COMPILE([
3404                 #include <sys/types.h>
3405                 #include <net/route.h>
3406         ], [
3407                 struct rt_msghdr;
3408         ],[
3409                 AC_MSG_RESULT(yes)
3410                 AC_DEFINE(HAVE_RT_MSGHDR, 1, [struct rt_msghdr])
3411         ], [
3412                 AC_MSG_RESULT(no)
3413         ])
3415         AC_CHECK_HEADERS([sys/sysctl.h])
3416         AC_CHECK_HEADERS([linux/rtnetlink.h])
3418         AC_CHECK_FUNC(getpeereid,    [AC_DEFINE(HAVE_GETPEEREID, 1, [getpeereid])])
3419         AC_CHECK_FUNC(getdomainname, [AC_DEFINE(HAVE_GETDOMAINNAME, 1, [getdomainname])])
3420         AC_CHECK_FUNC(uname,         [AC_DEFINE(HAVE_UNAME, 1, [uname])])
3422         ORIG_CFLAGS="$CFLAGS"
3423         CFLAGS="-Werror -Weverything"
3425         AC_MSG_CHECKING(for getdomainname with size_t namelen)
3426         AC_TRY_COMPILE([
3427                 #include <unistd.h>
3428         ], [
3429                 size_t namelen = 20;
3430                 char name[20];
3431                 int result = getdomainname(name, namelen);
3432         ],[
3433                 AC_MSG_RESULT(yes)
3434                 AC_DEFINE(HAVE_GETDOMAINNAME_SIZET, 1, [getdomainname with size_t namelen])
3435         ], [
3436                 AC_MSG_RESULT(no)
3437         ])
3439         CFLAGS="$ORIG_CFLAGS"
3441         AC_CHECK_FUNC(inotify_init, [AC_DEFINE(HAVE_INOTIFY_INIT, 1, [inotify_init])])
3442         AC_CHECK_FUNC(inotify_add_watch, [AC_DEFINE(HAVE_INOTIFY_ADD_WATCH, 1, [inotify_add_watch])])
3443         AC_CHECK_FUNC(inotify_rm_watch, [AC_DEFINE(HAVE_INOTIFY_RM_WATCH, 1, [inotify_rm_watch])])
3445         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
3446                 AC_DEFINE(HAVE_INOTIFY, 1, [HAVE_INOTIFY])
3447         elif test "x$host_linux" = "xyes"; then
3448                 AC_MSG_ERROR([Cannot find inotify functions on a Linux platform.])
3449         fi
3451         AC_CHECK_HEADERS([crt_externs.h])
3453         AC_MSG_CHECKING(for _NSGetEnviron)
3454         AC_TRY_COMPILE([
3455                 #include <crt_externs.h>
3456         ], [
3457                 char **result = *(_NSGetEnviron());
3458         ],[
3459                 AC_MSG_RESULT(yes)
3460                 AC_DEFINE(HAVE_NSGETENVIRON, 1, [_NSGetEnviron])
3461         ], [
3462                 AC_MSG_RESULT(no)
3463         ])
3465         AC_CHECK_DECL(IN_EXCL_UNLINK, [AC_DEFINE(HAVE_IN_EXCL_UNLINK, 1, [IN_EXCL_UNLINK])], [], [[#include <sys/inotify.h>]])
3467 else
3468         dnl *********************************
3469         dnl *** Checks for Windows compilation ***
3470         dnl *********************************
3471         AC_CHECK_HEADERS(winternl.h)
3473         jdk_headers_found=no
3474         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
3475         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
3476         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
3477         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
3478         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
3479         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
3480         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
3482         dnl *********************************
3483         dnl *** Check for struct ip_mreqn ***
3484         dnl *********************************
3485         AC_MSG_CHECKING(for struct ip_mreqn)
3486         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3487                 struct ip_mreqn mreq;
3488                 mreq.imr_address.s_addr = 0;
3489         ], [
3490                 # Yes, we have it...
3491                 AC_MSG_RESULT(yes)
3492                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
3493         ], [
3494                 # We'll just have to try and use struct ip_mreq
3495                 AC_MSG_RESULT(no)
3496                 AC_MSG_CHECKING(for struct ip_mreq)
3497                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3498                         struct ip_mreq mreq;
3499                         mreq.imr_interface.s_addr = 0;
3500                 ], [
3501                         # Yes, we have it...
3502                         AC_MSG_RESULT(yes)
3503                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
3504                 ], [
3505                         # No multicast support
3506                         AC_MSG_RESULT(no)
3507                 ])
3508         ])
3510         dnl **********************************
3511         dnl *** Check for getaddrinfo ***
3512         dnl **********************************
3513         AC_MSG_CHECKING(for getaddrinfo)
3514                 AC_TRY_LINK([
3515                 #include <stdio.h>
3516                 #include <winsock2.h>
3517                 #include <ws2tcpip.h>
3518         ], [
3519                 getaddrinfo(NULL,NULL,NULL,NULL);
3520         ], [
3521                 # Yes, we have it...
3522                 AC_MSG_RESULT(yes)
3523                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
3524         ], [
3525                 AC_MSG_RESULT(no)
3526         ])
3528         dnl **********************************
3529         dnl *** Check for gethostbyname ***
3530         dnl **********************************
3531         AC_MSG_CHECKING(for gethostbyname)
3532                 AC_TRY_LINK([
3533                 #include <stdio.h>
3534                 #include <winsock2.h>
3535                 #include <ws2tcpip.h>
3536         ], [
3537                 gethostbyname(NULL);
3538         ], [
3539                 # Yes, we have it...
3540                 AC_MSG_RESULT(yes)
3541                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
3542         ], [
3543                 AC_MSG_RESULT(no)
3544         ])
3546         dnl **********************************
3547         dnl *** Check for getprotobyname ***
3548         dnl **********************************
3549         AC_MSG_CHECKING(for getprotobyname)
3550                 AC_TRY_LINK([
3551                 #include <stdio.h>
3552                 #include <winsock2.h>
3553                 #include <ws2tcpip.h>
3554         ], [
3555                 getprotobyname(NULL);
3556         ], [
3557                 # Yes, we have it...
3558                 AC_MSG_RESULT(yes)
3559                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
3560         ], [
3561                 AC_MSG_RESULT(no)
3562         ])
3564         dnl **********************************
3565         dnl *** Check for getnameinfo ***
3566         dnl **********************************
3567         AC_MSG_CHECKING(for getnameinfo)
3568                 AC_TRY_LINK([
3569                 #include <stdio.h>
3570                 #include <winsock2.h>
3571                 #include <ws2tcpip.h>
3572         ], [
3573                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
3574         ], [
3575                 # Yes, we have it...
3576                 AC_MSG_RESULT(yes)
3577                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
3578         ], [
3579                 AC_MSG_RESULT(no)
3580         ])
3582         dnl **********************************
3583         dnl *** Check for inet_ntop ***
3584         dnl **********************************
3585         AC_MSG_CHECKING(for inet_ntop)
3586                 AC_TRY_LINK([
3587                 #include <stdio.h>
3588                 #include <winsock2.h>
3589                 #include <ws2tcpip.h>
3590         ], [
3591                 inet_ntop (0, NULL, NULL, 0);
3592         ], [
3593                 # Yes, we have it...
3594                 AC_MSG_RESULT(yes)
3595                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
3596         ], [
3597                 AC_MSG_RESULT(no)
3598         ])
3600         dnl **********************************
3601         dnl *** Check for inet_pton ***
3602         dnl **********************************
3603         AC_MSG_CHECKING(for inet_pton)
3604                 AC_TRY_LINK([
3605                 #include <stdio.h>
3606                 #include <winsock2.h>
3607                 #include <ws2tcpip.h>
3608         ], [
3609                 #ifndef inet_pton
3610                 (void) inet_pton;
3611                 #endif
3612                 inet_pton (0, NULL, NULL);
3613         ], [
3614                 # Yes, we have it...
3615                 AC_MSG_RESULT(yes)
3616                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
3617         ], [
3618                 AC_MSG_RESULT(no)
3619         ])
3621         AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
3622         AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
3623         AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
3624         AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
3625         AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
3626         AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
3627         AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
3630 dnl socklen_t check
3631 AC_MSG_CHECKING(for socklen_t)
3632 AC_TRY_COMPILE([
3633 #include <sys/types.h>
3634 #include <sys/socket.h>
3636   socklen_t foo;
3638 ac_cv_c_socklen_t=yes
3639         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
3640         AC_MSG_RESULT(yes)
3642         AC_MSG_RESULT(no)
3645 AC_CHECK_FUNCS(execvp)
3647 dnl ****************************
3648 dnl *** Look for /dev/random ***
3649 dnl ****************************
3651 AC_MSG_CHECKING([if usage of random device is requested])
3652 AC_ARG_ENABLE(dev-random,
3653 [  --disable-dev-random    disable the use of the random device (enabled by default)],
3654 try_dev_random=$enableval, try_dev_random=yes)
3656 AC_MSG_RESULT($try_dev_random)
3658 case "{$build}" in
3660 dnl IBM i does not have /dev/random, use unblocking only
3662     *-*-os400*)
3663     NAME_DEV_RANDOM="/dev/urandom"
3664     ;;
3666 dnl Win32 does not have /dev/random, they have their own method...
3668     *-mingw*|*-*-cygwin*)
3669     ac_cv_have_dev_random=no
3670     ;;
3672 dnl Everywhere else, it's /dev/random
3674     *)
3675     NAME_DEV_RANDOM="/dev/random"
3676     ;;
3677 esac
3679 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
3681 dnl Now check if the device actually exists
3683 if test "x$try_dev_random" = "xyes"; then
3684     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
3685     [if test -r "$NAME_DEV_RANDOM" ; then
3686         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
3687     if test "x$ac_cv_have_dev_random" = "xyes"; then
3688         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
3689     fi
3690 else
3691     AC_MSG_CHECKING(for random device)
3692     ac_cv_have_dev_random=no
3693     AC_MSG_RESULT(has been disabled)
3696 if test "x$host_win32" = "xyes"; then
3697     AC_DEFINE(HAVE_CRYPT_RNG)
3700 if test "x$ac_cv_have_dev_random" = "xno" \
3701     && test "x$host_win32" = "xno"; then
3702     AC_MSG_WARN([[
3704 *** A system-provided entropy source was not found on this system.
3705 *** Because of this, the System.Security.Cryptography random number generator
3706 *** will throw a NotImplemented exception.
3708 *** If you are seeing this message, and you know your system DOES have an
3709 *** entropy collection in place, please report an issue on GitHub and
3710 *** provide information about the system and how to access the random device.
3712 *** Otherwise you can install either egd or prngd and set the environment
3713 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
3714 ***]])
3717 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)
3719 AC_MSG_CHECKING([if big-arrays are to be enabled])
3720 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)
3721 if test "x$enable_big_arrays" = "xyes" ; then
3722     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
3723         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
3724     else
3725         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
3726     fi
3728 AC_MSG_RESULT($enable_big_arrays)
3730 dnl **************
3731 dnl *** DTRACE ***
3732 dnl **************
3734 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
3736 if test "x$enable_dtrace" = "xyes"; then
3737    if test "x$has_dtrace" = "xno"; then
3738           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
3739    fi
3740    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
3741    if test "x$DTRACE" = "xno"; then
3742           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
3743           enable_dtrace=no
3744    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
3745           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
3746           enable_dtrace=no
3747    fi
3750 dtrace_g=no
3751 if test "x$enable_dtrace" = "xyes"; then
3752         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
3753         DTRACEFLAGS=
3754         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3755                 case "$host" in
3756                         powerpc-*-darwin*)
3757                         DTRACEFLAGS="-arch ppc64"
3758                         ;;
3759                         i*86-*-darwin*)
3760                         DTRACEFLAGS="-arch x86_64"
3761                         ;;
3762                         *)
3763                         DTRACEFLAGS=-64
3764                         ;;
3765                 esac
3766         else
3767                 case "$host" in
3768                         powerpc-*-darwin*)
3769                         DTRACEFLAGS="-arch ppc"
3770                         ;;
3771                         i*86-*-darwin*)
3772                         DTRACEFLAGS="-arch i386"
3773                         ;;
3774                         *)
3775                         DTRACEFLAGS=-32
3776                         ;;
3777                 esac
3778         fi
3779         AC_SUBST(DTRACEFLAGS)
3780         case "$host" in
3781                 *-*-solaris*)
3782                 dtrace_g=yes
3783                 ;;
3784         esac
3785         AC_CHECK_HEADERS([sys/sdt.h])
3787 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
3788 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
3790 dnl **************************
3791 dnl *** AOT cross offsets  ***
3792 dnl **************************
3794 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
3795     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
3797 dnl **************
3798 dnl ***  LLVM  ***
3799 dnl **************
3801 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
3802 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
3803 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)
3804 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
3805 AC_ARG_ENABLE(llvm-asserts,[  --enable-llvm-asserts Enable llvm asserts (option to LLVM in CMake)], enable_llvm_asserts=$enableval, enable_llvm_asserts=no)
3807 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
3809 if test "x$enable_llvm" = "xdefault"; then
3810    enable_llvm=$enable_llvm_default
3813 internal_llvm="no"
3814 if test "x$enable_llvm" = "xyes"; then
3815         if test "x$with_llvm" != "x"; then
3816                 EXTERNAL_LLVM_CONFIG=$with_llvm/bin/llvm-config
3817                 if test x$host_win32 = xyes; then
3818                         EXTERNAL_LLVM_CONFIG=$EXTERNAL_LLVM_CONFIG.exe
3819                 fi
3820                 if test ! -x $EXTERNAL_LLVM_CONFIG; then
3821                         AC_MSG_ERROR([LLVM executable $EXTERNAL_LLVM_CONFIG not found.])
3822                 fi
3823         else
3824                 if test x$host_win32 = xyes; then
3825                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config.exe, no)
3826                 else
3827                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config, no)
3828                 fi
3829                 if test "x$EXTERNAL_LLVM_CONFIG" = "xno"; then
3830                         internal_llvm=yes
3831                 fi
3832         fi
3834         LLVM_CODEGEN_LIBS="x86codegen"
3835         case "$target" in
3836         arm*)
3837                 LLVM_CODEGEN_LIBS="armcodegen"
3838                 ;;
3839         aarch64*)
3840                 LLVM_CODEGEN_LIBS="aarch64codegen"
3841                 ;;
3842         powerpc*)
3843                 LLVM_CODEGEN_LIBS="powerpccodegen"
3844                 ;;
3845         esac
3846         if test "x$host" != "x$target"; then
3847                 # No need for jit libs
3848                 LLVM_CODEGEN_LIBS=
3849         fi
3851         AC_SUBST(LLVM_CODEGEN_LIBS)
3852         AC_SUBST(EXTERNAL_LLVM_CONFIG)
3854         if test "x$host_win32" = "xyes" && test "x$cross_compiling" = "xno" &&  test "x$internal_llvm" = "xno"; then
3855                 EXTERNAL_LLVM_CONFIG_WIN32=$(cygpath -m $EXTERNAL_LLVM_CONFIG)
3856                 AC_SUBST(EXTERNAL_LLVM_CONFIG_WIN32)
3857         fi
3858         AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
3859 fi # ENABLE_LLVM
3861 # AC_DEFINE necessary for correct restore behavior on Linux
3862 AM_CONDITIONAL(INTERNAL_LLVM, [test "x$internal_llvm" != "xno"])
3863 if test "x$internal_llvm" != "xno"; then
3864    AC_DEFINE(INTERNAL_LLVM, 1, [LLVM used is being build during mono build])
3867 AM_CONDITIONAL(INTERNAL_LLVM_ASSERTS, [test "x$enable_llvm_asserts" != "xno"])
3868 if test "x$enable_llvm_asserts" != "xno"; then
3869    AC_DEFINE(INTERNAL_LLVM_ASSERTS, 1, [Build LLVM with assertions])
3872 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes])
3874 if test "x$enable_loadedllvm" = "xyes"; then
3875    AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
3877 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes])
3879 if test "x$enable_llvm" = "xyes"; then
3880    enable_llvm_runtime=yes
3882 if test "x$enable_llvm_runtime" = "xyes"; then
3883    AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
3885 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes])
3887 TARGET="unknown"
3888 ACCESS_UNALIGNED="yes"
3890 LIBC="libc.so.6"
3891 INTL="libc.so.6"
3892 SQLITE="libsqlite.so.0"
3893 SQLITE3="libsqlite3.so.0"
3894 X11="libX11.so"
3895 GDKX11="libgdk-x11-2.0.so.0"
3896 GTKX11="libgtk-x11-2.0.so.0"
3897 XINERAMA="libXinerama.so.1"
3899 sizeof_register="SIZEOF_VOID_P"
3901 jit_wanted=true
3902 boehm_supported=true
3903 BTLS_SUPPORTED=no
3904 BTLS_PLATFORM=
3906 case "$host" in
3907         wasm32*)
3908                 TARGET=WASM
3909                 arch_target=wasm
3910                 BTLS_SUPPORTED=no
3911                 ACCESS_UNALIGNED="no"
3912                 with_tls=pthread
3913                 ;;
3914         mips*)
3915                 TARGET=MIPS;
3916                 arch_target=mips;
3917                 with_tls=pthread;
3918                 ACCESS_UNALIGNED="no"
3920                 AC_MSG_CHECKING(for mips n32)
3921                 AC_TRY_COMPILE([],[
3922                 #if _MIPS_SIM != _ABIN32
3923                 #error Not mips n32
3924                 #endif
3925                 ],[
3926                 AC_MSG_RESULT(yes)
3927                 sizeof_register=8
3928                 ],[
3929                 AC_MSG_RESULT(no)
3930                 ])
3931                 ;;
3932         i*86-*-*)
3933                 TARGET=X86;
3934                 arch_target=x86;
3935                 case $host_os in
3936                   solaris*)
3937                         LIBC="libc.so"
3938                         INTL="libintl.so"
3939                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3940                                 TARGET=AMD64
3941                                 arch_target=amd64
3942                         fi
3944                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
3945                         # int astruct __attribute__ ((visibility ("hidden")));
3946                         # void foo ()
3947                         # {
3948                         #       void *p = &astruct;
3949                         # }
3950                         # gcc -fPIC --shared -o libfoo.so foo.c
3951                         # yields:
3952                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
3953                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
3954                         have_visibility_hidden=no
3955                         ;;
3956                   mingw*|cygwin*)
3957                         have_visibility_hidden=no
3958                         BTLS_SUPPORTED=no
3959                         BTLS_PLATFORM=i386
3960                         ;;
3961                   haiku*)
3962                         LIBC=libroot.so
3963                         ;;
3964                   linux*)
3965                         AOT_SUPPORTED="yes"
3966                         BTLS_SUPPORTED=yes
3967                         BTLS_PLATFORM=i386
3968                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3969                         ;;
3970                   darwin*)
3971                         AOT_SUPPORTED="yes"
3972                         BTLS_SUPPORTED=yes
3973                         BTLS_PLATFORM=i386
3974                         ;;
3975                   openbsd*|freebsd*|kfreebsd-gnu*)
3976                         AOT_SUPPORTED="yes"
3977                         BTLS_SUPPORTED=yes
3978                         BTLS_PLATFORM=i386
3979                         ;;
3980                 esac
3981                 ;;
3982         x86_64-*-* | amd64-*-*)
3983                 TARGET=AMD64;
3984                 arch_target=amd64;
3985                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
3986                         AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
3987                         sizeof_register=8
3988                 fi
3989                 case $host_os in
3990                   linux*)
3991                         AOT_SUPPORTED="yes"
3992                         BTLS_SUPPORTED=yes
3993                         BTLS_PLATFORM=x86_64
3994                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3995                         ;;
3996                   darwin*)
3997                         AOT_SUPPORTED="yes"
3998                         BTLS_SUPPORTED=yes
3999                         BTLS_PLATFORM=x86_64
4000                         boehm_supported=false
4001                         ;;
4002                   openbsd*|freebsd*|kfreebsd-gnu*)
4003                         AOT_SUPPORTED="yes"
4004                         BTLS_SUPPORTED=yes
4005                         BTLS_PLATFORM=x86_64
4006                         ;;
4007                   mingw*|cygwin*)
4008                         BTLS_SUPPORTED=no
4009                         BTLS_PLATFORM=x86_64
4010                         ;;
4011                 esac
4012                 ;;
4013         sparc*-*-*)
4014                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4015                    TARGET=SPARC64
4016                 else
4017                         TARGET=SPARC
4018                 fi
4019                 arch_target=sparc;
4020                 ACCESS_UNALIGNED="no"
4021                 case $host_os in
4022                   linux*) ;;
4023                   *)
4024                         LIBC="libc.so"
4025                         INTL="libintl.so"
4026                 esac
4027                 if test x"$GCC" = xyes; then
4028                         # We don't support v8 cpus
4029                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
4030                 fi
4031                 if test x"$AR" = xfalse; then
4032                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
4033                 fi
4034                 ;;
4035         *-mingw*|*-*-cygwin*)
4036                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
4037                 have_visibility_hidden=no
4038                 INTL="intl"
4039                 ;;
4040         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
4041         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
4042         powerpc-*-freebsd* | powerpc*-*-aix* | powerpc*-*-os400* )
4043                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4044                         TARGET=POWERPC64;
4045                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
4046                         if ! (echo $CC | grep -q -- 'clang'); then
4047                                 CFLAGS="$CFLAGS -mminimal-toc"
4048                         fi
4049                 else
4050                         TARGET=POWERPC;
4051                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
4052                 fi
4053                 arch_target=ppc;
4054                 case $host_os in
4055                   aix*|os400*)
4056                         BTLS_SUPPORTED=yes
4057                         BTLS_PLATFORM=powerpc
4058                         dnl on AIX/PASE, shared libraries can be inside archives
4059                         dnl if they are, we specify them by lib.a(lib.so)
4060                         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX, so
4061                         LIBC="libc.a(shr_64.o)"
4062                         INTL="libintl.a(libintl.so.8)"
4063                         ;;
4064                   linux*)
4065                         BTLS_SUPPORTED=yes
4066                         BTLS_PLATFORM=powerpc
4067                         ;;
4068                 esac
4069                 ;;
4070         armv7k-*-darwin*)
4071                 TARGET=ARM;
4072                 TARGET_SYS=WATCHOS
4073                 arch_target=arm;
4074                 arm_fpu=VFP_HARD
4075                 ACCESS_UNALIGNED="no"
4076                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4077                 ;;
4079         arm*-darwin*)
4080                 TARGET=ARM;
4081                 arch_target=arm;
4082                 ACCESS_UNALIGNED="no"
4083                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4084                 ;;
4085         arm*-linux*)
4086                 TARGET=ARM;
4087                 arch_target=arm;
4088                 ACCESS_UNALIGNED="no"
4089                 AOT_SUPPORTED="yes"
4090                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4091                 BTLS_SUPPORTED=yes
4092                 BTLS_PLATFORM=arm
4093                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4094                 case "$target" in
4095                 arm*-linux*-gnueabi)
4096                         BTLS_PLATFORM=armsoft
4097                         ;;
4098                 esac
4099                 ;;
4100         arm*-netbsd*-eabi*)
4101                 TARGET=ARM;
4102                 arch_target=arm;
4103                 ACCESS_UNALIGNED="no"
4104                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4105                 ;;
4106         aarch64-*)
4107                 # https://lkml.org/lkml/2012/7/15/133
4108                 TARGET=ARM64
4109                 arch_target=arm64
4110                 boehm_supported=false
4111                 AOT_SUPPORTED="yes"
4112                 BTLS_SUPPORTED=yes
4113                 BTLS_PLATFORM=aarch64
4114                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4115                 ;;
4116         s390x-*-linux*)
4117                 TARGET=S390X;
4118                 arch_target=s390x;
4119                 ACCESS_UNALIGNED="yes"
4120                 BTLS_SUPPORTED=yes
4121                 BTLS_PLATFORM=s390x
4122                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
4123                 ;;
4124         riscv32-*)
4125                 TARGET=RISCV32
4126                 ACCESS_UNALIGNED=no
4127                 AOT_SUPPORTED=no
4128                 BTLS_SUPPORTED=yes
4129                 BTLS_PLATFORM=riscv32
4130                 arch_target=riscv32
4131                 boehm_supported=false
4132                 ;;
4133         riscv64*)
4134                 TARGET=RISCV64
4135                 ACCESS_UNALIGNED=no
4136                 AOT_SUPPORTED=no
4137                 BTLS_SUPPORTED=yes
4138                 BTLS_PLATFORM=riscv64
4139                 arch_target=riscv64
4140                 boehm_supported=false
4141                 ;;
4142 esac
4144 HOST=$TARGET
4146 if test "x$host" != "x$target"; then
4147    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
4148    enable_mcs_build=no
4149    enable_support_build=no
4150    BTLS_SUPPORTED=no
4151    # Can't use tls, since it depends on the runtime detection of tls offsets
4152    # in mono-compiler.h
4153    with_tls=pthread
4154    target_mach=no
4155    case "$target" in
4156    wasm32*)
4157                 TARGET=WASM
4158                 arch_target=wasm
4159                 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
4160                 ;;
4161    arm*-darwin*)
4162                 TARGET=ARM;
4163                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4164                 case "$target" in
4165                 armv7k-*)
4166                         arm_fpu=VFP_HARD
4167                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
4168                         ;;
4169                 esac            
4170                 ;;
4171    powerpc64-ps3-linux-gnu)
4172                 TARGET=POWERPC64
4173                 arch_target=powerpc64
4174                 AC_DEFINE(TARGET_PS3, 1, [...])
4175                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4176                 # uses this define
4177                 AC_DEFINE(__mono_ppc64__, 1, [...])
4178                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4179                 sizeof_register=8
4180                 target_byte_order=G_BIG_ENDIAN
4181                 ;;
4182    powerpc64-xbox360-linux-gnu)
4183                 TARGET=POWERPC64
4184                 arch_target=powerpc64
4185                 AC_DEFINE(TARGET_XBOX360, 1, [...])
4186                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4187                 # uses this define
4188                 sizeof_register=8
4189                 target_byte_order=G_BIG_ENDIAN
4190                 ;;
4191    arm*-linux-*)
4192                 TARGET=ARM;
4193                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4194                 ;;
4195    arm*-netbsd*-eabi*)
4196                 TARGET=ARM;
4197                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4198                 ;;
4199    i686*-linux-*)
4200                 TARGET=X86;
4201                 ;;
4202    i*86-apple-*)
4203                 TARGET=X86;
4204                 ;;
4205    x86_64*-linux-*)
4206                 TARGET=AMD64;
4207                 ;;
4208    x86_64-ps4-freebsd)
4209                 TARGET=AMD64;
4210                 AC_DEFINE(TARGET_PS4, 1, [...])
4211                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
4212                 CPPFLAGS="$CPPFLAGS"
4213                 target_win32=no
4214                 ;;
4215    aarch64*-linux-*)
4216                 TARGET=ARM64;
4217                 ;;
4218         aarch64-*)
4219                 TARGET=ARM64
4220                 ;;
4221         riscv32*)
4222                 TARGET=RISCV32
4223                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4224                 AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4225                 arch_target=riscv32
4226                 target_mach=no
4227                 with_tls=pthread
4228                 ;;
4229         riscv64*)
4230                 TARGET=RISCV64
4231                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4232                 AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4233                 arch_target=riscv64
4234                 target_mach=no
4235                 with_tls=pthread
4236                 ;;
4237         *)
4238                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
4239         esac
4241         case "$target" in
4242         *-darwin*)
4243                 target_mach=yes
4244                 ;;
4245         *-linux-android*)
4246                 AC_DEFINE(TARGET_ANDROID, 1, [...])
4247                 ;;
4248         esac
4251 case "$TARGET" in
4252 WASM)
4253         AC_DEFINE(TARGET_WASM, 1, [...])
4254         arch_target=wasm
4255         target_sizeof_void_p=4
4256         ;;
4257 X86)
4258         AC_DEFINE(TARGET_X86, 1, [...])
4259         arch_target=x86
4260         target_sizeof_void_p=4
4261         ;;
4262 AMD64)
4263         AC_DEFINE(TARGET_AMD64, 1, [...])
4264         arch_target=amd64
4265         ;;
4266 ARM)
4267         AC_DEFINE(TARGET_ARM, 1, [...])
4268         arch_target=arm
4269         ACCESS_UNALIGNED="no"
4270         target_sizeof_void_p=4
4271         ;;
4272 ARM64)
4273         AC_DEFINE(TARGET_ARM64, 1, [...])
4274         arch_target=arm64
4275         ;;
4276 POWERPC)
4277         AC_DEFINE(TARGET_POWERPC, 1, [...])
4278         ;;
4279 POWERPC64)
4280         AC_DEFINE(TARGET_POWERPC, 1, [...])
4281         AC_DEFINE(TARGET_POWERPC64, 1, [...])
4282         ;;
4283 S390X)
4284         AC_DEFINE(TARGET_S390X, 1, [...])
4285         ;;
4286 MIPS)
4287         AC_DEFINE(TARGET_MIPS, 1, [...])
4288         ;;
4289 SPARC)
4290         AC_DEFINE(TARGET_SPARC, 1, [...])
4291         ;;
4292 SPARC64)
4293         AC_DEFINE(TARGET_SPARC64, 1, [...])
4294         ;;
4295 RISCV32)
4296         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4297         AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4298         ;;
4299 RISCV64)
4300         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4301         AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4302         ;;
4303 esac
4305 case "$HOST" in
4306 WASM)
4307         AC_DEFINE(HOST_WASM, 1, [...])
4308         ;;
4309 X86)
4310         AC_DEFINE(HOST_X86, 1, [...])
4311         ;;
4312 AMD64)
4313         AC_DEFINE(HOST_AMD64, 1, [...])
4314         ;;
4315 ARM)
4316         AC_DEFINE(HOST_ARM, 1, [...])
4317         ;;
4318 ARM64)
4319         AC_DEFINE(HOST_ARM64, 1, [...])
4320         ;;
4321 POWERPC)
4322         AC_DEFINE(HOST_POWERPC, 1, [...])
4323         ;;
4324 POWERPC64)
4325         AC_DEFINE(HOST_POWERPC, 1, [...])
4326         AC_DEFINE(HOST_POWERPC64, 1, [...])
4327         ;;
4328 S390X)
4329         AC_DEFINE(HOST_S390X, 1, [...])
4330         ;;
4331 MIPS)
4332         AC_DEFINE(HOST_MIPS, 1, [...])
4333         ;;
4334 SPARC)
4335         AC_DEFINE(HOST_SPARC, 1, [...])
4336         ;;
4337 SPARC64)
4338         AC_DEFINE(HOST_SPARC64, 1, [...])
4339         ;;
4340 RISCV32)
4341         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4342         AC_DEFINE([HOST_RISCV32], [1], [Host is 32-bit RISC-V])
4343         ;;
4344 RISCV64)
4345         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4346         AC_DEFINE([HOST_RISCV64], [1], [Host is 64-bit RISC-V])
4347         ;;
4348 esac
4350 MONO_ARCH_GSHAREDVT_SUPPORTED=0
4351 case "$HOST" in
4352 X86 | AMD64 | ARM | ARM64)
4353         MONO_ARCH_GSHAREDVT_SUPPORTED=1 # keep in sync with mini-{x86,amd64,arm,arm64}.h
4354         ;;
4355 esac
4357 AM_CONDITIONAL(MONO_ARCH_GSHAREDVT_SUPPORTED, test $MONO_ARCH_GSHAREDVT_SUPPORTED = 1)
4358 AM_CONDITIONAL(TARGET_WASM, test $arch_target = wasm)
4360 dnl *************
4361 dnl *** VTUNE ***
4362 dnl *************
4364 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
4365 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
4367 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
4369 if test "x$enable_vtune" = "xyes"; then
4370         if test "x$with_vtune" = "x"; then
4371                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
4372         else
4373                 VTUNE_PATH=$with_vtune
4374         fi
4375         VTUNE_INCLUDE=$VTUNE_PATH/include
4376         case "$TARGET" in
4377         X86)
4378                 VTUNE_LIB=$VTUNE_PATH/lib32
4379                 ;;
4380         AMD64)
4381                 VTUNE_LIB=$VTUNE_PATH/lib64
4382                 ;;
4383         *)
4384                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
4385                 ;;
4386         esac
4387         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
4388                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
4389         fi
4390         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
4391                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
4392         fi
4394         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
4395         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
4397         AC_SUBST(VTUNE_LIBS)
4398         AC_SUBST(VTUNE_CFLAGS)
4400 dnl Use GCC atomic ops if they work on the target.
4401 if test x$GCC = "xyes"; then
4402         case $TARGET in
4403         X86 | AMD64 | ARM | ARM64 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64 | RISCV32 | RISCV64)
4404                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
4405                 ;;
4406         esac
4409 if test "x$target_mach" = "xyes"; then
4411    if test "x$TARGET_SYS" = "xWATCHOS"; then
4412           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
4413           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4414           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4415           BTLS_SUPPORTED=no
4416    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64"; then
4417           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4418           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4419           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4420           BTLS_SUPPORTED=no
4421           target_ios=yes
4422    else
4423        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
4424        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
4425        #error fail this for ios
4426        #endif
4427        ], [
4428                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
4429           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
4430           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
4431           target_osx=yes
4432        ], [
4433           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4434           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4435           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4436           BTLS_SUPPORTED=no
4437                   target_ios=yes
4438        ])
4439         fi
4440    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
4443 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
4445 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
4447 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
4448    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
4449 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
4450    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
4451 else
4452    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
4455 if test "x$target_sizeof_void_p" != "x"; then
4456    AC_DEFINE_UNQUOTED(TARGET_SIZEOF_VOID_P,${target_sizeof_void_p},[wordsize of target])
4457    # This is true for all the current cross-compiling targets
4458    AC_DEFINE(SIZEOF_REGISTER,TARGET_SIZEOF_VOID_P,[size of target machine integer registers])
4459 else
4460    AC_DEFINE(TARGET_SIZEOF_VOID_P,SIZEOF_VOID_P,[wordsize of target])
4461    if test "x$sizeof_register" = "x4"; then
4462       AC_DEFINE(SIZEOF_REGISTER,4,[size of target machine integer registers])
4463    elif test "x$sizeof_register" = "x8"; then
4464       AC_DEFINE(SIZEOF_REGISTER,8,[size of target machine integer registers])
4465    else
4466       AC_DEFINE(SIZEOF_REGISTER,SIZEOF_VOID_P,[size of target machine integer registers])
4467    fi
4470 if test "x$have_visibility_hidden" = "xyes"; then
4471    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
4474 if test "x$have_deprecated" = "xyes"; then
4475    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
4478 dnl 
4479 dnl Simple Generational checks (sgen)
4481 SGEN_DEFINES=
4482 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
4483 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
4484 if test x$buildsgen = xyes; then
4485    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
4486    SGEN_DEFINES="-DHAVE_SGEN_GC"
4488         conc_gc_msg=""
4489    if test x$with_sgen_default_concurrent != xno; then
4490        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
4491            conc_gc_msg=" (concurrent by default)"
4492    fi
4494    if test "x$gc_msg" = "x"; then
4495       gc_msg="sgen$conc_gc_msg"
4496    else
4497       gc_msg="sgen$conc_gc_msg and $gc_msg"
4498    fi
4500 AC_SUBST(SGEN_DEFINES)
4501 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
4503 jit_status="Building and using the JIT"
4505 libsuffix=".so"
4507 case "$host" in
4508      *-*-darwin*)
4509         libsuffix=".dylib"
4510         LIBC="libc.dylib"
4511         INTL="libintl.dylib"
4512         SQLITE="libsqlite.0.dylib"
4513         SQLITE3="libsqlite3.0.dylib"
4514         X11="libX11.dylib"
4515         GDKX11="libgdk-x11-2.0.dylib"
4516         GTKX11="libgtk-x11-2.0.dylib"
4517         ;;
4518      *-*-*netbsd*)
4519         LIBC="libc.so"
4520         INTL="libintl.so"
4521         SQLITE="libsqlite.so"
4522         SQLITE3="libsqlite3.so"
4523         ;;
4524      *-*-kfreebsd*-gnu)
4525         LIBC="libc.so.0.1"
4526         INTL="libc.so.0.1"
4527         X11="libX11.so.6"
4528         ;;
4529     *-*-*freebsd*)
4530         LIBC="libc.so.7"
4531         INTL="libintl.so"
4532         SQLITE="libsqlite.so"
4533         SQLITE3="libsqlite3.so"
4534         ;;
4535     *-*-*openbsd*)
4536         LIBC="libc.so"
4537         INTL="libintl.so"
4538         SQLITE="libsqlite.so"
4539         SQLITE3="libsqlite3.so"
4540         ;;
4541     *-*-*linux*)
4542         AC_PATH_X
4543         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
4544         AC_MSG_CHECKING(for the soname of libX11.so)
4545         for i in $x_libraries $dlsearch_path; do
4546                 for r in 4 5 6; do
4547                         if test -f $i/libX11.so.$r; then
4548                                 X11=libX11.so.$r
4549                                 AC_MSG_RESULT($X11)
4550                         fi
4551                 done
4552         done
4553         
4554         if test "x$X11" = "xlibX11.so"; then
4555                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
4556                 X11=libX11.so.6
4557         fi
4558         ;;
4559 esac
4561 AC_SUBST(libsuffix)
4563 ######################################
4564 # EGLIB CHECKS
4565 ######################################
4567 GNUC_PRETTY=
4568 GNUC_UNUSED=
4569 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
4570 if test x$GCC = xyes; then
4571    GNUC_UNUSED='__attribute__((__unused__))'
4572    GNUC_NORETURN='__attribute__((__noreturn__))'
4573    case $host_cpu in
4574      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
4575    esac
4577 AC_SUBST(GNUC_PRETTY)
4578 AC_SUBST(GNUC_UNUSED)
4579 AC_SUBST(GNUC_NORETURN)
4580 AC_SUBST(BREAKPOINT)
4582 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
4584 case $host in
4585 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
4586     PATHSEP='\\'
4587     SEARCHSEP=';'
4588     OS="WIN32"
4589     PIDTYPE='void *'
4590     ;;
4592     PATHSEP='/'
4593     SEARCHSEP=':'
4594     OS="UNIX"
4595     PIDTYPE='int'
4596     ;;
4597 esac
4599 case $host in
4600         *-*-solaris*)
4601         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
4602         ;;
4603 esac
4605 case $target in
4606 arm*-darwin*|aarch64*-*|riscv*)
4607     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
4608     ;;
4609 i*86-*-darwin*)
4610     ORDER=G_LITTLE_ENDIAN
4611     ;;
4612 *-*-haiku*)
4613     LDFLAGS="$LDFLAGS -ltextencoding"
4614     ;;
4615 *-*-openbsd*)
4616     CFLAGS="$CFLAGS -pthread"
4617     LDFLAGS="$LDFLAGS -pthread"
4618     ;;
4619 esac
4621 AC_SUBST(ORDER)
4622 AC_SUBST(CFLAGS)
4623 AC_SUBST(PATHSEP)
4624 AC_SUBST(SEARCHSEP)
4625 AC_SUBST(OS)
4626 AC_SUBST(PIDTYPE)
4628 # Defined for all targets/platforms using classic Windows API support.
4629 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
4630 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
4632 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf)
4633 AC_CHECK_FUNCS(getrlimit)
4634 AC_CHECK_FUNCS(fork execv execve)
4636 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
4638 if test x$with_overridable_allocators = xyes; then
4639         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
4640   AC_MSG_NOTICE([Overridable allocator support enabled])
4641 else
4642   AC_MSG_NOTICE([Overridable allocator support disabled])
4646 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
4647 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
4648 # removed once support for 10.6 is dropped.
4650 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
4652 if test x$target_osx = xyes; then
4653 AC_CHECK_FUNCS(getpwuid_r)
4654 elif test x$target_ios = xno; then
4655 AC_CHECK_FUNCS(strndup getpwuid_r)
4658 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
4660 AC_SEARCH_LIBS(sqrtf, m)
4662 # nanosleep may not be part of libc, also search it in other libraries
4663 AC_SEARCH_LIBS(nanosleep, rt)
4665 AC_SEARCH_LIBS(dlopen, dl)
4666 old_ldflags="${LDFLAGS}"
4667 # GNU specific option, this confuses IBM ld, but do offer alternatives when possible
4668 if test $lt_cv_prog_gnu_ld = yes; then
4669         LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4670 else
4671         case $host in
4672         *-*-aix*|*-*-os400*)
4673                 ;;
4674         *)
4675                 dnl Try to use export-dynamic anyways
4676                 LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4677                 ;;
4678         esac
4680 AC_TRY_LINK(, [int i;], found_export_dynamic=yes, found_export_dynamic=no)
4681 if test $found_export_dynamic = no; then
4682         LDFLAGS="${old_ldflags}"
4685 AC_CHECK_HEADERS(getopt.h sys/select.h sys/time.h sys/wait.h pwd.h iconv.h sys/types.h sys/resource.h)
4686 dnl giconv.c will check on HAVE_ICONV_H but we need this for link time
4687 AC_CHECK_LIB(iconv, iconv_open)
4688 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
4689 AC_SUBST(HAVE_ALLOCA_H)
4691 # Get the exact type of size_t, not just its size.
4692 # This is so we can find an exact printf format among u, lu, llu, I64u.
4693 # To avoid warnings about slight mismatches.
4694 # C99 runtime "zu" dependency is being avoided here.
4696 # We have to compile as C++ because C is too lenient
4697 # and lets the wrong thing compile, with warnings.
4699 # Note: "zu" or ifdef <something> have the advantage
4700 # of producing installable "biarch" headers. i.e. one Mac header
4701 # for Mac/x86 and Mac/amd64.
4703 AC_LANG_PUSH(C++)
4705 # Check long before int because it is the overwhelming Unix answer,
4706 # across 32bit and 64bit systems -- fewer compiler invocations in autoconf.
4708 # long ahead of int also tends to produce biarch-compatible headers except Windows.
4710 AC_MSG_CHECKING(if size_t is unsigned long)
4711 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4712         #include <stddef.h>
4713         unsigned long *a = (size_t*)0;
4714 ])], [
4715         AC_MSG_RESULT(yes)
4716         AC_SUBST(GSIZE_FORMAT, '"%lu"')
4717 ], [
4718         AC_MSG_RESULT(no)
4719         AC_MSG_CHECKING(if size_t is unsigned int)
4720         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4721                 #include <stddef.h>
4722                 unsigned *a = (size_t*)0;
4723         ])], [
4724                 AC_MSG_RESULT(yes)
4725                 AC_SUBST(GSIZE_FORMAT, '"%u"')
4726         ], [
4727 # At this point the majority of systems have their answer,
4728 # and we descend into non-standard or new-standard territory.
4730 # Check __int64 first because I64 on some systems predates ll, enabling
4731 # new compiler/old runtime interop, and the types always have the same size.
4732                 AC_MSG_RESULT(no)
4733                 AC_MSG_CHECKING(if size_t is unsigned __int64)
4734                 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4735                         #include <stddef.h>
4736                         unsigned __int64 *a = (size_t*)0;
4737                 ])], [
4738                         AC_MSG_RESULT(yes)
4739                         AC_SUBST(GSIZE_FORMAT, '"%I64u"')
4740                 ], [
4741                         AC_MSG_RESULT(no)
4742                         AC_MSG_CHECKING(if size_t is unsigned long long)
4743                         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4744                                 #include <stddef.h>
4745                                 unsigned long long *a = (size_t*)0;
4746                         ])], [
4747                                 AC_MSG_RESULT(yes)
4748                                 AC_SUBST(GSIZE_FORMAT, '"%llu"')
4749                         ], [
4750                                 AC_MSG_RESULT(no)
4751                                 AC_MSG_ERROR(Unable to determine size_t among unsigned long, int, __int64, long long)
4752                         ] )
4753                 ] )
4754         ] )
4755 ] )
4757 AC_LANG_POP
4759 # If size_t/ptrdiff_t is correct, use it. Otherwise C99 [u]intptr_t.
4760 # This provides for an exact match with functions that
4761 # take size_t like malloc and pthread_attr_getstacksize, avoiding warnings.
4762 # uintptr_t is not necessarily the same.
4764 # ptrdiff_t is preferred over ssize_t as it is C89 vs. new Posix.
4765 # ssize_t looks nicer but ptrdiff_t is wrapped up as gssize anyway.
4767 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_size_t; then
4768    GSIZE="size_t"
4769    GSSIZE="ptrdiff_t"
4770 else
4771    GSIZE="uintptr_t"
4772    GSSIZE="intptr_t"
4775 AC_SUBST(GSIZE)
4776 AC_SUBST(GSSIZE)
4777 AC_SUBST(GSIZE_FORMAT)
4780 # END OF EGLIB CHECKS
4783 AC_ARG_WITH([libgdiplus],
4784         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
4785         [], [with_libgdiplus=installed])
4787 # default install location
4788 libgdiplus_install_loc=libgdiplus${libsuffix}
4789 case "$host" in
4790     *-*-*linux*)
4791     libgdiplus_install_loc=libgdiplus${libsuffix}.0
4792     ;;
4793 esac
4795 case $with_libgdiplus in
4796     no)
4797     libgdiplus_loc=
4798     ;;
4800     installed)
4801     libgdiplus_loc=
4802     if test x$cross_compiling = xno; then
4803         if test x$host_darwin = xyes; then
4804             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
4805             if test -x $a; then
4806               libgdiplus_install_loc=$a
4807               libgdiplus_loc=$a
4808             fi
4809         fi
4810     fi
4811     ;;
4813     yes|sibling)
4814     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
4815     ;;
4817     /*) # absolute path, assume it is an install location
4818     libgdiplus_loc=$with_libgdiplus
4819     libgdiplus_install_loc=$with_libgdiplus
4820     ;;
4822     *)
4823     libgdiplus_loc=`pwd`/$with_libgdiplus
4824     ;;
4825 esac
4826 AC_SUBST(libgdiplus_loc)
4827 AC_SUBST(libgdiplus_install_loc)
4829 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)
4830 if test "x$icall_symbol_map" = "xyes"; then
4831    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
4834 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
4835 if test "x$icall_export" = "xyes"; then
4836    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
4839 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
4840 if test "x$icall_tables" = "xno"; then
4841    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
4844 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
4846 if test "x$with_tls" = "x__thread"; then
4847         AC_DEFINE(MONO_KEYWORD_THREAD, __thread, [Have __thread keyword])
4848         # Pass the information to libgc
4849         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
4850         AC_MSG_CHECKING(if the tls_model attribute is supported)
4851         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
4852                 ], [
4853                         AC_MSG_RESULT(yes)
4854                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
4855                 ], [
4856                         AC_MSG_RESULT(no)
4857         ])
4860 if test ${TARGET} = ARM; then
4861         dnl ******************************************
4862         dnl *** Check to see what FPU is available ***
4863         dnl ******************************************
4864         AC_MSG_CHECKING(which FPU to use)
4866         #
4867         # This is a bit tricky:
4868         #
4869         # if (__ARM_PCS_VFP) {
4870         #       /* mfloat-abi=hard == VFP with hard ABI */
4871         # } elif (!__SOFTFP__) {
4872         #       /* mfloat-abi=softfp == VFP with soft ABI */
4873         # } else {
4874         #       /* mfloat-abi=soft == no VFP */
4875         # }
4876         #
4877         # The exception is iOS (w/ GCC) where none of the above
4878         # are defined (but iOS always uses the 'softfp' ABI).
4879         #
4880         # No support for FPA.
4881         #
4883         fpu=NONE
4885         # iOS GCC always uses the 'softfp' ABI.
4886         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
4887                 fpu=VFP
4888         fi
4890         # Are we using the 'hard' ABI?
4891         if test x$fpu = xNONE; then
4892                 AC_TRY_COMPILE([], [
4893                         #ifndef __ARM_PCS_VFP
4894                         #error "Float ABI is not 'hard'"
4895                         #endif
4896                 ], [
4897                         fpu=VFP_HARD
4898                 ], [
4899                         fpu=NONE
4900                 ])
4901         fi
4903         # No 'hard' ABI. 'soft' or 'softfp'?
4904         if test x$fpu = xNONE; then
4905                 AC_TRY_COMPILE([], [
4906                         #ifdef __SOFTFP__
4907                         #error "Float ABI is not 'softfp'"
4908                         #endif
4909                 ], [
4910                         fpu=VFP
4911                 ], [
4912                         fpu=NONE
4913                 ])
4914         fi
4916         if test x$arm_fpu != x; then
4917            fpu=$arm_fpu
4918         fi
4920         AC_MSG_RESULT($fpu)
4921         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
4922         unset fpu
4924         dnl *********************************************
4925         dnl *** Check which ARM version(s) we can use ***
4926         dnl *********************************************
4927         AC_MSG_CHECKING(which ARM version to use)
4929         AC_TRY_COMPILE([], [
4930                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
4931                 #error Not on ARM v5.
4932                 #endif
4933         ], [
4934                 arm_v5=yes
4936                 arm_ver=ARMv5
4937         ], [])
4939         AC_TRY_COMPILE([], [
4940                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
4941                 #error Not on ARM v6.
4942                 #endif
4943         ], [
4944                 arm_v5=yes
4945                 arm_v6=yes
4947                 arm_ver=ARMv6
4948         ], [])
4950         AC_TRY_COMPILE([], [
4951                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
4952                 #error Not on ARM v7.
4953                 #endif
4954         ], [
4955                 arm_v5=yes
4956                 arm_v6=yes
4957                 arm_v7=yes
4959                 arm_ver=ARMv7
4960         ], [])
4962         AC_MSG_RESULT($arm_ver)
4964         if test x$arm_v5 = xyes; then
4965                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
4966                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
4967         fi
4969         if test x$arm_v6 = xyes; then
4970                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
4971                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
4972         fi
4974         if test x$arm_v7 = xyes; then
4975                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
4976                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
4977         fi
4980 if test ${TARGET} = RISCV32 -o ${TARGET} = RISCV64; then
4981         AC_ARG_WITH([riscv-fpabi], [  --with-riscv-fpabi=auto,double,soft   Select RISC-V floating point ABI (auto)], [fpabi=$withval], [fpabi=double])
4983         AC_MSG_CHECKING([which RISC-V floating point ABI to use])
4985         if test x$fpabi = xauto; then
4986                 AC_TRY_COMPILE([], [
4987                         #ifdef __riscv_float_abi_double
4988                         #error "double"
4989                         #endif
4990                 ], [
4991                 ], [
4992                         fpabi=double
4993                 ])
4994         fi
4996         if test x$fpabi = xauto; then
4997                 AC_TRY_COMPILE([], [
4998                         #ifdef __riscv_float_abi_single
4999                         #error "single"
5000                         #endif
5001                 ], [
5002                 ], [
5003                         fpabi=single
5004                 ])
5005         fi
5007         if test x$fpabi = xauto; then
5008                 AC_TRY_COMPILE([], [
5009                         #ifdef __riscv_float_abi_soft
5010                         #error "soft"
5011                         #endif
5012                 ], [
5013                 ], [
5014                         fpabi=soft
5015                 ])
5016         fi
5018         case $fpabi in
5019         double)
5020                 AC_DEFINE([RISCV_FPABI_DOUBLE], [1], [RISC-V FPABI is double-precision])
5021                 AC_MSG_RESULT([double-precision])
5022                 ;;
5023         single)
5024                 AC_DEFINE([RISCV_FPABI_SINGLE], [1], [RISC-V FPABI is single-precision])
5025                 AC_MSG_ERROR([single-precision, not supported])
5026                 ;;
5027         soft)
5028                 AC_DEFINE([RISCV_FPABI_SOFT], [1], [RISC-V FPABI is soft float])
5029                 AC_MSG_RESULT([soft float])
5030                 ;;
5031         auto)
5032                 AC_MSG_ERROR([unknown])
5033                 ;;
5034         *)
5035                 AC_MSG_ERROR([invalid option: $fpabi])
5036                 ;;
5037         esac
5040 if test ${TARGET} = unknown; then
5041         CPPFLAGS="$CPPFLAGS -DNO_PORT"
5042         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
5045 if test "x$platform_android" = "xyes"; then
5046         case "x${TARGET}" in
5047         xARM)
5048                 case "x$arm_ver" in
5049                 xARMv5)
5050                         BTLS_SUPPORTED=yes
5051                         BTLS_PLATFORM=android-armv5
5052                         ;;
5053                 xARMv6)
5054                         BTLS_SUPPORTED=yes
5055                         BTLS_PLATFORM=android-armv6
5056                         ;;
5057                 xARMv7)
5058                         BTLS_SUPPORTED=yes
5059                         BTLS_PLATFORM=android-armv7
5060                         ;;
5061                 *)
5062                         BTLS_SUPPORTED=no
5063                         ;;
5064                 esac
5065                 ;;
5066         xARM64)
5067                 BTLS_SUPPORTED=yes
5068                 BTLS_PLATFORM=android-v8a
5069                 ;;
5070         xX86)
5071                 BTLS_SUPPORTED=yes
5072                 BTLS_PLATFORM=android-x86
5073                 ;;
5074         xAMD64)
5075                 BTLS_SUPPORTED=yes
5076                 BTLS_PLATFORM=android-x64
5077                 ;;
5078         *)
5079                 BTLS_SUPPORTED=no
5080                 ;;
5081         esac
5084 if test ${ACCESS_UNALIGNED} = no; then
5085         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
5088 if test x$host_darwin = xyes; then
5089         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
5090         AS_IF(
5091                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
5092                 [AC_MSG_RESULT([no])],
5093                 [
5094                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
5095                         AR_FLAGS="Scru"
5096                         RANLIB="$RANLIB -no_warning_for_no_symbols"
5097                         AC_MSG_RESULT([yes])
5098                 ]
5099         )
5102 case "x$libgc" in
5103         xincluded)
5104                 # Pass CPPFLAGS to libgc configure
5105                 # We should use a separate variable for this to avoid passing useless and
5106                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
5107                 # This should be executed late so we pick up the final version of CPPFLAGS
5108                 # The problem with this approach, is that during a reconfigure, the main
5109                 # configure scripts gets invoked with these arguments, so we use separate
5110                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
5111                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
5112                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
5113                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
5114                 fi
5115                 # Don't pass -finstrument-for-thread-suspension in, 
5116                 # if these are instrumented it will be very bad news 
5117                 # (infinite recursion, undefined parking behavior, etc)
5118                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
5119                 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\""
5120                 if test "x$support_boehm" = "xyes"; then
5121                         AC_CONFIG_SUBDIRS(libgc)
5122                 fi
5123                 ;;
5124 esac
5126 MALLOC_MEMPOOLS=no
5127 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
5128         if test x$with_malloc_mempools = xyes; then
5129                 MALLOC_MEMPOOLS=yes
5130                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
5131         fi
5135 DISABLE_MCS_DOCS=default
5136 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
5137         if test x$with_mcs_docs != xyes; then
5138                 DISABLE_MCS_DOCS=yes
5139         fi
5141 if test -n "$INSTALL_4_x_TRUE"; then :
5142         DISABLE_MCS_DOCS=yes
5144 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
5145    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
5148 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)],[
5149         if test x$with_lazy_gc_thread_creation != xno ; then
5150                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
5151         fi
5152 ], [with_lazy_gc_thread_creation=no])
5154 dnl *****************************
5155 dnl *** Thread suspend policy ***
5156 dnl *****************************
5158 dnl Set a default hybrid or cooperative suspend on some platforms
5160 dnl Coop default is set by the bitcode preset.
5162 dnl If coop isn't on by default, maybe hybrid should be?
5163 if test x$enable_cooperative_suspend_default != xyes; then
5164         case $HOST in
5165         X86 | AMD64)
5166                 dnl Some host/target confusion, there's no host_osx (and
5167                 dnl host_darwin would be true on iOS not just macOS).
5168                 if test x$target_osx = xyes; then
5169                         enable_hybrid_suspend_default=yes
5170                 elif test x$host_linux = xyes -o x$host_win32 = xyes; then
5171                         enable_hybrid_suspend_default=yes
5172                 fi
5173                 ;;
5174         esac
5177 dnl Now check if there were flags overriding the defaults
5179 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])
5180 AC_ARG_ENABLE(cooperative_suspend, [  --enable-cooperative-suspend      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [], [enable_cooperative_suspend=default])
5182 if test x$enable_cooperative_suspend = xdefault -a x$with_cooperative_gc != xdefault; then
5183         enable_cooperative_suspend=$with_cooperative_gc
5186 if test x$enable_cooperative_suspend = xdefault; then
5187         enable_cooperative_suspend=$enable_cooperative_suspend_default
5190 if test x$enable_cooperative_suspend != xno; then
5191         AC_DEFINE(ENABLE_COOP_SUSPEND,1,[Enable cooperative stop-the-world garbage collection.])
5194 AM_CONDITIONAL([ENABLE_COOP_SUSPEND], [test x$enable_cooperative_suspend != xno])
5196 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])
5198 if test x$enable_hybrid_suspend = xdefault; then
5199    enable_hybrid_suspend=$enable_hybrid_suspend_default
5202 if test x$enable_hybrid_suspend != xno -a x$enable_cooperative_suspend != xno ; then
5203         AC_MSG_ERROR([Hybrid suspend and Cooperative suspend cannot be both enabled.])
5206 if test x$enable_hybrid_suspend != xno ; then
5207         AC_DEFINE(ENABLE_HYBRID_SUSPEND,1,[Enable hybrid suspend for GC stop-the-world])
5210 AM_CONDITIONAL([ENABLE_HYBRID_SUSPEND], [test x$enable_hybrid_suspend != xno])
5212 dnl End of thread suspend policy
5214 dnl ***************************
5215 dnl *** feature experiments ***
5216 dnl ***************************
5218 dnl When adding experiments, also add to mono/utils/mono-experiments.def
5219 AC_ARG_ENABLE(experiment, [ --enable-experiment=LIST       Enable experimental fatures from the comma-separate LIST.  Available experiments: null],[
5221         if test x$enable_experiment != x ; then
5222                 AC_DEFINE(ENABLE_EXPERIMENTS,1,[Enable feature experiments])
5223         fi
5224         for feature in `echo "$enable_experiment" | sed -e "s/,/ /g"`; do
5225                 eval "mono_experiment_test_enable_$feature='yes'"
5226         done
5228         if test "x$mono_experiment_test_enable_all" = "xyes"; then
5229                 eval "mono_experiment_test_enable_null='yes'"
5230                 true
5231         fi
5233         if test "x$mono_experiment_test_enable_null" = "xyes"; then
5234                 AC_DEFINE(ENABLE_EXPERIMENT_null, 1, [Enable experiment 'null'])
5235         fi
5236 ],[])
5238 dnl **********************
5239 dnl *** checked builds ***
5240 dnl **********************
5242 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],[
5244         if test x$enable_checked_build != x ; then
5245                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
5246         fi
5247         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
5248                 eval "mono_checked_build_test_enable_$feature='yes'"
5249         done
5251         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
5252                 eval "mono_checked_build_test_enable_gc='yes'"
5253                 eval "mono_checked_build_test_enable_metadata='yes'"
5254                 eval "mono_checked_build_test_enable_thread='yes'"
5255                 eval "mono_checked_build_test_enable_private_types='yes'"
5256         fi
5258         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
5259                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
5260         fi
5262         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
5263                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
5264         fi
5266         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
5267                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
5268         fi
5270         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
5271                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
5272         fi
5273 ], [])
5275 dnl End of checked builds
5277 AC_CHECK_HEADER([malloc.h], 
5278                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
5279                         [Define to 1 if you have /usr/include/malloc.h.])],,)
5281 if test x"$GCC" = xyes; then
5282         # Implicit function declarations are not 64 bit safe
5283         # Do this late, since this causes lots of configure tests to fail
5284         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
5285         # jay has a lot of implicit declarations
5286         JAY_CFLAGS="-Wno-implicit-function-declaration"
5289 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
5290 # instead of libmono-static.a
5291 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
5292    LIBMONO_LA=libmini-static.la
5293 else
5294    if test x$buildsgen = xyes; then
5295       LIBMONO_LA=libmonosgen-$API_VER.la
5296    else
5297       LIBMONO_LA=libmonoboehm-$API_VER.la
5298    fi
5300 AC_SUBST(LIBMONO_LA)
5302 dnl **************
5303 dnl ***  Btls  ***
5304 dnl **************
5306 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
5307 AC_ARG_ENABLE(btls-lib, [  --disable-btls-lib             Disable building the BTLS native library], enable_btls_lib=$enableval, enable_btls_lib=$BTLS_SUPPORTED)
5308 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
5310 if test "x$enable_btls" = "xno"; then
5311    enable_btls_lib=no
5314 AM_CONDITIONAL(BTLS, test x$enable_btls_lib = xyes)
5316 btls_android=no
5317 if test "x$enable_btls" = "xyes"; then
5318         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
5319         if test "x$CMAKE" = "xno"; then
5320                 AC_MSG_ERROR("cmake not found")
5321         fi
5323         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
5324         AC_SUBST(BTLS_ROOT)
5326         btls_arch=
5327         btls_cflags=
5328         BTLS_CMAKE_ARGS=
5330         if test "x$host_win32" = "xyes"; then
5331                 AC_CHECK_PROG(HAVE_YASM, yasm, yes, no)
5332         fi
5334         case "$BTLS_PLATFORM" in
5335         i386)
5336                 btls_arch=i386
5337                 btls_cflags="-m32"
5338                 case $host_os in
5339                         darwin*)
5340                                 btls_cflags="$btls_cflags -arch i386"
5341                                 ;;
5342                         mingw*|cygwin*)
5343                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5344                                 if test "x$HAVE_YASM" != "xyes"; then
5345                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5346                                 fi
5347                                 ;;
5348                 esac
5349                 ;;
5350         x86_64)
5351                 btls_arch=x86_64
5352                 case $host_os in
5353                         mingw*|cygwin*)
5354                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5355                                 if test "x$HAVE_YASM" != "xyes"; then
5356                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5357                                 fi
5358                                 ;;
5359                 esac
5360                 ;;
5361         arm)
5362                 btls_arch=arm
5363                 btls_cflags="-DOPENSSL_NO_ASM=1"
5364                 ;;
5365         armsoft)
5366                 btls_arch=arm
5367                 btls_cflags="-DOPENSSL_NO_ASM=1"
5368                 ;;
5369         aarch64)
5370                 btls_arch=aarch64
5371                 btls_cflags="-march=armv8-a+crypto"
5372                 ;;
5373         s390x)
5374                 btls_arch=s390x
5375                 ;;
5376         powerpc)
5377                 btls_arch=powerpc
5378                 case $host_os in
5379                         aix*|os400*)
5380                                 btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
5381                                 BTLS_CMAKE_ARGS="-DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
5382                 esac
5383                 ;;
5384         android-armv5)
5385                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
5386                 ;;
5387         android-armv6)
5388                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
5389                 ;;
5390         android-armv7)
5391                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=14"
5392                 ;;
5393         android-v8a)
5394                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=21"
5395                 ;;
5396         android-x86)
5397                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=14"
5398                 ;;
5399         android-x64)
5400                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=21"
5401                 ;;
5402         riscv32)
5403                 btls_arch=riscv32
5404                 ;;
5405         riscv64)
5406                 btls_arch=riscv64
5407                 ;;
5408         *)
5409                 AC_MSG_ERROR(Invalid BTLS platform)
5410         esac
5412         if test "x$platform_android" = "xyes"; then
5413                 btls_android=yes
5414                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
5415                 if test "x$with_btls_android_ndk" != "x"; then
5416                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
5417                 else
5418                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
5419                 fi
5420         fi
5422         if test "x$btls_arch" != "x"; then
5423                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
5424         fi
5426         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
5427         AC_SUBST(BTLS_ARCH)
5428         AC_SUBST(BTLS_CFLAGS)
5429         AC_SUBST(BTLS_PLATFORM)
5430         AC_SUBST(BTLS_CMAKE_ARGS)
5432         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
5433 else
5434         enable_btls=no
5437 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
5439 if test x$DISABLE_MCS_DOCS = xyes; then
5440    docs_dir=""
5441 else
5442    docs_dir=docs
5444 AC_SUBST(docs_dir)
5446 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
5447 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
5448 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
5450 libmono_ldflags="$libmono_ldflags $LIBS"
5452 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
5453 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
5454 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
5455 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
5456 AM_CONDITIONAL(X86, test x$TARGET = xX86)
5457 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
5458 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
5459 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
5460 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
5461 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
5462 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64)
5463 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
5464 AM_CONDITIONAL([RISCV], [test x$TARGET = xRISCV32 -o x$TARGET = xRISCV64])
5465 AM_CONDITIONAL([RISCV32], [test x$TARGET = xRISCV32])
5466 AM_CONDITIONAL([RISCV64], [test x$TARGET = xRISCV64])
5467 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
5468 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
5469 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
5470 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
5471 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
5472 AM_CONDITIONAL([HOST_RISCV], [test x$HOST = xRISCV32 -o x$HOST = xRISCV64])
5473 AM_CONDITIONAL([HOST_RISCV32], [test x$HOST = xRISCV32])
5474 AM_CONDITIONAL([HOST_RISCV64], [test x$HOST = xRISCV64])
5475 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
5477 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
5479 AC_SUBST(LIBC)
5480 AC_SUBST(INTL)
5481 AC_SUBST(SQLITE)
5482 AC_SUBST(SQLITE3)
5483 AC_SUBST(X11)
5484 AC_SUBST(GDKX11)
5485 AC_SUBST(GTKX11)
5486 AC_SUBST(XINERAMA)
5487 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
5488 AC_SUBST(arch_target)
5489 AC_SUBST(CFLAGS)
5490 AC_SUBST(CPPFLAGS)
5491 AC_SUBST(LDFLAGS)
5493 #This must always be defined when building the runtime
5494 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
5496 mono_build_root=`pwd`
5497 AC_SUBST(mono_build_root)
5499 AC_ARG_ENABLE(msvc,[  --enable-msvc    Build with Visual Studio (msvc) (defaults to no)], enable_msvc=$enableval, enable_msvc=no)
5500 if test x$host_win32 = xno; then
5501         if test x$enable_msvc = xyes; then
5502                 echo "Error, --enable-msvc only supported for Windows builds."
5503                 exit 1
5504         fi
5506 AM_CONDITIONAL(ENABLE_MSVC, test x$enable_msvc = xyes)
5508 if test "x$enable_msvc" = "xyes"; then
5509         if test "x$support_boehm" = "xyes"; then
5510                 echo "Error, Boehm GC is not supported when using --enable-msvc."
5511                 exit 1
5512         fi
5513         mono_msvc_build_dir='$(top_srcdir)'/msvc/build/sgen
5514         if test "x$host_cpu" = "xi686"; then
5515                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/Win32/lib/Release
5516                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/Win32/bin/Release
5517                 mono_runtime=msvc/build/sgen/Win32/bin/Release/mono-sgen.exe
5518         else
5519                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/x64/lib/Release
5520                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/x64/bin/Release
5521                 mono_runtime=msvc/build/sgen/x64/bin/Release/mono-sgen.exe
5522         fi
5523         AC_SUBST(mono_msvc_build_dir)
5524         AC_SUBST(mono_msvc_build_lib_dir)
5525         AC_SUBST(mono_msvc_build_bin_dir)
5526 else
5527         mono_runtime=mono/mini/mono
5530 AC_SUBST(mono_runtime)
5532 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/Microsoft.Net.Compilers.2.8.2/tools/csc.exe
5534 if test $csc_compiler = mcs; then
5535   CSC=$mcs_topdir/class/lib/build/mcs.exe
5536 else
5537   CSC=$CSC_LOCATION
5540 AM_CONDITIONAL([CSC_IS_ROSLYN], [test x$csc_compiler != xmcs])
5542 mono_cfg_root=$mono_build_root/runtime
5543 if test x$host_win32 = xyes; then
5544   if test "x$cross_compiling" = "xno"; then
5545     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
5546     CSC=`cygpath -m -a $CSC`
5547     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
5548   else
5549     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
5550   fi
5551 else
5552   mono_cfg_dir=$mono_cfg_root/etc
5554 AC_SUBST(mono_cfg_dir)
5556 AC_SUBST(CSC)
5558 AC_CONFIG_FILES([po/mcs/Makefile.in])
5560 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
5561 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
5563 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
5564 [   depth=../../../..
5565     case $srcdir in
5566     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5567     .) reldir=$depth ;;
5568     *) reldir=$depth/$srcdir ;;
5569     esac
5570     $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
5571     cd runtime/etc/mono/1.0
5572     rm -f machine.config
5573     $LN_S $reldir/data/net_1_1/machine.config machine.config
5574     cd $depth
5575 ],[LN_S='$LN_S'])
5577 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
5578 [   depth=../../../..
5579     case $srcdir in
5580     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5581     .) reldir=$depth ;;
5582     *) reldir=$depth/$srcdir ;;
5583     esac
5584     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5585     cd runtime/etc/mono/2.0
5586     rm -f machine.config
5587     $LN_S $reldir/data/net_2_0/machine.config machine.config
5588     cd $depth
5589 ],[LN_S='$LN_S'])
5591 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
5592 [   depth=../../../..
5593     case $srcdir in
5594     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5595     .) reldir=$depth ;;
5596     *) reldir=$depth/$srcdir ;;
5597     esac
5598     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5599     cd runtime/etc/mono/2.0
5600     rm -f web.config
5601     $LN_S $reldir/data/net_2_0/web.config web.config
5602     cd $depth
5603 ],[LN_S='$LN_S'])
5605 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
5606 [   depth=../../..
5607     case $srcdir in
5608     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5609     .) reldir=$depth ;;
5610     *) reldir=$depth/$srcdir ;;
5611     esac
5612     $ac_aux_dir/install-sh -d runtime/etc/mono/
5613     cd runtime/etc/mono/
5614     rm -f browscap.ini
5615     $LN_S $reldir/data/browscap.ini browscap.ini
5616     cd $depth
5617 ],[LN_S='$LN_S'])
5619 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
5620 [   depth=../../../../..
5621     case $srcdir in
5622     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5623     .) reldir=$depth ;;
5624     *) reldir=$depth/$srcdir ;;
5625     esac
5626     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
5627     cd runtime/etc/mono/2.0/Browsers
5628     rm -f Compat.browser
5629     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5630     cd $depth
5631 ],[LN_S='$LN_S'])
5633 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
5634 [   depth=../../../../..
5635     case $srcdir in
5636     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5637     .) reldir=$depth ;;
5638     *) reldir=$depth/$srcdir ;;
5639     esac
5640     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
5641     cd runtime/etc/mono/4.0/Browsers
5642     rm -f Compat.browser
5643     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5644     cd $depth
5645 ],[LN_S='$LN_S'])
5647 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
5648 [   depth=../../../../..
5649     case $srcdir in
5650     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5651     .) reldir=$depth ;;
5652     *) reldir=$depth/$srcdir ;;
5653     esac
5654     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
5655     cd runtime/etc/mono/4.5/Browsers
5656     rm -f Compat.browser
5657     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5658     cd $depth
5659 ],[LN_S='$LN_S'])
5661 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
5662 [   depth=../../../..
5663     case $srcdir in
5664     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5665     .) reldir=$depth ;;
5666     *) reldir=$depth/$srcdir ;;
5667     esac
5668     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5669     cd runtime/etc/mono/4.0
5670     rm -f machine.config
5671     $LN_S $reldir/data/net_4_0/machine.config machine.config
5672     cd $depth
5673 ],[LN_S='$LN_S'])
5675 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
5676 [   depth=../../../..
5677     case $srcdir in
5678     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5679     .) reldir=$depth ;;
5680     *) reldir=$depth/$srcdir ;;
5681     esac
5682     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5683     cd runtime/etc/mono/4.0
5684     rm -f web.config
5685     $LN_S $reldir/data/net_4_0/web.config web.config
5686     cd $depth
5687 ],[LN_S='$LN_S'])
5689 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
5690 [   depth=../../../..
5691     case $srcdir in
5692     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5693     .) reldir=$depth ;;
5694     *) reldir=$depth/$srcdir ;;
5695     esac
5696     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5697     cd runtime/etc/mono/4.5
5698     rm -f machine.config
5699     $LN_S $reldir/data/net_4_5/machine.config machine.config
5700     cd $depth
5701 ],[LN_S='$LN_S'])
5703 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
5704 [   depth=../../../..
5705     case $srcdir in
5706     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5707     .) reldir=$depth ;;
5708     *) reldir=$depth/$srcdir ;;
5709     esac
5710     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5711     cd runtime/etc/mono/4.5
5712     rm -f web.config
5713     $LN_S $reldir/data/net_4_5/web.config web.config
5714     cd $depth
5715 ],[LN_S='$LN_S'])
5717 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])
5718 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])
5719 AC_CONFIG_COMMANDS([clean-llvm], [rm -f llvm/llvm_config.mk])
5721 # Anything involving -Werror must be done late because autoconf depends on compiling with warnings to be success.
5722 if test x"$GCC" = xyes; then
5724         # incompatible-pointer-types requires gcc circa 5.x
5726         ORIG_CFLAGS=$CFLAGS
5727         CFLAGS="$CFLAGS -Wincompatible-pointer-types -Werror"
5728         AC_MSG_CHECKING(for -Wincompatible-pointer-types option to gcc)
5729         AC_TRY_COMPILE([],[
5730         ], [
5731                 AC_MSG_RESULT(yes)
5732                 CFLAGS="$ORIG_CFLAGS -Werror=incompatible-pointer-types"
5733         ], [
5734                 AC_MSG_RESULT(no)
5735                 CFLAGS=$ORIG_CFLAGS
5736         ])
5740 # Mono.Native Support
5741 # -------------------
5742 # Mono.Native is the new name for both System.Native and System.Security.Cryptography.Apple.
5743 # It is built as a stand-alone shared library and not bundled with the runtime because we
5744 # may need to build two different versions of it.
5746 # Starting with macOS 10.12+ and iOS 10+, Apple introduced a new Unified API for some of the
5747 # crypto primitives that we're using as part of System.Security.Cryptography.Apple.
5749 # On Desktop, we can check at runtime whether the OS version is recent enough and switch
5750 # implementation accordingly.  We build a single `libmono_native` shared library.
5752 # However, on Mobile we cannot have any undefined symbols as this would break Bitcode.
5754 # During the mobile build, we are called with `CC` containing an explicit minium version flag,
5755 # which is eiter `-mmacosx-version-min=`, `-mios-simulator-version-min=` or `-miphoneos-version-min=`
5756 # depending on platform.
5758 # We build two versions of the shared library:
5759 # - `libmono_native_compat` is built with whichever minimum version is passed to us via `CC`.
5760 # - `libmono_native_unifed` is built with the minimum version set to macOS 10.12+ / iOS 10+.
5762 # For testing purpuses, there is a function called `mono_native_get_platform_type ()`
5763 # (see mono/native/mono-native-platform.c), which returns a `MonoNativePlatformType` enum value.
5764 # There is also `Mono.MonoNativePlatform.GetPlatformType ()` (see mcs/class/System/Mono/MonoNativePlatform.cs).
5766 # This can be called by automated tests both to ensure that the library has been correctly installed and also
5767 # to verify that it's the correct version of it.
5770 sed_version_pattern='[[0-9]]\{1,2\}\(\.[[0-9]]\{1,2\}\)'
5771 if test x$target_osx = xyes; then
5772         sed_remove_mac_version_pattern="s/-mmacosx-version-min=$sed_version_pattern//g"
5773         grep_find_mac_version_pattern="-mmacosx-version-min=$sed_version_pattern"
5774         mono_native_compat_version=`echo $CC | grep -o -e $grep_find_mac_version_pattern`
5775         MONO_NATIVE_CC=`echo $CC | sed -e $sed_remove_mac_version_pattern`
5776         MONO_NATIVE_CXX=`echo $CXX | sed -e $sed_remove_mac_version_pattern`
5777         MONO_NATIVE_CPPFLAGS=`echo $CPPFLAGS | sed -e $sed_remove_mac_version_pattern`
5778         MONO_NATIVE_CFLAGS=`echo $CFLAGS | sed -e $sed_remove_mac_version_pattern`
5779         MONO_NATIVE_CXXFLAGS=`echo $CXXFLAGS | sed -e $sed_remove_mac_version_pattern`
5780         MONO_NATIVE_LDFLAGS=`echo $LDFLAGS | sed -e $sed_remove_mac_version_pattern`
5782         mono_native=yes
5783         MONO_NATIVE_PLATFORM=macos
5784         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_MACOS"
5785         AC_MSG_CHECKING([Mono.Native support])
5786         AC_MSG_RESULT(macos)
5788         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer],
5789                 [!(MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12)])
5791         if test x$mono_native_compat = xyes; then
5792                 mono_native_compat=yes
5793                 mono_native_text="Mac OSX (compat+unified)"
5794                 MONO_NATIVE_COMPAT_CFLAGS="$CFLAGS $mono_native_compat_version"
5795                 MONO_NATIVE_COMPAT_LDFLAGS="$LDFLAGS $mono_native_compat_version"
5796                 MONO_NATIVE_UNIFIED_CFLAGS="$MONO_NATIVE_CFLAGS -mmacosx-version-min=10.12"
5797                 MONO_NATIVE_UNIFIED_LDFLAGS="$MONO_NATIVE_LDFLAGS -mmacosx-version-min=10.12"
5798         else
5799                 mono_native_compat=no
5800                 mono_native_text="Mac OSX"
5801         fi
5802 elif test x$mono_native_platform_ios = xyes; then
5803         AC_MONO_APPLE_TARGET(TARGET_OS_SIMULATOR, [mono_native_ios_sim=yes], [mono_native_ios_sim=no])
5805         AC_MONO_APPLE_TARGET(TARGET_OS_IOS, [
5806                 if test x$mono_native_ios_sim = xyes; then
5807                         mono_native_ios_target=ios-simulator
5808                         mono_native_text="iOS Simulator"
5809                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5810                 else
5811                         mono_native_ios_target=iphoneos
5812                         mono_native_text="iOS Device"
5813                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5814                 fi
5815                 mono_native_unified_version="10.0"
5816                 mono_native_compat_check="__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_10_0"
5817         ], [
5818                 AC_MONO_APPLE_TARGET(TARGET_OS_TV, [
5819                         if test x$mono_native_ios_sim = xyes; then
5820                                 mono_native_ios_target=tvos-simulator
5821                                 mono_native_text="AppleTV Simulator"
5822                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5823                         else
5824                                 mono_native_ios_target=tvos
5825                                 mono_native_text="AppleTV Device"
5826                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5827                         fi
5828                         mono_native_unified_version="10.0"
5829                         mono_native_compat_check="__TV_OS_VERSION_MIN_REQUIRED >= __TVOS_10_0"
5830                 ], [
5831                         AC_MONO_APPLE_TARGET(TARGET_OS_WATCH, [
5832                                 if test x$mono_native_ios_sim = xyes; then
5833                                         mono_native_ios_target=watchos-simulator
5834                                         mono_native_text="Apple Watch Simulator"
5835                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5836                                 else
5837                                         mono_native_ios_target=watchos
5838                                         mono_native_text="Apple Watch Device"
5839                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5840                                 fi
5841                                 mono_native_unified_version="5.0"
5842                                 mono_native_compat_check="__WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_5_0"
5843                         ], [
5844                                 AC_MSG_ERROR([Unknown iOS Target])
5845                         ])
5846                 ])
5847         ])
5849         AC_MSG_CHECKING([Mono.Native support])
5850         AC_MSG_RESULT([$mono_native_ios_target])
5852         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer], [!($mono_native_compat_check)])
5854         sed_remove_ios_version_pattern="s/-m\(.*\)-version-min=$sed_version_pattern//g"
5855         grep_find_ios_version_pattern="-m$mono_native_ios_target-version-min=$sed_version_pattern"
5857         mono_native_compat_version=`echo $CC | grep -o -e $grep_find_ios_version_pattern`
5859         if test x$with_bitcode = xyes; then
5860                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -no-undefined -fatal_warnings"
5861                 MONO_NATIVE_LIBADD="../mini/$LIBMONO_LA"
5862         else
5863                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -fatal_warnings"
5864         fi
5866         if test x$enable_gss = xyes; then
5867                 mono_native_ldflags="$mono_native_ldflags -framework GSS"
5868         fi
5870         MONO_NATIVE_CC=`echo $CC | sed -e $sed_remove_ios_version_pattern`
5871         MONO_NATIVE_CXX=`echo $CXX | sed -e $sed_remove_ios_version_pattern`
5872         MONO_NATIVE_CPPFLAGS=`echo $CPPFLAGS | sed -e $sed_remove_ios_version_pattern`
5873         MONO_NATIVE_CXXFLAGS=`echo $CXXFLAGS | sed -e $sed_remove_ios_version_pattern`
5874         MONO_NATIVE_CFLAGS=`echo $CFLAGS | sed -e $sed_remove_ios_version_pattern`
5875         MONO_NATIVE_LDFLAGS=`echo $LDFLAGS $mono_native_ldflags | sed -e $sed_remove_ios_version_pattern`
5877         if test x$mono_native_compat = xyes; then
5878                 mono_native_text="$mono_native_text (compat+unified)"
5879                 MONO_NATIVE_COMPAT_CFLAGS="$CFLAGS $mono_native_compat_version"
5880                 MONO_NATIVE_COMPAT_LDFLAGS="$LDFLAGS $mono_native_compat_version"
5881                 MONO_NATIVE_UNIFIED_CFLAGS="$MONO_NATIVE_CFLAGS -m$mono_native_ios_target-version-min=$mono_native_unified_version"
5882                 MONO_NATIVE_UNIFIED_LDFLAGS="$MONO_NATIVE_LDFLAGS -m$mono_native_ios_target-version-min=$mono_native_unified_version"
5883         fi
5885         mono_native=yes
5886         MONO_NATIVE_PLATFORM=ios
5887 elif test x$host_linux = xyes; then
5888         mono_native_text="Linux"
5889         MONO_NATIVE_CC=$CC
5890         MONO_NATIVE_CXX=$CXX
5891         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
5892         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
5893         MONO_NATIVE_CFLAGS=$CFLAGS
5894         MONO_NATIVE_LDFLAGS=$LDFLAGS
5896         mono_native=yes
5897         mono_native_compat=no
5898         MONO_NATIVE_PLATFORM=linux
5899         AC_MSG_CHECKING([Mono.Native support])
5900         AC_MSG_RESULT(linux)
5902         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
5903 else
5904         mono_native=no
5905         mono_native_text="no"
5906         AC_MSG_CHECKING([Mono.Native support])
5907         AC_MSG_RESULT(no)
5910 if test x$mono_native_compat = xyes; then
5911         MONO_NATIVE_LIBRARY_NAME=libmono-native-compat
5912 else
5913         MONO_NATIVE_LIBRARY_NAME=libmono-native
5916 AC_SUBST(MONO_NATIVE_PLATFORM)
5917 AC_SUBST(MONO_NATIVE_CC)
5918 AC_SUBST(MONO_NATIVE_CXX)
5919 AC_SUBST(MONO_NATIVE_CPPFLAGS)
5920 AC_SUBST(MONO_NATIVE_CXXFLAGS)
5921 AC_SUBST(MONO_NATIVE_CFLAGS)
5922 AC_SUBST(MONO_NATIVE_COMPAT_CFLAGS)
5923 AC_SUBST(MONO_NATIVE_UNIFIED_CFLAGS)
5924 AC_SUBST(MONO_NATIVE_LDFLAGS)
5925 AC_SUBST(MONO_NATIVE_COMPAT_LDFLAGS)
5926 AC_SUBST(MONO_NATIVE_UNIFIED_LDFLAGS)
5927 AC_SUBST(MONO_NATIVE_LIBRARY_NAME)
5928 AC_SUBST(MONO_NATIVE_LIBADD)
5930 AM_CONDITIONAL(MONO_NATIVE, test x$mono_native = xyes)
5931 AM_CONDITIONAL(MONO_NATIVE_COMPAT, test x$mono_native_compat = xyes)
5932 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_MACOS, test x$MONO_NATIVE_PLATFORM = xmacos)
5933 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_IOS, test x$MONO_NATIVE_PLATFORM = xios)
5934 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_LINUX, test x$MONO_NATIVE_PLATFORM = xlinux)
5936 MONO_NATIVE_PLATFORM_TYPE_COMPAT="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_COMPAT"
5937 MONO_NATIVE_PLATFORM_TYPE_UNIFIED="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_UNIFIED"
5938 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE)
5939 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_COMPAT)
5940 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_UNIFIED)
5942 # Update all submodules recursively to ensure everything is checked out
5943 (cd $srcdir && scripts/update_submodules.sh)
5945 AC_OUTPUT([
5946 Makefile
5947 mono-uninstalled.pc
5948 acceptance-tests/Makefile
5949 llvm/Makefile
5950 scripts/mono-find-provides
5951 scripts/mono-find-requires
5952 mk/Makefile
5953 mono/Makefile
5954 mono/btls/Makefile
5955 mono/native/Makefile
5956 mono/utils/Makefile
5957 mono/utils/jemalloc/Makefile
5958 mono/metadata/Makefile
5959 mono/dis/Makefile
5960 mono/cil/Makefile
5961 mono/arch/Makefile
5962 mono/arch/x86/Makefile
5963 mono/arch/amd64/Makefile
5964 mono/arch/ppc/Makefile
5965 mono/arch/sparc/Makefile
5966 mono/arch/s390x/Makefile
5967 mono/arch/arm/Makefile
5968 mono/arch/arm64/Makefile
5969 mono/arch/mips/Makefile
5970 mono/arch/riscv/Makefile
5971 mono/sgen/Makefile
5972 mono/native/platform-type.c
5973 mono/native/platform-type-compat.c
5974 mono/native/platform-type-unified.c
5975 mono/tests/Makefile
5976 mono/tests/assembly-load-reference/Makefile
5977 mono/tests/tests-config
5978 mono/tests/gc-descriptors/Makefile
5979 mono/tests/testing_gac/Makefile
5980 mono/unit-tests/Makefile
5981 mono/benchmark/Makefile
5982 mono/mini/Makefile
5983 mono/profiler/Makefile
5984 mono/eglib/Makefile
5985 mono/eglib/eglib-config.h
5986 mono/eglib/test/Makefile
5987 m4/Makefile
5988 ikvm-native/Makefile
5989 scripts/Makefile
5990 man/Makefile
5991 docs/Makefile
5992 data/Makefile
5993 data/net_2_0/Makefile
5994 data/net_4_0/Makefile
5995 data/net_4_5/Makefile
5996 data/net_2_0/Browsers/Makefile
5997 data/net_4_0/Browsers/Makefile
5998 data/net_4_5/Browsers/Makefile
5999 data/mint.pc
6000 data/mono-2.pc
6001 data/monosgen-2.pc
6002 data/mono.pc
6003 data/mono-cairo.pc
6004 data/mono-nunit.pc
6005 data/mono-options.pc
6006 data/mono-lineeditor.pc
6007 data/monodoc.pc
6008 data/dotnet.pc
6009 data/dotnet35.pc
6010 data/wcf.pc
6011 data/cecil.pc
6012 data/system.web.extensions_1.0.pc
6013 data/system.web.extensions.design_1.0.pc
6014 data/system.web.mvc.pc
6015 data/system.web.mvc2.pc
6016 data/system.web.mvc3.pc
6017 data/aspnetwebstack.pc
6018 data/reactive.pc
6019 samples/Makefile
6020 support/Makefile
6021 data/config
6022 tools/Makefile
6023 tools/locale-builder/Makefile
6024 tools/sgen/Makefile
6025 tools/monograph/Makefile
6026 tools/pedump/Makefile
6027 runtime/Makefile
6028 msvc/Makefile
6029 po/Makefile
6032 if test x$host_win32 = xyes; then
6033    # Get rid of 'cyg' prefixes in library names
6034    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6035    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
6036    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
6037    # executable doesn't work...
6038    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6041 if test x$host_darwin = xyes; then
6042    # This doesn't seem to be required and it slows down parallel builds
6043    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
6047   case $prefix in
6048   NONE) prefix=$ac_default_prefix ;;
6049   esac
6050   case $exec_prefix in
6051   NONE) exec_prefix='${prefix}' ;;
6052   esac
6054   #
6055   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
6056   # any existing config.make.  This allows people to share the same source tree
6057   # with different build directories, one native and one cross
6058   #
6059   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
6061     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
6063     echo "prefix=$prefix" > $mcs_topdir/build/config.make
6064     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
6065     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
6066     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
6067     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
6068     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
6069     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
6070     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
6071     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
6073     case $INSTALL in
6074     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
6075     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
6076     esac
6078     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
6080     export VERSION
6081     [myver=$($AWK 'BEGIN {
6082       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
6083       if(length(vsplit [1]) > 4) {
6084         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
6085       }
6086       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
6087     }')]
6089     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
6090     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
6092     if test x$host_darwin = xyes; then
6093       echo "BUILD_PLATFORM = macos" >> $mcs_topdir/build/config.make
6094       echo "HOST_PLATFORM ?= macos" >> $mcs_topdir/build/config.make
6095       echo "XTEST_PLATFORM ?= osx" >> $mcs_topdir/build/config.make
6096     elif test x$host_win32 = xyes; then
6097       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
6098       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
6099       echo "XTEST_PLATFORM ?= windows" >> $mcs_topdir/build/config.make
6100     elif test x$host_linux = xyes; then
6101       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
6102       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6103       echo "XTEST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6104     else
6105       echo "BUILD_PLATFORM = unix" >> $mcs_topdir/build/config.make
6106       echo "HOST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6107       echo "XTEST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6108     fi
6110     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
6111       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
6112     fi
6114         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
6115            enable_system_aot=yes
6116         fi
6118     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
6119       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
6120     fi
6122     if test x$DISABLE_MCS_DOCS = xyes; then
6123       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
6124     fi
6126     if test x$has_extension_module != xno; then
6127         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
6128     fi
6129     
6130     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
6131     
6132     if test "x$test_bcl_opt" = "xyes"; then    
6133       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
6134     fi
6136     echo "CSC_LOCATION = $CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
6138     if test $csc_compiler = mcs; then
6139       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
6140     fi
6142     if test "x$AOT_BUILD_FLAGS" != "x" ; then
6143       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
6144       echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
6145       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
6146     fi
6148     if test "x$AOT_MODE" != "x" ; then
6149       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
6150     fi
6152     if test "x$enable_btls" = "xyes"; then
6153       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
6154     fi
6156     if test "x$mono_native" = "xyes"; then
6157       echo "MONO_NATIVE_SUPPORTED=true" >> $srcdir/$mcsdir/build/config.make
6158     else
6159       echo "MONO_NATIVE_SUPPORTED=false" >> $srcdir/$mcsdir/build/config.make
6160     fi
6162     if test x$mono_native_compat = xyes; then
6163       echo "MONO_NATIVE_USING_COMPAT=true" >> $srcdir/$mcsdir/build/config.make
6164     else
6165       echo "MONO_NATIVE_USING_COMPAT=false" >> $srcdir/$mcsdir/build/config.make
6166     fi
6168     echo "MONO_NATIVE_PLATFORM_TYPE=$MONO_NATIVE_PLATFORM_TYPE" >> $srcdir/$mcsdir/build/config.make
6169     echo "MONO_NATIVE_PLATFORM=$MONO_NATIVE_PLATFORM" >> $srcdir/$mcsdir/build/config.make
6171   fi
6175 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
6177 btls_platform_string=
6178 if test x$enable_btls = xyes; then
6179         if test x$btls_android = xyes; then
6180                 btls_platform_string=" (android:$BTLS_PLATFORM)"
6181         else
6182                 btls_platform_string=" ($BTLS_PLATFORM)"
6183         fi
6186 thread_suspend_msg=
6187 if test x$buildsgen = xyes; then
6188         if test x$enable_cooperative_suspend != xno; then
6189                 thread_suspend_msg="Suspend:       Cooperative"
6190         elif test x$enable_hybrid_suspend != xno; then
6191                 thread_suspend_msg="Suspend:       Hybrid"
6192         else
6193                 thread_suspend_msg="Suspend:       Preemptive"
6194         fi
6196         
6197 echo "
6198         mcs source:    $mcsdir
6199         C# Compiler:   $csc_compiler
6201    Engine:
6202         Host:          $host
6203         Target:        $target
6204         GC:            $gc_msg 
6205         $thread_suspend_msg
6206         TLS:           $with_tls
6207         SIGALTSTACK:   $with_sigaltstack
6208         Engine:        $jit_status
6209         BigArrays:     $enable_big_arrays
6210         DTrace:        $enable_dtrace
6211         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm, built in-tree: $internal_llvm, assertions: $enable_llvm_asserts)
6212         Spectre:       $spectre_mitigation_status
6213         Mono.Native:   $mono_native_text
6215    Libraries:
6216         .NET 4.x:        $with_profile4_x
6217         Xamarin.Android: $with_monodroid
6218         Xamarin.iOS:     $with_monotouch
6219         Xamarin.WatchOS: $with_monotouch_watch
6220         Xamarin.TVOS:    $with_monotouch_tv
6221         Xamarin.Mac:     $with_xammac
6222         Windows AOT:     $with_winaot
6223         Orbis:           $with_orbis
6224         Unreal:          $with_unreal
6225         WebAssembly:     $with_wasm
6226         Test profiles:   AOT Full ($with_testing_aot_full), AOT Hybrid ($with_testing_aot_hybrid)
6227         JNI support:     $jdk_headers_found
6228         libgdiplus:      $libgdiplus_msg
6229         zlib:            $zlib_msg
6230         BTLS:            $enable_btls$btls_platform_string
6231         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
6232         crash reporting: $crash_reporting (private crashes: $with_crash_privacy)
6233         $disabled
6235 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
6236    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)