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