[signcode.exe] Allow use of new hash algorithm (#11999)
[mono-project.git] / configure.ac
blob5e39fb5986eec506f91f71b531932285e9016e66
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=e686c1dd-3c2a-4dc9-b12e-ff0d524d6e6b
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 ## PLATFORM_AOT_SUFFIX not so simple for windows :-)
481 AC_CHECK_TOOL(CC, gcc, gcc)
482 AC_PROG_CC
483 AC_CHECK_TOOL(CXX, g++, g++)
484 AC_PROG_CXX
485 AM_PROG_AS
486 AC_PROG_INSTALL
487 AC_PROG_AWK
488 AM_PROG_CC_C_O
489 dnl We should use AM_PROG_AS, but it's not available on automake/aclocal 1.4
490 : ${CCAS='$(CC)'}
491 # Set ASFLAGS if not already set.
492 : ${CCASFLAGS='$(CFLAGS)'}
493 AC_SUBST(CCAS)
494 AC_SUBST(CCASFLAGS)
496 # AC_PROG_CXX helpfully sets CXX to g++ even if no c++ compiler is found so check
497 # GXX instead. See http://lists.gnu.org/archive/html/bug-autoconf/2002-04/msg00056.html
498 if test "x$CXX" = "xg++"; then
499         if test "x$GXX" != "xyes"; then
500                 # automake/libtool is so broken, it requires g++ even if the c++ sources
501                 # are inside automake conditionals
502                 AC_MSG_ERROR([You need to install g++])
503         fi
506 dnl may require a specific autoconf version
507 dnl AC_PROG_CC_FOR_BUILD
508 dnl CC_FOR_BUILD not automatically detected
509 CC_FOR_BUILD=$CC
510 CFLAGS_FOR_BUILD=$CFLAGS
511 BUILD_EXEEXT=
512 if test "x$cross_compiling" = "xyes"; then
513         CC_FOR_BUILD=cc
514         CFLAGS_FOR_BUILD=
515         BUILD_EXEEXT=""
517 AC_SUBST(CC_FOR_BUILD)
518 AC_SUBST(CFLAGS_FOR_BUILD)
519 AC_SUBST(HOST_CC)
520 AC_SUBST(BUILD_EXEEXT)
522 AM_CONDITIONAL(CROSS_COMPILING, [test x$cross_compiling = xyes])
523 AM_CONDITIONAL(USE_BATCH_FILES, [test x$host_win32 = xyes -a x$cross_compiling = xyes])
525 # Set STDC_HEADERS
526 AC_HEADER_STDC
527 AC_LIBTOOL_WIN32_DLL
528 # This causes monodis to not link correctly
529 #AC_DISABLE_FAST_INSTALL
531 #lookup makedev() header
532 AC_HEADER_MAJOR
534 AM_PROG_LIBTOOL
535 # Use dolt (http://dolt.freedesktop.org/) instead of libtool for building.
536 DOLT
538 export_ldflags=`(./libtool --config; echo eval echo \\$export_dynamic_flag_spec) | sh`
539 AC_SUBST(export_ldflags)
541 # Test whenever ld supports -version-script
542 AC_PROG_LD
543 AC_PROG_LD_GNU
545 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)
546 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)
547 AC_CHECK_HEADERS([linux/netlink.h linux/rtnetlink.h],
548                   [], [], [#include <stddef.h>
549                   #include <sys/socket.h>
550                   #include <linux/socket.h>])
552 AC_CHECK_HEADERS(sys/user.h, [], [],
554 #ifdef HAVE_SYS_PARAM_H
555 # include <sys/param.h>
556 #endif
559 AC_CHECK_HEADERS(linux/serial.h)
561 AC_CHECK_HEADER(zlib.h, [have_zlib=yes], [have_zlib=no])
562 if test x$have_zlib = xyes; then
563    AC_TRY_COMPILE([#include <zlib.h>], [
564    #if defined(ZLIB_VERNUM) && (ZLIB_VERNUM >= 0x1230)
565    #else
566    #error No good zlib found
567    #endif
568    ],[
569         AC_MSG_RESULT(Using system zlib)
570         zlib_msg="system zlib"
571         AC_DEFINE(HAVE_SYS_ZLIB,1,[Have system zlib])
572    ],[
573         AC_MSG_RESULT(Using embedded zlib)
574         have_zlib=no
575         zlib_msg="bundled zlib"
576    ])
579 AM_CONDITIONAL(HAVE_ZLIB, test x$have_zlib = xyes)
580 AC_DEFINE(HAVE_ZLIB,1,[Have system zlib])
582 # for mono/metadata/debug-symfile.c
583 AC_CHECK_HEADERS(elf.h)
585 # for support
586 AC_CHECK_HEADERS(poll.h)
587 AC_CHECK_HEADERS(sys/poll.h)
588 AC_CHECK_HEADERS(sys/wait.h)
589 AC_CHECK_HEADERS(grp.h)
590 AC_CHECK_HEADERS(syslog.h)
591 AC_CHECK_FUNCS(vsyslog)
593 # for mono/dis
594 AC_CHECK_HEADERS(wchar.h)
596 # for Linux statfs support
597 AC_CHECK_HEADERS(linux/magic.h)
599 # For Android NDK unified headers
600 if test x$platform_android = xyes; then
601         AC_CHECK_HEADERS(machine/endian.h sys/endian.h)
602         AC_CHECK_HEADERS(android/legacy_signal_inlines.h, [have_android_signal_inlines=yes], [have_android_signal_inlines=no])
603         AC_CHECK_HEADERS(android/ndk-version.h)
605         # Make sure SIGRT{MIN,MAX} work - they will fail to work with unified headers if building for
606         # API level < 21 *and* android/legacy_signal_inlines.h doesn't declare (and define) the required
607         # libc APIs to obtain values for SIGRT{MIN,MAX}. We perform the check only if android/legacy_signal_inlines.h
608         # is found because in other cases the macros will either work (for NDK < 14) or fail if the legacy header
609         # doesn't contain the required definitions (NDK 14)
610         if test x$have_android_signal_inlines = xyes; then
611                 AC_MSG_CHECKING([Whether Android SIGRTMIN/SGRTMAX macros are valid])
612                 AC_COMPILE_IFELSE([
613                         AC_LANG_PROGRAM([#include <signal.h>
614                                 #include <android/legacy_signal_inlines.h>],[
615                                 int i;
616                                 for (i = SIGRTMIN + 1; i < SIGRTMAX; ++i) {
617                                 }
618                         ])],[
619                                 AC_MSG_RESULT(yes)
620                                 android_sigrtminmax_work=yes
621                         ],[
622                                 AC_MSG_RESULT(no)
623                                 android_sigrtminmax_work=no
624                         ]
625                 )
627                 if test x$android_sigrtminmax_work = xno; then
628                         AC_MSG_ERROR([Android SIGRTMIN/SIGRTMAX macros don't work in this NDK])
629                 fi
630         fi
632         # Attempt to detect whether we're using Android NDK unified headers
633         AC_CHECK_HEADERS(android/api-level.h, [have_android_api_level=yes], [have_android_api_level=no])
634         AC_CHECK_HEADERS(android/versioning.h, [have_android_versioning=yes], [have_android_versioning=no])
636         android_unified_headers=no
637         if test x$have_android_api_level = xyes; then
638                 if test x$have_android_versioning = xyes; then
639                         AC_MSG_CHECKING([whether using Android NDK unified headers])
641                         # Both macros are defined only in the NDK unified headers
642                         AC_COMPILE_IFELSE([
643                                 AC_LANG_PROGRAM([
644                                         #include <android/api-level.h>
645                                         #include <android/versioning.h>
646                                 ],[
647                                         #if __ANDROID_API_O__ == 26 && defined(__INTRODUCED_IN)
648                                         #else
649                                                 #error __ANDROID_API_O__ != 26 or the __INTRODUCED_IN macro not defined
650                                         #endif
651                                 ])],[
652                                         AC_MSG_RESULT(yes)
653                                         android_unified_headers=yes
654                                 ],[
655                                         AC_MSG_RESULT(no)
656                                         android_unified_headers=no
657                                 ]
658                         )
659                 fi
660         fi
662         if test x$android_unified_headers = xyes; then
663                 AC_DEFINE(ANDROID_UNIFIED_HEADERS, 1, [Whether Android NDK unified headers are used])
664         fi
665 fi # Android
667 # not 64 bit clean in cross-compile
668 AC_CHECK_SIZEOF(void *)
669 AC_CHECK_SIZEOF(long)
671 AC_CHECK_SIZEOF(int)
672 AC_CHECK_SIZEOF(long long)
674 AC_CACHE_CHECK([for clang],
675         mono_cv_clang,[
676         AC_TRY_COMPILE([], [
677                 #ifdef __clang__
678                 #else
679                 #error "FAILED"
680                 #endif
681         ],
682         [mono_cv_clang=yes],
683         [mono_cv_clang=no],
684         [])
687 AC_ARG_ENABLE(visibility-hidden,
688 [  --disable-visibility-hidden    disable usage of -fvisiblity=hidden],
689    disable_visibility_hidden=yes, disable_visibility_hidden=no)
691 WARN=''
692 if test x"$GCC" = xyes; then
693                 WARN='-Wall -Wunused -Wmissing-declarations -Wpointer-arith -Wno-cast-qual -Wwrite-strings -Wno-switch -Wno-switch-enum -Wno-unused-value -Wno-attributes'
694                 CFLAGS="$CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs -Wno-format-zero-length"
696                 # We require C99 with some GNU extensions, e.g. `linux` macro
697                 CFLAGS="$CFLAGS -std=gnu99"
699                 # The runtime code does not respect ANSI C strict aliasing rules
700                 CFLAGS="$CFLAGS -fno-strict-aliasing"
702                 # We rely on signed overflow to behave
703                 CFLAGS="$CFLAGS -fwrapv"
705                 CFLAGS="$CFLAGS -DMONO_DLL_EXPORT"
706                 if test x"$disable_visibility_hidden" = xno; then
707                    # Don't export any symbols by default
708                    SHARED_CFLAGS="-fvisibility=hidden"
709                    CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
710                 fi
712                 ORIG_CFLAGS=$CFLAGS
713                 # Check for the normal version, since gcc ignores unknown -Wno options
714                 CFLAGS="$CFLAGS -Wunused-but-set-variable -Werror"
715                 AC_MSG_CHECKING(for -Wno-unused-but-set-variable option to gcc)
716                 AC_TRY_COMPILE([],[
717                 ], [
718                    AC_MSG_RESULT(yes)
719                    CFLAGS="$ORIG_CFLAGS -Wno-unused-but-set-variable"
720                 ], [
721                    AC_MSG_RESULT(no)
722                    CFLAGS=$ORIG_CFLAGS
723                 ])
725                 if test "x$mono_cv_clang" = "xyes"; then
726                    # https://bugzilla.samba.org/show_bug.cgi?id=8118
727                    WARN="$WARN -Qunused-arguments"
728                    WARN="$WARN -Wno-unused-function -Wno-tautological-compare -Wno-parentheses-equality -Wno-self-assign -Wno-return-stack-address -Wno-constant-logical-operand"
729                    # We rely on zero length arrays in structs
730                    WARN="$WARN -Wno-zero-length-array"
731                 fi
732 else
733         # The Sun Forte compiler complains about inline functions that access static variables
734         # so disable all inlining.
735         case "$host" in
736         *-*-solaris*)
737                 CFLAGS="$CFLAGS -Dinline="
738                 ;;
739         esac
741 CFLAGS="$WARN $CFLAGS -g"
742 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -g"
743 CPPFLAGS="$WARN $CPPFLAGS -g"
745 # Where's the 'mcs' source tree?
746 if test -d $srcdir/mcs; then
747   mcsdir=mcs
748 else
749   mcsdir=../mcs
752 AC_ARG_WITH(mcs-path, [  --with-mcs-path=/path/to/mcs      Specify an alternate mcs source tree],
753         if test x$with_mcs_path != "x" -a -d $with_mcs_path ; then
754                 mcsdir=$with_mcs_path
755         fi
758 AC_ARG_WITH(jumptables, [  --with-jumptables=yes,no      enable/disable support for jumptables (ARM-only for now) (defaults to no)],[],[with_jumptables=no])
760 AC_ARG_WITH(core,       [  --with-core=only       controls whether to build Mono as a .NET Core runtime (defaults to no)],[],[with_core=no])
761 if test x$with_core = xonly; then
762     AC_DEFINE(ENABLE_NETCORE,1,[Enables the support for .NET Core Features in the MonoVM])
763     mono_feature_disable_remoting='yes'
764     mono_feature_disable_reflection_emit_save='yes'
765     mono_feature_disable_appdomains='yes'
767 AM_CONDITIONAL(ENABLE_NETCORE, test x$with_core = xonly)
770 # A sanity check to catch cases where the package was unpacked
771 # with an ancient tar program (Solaris)
773 AC_ARG_ENABLE(solaris-tar-check,
774 [  --disable-solaris-tar-check    disable solaris tar check],
775    do_solaris_tar_check=no, do_solaris_tar_check=yes)
777 if test x"$do_solaris_tar_check" = xyes -a x"$enable_solaris_tar_check" = xyes; then
778         AC_MSG_CHECKING(integrity of package)
779         if test -f $mcsdir/class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapTypeMapper.cs
780         then
781                 AC_MSG_RESULT(ok)
782         else
783                 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"
784                 AC_MSG_ERROR([$errorm])
785         fi
788 if test "x$with_mcs_path" != "x"; then
789 mcs_topdir=$(cd "$mcsdir" && pwd)
790 mcs_topdir_from_srcdir=$mcs_topdir
791 else
792 mcs_topdir=$(cd "$srcdir/$mcsdir" && pwd)
793 mcs_topdir_from_srcdir='$(top_builddir)'/$mcsdir
796 # Convert mcs_topdir* paths to Windows syntax.
797 if test x$cross_compiling$host_win32 = xnoyes; then
798   mcs_topdir=$(cygpath -m $mcs_topdir)
799   case $mcs_topdir_from_srcdir in
800     /cygdrive/*)
801         mcs_topdir_from_srcdir=$(cygpath -m $mcs_topdir_from_srcdir)
802         ;;
803   esac
806 AC_SUBST([mcs_topdir])
807 AC_SUBST([mcs_topdir_from_srcdir])
809 # gettext: prepare the translation directories. 
810 # we do not configure the full gettext, as we consume it dynamically from C#
811 AM_PO_SUBDIRS
813 if test "x$USE_NLS" = "xyes"; then
814    AC_CHECK_PROG(HAVE_MSGFMT, msgfmt,yes,no)
816    if test "x$HAVE_MSGFMT" = "xno"; then
817           AC_MSG_ERROR([msgfmt not found. You need to install the 'gettext' package, or pass --enable-nls=no to configure.])
818    fi
821 AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
823 pkg_config_path=
824 AC_ARG_WITH(crosspkgdir, [  --with-crosspkgdir=/path/to/pkg-config/dir      Change pkg-config dir to custom dir],
825         if test x$with_crosspkgdir = "x"; then
826                 if test -s $PKG_CONFIG_PATH; then
827                         pkg_config_path=$PKG_CONFIG_PATH
828                 fi
829         else
830                 pkg_config_path=$with_crosspkgdir
831                 PKG_CONFIG_PATH=$pkg_config_path
832                 export PKG_CONFIG_PATH
833         fi
836 AC_ARG_ENABLE(ninja,[  --enable-ninja    Enable using ninja where available], enable_ninja=$enableval)
837 AC_CHECK_PROG(HAVE_NINJA, ninja, yes, no)
838 AM_CONDITIONAL(NINJA, test x$enable_ninja = xyes -a x$HAVE_NINJA != xno)
840 AC_ARG_ENABLE(werror, [  --enable-werror Pass -Werror to the C compiler], werror_flag=$enableval, werror_flag=no)
841 if test x$werror_flag = xyes; then
842         WERROR_CFLAGS="-Werror"
844 AC_SUBST([WERROR_CFLAGS])
845 AC_SUBST([SHARED_CFLAGS])
847 GLIB_CFLAGS='-I$(top_srcdir)/mono/eglib -I$(top_builddir)/mono/eglib'
848   
849 AC_SUBST(GLIB_CFLAGS)
851 # Enable support for fast thread-local storage
852 # Some systems have broken support, so we allow to disable it.
853 AC_ARG_WITH(tls, [  --with-tls=__thread,pthread    select Thread Local Storage implementation (defaults to __thread)],[],[with_tls=__thread])
855 # Enable support for using sigaltstack for SIGSEGV and stack overflow handling
856 # This does not work on some platforms (bug #55253)
857 AC_ARG_WITH(sigaltstack, [  --with-sigaltstack=yes,no      enable/disable support for sigaltstack (defaults to yes)],[],[with_sigaltstack=yes])
859 AC_ARG_WITH(static_mono, [  --with-static_mono=yes,no      link mono statically to libmono (faster) (defaults to yes)],[],[with_static_mono=yes])
860 AC_ARG_WITH(shared_mono, [  --with-shared_mono=yes,no      build a shared libmono library (defaults to yes)],[],[with_shared_mono=yes])
861 # Same as --with-shared_mono=no
862 AC_ARG_ENABLE(libraries, [  --disable-libraries disable the build of libmono], enable_libraries=$enableval, enable_libraries=yes)
864 if test "x$enable_static" = "xno"; then
865    with_static_mono=no
868 if test "x$enable_shared" = "xno"; then
869    with_shared_mono=no
872 if test "x$enable_libraries" = "xno"; then
873    with_shared_mono=no
876 AM_CONDITIONAL(DISABLE_LIBRARIES, test x$enable_libraries = xno)
878 if test "x$host_win32" = "xyes"; then
879    # Boehm GC requires the runtime to be in its own dll
880    with_static_mono=no
883 AM_CONDITIONAL(STATIC_MONO, test x$with_static_mono != xno)
884 AM_CONDITIONAL(SHARED_MONO, test x$with_shared_mono != xno)
885 AC_ARG_ENABLE(mcs-build, [  --disable-mcs-build disable the build of the mcs directory], try_mcs_build=$enableval, enable_mcs_build=yes)
886 AC_ARG_ENABLE(support-build, [  --disable-support-build disable the build of the support directory], try_support_build=$enableval, enable_support_build=yes)
888 AC_ARG_WITH(xen_opt,   [  --with-xen_opt=yes,no          Enable Xen-specific behaviour (defaults to yes)],[],[with_xen_opt=yes])
889 if test "x$with_xen_opt" = "xyes" -a "x$mono_cv_clang" = "xno"; then
890         AC_DEFINE(MONO_XEN_OPT, 1, [Xen-specific behaviour])
891         ORIG_CFLAGS=$CFLAGS
892         CFLAGS="$CFLAGS -mno-tls-direct-seg-refs"
893         AC_MSG_CHECKING(for -mno-tls-direct-seg-refs option to gcc)
894         AC_TRY_COMPILE([], [
895         ], [
896            AC_MSG_RESULT(yes)
897            # Pass it to libgc as well
898            CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -mno-tls-direct-seg-refs"
899         ], [
900            AC_MSG_RESULT(no)
901            CFLAGS=$ORIG_CFLAGS
902         ])
905 AC_ARG_ENABLE(small-config, [  --enable-small-config Enable tweaks to reduce requirements (and capabilities)], enable_small_config=$enableval, enable_small_config=no)
907 if test x$enable_small_config = xyes; then
908         AC_DEFINE(MONO_SMALL_CONFIG,1,[Reduce runtime requirements (and capabilities)])
909         CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DSMALL_CONFIG"
912 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)
914 DISABLED_FEATURES=none
915 csc_compiler=default
916 endian=unknown
917 AC_C_BIGENDIAN([endian=big],[endian=little],[endian=unknown])
918 AC_MSG_CHECKING([CSharp compiler to use])
919 AC_ARG_WITH(csc, [  --with-csc=mcs,roslyn,default      Configures the CSharp compiler to use],[
920    if test x$withval = xmcs; then
921        csc_compiler=mcs
922    elif test x$withval = xroslyn; then
923        csc_compiler=roslyn
924    elif test x$withval = xdefault; then
925        :
926    else
927        AC_MSG_ERROR([You must supply one of "mcs", "roslyn" or "default" to the --with-csc option])
928    fi
929 ],[csc_compiler=default])
931 if test $csc_compiler = default; then
932    if test $endian = big; then
933       csc_compiler=mcs
934    elif test $endian = little; then
935       case "$host" in
936         powerpc*) csc_compiler=mcs ;;
937         *) csc_compiler=roslyn ;;
938       esac
939    else
940       csc_compiler=mcs
941    fi
943 AC_MSG_RESULT($csc_compiler)
945 AC_ARG_WITH(jemalloc,             [  --with-jemalloc=yes,no               If jemalloc is enabled (defaults to no)],                                     [], [with_jemalloc=no])
946 AC_ARG_WITH(jemalloc-always,      [  --with-jemalloc_always=yes,no        If jemalloc is enabled and always used (defaults to yes)],                    [], [with_jemalloc_always=no])
947 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])
950 if test x$target_win32 = xyes; then
951 with_jemalloc=no
952 with_jemalloc_assert=no
953 with_jemalloc_always=no
956 AM_CONDITIONAL(MONO_JEMALLOC_ASSERT, [test "x$with_jemalloc_assert" = "xyes"])
957 if test "x$with_jemalloc_assert" = "xyes"; then
958 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ASSERT"
959 AC_DEFINE(MONO_JEMALLOC_ASSERT, 1, [Make jemalloc assert for mono])
960 AC_SUBST(MONO_JEMALLOC_ASSERT, 1)
963 AM_CONDITIONAL(MONO_JEMALLOC_DEFAULT, [test "x$with_jemalloc_always" = "xyes"])
964 if test "x$with_jemalloc_always" = "xyes"; then
965 with_jemalloc=yes
966 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_DEFAULT"
967 AC_DEFINE(MONO_JEMALLOC_DEFAULT, 1, [Make jemalloc default for mono])
968 AC_SUBST(MONO_JEMALLOC_DEFAULT, 1)
971 AM_CONDITIONAL(MONO_JEMALLOC_ENABLED, [test "x$with_jemalloc" = "xyes"])
972 if test "x$with_jemalloc" = "xyes"; then
973 JEMALLOC_LDFLAGS="-L`pwd`/mono/utils/jemalloc/jemalloc/lib -ljemalloc_pic"
974 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ENABLED -I `pwd`/mono/utils/jemalloc/jemalloc/include"
975 JEMALLOC_AUTOCONF_FLAGS=" --build=$target --host=$host"
977 if test "x$target_mach" = "xyes"; then
978         JEMALLOC_CPPFLAGS=" -stdlib=libc++ "
981 AC_DEFINE(MONO_JEMALLOC_ENABLED, 1, [Enable jemalloc usage for mono])
982 AC_SUBST(MONO_JEMALLOC_ENABLED, 1)
984 AC_SUBST(JEMALLOC_CFLAGS)
985 AC_SUBST(JEMALLOC_CPPFLAGS)
986 AC_SUBST(JEMALLOC_LDFLAGS)
987 AC_SUBST(JEMALLOC_AUTOCONF_FLAGS)
990 # Terminology:
991 # Crash privacy - Attempts to not send identifying information in the crash dump / to protect the obscurity of the program control flow
992 # MERP - The MS telemetry profile. Not for general use.
993 # Structured crashes - crashes at runtime that trigger a stack walk by mono that happens cooperatively
995 # 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.
997 #--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.
998 #--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.
999 #--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.
1000 #--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.
1002 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])
1003 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])
1004 AC_ARG_ENABLE(crash-reporting,  [  --disable-crash-reporting            Enable or Disable crash reporting subsystem],        [crash_reporting=$enableval], [crash_reporting=yes])
1006 if test "x$with_crash_privacy" = "xyes"; then
1007 AC_DEFINE(MONO_PRIVATE_CRASHES,1,[Do not include names of unmanaged functions in the crash dump])
1010 if test "x$with_structured_crashes" = "xno"; then
1011 AC_DEFINE(DISABLE_STRUCTURED_CRASH,1,[Do not create structured crash files during unmanaged crashes])
1014 case "$host" in
1015         *-mingw*|*-*-cygwin*|*-*-aix*|*-*-os400*)
1016                 crash_reporting=no
1017                 ;;
1018 esac
1020 if test "x$crash_reporting" != "xyes"; then
1021 CFLAGS="$CFLAGS -DDISABLE_CRASH_REPORTING=1"
1022 CXXFLAGS="$CXXFLAGS -DDISABLE_CRASH_REPORTING=1"
1025 AC_ARG_ENABLE(monodroid, [ --enable-monodroid Enable runtime support for Monodroid (Xamarin.Android)], enable_monodroid=$enableval, enable_monodroid=no)
1026 AM_CONDITIONAL(ENABLE_MONODROID, test x$enable_monodroid = xyes)
1028 AC_ARG_ENABLE(monotouch, [ --enable-monotouch Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)], enable_monotouch=$enableval, enable_monotouch=no)
1029 AM_CONDITIONAL(ENABLE_MONOTOUCH, test x$enable_monotouch = xyes)
1031 if test x$enable_monodroid = xyes; then
1032         AC_DEFINE(ENABLE_MONODROID, 1, [Enable runtime support for Monodroid (Xamarin.Android)])
1035 if test x$enable_monotouch = xyes; then
1036         AC_DEFINE(ENABLE_MONOTOUCH, 1, [Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)])
1039 AC_ARG_ENABLE(cxx, [  --enable-cxx   compile some code as C++])
1041 # mono/corefx/native has a lot of invalid C++98 in its headers
1042 # dotnet/corefx/native looks a lot better, i.e. 44e5bdafb8d989a220c9cf1b94f31a64a6e4f052
1043 #CXXFLAGS_COMMON=' -std=gnu++98 -fno-exceptions -fno-rtti '
1044 CXXFLAGS_COMMON=' -std=gnu++0x -fno-exceptions -fno-rtti '
1045 # "c++0x" instead of C++11, for compat with Centos6/gcc4.4
1047 # -stdlib=libc++ is needed by clang for iOS 6.0 (-miphoneos-version-min=6.0)
1048 # to support C++11 headers but it does not seem to harm elsewhere, so over-approximate
1049 # and add it whenever we're running clang on Darwin.
1050 if test "x$mono_cv_clang" = xyes -a x$host_darwin = xyes; then
1051         CXXFLAGS_COMMON="$CXXFLAGS_COMMON -stdlib=libc++"
1054 AC_SUBST(CXXFLAGS_COMMON)
1056 if test "x$enable_cxx" = "xyes"; then
1058         CXX_ADD_CFLAGS=" -xc++ $CXXFLAGS_COMMON "
1060         # -std=gnu99 -xc++ is not allowed and errors.
1061         CXX_REMOVE_CFLAGS=-std=gnu99
1062         # These give warnings and should be removed. They are C-only.
1063         # i.e. C++ never allows these, they are always errors and their warningness is not controllable.
1064         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs"
1065         # Likewise with CentOS 6 gcc 4.4.
1066         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Werror-implicit-function-declaration"
1068         # The C-only-ness of -Wno-format-zero-length varies with gcc version.
1069         # It is C-only prior to 4.7. Using it with C++ prior to 4.7
1070         # generates a warning every time we run gcc which is very unsightly.
1071         # The warning is for e.g. sprintf(foo, "") which can just be
1072         # foo[0] = 0 but Mono's use is more elaborate, not as easy to "fix",
1073         # and completely legal and valid.
1074         # We have to switch to C++ and not just use -xc++ because of -std=gnu99 (error when combined with -xc++).
1075         # Alternatively, just run $CXX -xc++ -c /dev/null.
1076         AC_LANG_PUSH(C++)
1077         ORIG_CXXFLAGS=$CXXFLAGS
1078         CXXFLAGS="$CXXFLAGS -Werror -Wno-format-zero-length -xc++ "
1079         AC_MSG_CHECKING(or C-only-ness of -Wno-format-zero-length)
1080         AC_TRY_COMPILE([ ], [ ], [ AC_MSG_RESULT(yes) ],
1081                                  [ AC_MSG_RESULT(no)
1082                                    CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wno-format-zero-length" ])
1083         CXXFLAGS=$ORIG_CXXFLAGS
1084         AC_LANG_POP(C++)
1086 AC_SUBST(CXX_ADD_CFLAGS)
1087 AC_SUBST(CXX_REMOVE_CFLAGS)
1090 # Set the build profiles and options before things which use them
1093 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])
1094 AC_ARG_WITH(monodroid,           [  --with-monodroid=yes,no             If you want to build the MonoDroid assemblies (defaults to no)],            [], [with_monodroid=default])
1095 AC_ARG_WITH(monotouch,           [  --with-monotouch=yes,no             If you want to build the Xamarin.iOS assemblies (defaults to no)],          [], [with_monotouch=default])
1096 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])
1097 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])
1098 AC_ARG_WITH(bitcode,             [  --with-bitcode=yes,no               If bitcode is enabled (defaults to no)],                                    [], [with_bitcode=default])
1099 AC_ARG_WITH(xammac,              [  --with-xammac=yes,no                If you want to build the Xamarin.Mac assemblies (defaults to no)],          [], [with_xammac=default])
1100 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])
1101 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])
1102 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])
1103 AC_ARG_WITH(winaot,              [  --with-winaot=yes,no                If you want to build the Windows friendly AOT assemblies (defaults to no)], [], [with_winaot=default])
1104 AC_ARG_WITH(orbis,               [  --with-orbis=yes,no                 If you want to build the Orbis assemblies (defaults to no)], [], [with_orbis=default])
1105 AC_ARG_WITH(unreal,              [  --with-unreal=yes,no                If you want to build the Unreal assemblies (defaults to no)], [], [with_unreal=default])
1106 AC_ARG_WITH(wasm,                [  --with-wasm=yes,no                  If you want to build the WebAssembly (defaults to no)], [], [with_wasm=default])
1109 AC_ARG_WITH(runtime-preset, [  --with-runtime-preset=net_4_x,all,aot,aot_llvm,hybridaot,hybridaot_llvm,fullaot,fullaot_llvm,bitcode,unreal,fullaotinterp,fullaotinterp_llvm  Which default profile to build (defaults to net_4_x)],  [], [with_runtime_preset=net_4_x])
1110 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])
1111 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])
1112 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])
1115 dnl Spectre compiler mitigation flag checks
1117 if test "x$with_spectre_mitigation" = "xyes"; then
1118    AC_MSG_NOTICE([Compiler Spectre mitigation support checks])
1119    SPECTRE_CFLAGS=
1120    SPECTRE_INDIRECT_BRANCH_KIND=
1121    case "x$with_spectre_indirect_branch_choice" in
1122        xkeep) SPECTRE_INDIRECT_BRANCH_KIND=keep ;;
1123        xthunk) SPECTRE_INDIRECT_BRANCH_KIND=thunk ;;
1124        xinline) SPECTRE_INDIRECT_BRANCH_KIND=thunk-inline ;;
1125        xextern) SPECTRE_INDIRECT_BRANCH_KIND=thunk-extern ;;
1126        *) AC_MSG_ERROR([Invalid indirect jump thunk kind ($with_spectre_indirect_branch_choice)]) ;;
1127    esac
1129    SPECTRE_FUNCTION_RETURN_KIND=""
1130    case "x$with_spectre_function_return_choice" in
1131        xkeep) SPECTRE_FUNCTION_RETURN_KIND=keep ;;
1132        xthunk) SPECTRE_FUNCTION_RETURN_KIND=thunk ;;
1133        xinline) SPECTRE_FUNCTION_RETURN_KIND=thunk-inline ;;
1134        xextern) SPECTRE_FUNCTION_RETURN_KIND=thunk-extern ;;
1135        *) AC_MSG_ERROR([Invalid function return thunk kind ($with_spectre_function_return_choice)]) ;;
1136    esac
1138    AX_CHECK_COMPILE_FLAG(
1139         [ -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND ],
1140         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND" ]
1141    )
1143    AX_CHECK_COMPILE_FLAG(
1144         [ -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND ],
1145         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND" ]
1146    )
1148    if test "x$SPECTRE_CFLAGS" != "x" ; then
1149         CFLAGS="$CFLAGS $SPECTRE_CFLAGS"
1150         CXXFLAGS="$CXXFLAGS $SPECTRE_CFLAGS"
1151         spectre_mitigation_status="mitigation enabled"
1152    fi
1153 else
1154         spectre_mitigation_status="no mitigation"
1158 dnl Profile defaults
1160 TEST_PROFILE=default
1161 enable_llvm_default=no
1163 with_profile4_x_default=no
1164 with_monodroid_default=no
1165 with_monotouch_default=no
1166 with_monotouch_watch_default=no
1167 with_monotouch_tv_default=no
1168 with_xammac_default=no
1169 with_testing_aot_full_interp_default=no
1170 with_testing_aot_hybrid_default=no
1171 with_testing_aot_full_default=no
1172 with_winaot_default=no
1173 with_orbis_default=no
1174 with_unreal_default=no
1175 with_wasm_default=no
1177 with_bitcode_default=no
1178 enable_cooperative_suspend_default=no
1179 enable_hybrid_suspend_default=no
1181 INVARIANT_AOT_OPTIONS=nimt-trampolines=2000,ntrampolines=10000,nrgctx-fetch-trampolines=256,ngsharedvt-trampolines=4000,nftnptr-arg-trampolines=4000
1183 AOT_BUILD_ATTRS=$INVARIANT_AOT_OPTIONS
1185 if test x$cross_compiling = xyes -o x$enable_mcs_build = xno; then
1186    DISABLE_MCS_DOCS_default=yes
1187 elif test x$with_runtime_preset = xnet_4_x; then
1188    with_profile4_x_default=yes
1189    TEST_PROFILE=net_4_x
1190 elif test x$with_runtime_preset = xall; then
1191    with_profile4_x_default=yes
1192    with_monodroid_default=yes
1193    with_monotouch_default=yes
1194    with_monotouch_watch_default=yes
1195    with_monotouch_tv_default=yes
1196    with_xammac_default=yes
1197    with_winaot_default=yes
1198    with_orbis_default=yes
1199    with_unreal_default=yes
1200    with_wasm_default=yes
1201    with_testing_aot_full_interp_default=yes
1202    with_testing_aot_hybrid_default=yes
1203    with_testing_aot_full_default=yes
1204    TEST_PROFILE=net_4_x
1205 elif test x$with_runtime_preset = xbitcode; then
1206    DISABLE_MCS_DOCS_default=yes
1207    with_testing_aot_full_default=yes
1208    with_bitcode_default=yes
1209    enable_cooperative_suspend_default=yes
1210    TEST_PROFILE=testing_aot_full
1211    enable_llvm_default=yes
1213    mono_feature_disable_com='yes'
1214    mono_feature_disable_remoting='yes'
1215    mono_feature_disable_reflection_emit_save='yes'
1216    mono_feature_disable_reflection_emit='yes'
1217    mono_feature_disable_appdomains='yes'
1219    AOT_BUILD_FLAGS="--runtime=mobile --aot=llvmonly,$INVARIANT_AOT_OPTIONS"
1220    AOT_RUN_FLAGS="--runtime=mobile --llvmonly"
1221    AOT_MODE="llvmonly"
1222 elif test x$with_runtime_preset = xfullaot; then
1223    DISABLE_MCS_DOCS_default=yes
1224    with_testing_aot_full_default=yes
1225    TEST_PROFILE=testing_aot_full
1227    mono_feature_disable_com='yes'
1228    mono_feature_disable_remoting='yes'
1229    mono_feature_disable_reflection_emit_save='yes'
1230    mono_feature_disable_reflection_emit='yes'
1231    mono_feature_disable_appdomains='yes'
1233    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1234    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1235    AOT_MODE="full"
1236 elif test x$with_runtime_preset = xfullaot_llvm; then
1237    DISABLE_MCS_DOCS_default=yes
1238    with_testing_aot_full_default=yes
1239    TEST_PROFILE=testing_aot_full
1241    mono_feature_disable_com='yes'
1242    mono_feature_disable_remoting='yes'
1243    mono_feature_disable_reflection_emit_save='yes'
1244    mono_feature_disable_reflection_emit='yes'
1245    mono_feature_disable_appdomains='yes'
1247    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1248    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1249    AOT_MODE="full"
1250 elif test x$with_runtime_preset = xhybridaot; then
1251    DISABLE_MCS_DOCS_default=yes
1252    with_testing_aot_hybrid_default=yes
1253    TEST_PROFILE=testing_aot_hybrid 
1255    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1256    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1257 elif test x$with_runtime_preset = xhybridaot_llvm; then
1258    DISABLE_MCS_DOCS_default=yes
1259    with_testing_aot_hybrid_default=yes
1260    TEST_PROFILE=testing_aot_hybrid
1262    AOT_BUILD_FLAGS="--runtime=mobile --llvm --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1263    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1264 elif test x$with_runtime_preset = xfullaotinterp; then
1265    with_testing_aot_full_interp_default=yes
1266    TEST_PROFILE=testing_aot_full_interp
1268    # mscorlib.dll aot compilation crashes
1269    mono_feature_disable_com='yes'
1271    AOT_BUILD_FLAGS="--aot=full,interp,$INVARIANT_AOT_OPTIONS"
1272    AOT_RUN_FLAGS="--full-aot-interp"
1273 elif test x$with_runtime_preset = xfullaotinterp_llvm; then
1274    with_testing_aot_full_interp_default=yes
1275    TEST_PROFILE=testing_aot_full_interp_llvm
1277    # mscorlib.dll aot compilation crashes
1278    mono_feature_disable_com='yes'
1280    AOT_BUILD_FLAGS="-O=gsharedvt --llvm --aot=full,interp,$INVARIANT_AOT_OPTIONS"
1281    AOT_RUN_FLAGS="--full-aot-interp"
1282 elif test x$with_runtime_preset = xaot; then
1283    with_profile4_x_default=yes
1285    AOT_BUILD_FLAGS="--aot=$INVARIANT_AOT_OPTIONS"
1286    AOT_RUN_FLAGS=""
1288    DISABLE_MCS_DOCS_default=yes
1289 elif test x$with_runtime_preset = xaot_llvm; then
1290    with_profile4_x_default=yes
1292    AOT_BUILD_FLAGS="--llvm --aot=$INVARIANT_AOT_OPTIONS"
1293    AOT_RUN_FLAGS=""
1295    DISABLE_MCS_DOCS_default=yes
1296 elif test x$with_runtime_preset = xwinaot; then
1297    DISABLE_MCS_DOCS_default=yes
1298    with_winaot_default=yes
1299    TEST_PROFILE=winaot
1301    mono_feature_disable_com='yes'
1302    mono_feature_disable_remoting='yes'
1303    mono_feature_disable_reflection_emit_save='yes'
1304    mono_feature_disable_reflection_emit='yes'
1305    mono_feature_disable_appdomains='yes'
1307    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1308    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1309    AOT_MODE="llvmonly"
1310 elif test x$with_runtime_preset = xorbis; then
1311    DISABLE_MCS_DOCS_default=yes
1312    with_orbis_default=yes
1313    TEST_PROFILE=orbis
1315    mono_feature_disable_com='yes'
1316    mono_feature_disable_remoting='yes'
1317    mono_feature_disable_reflection_emit_save='yes'
1318    mono_feature_disable_reflection_emit='yes'
1319    mono_feature_disable_appdomains='yes'
1321    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1322    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1323    AOT_MODE="full"
1324 elif test x$with_runtime_preset = xunreal; then
1325    DISABLE_MCS_DOCS_default=yes
1326    with_unreal_default=yes
1327    TEST_PROFILE=unreal
1329    mono_feature_disable_com='yes'
1330    mono_feature_disable_remoting='yes'
1331    mono_feature_disable_appdomains='no'
1333    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1334    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1335 elif test x$with_runtime_preset = xwasm; then
1336    DISABLE_MCS_DOCS_default=yes
1337    with_wasm_default=yes
1338    TEST_PROFILE=wasm
1340    mono_feature_disable_com='yes'
1341    mono_feature_disable_remoting='yes'
1342    mono_feature_disable_reflection_emit_save='yes'
1343    mono_feature_disable_reflection_emit='yes'
1344    mono_feature_disable_appdomains='yes'
1346    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1347    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1348 else
1349    TEST_PROFILE=net_4_x
1350    with_profile4_x_default=yes
1353 if test "x$AOT_BUILD_FLAGS" != "x"; then :
1354    AC_SUBST(AOT_BUILD_FLAGS)
1355    AC_SUBST(AOT_RUN_FLAGS)
1356    # For llvmonlycheck + fullaotcheck
1357    AC_SUBST(INVARIANT_AOT_OPTIONS)
1360 AC_SUBST(TEST_PROFILE)
1362 if test "x$with_profile4_x" = "xdefault"; then
1363    with_profile4_x=$with_profile4_x_default
1365 if test "x$with_monodroid" = "xdefault"; then
1366    with_monodroid=$with_monodroid_default
1368 if test "x$with_monotouch" = "xdefault"; then
1369    with_monotouch=$with_monotouch_default
1371 if test "x$with_monotouch_watch" = "xdefault"; then
1372    with_monotouch_watch=$with_monotouch_watch_default
1374 if test "x$with_monotouch_tv" = "xdefault"; then
1375    with_monotouch_tv=$with_monotouch_tv_default
1377 if test "x$with_bitcode" = "xdefault"; then
1378    with_bitcode=$with_bitcode_default
1380 if test "x$with_xammac" = "xdefault"; then
1381    with_xammac=$with_xammac_default
1383 if test "x$with_testing_aot_full_interp" = "xdefault"; then
1384    with_testing_aot_full_interp=$with_testing_aot_full_interp_default
1386 if test "x$with_testing_aot_hybrid" = "xdefault"; then
1387    with_testing_aot_hybrid=$with_testing_aot_hybrid_default
1389 if test "x$with_testing_aot_full" = "xdefault"; then
1390    with_testing_aot_full=$with_testing_aot_full_default
1392 if test "x$with_winaot" = "xdefault"; then
1393    with_winaot=$with_winaot_default
1395 if test "x$with_orbis" = "xdefault"; then
1396    with_orbis=$with_orbis_default
1398 if test "x$with_unreal" = "xdefault"; then
1399    with_unreal=$with_unreal_default
1401 if test "x$with_wasm" = "xdefault"; then
1402    with_wasm=$with_wasm_default
1406 AM_CONDITIONAL(INSTALL_4_x, [test "x$with_profile4_x" = "xyes"])
1407 AM_CONDITIONAL(INSTALL_MONODROID, [test "x$with_monodroid" != "xno"])
1408 AM_CONDITIONAL(INSTALL_MONOTOUCH, [test "x$with_monotouch" != "xno"])
1409 AM_CONDITIONAL(INSTALL_MONOTOUCH_WATCH, [test "x$with_monotouch_watch" != "xno"])
1410 AM_CONDITIONAL(INSTALL_MONOTOUCH_TV, [test "x$with_monotouch_tv" != "xno"])
1411 AM_CONDITIONAL(BITCODE, test "x$with_bitcode" = "xyes")
1412 AM_CONDITIONAL(INSTALL_XAMMAC, [test "x$with_xammac" != "xno"])
1413 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL_INTERP, [test "x$with_testing_aot_full_interp" != "xno"])
1414 AM_CONDITIONAL(INSTALL_TESTING_AOT_HYBRID, [test "x$with_testing_aot_hybrid" != "xno"])
1415 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL, [test "x$with_testing_aot_full" != "xno"])
1416 AM_CONDITIONAL(INSTALL_WINAOT, [test "x$with_winaot" != "xno"])
1417 AM_CONDITIONAL(INSTALL_ORBIS, [test "x$with_orbis" != "xno"])
1418 AM_CONDITIONAL(INSTALL_UNREAL, [test "x$with_unreal" != "xno"])
1419 AM_CONDITIONAL(INSTALL_WASM, [test "x$with_wasm" != "xno"])
1420 AM_CONDITIONAL(INSTALL_NETCORE, [test "x$with_core" != "xno"])
1421 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"])
1422 AM_CONDITIONAL(HYBRID_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_hybrid"] || [test "x$TEST_PROFILE" = "xunreal"])
1423 AM_CONDITIONAL(AOT_FULL_INTERP_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full_interp"])
1424 AM_CONDITIONAL(AOT_FULL_INTERP_LLVM_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full_interp_llvm"])
1425 AM_CONDITIONAL(DEFAULT_TESTS, [test "x$TEST_PROFILE" = "xnet_4_x"])
1427 default_profile=net_4_x
1428 if test -z "$INSTALL_MONODROID_TRUE"; then :
1429    default_profile=monodroid
1431 if test -z "$INSTALL_MONOTOUCH_TRUE"; then :
1432    default_profile=monotouch
1434 if test -z "$INSTALL_XAMMAC_TRUE"; then :
1435    default_profile=xammac
1437 if test -z "$INSTALL_TESTING_AOT_FULL_INTERP_TRUE"; then :
1438    default_profile=testing_aot_full_interp
1440 if test -z "$INSTALL_TESTING_AOT_HYBRID_TRUE"; then :
1441    default_profile=testing_aot_hybrid
1443 if test -z "$INSTALL_TESTING_AOT_FULL_TRUE"; then :
1444    default_profile=testing_aot_full
1446 if test -z "$INSTALL_WINAOT_TRUE"; then :
1447    default_profile=winaot
1449 if test -z "$INSTALL_ORBIS_TRUE"; then :
1450    default_profile=orbis
1452 if test -z "$INSTALL_UNREAL_TRUE"; then :
1453    default_profile=unreal
1455 if test -z "$INSTALL_WASM_TRUE"; then :
1456    default_profile=wasm
1458 if test -z "$INSTALL_4_x_TRUE"; then :
1459    default_profile=net_4_x
1461 DEFAULT_PROFILE=$default_profile
1462 AC_SUBST(DEFAULT_PROFILE)
1465 # End build profile configuration
1468 if test x$USE_NLS = xprofile_default; then
1470         AC_MSG_CHECKING([NLS used])
1472         # We make the default value for USE_NLS
1473         # "no" on OSX because it isn't available on most
1474         # default OSX installs. The most common configurations will
1475         # all disable it, so this saves us typing.
1476         if test x$host_darwin = xyes; then
1477                 USE_NLS=no;
1478         else
1479                 USE_NLS=yes;
1480         fi
1482         AC_SUBST([USE_NLS])
1483         AC_MSG_RESULT([$USE_NLS])
1486 AC_ARG_ENABLE(minimal, [  --enable-minimal=LIST      drop support for LIST subsystems.
1487      LIST is a comma-separated list from: aot, profiler, decimal, pinvoke, debug, appdomains, verifier, 
1488      reflection_emit, reflection_emit_save, large_code, logging, com, ssa, generics, attach, jit, interpreter, simd, soft_debug, perfcounters, normalization, desktop_loader, shared_perfcounters, remoting,
1489          security, lldb, mdb, assert_messages, cleanup, sgen_marksweep_conc, sgen_split_nursery, sgen_gc_bridge, sgen_debug_helpers.],
1491         for feature in `echo "$enable_minimal" | sed -e "s/,/ /g"`; do
1492                 eval "mono_feature_disable_$feature='yes'"
1493         done
1494         DISABLED_FEATURES=$enable_minimal
1495         disabled="Disabled:      $enable_minimal"
1496 ],[])
1498 AC_DEFINE_UNQUOTED(DISABLED_FEATURES, "$DISABLED_FEATURES", [String of disabled features])
1500 if test "x$mono_feature_disable_aot" = "xyes"; then
1501         AC_DEFINE(DISABLE_AOT, 1, [Disable AOT Compiler])
1502         enable_system_aot=no
1503         AC_MSG_NOTICE([Disabled AOT compiler])
1506 if test "x$mono_feature_disable_profiler" = "xyes"; then
1507         AC_DEFINE(DISABLE_PROFILER, 1, [Disable default profiler support])
1508         AC_MSG_NOTICE([Disabled support for the profiler])
1510 AM_CONDITIONAL(DISABLE_PROFILER, test x$mono_feature_disable_profiler = xyes)
1512 if test "x$mono_feature_disable_decimal" = "xyes"; then
1513         AC_DEFINE(DISABLE_DECIMAL, 1, [Disable System.Decimal support])
1514         AC_MSG_NOTICE([Disabled support for decimal])
1517 if test "x$mono_feature_disable_pinvoke" = "xyes"; then
1518         AC_DEFINE(DISABLE_PINVOKE, 1, [Disable P/Invoke support])
1519         AC_MSG_NOTICE([Disabled support for P/Invoke])
1522 if test "x$mono_feature_disable_debug" = "xyes"; then
1523         AC_DEFINE(DISABLE_DEBUG, 1, [Disable runtime debugging support])
1524         AC_MSG_NOTICE([Disabled support for runtime debugging])
1527 if test "x$mono_feature_disable_reflection_emit" = "xyes"; then
1528         AC_DEFINE(DISABLE_REFLECTION_EMIT, 1, [Disable reflection emit support])
1529         mono_feature_disable_reflection_emit_save=yes
1530         AC_MSG_NOTICE([Disabled support for Reflection.Emit])
1533 if test "x$mono_feature_disable_reflection_emit_save" = "xyes"; then
1534         AC_DEFINE(DISABLE_REFLECTION_EMIT_SAVE, 1, [Disable assembly saving support in reflection emit])
1535         AC_MSG_NOTICE([Disabled support for Reflection.Emit.Save])
1538 if test "x$mono_feature_disable_large_code" = "xyes"; then
1539         AC_DEFINE(DISABLE_LARGE_CODE, 1, [Disable support for huge assemblies])
1540         AC_MSG_NOTICE([Disabled support for large assemblies])
1543 if test "x$mono_feature_disable_logging" = "xyes"; then
1544         AC_DEFINE(DISABLE_LOGGING, 1, [Disable support debug logging])
1545         AC_MSG_NOTICE([Disabled support for logging])
1548 if test "x$mono_feature_disable_com" = "xyes"; then
1549         AC_DEFINE(DISABLE_COM, 1, [Disable COM support])
1550         AC_MSG_NOTICE([Disabled COM support])
1553 if test "x$mono_feature_disable_ssa" = "xyes"; then
1554         AC_DEFINE(DISABLE_SSA, 1, [Disable advanced SSA JIT optimizations])
1555         AC_MSG_NOTICE([Disabled SSA JIT optimizations])
1558 if test "x$mono_feature_disable_generics" = "xyes"; then
1559         AC_DEFINE(DISABLE_GENERICS, 1, [Disable generics support])
1560         AC_MSG_NOTICE([Disabled Generics Support])
1563 if test "x$mono_feature_disable_shadowcopy" = "xyes"; then
1564         AC_DEFINE(DISABLE_SHADOW_COPY, 1, [Disable Shadow Copy for AppDomains])
1565         AC_MSG_NOTICE([Disabled Shadow copy for AppDomains])
1568 if test "x$mono_feature_disable_portability" = "xyes"; then
1569         AC_DEFINE(DISABLE_PORTABILITY, 1, [Disables the IO portability layer])
1570         AC_MSG_NOTICE([Disabled IO Portability layer])
1573 if test "x$mono_feature_disable_attach" = "xyes"; then
1574         AC_DEFINE(DISABLE_ATTACH, 1, [Disable agent attach support])
1575         AC_MSG_NOTICE([Disabled agent attach])
1578 if test "x$mono_feature_disable_verifier" = "xyes"; then
1579         AC_DEFINE(DISABLE_VERIFIER, 1, [Disables the verifier])
1580         AC_MSG_NOTICE([Disabled the metadata and IL verifiers])
1583 if test "x$mono_feature_disable_jit" = "xyes"; then
1584         AC_DEFINE(DISABLE_JIT, 1, [Disable the JIT, only full-aot mode or interpreter will be supported by the runtime.])
1585         AC_MSG_NOTICE([Disabled the JIT engine, only full AOT or interpreter will be supported])
1588 AM_CONDITIONAL(DISABLE_JIT, test x$mono_feature_disable_jit = xyes)
1590 if test "x$mono_feature_disable_interpreter" = "xyes"; then
1591         AC_DEFINE(DISABLE_INTERPRETER, 1, [Disable the interpreter.])
1592         AC_MSG_NOTICE([Disabled the interpreter])
1595 AM_CONDITIONAL(DISABLE_INTERPRETER, test x$mono_feature_disable_interpreter = xyes)
1597 if test "x$mono_feature_disable_interpreter" != "xyes" -o "x$mono_feature_disable_jit" != "xyes"; then
1598         AC_DEFINE(ENABLE_ILGEN, 1, [Some VES is available at runtime])
1601 AM_CONDITIONAL(ENABLE_ILGEN, test x$mono_feature_disable_interpreter != xyes -o x$mono_feature_disable_jit != xyes)
1603 if test "x$mono_feature_disable_simd" = "xyes"; then
1604         AC_DEFINE(DISABLE_SIMD, 1, [Disable SIMD intrinsics related optimizations.])
1605         AC_MSG_NOTICE([Disabled SIMD support])
1608 if test "x$mono_feature_disable_soft_debug" = "xyes"; then
1609         AC_DEFINE(DISABLE_DEBUGGER_AGENT, 1, [Disable Soft Debugger Agent.])
1610         AC_MSG_NOTICE([Disabled Soft Debugger.])
1613 AM_CONDITIONAL(DISABLE_DEBUGGER_AGENT, test x$mono_feature_disable_debugger_agent = xyes)
1615 if test "x$mono_feature_disable_perfcounters" = "xyes"; then
1616         AC_DEFINE(DISABLE_PERFCOUNTERS, 1, [Disable Performance Counters.])
1617         AC_MSG_NOTICE([Disabled Performance Counters.])
1619 if test "x$mono_feature_disable_normalization" = "xyes"; then
1620         AC_DEFINE(DISABLE_NORMALIZATION, 1, [Disable String normalization support.])
1621         AC_MSG_NOTICE([Disabled String normalization support.])
1624 #TODO: remove assembly_remapping feature name once everyone is using desktop_loader
1625 if test "x$mono_feature_disable_assembly_remapping" = "xyes" || test "x$mono_feature_disable_desktop_loader" = "xyes"; then
1626         AC_DEFINE(DISABLE_DESKTOP_LOADER, 1, [Disable desktop assembly loader semantics.])
1627         AC_MSG_NOTICE([Disabled desktop assembly loader semantics.])
1630 if test "x$mono_feature_disable_shared_perfcounters" = "xyes"; then
1631         AC_DEFINE(DISABLE_SHARED_PERFCOUNTERS, 1, [Disable shared perfcounters.])
1632         AC_MSG_NOTICE([Disabled Shared perfcounters.])
1635 if test "x$mono_feature_disable_appdomains" = "xyes"; then
1636         AC_DEFINE(DISABLE_APPDOMAINS, 1, [Disable support for multiple appdomains.])
1637         AC_MSG_NOTICE([Disabled support for multiple appdomains.])
1640 if test "x$mono_feature_disable_remoting" = "xyes"; then
1641         AC_DEFINE(DISABLE_REMOTING, 1, [Disable remoting support (This disables type proxies and make com non-functional)])
1642         AC_MSG_NOTICE([Disabled remoting])
1645 if test "x$mono_feature_disable_security" = "xyes"; then
1646         AC_DEFINE(DISABLE_SECURITY, 1, [Disable CAS/CoreCLR security])
1647         AC_MSG_NOTICE([Disabled CAS/CoreCLR security manager (used e.g. for Moonlight)])
1650 if test "x$mono_feature_disable_lldb" = "xyes"; then
1651         AC_DEFINE(DISABLE_LLDB, 1, [Disable support code for the LLDB plugin.])
1652         AC_MSG_NOTICE([Disabled LLDB plugin support code.])
1655 if test "x$mono_feature_disable_mdb" = "xyes"; then
1656         AC_DEFINE(DISABLE_MDB, 1, [Disable support for .mdb symbol files.])
1657         AC_MSG_NOTICE([Disabled support for .mdb symbol files.])
1660 if test "x$mono_feature_disable_assert_messages" = "xyes"; then
1661         AC_DEFINE(DISABLE_ASSERT_MESSAGES, 1, [Disable assertion messages.])
1662         AC_MSG_NOTICE([Disabled assertion messages.])
1665 if test "x$mono_feature_disable_cleanup" = "xyes"; then
1666         AC_DEFINE(DISABLE_CLEANUP, 1, [Disable runtime cleanup.])
1667         AC_MSG_NOTICE([Disabled runtime cleanup.])
1670 if test "x$mono_feature_disable_sgen_marksweep_conc" = "xyes"; then
1671         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_CONC, 1, [Disable concurrent gc support in SGEN.])
1672         AC_MSG_NOTICE([Disabled concurrent gc support in SGEN.])
1676 if test "x$mono_feature_disable_sgen_split_nursery" = "xyes"; then
1677         AC_DEFINE(DISABLE_SGEN_SPLIT_NURSERY, 1, [Disable minor=split support in SGEN.])
1678         AC_MSG_NOTICE([Disabled minor=split support in SGEN.])
1681 if test "x$mono_feature_disable_sgen_gc_bridge" = "xyes"; then
1682         AC_DEFINE(DISABLE_SGEN_GC_BRIDGE, 1, [Disable gc bridge support in SGEN.])
1683         AC_MSG_NOTICE([Disabled gc bridge support in SGEN.])
1686 if test "x$mono_feature_disable_sgen_debug_helpers" = "xyes"; then
1687         AC_DEFINE(DISABLE_SGEN_DEBUG_HELPERS, 1, [Disable debug helpers in SGEN.])
1688         AC_MSG_NOTICE([Disabled debug helpers in SGEN.])
1691 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
1692 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
1694 has_extension_module=no
1695 AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
1697         for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
1698                 if test x$extension = xdefault ; then
1699                         has_extension_module=yes;
1700                 fi
1701         done
1702         if test x$enable_extension_module = xyes; then
1703                 has_extension_module=yes;
1704         fi
1705 ], [])
1707 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
1709 if test x$has_extension_module != xno ; then
1710         AC_DEFINE([ENABLE_EXTENSION_MODULE], 1, [Extension module enabled])
1711         AC_MSG_NOTICE([Enabling mono extension module.])
1714 # Deprecated
1715 AC_ARG_ENABLE(gsharedvt, [  --enable-gsharedvt Enable generic valuetype sharing (Deprecated)], enable_gsharedvt=$enableval, enable_gsharedvt=no)
1717 AC_MSG_CHECKING(for visibility __attribute__)
1718 AC_COMPILE_IFELSE([
1719         AC_LANG_SOURCE([[
1720                 void __attribute__ ((visibility ("hidden"))) doit (void) {}
1721                 int main () { doit (); return 0; }
1722         ]])
1723 ], [
1724    have_visibility_hidden=yes
1725    AC_MSG_RESULT(yes)
1726 ], [
1727    have_visibility_hidden=no
1728    AC_MSG_RESULT(no)
1732 dnl Boehm GC configuration
1735 AC_ARG_WITH(libgc,   [  --with-libgc=included,none  Controls the Boehm GC config, default=included],[libgc=$with_libgc],[libgc=included])
1737 AC_ARG_ENABLE(boehm, [  --disable-boehm            Disable the Boehm GC.], support_boehm=$enableval,support_boehm=${support_boehm:-yes})
1738 AM_CONDITIONAL(SUPPORT_BOEHM, test x$support_boehm = xyes)
1740 if test "x$support_boehm" = "xyes"; then
1742         AC_ARG_ENABLE(parallel-mark, [  --enable-parallel-mark     Enables Boehm GC Parallel Marking], enable_parallel_mark=$enableval, enable_parallel_mark=$parallel_mark)
1743         if test x$enable_parallel_mark = xyes; then
1744                 libgc_configure_args="$libgc_configure_args --enable-parallel-mark"
1745         fi
1747         gc_msg=""
1748         LIBGC_CPPFLAGS=
1749         LIBGC_LIBS=
1750         LIBGC_STATIC_LIBS=
1751         libgc_dir=
1752         case "x$libgc" in
1753                 xincluded)
1754                         if test "x$support_boehm" = "xyes"; then
1755                                 libgc_dir=libgc
1756                         fi
1758                         LIBGC_CPPFLAGS='-I$(top_srcdir)/libgc/include'
1759                         LIBGC_LIBS='$(top_builddir)/libgc/libmonogc.la'
1760                         LIBGC_STATIC_LIBS='$(top_builddir)/libgc/libmonogc-static.la'
1762                         BOEHM_DEFINES="-DHAVE_BOEHM_GC"
1764                         if test x$target_win32 = xyes; then
1765                                 BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
1766                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
1767                         fi
1769                         gc_msg="Included Boehm GC with typed GC"
1770                         if test x$enable_parallel_mark = xyes; then
1771                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
1772                                 gc_msg="$gc_msg and parallel mark"
1773                         else
1774                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC)", [GC description])
1775                         fi
1776                         ;;
1778                 xboehm|xbohem|xyes)
1779                         AC_MSG_WARN("External Boehm is no longer supported")
1780                         ;;
1782                 xsgen)
1783                         AC_MSG_WARN("Use --with-sgen instead, --with-libgc= controls Boehm configuration")
1784                         ;;
1786                 xnone)
1787                         AC_MSG_WARN("Compiling mono without GC.")
1788                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description])
1789                         AC_DEFINE(HAVE_NULL_GC,1,[No GC support.])
1790                         gc_msg="none"
1791                         ;;
1792                 *)
1793                         AC_MSG_ERROR([Invalid argument $libgc to --with-libgc.])
1794                         ;;
1795         esac
1797         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])
1798         if test "x$large_heap" = "xyes"; then
1799            CPPFLAGS="$CPPFLAGS -DLARGE_CONFIG"
1800         fi
1802         AC_SUBST(LIBGC_CPPFLAGS)
1803         AC_SUBST(LIBGC_LIBS)
1804         AC_SUBST(LIBGC_STATIC_LIBS)
1805         AC_SUBST(libgc_dir)
1806         AC_SUBST(BOEHM_DEFINES)
1809 AM_CONDITIONAL(SUPPORT_NULLGC, test "x$libgc" = "xnone")
1812 dnl End of Boehm GC Configuration
1815 dnl *************************************
1816 dnl *** Checks for zero length arrays ***
1817 dnl *************************************
1818 AC_MSG_CHECKING(whether $CC supports zero length arrays)
1819 AC_TRY_COMPILE([
1820         struct s {
1821                 int  length;
1822                 char data [0];
1823         };
1824 ], [], [
1825         AC_MSG_RESULT(yes)
1826         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 0, [Length of zero length arrays])
1827 ], [
1828         AC_MSG_RESULT(no)
1829         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
1832 dnl ***********************************
1833 dnl *** Checks for signals
1834 dnl ***********************************
1835 AC_CHECK_HEADERS(signal.h)
1836 AC_CHECK_FUNCS(sigaction)
1837 AC_CHECK_FUNCS(kill)
1838 AC_CHECK_FUNCS(signal)
1840 # signal() is declared inline in Android headers
1841 # so we need to workaround it by overriding the check.
1842 if test x$platform_android = xyes; then
1843         AC_DEFINE(HAVE_SIGNAL,1)
1846 dnl ***********************************
1847 dnl *** Checks for availability of GSS dependencies (krb5, gss.framework, etc)
1848 dnl ***********************************
1849 enable_gss=no;
1850 AC_MSG_CHECKING(for GSS/GSS.h)
1851 AC_TRY_COMPILE([
1852     #include <GSS/GSS.h>
1853 ], [
1855     AC_MSG_RESULT(yes)
1856     AC_DEFINE(HAVE_GSSFW_HEADERS, 1, [GSS/GSS.h])
1857     AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
1858     enable_gss=yes
1859 ], [
1860     AC_MSG_RESULT(no)
1863 AC_MSG_CHECKING(for gssapi/gssapi_ext.h)
1864 AC_TRY_COMPILE([
1865     #include <gssapi/gssapi_ext.h>
1866 ], [
1868     AC_MSG_RESULT(yes)
1869     enable_gss=yes
1870 ], [
1871     AC_MSG_RESULT(no)
1874 AC_MSG_CHECKING(for GSS_SPNEGO_MECHANISM)
1875 AC_TRY_COMPILE([
1876     #include <gssapi/gssapi_ext.h>
1877     #include <gssapi/gssapi_krb5.h>
1878     gss_OID_set_desc gss_mech_spnego_OID_set_desc = {.count = 1, .elements = GSS_SPNEGO_MECHANISM};
1879 ], [
1881     AC_MSG_RESULT(yes)
1882     AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
1883 ], [
1884     AC_MSG_RESULT(no)
1887 AM_CONDITIONAL(ENABLE_GSS, test x$enable_gss = xyes)
1889 # `target_ios=yes` does not detect watch devices and fails when cross-compiling
1890 AC_MONO_APPLE_TARGET(TARGET_OS_IPHONE, [mono_native_platform_ios=yes])
1892 if test x$host_win32 = xno; then
1893         dnl *************************************
1894         dnl *** Checks for time capabilities ***
1895         dnl *************************************
1897         AC_MSG_CHECKING(for CLOCK_MONOTONIC)
1898         AC_TRY_COMPILE([#include <time.h>], [
1899                 const int foo = CLOCK_MONOTONIC;
1900         ],[
1901                 AC_MSG_RESULT(yes)
1902                 AC_DEFINE(HAVE_CLOCK_MONOTONIC, 1, [CLOCK_MONOTONIC])
1903         ], [
1904                 AC_MSG_RESULT(no)
1905         ])
1907         AC_MSG_CHECKING(for CLOCK_MONOTONIC_COARSE)
1908         AC_TRY_COMPILE([#include <time.h>], [
1909                 const int foo = CLOCK_MONOTONIC_COARSE;
1910         ],[
1911                 AC_MSG_RESULT(yes)
1912                 AC_DEFINE(HAVE_CLOCK_MONOTONIC_COARSE, 1, [CLOCK_MONOTONIC_COARSE])
1913         ], [
1914                 AC_MSG_RESULT(no)
1915         ])
1917         AC_MSG_CHECKING(for CLOCK_REALTIME)
1918         AC_TRY_COMPILE([#include <time.h>], [
1919                 const int foo = CLOCK_REALTIME;
1920         ],[
1921                 AC_MSG_RESULT(yes)
1922                 AC_DEFINE(HAVE_CLOCK_REALTIME, 1, [CLOCK_REALTIME])
1923         ], [
1924                 AC_MSG_RESULT(no)
1925         ])
1927         AC_CHECK_FUNC(mach_absolute_time, [AC_DEFINE(HAVE_MACH_ABSOLUTE_TIME, 1, [mach_absolute_time])])
1928         AC_CHECK_FUNC(gethrtime, [AC_DEFINE(HAVE_GETHRTIME, 1, [gethrtime])])
1929         AC_CHECK_FUNC(read_real_time, [AC_DEFINE(HAVE_READ_REAL_TIME, 1, [read_real_time])])
1930         AC_CHECK_FUNC(mach_timebase_info, [AC_DEFINE(HAVE_MACH_TIMEBASE_INFO, 1, [mach_timebase_info])])
1931         AC_CHECK_FUNC(futimes,            [AC_DEFINE(HAVE_FUTIMES, 1, [futimes])])
1932         AC_CHECK_FUNC(futimens,           [AC_DEFINE(HAVE_FUTIMENS, 1, [futimens])])
1934         dnl hires monotonic clock support
1935         AC_SEARCH_LIBS(clock_gettime, rt)
1936         AC_CHECK_FUNCS(clock_nanosleep)
1938         dnl dynamic loader support
1939         AC_CHECK_FUNC(dlopen, DL_LIB="",
1940                 AC_CHECK_LIB(dl, dlopen, DL_LIB="-ldl", dl_support=no)
1941         )
1942         if test x$dl_support = xno; then
1943                 AC_MSG_WARN([No dynamic loading support available])
1944         else
1945                 LIBS="$LIBS $DL_LIB"
1946                 AC_DEFINE(HAVE_DL_LOADER,1,[dlopen-based dynamic loader available])
1947                 dnl from glib's configure.ac
1948                 AC_CACHE_CHECK([for preceeding underscore in symbols],
1949                         mono_cv_uscore,[
1950                         AC_TRY_RUN([#include <dlfcn.h>
1951                         int mono_underscore_test (void) { return 42; }
1952                         int main() {
1953                           void *f1 = (void*)0, *f2 = (void*)0, *handle;
1954                           handle = dlopen ((void*)0, 0);
1955                           if (handle) {
1956                             f1 = dlsym (handle, "mono_underscore_test");
1957                             f2 = dlsym (handle, "_mono_underscore_test");
1958                           } return (!f2 || f1);
1959                         }],
1960                                 [mono_cv_uscore=yes],
1961                                 [mono_cv_uscore=no],
1962                         [])
1963                 ])
1964                 if test "x$mono_cv_uscore" = "xyes"; then
1965                         MONO_DL_NEED_USCORE=1
1966                 else
1967                         MONO_DL_NEED_USCORE=0
1968                 fi
1969                 AC_SUBST(MONO_DL_NEED_USCORE)
1970                 AC_CHECK_FUNC(dlerror)
1971         fi
1973         dnl ******************************************************************
1974         dnl *** Checks for the IKVM JNI interface library                  ***
1975         dnl ******************************************************************
1976         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])
1978         ikvm_native_dir=
1979         if test x$with_ikvm_native = xyes; then
1980                 ikvm_native_dir=ikvm-native
1981                 jdk_headers_found="IKVM Native"
1982         fi
1984         AC_SUBST(ikvm_native_dir)
1986         AC_CHECK_HEADERS(execinfo.h)
1988         AC_CHECK_HEADERS(sys/auxv.h sys/resource.h)
1990         AC_CHECK_FUNCS(getgrgid_r)
1991         AC_CHECK_FUNCS(getgrnam_r)
1992         AC_CHECK_FUNCS(getresuid)
1993         AC_CHECK_FUNCS(setresuid)
1994         AC_CHECK_FUNCS(kqueue)
1995         AC_CHECK_FUNCS(backtrace_symbols)
1996         AC_CHECK_FUNCS(mkstemp)
1997         AC_CHECK_FUNCS(mmap)
1998         AC_CHECK_FUNCS(madvise)
1999         AC_CHECK_FUNCS(getrusage)
2000         AC_CHECK_FUNCS(getpriority)
2001         AC_CHECK_FUNCS(setpriority)
2002         AC_CHECK_FUNCS(dl_iterate_phdr)
2003         AC_CHECK_FUNCS(dladdr)
2004         AC_CHECK_FUNCS(sysconf)
2005         AC_CHECK_FUNCS(getrlimit)
2006         AC_CHECK_FUNCS(prctl)
2007         AC_CHECK_FUNCS(arc4random)
2008         AC_CHECK_FUNCS(nl_langinfo)
2010         AC_CHECK_FUNCS(sched_getaffinity)
2011         AC_CHECK_FUNCS(sched_setaffinity)
2012         AC_CHECK_FUNCS(sched_getcpu)
2014         if test x$platform_android != xyes; then
2015                 AC_CHECK_FUNCS(getpwnam_r)
2016                 AC_CHECK_FUNCS(getpwuid_r)
2017         fi
2019         AC_FUNC_STRERROR_R()
2021         dnl ****************************************************************
2022         dnl *** Check for sched_setaffinity from glibc versions before   ***
2023         dnl *** 2.3.4. The older versions of the function only take 2    ***
2024         dnl *** parameters, not 3.                                       ***
2025         dnl ***                                                          ***
2026         dnl *** Because the interface change was not made in a minor     ***
2027         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
2028         dnl *** won't always indicate the interface sched_affinity has.  ***
2029         dnl ****************************************************************
2030         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
2031         AC_TRY_COMPILE([#include <sched.h>], [
2032             int mask = 1; 
2033             sched_setaffinity(0, &mask);
2034         ], [
2035                 # Yes, we have it...
2036                 AC_MSG_RESULT(yes)
2037                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
2038         ], [
2039                 # We have the new, three-parameter version
2040                 AC_MSG_RESULT(no)
2041         ])
2042         AC_TRY_COMPILE([#include <sched.h>], [
2043              CPU_COUNT((void *) 0);
2044         ], [
2045                 AC_MSG_RESULT(yes)
2046                 AC_DEFINE(GLIBC_HAS_CPU_COUNT, 1, [GLIBC has CPU_COUNT macro in sched.h])
2047         ], [
2048                 # We have the new, three-parameter version
2049                 AC_MSG_RESULT(no)
2050         ])
2052         dnl ******************************************************************
2053         dnl *** Check for large file support                               ***
2054         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
2055         dnl ******************************************************************
2056         
2057         # Check that off_t can represent 2**63 - 1 correctly, working around
2058         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
2059         # CPPFLAGS and sets $large_offt to yes if the test succeeds
2060         large_offt=no
2061         AC_DEFUN([LARGE_FILES], [
2062                 large_CPPFLAGS=$CPPFLAGS
2063                 CPPFLAGS="$CPPFLAGS $1"
2064                 AC_TRY_COMPILE([
2065                         #include <sys/types.h>
2066                         #include <limits.h>
2067                 ], [
2068                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
2069                         #define COMPILE_TIME_ASSERT(pred) \
2070                                 switch(0){case 0:case pred:;}
2071                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
2072                 ], [
2073                         AC_MSG_RESULT(ok)
2074                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
2075                         large_CPPFLAGS="$large_CPPFLAGS $1"
2076                         large_offt=yes
2077                 ], [
2078                         AC_MSG_RESULT(no)
2079                 ])
2080                 CPPFLAGS=$large_CPPFLAGS
2081         ])
2083         AC_MSG_CHECKING(if off_t is 64 bits wide)
2084         LARGE_FILES("")
2085         if test $large_offt = no; then
2086                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
2087                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
2088         fi
2089         if test $large_offt = no; then
2090                 AC_MSG_WARN([No 64 bit file size support available])
2091         fi
2092         
2093         dnl *****************************
2094         dnl *** Checks for libsocket  ***
2095         dnl *****************************
2096         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
2098         case "$host" in
2099                 *-*-*freebsd*)
2100                         dnl *****************************
2101                         dnl *** Checks for libinotify ***
2102                         dnl *****************************
2103                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
2104         esac
2106         dnl *******************************
2107         dnl *** Checks for MSG_NOSIGNAL ***
2108         dnl *******************************
2109         AC_MSG_CHECKING(for MSG_NOSIGNAL)
2110         AC_TRY_COMPILE([#include <sys/socket.h>], [
2111                 int f = MSG_NOSIGNAL;
2112         ], [
2113                 # Yes, we have it...
2114                 AC_MSG_RESULT(yes)
2115                 AC_DEFINE(HAVE_MSG_NOSIGNAL, 1, [Have MSG_NOSIGNAL])
2116         ], [
2117                 # We'll have to use signals
2118                 AC_MSG_RESULT(no)
2119         ])
2121         dnl *****************************
2122         dnl *** Checks for IPPROTO_IP ***
2123         dnl *****************************
2124         AC_MSG_CHECKING(for IPPROTO_IP)
2125         AC_TRY_COMPILE([#include <netinet/in.h>], [
2126                 int level = IPPROTO_IP;
2127         ], [
2128                 # Yes, we have it...
2129                 AC_MSG_RESULT(yes)
2130                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
2131         ], [
2132                 # We'll have to use getprotobyname
2133                 AC_MSG_RESULT(no)
2134         ])
2136         dnl *******************************
2137         dnl *** Checks for IPPROTO_IPV6 ***
2138         dnl *******************************
2139         AC_MSG_CHECKING(for IPPROTO_IPV6)
2140         AC_TRY_COMPILE([#include <netinet/in.h>], [
2141                 int level = IPPROTO_IPV6;
2142         ], [
2143                 # Yes, we have it...
2144                 AC_MSG_RESULT(yes)
2145                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
2146         ], [
2147                 # We'll have to use getprotobyname
2148                 AC_MSG_RESULT(no)
2149         ])
2151         dnl ******************************
2152         dnl *** Checks for IPPROTO_TCP ***
2153         dnl ******************************
2154         AC_MSG_CHECKING(for IPPROTO_TCP)
2155         AC_TRY_COMPILE([#include <netinet/in.h>], [
2156                 int level = IPPROTO_TCP;
2157         ], [
2158                 # Yes, we have it...
2159                 AC_MSG_RESULT(yes)
2160                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
2161         ], [
2162                 # We'll have to use getprotobyname
2163                 AC_MSG_RESULT(no)
2164         ])
2166         dnl *****************************
2167         dnl *** Checks for SOL_IP     ***
2168         dnl *****************************
2169         AC_MSG_CHECKING(for SOL_IP)
2170         AC_TRY_COMPILE([#include <netdb.h>], [
2171                 int level = SOL_IP;
2172         ], [
2173                 # Yes, we have it...
2174                 AC_MSG_RESULT(yes)
2175                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
2176         ], [
2177                 # We'll have to use getprotobyname
2178                 AC_MSG_RESULT(no)
2179         ])
2181         dnl *****************************
2182         dnl *** Checks for SOL_IPV6     ***
2183         dnl *****************************
2184         AC_MSG_CHECKING(for SOL_IPV6)
2185         AC_TRY_COMPILE([#include <netdb.h>], [
2186                 int level = SOL_IPV6;
2187         ], [
2188                 # Yes, we have it...
2189                 AC_MSG_RESULT(yes)
2190                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
2191         ], [
2192                 # We'll have to use getprotobyname
2193                 AC_MSG_RESULT(no)
2194         ])
2196         dnl *****************************
2197         dnl *** Checks for SOL_TCP    ***
2198         dnl *****************************
2199         AC_MSG_CHECKING(for SOL_TCP)
2200         AC_TRY_COMPILE([#include <netdb.h>], [
2201                 int level = SOL_TCP;
2202         ], [
2203                 # Yes, we have it...
2204                 AC_MSG_RESULT(yes)
2205                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
2206         ], [
2207                 # We'll have to use getprotobyname
2208                 AC_MSG_RESULT(no)
2209         ])
2211         dnl *****************************
2212         dnl *** Checks for IP_PKTINFO ***
2213         dnl *****************************
2214         AC_MSG_CHECKING(for IP_PKTINFO)
2215         AC_TRY_COMPILE([#include <linux/in.h>], [
2216                 int level = IP_PKTINFO;
2217         ], [
2218                 # Yes, we have it...
2219                 AC_MSG_RESULT(yes)
2220                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
2221         ], [
2222                 AC_MSG_RESULT(no)
2223         ])
2225         dnl *****************************
2226         dnl *** Checks for IPV6_PKTINFO ***
2227         dnl *****************************
2228         AC_MSG_CHECKING(for IPV6_PKTINFO)
2229         AC_TRY_COMPILE([#include <netdb.h>], [
2230                 int level = IPV6_PKTINFO;
2231         ], [
2232                 # Yes, we have it...
2233                 AC_MSG_RESULT(yes)
2234                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
2235         ], [
2236                 AC_MSG_RESULT(no)
2237         ])
2239         dnl **********************************
2240         dnl *** Checks for IP_DONTFRAG     ***
2241         dnl **********************************
2242         AC_MSG_CHECKING(for IP_DONTFRAG)
2243         AC_TRY_COMPILE([#include <netinet/in.h>], [
2244                 int level = IP_DONTFRAG;
2245         ], [
2246                 # Yes, we have it...
2247                 AC_MSG_RESULT(yes)
2248                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
2249         ], [
2250                 AC_MSG_RESULT(no)
2251         ])
2253         dnl **********************************
2254         dnl *** Checks for IP_DONTFRAGMENT ***
2255         dnl **********************************
2256         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
2257         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
2258                 int level = IP_DONTFRAGMENT;
2259         ], [
2260                 # Yes, we have it...
2261                 AC_MSG_RESULT(yes)
2262                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
2263         ], [
2264                 AC_MSG_RESULT(no)
2265         ])
2267         dnl **********************************
2268         dnl *** Checks for IP_MTU_DISCOVER ***
2269         dnl **********************************
2270         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
2271         AC_TRY_COMPILE([#include <linux/in.h>], [
2272                 int level = IP_MTU_DISCOVER;
2273         ], [
2274                 # Yes, we have it...
2275                 AC_MSG_RESULT(yes)
2276                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
2277         ], [
2278                 AC_MSG_RESULT(no)
2279         ])
2281         dnl **********************************
2282         dnl *** Checks for  IP_PMTUDISC_DO ***
2283         dnl **********************************
2284         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
2285         AC_TRY_COMPILE([#include <linux/in.h>], [
2286                 int level = IP_PMTUDISC_DO;
2287         ], [
2288                 # Yes, we have it...
2289                 AC_MSG_RESULT(yes)
2290                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
2291         ], [
2292                 AC_MSG_RESULT(no)
2293         ])
2295         dnl *********************************
2296         dnl *** Check for struct ip_mreqn ***
2297         dnl *********************************
2298         AC_MSG_CHECKING(for struct ip_mreqn)
2299         AC_TRY_COMPILE([#include <netinet/in.h>], [
2300                 struct ip_mreqn mreq;
2301                 mreq.imr_address.s_addr = 0;
2302         ], [
2303                 # Yes, we have it...
2304                 AC_MSG_RESULT(yes)
2305                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
2306         ], [
2307                 # We'll just have to try and use struct ip_mreq
2308                 AC_MSG_RESULT(no)
2309                 AC_MSG_CHECKING(for struct ip_mreq)
2310                 AC_TRY_COMPILE([#include <netinet/in.h>], [
2311                         struct ip_mreq mreq;
2312                         mreq.imr_interface.s_addr = 0;
2313                 ], [
2314                         # Yes, we have it...
2315                         AC_MSG_RESULT(yes)
2316                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
2317                 ], [
2318                         # No multicast support
2319                         AC_MSG_RESULT(no)
2320                 ])
2321         ])
2322         
2323         dnl **********************************
2324         dnl *** Check for getaddrinfo ***
2325         dnl **********************************
2326         AC_MSG_CHECKING(for getaddrinfo)
2327                 AC_TRY_LINK([
2328                 #include <stdio.h>
2329                 #include <netdb.h>
2330         ], [
2331                 getaddrinfo(NULL,NULL,NULL,NULL);
2332         ], [
2333                 # Yes, we have it...
2334                 AC_MSG_RESULT(yes)
2335                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2336         ], [
2337                 AC_MSG_RESULT(no)
2338         ])
2340         dnl **********************************
2341         dnl *** Check for gethostbyname2_r ***
2342         dnl **********************************
2343         AC_MSG_CHECKING(for gethostbyname2_r)
2344                 AC_TRY_LINK([
2345                 #include <stdio.h>
2346                 #include <netdb.h>
2347         ], [
2349                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
2350         ], [
2351                 # Yes, we have it...
2352                 AC_MSG_RESULT(yes)
2353                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
2354         ], [
2355                 AC_MSG_RESULT(no)
2356         ])
2358         dnl **********************************
2359         dnl *** Check for gethostbyname2 ***
2360         dnl **********************************
2361         AC_MSG_CHECKING(for gethostbyname2)
2362                 AC_TRY_LINK([
2363                 #include <stdio.h>
2364                 #include <netdb.h>
2365         ], [
2366                 gethostbyname2(NULL,0);
2367         ], [
2368                 # Yes, we have it...
2369                 AC_MSG_RESULT(yes)
2370                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
2371         ], [
2372                 AC_MSG_RESULT(no)
2373         ])
2375         dnl **********************************
2376         dnl *** Check for gethostbyname ***
2377         dnl **********************************
2378         AC_MSG_CHECKING(for gethostbyname)
2379                 AC_TRY_LINK([
2380                 #include <stdio.h>
2381                 #include <netdb.h>
2382         ], [
2383                 gethostbyname(NULL);
2384         ], [
2385                 # Yes, we have it...
2386                 AC_MSG_RESULT(yes)
2387                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2388         ], [
2389                 AC_MSG_RESULT(no)
2390         ])
2392         dnl **********************************
2393         dnl *** Check for getprotobyname ***
2394         dnl **********************************
2395         AC_MSG_CHECKING(for getprotobyname)
2396                 AC_TRY_LINK([
2397                 #include <stdio.h>
2398                 #include <netdb.h>
2399         ], [
2400                 getprotobyname(NULL);
2401         ], [
2402                 # Yes, we have it...
2403                 AC_MSG_RESULT(yes)
2404                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2405         ], [
2406                 AC_MSG_RESULT(no)
2407         ])
2409         dnl **********************************
2410         dnl *** Check for getprotobyname_r ***
2411         dnl **********************************
2412         AC_MSG_CHECKING(for getprotobyname_r)
2413                 AC_TRY_LINK([
2414                 #include <stdio.h>
2415                 #include <netdb.h>
2416         ], [
2417                 getprotobyname_r(NULL, NULL, NULL, 0, NULL);
2418         ], [
2419                 # Yes, we have it...
2420                 AC_MSG_RESULT(yes)
2421                 AC_DEFINE(HAVE_GETPROTOBYNAME_R, 1, [Have getprotobyname_r])
2422         ], [
2423                 AC_MSG_RESULT(no)
2424         ])
2426         dnl **********************************
2427         dnl *** Check for getnameinfo ***
2428         dnl **********************************
2429         AC_MSG_CHECKING(for getnameinfo)
2430                 AC_TRY_LINK([
2431                 #include <stdio.h>
2432                 #include <netdb.h>
2433         ], [
2434                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2435         ], [
2436                 # Yes, we have it...
2437                 AC_MSG_RESULT(yes)
2438                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2439         ], [
2440                 AC_MSG_RESULT(no)
2441         ])
2444         dnl **********************************
2445         dnl *** Check for inet_ntop ***
2446         dnl **********************************
2447         AC_MSG_CHECKING(for inet_ntop)
2448                 AC_TRY_LINK([
2449                 #include <stdio.h>
2450                 #include <arpa/inet.h>
2451         ], [
2452                 inet_ntop (0, NULL, NULL, 0);
2453         ], [
2454                 # Yes, we have it...
2455                 AC_MSG_RESULT(yes)
2456                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2457         ], [
2458                 AC_MSG_RESULT(no)
2459         ])
2461         dnl *****************************
2462         dnl *** Checks for libnsl     ***
2463         dnl *****************************
2464         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
2466         AC_CHECK_FUNCS(inet_pton inet_aton)
2468         dnl *****************************
2469         dnl *** Checks for libxnet    ***
2470         dnl *****************************
2471         case "${host}" in
2472                 *solaris* )
2473                         AC_MSG_CHECKING(for Solaris XPG4 support)
2474                         if test -f /usr/lib/libxnet.so; then
2475                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
2476                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
2477                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
2478                                 LIBS="$LIBS -lxnet"
2479                                 AC_MSG_RESULT(yes)
2480                         else
2481                                 AC_MSG_RESULT(no)
2482                         fi
2484                         if test "$GCC" = "yes"; then
2485                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
2486                         fi
2487                 ;;
2488         esac
2490         dnl *****************************
2491         dnl *** Checks for libpthread ***
2492         dnl *****************************
2493 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
2494 # and libpthread does not exist
2496         case "${host}" in
2497                 *-*-*haiku*)
2498                         dnl Haiku has pthread in libroot (libc equiv)
2499                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS")
2500                 ;;
2501                 *-*-*freebsd*)
2502                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2503                 ;;
2504                 *-*-*openbsd*)
2505                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2506                 ;;
2507                 *)
2508                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
2509                 ;;
2510         esac
2511         AC_CHECK_HEADERS(pthread.h)
2512         AC_CHECK_HEADERS(pthread_np.h)
2513         AC_CHECK_FUNCS(pthread_mutex_timedlock)
2514         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_getname_np pthread_setname_np pthread_cond_timedwait_relative_np)
2515         AC_CHECK_FUNCS(pthread_kill)
2516         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
2517         AC_TRY_COMPILE([ #include <pthread.h>], [
2518                 pthread_mutexattr_t attr;
2519                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
2520         ], [
2521                 AC_MSG_RESULT(ok)
2522         ], [
2523                 AC_MSG_RESULT(no)
2524                 AC_ERROR(Posix system lacks support for recursive mutexes)
2525         ])
2526         AC_CHECK_FUNCS(pthread_attr_setstacksize)
2527         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
2528         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
2529         AC_CHECK_FUNCS(mincore mlock munlock)
2531         dnl ***********************************
2532         dnl *** Checks for working __thread ***
2533         dnl ***********************************
2534         AC_MSG_CHECKING(for working __thread)
2535         if test "x$with_tls" != "x__thread"; then
2536                 AC_MSG_RESULT(disabled)
2537         elif test "x$cross_compiling" = "xyes"; then
2538                 AC_MSG_RESULT(cross compiling, assuming yes)
2539         else
2540                 AC_TRY_RUN([
2541                         #if defined(__APPLE__) && defined(__clang__)
2542                         #error "__thread does not currently work with clang on Mac OS X"
2543                         #endif
2544                         
2545                         #include <pthread.h>
2546                         __thread int i;
2547                         static int res1, res2;
2549                         void thread_main (void *arg)
2550                         {
2551                                 i = arg;
2552                                 sleep (1);
2553                                 if (arg == 1)
2554                                         res1 = (i == arg);
2555                                 else
2556                                         res2 = (i == arg);
2557                         }
2559                         int main () {
2560                                 pthread_t t1, t2;
2562                                 i = 5;
2564                                 pthread_create (&t1, NULL, thread_main, 1);
2565                                 pthread_create (&t2, NULL, thread_main, 2);
2567                                 pthread_join (t1, NULL);
2568                                 pthread_join (t2, NULL);
2570                                 return !(res1 + res2 == 2);
2571                         }
2572                 ], [
2573                                 AC_MSG_RESULT(yes)
2574                 ], [
2575                                 AC_MSG_RESULT(no)
2576                                 with_tls=pthread
2577                 ])
2578         fi
2580         dnl **************************************
2581         dnl *** Checks for working sigaltstack ***
2582         dnl **************************************
2583         AC_MSG_CHECKING(for working sigaltstack)
2584         if test "x$with_sigaltstack" != "xyes"; then
2585                 AC_MSG_RESULT(disabled)
2586         elif test "x$cross_compiling" = "xyes"; then
2587                 AC_MSG_RESULT(cross compiling, assuming yes)
2588         else
2589                 AC_TRY_RUN([
2590                         #include <stdio.h>
2591                         #include <stdlib.h>
2592                         #include <unistd.h>
2593                         #include <signal.h>
2594                         #include <pthread.h>
2595                         #include <sys/wait.h>
2596                         #if defined(__FreeBSD__) || defined(__NetBSD__)
2597                         #define SA_STACK SA_ONSTACK
2598                         #endif
2599                         static void
2600                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
2601                         {
2602                                 exit (0);
2603                         }
2605                         volatile char*__ptr = NULL;
2606                         static void *
2607                         loop (void *ignored)
2608                         {
2609                                 *__ptr = 0;
2610                                 return NULL;
2611                         }
2613                         static void
2614                         child ()
2615                         {
2616                                 struct sigaction sa;
2617                                 stack_t sas;
2618                                 pthread_t id;
2619                                 pthread_attr_t attr;
2621                                 sa.sa_sigaction = sigsegv_signal_handler;
2622                                 sigemptyset (&sa.sa_mask);
2623                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
2624                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
2625                                         perror ("sigaction");
2626                                         return;
2627                                 }
2629                                 /* x86 darwin deliver segfaults using SIGBUS */
2630                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
2631                                         perror ("sigaction");
2632                                         return;
2633                                 }
2634                                 sas.ss_sp = malloc (SIGSTKSZ);
2635                                 sas.ss_size = SIGSTKSZ;
2636                                 sas.ss_flags = 0;
2637                                 if (sigaltstack (&sas, NULL) == -1) {
2638                                         perror ("sigaltstack");
2639                                         return;
2640                                 }
2642                                 pthread_attr_init (&attr);
2643                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
2644                                         printf ("pthread_create\n");
2645                                         return;
2646                                 }
2648                                 sleep (100);
2649                         }
2651                         int
2652                         main ()
2653                         {
2654                                 pid_t son;
2655                                 int status;
2656                                 int i;
2658                                 son = fork ();
2659                                 if (son == -1) {
2660                                         return 1;
2661                                 }
2663                                 if (son == 0) {
2664                                         child ();
2665                                         return 0;
2666                                 }
2668                                 for (i = 0; i < 300; ++i) {
2669                                         waitpid (son, &status, WNOHANG);
2670                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
2671                                                 return 0;
2672                                         usleep (10000);
2673                                 }
2675                                 kill (son, SIGKILL);
2676                                 return 1;
2677                         }
2679                 ], [
2680                                 AC_MSG_RESULT(yes)
2681                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
2682                 ], [
2683                                 with_sigaltstack=no
2684                                 AC_MSG_RESULT(no)
2685                 ])
2686         fi
2688         dnl ********************************
2689         dnl *** Checks for semaphore lib ***
2690         dnl ********************************
2691         # 'Real Time' functions on Solaris
2692         # posix4 on Solaris 2.6
2693         # pthread (first!) on Linux
2694         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
2696         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
2697         AC_CHECK_FUNCS(shm_open)
2699         dnl ********************************
2700         dnl *** Checks for timezone stuff **
2701         dnl ********************************
2702         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
2703                 AC_TRY_COMPILE([
2704                         #include <time.h>
2705                         ], [
2706                         struct tm tm;
2707                         tm.tm_gmtoff = 1;
2708                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
2709         if test $ac_cv_struct_tm_gmtoff = yes; then
2710                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
2711         else
2712                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
2713                         AC_TRY_COMPILE([
2714                                 #include <time.h>
2715                         ], [
2716                                 timezone = 1;
2717                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
2718                 if test $ac_cv_var_timezone = yes; then
2719                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
2720                 else
2721                         AC_ERROR(unable to find a way to determine timezone)
2722                 fi
2723         fi
2725         dnl *********************************
2726         dnl *** Checks for math functions ***
2727         dnl *********************************
2728         AC_SEARCH_LIBS(sqrtf, m)
2730         dnl ****************************************************************
2731         dnl *** Checks for working poll() (macosx defines it but doesn't ***
2732         dnl *** have it in the library (duh))                            ***
2733         dnl ****************************************************************
2734         AC_CHECK_FUNCS(poll)
2736         dnl **********************************
2737         dnl *** epoll                      ***
2738         dnl **********************************
2739         AC_CHECK_HEADERS(sys/epoll.h)
2740         haveepoll=no
2741         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
2742         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
2743                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
2744         fi
2746         havekqueue=no
2748         AC_CHECK_HEADERS(sys/event.h)
2749         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
2751         dnl **************************************
2752         dnl * Darwin has a race that prevents us from using reliably:
2753         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
2754         dnl * Since kqueue is mostly used for scaling large web servers, 
2755         dnl * and very few folks run Mono on large web servers on OSX, falling
2756         dnl * back 
2757         dnl **************************************
2758         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
2759                 if test "x$host_darwin" = "xno"; then
2760                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
2761                 fi
2762         fi
2764         dnl ******************************
2765         dnl *** Checks for SIOCGIFCONF ***
2766         dnl ******************************
2767         AC_CHECK_HEADERS(sys/ioctl.h)
2768         AC_CHECK_HEADERS(net/if.h, [], [],
2769            [
2770            #ifdef HAVE_SYS_TYPES_H
2771            # include <sys/types.h>
2772            #endif
2773            #ifdef HAVE_SYS_SOCKET_H
2774            # include <sys/socket.h>
2775            #endif
2776            ])
2777         AC_MSG_CHECKING(for ifreq)
2778         AC_TRY_COMPILE([
2779                 #include <stdio.h>
2780                 #include <sys/ioctl.h>
2781                 #include <net/if.h>
2782                 ], [
2783                 struct ifconf ifc;
2784                 struct ifreq *ifr;
2785                 void *x;
2786                 ifc.ifc_len = 0;
2787                 ifc.ifc_buf = NULL;
2788                 x = (void *) &ifr->ifr_addr;
2789                 ],[
2790                         AC_MSG_RESULT(yes)
2791                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
2792                 ], [
2793                         AC_MSG_RESULT(no)
2794                 ])
2795         dnl **********************************
2796         dnl ***     Checks for sin_len     ***
2797         dnl **********************************
2798         AC_MSG_CHECKING(for sockaddr_in.sin_len)
2799         AC_TRY_COMPILE([
2800                 #include <netinet/in.h>
2801                 ], [
2802                 struct sockaddr_in saddr;
2803                 saddr.sin_len = sizeof (saddr);
2804                 ],[
2805                         AC_MSG_RESULT(yes)
2806                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
2807                 ], [
2808                         AC_MSG_RESULT(no)
2809                 ])      
2810         dnl **********************************
2811         dnl ***    Checks for sin6_len     ***
2812         dnl **********************************
2813         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
2814         AC_TRY_COMPILE([
2815                 #include <netinet/in.h>
2816                 ], [
2817                 struct sockaddr_in6 saddr6;
2818                 saddr6.sin6_len = sizeof (saddr6);
2819                 ],[
2820                         AC_MSG_RESULT(yes)
2821                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
2822                 ], [
2823                         AC_MSG_RESULT(no)
2824                 ])
2825         dnl **********************************
2826         dnl *** Check for getifaddrs       ***
2827         dnl **********************************
2828         AC_MSG_CHECKING(for getifaddrs)
2829                 AC_TRY_LINK([
2830                 #include <stdio.h>
2831                 #include <sys/types.h>
2832                 #include <sys/socket.h>
2833                 #include <ifaddrs.h>
2834         ], [
2835                 getifaddrs(NULL);
2836         ], [
2837                 # Yes, we have it...
2838                 AC_MSG_RESULT(yes)
2839                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
2840         ], [
2841                 AC_MSG_RESULT(no)
2842         ])
2843         dnl **********************************
2844         dnl *** Check for if_nametoindex   ***
2845         dnl **********************************
2846         AC_MSG_CHECKING(for if_nametoindex)
2847                 AC_TRY_LINK([
2848                 #include <stdio.h>
2849                 #include <sys/types.h>
2850                 #include <sys/socket.h>
2851                 #include <net/if.h>
2852         ], [
2853                 if_nametoindex(NULL);
2854         ], [
2855                 # Yes, we have it...
2856                 AC_MSG_RESULT(yes)
2857                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
2858         ], [
2859                 AC_MSG_RESULT(no)
2860         ])
2861         dnl **********************************
2862         dnl *** Check for access ***
2863         dnl **********************************
2864         AC_MSG_CHECKING(for access)
2865                 AC_TRY_LINK([
2866                 #include <unistd.h>
2867         ], [
2868                 access(NULL,0);
2869         ], [
2870                 # Yes, we have it...
2871                 AC_MSG_RESULT(yes)
2872                 AC_DEFINE(HAVE_ACCESS, 1, [Have access])
2873         ], [
2874                 AC_MSG_RESULT(no)
2875         ])
2876                         
2877         dnl **********************************
2878         dnl *** Checks for proclib         ***
2879         dnl **********************************
2880         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.)])
2881         dnl **********************************
2882         dnl *** Checks for MonoPosixHelper ***
2883         dnl **********************************
2884         AC_CHECK_HEADERS(checklist.h)
2885         AC_CHECK_HEADERS(pathconf.h)
2886         AC_CHECK_HEADERS(fstab.h)
2887         AC_CHECK_HEADERS(attr/xattr.h)
2888         AC_CHECK_HEADERS(sys/extattr.h)
2889         AC_CHECK_HEADERS(sys/sendfile.h)
2890         AC_CHECK_HEADERS(sys/statvfs.h)
2891         AC_CHECK_HEADERS(sys/statfs.h)
2892         AC_CHECK_HEADERS(sys/vfstab.h)
2893         AC_CHECK_HEADERS(sys/xattr.h)
2894         AC_CHECK_HEADERS(sys/mman.h)
2895         AC_CHECK_HEADERS(sys/param.h)
2896         AC_CHECK_HEADERS(sys/mount.h, [], [],
2897                 [
2898                 #ifdef HAVE_SYS_PARAM_H
2899                 # include <sys/param.h>
2900                 #endif
2901                 ])
2902         AC_CHECK_HEADERS(sys/mount.h)
2903         AC_CHECK_FUNCS(confstr)
2904         AC_CHECK_FUNCS(seekdir telldir)
2905         AC_CHECK_FUNCS(getdomainname)
2906         AC_CHECK_FUNCS(setdomainname)
2907         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
2908         AC_CHECK_FUNCS(setgroups)
2909         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
2910         AC_CHECK_FUNCS(getfsstat)
2911         AC_CHECK_FUNCS(lutimes futimes)
2912         AC_CHECK_FUNCS(mremap)
2913         AC_CHECK_FUNCS(remap_file_pages)
2914         AC_CHECK_FUNCS(posix_fadvise)
2915         AC_CHECK_FUNCS(posix_fallocate)
2916         AC_CHECK_FUNCS(posix_madvise)
2917         AC_CHECK_FUNCS(vsnprintf)
2918         AC_CHECK_FUNCS(sendfile)
2919         AC_CHECK_FUNCS(gethostid sethostid)
2920         AC_CHECK_FUNCS(sethostname)
2921         AC_CHECK_FUNCS(statfs)
2922         AC_CHECK_FUNCS(fstatfs)
2923         AC_CHECK_FUNCS(statvfs)
2924         AC_CHECK_FUNCS(fstatvfs)
2925         AC_CHECK_FUNCS(stime)
2926         AC_CHECK_FUNCS(ttyname_r)
2927         AC_CHECK_FUNCS(psignal)
2928         AC_CHECK_FUNCS(getlogin_r)
2929         AC_CHECK_FUNCS(lockf)
2930         AC_CHECK_FUNCS(swab)
2931         AC_CHECK_FUNCS(setusershell endusershell)
2932         AC_CHECK_FUNCS(futimens utimensat)
2933         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
2934         AC_CHECK_FUNCS(readv writev preadv pwritev)
2935         AC_CHECK_FUNCS(setpgid)
2936         AC_CHECK_FUNCS(system)
2937         AC_CHECK_FUNCS(fork execv execve)
2938         AC_CHECK_FUNCS(waitpid)
2939         AC_CHECK_FUNCS(accept4)
2940         AC_CHECK_FUNCS(localtime_r)
2941         AC_CHECK_FUNCS(mkdtemp)
2942         AC_CHECK_SIZEOF(size_t)
2943         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
2944                 [#include <sys/types.h>
2945                  #include <sys/stat.h>
2946                  #include <unistd.h>])
2947         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
2948                 [#include <sys/types.h>
2949                  #include <sys/stat.h>
2950                  #include <unistd.h>])
2951         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
2952                 [#include <sys/time.h>])
2953         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
2954                 [#include <sys/socket.h>])
2955         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
2956                 [#include <unistd.h>
2957                  #include <fcntl.h>])
2958         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
2959                 [#include <sys/uio.h>])
2960         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
2961                 [#include <sys/socket.h>])
2962         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
2963                 [#include <sys/poll.h>])
2964         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
2965                 [#include <sys/socket.h>])
2966         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
2967                 [#include <sys/socket.h>])
2968         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
2969                 [#include <netinet/in.h>])
2970         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
2971                 [#include <netinet/in.h>])
2972         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
2973                 [#include <sys/un.h>])
2974         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
2975                 [#include <sys/types.h>
2976                  #include <sys/stat.h>
2977                  #include <unistd.h>])
2978         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
2979                 [#include <time.h>])
2980         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
2981                 [#include <sys/time.h>
2982                  #include <sys/types.h>
2983                  #include <utime.h>])
2984         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
2985                 [#include <sys/time.h>])
2986         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
2987                 [#include <sys/types.h>
2988                  #include <utime.h>])
2989         AC_CHECK_MEMBERS(
2990                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
2991                 [#include <sys/types.h>
2992                  #include <dirent.h>])
2993         AC_CHECK_MEMBERS(
2994                 [struct passwd.pw_gecos],,, 
2995                 [#include <sys/types.h>
2996                  #include <pwd.h>])
2997         AC_CHECK_MEMBERS(
2998                 [struct statfs.f_flags],,, 
2999                 [#include <sys/types.h>
3000                  #include <sys/vfs.h>])
3001         AC_CHECK_MEMBERS(
3002                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
3003                 [#include <sys/types.h>
3004                  #include <sys/stat.h>
3005                  #include <unistd.h>])
3007         dnl Favour xattr through glibc, but use libattr if we have to
3008         AC_CHECK_FUNC(lsetxattr, ,
3009                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
3010         )
3011         AC_SUBST(XATTR_LIB)
3013         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
3014         AC_CHECK_MEMBERS(
3015                 [struct kinfo_proc.kp_proc],,, 
3016                 [#include <sys/types.h>
3017                  #include <sys/param.h>
3018                  #include <sys/sysctl.h>
3019                  #include <sys/proc.h>
3020                  ])
3022         dnl *********************************
3023         dnl *** Checks for Windows compilation ***
3024         dnl *********************************
3025         AC_CHECK_HEADERS(sys/time.h)
3026         AC_CHECK_HEADERS(sys/param.h)
3027         AC_CHECK_HEADERS(dirent.h)
3029         dnl ******************************************
3030         dnl *** Checks for OSX and iOS compilation ***
3031         dnl ******************************************
3032         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
3034         dnl *********************************
3035         dnl *** Check for Console 2.0 I/O ***
3036         dnl *********************************
3037         AC_CHECK_HEADERS([curses.h])
3038         AC_CHECK_HEADERS([term.h], [], [],
3039         [#if HAVE_CURSES_H
3040          #include <curses.h>
3041          #endif
3042         ])
3043         AC_CHECK_HEADERS([termios.h])
3045         dnl *********************************
3046         dnl *** Checks for random         ***
3047         dnl *********************************
3048         if test x$host_darwin = xno; then
3049                 AC_CHECK_HEADERS(sys/random.h)
3050                 AC_CHECK_FUNCS(getrandom getentropy)
3051         fi
3053         dnl *********************************
3054         dnl *** Checks for Mono.Native  ***
3055         dnl *********************************
3057         AC_MSG_CHECKING(for linux/in.h)
3058         AC_TRY_COMPILE([
3059                 #include <sys/socket.h>
3060                 #include <linux/in.h>
3061         ], [
3062         ],[
3063                 AC_MSG_RESULT(yes)
3064                 AC_DEFINE(HAVE_LINUX_IN_H, 1, [linux/in.h])
3065         ], [
3066                 AC_MSG_RESULT(no)
3067         ])
3069         AC_CHECK_HEADERS([linux/if_packet.h])
3071         AC_MSG_CHECKING(for struct in_pktinfo)
3072         AC_TRY_COMPILE([
3073                 #ifdef HAVE_LINUX_IN_H
3074                 #include <sys/socket.h>
3075                 #include <linux/in.h>
3076                 #else
3077                 #include <netinet/in.h>
3078                 #endif
3079         ], [
3080                 struct in_pktinfo pktinfo;
3081         ],[
3082                 AC_MSG_RESULT(yes)
3083                 AC_DEFINE(HAVE_IN_PKTINFO, 1, [struct in_pktinfo])
3084         ], [
3085                 AC_MSG_RESULT(no)
3086         ])
3088         AC_MSG_CHECKING(for struct ip_mreqn)
3089         AC_TRY_COMPILE([
3090                 #if HAVE_LINUX_IN_H
3091                 #include <sys/socket.h>
3092                 #include <linux/in.h>
3093                 #else
3094                 #include <netinet/in.h>
3095                 #endif
3096         ], [
3097                 struct ip_mreqn mreqn;
3098         ],[
3099                 AC_MSG_RESULT(yes)
3100                 AC_DEFINE(HAVE_IP_MREQN, 1, struct ip_mreqn)
3101         ], [
3102                 AC_MSG_RESULT(no)
3103         ])
3105         if test x$host_darwin = xno; then
3106                 AC_CHECK_TYPES([struct flock64], [AC_DEFINE(HAVE_FLOCK64, 1, struct flock64)], , [#include <fcntl.h>])
3107         fi
3109         if test x$mono_native_platform_ios = xno; then
3110                 # On iOS, `stat64()` is deprecated and there is no `struct stat64` and `stat()`
3111                 # is either 32-bit or 64-bit based on the device / simulator that you're running on.
3112                 AC_CHECK_FUNC(stat64,            [AC_DEFINE(HAVE_STAT64, 1, [stat64])])
3113         fi
3115         AC_CHECK_FUNC(lseek64,           [AC_DEFINE(HAVE_LSEEK64, 1, [lseek64])])
3116         AC_CHECK_FUNC(mmap64,            [AC_DEFINE(HAVE_MMAP64, 1, [mmap64])])
3117         AC_CHECK_FUNC(ftruncate64,       [AC_DEFINE(HAVE_FTRUNCATE64, 1, [ftruncate64])])
3118         AC_CHECK_FUNC(posix_fadvise64,   [AC_DEFINE(HAVE_POSIX_FADVISE64, 1, [posix_fadvise64])])
3119         AC_CHECK_DECL(pipe2,             [AC_DEFINE(HAVE_PIPE2, 1, [pipe2])])
3120         AC_CHECK_FUNC(getmntinfo,        [AC_DEFINE(HAVE_GETMNTINFO, 1, [getmntinfo])], [], [[#include <unistd.h>]])
3121         AC_CHECK_FUNC(strcpy_s,          [AC_DEFINE(HAVE_STRCPY_S, 1, [strcpy_s])])
3122         AC_CHECK_FUNC(strlcpy,           [AC_DEFINE(HAVE_STRLCPY, 1, [strlcpy])])
3123         AC_CHECK_FUNC(posix_fadvise,     [AC_DEFINE(HAVE_POSIX_FADVISE, 1, [posix_fadvise])])
3124         AC_CHECK_FUNC(ioctl,             [AC_DEFINE(HAVE_IOCTL, 1, [ioctl])])
3125         AC_CHECK_FUNC(sched_getaffinity, [AC_DEFINE(HAVE_SCHED_GETAFFINITY, 1, [sched_getaffinity])])
3126         AC_CHECK_FUNC(sched_setaffinity, [AC_DEFINE(HAVE_SCHED_SETAFFINITY, 1, [sched_setaffinity])])
3127         AC_CHECK_DECL(TIOCGWINSZ,        [AC_DEFINE(HAVE_TIOCGWINSZ, 1, [TIOCGWINSZ])], [], [[#include <sys/ioctl.h>]])
3128         AC_CHECK_FUNC(tcgetattr,         [AC_DEFINE(HAVE_TCGETATTR, 1, [tcgetattr])])
3129         AC_CHECK_FUNC(tcsetattr,         [AC_DEFINE(HAVE_TCSETATTR, 1, [tcsetattr])])
3130         AC_CHECK_FUNC(arc4random_buf,    [AC_DEFINE(HAVE_ARC4RANDOM_BUF, 1, [arc4random_buf])])
3131         AC_CHECK_DECL(ECHO,              [AC_DEFINE(HAVE_ECHO, 1, [ECHO])], [], [[#include <termios.h>]])
3132         AC_CHECK_DECL(ICANON,            [AC_DEFINE(HAVE_ICANON, 1, [ICANON])], [], [[#include <termios.h>]])
3133         AC_CHECK_DECL(TCSANOW,           [AC_DEFINE(HAVE_TCSANOW, 1, [TCSANOW])], [], [[#include <termios.h>]])
3135         AC_CHECK_DECL(O_CLOEXEC,         [AC_DEFINE(HAVE_O_CLOEXEC, 1, [O_CLOEXEC])], [], [[#include <fcntl.h>]])
3136         AC_CHECK_DECL(F_DUPFD_CLOEXEC,   [AC_DEFINE(HAVE_F_DUPFD_CLOEXEC, 1, [F_DUPFD_CLOEXEC])], [], [[#include <fcntl.h>]])
3138         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>]])
3139         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>]])
3140         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>]])
3141         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>]])
3142         AC_CHECK_MEMBER(struct dirent.d_namlen,       [AC_DEFINE(HAVE_DIRENT_NAME_LEN, 1, [struct dirent.d_namlen])], [], [[#include <dirent.h>]])
3143         AC_CHECK_MEMBER(struct statfs.f_fstypename,   [AC_DEFINE(HAVE_STATFS_FSTYPENAME, 1, [struct statfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3144         AC_CHECK_MEMBER(struct statvfs.f_fstypename,  [AC_DEFINE(HAVE_STATVFS_FSTYPENAME, 1, [struct statvfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3146         AC_MSG_CHECKING(for struct statfs)
3147         AC_TRY_COMPILE([
3148                 #if defined(HAVE_STATFS_FSTYPENAME) || defined(HAVE_STATVFS_FSTYPENAME)
3149                 #include <sys/mount.h>
3150                 #else
3151                 #include <sys/statfs.h>
3152                 #endif
3153         ], [
3154                 struct statfs;
3155         ],[
3156                 AC_MSG_RESULT(yes)
3157                 AC_DEFINE(HAVE_STATFS, 1, [struct statfs])
3158         ], [
3159                 AC_MSG_RESULT(no)
3160         ])
3162         if test "x$ac_cv_func_strerror_r_char_p" = "xyes" ; then
3163                 AC_DEFINE(HAVE_GNU_STRERROR_R, 1, [char* strerror(int errnum, char *buf, size_t buflen)])
3164         fi
3166         AC_MSG_CHECKING(for readdir_r)
3167         AC_TRY_COMPILE([
3168                 #include <dirent.h>
3169         ], [
3170                 DIR* dir;
3171                 struct dirent* entry;
3172                 struct dirent* result;
3173                 readdir_r(dir, entry, &result);
3174         ],[
3175                 AC_MSG_RESULT(yes)
3176                 AC_DEFINE(HAVE_READDIR_R, 1, [readdir_r])
3177         ], [
3178                 AC_MSG_RESULT(no)
3179         ])
3181         AC_MSG_CHECKING(for kevent with void *data)
3182         AC_TRY_COMPILE([
3183                 #include <sys/types.h>
3184                 #include <sys/event.h>
3185         ], [
3186                 struct kevent event;
3187                 void* data;
3188                 EV_SET(&event, 0, EVFILT_READ, 0, 0, 0, data);
3189         ],[
3190                 AC_MSG_RESULT(yes)
3191                 AC_DEFINE(KEVENT_HAS_VOID_UDATA, 1, [kevent with void *data])
3192         ], [
3193                 AC_MSG_RESULT(no)
3194         ])
3196         AC_CHECK_MEMBER(struct fd_set.fds_bits,   [AC_DEFINE(HAVE_FDS_BITS, 1, [struct fd_set.fds_bits])], [], [[#include <sys/select.h>]])
3197         AC_CHECK_MEMBER(struct fd_set.__fds_bits, [AC_DEFINE(HAVE_PRIVATE_FDS_BITS, 1, [struct fd_set.__fds_bits])], [], [[#include <sys/select.h>]])
3199         AC_MSG_CHECKING(for sendfile with 4 arguments)
3200         AC_TRY_COMPILE([
3201                 #include <sys/sendfile.h>
3202         ], [
3203                 int result = sendfile(0, 0, 0, 0);
3204         ],[
3205                 AC_MSG_RESULT(yes)
3206                 AC_DEFINE(HAVE_SENDFILE_4, 1, [sendfile with 4 arguments])
3207         ], [
3208                 AC_MSG_RESULT(no)
3209         ])
3211         AC_MSG_CHECKING(for sendfile with 6 arguments)
3212         AC_TRY_LINK([
3213                 #include <stdlib.h>
3214                 #include <sys/types.h>
3215                 #include <sys/socket.h>
3216                 #include <sys/uio.h>
3217         ], [
3218                 int result = sendfile(0, 0, 0, NULL, NULL, 0);
3219         ],[
3220                 AC_MSG_RESULT(yes)
3221                 AC_DEFINE(HAVE_SENDFILE_6, 1, [sendfile with 6 arguments])
3222         ], [
3223                 AC_MSG_RESULT(no)
3224         ])
3226         AC_CHECK_FUNC(fcopyfile,     [AC_DEFINE(HAVE_FCOPYFILE, 1, [fcopyfile])])
3227         AC_CHECK_FUNC(epoll_create1, [AC_DEFINE(HAVE_EPOLL, 1, [epoll_create1])])
3228         AC_CHECK_FUNC(accept4,       [AC_DEFINE(HAVE_ACCEPT4, 1, [accept4])])
3229         AC_CHECK_FUNC(kqueue,        [AC_DEFINE(HAVE_KQUEUE, 1, [kqueue])])
3231         ORIG_CFLAGS="$CFLAGS"
3232         CFLAGS="-Werror -Wsign-conversion"
3234         AC_MSG_CHECKING(for getnameinfo with signed flags)
3235         AC_TRY_COMPILE([
3236                 #include <sys/types.h>
3237                 #include <netdb.h>
3238         ], [
3239                 const struct sockaddr *addr;
3240                 socklen_t addrlen;
3241                 char *host;
3242                 socklen_t hostlen;
3243                 char *serv;
3244                 socklen_t servlen;
3245                 int flags;
3246                 int result = getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags);
3247         ],[
3248                 AC_MSG_RESULT(yes)
3249                 AC_DEFINE(HAVE_GETNAMEINFO_SIGNED_FLAGS, 1, [getnameinfo with signed flags])
3250         ], [
3251                 AC_MSG_RESULT(no)
3252         ])
3254         CFLAGS="$ORIG_CFLAGS"
3256         if test "x$host_linux" = "xyes"; then
3257                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 1, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3258         else
3259                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 0, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3260         fi
3262         ORIG_CFLAGS="$CFLAGS"
3263         CFLAGS="-Werror -Wsign-conversion"
3265         AC_MSG_CHECKING(for bind with unsigned addrlen)
3266         AC_TRY_COMPILE([
3267                 #include <sys/socket.h>
3268         ], [
3269                 int fd;
3270                 struct sockaddr* addr;
3271                 socklen_t addrLen;
3272                 bind(fd, addr, addrLen);
3273         ],[
3274                 AC_MSG_RESULT(yes)
3275                 AC_DEFINE(BIND_ADDRLEN_UNSIGNED, 1, [bind with unsigned addrlen])
3276         ], [
3277                 AC_MSG_RESULT(no)
3278         ])
3280         AC_MSG_CHECKING(for struct ipv6_mreq with unsigned ipv6mr_interface)
3281         AC_TRY_COMPILE([
3282                 #include <netinet/in.h>
3283                 #include <netinet/tcp.h>
3284         ], [
3285                 struct ipv6_mreq opt;
3286                 unsigned int index = 0;
3287                 opt.ipv6mr_interface = index;
3288         ],[
3289                 AC_MSG_RESULT(yes)
3290                 AC_DEFINE(IPV6MR_INTERFACE_UNSIGNED, 1, [struct ipv6_mreq with unsigned ipv6mr_interface])
3291         ], [
3292                 AC_MSG_RESULT(no)
3293         ])
3295         AC_MSG_CHECKING(for inotify_rm_watch with unsigned wd)
3296         AC_TRY_COMPILE([
3297                 #include <sys/inotify.h>
3298         ], [
3299                 intptr_t fd;
3300                 uint32_t wd;
3301                 int result = inotify_rm_watch(fd, wd);
3302         ],[
3303                 AC_MSG_RESULT(yes)
3304                 AC_DEFINE(INOTIFY_RM_WATCH_WD_UNSIGNED, 1, [inotify_rm_watch with unsigned wd])
3305         ], [
3306                 AC_MSG_RESULT(no)
3307         ])
3309         CFLAGS="$ORIG_CFLAGS"
3311         AC_MSG_CHECKING(for shm_open that works well enough with mmap)
3312         if test "x$ac_cv_func_shm_open" = "xno" -o "x$ac_cv_func_shm_open_working_with_mmap" = "xno" ; then
3313                 AC_MSG_RESULT(no)
3314         elif test "x$cross_compiling" = "xyes"; then
3315                 AC_MSG_RESULT(cross compiling, assuming yes)
3316                 AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3317         else
3318                 AC_TRY_RUN([
3319                         #include <sys/mman.h>
3320                         #include <fcntl.h>
3321                         #include <unistd.h>
3323                         int main ()
3324                         {
3325                                 int fd = shm_open("/mono_configure_shm_open", O_CREAT | O_RDWR, 0777);
3326                                 if (fd == -1)
3327                                         return -1;
3329                                 shm_unlink("/mono_configure_shm_open");
3331                                 // NOTE: PROT_EXEC and MAP_PRIVATE don't work well with shm_open
3332                                 //       on at least the current version of Mac OS X
3334                                 if (mmap(NULL, 1, PROT_EXEC, MAP_PRIVATE, fd, 0) == MAP_FAILED)
3335                                         return -1;
3337                                 return 0;
3338                         }
3339                 ],[
3340                         AC_MSG_RESULT(yes)
3341                         AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3342                 ], [
3343                         AC_MSG_RESULT(no)
3344                 ])
3345         fi
3347         AC_MSG_CHECKING(for getpriority with int who)
3348         AC_TRY_COMPILE([
3349                 #include <sys/resource.h>
3350         ], [
3351                 int which;
3352                 int who;
3353                 int result = getpriority(which, who);
3354         ],[
3355                 AC_MSG_RESULT(yes)
3356                 AC_DEFINE(PRIORITY_REQUIRES_INT_WHO, 1, [getpriority with int who])
3357         ], [
3358                 AC_MSG_RESULT(no)
3359         ])
3361         AC_MSG_CHECKING(for kevent with int parameters)
3362         AC_TRY_COMPILE([
3363                 #include <sys/types.h>
3364                 #include <sys/event.h>
3365         ], [
3366                 int kg;
3367                 const struct kevent* chagelist;
3368                 int nchanges;
3369                 struct kevent* eventlist;
3370                 int nevents;
3371                 const struct timespec* timeout;
3372                 int result = kevent(kg, chagelist, nchanges, eventlist, nevents, timeout);
3373         ],[
3374                 AC_MSG_RESULT(yes)
3375                 AC_DEFINE(KEVENT_REQUIRES_INT_PARAMS, 1, [kevent with int parameters])
3376         ], [
3377                 AC_MSG_RESULT(no)
3378         ])
3380         ORIG_CFLAGS="$CFLAGS"
3381         CFLAGS="-Werror -Wimplicit-function-declaration"
3383         AC_MSG_CHECKING(for mkstemps)
3384         AC_TRY_COMPILE([
3385                 #include <stdlib.h>
3386                 #include <unistd.h>
3387                 #include <string.h>
3388         ], [
3389                 char *template;
3390                 int suffixlen;
3391                 int result = mkstemps(template, suffixlen);
3392         ],[
3393                 AC_MSG_RESULT(yes)
3394                 AC_DEFINE(HAVE_MKSTEMPS, 1, [mkstemps])
3395                 have_mkstemps=yes
3396         ], [
3397                 AC_MSG_RESULT(no)
3398         ])
3400         CFLAGS="$ORIG_CFLAGS"
3402         if test "x$have_mkstemps" != "xyes" -a "x$ac_cv_func_mkstemp" != "xyes"; then
3403                 AC_MSG_ERROR([Cannot find mkstemps or mkstemp on this platform])
3404         fi
3406         AC_MSG_CHECKING(for tcp/var.h)
3407         AC_TRY_COMPILE([
3408                 #include <sys/types.h>
3409                 #include <sys/socketvar.h>
3410                 #include <netinet/ip.h>
3411                 #include <netinet/tcp.h>
3412                 #include <netinet/tcp_var.h>
3413         ], [
3414         ],[
3415                 AC_MSG_RESULT(yes)
3416                 AC_DEFINE(HAVE_TCP_VAR_H, 1, [tcp/var.h])
3417         ], [
3418                 AC_MSG_RESULT(no)
3419         ])
3421         AC_CHECK_HEADERS([sys/cdefs.h])
3423         AC_MSG_CHECKING(for TCPSTATE enum in netinet/tcp.h)
3424         AC_TRY_COMPILE([
3425                 #ifdef HAVE_SYS_CDEFS_H
3426                 #include <sys/cdefs.h>
3427                 #endif
3428                 #include <netinet/tcp.h>
3429         ], [
3430                 int result = TCP_ESTABLISHED;
3431         ],[
3432                 AC_MSG_RESULT(yes)
3433                 AC_DEFINE(HAVE_TCP_H_TCPSTATE_ENUM, 1, [TCPSTATE enum in netinet/tcp.h])
3434         ], [
3435                 AC_MSG_RESULT(no)
3436         ])
3438         AC_CHECK_DECL(TCPS_ESTABLISHED, [AC_DEFINE(HAVE_TCP_FSM_H, 1, [HAVE_TCP_FSM_H])], [], [[#include <netinet/tcp_fsm.h>]])
3440         AC_MSG_CHECKING(for struct rt_msghdr)
3441         AC_TRY_COMPILE([
3442                 #include <sys/types.h>
3443                 #include <net/route.h>
3444         ], [
3445                 struct rt_msghdr;
3446         ],[
3447                 AC_MSG_RESULT(yes)
3448                 AC_DEFINE(HAVE_RT_MSGHDR, 1, [struct rt_msghdr])
3449         ], [
3450                 AC_MSG_RESULT(no)
3451         ])
3453         AC_CHECK_HEADERS([sys/sysctl.h])
3454         AC_CHECK_HEADERS([linux/rtnetlink.h])
3456         AC_CHECK_FUNC(getpeereid,    [AC_DEFINE(HAVE_GETPEEREID, 1, [getpeereid])])
3457         AC_CHECK_FUNC(getdomainname, [AC_DEFINE(HAVE_GETDOMAINNAME, 1, [getdomainname])])
3458         AC_CHECK_FUNC(uname,         [AC_DEFINE(HAVE_UNAME, 1, [uname])])
3460         ORIG_CFLAGS="$CFLAGS"
3461         CFLAGS="-Werror -Weverything"
3463         AC_MSG_CHECKING(for getdomainname with size_t namelen)
3464         AC_TRY_COMPILE([
3465                 #include <unistd.h>
3466         ], [
3467                 size_t namelen = 20;
3468                 char name[20];
3469                 int result = getdomainname(name, namelen);
3470         ],[
3471                 AC_MSG_RESULT(yes)
3472                 AC_DEFINE(HAVE_GETDOMAINNAME_SIZET, 1, [getdomainname with size_t namelen])
3473         ], [
3474                 AC_MSG_RESULT(no)
3475         ])
3477         CFLAGS="$ORIG_CFLAGS"
3479         AC_CHECK_FUNC(inotify_init, [AC_DEFINE(HAVE_INOTIFY_INIT, 1, [inotify_init])])
3480         AC_CHECK_FUNC(inotify_add_watch, [AC_DEFINE(HAVE_INOTIFY_ADD_WATCH, 1, [inotify_add_watch])])
3481         AC_CHECK_FUNC(inotify_rm_watch, [AC_DEFINE(HAVE_INOTIFY_RM_WATCH, 1, [inotify_rm_watch])])
3483         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
3484                 AC_DEFINE(HAVE_INOTIFY, 1, [HAVE_INOTIFY])
3485         elif test "x$host_linux" = "xyes"; then
3486                 AC_MSG_ERROR([Cannot find inotify functions on a Linux platform.])
3487         fi
3489         AC_CHECK_HEADERS([crt_externs.h])
3491         AC_MSG_CHECKING(for _NSGetEnviron)
3492         AC_TRY_COMPILE([
3493                 #include <crt_externs.h>
3494         ], [
3495                 char **result = *(_NSGetEnviron());
3496         ],[
3497                 AC_MSG_RESULT(yes)
3498                 AC_DEFINE(HAVE_NSGETENVIRON, 1, [_NSGetEnviron])
3499         ], [
3500                 AC_MSG_RESULT(no)
3501         ])
3503         AC_CHECK_DECL(IN_EXCL_UNLINK, [AC_DEFINE(HAVE_IN_EXCL_UNLINK, 1, [IN_EXCL_UNLINK])], [], [[#include <sys/inotify.h>]])
3505 else
3506         dnl *********************************
3507         dnl *** Checks for Windows compilation ***
3508         dnl *********************************
3509         AC_CHECK_HEADERS(winternl.h)
3511         jdk_headers_found=no
3512         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
3513         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
3514         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
3515         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
3516         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
3517         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
3518         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
3520         dnl *********************************
3521         dnl *** Check for struct ip_mreqn ***
3522         dnl *********************************
3523         AC_MSG_CHECKING(for struct ip_mreqn)
3524         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3525                 struct ip_mreqn mreq;
3526                 mreq.imr_address.s_addr = 0;
3527         ], [
3528                 # Yes, we have it...
3529                 AC_MSG_RESULT(yes)
3530                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
3531         ], [
3532                 # We'll just have to try and use struct ip_mreq
3533                 AC_MSG_RESULT(no)
3534                 AC_MSG_CHECKING(for struct ip_mreq)
3535                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3536                         struct ip_mreq mreq;
3537                         mreq.imr_interface.s_addr = 0;
3538                 ], [
3539                         # Yes, we have it...
3540                         AC_MSG_RESULT(yes)
3541                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
3542                 ], [
3543                         # No multicast support
3544                         AC_MSG_RESULT(no)
3545                 ])
3546         ])
3548         dnl **********************************
3549         dnl *** Check for getaddrinfo ***
3550         dnl **********************************
3551         AC_MSG_CHECKING(for getaddrinfo)
3552                 AC_TRY_LINK([
3553                 #include <stdio.h>
3554                 #include <winsock2.h>
3555                 #include <ws2tcpip.h>
3556         ], [
3557                 getaddrinfo(NULL,NULL,NULL,NULL);
3558         ], [
3559                 # Yes, we have it...
3560                 AC_MSG_RESULT(yes)
3561                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
3562         ], [
3563                 AC_MSG_RESULT(no)
3564         ])
3566         dnl **********************************
3567         dnl *** Check for gethostbyname ***
3568         dnl **********************************
3569         AC_MSG_CHECKING(for gethostbyname)
3570                 AC_TRY_LINK([
3571                 #include <stdio.h>
3572                 #include <winsock2.h>
3573                 #include <ws2tcpip.h>
3574         ], [
3575                 gethostbyname(NULL);
3576         ], [
3577                 # Yes, we have it...
3578                 AC_MSG_RESULT(yes)
3579                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
3580         ], [
3581                 AC_MSG_RESULT(no)
3582         ])
3584         dnl **********************************
3585         dnl *** Check for getprotobyname ***
3586         dnl **********************************
3587         AC_MSG_CHECKING(for getprotobyname)
3588                 AC_TRY_LINK([
3589                 #include <stdio.h>
3590                 #include <winsock2.h>
3591                 #include <ws2tcpip.h>
3592         ], [
3593                 getprotobyname(NULL);
3594         ], [
3595                 # Yes, we have it...
3596                 AC_MSG_RESULT(yes)
3597                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
3598         ], [
3599                 AC_MSG_RESULT(no)
3600         ])
3602         dnl **********************************
3603         dnl *** Check for getnameinfo ***
3604         dnl **********************************
3605         AC_MSG_CHECKING(for getnameinfo)
3606                 AC_TRY_LINK([
3607                 #include <stdio.h>
3608                 #include <winsock2.h>
3609                 #include <ws2tcpip.h>
3610         ], [
3611                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
3612         ], [
3613                 # Yes, we have it...
3614                 AC_MSG_RESULT(yes)
3615                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
3616         ], [
3617                 AC_MSG_RESULT(no)
3618         ])
3620         dnl **********************************
3621         dnl *** Check for inet_ntop ***
3622         dnl **********************************
3623         AC_MSG_CHECKING(for inet_ntop)
3624                 AC_TRY_LINK([
3625                 #include <stdio.h>
3626                 #include <winsock2.h>
3627                 #include <ws2tcpip.h>
3628         ], [
3629                 inet_ntop (0, NULL, NULL, 0);
3630         ], [
3631                 # Yes, we have it...
3632                 AC_MSG_RESULT(yes)
3633                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
3634         ], [
3635                 AC_MSG_RESULT(no)
3636         ])
3638         dnl **********************************
3639         dnl *** Check for inet_pton ***
3640         dnl **********************************
3641         AC_MSG_CHECKING(for inet_pton)
3642                 AC_TRY_LINK([
3643                 #include <stdio.h>
3644                 #include <winsock2.h>
3645                 #include <ws2tcpip.h>
3646         ], [
3647                 #ifndef inet_pton
3648                 (void) inet_pton;
3649                 #endif
3650                 inet_pton (0, NULL, NULL);
3651         ], [
3652                 # Yes, we have it...
3653                 AC_MSG_RESULT(yes)
3654                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
3655         ], [
3656                 AC_MSG_RESULT(no)
3657         ])
3659         AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
3660         AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
3661         AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
3662         AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
3663         AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
3664         AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
3665         AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
3668 dnl socklen_t check
3669 AC_MSG_CHECKING(for socklen_t)
3670 AC_TRY_COMPILE([
3671 #include <sys/types.h>
3672 #include <sys/socket.h>
3674   socklen_t foo;
3676 ac_cv_c_socklen_t=yes
3677         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
3678         AC_MSG_RESULT(yes)
3680         AC_MSG_RESULT(no)
3683 AC_CHECK_FUNCS(execvp)
3685 dnl ****************************
3686 dnl *** Look for /dev/random ***
3687 dnl ****************************
3689 AC_MSG_CHECKING([if usage of random device is requested])
3690 AC_ARG_ENABLE(dev-random,
3691 [  --disable-dev-random    disable the use of the random device (enabled by default)],
3692 try_dev_random=$enableval, try_dev_random=yes)
3694 AC_MSG_RESULT($try_dev_random)
3696 case "{$build}" in
3698 dnl IBM i does not have /dev/random, use unblocking only
3700     *-*-os400*)
3701     NAME_DEV_RANDOM="/dev/urandom"
3702     ;;
3704 dnl Win32 does not have /dev/random, they have their own method...
3706     *-mingw*|*-*-cygwin*)
3707     ac_cv_have_dev_random=no
3708     ;;
3710 dnl Everywhere else, it's /dev/random
3712     *)
3713     NAME_DEV_RANDOM="/dev/random"
3714     ;;
3715 esac
3717 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
3719 dnl Now check if the device actually exists
3721 if test "x$try_dev_random" = "xyes"; then
3722     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
3723     [if test -r "$NAME_DEV_RANDOM" ; then
3724         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
3725     if test "x$ac_cv_have_dev_random" = "xyes"; then
3726         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
3727     fi
3728 else
3729     AC_MSG_CHECKING(for random device)
3730     ac_cv_have_dev_random=no
3731     AC_MSG_RESULT(has been disabled)
3734 if test "x$host_win32" = "xyes"; then
3735     AC_DEFINE(HAVE_CRYPT_RNG)
3738 if test "x$ac_cv_have_dev_random" = "xno" \
3739     && test "x$host_win32" = "xno"; then
3740     AC_MSG_WARN([[
3742 *** A system-provided entropy source was not found on this system.
3743 *** Because of this, the System.Security.Cryptography random number generator
3744 *** will throw a NotImplemented exception.
3746 *** If you are seeing this message, and you know your system DOES have an
3747 *** entropy collection in place, please report an issue on GitHub and
3748 *** provide information about the system and how to access the random device.
3750 *** Otherwise you can install either egd or prngd and set the environment
3751 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
3752 ***]])
3755 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)
3757 AC_MSG_CHECKING([if big-arrays are to be enabled])
3758 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)
3759 if test "x$enable_big_arrays" = "xyes" ; then
3760     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
3761         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
3762     else
3763         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
3764     fi
3766 AC_MSG_RESULT($enable_big_arrays)
3768 dnl **************
3769 dnl *** DTRACE ***
3770 dnl **************
3772 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
3774 if test "x$enable_dtrace" = "xyes"; then
3775    if test "x$has_dtrace" = "xno"; then
3776           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
3777    fi
3778    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
3779    if test "x$DTRACE" = "xno"; then
3780           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
3781           enable_dtrace=no
3782    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
3783           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
3784           enable_dtrace=no
3785    fi
3788 dtrace_g=no
3789 if test "x$enable_dtrace" = "xyes"; then
3790         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
3791         DTRACEFLAGS=
3792         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3793                 case "$host" in
3794                         powerpc-*-darwin*)
3795                         DTRACEFLAGS="-arch ppc64"
3796                         ;;
3797                         i*86-*-darwin*)
3798                         DTRACEFLAGS="-arch x86_64"
3799                         ;;
3800                         *)
3801                         DTRACEFLAGS=-64
3802                         ;;
3803                 esac
3804         else
3805                 case "$host" in
3806                         powerpc-*-darwin*)
3807                         DTRACEFLAGS="-arch ppc"
3808                         ;;
3809                         i*86-*-darwin*)
3810                         DTRACEFLAGS="-arch i386"
3811                         ;;
3812                         *)
3813                         DTRACEFLAGS=-32
3814                         ;;
3815                 esac
3816         fi
3817         AC_SUBST(DTRACEFLAGS)
3818         case "$host" in
3819                 *-*-solaris*)
3820                 dtrace_g=yes
3821                 ;;
3822         esac
3823         AC_CHECK_HEADERS([sys/sdt.h])
3825 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
3826 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
3828 dnl **************************
3829 dnl *** AOT cross offsets  ***
3830 dnl **************************
3832 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
3833     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
3835 dnl **************
3836 dnl ***  LLVM  ***
3837 dnl **************
3839 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
3840 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
3841 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)
3842 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
3843 AC_ARG_ENABLE(llvm-asserts,[  --enable-llvm-asserts Enable llvm asserts (option to LLVM in CMake)], enable_llvm_asserts=$enableval, enable_llvm_asserts=no)
3845 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
3847 if test "x$enable_llvm" = "xdefault"; then
3848    enable_llvm=$enable_llvm_default
3851 enable_llvm_msvc_only="no"
3852 if test "x$enable_llvm" = "xyes"; then
3853         if test "x$host_win32" = "xyes"; then
3854                 if test "x$cross_compiling" = "xno"; then
3855                         case "$target" in
3856                         x86_64*)
3857                                 AC_MSG_WARN("LLVM for host=Windows and target=Windows is only supported on x64 MSVC builds. Disabling LLVM for GCC build.")
3858                                 enable_llvm_msvc_only="yes"
3859                                 ;;
3860                         i686*)
3861                                 AC_MSG_ERROR("LLVM for host=Windows and target=Windows is only supported for x64 builds.")
3862                                 ;;
3863                         esac
3864                 fi
3865                 if test "x$enable_loadedllvm" = "xyes"; then
3866                         AC_MSG_WARN("Loadable LLVM currently not supported on Windows. Disabling feature.")
3867                         enable_loadedllvm=no
3868                 fi
3869         fi
3872 internal_llvm="no"
3873 if test "x$enable_llvm" = "xyes"; then
3874         if test "x$with_llvm" != "x"; then
3875                 EXTERNAL_LLVM_CONFIG=$with_llvm/bin/llvm-config
3876                 if test x$host_win32 = xyes; then
3877                         EXTERNAL_LLVM_CONFIG=$EXTERNAL_LLVM_CONFIG.exe
3878                 fi
3879                 if test ! -x $EXTERNAL_LLVM_CONFIG; then
3880                         AC_MSG_ERROR([LLVM executable $EXTERNAL_LLVM_CONFIG not found.])
3881                 fi
3882         else
3883                 if test x$host_win32 = xyes; then
3884                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config.exe, no)
3885                 else
3886                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config, no)
3887                 fi
3888                 if test "x$EXTERNAL_LLVM_CONFIG" = "xno"; then
3889                         internal_llvm=yes
3890                 fi
3891         fi
3893         LLVM_CODEGEN_LIBS="x86codegen"
3894         case "$target" in
3895         arm*)
3896                 LLVM_CODEGEN_LIBS="armcodegen"
3897                 ;;
3898         aarch64*)
3899                 LLVM_CODEGEN_LIBS="aarch64codegen"
3900                 ;;
3901         powerpc*)
3902                 LLVM_CODEGEN_LIBS="powerpccodegen"
3903                 ;;
3904         esac
3905         if test "x$host" != "x$target"; then
3906                 # No need for jit libs
3907                 LLVM_CODEGEN_LIBS=
3908         fi
3910         AC_SUBST(LLVM_CODEGEN_LIBS)
3911         AC_SUBST(EXTERNAL_LLVM_CONFIG)
3913         if test "x$host_win32" = "xyes" && test "x$cross_compiling" = "xno" &&  test "x$internal_llvm" = "xno"; then
3914                 EXTERNAL_LLVM_CONFIG_WIN32=$(cygpath -m $EXTERNAL_LLVM_CONFIG)
3915                 AC_SUBST(EXTERNAL_LLVM_CONFIG_WIN32)
3916         fi
3917         if test "x$enable_llvm_msvc_only" != "xyes"; then
3918                 AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
3919         else
3920                 AC_DEFINE(ENABLE_LLVM_MSVC_ONLY, 1, [Enable the LLVM back end])
3921         fi
3922 fi # ENABLE_LLVM
3924 # AC_DEFINE necessary for correct restore behavior on Linux
3925 AM_CONDITIONAL(INTERNAL_LLVM, [test "x$internal_llvm" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
3926 if test "x$internal_llvm" != "xno"; then
3927         if test "x$enable_llvm_msvc_only" != "xyes"; then
3928                 AC_DEFINE(INTERNAL_LLVM, 1, [LLVM used is being build during mono build])
3929         else
3930                 AC_DEFINE(INTERNAL_LLVM_MSVC_ONLY, 1, [LLVM used is being build during mono build])
3931         fi
3934 AM_CONDITIONAL(INTERNAL_LLVM_ASSERTS, [test "x$enable_llvm_asserts" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
3935 if test "x$enable_llvm_asserts" != "xno"; then
3936         if test "x$enable_llvm_msvc_only" != "xyes"; then
3937                 AC_DEFINE(INTERNAL_LLVM_ASSERTS, 1, [Build LLVM with assertions])
3938         else
3939                 AC_DEFINE(INTERNAL_LLVM_ASSERTS_MSVC_ONLY, 1, [Build LLVM with assertions])
3940         fi
3943 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes && test x$enable_llvm_msvc_only != xyes])
3945 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes && test x$enable_llvm_msvc_only != xyes])
3946 if test "x$enable_loadedllvm" = "xyes"; then
3947         if test "x$enable_llvm_msvc_only" != "xyes"; then
3948                 AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
3949         fi
3952 if test "x$enable_llvm" = "xyes"; then
3953         enable_llvm_runtime=yes
3956 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes && test x$enable_llvm_msvc_only != xyes])
3957 if test "x$enable_llvm_runtime" = "xyes"; then
3958         if test "x$enable_llvm_msvc_only" != "xyes"; then
3959                 AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
3960         else
3961                 AC_DEFINE(ENABLE_LLVM_RUNTIME_MSVC_ONLY, 1, [Runtime support code for llvm enabled])
3962         fi
3965 TARGET="unknown"
3966 ACCESS_UNALIGNED="yes"
3968 LIBC="libc.so.6"
3969 INTL="libc.so.6"
3970 SQLITE="libsqlite.so.0"
3971 SQLITE3="libsqlite3.so.0"
3972 X11="libX11.so"
3973 GDKX11="libgdk-x11-2.0.so.0"
3974 GTKX11="libgtk-x11-2.0.so.0"
3975 XINERAMA="libXinerama.so.1"
3977 sizeof_register="SIZEOF_VOID_P"
3979 jit_wanted=true
3980 boehm_supported=true
3981 BTLS_SUPPORTED=no
3982 BTLS_PLATFORM=
3984 case "$host" in
3985         wasm32*)
3986                 TARGET=WASM
3987                 arch_target=wasm
3988                 BTLS_SUPPORTED=no
3989                 ACCESS_UNALIGNED="no"
3990                 with_tls=pthread
3991                 target_wasm=yes
3992                 ;;
3993         mips*)
3994                 TARGET=MIPS;
3995                 arch_target=mips;
3996                 with_tls=pthread;
3997                 ACCESS_UNALIGNED="no"
3999                 AC_MSG_CHECKING(for mips n32)
4000                 AC_TRY_COMPILE([],[
4001                 #if _MIPS_SIM != _ABIN32
4002                 #error Not mips n32
4003                 #endif
4004                 ],[
4005                 AC_MSG_RESULT(yes)
4006                 sizeof_register=8
4007                 ],[
4008                 AC_MSG_RESULT(no)
4009                 ])
4010                 ;;
4011         i*86-*-*)
4012                 TARGET=X86;
4013                 arch_target=x86;
4014                 case $host_os in
4015                   solaris*)
4016                         LIBC="libc.so"
4017                         INTL="libintl.so"
4018                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
4019                                 TARGET=AMD64
4020                                 arch_target=amd64
4021                         fi
4023                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
4024                         # int astruct __attribute__ ((visibility ("hidden")));
4025                         # void foo ()
4026                         # {
4027                         #       void *p = &astruct;
4028                         # }
4029                         # gcc -fPIC --shared -o libfoo.so foo.c
4030                         # yields:
4031                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
4032                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
4033                         have_visibility_hidden=no
4034                         ;;
4035                   mingw*|cygwin*)
4036                         have_visibility_hidden=no
4037                         BTLS_SUPPORTED=no
4038                         BTLS_PLATFORM=i386
4039                         ;;
4040                   haiku*)
4041                         LIBC=libroot.so
4042                         ;;
4043                   linux*)
4044                         AOT_SUPPORTED="yes"
4045                         BTLS_SUPPORTED=yes
4046                         BTLS_PLATFORM=i386
4047                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4048                         ;;
4049                   darwin*)
4050                         AOT_SUPPORTED="yes"
4051                         BTLS_SUPPORTED=yes
4052                         BTLS_PLATFORM=i386
4053                         ;;
4054                   openbsd*|freebsd*|kfreebsd-gnu*)
4055                         AOT_SUPPORTED="yes"
4056                         BTLS_SUPPORTED=yes
4057                         BTLS_PLATFORM=i386
4058                         ;;
4059                 esac
4060                 ;;
4061         x86_64-*-* | amd64-*-*)
4062                 TARGET=AMD64;
4063                 arch_target=amd64;
4064                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
4065                         AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4066                         sizeof_register=8
4067                 fi
4068                 case $host_os in
4069                   linux*)
4070                         AOT_SUPPORTED="yes"
4071                         BTLS_SUPPORTED=yes
4072                         BTLS_PLATFORM=x86_64
4073                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4074                         ;;
4075                   darwin*)
4076                         AOT_SUPPORTED="yes"
4077                         BTLS_SUPPORTED=yes
4078                         BTLS_PLATFORM=x86_64
4079                         boehm_supported=false
4080                         ;;
4081                   openbsd*|freebsd*|kfreebsd-gnu*)
4082                         AOT_SUPPORTED="yes"
4083                         BTLS_SUPPORTED=yes
4084                         BTLS_PLATFORM=x86_64
4085                         ;;
4086                   mingw*|cygwin*)
4087                         BTLS_SUPPORTED=no
4088                         BTLS_PLATFORM=x86_64
4089                         ;;
4090                 esac
4091                 ;;
4092         sparc*-*-*)
4093                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4094                    TARGET=SPARC64
4095                 else
4096                         TARGET=SPARC
4097                 fi
4098                 arch_target=sparc;
4099                 ACCESS_UNALIGNED="no"
4100                 case $host_os in
4101                   linux*) ;;
4102                   *)
4103                         LIBC="libc.so"
4104                         INTL="libintl.so"
4105                 esac
4106                 if test x"$GCC" = xyes; then
4107                         # We don't support v8 cpus
4108                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
4109                 fi
4110                 if test x"$AR" = xfalse; then
4111                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
4112                 fi
4113                 ;;
4114         *-mingw*|*-*-cygwin*)
4115                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
4116                 have_visibility_hidden=no
4117                 INTL="intl"
4118                 case "$host" in
4119                         x86_64*mingw*)
4120                                 # Old Boehm fails to compile for x86_64-mingw.
4121                                 # It is trivial to fix, but just silently drop it.
4122                                 boehm_supported=false
4123                                 ;;
4124                 esac
4125                 ;;
4126         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
4127         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
4128         powerpc-*-freebsd* | powerpc*-*-aix* | powerpc*-*-os400* )
4129                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4130                         TARGET=POWERPC64;
4131                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
4132                         if ! (echo $CC | grep -q -- 'clang'); then
4133                                 CFLAGS="$CFLAGS -mminimal-toc"
4134                         fi
4135                 else
4136                         TARGET=POWERPC;
4137                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
4138                 fi
4139                 arch_target=ppc;
4140                 case $host_os in
4141                   aix*|os400*)
4142                         BTLS_SUPPORTED=yes
4143                         BTLS_PLATFORM=powerpc
4144                         dnl on AIX/PASE, shared libraries can be inside archives
4145                         dnl if they are, we specify them by lib.a(lib.so)
4146                         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX, so
4147                         LIBC="libc.a(shr_64.o)"
4148                         INTL="libintl.a(libintl.so.8)"
4149                         ;;
4150                   linux*)
4151                         BTLS_SUPPORTED=yes
4152                         BTLS_PLATFORM=powerpc
4153                         ;;
4154                 esac
4155                 ;;
4156         armv7k-*-darwin*)
4157                 TARGET=ARM;
4158                 TARGET_SYS=WATCHOS
4159                 arch_target=arm;
4160                 arm_fpu=VFP_HARD
4161                 ACCESS_UNALIGNED="no"
4162                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4163                 ;;
4165         arm*-darwin*)
4166                 TARGET=ARM;
4167                 arch_target=arm;
4168                 ACCESS_UNALIGNED="no"
4169                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4170                 ;;
4171         arm*-linux*)
4172                 TARGET=ARM;
4173                 arch_target=arm;
4174                 ACCESS_UNALIGNED="no"
4175                 AOT_SUPPORTED="yes"
4176                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4177                 BTLS_SUPPORTED=yes
4178                 BTLS_PLATFORM=arm
4179                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4180                 case "$target" in
4181                 arm*-linux*-gnueabi)
4182                         BTLS_PLATFORM=armsoft
4183                         ;;
4184                 esac
4185                 ;;
4186         arm*-netbsd*-eabi*)
4187                 TARGET=ARM;
4188                 arch_target=arm;
4189                 ACCESS_UNALIGNED="no"
4190                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4191                 ;;
4192         aarch64-*darwin*ilp32)
4193                 TARGET=ARM64;
4194                 arch_target=arm64
4195                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4196                 sizeof_register=8
4197                 # assuming no other target other than watchOS is using aarch64*darwin triple
4198                 TARGET_SYS=WATCHOS
4199                 ;;
4200         aarch64-*)
4201                 # https://lkml.org/lkml/2012/7/15/133
4202                 TARGET=ARM64
4203                 arch_target=arm64
4204                 boehm_supported=false
4205                 AOT_SUPPORTED="yes"
4206                 BTLS_SUPPORTED=yes
4207                 BTLS_PLATFORM=aarch64
4208                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4209                 ;;
4210         s390x-*-linux*)
4211                 TARGET=S390X;
4212                 arch_target=s390x;
4213                 ACCESS_UNALIGNED="yes"
4214                 BTLS_SUPPORTED=yes
4215                 BTLS_PLATFORM=s390x
4216                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
4217                 ;;
4218         riscv32-*)
4219                 TARGET=RISCV32
4220                 ACCESS_UNALIGNED=no
4221                 AOT_SUPPORTED=no
4222                 BTLS_SUPPORTED=yes
4223                 BTLS_PLATFORM=riscv32
4224                 arch_target=riscv32
4225                 boehm_supported=false
4226                 ;;
4227         riscv64*)
4228                 TARGET=RISCV64
4229                 ACCESS_UNALIGNED=no
4230                 AOT_SUPPORTED=no
4231                 BTLS_SUPPORTED=yes
4232                 BTLS_PLATFORM=riscv64
4233                 arch_target=riscv64
4234                 boehm_supported=false
4235                 ;;
4236 esac
4238 HOST=$TARGET
4240 if test "x$host" != "x$target"; then
4241    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
4242    enable_mcs_build=no
4243    enable_support_build=no
4244    BTLS_SUPPORTED=no
4245    # Can't use tls, since it depends on the runtime detection of tls offsets
4246    # in mono-compiler.h
4247    with_tls=pthread
4248    target_mach=no
4249    case "$target" in
4250    wasm32*)
4251                 TARGET=WASM
4252                 arch_target=wasm
4253                 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
4254                 ;;
4255    arm*-darwin*)
4256                 TARGET=ARM;
4257                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4258                 case "$target" in
4259                 armv7k-*)
4260                         arm_fpu=VFP_HARD
4261                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
4262                         ;;
4263                 esac            
4264                 ;;
4265    powerpc64-ps3-linux-gnu)
4266                 TARGET=POWERPC64
4267                 arch_target=powerpc64
4268                 AC_DEFINE(TARGET_PS3, 1, [...])
4269                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4270                 # uses this define
4271                 AC_DEFINE(__mono_ppc64__, 1, [...])
4272                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4273                 sizeof_register=8
4274                 target_byte_order=G_BIG_ENDIAN
4275                 ;;
4276    powerpc64-xbox360-linux-gnu)
4277                 TARGET=POWERPC64
4278                 arch_target=powerpc64
4279                 AC_DEFINE(TARGET_XBOX360, 1, [...])
4280                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4281                 # uses this define
4282                 sizeof_register=8
4283                 target_byte_order=G_BIG_ENDIAN
4284                 ;;
4285    arm*-linux-*)
4286                 TARGET=ARM;
4287                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4288                 ;;
4289    arm*-netbsd*-eabi*)
4290                 TARGET=ARM;
4291                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4292                 ;;
4293    i686*-linux-*)
4294                 TARGET=X86;
4295                 ;;
4296    i*86-apple-*)
4297                 TARGET=X86;
4298                 ;;
4299    x86_64*-linux-*)
4300                 TARGET=AMD64;
4301                 ;;
4302    x86_64-ps4-freebsd)
4303                 TARGET=AMD64;
4304                 AC_DEFINE(TARGET_PS4, 1, [...])
4305                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
4306                 CPPFLAGS="$CPPFLAGS"
4307                 target_win32=no
4308                 ;;
4309    aarch64*-linux-*)
4310                 TARGET=ARM64;
4311                 ;;
4312         aarch64-*)
4313                 TARGET=ARM64
4314                 ;;
4315         riscv32*)
4316                 TARGET=RISCV32
4317                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4318                 AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4319                 arch_target=riscv32
4320                 target_mach=no
4321                 with_tls=pthread
4322                 ;;
4323         riscv64*)
4324                 TARGET=RISCV64
4325                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4326                 AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4327                 arch_target=riscv64
4328                 target_mach=no
4329                 with_tls=pthread
4330                 ;;
4331         *)
4332                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
4333         esac
4335         case "$target" in
4336         *-darwin*)
4337                 target_mach=yes
4338                 ;;
4339         *-linux-android*)
4340                 AC_DEFINE(TARGET_ANDROID, 1, [...])
4341                 ;;
4342         esac
4345 case "$TARGET" in
4346 WASM)
4347         AC_DEFINE(TARGET_WASM, 1, [...])
4348         arch_target=wasm
4349         ;;
4350 X86)
4351         AC_DEFINE(TARGET_X86, 1, [...])
4352         arch_target=x86
4353         ;;
4354 AMD64)
4355         AC_DEFINE(TARGET_AMD64, 1, [...])
4356         arch_target=amd64
4357         ;;
4358 ARM)
4359         AC_DEFINE(TARGET_ARM, 1, [...])
4360         arch_target=arm
4361         ACCESS_UNALIGNED="no"
4362         ;;
4363 ARM64)
4364         AC_DEFINE(TARGET_ARM64, 1, [...])
4365         arch_target=arm64
4366         ;;
4367 POWERPC)
4368         AC_DEFINE(TARGET_POWERPC, 1, [...])
4369         ;;
4370 POWERPC64)
4371         AC_DEFINE(TARGET_POWERPC, 1, [...])
4372         AC_DEFINE(TARGET_POWERPC64, 1, [...])
4373         ;;
4374 S390X)
4375         AC_DEFINE(TARGET_S390X, 1, [...])
4376         ;;
4377 MIPS)
4378         AC_DEFINE(TARGET_MIPS, 1, [...])
4379         ;;
4380 SPARC)
4381         AC_DEFINE(TARGET_SPARC, 1, [...])
4382         ;;
4383 SPARC64)
4384         AC_DEFINE(TARGET_SPARC64, 1, [...])
4385         ;;
4386 RISCV32)
4387         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4388         AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4389         ;;
4390 RISCV64)
4391         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4392         AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4393         ;;
4394 esac
4396 case "$TARGET" in
4397 *32* | ARM | X86 | POWERPC | MIPS | SPARC | WASM | ARM6432)
4398     target_sizeof_void_p=4
4399     ;;
4400 *64* | S390X)
4401     target_sizeof_void_p=8
4402     ;;
4404     AC_MSG_ERROR([unknown target])
4405     ;;
4406 esac
4408 case "$HOST" in
4409 WASM)
4410         AC_DEFINE(HOST_WASM, 1, [...])
4411         ;;
4412 X86)
4413         AC_DEFINE(HOST_X86, 1, [...])
4414         ;;
4415 AMD64)
4416         AC_DEFINE(HOST_AMD64, 1, [...])
4417         ;;
4418 ARM)
4419         AC_DEFINE(HOST_ARM, 1, [...])
4420         ;;
4421 ARM64)
4422         AC_DEFINE(HOST_ARM64, 1, [...])
4423         ;;
4424 POWERPC)
4425         AC_DEFINE(HOST_POWERPC, 1, [...])
4426         ;;
4427 POWERPC64)
4428         AC_DEFINE(HOST_POWERPC, 1, [...])
4429         AC_DEFINE(HOST_POWERPC64, 1, [...])
4430         ;;
4431 S390X)
4432         AC_DEFINE(HOST_S390X, 1, [...])
4433         ;;
4434 MIPS)
4435         AC_DEFINE(HOST_MIPS, 1, [...])
4436         ;;
4437 SPARC)
4438         AC_DEFINE(HOST_SPARC, 1, [...])
4439         ;;
4440 SPARC64)
4441         AC_DEFINE(HOST_SPARC64, 1, [...])
4442         ;;
4443 RISCV32)
4444         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4445         AC_DEFINE([HOST_RISCV32], [1], [Host is 32-bit RISC-V])
4446         ;;
4447 RISCV64)
4448         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4449         AC_DEFINE([HOST_RISCV64], [1], [Host is 64-bit RISC-V])
4450         ;;
4451 esac
4453 MONO_ARCH_GSHAREDVT_SUPPORTED=0
4454 case "$HOST" in
4455 X86 | AMD64 | ARM | ARM64)
4456         MONO_ARCH_GSHAREDVT_SUPPORTED=1 # keep in sync with mini-{x86,amd64,arm,arm64}.h
4457         ;;
4458 esac
4460 AM_CONDITIONAL(MONO_ARCH_GSHAREDVT_SUPPORTED, test $MONO_ARCH_GSHAREDVT_SUPPORTED = 1)
4461 AM_CONDITIONAL(TARGET_WASM, test $arch_target = wasm)
4463 dnl *************
4464 dnl *** VTUNE ***
4465 dnl *************
4467 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
4468 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
4470 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
4472 if test "x$enable_vtune" = "xyes"; then
4473         if test "x$with_vtune" = "x"; then
4474                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
4475         else
4476                 VTUNE_PATH=$with_vtune
4477         fi
4478         VTUNE_INCLUDE=$VTUNE_PATH/include
4479         case "$TARGET" in
4480         X86)
4481                 VTUNE_LIB=$VTUNE_PATH/lib32
4482                 ;;
4483         AMD64)
4484                 VTUNE_LIB=$VTUNE_PATH/lib64
4485                 ;;
4486         *)
4487                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
4488                 ;;
4489         esac
4490         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
4491                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
4492         fi
4493         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
4494                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
4495         fi
4497         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
4498         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
4500         AC_SUBST(VTUNE_LIBS)
4501         AC_SUBST(VTUNE_CFLAGS)
4503 dnl Use GCC atomic ops if they work on the target.
4504 if test x$GCC = "xyes"; then
4505         case $TARGET in
4506         X86 | AMD64 | ARM | ARM64 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64 | RISCV32 | RISCV64)
4507                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
4508                 ;;
4509         esac
4512 if test "x$target_mach" = "xyes"; then
4514    if test "x$TARGET_SYS" = "xWATCHOS"; then
4515           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
4516           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4517           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4518           BTLS_SUPPORTED=no
4519    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64"; then
4520           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4521           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4522           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4523           BTLS_SUPPORTED=no
4524           target_ios=yes
4525    else
4526        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
4527        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
4528        #error fail this for ios
4529        #endif
4530        ], [
4531                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
4532           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
4533           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
4534           target_osx=yes
4535        ], [
4536           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4537           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4538           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4539           BTLS_SUPPORTED=no
4540                   target_ios=yes
4541        ])
4542         fi
4543    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
4546 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
4548 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
4550 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
4551    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
4552 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
4553    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
4554 else
4555    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
4558 AC_DEFINE_UNQUOTED(TARGET_SIZEOF_VOID_P,${target_sizeof_void_p},[wordsize of target])
4560 if test "x$sizeof_register" = "x4"; then
4561   AC_DEFINE(SIZEOF_REGISTER,4,[size of target machine integer registers])
4562 elif test "x$sizeof_register" = "x8"; then
4563   AC_DEFINE(SIZEOF_REGISTER,8,[size of target machine integer registers])
4564 else
4565   AC_DEFINE_UNQUOTED(SIZEOF_REGISTER,${target_sizeof_void_p},[size of target machine integer registers])
4568 if test "x$have_visibility_hidden" = "xyes"; then
4569    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
4572 if test "x$have_deprecated" = "xyes"; then
4573    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
4576 dnl 
4577 dnl Simple Generational checks (sgen)
4579 SGEN_DEFINES=
4580 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
4581 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
4582 if test x$buildsgen = xyes; then
4583    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
4584    SGEN_DEFINES="-DHAVE_SGEN_GC"
4586         conc_gc_msg=""
4587    if test x$with_sgen_default_concurrent != xno; then
4588        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
4589            conc_gc_msg=" (concurrent by default)"
4590    fi
4592    if test "x$gc_msg" = "x"; then
4593       gc_msg="sgen$conc_gc_msg"
4594    else
4595       gc_msg="sgen$conc_gc_msg and $gc_msg"
4596    fi
4598 AC_SUBST(SGEN_DEFINES)
4599 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
4601 jit_status="Building and using the JIT"
4603 libsuffix=".so"
4605 case "$host" in
4606      *-*-darwin*)
4607         libsuffix=".dylib"
4608         LIBC="libc.dylib"
4609         INTL="libintl.dylib"
4610         SQLITE="libsqlite.0.dylib"
4611         SQLITE3="libsqlite3.0.dylib"
4612         X11="libX11.dylib"
4613         GDKX11="libgdk-x11-2.0.dylib"
4614         GTKX11="libgtk-x11-2.0.dylib"
4615         ;;
4616      *-*-*netbsd*)
4617         LIBC="libc.so"
4618         INTL="libintl.so"
4619         SQLITE="libsqlite.so"
4620         SQLITE3="libsqlite3.so"
4621         ;;
4622      *-*-kfreebsd*-gnu)
4623         LIBC="libc.so.0.1"
4624         INTL="libc.so.0.1"
4625         X11="libX11.so.6"
4626         ;;
4627     *-*-*freebsd*)
4628         LIBC="libc.so.7"
4629         INTL="libintl.so"
4630         SQLITE="libsqlite.so"
4631         SQLITE3="libsqlite3.so"
4632         ;;
4633     *-*-*openbsd*)
4634         LIBC="libc.so"
4635         INTL="libintl.so"
4636         SQLITE="libsqlite.so"
4637         SQLITE3="libsqlite3.so"
4638         ;;
4639     *-*-*linux*)
4640         AC_PATH_X
4641         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
4642         AC_MSG_CHECKING(for the soname of libX11.so)
4643         for i in $x_libraries $dlsearch_path; do
4644                 for r in 4 5 6; do
4645                         if test -f $i/libX11.so.$r; then
4646                                 X11=libX11.so.$r
4647                                 AC_MSG_RESULT($X11)
4648                         fi
4649                 done
4650         done
4651         
4652         if test "x$X11" = "xlibX11.so"; then
4653                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
4654                 X11=libX11.so.6
4655         fi
4656         ;;
4657 esac
4659 AC_SUBST(libsuffix)
4661 ######################################
4662 # EGLIB CHECKS
4663 ######################################
4665 GNUC_PRETTY=
4666 GNUC_UNUSED=
4667 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
4668 if test x$GCC = xyes; then
4669    GNUC_UNUSED='__attribute__((__unused__))'
4670    GNUC_NORETURN='__attribute__((__noreturn__))'
4671    case $host_cpu in
4672      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
4673    esac
4675 AC_SUBST(GNUC_PRETTY)
4676 AC_SUBST(GNUC_UNUSED)
4677 AC_SUBST(GNUC_NORETURN)
4678 AC_SUBST(BREAKPOINT)
4680 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
4682 case $host in
4683 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
4684     PATHSEP='\\'
4685     SEARCHSEP=';'
4686     OS="WIN32"
4687     PIDTYPE='void *'
4688     ;;
4690     PATHSEP='/'
4691     SEARCHSEP=':'
4692     OS="UNIX"
4693     PIDTYPE='int'
4694     ;;
4695 esac
4697 case $host in
4698         *-*-solaris*)
4699         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
4700         ;;
4701 esac
4703 case $target in
4704 arm*-darwin*|aarch64*-*|riscv*)
4705     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
4706     ;;
4707 i*86-*-darwin*)
4708     ORDER=G_LITTLE_ENDIAN
4709     ;;
4710 *-*-haiku*)
4711     LDFLAGS="$LDFLAGS -ltextencoding"
4712     ;;
4713 *-*-openbsd*)
4714     CFLAGS="$CFLAGS -pthread"
4715     LDFLAGS="$LDFLAGS -pthread"
4716     ;;
4717 esac
4719 AC_SUBST(ORDER)
4720 AC_SUBST(CFLAGS)
4721 AC_SUBST(PATHSEP)
4722 AC_SUBST(SEARCHSEP)
4723 AC_SUBST(OS)
4724 AC_SUBST(PIDTYPE)
4726 # Defined for all targets/platforms using classic Windows API support.
4727 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
4728 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
4730 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf)
4731 AC_CHECK_FUNCS(getrlimit)
4732 AC_CHECK_FUNCS(fork execv execve)
4733 AC_CHECK_FUNCS(waitpid)
4735 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
4737 if test x$with_overridable_allocators = xyes; then
4738         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
4739   AC_MSG_NOTICE([Overridable allocator support enabled])
4740 else
4741   AC_MSG_NOTICE([Overridable allocator support disabled])
4745 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
4746 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
4747 # removed once support for 10.6 is dropped.
4749 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
4751 if test x$target_osx = xyes; then
4752 AC_CHECK_FUNCS(getpwuid_r)
4753 elif test x$target_ios = xno; then
4754 AC_CHECK_FUNCS(strndup getpwuid_r)
4757 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
4759 AC_SEARCH_LIBS(sqrtf, m)
4761 # nanosleep may not be part of libc, also search it in other libraries
4762 AC_SEARCH_LIBS(nanosleep, rt)
4764 AC_SEARCH_LIBS(dlopen, dl)
4765 old_ldflags="${LDFLAGS}"
4766 # GNU specific option, this confuses IBM ld, but do offer alternatives when possible
4767 if test $lt_cv_prog_gnu_ld = yes; then
4768         LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4769 else
4770         case $host in
4771         *-*-aix*|*-*-os400*)
4772                 ;;
4773         *)
4774                 dnl Try to use export-dynamic anyways
4775                 LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4776                 ;;
4777         esac
4779 AC_TRY_LINK(, [int i;], found_export_dynamic=yes, found_export_dynamic=no)
4780 if test $found_export_dynamic = no; then
4781         LDFLAGS="${old_ldflags}"
4784 AC_CHECK_HEADERS(getopt.h sys/select.h sys/time.h sys/wait.h pwd.h iconv.h sys/types.h sys/resource.h)
4785 dnl giconv.c will check on HAVE_ICONV_H but we need this for link time
4786 AC_CHECK_LIB(iconv, iconv_open)
4787 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
4788 AC_SUBST(HAVE_ALLOCA_H)
4790 # Get the exact type of size_t, not just its size.
4791 # This is so we can find an exact printf format among u, lu, llu, I64u.
4792 # To avoid warnings about slight mismatches.
4793 # C99 runtime "zu" dependency is being avoided here.
4795 # We have to compile as C++ because C is too lenient
4796 # and lets the wrong thing compile, with warnings.
4798 # Note: "zu" or ifdef <something> have the advantage
4799 # of producing installable "biarch" headers. i.e. one Mac header
4800 # for Mac/x86 and Mac/amd64.
4802 AC_LANG_PUSH(C++)
4804 # Check long before int because it is the overwhelming Unix answer,
4805 # across 32bit and 64bit systems -- fewer compiler invocations in autoconf.
4807 # long ahead of int also tends to produce biarch-compatible headers except Windows.
4809 AC_MSG_CHECKING(if size_t is unsigned long)
4810 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4811         #include <stddef.h>
4812         unsigned long *a = (size_t*)0;
4813 ])], [
4814         AC_MSG_RESULT(yes)
4815         AC_SUBST(GSIZE_FORMAT, '"lu"')
4816 ], [
4817         AC_MSG_RESULT(no)
4818         AC_MSG_CHECKING(if size_t is unsigned int)
4819         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4820                 #include <stddef.h>
4821                 unsigned *a = (size_t*)0;
4822         ])], [
4823                 AC_MSG_RESULT(yes)
4824                 AC_SUBST(GSIZE_FORMAT, '"u"')
4825         ], [
4826 # At this point the majority of systems have their answer,
4827 # and we descend into non-standard or new-standard territory.
4829 # Check __int64 first because I64 on some systems predates ll, enabling
4830 # new compiler/old runtime interop, and the types always have the same size.
4831                 AC_MSG_RESULT(no)
4832                 AC_MSG_CHECKING(if size_t is unsigned __int64)
4833                 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4834                         #include <stddef.h>
4835                         unsigned __int64 *a = (size_t*)0;
4836                 ])], [
4837                         AC_MSG_RESULT(yes)
4838                         AC_SUBST(GSIZE_FORMAT, '"I64u"')
4839                 ], [
4840                         AC_MSG_RESULT(no)
4841                         AC_MSG_CHECKING(if size_t is unsigned long long)
4842                         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4843                                 #include <stddef.h>
4844                                 unsigned long long *a = (size_t*)0;
4845                         ])], [
4846                                 AC_MSG_RESULT(yes)
4847                                 AC_SUBST(GSIZE_FORMAT, '"llu"')
4848                         ], [
4849                                 AC_MSG_RESULT(no)
4850                                 AC_MSG_ERROR(Unable to determine size_t among unsigned long, int, __int64, long long)
4851                         ] )
4852                 ] )
4853         ] )
4854 ] )
4856 AC_LANG_POP
4858 # If size_t/ptrdiff_t is correct, use it. Otherwise C99 [u]intptr_t.
4859 # This provides for an exact match with functions that
4860 # take size_t like malloc and pthread_attr_getstacksize, avoiding warnings.
4861 # uintptr_t is not necessarily the same.
4863 # ptrdiff_t is preferred over ssize_t as it is C89 vs. new Posix.
4864 # ssize_t looks nicer but ptrdiff_t is wrapped up as gssize anyway.
4866 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_size_t; then
4867    GSIZE="size_t"
4868    GSSIZE="ptrdiff_t"
4869 else
4870    GSIZE="uintptr_t"
4871    GSSIZE="intptr_t"
4874 AC_SUBST(GSIZE)
4875 AC_SUBST(GSSIZE)
4876 AC_SUBST(GSIZE_FORMAT)
4879 # END OF EGLIB CHECKS
4882 AC_ARG_WITH([libgdiplus],
4883         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
4884         [], [with_libgdiplus=installed])
4886 # default install location
4887 libgdiplus_install_loc=libgdiplus${libsuffix}
4888 case "$host" in
4889     *-*-*linux*)
4890     libgdiplus_install_loc=libgdiplus${libsuffix}.0
4891     ;;
4892 esac
4894 case $with_libgdiplus in
4895     no)
4896     libgdiplus_loc=
4897     ;;
4899     installed)
4900     libgdiplus_loc=
4901     if test x$cross_compiling = xno; then
4902         if test x$host_darwin = xyes; then
4903             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
4904             if test -x $a; then
4905               libgdiplus_install_loc=$a
4906               libgdiplus_loc=$a
4907             fi
4908         fi
4909     fi
4910     ;;
4912     yes|sibling)
4913     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
4914     ;;
4916     /*) # absolute path, assume it is an install location
4917     libgdiplus_loc=$with_libgdiplus
4918     libgdiplus_install_loc=$with_libgdiplus
4919     ;;
4921     *)
4922     libgdiplus_loc=`pwd`/$with_libgdiplus
4923     ;;
4924 esac
4925 AC_SUBST(libgdiplus_loc)
4926 AC_SUBST(libgdiplus_install_loc)
4928 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)
4929 if test "x$icall_symbol_map" = "xyes"; then
4930    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
4933 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
4934 if test "x$icall_export" = "xyes"; then
4935    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
4938 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
4939 if test "x$icall_tables" = "xno"; then
4940    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
4943 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
4945 if test "x$with_tls" = "x__thread"; then
4946         AC_DEFINE(MONO_KEYWORD_THREAD, __thread, [Have __thread keyword])
4947         # Pass the information to libgc
4948         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
4949         AC_MSG_CHECKING(if the tls_model attribute is supported)
4950         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
4951                 ], [
4952                         AC_MSG_RESULT(yes)
4953                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
4954                 ], [
4955                         AC_MSG_RESULT(no)
4956         ])
4959 if test ${TARGET} = ARM; then
4960         dnl ******************************************
4961         dnl *** Check to see what FPU is available ***
4962         dnl ******************************************
4963         AC_MSG_CHECKING(which FPU to use)
4965         #
4966         # This is a bit tricky:
4967         #
4968         # if (__ARM_PCS_VFP) {
4969         #       /* mfloat-abi=hard == VFP with hard ABI */
4970         # } elif (!__SOFTFP__) {
4971         #       /* mfloat-abi=softfp == VFP with soft ABI */
4972         # } else {
4973         #       /* mfloat-abi=soft == no VFP */
4974         # }
4975         #
4976         # The exception is iOS (w/ GCC) where none of the above
4977         # are defined (but iOS always uses the 'softfp' ABI).
4978         #
4979         # No support for FPA.
4980         #
4982         fpu=NONE
4984         # iOS GCC always uses the 'softfp' ABI.
4985         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
4986                 fpu=VFP
4987         fi
4989         # Are we using the 'hard' ABI?
4990         if test x$fpu = xNONE; then
4991                 AC_TRY_COMPILE([], [
4992                         #ifndef __ARM_PCS_VFP
4993                         #error "Float ABI is not 'hard'"
4994                         #endif
4995                 ], [
4996                         fpu=VFP_HARD
4997                 ], [
4998                         fpu=NONE
4999                 ])
5000         fi
5002         # No 'hard' ABI. 'soft' or 'softfp'?
5003         if test x$fpu = xNONE; then
5004                 AC_TRY_COMPILE([], [
5005                         #ifdef __SOFTFP__
5006                         #error "Float ABI is not 'softfp'"
5007                         #endif
5008                 ], [
5009                         fpu=VFP
5010                 ], [
5011                         fpu=NONE
5012                 ])
5013         fi
5015         if test x$arm_fpu != x; then
5016            fpu=$arm_fpu
5017         fi
5019         AC_MSG_RESULT($fpu)
5020         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
5021         unset fpu
5023         dnl *********************************************
5024         dnl *** Check which ARM version(s) we can use ***
5025         dnl *********************************************
5026         AC_MSG_CHECKING(which ARM version to use)
5028         AC_TRY_COMPILE([], [
5029                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
5030                 #error Not on ARM v5.
5031                 #endif
5032         ], [
5033                 arm_v5=yes
5035                 arm_ver=ARMv5
5036         ], [])
5038         AC_TRY_COMPILE([], [
5039                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
5040                 #error Not on ARM v6.
5041                 #endif
5042         ], [
5043                 arm_v5=yes
5044                 arm_v6=yes
5046                 arm_ver=ARMv6
5047         ], [])
5049         AC_TRY_COMPILE([], [
5050                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
5051                 #error Not on ARM v7.
5052                 #endif
5053         ], [
5054                 arm_v5=yes
5055                 arm_v6=yes
5056                 arm_v7=yes
5058                 arm_ver=ARMv7
5059         ], [])
5061         AC_MSG_RESULT($arm_ver)
5063         if test x$arm_v5 = xyes; then
5064                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
5065                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
5066         fi
5068         if test x$arm_v6 = xyes; then
5069                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
5070                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
5071         fi
5073         if test x$arm_v7 = xyes; then
5074                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
5075                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
5076         fi
5079 if test ${TARGET} = RISCV32 -o ${TARGET} = RISCV64; then
5080         AC_ARG_WITH([riscv-fpabi], [  --with-riscv-fpabi=auto,double,soft   Select RISC-V floating point ABI (auto)], [fpabi=$withval], [fpabi=double])
5082         AC_MSG_CHECKING([which RISC-V floating point ABI to use])
5084         if test x$fpabi = xauto; then
5085                 AC_TRY_COMPILE([], [
5086                         #ifdef __riscv_float_abi_double
5087                         #error "double"
5088                         #endif
5089                 ], [
5090                         fpabi=auto
5091                 ], [
5092                         fpabi=double
5093                 ])
5094         fi
5096         if test x$fpabi = xauto; then
5097                 AC_TRY_COMPILE([], [
5098                         #ifdef __riscv_float_abi_single
5099                         #error "single"
5100                         #endif
5101                 ], [
5102                         fpabi=auto
5103                 ], [
5104                         fpabi=single
5105                 ])
5106         fi
5108         if test x$fpabi = xauto; then
5109                 AC_TRY_COMPILE([], [
5110                         #ifdef __riscv_float_abi_soft
5111                         #error "soft"
5112                         #endif
5113                 ], [
5114                         fpabi=auto
5115                 ], [
5116                         fpabi=soft
5117                 ])
5118         fi
5120         case $fpabi in
5121         double)
5122                 AC_DEFINE([RISCV_FPABI_DOUBLE], [1], [RISC-V FPABI is double-precision])
5123                 AC_MSG_RESULT([double-precision])
5124                 ;;
5125         single)
5126                 AC_DEFINE([RISCV_FPABI_SINGLE], [1], [RISC-V FPABI is single-precision])
5127                 AC_MSG_ERROR([single-precision, not supported])
5128                 ;;
5129         soft)
5130                 AC_DEFINE([RISCV_FPABI_SOFT], [1], [RISC-V FPABI is soft float])
5131                 AC_MSG_RESULT([soft float])
5132                 ;;
5133         auto)
5134                 AC_MSG_ERROR([unknown])
5135                 ;;
5136         *)
5137                 AC_MSG_ERROR([invalid option: $fpabi])
5138                 ;;
5139         esac
5142 if test ${TARGET} = unknown; then
5143         CPPFLAGS="$CPPFLAGS -DNO_PORT"
5144         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
5147 if test "x$platform_android" = "xyes"; then
5148         case "x${TARGET}" in
5149         xARM)
5150                 case "x$arm_ver" in
5151                 xARMv5)
5152                         BTLS_SUPPORTED=yes
5153                         BTLS_PLATFORM=android-armv5
5154                         ;;
5155                 xARMv6)
5156                         BTLS_SUPPORTED=yes
5157                         BTLS_PLATFORM=android-armv6
5158                         ;;
5159                 xARMv7)
5160                         BTLS_SUPPORTED=yes
5161                         BTLS_PLATFORM=android-armv7
5162                         ;;
5163                 *)
5164                         BTLS_SUPPORTED=no
5165                         ;;
5166                 esac
5167                 ;;
5168         xARM64)
5169                 BTLS_SUPPORTED=yes
5170                 BTLS_PLATFORM=android-v8a
5171                 ;;
5172         xX86)
5173                 BTLS_SUPPORTED=yes
5174                 BTLS_PLATFORM=android-x86
5175                 ;;
5176         xAMD64)
5177                 BTLS_SUPPORTED=yes
5178                 BTLS_PLATFORM=android-x64
5179                 ;;
5180         *)
5181                 BTLS_SUPPORTED=no
5182                 ;;
5183         esac
5186 if test ${ACCESS_UNALIGNED} = no; then
5187         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
5190 if test x$host_darwin = xyes; then
5191         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
5192         AS_IF(
5193                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
5194                 [AC_MSG_RESULT([no])],
5195                 [
5196                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
5197                         AR_FLAGS="Scru"
5198                         RANLIB="$RANLIB -no_warning_for_no_symbols"
5199                         AC_MSG_RESULT([yes])
5200                 ]
5201         )
5204 case "x$libgc" in
5205         xincluded)
5206                 # Pass CPPFLAGS to libgc configure
5207                 # We should use a separate variable for this to avoid passing useless and
5208                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
5209                 # This should be executed late so we pick up the final version of CPPFLAGS
5210                 # The problem with this approach, is that during a reconfigure, the main
5211                 # configure scripts gets invoked with these arguments, so we use separate
5212                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
5213                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
5214                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
5215                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
5216                 fi
5217                 # Don't pass -finstrument-for-thread-suspension in, 
5218                 # if these are instrumented it will be very bad news 
5219                 # (infinite recursion, undefined parking behavior, etc)
5220                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
5221                 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\""
5222                 if test "x$support_boehm" = "xyes"; then
5223                         AC_CONFIG_SUBDIRS(libgc)
5224                 fi
5225                 ;;
5226 esac
5228 MALLOC_MEMPOOLS=no
5229 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
5230         if test x$with_malloc_mempools = xyes; then
5231                 MALLOC_MEMPOOLS=yes
5232                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
5233         fi
5237 DISABLE_MCS_DOCS=default
5238 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
5239         if test x$with_mcs_docs != xyes; then
5240                 DISABLE_MCS_DOCS=yes
5241         fi
5243 if test -n "$INSTALL_4_x_TRUE"; then :
5244         DISABLE_MCS_DOCS=yes
5246 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
5247    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
5250 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)],[
5251         if test x$with_lazy_gc_thread_creation != xno ; then
5252                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
5253         fi
5254 ], [with_lazy_gc_thread_creation=no])
5256 dnl *****************************
5257 dnl *** Thread suspend policy ***
5258 dnl *****************************
5260 dnl Set a default hybrid or cooperative suspend on some platforms
5262 dnl Coop default is set by the bitcode preset.
5264 dnl If coop isn't on by default, maybe hybrid should be?
5265 if test x$enable_cooperative_suspend_default != xyes; then
5266         case $HOST in
5267         X86 | AMD64)
5268                 dnl Some host/target confusion, there's no host_osx (and
5269                 dnl host_darwin would be true on iOS not just macOS).
5270                 if test x$target_osx = xyes; then
5271                         enable_hybrid_suspend_default=yes
5272                 elif test x$host_linux = xyes -o x$host_win32 = xyes; then
5273                         enable_hybrid_suspend_default=yes
5274                 fi
5275                 ;;
5276         esac
5279 dnl Now check if there were flags overriding the defaults
5281 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])
5282 AC_ARG_ENABLE(cooperative_suspend, [  --enable-cooperative-suspend      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [], [enable_cooperative_suspend=default])
5284 if test x$enable_cooperative_suspend = xdefault -a x$with_cooperative_gc != xdefault; then
5285         enable_cooperative_suspend=$with_cooperative_gc
5288 if test x$enable_cooperative_suspend = xdefault; then
5289         enable_cooperative_suspend=$enable_cooperative_suspend_default
5292 if test x$enable_cooperative_suspend != xno; then
5293         AC_DEFINE(ENABLE_COOP_SUSPEND,1,[Enable cooperative stop-the-world garbage collection.])
5296 AM_CONDITIONAL([ENABLE_COOP_SUSPEND], [test x$enable_cooperative_suspend != xno])
5298 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])
5300 if test x$enable_hybrid_suspend = xdefault; then
5301    enable_hybrid_suspend=$enable_hybrid_suspend_default
5304 if test x$enable_hybrid_suspend != xno -a x$enable_cooperative_suspend != xno ; then
5305         AC_MSG_ERROR([Hybrid suspend and Cooperative suspend cannot be both enabled.])
5308 if test x$enable_hybrid_suspend != xno ; then
5309         AC_DEFINE(ENABLE_HYBRID_SUSPEND,1,[Enable hybrid suspend for GC stop-the-world])
5312 AM_CONDITIONAL([ENABLE_HYBRID_SUSPEND], [test x$enable_hybrid_suspend != xno])
5314 dnl End of thread suspend policy
5316 dnl ***************************
5317 dnl *** feature experiments ***
5318 dnl ***************************
5320 dnl When adding experiments, also add to mono/utils/mono-experiments.def
5321 AC_ARG_ENABLE(experiment, [ --enable-experiment=LIST       Enable experimental fatures from the comma-separate LIST.  Available experiments: null],[
5323         if test x$enable_experiment != x ; then
5324                 AC_DEFINE(ENABLE_EXPERIMENTS,1,[Enable feature experiments])
5325         fi
5326         for feature in `echo "$enable_experiment" | sed -e "s/,/ /g"`; do
5327                 eval "mono_experiment_test_enable_$feature='yes'"
5328         done
5330         if test "x$mono_experiment_test_enable_all" = "xyes"; then
5331                 eval "mono_experiment_test_enable_null='yes'"
5332                 true
5333         fi
5335         if test "x$mono_experiment_test_enable_null" = "xyes"; then
5336                 AC_DEFINE(ENABLE_EXPERIMENT_null, 1, [Enable experiment 'null'])
5337         fi
5338 ],[])
5340 dnl **********************
5341 dnl *** checked builds ***
5342 dnl **********************
5344 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],[
5346         if test x$enable_checked_build != x ; then
5347                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
5348         fi
5349         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
5350                 eval "mono_checked_build_test_enable_$feature='yes'"
5351         done
5353         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
5354                 eval "mono_checked_build_test_enable_gc='yes'"
5355                 eval "mono_checked_build_test_enable_metadata='yes'"
5356                 eval "mono_checked_build_test_enable_thread='yes'"
5357                 eval "mono_checked_build_test_enable_private_types='yes'"
5358         fi
5360         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
5361                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
5362         fi
5364         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
5365                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
5366         fi
5368         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
5369                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
5370         fi
5372         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
5373                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
5374         fi
5375 ], [])
5377 dnl End of checked builds
5379 AC_CHECK_HEADER([malloc.h], 
5380                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
5381                         [Define to 1 if you have /usr/include/malloc.h.])],,)
5383 if test x"$GCC" = xyes; then
5384         # Implicit function declarations are not 64 bit safe
5385         # Do this late, since this causes lots of configure tests to fail
5386         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
5387         # jay has a lot of implicit declarations
5388         JAY_CFLAGS="-Wno-implicit-function-declaration"
5391 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
5392 # instead of libmono-static.a
5393 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
5394    LIBMONO_LA=libmini-static.la
5395 else
5396    if test x$buildsgen = xyes; then
5397       LIBMONO_LA=libmonosgen-$API_VER.la
5398    else
5399       LIBMONO_LA=libmonoboehm-$API_VER.la
5400    fi
5402 AC_SUBST(LIBMONO_LA)
5404 dnl **************
5405 dnl ***  Btls  ***
5406 dnl **************
5408 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
5409 AC_ARG_ENABLE(btls-lib, [  --disable-btls-lib             Disable building the BTLS native library], enable_btls_lib=$enableval, enable_btls_lib=$BTLS_SUPPORTED)
5410 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
5411 AC_ARG_WITH(btls_android_api, [  --with-btls-android-api        Android NDK API level for BTLS build])
5412 AC_ARG_WITH(btls_android_cmake_toolchain, [  --with-btls-android-cmake-toolchain        Path to the cmake toolchain file for Android])
5413 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])
5415 if test "x$with_btls_android_api" = "x" ; then
5416         case "$BTLS_PLATFORM" in
5417                 android-armv5)
5418                         with_btls_android_api=16" ;;
5419                 android-armv6)
5420                         with_btls_android_api=16" ;;
5421                 android-armv7)
5422                         with_btls_android_api=16 ;;
5423                 android-v8a)
5424                         with_btls_android_api=21 ;;
5425                 android-x86)
5426                         with_btls_android_api=16 ;;
5427                 android-x64)
5428                         with_btls_android_api=21 ;;
5429         esac
5432 if test "x$enable_btls" = "xno"; then
5433    enable_btls_lib=no
5436 AM_CONDITIONAL(BTLS, test x$enable_btls_lib = xyes)
5438 btls_android=no
5439 if test "x$enable_btls" = "xyes"; then
5440         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
5441         if test "x$CMAKE" = "xno"; then
5442                 AC_MSG_ERROR("cmake not found")
5443         fi
5445         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
5446         AC_SUBST(BTLS_ROOT)
5448         btls_arch=
5449         btls_cflags=
5450         BTLS_CMAKE_ARGS=
5452         if test "x$host_win32" = "xyes"; then
5453                 AC_CHECK_PROG(HAVE_YASM, yasm, yes, no)
5454         fi
5456         case "$BTLS_PLATFORM" in
5457         i386)
5458                 btls_arch=i386
5459                 btls_cflags="-m32"
5460                 case $host_os in
5461                         darwin*)
5462                                 btls_cflags="$btls_cflags -arch i386"
5463                                 ;;
5464                         mingw*|cygwin*)
5465                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5466                                 if test "x$HAVE_YASM" != "xyes"; then
5467                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5468                                 fi
5469                                 ;;
5470                 esac
5471                 ;;
5472         x86_64)
5473                 btls_arch=x86_64
5474                 case $host_os in
5475                         mingw*|cygwin*)
5476                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5477                                 if test "x$HAVE_YASM" != "xyes"; then
5478                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5479                                 fi
5480                                 ;;
5481                 esac
5482                 ;;
5483         arm)
5484                 btls_arch=arm
5485                 btls_cflags="-DOPENSSL_NO_ASM=1"
5486                 ;;
5487         armsoft)
5488                 btls_arch=arm
5489                 btls_cflags="-DOPENSSL_NO_ASM=1"
5490                 ;;
5491         aarch64)
5492                 btls_arch=aarch64
5493                 btls_cflags="-march=armv8-a+crypto"
5494                 ;;
5495         s390x)
5496                 btls_arch=s390x
5497                 ;;
5498         powerpc)
5499                 btls_arch=powerpc
5500                 case $host_os in
5501                         aix*|os400*)
5502                                 btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
5503                                 BTLS_CMAKE_ARGS="-DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
5504                 esac
5505                 ;;
5506         android-armv5)
5507                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5508                 ;;
5509         android-armv6)
5510                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5511                 ;;
5512         android-armv7)
5513                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5514                 ;;
5515         android-v8a)
5516                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5517                 ;;
5518         android-x86)
5519                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5520                 ;;
5521         android-x64)
5522                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5523                 ;;
5524         riscv32)
5525                 btls_arch=riscv32
5526                 ;;
5527         riscv64)
5528                 btls_arch=riscv64
5529                 ;;
5530         *)
5531                 AC_MSG_ERROR(Invalid BTLS platform)
5532         esac
5534         if test "x$platform_android" = "xyes"; then
5535                 if test "x$with_btls_android_cmake_toolchain" = "x"; then
5536                    with_btls_android_cmake_toolchain="$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
5537                 fi
5539                 if test "x$with_btls_android_ndk_asm_workaround" != "x"; then
5540                    BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DENABLE_NDK_ARM_WORKAROUND=ON"
5541                 fi
5543                 btls_android=yes
5544                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$with_btls_android_cmake_toolchain"
5545                 if test "x$with_btls_android_ndk" != "x"; then
5546                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
5547                 else
5548                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
5549                 fi
5550         fi
5552         if test "x$btls_arch" != "x"; then
5553                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
5554         fi
5556         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
5557         AC_SUBST(BTLS_ARCH)
5558         AC_SUBST(BTLS_CFLAGS)
5559         AC_SUBST(BTLS_PLATFORM)
5560         AC_SUBST(BTLS_CMAKE_ARGS)
5562         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
5563 else
5564         enable_btls=no
5567 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
5569 if test x$DISABLE_MCS_DOCS = xyes; then
5570    docs_dir=""
5571 else
5572    docs_dir=docs
5574 AC_SUBST(docs_dir)
5576 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
5577 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
5578 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
5580 libmono_ldflags="$libmono_ldflags $LIBS"
5582 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
5583 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
5584 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
5585 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
5586 AM_CONDITIONAL(X86, test x$TARGET = xX86)
5587 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
5588 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
5589 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
5590 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
5591 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
5592 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64)
5593 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
5594 AM_CONDITIONAL([RISCV], [test x$TARGET = xRISCV32 -o x$TARGET = xRISCV64])
5595 AM_CONDITIONAL([RISCV32], [test x$TARGET = xRISCV32])
5596 AM_CONDITIONAL([RISCV64], [test x$TARGET = xRISCV64])
5597 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
5598 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
5599 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
5600 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
5601 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
5602 AM_CONDITIONAL([HOST_RISCV], [test x$HOST = xRISCV32 -o x$HOST = xRISCV64])
5603 AM_CONDITIONAL([HOST_RISCV32], [test x$HOST = xRISCV32])
5604 AM_CONDITIONAL([HOST_RISCV64], [test x$HOST = xRISCV64])
5605 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
5607 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
5609 AC_SUBST(LIBC)
5610 AC_SUBST(INTL)
5611 AC_SUBST(SQLITE)
5612 AC_SUBST(SQLITE3)
5613 AC_SUBST(X11)
5614 AC_SUBST(GDKX11)
5615 AC_SUBST(GTKX11)
5616 AC_SUBST(XINERAMA)
5617 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
5618 AC_SUBST(arch_target)
5619 AC_SUBST(CFLAGS)
5620 AC_SUBST(CPPFLAGS)
5621 AC_SUBST(LDFLAGS)
5623 #This must always be defined when building the runtime
5624 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
5626 mono_build_root=`pwd`
5627 AC_SUBST(mono_build_root)
5629 AC_ARG_ENABLE(msvc,[  --enable-msvc    Build with Visual Studio (msvc) (defaults to no)], enable_msvc=$enableval, enable_msvc=no)
5630 if test x$host_win32 = xno; then
5631         if test x$enable_msvc = xyes; then
5632                 echo "Error, --enable-msvc only supported for Windows builds."
5633                 exit 1
5634         fi
5636 AM_CONDITIONAL(ENABLE_MSVC, test x$enable_msvc = xyes)
5638 if test "x$enable_msvc" = "xyes"; then
5639         if test "x$support_boehm" = "xyes"; then
5640                 echo "Error, Boehm GC is not supported when using --enable-msvc."
5641                 exit 1
5642         fi
5643         mono_msvc_build_dir='$(top_srcdir)'/msvc/build/sgen
5644         if test "x$host_cpu" = "xi686"; then
5645                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/Win32/lib/Release
5646                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/Win32/bin/Release
5647                 mono_runtime=msvc/build/sgen/Win32/bin/Release/mono-sgen.exe
5648         else
5649                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/x64/lib/Release
5650                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/x64/bin/Release
5651                 mono_runtime=msvc/build/sgen/x64/bin/Release/mono-sgen.exe
5652         fi
5653         AC_SUBST(mono_msvc_build_dir)
5654         AC_SUBST(mono_msvc_build_lib_dir)
5655         AC_SUBST(mono_msvc_build_bin_dir)
5656 else
5657         mono_runtime=mono/mini/mono
5660 AC_SUBST(mono_runtime)
5662 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/Microsoft.Net.Compilers.2.8.2/tools/csc.exe
5664 if test $csc_compiler = mcs; then
5665   CSC=$mcs_topdir/class/lib/build/mcs.exe
5666 else
5667   CSC=$CSC_LOCATION
5670 AM_CONDITIONAL([CSC_IS_ROSLYN], [test x$csc_compiler != xmcs])
5672 mono_cfg_root=$mono_build_root/runtime
5673 if test x$host_win32 = xyes; then
5674   if test "x$cross_compiling" = "xno"; then
5675     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
5676     CSC=`cygpath -m -a $CSC`
5677     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
5678   else
5679     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
5680   fi
5681 else
5682   mono_cfg_dir=$mono_cfg_root/etc
5685 if test "x$platform_android" = "xyes"; then
5686   mono_cfg_dir=
5689 AC_SUBST(mono_cfg_dir)
5691 AC_SUBST(CSC)
5693 AC_CONFIG_FILES([po/mcs/Makefile.in])
5695 AC_CONFIG_FILES([acceptance-tests/microbench-perf.sh],[chmod +x acceptance-tests/microbench-perf.sh])
5696 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
5697 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
5699 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
5700 [   depth=../../../..
5701     case $srcdir in
5702     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5703     .) reldir=$depth ;;
5704     *) reldir=$depth/$srcdir ;;
5705     esac
5706     $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
5707     cd runtime/etc/mono/1.0
5708     rm -f machine.config
5709     $LN_S $reldir/data/net_1_1/machine.config machine.config
5710     cd $depth
5711 ],[LN_S='$LN_S'])
5713 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
5714 [   depth=../../../..
5715     case $srcdir in
5716     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5717     .) reldir=$depth ;;
5718     *) reldir=$depth/$srcdir ;;
5719     esac
5720     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5721     cd runtime/etc/mono/2.0
5722     rm -f machine.config
5723     $LN_S $reldir/data/net_2_0/machine.config machine.config
5724     cd $depth
5725 ],[LN_S='$LN_S'])
5727 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
5728 [   depth=../../../..
5729     case $srcdir in
5730     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5731     .) reldir=$depth ;;
5732     *) reldir=$depth/$srcdir ;;
5733     esac
5734     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5735     cd runtime/etc/mono/2.0
5736     rm -f web.config
5737     $LN_S $reldir/data/net_2_0/web.config web.config
5738     cd $depth
5739 ],[LN_S='$LN_S'])
5741 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
5742 [   depth=../../..
5743     case $srcdir in
5744     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5745     .) reldir=$depth ;;
5746     *) reldir=$depth/$srcdir ;;
5747     esac
5748     $ac_aux_dir/install-sh -d runtime/etc/mono/
5749     cd runtime/etc/mono/
5750     rm -f browscap.ini
5751     $LN_S $reldir/data/browscap.ini browscap.ini
5752     cd $depth
5753 ],[LN_S='$LN_S'])
5755 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
5756 [   depth=../../../../..
5757     case $srcdir in
5758     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5759     .) reldir=$depth ;;
5760     *) reldir=$depth/$srcdir ;;
5761     esac
5762     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
5763     cd runtime/etc/mono/2.0/Browsers
5764     rm -f Compat.browser
5765     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5766     cd $depth
5767 ],[LN_S='$LN_S'])
5769 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
5770 [   depth=../../../../..
5771     case $srcdir in
5772     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5773     .) reldir=$depth ;;
5774     *) reldir=$depth/$srcdir ;;
5775     esac
5776     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
5777     cd runtime/etc/mono/4.0/Browsers
5778     rm -f Compat.browser
5779     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5780     cd $depth
5781 ],[LN_S='$LN_S'])
5783 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
5784 [   depth=../../../../..
5785     case $srcdir in
5786     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5787     .) reldir=$depth ;;
5788     *) reldir=$depth/$srcdir ;;
5789     esac
5790     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
5791     cd runtime/etc/mono/4.5/Browsers
5792     rm -f Compat.browser
5793     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5794     cd $depth
5795 ],[LN_S='$LN_S'])
5797 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
5798 [   depth=../../../..
5799     case $srcdir in
5800     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5801     .) reldir=$depth ;;
5802     *) reldir=$depth/$srcdir ;;
5803     esac
5804     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5805     cd runtime/etc/mono/4.0
5806     rm -f machine.config
5807     $LN_S $reldir/data/net_4_0/machine.config machine.config
5808     cd $depth
5809 ],[LN_S='$LN_S'])
5811 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
5812 [   depth=../../../..
5813     case $srcdir in
5814     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5815     .) reldir=$depth ;;
5816     *) reldir=$depth/$srcdir ;;
5817     esac
5818     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5819     cd runtime/etc/mono/4.0
5820     rm -f web.config
5821     $LN_S $reldir/data/net_4_0/web.config web.config
5822     cd $depth
5823 ],[LN_S='$LN_S'])
5825 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
5826 [   depth=../../../..
5827     case $srcdir in
5828     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5829     .) reldir=$depth ;;
5830     *) reldir=$depth/$srcdir ;;
5831     esac
5832     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5833     cd runtime/etc/mono/4.5
5834     rm -f machine.config
5835     $LN_S $reldir/data/net_4_5/machine.config machine.config
5836     cd $depth
5837 ],[LN_S='$LN_S'])
5839 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
5840 [   depth=../../../..
5841     case $srcdir in
5842     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5843     .) reldir=$depth ;;
5844     *) reldir=$depth/$srcdir ;;
5845     esac
5846     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5847     cd runtime/etc/mono/4.5
5848     rm -f web.config
5849     $LN_S $reldir/data/net_4_5/web.config web.config
5850     cd $depth
5851 ],[LN_S='$LN_S'])
5853 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])
5854 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])
5855 AC_CONFIG_COMMANDS([clean-llvm], [rm -f llvm/llvm_config.mk])
5857 # Anything involving -Werror must be done late because autoconf depends on compiling with warnings to be success.
5858 if test x"$GCC" = xyes && "x$with_jemalloc" != "xyes"; then
5860         # incompatible-pointer-types requires gcc circa 5.x
5862         ORIG_CFLAGS=$CFLAGS
5863         CFLAGS="$CFLAGS -Wincompatible-pointer-types -Werror"
5864         AC_MSG_CHECKING(for -Wincompatible-pointer-types option to gcc)
5865         AC_TRY_COMPILE([],[
5866         ], [
5867                 AC_MSG_RESULT(yes)
5868                 CFLAGS="$ORIG_CFLAGS -Werror=incompatible-pointer-types"
5869         ], [
5870                 AC_MSG_RESULT(no)
5871                 CFLAGS=$ORIG_CFLAGS
5872         ])
5876 # Mono.Native Support
5877 # -------------------
5878 # Mono.Native is the new name for both System.Native and System.Security.Cryptography.Apple.
5879 # It is built as a stand-alone shared library and not bundled with the runtime because we
5880 # may need to build two different versions of it.
5882 # Starting with macOS 10.12+ and iOS 10+, Apple introduced a new Unified API for some of the
5883 # crypto primitives that we're using as part of System.Security.Cryptography.Apple.
5885 # On Desktop, we can check at runtime whether the OS version is recent enough and switch
5886 # implementation accordingly.  We build a single `libmono_native` shared library.
5888 # However, on Mobile we cannot have any undefined symbols as this would break Bitcode.
5890 # During the mobile build, we are called with `CC` containing an explicit minium version flag,
5891 # which is eiter `-mmacosx-version-min=`, `-mios-simulator-version-min=` or `-miphoneos-version-min=`
5892 # depending on platform.
5894 # We build two versions of the shared library:
5895 # - `libmono_native_compat` is built with whichever minimum version is passed to us via `CC`.
5896 # - `libmono_native_unifed` is built with the minimum version set to macOS 10.12+ / iOS 10+.
5898 # For testing purpuses, there is a function called `mono_native_get_platform_type ()`
5899 # (see mono/native/mono-native-platform.c), which returns a `MonoNativePlatformType` enum value.
5900 # There is also `Mono.MonoNativePlatform.GetPlatformType ()` (see mcs/class/System/Mono/MonoNativePlatform.cs).
5902 # This can be called by automated tests both to ensure that the library has been correctly installed and also
5903 # to verify that it's the correct version of it.
5906 sed_version_pattern='[[0-9]]\{1,2\}\(\.[[0-9]]\{1,2\}\)'
5907 if test x$target_osx = xyes; then
5908         sed_remove_mac_version_pattern="s/-mmacosx-version-min=$sed_version_pattern//g"
5909         grep_find_mac_version_pattern="-mmacosx-version-min=$sed_version_pattern"
5910         mono_native_compat_version=`echo $CC | grep -o -e $grep_find_mac_version_pattern`
5911         MONO_NATIVE_CC=`echo $CC | sed -e $sed_remove_mac_version_pattern`
5912         MONO_NATIVE_CXX=`echo $CXX | sed -e $sed_remove_mac_version_pattern`
5913         MONO_NATIVE_CPPFLAGS=`echo $CPPFLAGS | sed -e $sed_remove_mac_version_pattern`
5914         MONO_NATIVE_CFLAGS=`echo $CFLAGS | sed -e $sed_remove_mac_version_pattern`
5915         MONO_NATIVE_CXXFLAGS=`echo $CXXFLAGS | sed -e $sed_remove_mac_version_pattern`
5916         MONO_NATIVE_LDFLAGS=`echo $LDFLAGS | sed -e $sed_remove_mac_version_pattern`
5918         mono_native=yes
5919         MONO_NATIVE_PLATFORM=macos
5920         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_MACOS"
5921         AC_MSG_CHECKING([Mono.Native support])
5922         AC_MSG_RESULT(macos)
5924         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer],
5925                 [!(MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12)])
5927         if test x$mono_native_compat = xyes; then
5928                 mono_native_compat=yes
5929                 mono_native_text="Mac OSX (compat+unified)"
5930                 MONO_NATIVE_COMPAT_CFLAGS="$CFLAGS $mono_native_compat_version"
5931                 MONO_NATIVE_COMPAT_LDFLAGS="$LDFLAGS $mono_native_compat_version"
5932                 MONO_NATIVE_UNIFIED_CFLAGS="$MONO_NATIVE_CFLAGS -mmacosx-version-min=10.12"
5933                 MONO_NATIVE_UNIFIED_LDFLAGS="$MONO_NATIVE_LDFLAGS -mmacosx-version-min=10.12"
5934         else
5935                 mono_native_compat=no
5936                 mono_native_text="Mac OSX"
5937         fi
5938 elif test x$mono_native_platform_ios = xyes; then
5939         AC_MONO_APPLE_TARGET(TARGET_OS_SIMULATOR, [mono_native_ios_sim=yes], [mono_native_ios_sim=no])
5941         AC_MONO_APPLE_TARGET(TARGET_OS_IOS, [
5942                 if test x$mono_native_ios_sim = xyes; then
5943                         mono_native_ios_target=ios-simulator
5944                         mono_native_text="iOS Simulator"
5945                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5946                 else
5947                         mono_native_ios_target=iphoneos
5948                         mono_native_text="iOS Device"
5949                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5950                 fi
5951                 mono_native_unified_version="10.0"
5952                 mono_native_compat_check="__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_10_0"
5953         ], [
5954                 AC_MONO_APPLE_TARGET(TARGET_OS_TV, [
5955                         if test x$mono_native_ios_sim = xyes; then
5956                                 mono_native_ios_target=tvos-simulator
5957                                 mono_native_text="AppleTV Simulator"
5958                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5959                         else
5960                                 mono_native_ios_target=tvos
5961                                 mono_native_text="AppleTV Device"
5962                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5963                         fi
5964                         mono_native_unified_version="10.0"
5965                         mono_native_compat_check="__TV_OS_VERSION_MIN_REQUIRED >= __TVOS_10_0"
5966                 ], [
5967                         AC_MONO_APPLE_TARGET(TARGET_OS_WATCH, [
5968                                 if test x$mono_native_ios_sim = xyes; then
5969                                         mono_native_ios_target=watchos-simulator
5970                                         mono_native_text="Apple Watch Simulator"
5971                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5972                                 else
5973                                         mono_native_ios_target=watchos
5974                                         mono_native_text="Apple Watch Device"
5975                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5976                                 fi
5977                                 mono_native_unified_version="5.0"
5978                                 mono_native_compat_check="__WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_5_0"
5979                         ], [
5980                                 AC_MSG_ERROR([Unknown iOS Target])
5981                         ])
5982                 ])
5983         ])
5985         AC_MSG_CHECKING([Mono.Native support])
5986         AC_MSG_RESULT([$mono_native_ios_target])
5988         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer], [!($mono_native_compat_check)])
5990         sed_remove_ios_version_pattern="s/-m\(.*\)-version-min=$sed_version_pattern//g"
5991         grep_find_ios_version_pattern="-m$mono_native_ios_target-version-min=$sed_version_pattern"
5993         mono_native_compat_version=`echo $CC | grep -o -e $grep_find_ios_version_pattern`
5995         if test x$with_bitcode = xyes; then
5996                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -no-undefined -fatal_warnings"
5997                 MONO_NATIVE_LIBADD="../mini/$LIBMONO_LA"
5998         else
5999                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -fatal_warnings"
6000         fi
6002         if test x$enable_gss = xyes; then
6003                 mono_native_ldflags="$mono_native_ldflags -framework GSS"
6004         fi
6006         MONO_NATIVE_CC=`echo $CC | sed -e $sed_remove_ios_version_pattern`
6007         MONO_NATIVE_CXX=`echo $CXX | sed -e $sed_remove_ios_version_pattern`
6008         MONO_NATIVE_CPPFLAGS=`echo $CPPFLAGS | sed -e $sed_remove_ios_version_pattern`
6009         MONO_NATIVE_CXXFLAGS=`echo $CXXFLAGS | sed -e $sed_remove_ios_version_pattern`
6010         MONO_NATIVE_CFLAGS=`echo $CFLAGS | sed -e $sed_remove_ios_version_pattern`
6011         MONO_NATIVE_LDFLAGS=`echo $LDFLAGS $mono_native_ldflags | sed -e $sed_remove_ios_version_pattern`
6013         if test x$mono_native_compat = xyes; then
6014                 mono_native_text="$mono_native_text (compat+unified)"
6015                 MONO_NATIVE_COMPAT_CFLAGS="$CFLAGS $mono_native_compat_version"
6016                 MONO_NATIVE_COMPAT_LDFLAGS="$LDFLAGS $mono_native_compat_version"
6017                 MONO_NATIVE_UNIFIED_CFLAGS="$MONO_NATIVE_CFLAGS -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6018                 MONO_NATIVE_UNIFIED_LDFLAGS="$MONO_NATIVE_LDFLAGS -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6019         fi
6021         mono_native=yes
6022         MONO_NATIVE_PLATFORM=ios
6023 elif test x$host_linux = xyes; then
6024         mono_native_text="Linux"
6025         MONO_NATIVE_CC=$CC
6026         MONO_NATIVE_CXX=$CXX
6027         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6028         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6029         MONO_NATIVE_CFLAGS=$CFLAGS
6030         MONO_NATIVE_LDFLAGS=$LDFLAGS
6032         mono_native=yes
6033         mono_native_compat=no
6034         MONO_NATIVE_PLATFORM=linux
6035         AC_MSG_CHECKING([Mono.Native support])
6036         AC_MSG_RESULT(linux)
6038         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
6039 elif test x$target_wasm = xyes; then
6040         mono_native_text="wasm"
6041         MONO_NATIVE_CC=$CC
6042         MONO_NATIVE_CXX=$CXX
6043         # The system.native code uses _WASM_ to check for wasm
6044         MONO_NATIVE_CPPFLAGS="$CPPFLAGS -D_WASM_"
6045         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6046         MONO_NATIVE_CFLAGS=$CFLAGS
6047         MONO_NATIVE_LDFLAGS=$LDFLAGS
6049         mono_native=yes
6050         mono_native_compat=no
6051         MONO_NATIVE_PLATFORM=linux
6052         AC_MSG_CHECKING([Mono.Native support])
6053         AC_MSG_RESULT(wasm)
6055         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
6056 elif case $host_os in aix*|os400*) true;; *) false;; esac; then
6057         mono_native_text="AIX"
6058         MONO_NATIVE_CC=$CC
6059         MONO_NATIVE_CXX=$CXX
6060         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6061         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6062         MONO_NATIVE_CFLAGS=$CFLAGS
6063         MONO_NATIVE_LDFLAGS=$LDFLAGS
6065         mono_native=yes
6066         mono_native_compat=no
6067         MONO_NATIVE_PLATFORM=aix
6068         AC_MSG_CHECKING([Mono.Native support])
6069         AC_MSG_RESULT(aix)
6071         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_AIX"
6072 elif test x$platform_android = xyes; then
6073         mono_native_text="Android"
6074         MONO_NATIVE_CC=$CC
6075         MONO_NATIVE_CXX=$CXX
6076         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6077         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6078         MONO_NATIVE_CFLAGS=$CFLAGS
6079         MONO_NATIVE_LDFLAGS=$LDFLAGS
6081         mono_native=yes
6082         mono_native_compat=no
6083         MONO_NATIVE_PLATFORM=android
6084         AC_MSG_CHECKING([Mono.Native support])
6085         AC_MSG_RESULT(Android)
6087         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_ANDROID"
6088 else
6089         mono_native=no
6090         mono_native_text="no"
6091         AC_MSG_CHECKING([Mono.Native support])
6092         AC_MSG_RESULT(no)
6095 if test x$mono_native_compat = xyes; then
6096         MONO_NATIVE_LIBRARY_NAME=libmono-native-compat
6097 else
6098         MONO_NATIVE_LIBRARY_NAME=libmono-native
6101 AC_SUBST(MONO_NATIVE_PLATFORM)
6102 AC_SUBST(MONO_NATIVE_CC)
6103 AC_SUBST(MONO_NATIVE_CXX)
6104 AC_SUBST(MONO_NATIVE_CPPFLAGS)
6105 AC_SUBST(MONO_NATIVE_CXXFLAGS)
6106 AC_SUBST(MONO_NATIVE_CFLAGS)
6107 AC_SUBST(MONO_NATIVE_COMPAT_CFLAGS)
6108 AC_SUBST(MONO_NATIVE_UNIFIED_CFLAGS)
6109 AC_SUBST(MONO_NATIVE_LDFLAGS)
6110 AC_SUBST(MONO_NATIVE_COMPAT_LDFLAGS)
6111 AC_SUBST(MONO_NATIVE_UNIFIED_LDFLAGS)
6112 AC_SUBST(MONO_NATIVE_LIBRARY_NAME)
6113 AC_SUBST(MONO_NATIVE_LIBADD)
6115 AM_CONDITIONAL(MONO_NATIVE, test x$mono_native = xyes)
6116 AM_CONDITIONAL(MONO_NATIVE_COMPAT, test x$mono_native_compat = xyes)
6117 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_MACOS, test x$MONO_NATIVE_PLATFORM = xmacos)
6118 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_IOS, test x$MONO_NATIVE_PLATFORM = xios)
6119 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_LINUX, test x$MONO_NATIVE_PLATFORM = xlinux)
6120 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_AIX, test x$MONO_NATIVE_PLATFORM = xaix)
6121 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_ANDROID, test x$MONO_NATIVE_PLATFORM = xandroid)
6123 MONO_NATIVE_PLATFORM_TYPE_COMPAT="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_COMPAT"
6124 MONO_NATIVE_PLATFORM_TYPE_UNIFIED="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_UNIFIED"
6125 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE)
6126 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_COMPAT)
6127 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_UNIFIED)
6129 # Update all submodules recursively to ensure everything is checked out
6130 (cd $srcdir && scripts/update_submodules.sh)
6132 AC_OUTPUT([
6133 Makefile
6134 mono-uninstalled.pc
6135 acceptance-tests/Makefile
6136 llvm/Makefile
6137 scripts/mono-find-provides
6138 scripts/mono-find-requires
6139 mk/Makefile
6140 mono/Makefile
6141 mono/btls/Makefile
6142 mono/native/Makefile
6143 mono/utils/Makefile
6144 mono/utils/jemalloc/Makefile
6145 mono/metadata/Makefile
6146 mono/dis/Makefile
6147 mono/cil/Makefile
6148 mono/arch/Makefile
6149 mono/arch/x86/Makefile
6150 mono/arch/amd64/Makefile
6151 mono/arch/ppc/Makefile
6152 mono/arch/sparc/Makefile
6153 mono/arch/s390x/Makefile
6154 mono/arch/arm/Makefile
6155 mono/arch/arm64/Makefile
6156 mono/arch/mips/Makefile
6157 mono/arch/riscv/Makefile
6158 mono/sgen/Makefile
6159 mono/native/platform-type.c
6160 mono/native/platform-type-compat.c
6161 mono/native/platform-type-unified.c
6162 mono/tests/Makefile
6163 mono/tests/assembly-load-reference/Makefile
6164 mono/tests/tests-config
6165 mono/tests/gc-descriptors/Makefile
6166 mono/tests/testing_gac/Makefile
6167 mono/tests/llvmonly-mixed/Makefile
6168 mono/unit-tests/Makefile
6169 mono/benchmark/Makefile
6170 mono/mini/Makefile
6171 mono/profiler/Makefile
6172 mono/eglib/Makefile
6173 mono/eglib/eglib-config.h
6174 mono/eglib/test/Makefile
6175 m4/Makefile
6176 ikvm-native/Makefile
6177 scripts/Makefile
6178 man/Makefile
6179 docs/Makefile
6180 data/Makefile
6181 data/net_2_0/Makefile
6182 data/net_4_0/Makefile
6183 data/net_4_5/Makefile
6184 data/net_2_0/Browsers/Makefile
6185 data/net_4_0/Browsers/Makefile
6186 data/net_4_5/Browsers/Makefile
6187 data/mint.pc
6188 data/mono-2.pc
6189 data/monosgen-2.pc
6190 data/mono.pc
6191 data/mono-cairo.pc
6192 data/mono-nunit.pc
6193 data/mono-options.pc
6194 data/mono-lineeditor.pc
6195 data/monodoc.pc
6196 data/dotnet.pc
6197 data/dotnet35.pc
6198 data/wcf.pc
6199 data/cecil.pc
6200 data/system.web.extensions_1.0.pc
6201 data/system.web.extensions.design_1.0.pc
6202 data/system.web.mvc.pc
6203 data/system.web.mvc2.pc
6204 data/system.web.mvc3.pc
6205 data/aspnetwebstack.pc
6206 data/reactive.pc
6207 samples/Makefile
6208 support/Makefile
6209 data/config
6210 tools/Makefile
6211 tools/locale-builder/Makefile
6212 tools/sgen/Makefile
6213 tools/monograph/Makefile
6214 tools/pedump/Makefile
6215 runtime/Makefile
6216 msvc/Makefile
6217 po/Makefile
6220 if test x$host_win32 = xyes; then
6221    # Get rid of 'cyg' prefixes in library names
6222    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6223    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
6224    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
6225    # executable doesn't work...
6226    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6229 if test x$host_darwin = xyes; then
6230    # This doesn't seem to be required and it slows down parallel builds
6231    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
6235   case $prefix in
6236   NONE) prefix=$ac_default_prefix ;;
6237   esac
6238   case $exec_prefix in
6239   NONE) exec_prefix='${prefix}' ;;
6240   esac
6242   #
6243   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
6244   # any existing config.make.  This allows people to share the same source tree
6245   # with different build directories, one native and one cross
6246   #
6247   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
6249     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
6251     echo "prefix=$prefix" > $mcs_topdir/build/config.make
6252     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
6253     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
6254     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
6255     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
6256     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
6257     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
6258     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
6259     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
6261     case $INSTALL in
6262     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
6263     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
6264     esac
6266     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
6268     export VERSION
6269     [myver=$($AWK 'BEGIN {
6270       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
6271       if(length(vsplit [1]) > 4) {
6272         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
6273       }
6274       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
6275     }')]
6277     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
6278     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
6280     if test x$host_darwin = xyes; then
6281       echo "BUILD_PLATFORM = macos" >> $mcs_topdir/build/config.make
6282       echo "HOST_PLATFORM ?= macos" >> $mcs_topdir/build/config.make
6283       echo "XTEST_PLATFORM ?= osx" >> $mcs_topdir/build/config.make
6284     elif test x$host_win32 = xyes; then
6285       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
6286       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
6287       echo "XTEST_PLATFORM ?= windows" >> $mcs_topdir/build/config.make
6288     elif test x$host_linux = xyes; then
6289       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
6290       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6291       echo "XTEST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6292     else
6293       echo "BUILD_PLATFORM = unix" >> $mcs_topdir/build/config.make
6294       echo "HOST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6295       echo "XTEST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6296     fi
6298     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
6299       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
6300     fi
6302         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
6303            enable_system_aot=yes
6304         fi
6306     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
6307       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
6308     fi
6310     if test x$DISABLE_MCS_DOCS = xyes; then
6311       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
6312     fi
6314     if test x$has_extension_module != xno; then
6315         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
6316     fi
6317     
6318     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
6319     
6320     if test "x$test_bcl_opt" = "xyes"; then    
6321       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
6322     fi
6324     echo "CSC_LOCATION = $CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
6326     if test $csc_compiler = mcs; then
6327       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
6328     fi
6330     if test "x$AOT_BUILD_FLAGS" != "x" ; then
6331       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
6332       echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
6333       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
6334     fi
6336     if test "x$AOT_MODE" != "x" ; then
6337       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
6338     fi
6340     if test "x$enable_btls" = "xyes"; then
6341       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
6342     fi
6344     if test "x$mono_native" = "xyes"; then
6345       echo "MONO_NATIVE_SUPPORTED=true" >> $srcdir/$mcsdir/build/config.make
6346     else
6347       echo "MONO_NATIVE_SUPPORTED=false" >> $srcdir/$mcsdir/build/config.make
6348     fi
6350     if test x$mono_native_compat = xyes; then
6351       echo "MONO_NATIVE_USING_COMPAT=true" >> $srcdir/$mcsdir/build/config.make
6352     else
6353       echo "MONO_NATIVE_USING_COMPAT=false" >> $srcdir/$mcsdir/build/config.make
6354     fi
6356     echo "MONO_NATIVE_PLATFORM_TYPE=$MONO_NATIVE_PLATFORM_TYPE" >> $srcdir/$mcsdir/build/config.make
6357     echo "MONO_NATIVE_PLATFORM=$MONO_NATIVE_PLATFORM" >> $srcdir/$mcsdir/build/config.make
6359   fi
6363 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
6365 btls_platform_string=
6366 if test x$enable_btls = xyes; then
6367         if test x$btls_android = xyes; then
6368                 btls_platform_string=" (android:$BTLS_PLATFORM)"
6369         else
6370                 btls_platform_string=" ($BTLS_PLATFORM)"
6371         fi
6374 thread_suspend_msg=
6375 if test x$buildsgen = xyes; then
6376         if test x$enable_cooperative_suspend != xno; then
6377                 thread_suspend_msg="Suspend:       Cooperative"
6378         elif test x$enable_hybrid_suspend != xno; then
6379                 thread_suspend_msg="Suspend:       Hybrid"
6380         else
6381                 thread_suspend_msg="Suspend:       Preemptive"
6382         fi
6384         
6385 echo "
6386         mcs source:    $mcsdir
6387         C# Compiler:   $csc_compiler
6389    Engine:
6390         Host:          $host
6391         Target:        $target
6392         GC:            $gc_msg 
6393         $thread_suspend_msg
6394         TLS:           $with_tls
6395         SIGALTSTACK:   $with_sigaltstack
6396         Engine:        $jit_status
6397         BigArrays:     $enable_big_arrays
6398         DTrace:        $enable_dtrace
6399         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm, built in-tree: $internal_llvm, assertions: $enable_llvm_asserts, msvc only: $enable_llvm_msvc_only)
6400         Spectre:       $spectre_mitigation_status
6401         Mono.Native:   $mono_native_text
6403    Libraries:
6404         .NET 4.x:        $with_profile4_x
6405         Xamarin.Android: $with_monodroid
6406         Xamarin.iOS:     $with_monotouch
6407         Xamarin.WatchOS: $with_monotouch_watch
6408         Xamarin.TVOS:    $with_monotouch_tv
6409         Xamarin.Mac:     $with_xammac
6410         Windows AOT:     $with_winaot
6411         Orbis:           $with_orbis
6412         Unreal:          $with_unreal
6413         WebAssembly:     $with_wasm
6414         Test profiles:   AOT Full ($with_testing_aot_full), AOT Hybrid ($with_testing_aot_hybrid)
6415         JNI support:     $jdk_headers_found
6416         libgdiplus:      $libgdiplus_msg
6417         zlib:            $zlib_msg
6418         BTLS:            $enable_btls$btls_platform_string
6419         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
6420         crash reporting: $crash_reporting (private crashes: $with_crash_privacy)
6421         .NET Core:       $with_core
6422         $disabled
6424 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
6425    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)