[interp] Remove unreachable code (#12411)
[mono-project.git] / configure.ac
bloba77559bcfe54481f43c9e89d54a0b1f70e16e126
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=yes,no,only       controls whether to build Mono as a .NET Core runtime, not build it, or just build core (defaults to no)],[],[with_core=no])
761 if test x$with_core = xyes; then
762     AC_DEFINE(ENABLE_NETCORE,1,[Enables the support for .NET Core Features in the MonoVM])
764 AM_CONDITIONAL(ENABLE_CORE, test x$with_core = xyes)
765 AM_CONDITIONAL(ONLY_CORE, test x$with_core = xonly)
768 # A sanity check to catch cases where the package was unpacked
769 # with an ancient tar program (Solaris)
771 AC_ARG_ENABLE(solaris-tar-check,
772 [  --disable-solaris-tar-check    disable solaris tar check],
773    do_solaris_tar_check=no, do_solaris_tar_check=yes)
775 if test x"$do_solaris_tar_check" = xyes -a x"$enable_solaris_tar_check" = xyes; then
776         AC_MSG_CHECKING(integrity of package)
777         if test -f $mcsdir/class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapTypeMapper.cs
778         then
779                 AC_MSG_RESULT(ok)
780         else
781                 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"
782                 AC_MSG_ERROR([$errorm])
783         fi
786 if test "x$with_mcs_path" != "x"; then
787 mcs_topdir=$(cd "$mcsdir" && pwd)
788 mcs_topdir_from_srcdir=$mcs_topdir
789 else
790 mcs_topdir=$(cd "$srcdir/$mcsdir" && pwd)
791 mcs_topdir_from_srcdir='$(top_builddir)'/$mcsdir
794 # Convert mcs_topdir* paths to Windows syntax.
795 if test x$cross_compiling$host_win32 = xnoyes; then
796   mcs_topdir=$(cygpath -m $mcs_topdir)
797   case $mcs_topdir_from_srcdir in
798     /cygdrive/*)
799         mcs_topdir_from_srcdir=$(cygpath -m $mcs_topdir_from_srcdir)
800         ;;
801   esac
804 AC_SUBST([mcs_topdir])
805 AC_SUBST([mcs_topdir_from_srcdir])
807 # gettext: prepare the translation directories. 
808 # we do not configure the full gettext, as we consume it dynamically from C#
809 AM_PO_SUBDIRS
811 if test "x$USE_NLS" = "xyes"; then
812    AC_CHECK_PROG(HAVE_MSGFMT, msgfmt,yes,no)
814    if test "x$HAVE_MSGFMT" = "xno"; then
815           AC_MSG_ERROR([msgfmt not found. You need to install the 'gettext' package, or pass --enable-nls=no to configure.])
816    fi
819 AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
821 pkg_config_path=
822 AC_ARG_WITH(crosspkgdir, [  --with-crosspkgdir=/path/to/pkg-config/dir      Change pkg-config dir to custom dir],
823         if test x$with_crosspkgdir = "x"; then
824                 if test -s $PKG_CONFIG_PATH; then
825                         pkg_config_path=$PKG_CONFIG_PATH
826                 fi
827         else
828                 pkg_config_path=$with_crosspkgdir
829                 PKG_CONFIG_PATH=$pkg_config_path
830                 export PKG_CONFIG_PATH
831         fi
834 AC_ARG_ENABLE(ninja,[  --enable-ninja    Enable using ninja where available], enable_ninja=$enableval)
835 AC_CHECK_PROG(HAVE_NINJA, ninja, yes, no)
836 AM_CONDITIONAL(NINJA, test x$enable_ninja = xyes -a x$HAVE_NINJA != xno)
838 AC_ARG_ENABLE(werror, [  --enable-werror Pass -Werror to the C compiler], werror_flag=$enableval, werror_flag=no)
839 if test x$werror_flag = xyes; then
840         WERROR_CFLAGS="-Werror"
842 AC_SUBST([WERROR_CFLAGS])
843 AC_SUBST([SHARED_CFLAGS])
845 GLIB_CFLAGS='-I$(top_srcdir)/mono/eglib -I$(top_builddir)/mono/eglib'
846   
847 AC_SUBST(GLIB_CFLAGS)
849 # Enable support for fast thread-local storage
850 # Some systems have broken support, so we allow to disable it.
851 AC_ARG_WITH(tls, [  --with-tls=__thread,pthread    select Thread Local Storage implementation (defaults to __thread)],[],[with_tls=__thread])
853 # Enable support for using sigaltstack for SIGSEGV and stack overflow handling
854 # This does not work on some platforms (bug #55253)
855 AC_ARG_WITH(sigaltstack, [  --with-sigaltstack=yes,no      enable/disable support for sigaltstack (defaults to yes)],[],[with_sigaltstack=yes])
857 AC_ARG_WITH(static_mono, [  --with-static_mono=yes,no      link mono statically to libmono (faster) (defaults to yes)],[],[with_static_mono=yes])
858 AC_ARG_WITH(shared_mono, [  --with-shared_mono=yes,no      build a shared libmono library (defaults to yes)],[],[with_shared_mono=yes])
859 # Same as --with-shared_mono=no
860 AC_ARG_ENABLE(libraries, [  --disable-libraries disable the build of libmono], enable_libraries=$enableval, enable_libraries=yes)
862 if test "x$enable_static" = "xno"; then
863    with_static_mono=no
866 if test "x$enable_shared" = "xno"; then
867    with_shared_mono=no
870 if test "x$enable_libraries" = "xno"; then
871    with_shared_mono=no
874 AM_CONDITIONAL(DISABLE_LIBRARIES, test x$enable_libraries = xno)
876 if test "x$host_win32" = "xyes"; then
877    # Boehm GC requires the runtime to be in its own dll
878    with_static_mono=no
881 AM_CONDITIONAL(STATIC_MONO, test x$with_static_mono != xno)
882 AM_CONDITIONAL(SHARED_MONO, test x$with_shared_mono != xno)
883 AC_ARG_ENABLE(mcs-build, [  --disable-mcs-build disable the build of the mcs directory], try_mcs_build=$enableval, enable_mcs_build=yes)
884 AC_ARG_ENABLE(support-build, [  --disable-support-build disable the build of the support directory], try_support_build=$enableval, enable_support_build=yes)
886 AC_ARG_WITH(xen_opt,   [  --with-xen_opt=yes,no          Enable Xen-specific behaviour (defaults to yes)],[],[with_xen_opt=yes])
887 if test "x$with_xen_opt" = "xyes" -a "x$mono_cv_clang" = "xno"; then
888         AC_DEFINE(MONO_XEN_OPT, 1, [Xen-specific behaviour])
889         ORIG_CFLAGS=$CFLAGS
890         CFLAGS="$CFLAGS -mno-tls-direct-seg-refs"
891         AC_MSG_CHECKING(for -mno-tls-direct-seg-refs option to gcc)
892         AC_TRY_COMPILE([], [
893         ], [
894            AC_MSG_RESULT(yes)
895            # Pass it to libgc as well
896            CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -mno-tls-direct-seg-refs"
897         ], [
898            AC_MSG_RESULT(no)
899            CFLAGS=$ORIG_CFLAGS
900         ])
903 AC_ARG_ENABLE(small-config, [  --enable-small-config Enable tweaks to reduce requirements (and capabilities)], enable_small_config=$enableval, enable_small_config=no)
905 if test x$enable_small_config = xyes; then
906         AC_DEFINE(MONO_SMALL_CONFIG,1,[Reduce runtime requirements (and capabilities)])
907         CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DSMALL_CONFIG"
910 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)
912 DISABLED_FEATURES=none
913 csc_compiler=default
914 endian=unknown
915 AC_C_BIGENDIAN([endian=big],[endian=little],[endian=unknown])
916 AC_MSG_CHECKING([CSharp compiler to use])
917 AC_ARG_WITH(csc, [  --with-csc=mcs,roslyn,default      Configures the CSharp compiler to use],[
918    if test x$withval = xmcs; then
919        csc_compiler=mcs
920    elif test x$withval = xroslyn; then
921        csc_compiler=roslyn
922    elif test x$withval = xdefault; then
923        :
924    else
925        AC_MSG_ERROR([You must supply one of "mcs", "roslyn" or "default" to the --with-csc option])
926    fi
927 ],[csc_compiler=default])
929 if test $csc_compiler = default; then
930    if test $endian = big; then
931       csc_compiler=mcs
932    elif test $endian = little; then
933       case "$host" in
934         powerpc*) csc_compiler=mcs ;;
935         *) csc_compiler=roslyn ;;
936       esac
937    else
938       csc_compiler=mcs
939    fi
941 AC_MSG_RESULT($csc_compiler)
943 AC_ARG_WITH(jemalloc,             [  --with-jemalloc=yes,no               If jemalloc is enabled (defaults to no)],                                     [], [with_jemalloc=no])
944 AC_ARG_WITH(jemalloc-always,      [  --with-jemalloc_always=yes,no        If jemalloc is enabled and always used (defaults to yes)],                    [], [with_jemalloc_always=no])
945 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])
948 if test x$target_win32 = xyes; then
949 with_jemalloc=no
950 with_jemalloc_assert=no
951 with_jemalloc_always=no
954 AM_CONDITIONAL(MONO_JEMALLOC_ASSERT, [test "x$with_jemalloc_assert" = "xyes"])
955 if test "x$with_jemalloc_assert" = "xyes"; then
956 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ASSERT"
957 AC_DEFINE(MONO_JEMALLOC_ASSERT, 1, [Make jemalloc assert for mono])
958 AC_SUBST(MONO_JEMALLOC_ASSERT, 1)
961 AM_CONDITIONAL(MONO_JEMALLOC_DEFAULT, [test "x$with_jemalloc_always" = "xyes"])
962 if test "x$with_jemalloc_always" = "xyes"; then
963 with_jemalloc=yes
964 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_DEFAULT"
965 AC_DEFINE(MONO_JEMALLOC_DEFAULT, 1, [Make jemalloc default for mono])
966 AC_SUBST(MONO_JEMALLOC_DEFAULT, 1)
969 AM_CONDITIONAL(MONO_JEMALLOC_ENABLED, [test "x$with_jemalloc" = "xyes"])
970 if test "x$with_jemalloc" = "xyes"; then
971 JEMALLOC_LDFLAGS="-L`pwd`/mono/utils/jemalloc/jemalloc/lib -ljemalloc_pic"
972 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ENABLED -I `pwd`/mono/utils/jemalloc/jemalloc/include"
973 JEMALLOC_AUTOCONF_FLAGS=" --build=$target --host=$host"
975 if test "x$target_mach" = "xyes"; then
976         JEMALLOC_CPPFLAGS=" -stdlib=libc++ "
979 AC_DEFINE(MONO_JEMALLOC_ENABLED, 1, [Enable jemalloc usage for mono])
980 AC_SUBST(MONO_JEMALLOC_ENABLED, 1)
982 AC_SUBST(JEMALLOC_CFLAGS)
983 AC_SUBST(JEMALLOC_CPPFLAGS)
984 AC_SUBST(JEMALLOC_LDFLAGS)
985 AC_SUBST(JEMALLOC_AUTOCONF_FLAGS)
988 # Terminology:
989 # Crash privacy - Attempts to not send identifying information in the crash dump / to protect the obscurity of the program control flow
990 # MERP - The MS telemetry profile. Not for general use.
991 # Structured crashes - crashes at runtime that trigger a stack walk by mono that happens cooperatively
993 # 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.
995 #--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.
996 #--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.
997 #--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.
998 #--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.
1000 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])
1001 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])
1002 AC_ARG_ENABLE(crash-reporting,  [  --disable-crash-reporting            Enable or Disable crash reporting subsystem],        [crash_reporting=$enableval], [crash_reporting=yes])
1004 if test "x$with_crash_privacy" = "xyes"; then
1005 AC_DEFINE(MONO_PRIVATE_CRASHES,1,[Do not include names of unmanaged functions in the crash dump])
1008 if test "x$with_structured_crashes" = "xno"; then
1009 AC_DEFINE(DISABLE_STRUCTURED_CRASH,1,[Do not create structured crash files during unmanaged crashes])
1012 case "$host" in
1013         *-mingw*|*-*-cygwin*|*-*-aix*|*-*-os400*)
1014                 crash_reporting=no
1015                 ;;
1016 esac
1018 if test "x$crash_reporting" != "xyes"; then
1019 CFLAGS="$CFLAGS -DDISABLE_CRASH_REPORTING=1"
1020 CXXFLAGS="$CXXFLAGS -DDISABLE_CRASH_REPORTING=1"
1023 AC_ARG_ENABLE(monodroid, [ --enable-monodroid Enable runtime support for Monodroid (Xamarin.Android)], enable_monodroid=$enableval, enable_monodroid=no)
1024 AM_CONDITIONAL(ENABLE_MONODROID, test x$enable_monodroid = xyes)
1026 AC_ARG_ENABLE(monotouch, [ --enable-monotouch Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)], enable_monotouch=$enableval, enable_monotouch=no)
1027 AM_CONDITIONAL(ENABLE_MONOTOUCH, test x$enable_monotouch = xyes)
1029 if test x$enable_monodroid = xyes; then
1030         AC_DEFINE(ENABLE_MONODROID, 1, [Enable runtime support for Monodroid (Xamarin.Android)])
1033 if test x$enable_monotouch = xyes; then
1034         AC_DEFINE(ENABLE_MONOTOUCH, 1, [Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)])
1037 AC_ARG_ENABLE(cxx, [  --enable-cxx   compile some code as C++])
1039 # mono/corefx/native has a lot of invalid C++98 in its headers
1040 # dotnet/corefx/native looks a lot better, i.e. 44e5bdafb8d989a220c9cf1b94f31a64a6e4f052
1041 #CXXFLAGS_COMMON=' -std=gnu++98 -fno-exceptions -fno-rtti '
1042 CXXFLAGS_COMMON=' -std=gnu++0x -fno-exceptions -fno-rtti '
1043 # "c++0x" instead of C++11, for compat with Centos6/gcc4.4
1045 # -stdlib=libc++ is needed by clang for iOS 6.0 (-miphoneos-version-min=6.0)
1046 # to support C++11 headers but it does not seem to harm elsewhere, so over-approximate
1047 # and add it whenever we're running clang on Darwin.
1048 if test "x$mono_cv_clang" = xyes -a x$host_darwin = xyes; then
1049         CXXFLAGS_COMMON="$CXXFLAGS_COMMON -stdlib=libc++"
1052 AC_SUBST(CXXFLAGS_COMMON)
1054 if test "x$enable_cxx" = "xyes"; then
1056         CXX_ADD_CFLAGS=" -xc++ $CXXFLAGS_COMMON "
1058         # -std=gnu99 -xc++ is not allowed and errors.
1059         CXX_REMOVE_CFLAGS=-std=gnu99
1060         # These give warnings and should be removed. They are C-only.
1061         # i.e. C++ never allows these, they are always errors and their warningness is not controllable.
1062         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs"
1063         # Likewise with CentOS 6 gcc 4.4.
1064         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Werror-implicit-function-declaration"
1066         # The C-only-ness of -Wno-format-zero-length varies with gcc version.
1067         # It is C-only prior to 4.7. Using it with C++ prior to 4.7
1068         # generates a warning every time we run gcc which is very unsightly.
1069         # The warning is for e.g. sprintf(foo, "") which can just be
1070         # foo[0] = 0 but Mono's use is more elaborate, not as easy to "fix",
1071         # and completely legal and valid.
1072         # We have to switch to C++ and not just use -xc++ because of -std=gnu99 (error when combined with -xc++).
1073         # Alternatively, just run $CXX -xc++ -c /dev/null.
1074         AC_LANG_PUSH(C++)
1075         ORIG_CXXFLAGS=$CXXFLAGS
1076         CXXFLAGS="$CXXFLAGS -Werror -Wno-format-zero-length -xc++ "
1077         AC_MSG_CHECKING(or C-only-ness of -Wno-format-zero-length)
1078         AC_TRY_COMPILE([ ], [ ], [ AC_MSG_RESULT(yes) ],
1079                                  [ AC_MSG_RESULT(no)
1080                                    CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wno-format-zero-length" ])
1081         CXXFLAGS=$ORIG_CXXFLAGS
1082         AC_LANG_POP(C++)
1084 AC_SUBST(CXX_ADD_CFLAGS)
1085 AC_SUBST(CXX_REMOVE_CFLAGS)
1088 # Set the build profiles and options before things which use them
1091 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])
1092 AC_ARG_WITH(monodroid,           [  --with-monodroid=yes,no             If you want to build the MonoDroid assemblies (defaults to no)],            [], [with_monodroid=default])
1093 AC_ARG_WITH(monotouch,           [  --with-monotouch=yes,no             If you want to build the Xamarin.iOS assemblies (defaults to no)],          [], [with_monotouch=default])
1094 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])
1095 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])
1096 AC_ARG_WITH(bitcode,             [  --with-bitcode=yes,no               If bitcode is enabled (defaults to no)],                                    [], [with_bitcode=default])
1097 AC_ARG_WITH(xammac,              [  --with-xammac=yes,no                If you want to build the Xamarin.Mac assemblies (defaults to no)],          [], [with_xammac=default])
1098 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])
1099 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])
1100 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])
1101 AC_ARG_WITH(winaot,              [  --with-winaot=yes,no                If you want to build the Windows friendly AOT assemblies (defaults to no)], [], [with_winaot=default])
1102 AC_ARG_WITH(orbis,               [  --with-orbis=yes,no                 If you want to build the Orbis assemblies (defaults to no)], [], [with_orbis=default])
1103 AC_ARG_WITH(unreal,              [  --with-unreal=yes,no                If you want to build the Unreal assemblies (defaults to no)], [], [with_unreal=default])
1104 AC_ARG_WITH(wasm,                [  --with-wasm=yes,no                  If you want to build the WebAssembly (defaults to no)], [], [with_wasm=default])
1107 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])
1108 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])
1109 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])
1110 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])
1113 dnl Spectre compiler mitigation flag checks
1115 if test "x$with_spectre_mitigation" = "xyes"; then
1116    AC_MSG_NOTICE([Compiler Spectre mitigation support checks])
1117    SPECTRE_CFLAGS=
1118    SPECTRE_INDIRECT_BRANCH_KIND=
1119    case "x$with_spectre_indirect_branch_choice" in
1120        xkeep) SPECTRE_INDIRECT_BRANCH_KIND=keep ;;
1121        xthunk) SPECTRE_INDIRECT_BRANCH_KIND=thunk ;;
1122        xinline) SPECTRE_INDIRECT_BRANCH_KIND=thunk-inline ;;
1123        xextern) SPECTRE_INDIRECT_BRANCH_KIND=thunk-extern ;;
1124        *) AC_MSG_ERROR([Invalid indirect jump thunk kind ($with_spectre_indirect_branch_choice)]) ;;
1125    esac
1127    SPECTRE_FUNCTION_RETURN_KIND=""
1128    case "x$with_spectre_function_return_choice" in
1129        xkeep) SPECTRE_FUNCTION_RETURN_KIND=keep ;;
1130        xthunk) SPECTRE_FUNCTION_RETURN_KIND=thunk ;;
1131        xinline) SPECTRE_FUNCTION_RETURN_KIND=thunk-inline ;;
1132        xextern) SPECTRE_FUNCTION_RETURN_KIND=thunk-extern ;;
1133        *) AC_MSG_ERROR([Invalid function return thunk kind ($with_spectre_function_return_choice)]) ;;
1134    esac
1136    AX_CHECK_COMPILE_FLAG(
1137         [ -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND ],
1138         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND" ]
1139    )
1141    AX_CHECK_COMPILE_FLAG(
1142         [ -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND ],
1143         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND" ]
1144    )
1146    if test "x$SPECTRE_CFLAGS" != "x" ; then
1147         CFLAGS="$CFLAGS $SPECTRE_CFLAGS"
1148         CXXFLAGS="$CXXFLAGS $SPECTRE_CFLAGS"
1149         spectre_mitigation_status="mitigation enabled"
1150    fi
1151 else
1152         spectre_mitigation_status="no mitigation"
1156 dnl Profile defaults
1158 TEST_PROFILE=default
1159 enable_llvm_default=no
1161 with_profile4_x_default=no
1162 with_monodroid_default=no
1163 with_monotouch_default=no
1164 with_monotouch_watch_default=no
1165 with_monotouch_tv_default=no
1166 with_xammac_default=no
1167 with_testing_aot_full_interp_default=no
1168 with_testing_aot_hybrid_default=no
1169 with_testing_aot_full_default=no
1170 with_winaot_default=no
1171 with_orbis_default=no
1172 with_unreal_default=no
1173 with_wasm_default=no
1175 with_bitcode_default=no
1176 enable_cooperative_suspend_default=no
1177 enable_hybrid_suspend_default=no
1179 INVARIANT_AOT_OPTIONS=nimt-trampolines=2000,ntrampolines=10000,nrgctx-fetch-trampolines=256,ngsharedvt-trampolines=4000,nftnptr-arg-trampolines=4000
1181 AOT_BUILD_ATTRS=$INVARIANT_AOT_OPTIONS
1183 if test x$cross_compiling = xyes -o x$enable_mcs_build = xno; then
1184    DISABLE_MCS_DOCS_default=yes
1185 elif test x$with_runtime_preset = xnet_4_x; then
1186    with_profile4_x_default=yes
1187    TEST_PROFILE=net_4_x
1188 elif test x$with_runtime_preset = xall; then
1189    with_profile4_x_default=yes
1190    with_monodroid_default=yes
1191    with_monotouch_default=yes
1192    with_monotouch_watch_default=yes
1193    with_monotouch_tv_default=yes
1194    with_xammac_default=yes
1195    with_winaot_default=yes
1196    with_orbis_default=yes
1197    with_unreal_default=yes
1198    with_wasm_default=yes
1199    with_testing_aot_full_interp_default=yes
1200    with_testing_aot_hybrid_default=yes
1201    with_testing_aot_full_default=yes
1202    TEST_PROFILE=net_4_x
1203 elif test x$with_runtime_preset = xbitcode; then
1204    DISABLE_MCS_DOCS_default=yes
1205    with_testing_aot_full_default=yes
1206    with_bitcode_default=yes
1207    enable_cooperative_suspend_default=yes
1208    TEST_PROFILE=testing_aot_full
1209    enable_llvm_default=yes
1211    mono_feature_disable_com='yes'
1212    mono_feature_disable_remoting='yes'
1213    mono_feature_disable_reflection_emit_save='yes'
1214    mono_feature_disable_reflection_emit='yes'
1215    mono_feature_disable_appdomains='yes'
1217    AOT_BUILD_FLAGS="--runtime=mobile --aot=llvmonly,$INVARIANT_AOT_OPTIONS"
1218    AOT_RUN_FLAGS="--runtime=mobile --llvmonly"
1219    AOT_MODE="llvmonly"
1220 elif test x$with_runtime_preset = xfullaot; then
1221    DISABLE_MCS_DOCS_default=yes
1222    with_testing_aot_full_default=yes
1223    TEST_PROFILE=testing_aot_full
1225    mono_feature_disable_com='yes'
1226    mono_feature_disable_remoting='yes'
1227    mono_feature_disable_reflection_emit_save='yes'
1228    mono_feature_disable_reflection_emit='yes'
1229    mono_feature_disable_appdomains='yes'
1231    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1232    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1233    AOT_MODE="full"
1234 elif test x$with_runtime_preset = xfullaot_llvm; then
1235    DISABLE_MCS_DOCS_default=yes
1236    with_testing_aot_full_default=yes
1237    TEST_PROFILE=testing_aot_full
1239    mono_feature_disable_com='yes'
1240    mono_feature_disable_remoting='yes'
1241    mono_feature_disable_reflection_emit_save='yes'
1242    mono_feature_disable_reflection_emit='yes'
1243    mono_feature_disable_appdomains='yes'
1245    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1246    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1247    AOT_MODE="full"
1248 elif test x$with_runtime_preset = xhybridaot; then
1249    DISABLE_MCS_DOCS_default=yes
1250    with_testing_aot_hybrid_default=yes
1251    TEST_PROFILE=testing_aot_hybrid 
1253    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1254    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1255 elif test x$with_runtime_preset = xhybridaot_llvm; then
1256    DISABLE_MCS_DOCS_default=yes
1257    with_testing_aot_hybrid_default=yes
1258    TEST_PROFILE=testing_aot_hybrid
1260    AOT_BUILD_FLAGS="--runtime=mobile --llvm --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1261    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1262 elif test x$with_runtime_preset = xfullaotinterp; then
1263    with_testing_aot_full_interp_default=yes
1264    TEST_PROFILE=testing_aot_full_interp
1266    # mscorlib.dll aot compilation crashes
1267    mono_feature_disable_com='yes'
1269    AOT_BUILD_FLAGS="--aot=full,interp,$INVARIANT_AOT_OPTIONS"
1270    AOT_RUN_FLAGS="--full-aot-interp"
1271 elif test x$with_runtime_preset = xfullaotinterp_llvm; then
1272    with_testing_aot_full_interp_default=yes
1273    TEST_PROFILE=testing_aot_full_interp_llvm
1275    # mscorlib.dll aot compilation crashes
1276    mono_feature_disable_com='yes'
1278    AOT_BUILD_FLAGS="-O=gsharedvt --llvm --aot=full,interp,$INVARIANT_AOT_OPTIONS"
1279    AOT_RUN_FLAGS="--full-aot-interp"
1280 elif test x$with_runtime_preset = xaot; then
1281    with_profile4_x_default=yes
1283    AOT_BUILD_FLAGS="--aot=$INVARIANT_AOT_OPTIONS"
1284    AOT_RUN_FLAGS=""
1286    DISABLE_MCS_DOCS_default=yes
1287 elif test x$with_runtime_preset = xaot_llvm; then
1288    with_profile4_x_default=yes
1290    AOT_BUILD_FLAGS="--llvm --aot=$INVARIANT_AOT_OPTIONS"
1291    AOT_RUN_FLAGS=""
1293    DISABLE_MCS_DOCS_default=yes
1294 elif test x$with_runtime_preset = xwinaot; then
1295    DISABLE_MCS_DOCS_default=yes
1296    with_winaot_default=yes
1297    TEST_PROFILE=winaot
1299    mono_feature_disable_com='yes'
1300    mono_feature_disable_remoting='yes'
1301    mono_feature_disable_reflection_emit_save='yes'
1302    mono_feature_disable_reflection_emit='yes'
1303    mono_feature_disable_appdomains='yes'
1305    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1306    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1307    AOT_MODE="llvmonly"
1308 elif test x$with_runtime_preset = xorbis; then
1309    DISABLE_MCS_DOCS_default=yes
1310    with_orbis_default=yes
1311    TEST_PROFILE=orbis
1313    mono_feature_disable_com='yes'
1314    mono_feature_disable_remoting='yes'
1315    mono_feature_disable_reflection_emit_save='yes'
1316    mono_feature_disable_reflection_emit='yes'
1317    mono_feature_disable_appdomains='yes'
1319    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1320    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1321    AOT_MODE="full"
1322 elif test x$with_runtime_preset = xunreal; then
1323    DISABLE_MCS_DOCS_default=yes
1324    with_unreal_default=yes
1325    TEST_PROFILE=unreal
1327    mono_feature_disable_com='yes'
1328    mono_feature_disable_remoting='yes'
1329    mono_feature_disable_appdomains='no'
1331    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1332    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1333 elif test x$with_runtime_preset = xwasm; then
1334    DISABLE_MCS_DOCS_default=yes
1335    with_wasm_default=yes
1336    TEST_PROFILE=wasm
1338    mono_feature_disable_com='yes'
1339    mono_feature_disable_remoting='yes'
1340    mono_feature_disable_reflection_emit_save='yes'
1341    mono_feature_disable_reflection_emit='yes'
1342    mono_feature_disable_appdomains='yes'
1344    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1345    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1346 else
1347    TEST_PROFILE=net_4_x
1348    with_profile4_x_default=yes
1351 if test "x$AOT_BUILD_FLAGS" != "x"; then :
1352    AC_SUBST(AOT_BUILD_FLAGS)
1353    AC_SUBST(AOT_RUN_FLAGS)
1354    # For llvmonlycheck + fullaotcheck
1355    AC_SUBST(INVARIANT_AOT_OPTIONS)
1358 AC_SUBST(TEST_PROFILE)
1360 if test "x$with_profile4_x" = "xdefault"; then
1361    with_profile4_x=$with_profile4_x_default
1363 if test "x$with_monodroid" = "xdefault"; then
1364    with_monodroid=$with_monodroid_default
1366 if test "x$with_monotouch" = "xdefault"; then
1367    with_monotouch=$with_monotouch_default
1369 if test "x$with_monotouch_watch" = "xdefault"; then
1370    with_monotouch_watch=$with_monotouch_watch_default
1372 if test "x$with_monotouch_tv" = "xdefault"; then
1373    with_monotouch_tv=$with_monotouch_tv_default
1375 if test "x$with_bitcode" = "xdefault"; then
1376    with_bitcode=$with_bitcode_default
1378 if test "x$with_xammac" = "xdefault"; then
1379    with_xammac=$with_xammac_default
1381 if test "x$with_testing_aot_full_interp" = "xdefault"; then
1382    with_testing_aot_full_interp=$with_testing_aot_full_interp_default
1384 if test "x$with_testing_aot_hybrid" = "xdefault"; then
1385    with_testing_aot_hybrid=$with_testing_aot_hybrid_default
1387 if test "x$with_testing_aot_full" = "xdefault"; then
1388    with_testing_aot_full=$with_testing_aot_full_default
1390 if test "x$with_winaot" = "xdefault"; then
1391    with_winaot=$with_winaot_default
1393 if test "x$with_orbis" = "xdefault"; then
1394    with_orbis=$with_orbis_default
1396 if test "x$with_unreal" = "xdefault"; then
1397    with_unreal=$with_unreal_default
1399 if test "x$with_wasm" = "xdefault"; then
1400    with_wasm=$with_wasm_default
1404 AM_CONDITIONAL(INSTALL_4_x, [test "x$with_profile4_x" = "xyes"])
1405 AM_CONDITIONAL(INSTALL_MONODROID, [test "x$with_monodroid" != "xno"])
1406 AM_CONDITIONAL(INSTALL_MONOTOUCH, [test "x$with_monotouch" != "xno"])
1407 AM_CONDITIONAL(INSTALL_MONOTOUCH_WATCH, [test "x$with_monotouch_watch" != "xno"])
1408 AM_CONDITIONAL(INSTALL_MONOTOUCH_TV, [test "x$with_monotouch_tv" != "xno"])
1409 AM_CONDITIONAL(BITCODE, test "x$with_bitcode" = "xyes")
1410 AM_CONDITIONAL(INSTALL_XAMMAC, [test "x$with_xammac" != "xno"])
1411 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL_INTERP, [test "x$with_testing_aot_full_interp" != "xno"])
1412 AM_CONDITIONAL(INSTALL_TESTING_AOT_HYBRID, [test "x$with_testing_aot_hybrid" != "xno"])
1413 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL, [test "x$with_testing_aot_full" != "xno"])
1414 AM_CONDITIONAL(INSTALL_WINAOT, [test "x$with_winaot" != "xno"])
1415 AM_CONDITIONAL(INSTALL_ORBIS, [test "x$with_orbis" != "xno"])
1416 AM_CONDITIONAL(INSTALL_UNREAL, [test "x$with_unreal" != "xno"])
1417 AM_CONDITIONAL(INSTALL_WASM, [test "x$with_wasm" != "xno"])
1418 AM_CONDITIONAL(INSTALL_NETCORE, [test "x$with_core" != "xno"])
1419 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"])
1420 AM_CONDITIONAL(HYBRID_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_hybrid"] || [test "x$TEST_PROFILE" = "xunreal"])
1421 AM_CONDITIONAL(AOT_FULL_INTERP_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full_interp"])
1422 AM_CONDITIONAL(AOT_FULL_INTERP_LLVM_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full_interp_llvm"])
1423 AM_CONDITIONAL(DEFAULT_TESTS, [test "x$TEST_PROFILE" = "xnet_4_x"])
1425 default_profile=net_4_x
1426 if test -z "$INSTALL_MONODROID_TRUE"; then :
1427    default_profile=monodroid
1429 if test -z "$INSTALL_MONOTOUCH_TRUE"; then :
1430    default_profile=monotouch
1432 if test -z "$INSTALL_XAMMAC_TRUE"; then :
1433    default_profile=xammac
1435 if test -z "$INSTALL_TESTING_AOT_FULL_INTERP_TRUE"; then :
1436    default_profile=testing_aot_full_interp
1438 if test -z "$INSTALL_TESTING_AOT_HYBRID_TRUE"; then :
1439    default_profile=testing_aot_hybrid
1441 if test -z "$INSTALL_TESTING_AOT_FULL_TRUE"; then :
1442    default_profile=testing_aot_full
1444 if test -z "$INSTALL_WINAOT_TRUE"; then :
1445    default_profile=winaot
1447 if test -z "$INSTALL_ORBIS_TRUE"; then :
1448    default_profile=orbis
1450 if test -z "$INSTALL_UNREAL_TRUE"; then :
1451    default_profile=unreal
1453 if test -z "$INSTALL_WASM_TRUE"; then :
1454    default_profile=wasm
1456 if test -z "$INSTALL_4_x_TRUE"; then :
1457    default_profile=net_4_x
1459 DEFAULT_PROFILE=$default_profile
1460 AC_SUBST(DEFAULT_PROFILE)
1463 # End build profile configuration
1466 if test x$USE_NLS = xprofile_default; then
1468         AC_MSG_CHECKING([NLS used])
1470         # We make the default value for USE_NLS
1471         # "no" on OSX because it isn't available on most
1472         # default OSX installs. The most common configurations will
1473         # all disable it, so this saves us typing.
1474         if test x$host_darwin = xyes; then
1475                 USE_NLS=no;
1476         else
1477                 USE_NLS=yes;
1478         fi
1480         AC_SUBST([USE_NLS])
1481         AC_MSG_RESULT([$USE_NLS])
1484 AC_ARG_ENABLE(minimal, [  --enable-minimal=LIST      drop support for LIST subsystems.
1485      LIST is a comma-separated list from: aot, profiler, decimal, pinvoke, debug, appdomains, verifier, 
1486      reflection_emit, reflection_emit_save, large_code, logging, com, ssa, generics, attach, jit, interpreter, simd, soft_debug, perfcounters, normalization, desktop_loader, shared_perfcounters, remoting,
1487          security, lldb, mdb, assert_messages, cleanup, sgen_marksweep_conc, sgen_split_nursery, sgen_gc_bridge, sgen_debug_helpers.],
1489         for feature in `echo "$enable_minimal" | sed -e "s/,/ /g"`; do
1490                 eval "mono_feature_disable_$feature='yes'"
1491         done
1492         DISABLED_FEATURES=$enable_minimal
1493         disabled="Disabled:      $enable_minimal"
1494 ],[])
1496 AC_DEFINE_UNQUOTED(DISABLED_FEATURES, "$DISABLED_FEATURES", [String of disabled features])
1498 if test "x$mono_feature_disable_aot" = "xyes"; then
1499         AC_DEFINE(DISABLE_AOT, 1, [Disable AOT Compiler])
1500         enable_system_aot=no
1501         AC_MSG_NOTICE([Disabled AOT compiler])
1504 if test "x$mono_feature_disable_profiler" = "xyes"; then
1505         AC_DEFINE(DISABLE_PROFILER, 1, [Disable default profiler support])
1506         AC_MSG_NOTICE([Disabled support for the profiler])
1508 AM_CONDITIONAL(DISABLE_PROFILER, test x$mono_feature_disable_profiler = xyes)
1510 if test "x$mono_feature_disable_decimal" = "xyes"; then
1511         AC_DEFINE(DISABLE_DECIMAL, 1, [Disable System.Decimal support])
1512         AC_MSG_NOTICE([Disabled support for decimal])
1515 if test "x$mono_feature_disable_pinvoke" = "xyes"; then
1516         AC_DEFINE(DISABLE_PINVOKE, 1, [Disable P/Invoke support])
1517         AC_MSG_NOTICE([Disabled support for P/Invoke])
1520 if test "x$mono_feature_disable_debug" = "xyes"; then
1521         AC_DEFINE(DISABLE_DEBUG, 1, [Disable runtime debugging support])
1522         AC_MSG_NOTICE([Disabled support for runtime debugging])
1525 if test "x$mono_feature_disable_reflection_emit" = "xyes"; then
1526         AC_DEFINE(DISABLE_REFLECTION_EMIT, 1, [Disable reflection emit support])
1527         mono_feature_disable_reflection_emit_save=yes
1528         AC_MSG_NOTICE([Disabled support for Reflection.Emit])
1531 if test "x$mono_feature_disable_reflection_emit_save" = "xyes"; then
1532         AC_DEFINE(DISABLE_REFLECTION_EMIT_SAVE, 1, [Disable assembly saving support in reflection emit])
1533         AC_MSG_NOTICE([Disabled support for Reflection.Emit.Save])
1536 if test "x$mono_feature_disable_large_code" = "xyes"; then
1537         AC_DEFINE(DISABLE_LARGE_CODE, 1, [Disable support for huge assemblies])
1538         AC_MSG_NOTICE([Disabled support for large assemblies])
1541 if test "x$mono_feature_disable_logging" = "xyes"; then
1542         AC_DEFINE(DISABLE_LOGGING, 1, [Disable support debug logging])
1543         AC_MSG_NOTICE([Disabled support for logging])
1546 if test "x$mono_feature_disable_com" = "xyes"; then
1547         AC_DEFINE(DISABLE_COM, 1, [Disable COM support])
1548         AC_MSG_NOTICE([Disabled COM support])
1551 if test "x$mono_feature_disable_ssa" = "xyes"; then
1552         AC_DEFINE(DISABLE_SSA, 1, [Disable advanced SSA JIT optimizations])
1553         AC_MSG_NOTICE([Disabled SSA JIT optimizations])
1556 if test "x$mono_feature_disable_generics" = "xyes"; then
1557         AC_DEFINE(DISABLE_GENERICS, 1, [Disable generics support])
1558         AC_MSG_NOTICE([Disabled Generics Support])
1561 if test "x$mono_feature_disable_shadowcopy" = "xyes"; then
1562         AC_DEFINE(DISABLE_SHADOW_COPY, 1, [Disable Shadow Copy for AppDomains])
1563         AC_MSG_NOTICE([Disabled Shadow copy for AppDomains])
1566 if test "x$mono_feature_disable_portability" = "xyes"; then
1567         AC_DEFINE(DISABLE_PORTABILITY, 1, [Disables the IO portability layer])
1568         AC_MSG_NOTICE([Disabled IO Portability layer])
1571 if test "x$mono_feature_disable_attach" = "xyes"; then
1572         AC_DEFINE(DISABLE_ATTACH, 1, [Disable agent attach support])
1573         AC_MSG_NOTICE([Disabled agent attach])
1576 if test "x$mono_feature_disable_verifier" = "xyes"; then
1577         AC_DEFINE(DISABLE_VERIFIER, 1, [Disables the verifier])
1578         AC_MSG_NOTICE([Disabled the metadata and IL verifiers])
1581 if test "x$mono_feature_disable_jit" = "xyes"; then
1582         AC_DEFINE(DISABLE_JIT, 1, [Disable the JIT, only full-aot mode or interpreter will be supported by the runtime.])
1583         AC_MSG_NOTICE([Disabled the JIT engine, only full AOT or interpreter will be supported])
1586 AM_CONDITIONAL(DISABLE_JIT, test x$mono_feature_disable_jit = xyes)
1588 if test "x$mono_feature_disable_interpreter" = "xyes"; then
1589         AC_DEFINE(DISABLE_INTERPRETER, 1, [Disable the interpreter.])
1590         AC_MSG_NOTICE([Disabled the interpreter])
1593 AM_CONDITIONAL(DISABLE_INTERPRETER, test x$mono_feature_disable_interpreter = xyes)
1595 if test "x$mono_feature_disable_interpreter" != "xyes" -o "x$mono_feature_disable_jit" != "xyes"; then
1596         AC_DEFINE(ENABLE_ILGEN, 1, [Some VES is available at runtime])
1599 AM_CONDITIONAL(ENABLE_ILGEN, test x$mono_feature_disable_interpreter != xyes -o x$mono_feature_disable_jit != xyes)
1601 if test "x$mono_feature_disable_simd" = "xyes"; then
1602         AC_DEFINE(DISABLE_SIMD, 1, [Disable SIMD intrinsics related optimizations.])
1603         AC_MSG_NOTICE([Disabled SIMD support])
1606 if test "x$mono_feature_disable_soft_debug" = "xyes"; then
1607         AC_DEFINE(DISABLE_DEBUGGER_AGENT, 1, [Disable Soft Debugger Agent.])
1608         AC_MSG_NOTICE([Disabled Soft Debugger.])
1611 AM_CONDITIONAL(DISABLE_DEBUGGER_AGENT, test x$mono_feature_disable_debugger_agent = xyes)
1613 if test "x$mono_feature_disable_perfcounters" = "xyes"; then
1614         AC_DEFINE(DISABLE_PERFCOUNTERS, 1, [Disable Performance Counters.])
1615         AC_MSG_NOTICE([Disabled Performance Counters.])
1617 if test "x$mono_feature_disable_normalization" = "xyes"; then
1618         AC_DEFINE(DISABLE_NORMALIZATION, 1, [Disable String normalization support.])
1619         AC_MSG_NOTICE([Disabled String normalization support.])
1622 #TODO: remove assembly_remapping feature name once everyone is using desktop_loader
1623 if test "x$mono_feature_disable_assembly_remapping" = "xyes" || test "x$mono_feature_disable_desktop_loader" = "xyes"; then
1624         AC_DEFINE(DISABLE_DESKTOP_LOADER, 1, [Disable desktop assembly loader semantics.])
1625         AC_MSG_NOTICE([Disabled desktop assembly loader semantics.])
1628 if test "x$mono_feature_disable_shared_perfcounters" = "xyes"; then
1629         AC_DEFINE(DISABLE_SHARED_PERFCOUNTERS, 1, [Disable shared perfcounters.])
1630         AC_MSG_NOTICE([Disabled Shared perfcounters.])
1633 if test "x$mono_feature_disable_appdomains" = "xyes"; then
1634         AC_DEFINE(DISABLE_APPDOMAINS, 1, [Disable support for multiple appdomains.])
1635         AC_MSG_NOTICE([Disabled support for multiple appdomains.])
1638 if test "x$mono_feature_disable_remoting" = "xyes"; then
1639         AC_DEFINE(DISABLE_REMOTING, 1, [Disable remoting support (This disables type proxies and make com non-functional)])
1640         AC_MSG_NOTICE([Disabled remoting])
1643 if test "x$mono_feature_disable_security" = "xyes"; then
1644         AC_DEFINE(DISABLE_SECURITY, 1, [Disable CAS/CoreCLR security])
1645         AC_MSG_NOTICE([Disabled CAS/CoreCLR security manager (used e.g. for Moonlight)])
1648 if test "x$mono_feature_disable_lldb" = "xyes"; then
1649         AC_DEFINE(DISABLE_LLDB, 1, [Disable support code for the LLDB plugin.])
1650         AC_MSG_NOTICE([Disabled LLDB plugin support code.])
1653 if test "x$mono_feature_disable_mdb" = "xyes"; then
1654         AC_DEFINE(DISABLE_MDB, 1, [Disable support for .mdb symbol files.])
1655         AC_MSG_NOTICE([Disabled support for .mdb symbol files.])
1658 if test "x$mono_feature_disable_assert_messages" = "xyes"; then
1659         AC_DEFINE(DISABLE_ASSERT_MESSAGES, 1, [Disable assertion messages.])
1660         AC_MSG_NOTICE([Disabled assertion messages.])
1663 if test "x$mono_feature_disable_cleanup" = "xyes"; then
1664         AC_DEFINE(DISABLE_CLEANUP, 1, [Disable runtime cleanup.])
1665         AC_MSG_NOTICE([Disabled runtime cleanup.])
1668 if test "x$mono_feature_disable_sgen_marksweep_conc" = "xyes"; then
1669         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_CONC, 1, [Disable concurrent gc support in SGEN.])
1670         AC_MSG_NOTICE([Disabled concurrent gc support in SGEN.])
1674 if test "x$mono_feature_disable_sgen_split_nursery" = "xyes"; then
1675         AC_DEFINE(DISABLE_SGEN_SPLIT_NURSERY, 1, [Disable minor=split support in SGEN.])
1676         AC_MSG_NOTICE([Disabled minor=split support in SGEN.])
1679 if test "x$mono_feature_disable_sgen_gc_bridge" = "xyes"; then
1680         AC_DEFINE(DISABLE_SGEN_GC_BRIDGE, 1, [Disable gc bridge support in SGEN.])
1681         AC_MSG_NOTICE([Disabled gc bridge support in SGEN.])
1684 if test "x$mono_feature_disable_sgen_debug_helpers" = "xyes"; then
1685         AC_DEFINE(DISABLE_SGEN_DEBUG_HELPERS, 1, [Disable debug helpers in SGEN.])
1686         AC_MSG_NOTICE([Disabled debug helpers in SGEN.])
1689 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
1690 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
1692 has_extension_module=no
1693 AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
1695         for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
1696                 if test x$extension = xdefault ; then
1697                         has_extension_module=yes;
1698                 fi
1699         done
1700         if test x$enable_extension_module = xyes; then
1701                 has_extension_module=yes;
1702         fi
1703 ], [])
1705 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
1707 if test x$has_extension_module != xno ; then
1708         AC_DEFINE([ENABLE_EXTENSION_MODULE], 1, [Extension module enabled])
1709         AC_MSG_NOTICE([Enabling mono extension module.])
1712 # Deprecated
1713 AC_ARG_ENABLE(gsharedvt, [  --enable-gsharedvt Enable generic valuetype sharing (Deprecated)], enable_gsharedvt=$enableval, enable_gsharedvt=no)
1715 AC_MSG_CHECKING(for visibility __attribute__)
1716 AC_COMPILE_IFELSE([
1717         AC_LANG_SOURCE([[
1718                 void __attribute__ ((visibility ("hidden"))) doit (void) {}
1719                 int main () { doit (); return 0; }
1720         ]])
1721 ], [
1722    have_visibility_hidden=yes
1723    AC_MSG_RESULT(yes)
1724 ], [
1725    have_visibility_hidden=no
1726    AC_MSG_RESULT(no)
1730 dnl Boehm GC configuration
1733 AC_ARG_WITH(libgc,   [  --with-libgc=included,none  Controls the Boehm GC config, default=included],[libgc=$with_libgc],[libgc=included])
1735 AC_ARG_ENABLE(boehm, [  --disable-boehm            Disable the Boehm GC.], support_boehm=$enableval,support_boehm=${support_boehm:-yes})
1736 AM_CONDITIONAL(SUPPORT_BOEHM, test x$support_boehm = xyes)
1738 if test "x$support_boehm" = "xyes"; then
1740         AC_ARG_ENABLE(parallel-mark, [  --enable-parallel-mark     Enables Boehm GC Parallel Marking], enable_parallel_mark=$enableval, enable_parallel_mark=$parallel_mark)
1741         if test x$enable_parallel_mark = xyes; then
1742                 libgc_configure_args="$libgc_configure_args --enable-parallel-mark"
1743         fi
1745         gc_msg=""
1746         LIBGC_CPPFLAGS=
1747         LIBGC_LIBS=
1748         LIBGC_STATIC_LIBS=
1749         libgc_dir=
1750         case "x$libgc" in
1751                 xincluded)
1752                         if test "x$support_boehm" = "xyes"; then
1753                                 libgc_dir=libgc
1754                         fi
1756                         LIBGC_CPPFLAGS='-I$(top_srcdir)/libgc/include'
1757                         LIBGC_LIBS='$(top_builddir)/libgc/libmonogc.la'
1758                         LIBGC_STATIC_LIBS='$(top_builddir)/libgc/libmonogc-static.la'
1760                         BOEHM_DEFINES="-DHAVE_BOEHM_GC"
1762                         if test x$target_win32 = xyes; then
1763                                 BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
1764                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
1765                         fi
1767                         gc_msg="Included Boehm GC with typed GC"
1768                         if test x$enable_parallel_mark = xyes; then
1769                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
1770                                 gc_msg="$gc_msg and parallel mark"
1771                         else
1772                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC)", [GC description])
1773                         fi
1774                         ;;
1776                 xboehm|xbohem|xyes)
1777                         AC_MSG_WARN("External Boehm is no longer supported")
1778                         ;;
1780                 xsgen)
1781                         AC_MSG_WARN("Use --with-sgen instead, --with-libgc= controls Boehm configuration")
1782                         ;;
1784                 xnone)
1785                         AC_MSG_WARN("Compiling mono without GC.")
1786                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description])
1787                         AC_DEFINE(HAVE_NULL_GC,1,[No GC support.])
1788                         gc_msg="none"
1789                         ;;
1790                 *)
1791                         AC_MSG_ERROR([Invalid argument $libgc to --with-libgc.])
1792                         ;;
1793         esac
1795         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])
1796         if test "x$large_heap" = "xyes"; then
1797            CPPFLAGS="$CPPFLAGS -DLARGE_CONFIG"
1798         fi
1800         AC_SUBST(LIBGC_CPPFLAGS)
1801         AC_SUBST(LIBGC_LIBS)
1802         AC_SUBST(LIBGC_STATIC_LIBS)
1803         AC_SUBST(libgc_dir)
1804         AC_SUBST(BOEHM_DEFINES)
1807 AM_CONDITIONAL(SUPPORT_NULLGC, test "x$libgc" = "xnone")
1810 dnl End of Boehm GC Configuration
1813 dnl *************************************
1814 dnl *** Checks for zero length arrays ***
1815 dnl *************************************
1816 AC_MSG_CHECKING(whether $CC supports zero length arrays)
1817 AC_TRY_COMPILE([
1818         struct s {
1819                 int  length;
1820                 char data [0];
1821         };
1822 ], [], [
1823         AC_MSG_RESULT(yes)
1824         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 0, [Length of zero length arrays])
1825 ], [
1826         AC_MSG_RESULT(no)
1827         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
1830 dnl ***********************************
1831 dnl *** Checks for signals
1832 dnl ***********************************
1833 AC_CHECK_HEADERS(signal.h)
1834 AC_CHECK_FUNCS(sigaction)
1835 AC_CHECK_FUNCS(kill)
1836 AC_CHECK_FUNCS(signal)
1838 # signal() is declared inline in Android headers
1839 # so we need to workaround it by overriding the check.
1840 if test x$platform_android = xyes; then
1841         AC_DEFINE(HAVE_SIGNAL,1)
1844 dnl ***********************************
1845 dnl *** Checks for availability of GSS dependencies (krb5, gss.framework, etc)
1846 dnl ***********************************
1847 enable_gss=no;
1848 AC_MSG_CHECKING(for GSS/GSS.h)
1849 AC_TRY_COMPILE([
1850     #include <GSS/GSS.h>
1851 ], [
1853     AC_MSG_RESULT(yes)
1854     AC_DEFINE(HAVE_GSSFW_HEADERS, 1, [GSS/GSS.h])
1855     AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
1856     enable_gss=yes
1857 ], [
1858     AC_MSG_RESULT(no)
1861 AC_MSG_CHECKING(for gssapi/gssapi_ext.h)
1862 AC_TRY_COMPILE([
1863     #include <gssapi/gssapi_ext.h>
1864 ], [
1866     AC_MSG_RESULT(yes)
1867     enable_gss=yes
1868 ], [
1869     AC_MSG_RESULT(no)
1872 AC_MSG_CHECKING(for GSS_SPNEGO_MECHANISM)
1873 AC_TRY_COMPILE([
1874     #include <gssapi/gssapi_ext.h>
1875     #include <gssapi/gssapi_krb5.h>
1876     gss_OID_set_desc gss_mech_spnego_OID_set_desc = {.count = 1, .elements = GSS_SPNEGO_MECHANISM};
1877 ], [
1879     AC_MSG_RESULT(yes)
1880     AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
1881 ], [
1882     AC_MSG_RESULT(no)
1885 AM_CONDITIONAL(ENABLE_GSS, test x$enable_gss = xyes)
1887 # `target_ios=yes` does not detect watch devices and fails when cross-compiling
1888 AC_MONO_APPLE_TARGET(TARGET_OS_IPHONE, [mono_native_platform_ios=yes])
1890 if test x$host_win32 = xno; then
1891         dnl *************************************
1892         dnl *** Checks for time capabilities ***
1893         dnl *************************************
1895         AC_MSG_CHECKING(for CLOCK_MONOTONIC)
1896         AC_TRY_COMPILE([#include <time.h>], [
1897                 const int foo = CLOCK_MONOTONIC;
1898         ],[
1899                 AC_MSG_RESULT(yes)
1900                 AC_DEFINE(HAVE_CLOCK_MONOTONIC, 1, [CLOCK_MONOTONIC])
1901         ], [
1902                 AC_MSG_RESULT(no)
1903         ])
1905         AC_MSG_CHECKING(for CLOCK_MONOTONIC_COARSE)
1906         AC_TRY_COMPILE([#include <time.h>], [
1907                 const int foo = CLOCK_MONOTONIC_COARSE;
1908         ],[
1909                 AC_MSG_RESULT(yes)
1910                 AC_DEFINE(HAVE_CLOCK_MONOTONIC_COARSE, 1, [CLOCK_MONOTONIC_COARSE])
1911         ], [
1912                 AC_MSG_RESULT(no)
1913         ])
1915         AC_MSG_CHECKING(for CLOCK_REALTIME)
1916         AC_TRY_COMPILE([#include <time.h>], [
1917                 const int foo = CLOCK_REALTIME;
1918         ],[
1919                 AC_MSG_RESULT(yes)
1920                 AC_DEFINE(HAVE_CLOCK_REALTIME, 1, [CLOCK_REALTIME])
1921         ], [
1922                 AC_MSG_RESULT(no)
1923         ])
1925         AC_CHECK_FUNC(mach_absolute_time, [AC_DEFINE(HAVE_MACH_ABSOLUTE_TIME, 1, [mach_absolute_time])])
1926         AC_CHECK_FUNC(gethrtime, [AC_DEFINE(HAVE_GETHRTIME, 1, [gethrtime])])
1927         AC_CHECK_FUNC(read_real_time, [AC_DEFINE(HAVE_READ_REAL_TIME, 1, [read_real_time])])
1928         AC_CHECK_FUNC(mach_timebase_info, [AC_DEFINE(HAVE_MACH_TIMEBASE_INFO, 1, [mach_timebase_info])])
1929         AC_CHECK_FUNC(futimes,            [AC_DEFINE(HAVE_FUTIMES, 1, [futimes])])
1930         AC_CHECK_FUNC(futimens,           [AC_DEFINE(HAVE_FUTIMENS, 1, [futimens])])
1932         dnl hires monotonic clock support
1933         AC_SEARCH_LIBS(clock_gettime, rt)
1934         AC_CHECK_FUNCS(clock_nanosleep)
1936         dnl dynamic loader support
1937         AC_CHECK_FUNC(dlopen, DL_LIB="",
1938                 AC_CHECK_LIB(dl, dlopen, DL_LIB="-ldl", dl_support=no)
1939         )
1940         if test x$dl_support = xno; then
1941                 AC_MSG_WARN([No dynamic loading support available])
1942         else
1943                 LIBS="$LIBS $DL_LIB"
1944                 AC_DEFINE(HAVE_DL_LOADER,1,[dlopen-based dynamic loader available])
1945                 dnl from glib's configure.ac
1946                 AC_CACHE_CHECK([for preceeding underscore in symbols],
1947                         mono_cv_uscore,[
1948                         AC_TRY_RUN([#include <dlfcn.h>
1949                         int mono_underscore_test (void) { return 42; }
1950                         int main() {
1951                           void *f1 = (void*)0, *f2 = (void*)0, *handle;
1952                           handle = dlopen ((void*)0, 0);
1953                           if (handle) {
1954                             f1 = dlsym (handle, "mono_underscore_test");
1955                             f2 = dlsym (handle, "_mono_underscore_test");
1956                           } return (!f2 || f1);
1957                         }],
1958                                 [mono_cv_uscore=yes],
1959                                 [mono_cv_uscore=no],
1960                         [])
1961                 ])
1962                 if test "x$mono_cv_uscore" = "xyes"; then
1963                         MONO_DL_NEED_USCORE=1
1964                 else
1965                         MONO_DL_NEED_USCORE=0
1966                 fi
1967                 AC_SUBST(MONO_DL_NEED_USCORE)
1968                 AC_CHECK_FUNC(dlerror)
1969         fi
1971         dnl ******************************************************************
1972         dnl *** Checks for the IKVM JNI interface library                  ***
1973         dnl ******************************************************************
1974         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])
1976         ikvm_native_dir=
1977         if test x$with_ikvm_native = xyes; then
1978                 ikvm_native_dir=ikvm-native
1979                 jdk_headers_found="IKVM Native"
1980         fi
1982         AC_SUBST(ikvm_native_dir)
1984         AC_CHECK_HEADERS(execinfo.h)
1986         AC_CHECK_HEADERS(sys/auxv.h sys/resource.h)
1988         AC_CHECK_FUNCS(getgrgid_r)
1989         AC_CHECK_FUNCS(getgrnam_r)
1990         AC_CHECK_FUNCS(getresuid)
1991         AC_CHECK_FUNCS(setresuid)
1992         AC_CHECK_FUNCS(kqueue)
1993         AC_CHECK_FUNCS(backtrace_symbols)
1994         AC_CHECK_FUNCS(mkstemp)
1995         AC_CHECK_FUNCS(mmap)
1996         AC_CHECK_FUNCS(madvise)
1997         AC_CHECK_FUNCS(getrusage)
1998         AC_CHECK_FUNCS(getpriority)
1999         AC_CHECK_FUNCS(setpriority)
2000         AC_CHECK_FUNCS(dl_iterate_phdr)
2001         AC_CHECK_FUNCS(dladdr)
2002         AC_CHECK_FUNCS(sysconf)
2003         AC_CHECK_FUNCS(getrlimit)
2004         AC_CHECK_FUNCS(prctl)
2005         AC_CHECK_FUNCS(arc4random)
2006         AC_CHECK_FUNCS(nl_langinfo)
2008         AC_CHECK_FUNCS(sched_getaffinity)
2009         AC_CHECK_FUNCS(sched_setaffinity)
2010         AC_CHECK_FUNCS(sched_getcpu)
2012         if test x$platform_android != xyes; then
2013                 AC_CHECK_FUNCS(getpwnam_r)
2014                 AC_CHECK_FUNCS(getpwuid_r)
2015         fi
2017         AC_FUNC_STRERROR_R()
2019         dnl ****************************************************************
2020         dnl *** Check for sched_setaffinity from glibc versions before   ***
2021         dnl *** 2.3.4. The older versions of the function only take 2    ***
2022         dnl *** parameters, not 3.                                       ***
2023         dnl ***                                                          ***
2024         dnl *** Because the interface change was not made in a minor     ***
2025         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
2026         dnl *** won't always indicate the interface sched_affinity has.  ***
2027         dnl ****************************************************************
2028         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
2029         AC_TRY_COMPILE([#include <sched.h>], [
2030             int mask = 1; 
2031             sched_setaffinity(0, &mask);
2032         ], [
2033                 # Yes, we have it...
2034                 AC_MSG_RESULT(yes)
2035                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
2036         ], [
2037                 # We have the new, three-parameter version
2038                 AC_MSG_RESULT(no)
2039         ])
2040         AC_TRY_COMPILE([#include <sched.h>], [
2041              CPU_COUNT((void *) 0);
2042         ], [
2043                 AC_MSG_RESULT(yes)
2044                 AC_DEFINE(GLIBC_HAS_CPU_COUNT, 1, [GLIBC has CPU_COUNT macro in sched.h])
2045         ], [
2046                 # We have the new, three-parameter version
2047                 AC_MSG_RESULT(no)
2048         ])
2050         dnl ******************************************************************
2051         dnl *** Check for large file support                               ***
2052         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
2053         dnl ******************************************************************
2054         
2055         # Check that off_t can represent 2**63 - 1 correctly, working around
2056         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
2057         # CPPFLAGS and sets $large_offt to yes if the test succeeds
2058         large_offt=no
2059         AC_DEFUN([LARGE_FILES], [
2060                 large_CPPFLAGS=$CPPFLAGS
2061                 CPPFLAGS="$CPPFLAGS $1"
2062                 AC_TRY_COMPILE([
2063                         #include <sys/types.h>
2064                         #include <limits.h>
2065                 ], [
2066                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
2067                         #define COMPILE_TIME_ASSERT(pred) \
2068                                 switch(0){case 0:case pred:;}
2069                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
2070                 ], [
2071                         AC_MSG_RESULT(ok)
2072                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
2073                         large_CPPFLAGS="$large_CPPFLAGS $1"
2074                         large_offt=yes
2075                 ], [
2076                         AC_MSG_RESULT(no)
2077                 ])
2078                 CPPFLAGS=$large_CPPFLAGS
2079         ])
2081         AC_MSG_CHECKING(if off_t is 64 bits wide)
2082         LARGE_FILES("")
2083         if test $large_offt = no; then
2084                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
2085                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
2086         fi
2087         if test $large_offt = no; then
2088                 AC_MSG_WARN([No 64 bit file size support available])
2089         fi
2090         
2091         dnl *****************************
2092         dnl *** Checks for libsocket  ***
2093         dnl *****************************
2094         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
2096         case "$host" in
2097                 *-*-*freebsd*)
2098                         dnl *****************************
2099                         dnl *** Checks for libinotify ***
2100                         dnl *****************************
2101                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
2102         esac
2104         dnl *******************************
2105         dnl *** Checks for MSG_NOSIGNAL ***
2106         dnl *******************************
2107         AC_MSG_CHECKING(for MSG_NOSIGNAL)
2108         AC_TRY_COMPILE([#include <sys/socket.h>], [
2109                 int f = MSG_NOSIGNAL;
2110         ], [
2111                 # Yes, we have it...
2112                 AC_MSG_RESULT(yes)
2113                 AC_DEFINE(HAVE_MSG_NOSIGNAL, 1, [Have MSG_NOSIGNAL])
2114         ], [
2115                 # We'll have to use signals
2116                 AC_MSG_RESULT(no)
2117         ])
2119         dnl *****************************
2120         dnl *** Checks for IPPROTO_IP ***
2121         dnl *****************************
2122         AC_MSG_CHECKING(for IPPROTO_IP)
2123         AC_TRY_COMPILE([#include <netinet/in.h>], [
2124                 int level = IPPROTO_IP;
2125         ], [
2126                 # Yes, we have it...
2127                 AC_MSG_RESULT(yes)
2128                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
2129         ], [
2130                 # We'll have to use getprotobyname
2131                 AC_MSG_RESULT(no)
2132         ])
2134         dnl *******************************
2135         dnl *** Checks for IPPROTO_IPV6 ***
2136         dnl *******************************
2137         AC_MSG_CHECKING(for IPPROTO_IPV6)
2138         AC_TRY_COMPILE([#include <netinet/in.h>], [
2139                 int level = IPPROTO_IPV6;
2140         ], [
2141                 # Yes, we have it...
2142                 AC_MSG_RESULT(yes)
2143                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
2144         ], [
2145                 # We'll have to use getprotobyname
2146                 AC_MSG_RESULT(no)
2147         ])
2149         dnl ******************************
2150         dnl *** Checks for IPPROTO_TCP ***
2151         dnl ******************************
2152         AC_MSG_CHECKING(for IPPROTO_TCP)
2153         AC_TRY_COMPILE([#include <netinet/in.h>], [
2154                 int level = IPPROTO_TCP;
2155         ], [
2156                 # Yes, we have it...
2157                 AC_MSG_RESULT(yes)
2158                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
2159         ], [
2160                 # We'll have to use getprotobyname
2161                 AC_MSG_RESULT(no)
2162         ])
2164         dnl *****************************
2165         dnl *** Checks for SOL_IP     ***
2166         dnl *****************************
2167         AC_MSG_CHECKING(for SOL_IP)
2168         AC_TRY_COMPILE([#include <netdb.h>], [
2169                 int level = SOL_IP;
2170         ], [
2171                 # Yes, we have it...
2172                 AC_MSG_RESULT(yes)
2173                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
2174         ], [
2175                 # We'll have to use getprotobyname
2176                 AC_MSG_RESULT(no)
2177         ])
2179         dnl *****************************
2180         dnl *** Checks for SOL_IPV6     ***
2181         dnl *****************************
2182         AC_MSG_CHECKING(for SOL_IPV6)
2183         AC_TRY_COMPILE([#include <netdb.h>], [
2184                 int level = SOL_IPV6;
2185         ], [
2186                 # Yes, we have it...
2187                 AC_MSG_RESULT(yes)
2188                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
2189         ], [
2190                 # We'll have to use getprotobyname
2191                 AC_MSG_RESULT(no)
2192         ])
2194         dnl *****************************
2195         dnl *** Checks for SOL_TCP    ***
2196         dnl *****************************
2197         AC_MSG_CHECKING(for SOL_TCP)
2198         AC_TRY_COMPILE([#include <netdb.h>], [
2199                 int level = SOL_TCP;
2200         ], [
2201                 # Yes, we have it...
2202                 AC_MSG_RESULT(yes)
2203                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
2204         ], [
2205                 # We'll have to use getprotobyname
2206                 AC_MSG_RESULT(no)
2207         ])
2209         dnl *****************************
2210         dnl *** Checks for IP_PKTINFO ***
2211         dnl *****************************
2212         AC_MSG_CHECKING(for IP_PKTINFO)
2213         AC_TRY_COMPILE([#include <linux/in.h>], [
2214                 int level = IP_PKTINFO;
2215         ], [
2216                 # Yes, we have it...
2217                 AC_MSG_RESULT(yes)
2218                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
2219         ], [
2220                 AC_MSG_RESULT(no)
2221         ])
2223         dnl *****************************
2224         dnl *** Checks for IPV6_PKTINFO ***
2225         dnl *****************************
2226         AC_MSG_CHECKING(for IPV6_PKTINFO)
2227         AC_TRY_COMPILE([#include <netdb.h>], [
2228                 int level = IPV6_PKTINFO;
2229         ], [
2230                 # Yes, we have it...
2231                 AC_MSG_RESULT(yes)
2232                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
2233         ], [
2234                 AC_MSG_RESULT(no)
2235         ])
2237         dnl **********************************
2238         dnl *** Checks for IP_DONTFRAG     ***
2239         dnl **********************************
2240         AC_MSG_CHECKING(for IP_DONTFRAG)
2241         AC_TRY_COMPILE([#include <netinet/in.h>], [
2242                 int level = IP_DONTFRAG;
2243         ], [
2244                 # Yes, we have it...
2245                 AC_MSG_RESULT(yes)
2246                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
2247         ], [
2248                 AC_MSG_RESULT(no)
2249         ])
2251         dnl **********************************
2252         dnl *** Checks for IP_DONTFRAGMENT ***
2253         dnl **********************************
2254         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
2255         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
2256                 int level = IP_DONTFRAGMENT;
2257         ], [
2258                 # Yes, we have it...
2259                 AC_MSG_RESULT(yes)
2260                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
2261         ], [
2262                 AC_MSG_RESULT(no)
2263         ])
2265         dnl **********************************
2266         dnl *** Checks for IP_MTU_DISCOVER ***
2267         dnl **********************************
2268         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
2269         AC_TRY_COMPILE([#include <linux/in.h>], [
2270                 int level = IP_MTU_DISCOVER;
2271         ], [
2272                 # Yes, we have it...
2273                 AC_MSG_RESULT(yes)
2274                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
2275         ], [
2276                 AC_MSG_RESULT(no)
2277         ])
2279         dnl **********************************
2280         dnl *** Checks for  IP_PMTUDISC_DO ***
2281         dnl **********************************
2282         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
2283         AC_TRY_COMPILE([#include <linux/in.h>], [
2284                 int level = IP_PMTUDISC_DO;
2285         ], [
2286                 # Yes, we have it...
2287                 AC_MSG_RESULT(yes)
2288                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
2289         ], [
2290                 AC_MSG_RESULT(no)
2291         ])
2293         dnl *********************************
2294         dnl *** Check for struct ip_mreqn ***
2295         dnl *********************************
2296         AC_MSG_CHECKING(for struct ip_mreqn)
2297         AC_TRY_COMPILE([#include <netinet/in.h>], [
2298                 struct ip_mreqn mreq;
2299                 mreq.imr_address.s_addr = 0;
2300         ], [
2301                 # Yes, we have it...
2302                 AC_MSG_RESULT(yes)
2303                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
2304         ], [
2305                 # We'll just have to try and use struct ip_mreq
2306                 AC_MSG_RESULT(no)
2307                 AC_MSG_CHECKING(for struct ip_mreq)
2308                 AC_TRY_COMPILE([#include <netinet/in.h>], [
2309                         struct ip_mreq mreq;
2310                         mreq.imr_interface.s_addr = 0;
2311                 ], [
2312                         # Yes, we have it...
2313                         AC_MSG_RESULT(yes)
2314                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
2315                 ], [
2316                         # No multicast support
2317                         AC_MSG_RESULT(no)
2318                 ])
2319         ])
2320         
2321         dnl **********************************
2322         dnl *** Check for getaddrinfo ***
2323         dnl **********************************
2324         AC_MSG_CHECKING(for getaddrinfo)
2325                 AC_TRY_LINK([
2326                 #include <stdio.h>
2327                 #include <netdb.h>
2328         ], [
2329                 getaddrinfo(NULL,NULL,NULL,NULL);
2330         ], [
2331                 # Yes, we have it...
2332                 AC_MSG_RESULT(yes)
2333                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2334         ], [
2335                 AC_MSG_RESULT(no)
2336         ])
2338         dnl **********************************
2339         dnl *** Check for gethostbyname2_r ***
2340         dnl **********************************
2341         AC_MSG_CHECKING(for gethostbyname2_r)
2342                 AC_TRY_LINK([
2343                 #include <stdio.h>
2344                 #include <netdb.h>
2345         ], [
2347                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
2348         ], [
2349                 # Yes, we have it...
2350                 AC_MSG_RESULT(yes)
2351                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
2352         ], [
2353                 AC_MSG_RESULT(no)
2354         ])
2356         dnl **********************************
2357         dnl *** Check for gethostbyname2 ***
2358         dnl **********************************
2359         AC_MSG_CHECKING(for gethostbyname2)
2360                 AC_TRY_LINK([
2361                 #include <stdio.h>
2362                 #include <netdb.h>
2363         ], [
2364                 gethostbyname2(NULL,0);
2365         ], [
2366                 # Yes, we have it...
2367                 AC_MSG_RESULT(yes)
2368                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
2369         ], [
2370                 AC_MSG_RESULT(no)
2371         ])
2373         dnl **********************************
2374         dnl *** Check for gethostbyname ***
2375         dnl **********************************
2376         AC_MSG_CHECKING(for gethostbyname)
2377                 AC_TRY_LINK([
2378                 #include <stdio.h>
2379                 #include <netdb.h>
2380         ], [
2381                 gethostbyname(NULL);
2382         ], [
2383                 # Yes, we have it...
2384                 AC_MSG_RESULT(yes)
2385                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2386         ], [
2387                 AC_MSG_RESULT(no)
2388         ])
2390         dnl **********************************
2391         dnl *** Check for getprotobyname ***
2392         dnl **********************************
2393         AC_MSG_CHECKING(for getprotobyname)
2394                 AC_TRY_LINK([
2395                 #include <stdio.h>
2396                 #include <netdb.h>
2397         ], [
2398                 getprotobyname(NULL);
2399         ], [
2400                 # Yes, we have it...
2401                 AC_MSG_RESULT(yes)
2402                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2403         ], [
2404                 AC_MSG_RESULT(no)
2405         ])
2407         dnl **********************************
2408         dnl *** Check for getprotobyname_r ***
2409         dnl **********************************
2410         AC_MSG_CHECKING(for getprotobyname_r)
2411                 AC_TRY_LINK([
2412                 #include <stdio.h>
2413                 #include <netdb.h>
2414         ], [
2415                 getprotobyname_r(NULL, NULL, NULL, 0, NULL);
2416         ], [
2417                 # Yes, we have it...
2418                 AC_MSG_RESULT(yes)
2419                 AC_DEFINE(HAVE_GETPROTOBYNAME_R, 1, [Have getprotobyname_r])
2420         ], [
2421                 AC_MSG_RESULT(no)
2422         ])
2424         dnl **********************************
2425         dnl *** Check for getnameinfo ***
2426         dnl **********************************
2427         AC_MSG_CHECKING(for getnameinfo)
2428                 AC_TRY_LINK([
2429                 #include <stdio.h>
2430                 #include <netdb.h>
2431         ], [
2432                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2433         ], [
2434                 # Yes, we have it...
2435                 AC_MSG_RESULT(yes)
2436                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2437         ], [
2438                 AC_MSG_RESULT(no)
2439         ])
2442         dnl **********************************
2443         dnl *** Check for inet_ntop ***
2444         dnl **********************************
2445         AC_MSG_CHECKING(for inet_ntop)
2446                 AC_TRY_LINK([
2447                 #include <stdio.h>
2448                 #include <arpa/inet.h>
2449         ], [
2450                 inet_ntop (0, NULL, NULL, 0);
2451         ], [
2452                 # Yes, we have it...
2453                 AC_MSG_RESULT(yes)
2454                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2455         ], [
2456                 AC_MSG_RESULT(no)
2457         ])
2459         dnl *****************************
2460         dnl *** Checks for libnsl     ***
2461         dnl *****************************
2462         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
2464         AC_CHECK_FUNCS(inet_pton inet_aton)
2466         dnl *****************************
2467         dnl *** Checks for libxnet    ***
2468         dnl *****************************
2469         case "${host}" in
2470                 *solaris* )
2471                         AC_MSG_CHECKING(for Solaris XPG4 support)
2472                         if test -f /usr/lib/libxnet.so; then
2473                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
2474                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
2475                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
2476                                 LIBS="$LIBS -lxnet"
2477                                 AC_MSG_RESULT(yes)
2478                         else
2479                                 AC_MSG_RESULT(no)
2480                         fi
2482                         if test "$GCC" = "yes"; then
2483                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
2484                         fi
2485                 ;;
2486         esac
2488         dnl *****************************
2489         dnl *** Checks for libpthread ***
2490         dnl *****************************
2491 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
2492 # and libpthread does not exist
2494         case "${host}" in
2495                 *-*-*haiku*)
2496                         dnl Haiku has pthread in libroot (libc equiv)
2497                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS")
2498                 ;;
2499                 *-*-*freebsd*)
2500                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2501                 ;;
2502                 *-*-*openbsd*)
2503                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2504                 ;;
2505                 *)
2506                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
2507                 ;;
2508         esac
2509         AC_CHECK_HEADERS(pthread.h)
2510         AC_CHECK_HEADERS(pthread_np.h)
2511         AC_CHECK_FUNCS(pthread_mutex_timedlock)
2512         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_getname_np pthread_setname_np pthread_cond_timedwait_relative_np)
2513         AC_CHECK_FUNCS(pthread_kill)
2514         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
2515         AC_TRY_COMPILE([ #include <pthread.h>], [
2516                 pthread_mutexattr_t attr;
2517                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
2518         ], [
2519                 AC_MSG_RESULT(ok)
2520         ], [
2521                 AC_MSG_RESULT(no)
2522                 AC_ERROR(Posix system lacks support for recursive mutexes)
2523         ])
2524         AC_CHECK_FUNCS(pthread_attr_setstacksize)
2525         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
2526         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
2527         AC_CHECK_FUNCS(mincore mlock munlock)
2529         dnl ***********************************
2530         dnl *** Checks for working __thread ***
2531         dnl ***********************************
2532         AC_MSG_CHECKING(for working __thread)
2533         if test "x$with_tls" != "x__thread"; then
2534                 AC_MSG_RESULT(disabled)
2535         elif test "x$cross_compiling" = "xyes"; then
2536                 AC_MSG_RESULT(cross compiling, assuming yes)
2537         else
2538                 AC_TRY_RUN([
2539                         #if defined(__APPLE__) && defined(__clang__)
2540                         #error "__thread does not currently work with clang on Mac OS X"
2541                         #endif
2542                         
2543                         #include <pthread.h>
2544                         __thread int i;
2545                         static int res1, res2;
2547                         void thread_main (void *arg)
2548                         {
2549                                 i = arg;
2550                                 sleep (1);
2551                                 if (arg == 1)
2552                                         res1 = (i == arg);
2553                                 else
2554                                         res2 = (i == arg);
2555                         }
2557                         int main () {
2558                                 pthread_t t1, t2;
2560                                 i = 5;
2562                                 pthread_create (&t1, NULL, thread_main, 1);
2563                                 pthread_create (&t2, NULL, thread_main, 2);
2565                                 pthread_join (t1, NULL);
2566                                 pthread_join (t2, NULL);
2568                                 return !(res1 + res2 == 2);
2569                         }
2570                 ], [
2571                                 AC_MSG_RESULT(yes)
2572                 ], [
2573                                 AC_MSG_RESULT(no)
2574                                 with_tls=pthread
2575                 ])
2576         fi
2578         dnl **************************************
2579         dnl *** Checks for working sigaltstack ***
2580         dnl **************************************
2581         AC_MSG_CHECKING(for working sigaltstack)
2582         if test "x$with_sigaltstack" != "xyes"; then
2583                 AC_MSG_RESULT(disabled)
2584         elif test "x$cross_compiling" = "xyes"; then
2585                 AC_MSG_RESULT(cross compiling, assuming yes)
2586         else
2587                 AC_TRY_RUN([
2588                         #include <stdio.h>
2589                         #include <stdlib.h>
2590                         #include <unistd.h>
2591                         #include <signal.h>
2592                         #include <pthread.h>
2593                         #include <sys/wait.h>
2594                         #if defined(__FreeBSD__) || defined(__NetBSD__)
2595                         #define SA_STACK SA_ONSTACK
2596                         #endif
2597                         static void
2598                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
2599                         {
2600                                 exit (0);
2601                         }
2603                         volatile char*__ptr = NULL;
2604                         static void *
2605                         loop (void *ignored)
2606                         {
2607                                 *__ptr = 0;
2608                                 return NULL;
2609                         }
2611                         static void
2612                         child ()
2613                         {
2614                                 struct sigaction sa;
2615                                 stack_t sas;
2616                                 pthread_t id;
2617                                 pthread_attr_t attr;
2619                                 sa.sa_sigaction = sigsegv_signal_handler;
2620                                 sigemptyset (&sa.sa_mask);
2621                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
2622                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
2623                                         perror ("sigaction");
2624                                         return;
2625                                 }
2627                                 /* x86 darwin deliver segfaults using SIGBUS */
2628                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
2629                                         perror ("sigaction");
2630                                         return;
2631                                 }
2632                                 sas.ss_sp = malloc (SIGSTKSZ);
2633                                 sas.ss_size = SIGSTKSZ;
2634                                 sas.ss_flags = 0;
2635                                 if (sigaltstack (&sas, NULL) == -1) {
2636                                         perror ("sigaltstack");
2637                                         return;
2638                                 }
2640                                 pthread_attr_init (&attr);
2641                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
2642                                         printf ("pthread_create\n");
2643                                         return;
2644                                 }
2646                                 sleep (100);
2647                         }
2649                         int
2650                         main ()
2651                         {
2652                                 pid_t son;
2653                                 int status;
2654                                 int i;
2656                                 son = fork ();
2657                                 if (son == -1) {
2658                                         return 1;
2659                                 }
2661                                 if (son == 0) {
2662                                         child ();
2663                                         return 0;
2664                                 }
2666                                 for (i = 0; i < 300; ++i) {
2667                                         waitpid (son, &status, WNOHANG);
2668                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
2669                                                 return 0;
2670                                         usleep (10000);
2671                                 }
2673                                 kill (son, SIGKILL);
2674                                 return 1;
2675                         }
2677                 ], [
2678                                 AC_MSG_RESULT(yes)
2679                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
2680                 ], [
2681                                 with_sigaltstack=no
2682                                 AC_MSG_RESULT(no)
2683                 ])
2684         fi
2686         dnl ********************************
2687         dnl *** Checks for semaphore lib ***
2688         dnl ********************************
2689         # 'Real Time' functions on Solaris
2690         # posix4 on Solaris 2.6
2691         # pthread (first!) on Linux
2692         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
2694         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
2695         AC_CHECK_FUNCS(shm_open)
2697         dnl ********************************
2698         dnl *** Checks for timezone stuff **
2699         dnl ********************************
2700         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
2701                 AC_TRY_COMPILE([
2702                         #include <time.h>
2703                         ], [
2704                         struct tm tm;
2705                         tm.tm_gmtoff = 1;
2706                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
2707         if test $ac_cv_struct_tm_gmtoff = yes; then
2708                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
2709         else
2710                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
2711                         AC_TRY_COMPILE([
2712                                 #include <time.h>
2713                         ], [
2714                                 timezone = 1;
2715                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
2716                 if test $ac_cv_var_timezone = yes; then
2717                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
2718                 else
2719                         AC_ERROR(unable to find a way to determine timezone)
2720                 fi
2721         fi
2723         dnl *********************************
2724         dnl *** Checks for math functions ***
2725         dnl *********************************
2726         AC_SEARCH_LIBS(sqrtf, m)
2728         dnl ****************************************************************
2729         dnl *** Checks for working poll() (macosx defines it but doesn't ***
2730         dnl *** have it in the library (duh))                            ***
2731         dnl ****************************************************************
2732         AC_CHECK_FUNCS(poll)
2734         dnl **********************************
2735         dnl *** epoll                      ***
2736         dnl **********************************
2737         AC_CHECK_HEADERS(sys/epoll.h)
2738         haveepoll=no
2739         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
2740         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
2741                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
2742         fi
2744         havekqueue=no
2746         AC_CHECK_HEADERS(sys/event.h)
2747         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
2749         dnl **************************************
2750         dnl * Darwin has a race that prevents us from using reliably:
2751         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
2752         dnl * Since kqueue is mostly used for scaling large web servers, 
2753         dnl * and very few folks run Mono on large web servers on OSX, falling
2754         dnl * back 
2755         dnl **************************************
2756         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
2757                 if test "x$host_darwin" = "xno"; then
2758                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
2759                 fi
2760         fi
2762         dnl ******************************
2763         dnl *** Checks for SIOCGIFCONF ***
2764         dnl ******************************
2765         AC_CHECK_HEADERS(sys/ioctl.h)
2766         AC_CHECK_HEADERS(net/if.h, [], [],
2767            [
2768            #ifdef HAVE_SYS_TYPES_H
2769            # include <sys/types.h>
2770            #endif
2771            #ifdef HAVE_SYS_SOCKET_H
2772            # include <sys/socket.h>
2773            #endif
2774            ])
2775         AC_MSG_CHECKING(for ifreq)
2776         AC_TRY_COMPILE([
2777                 #include <stdio.h>
2778                 #include <sys/ioctl.h>
2779                 #include <net/if.h>
2780                 ], [
2781                 struct ifconf ifc;
2782                 struct ifreq *ifr;
2783                 void *x;
2784                 ifc.ifc_len = 0;
2785                 ifc.ifc_buf = NULL;
2786                 x = (void *) &ifr->ifr_addr;
2787                 ],[
2788                         AC_MSG_RESULT(yes)
2789                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
2790                 ], [
2791                         AC_MSG_RESULT(no)
2792                 ])
2793         dnl **********************************
2794         dnl ***     Checks for sin_len     ***
2795         dnl **********************************
2796         AC_MSG_CHECKING(for sockaddr_in.sin_len)
2797         AC_TRY_COMPILE([
2798                 #include <netinet/in.h>
2799                 ], [
2800                 struct sockaddr_in saddr;
2801                 saddr.sin_len = sizeof (saddr);
2802                 ],[
2803                         AC_MSG_RESULT(yes)
2804                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
2805                 ], [
2806                         AC_MSG_RESULT(no)
2807                 ])      
2808         dnl **********************************
2809         dnl ***    Checks for sin6_len     ***
2810         dnl **********************************
2811         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
2812         AC_TRY_COMPILE([
2813                 #include <netinet/in.h>
2814                 ], [
2815                 struct sockaddr_in6 saddr6;
2816                 saddr6.sin6_len = sizeof (saddr6);
2817                 ],[
2818                         AC_MSG_RESULT(yes)
2819                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
2820                 ], [
2821                         AC_MSG_RESULT(no)
2822                 ])
2823         dnl **********************************
2824         dnl *** Check for getifaddrs       ***
2825         dnl **********************************
2826         AC_MSG_CHECKING(for getifaddrs)
2827                 AC_TRY_LINK([
2828                 #include <stdio.h>
2829                 #include <sys/types.h>
2830                 #include <sys/socket.h>
2831                 #include <ifaddrs.h>
2832         ], [
2833                 getifaddrs(NULL);
2834         ], [
2835                 # Yes, we have it...
2836                 AC_MSG_RESULT(yes)
2837                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
2838         ], [
2839                 AC_MSG_RESULT(no)
2840         ])
2841         dnl **********************************
2842         dnl *** Check for if_nametoindex   ***
2843         dnl **********************************
2844         AC_MSG_CHECKING(for if_nametoindex)
2845                 AC_TRY_LINK([
2846                 #include <stdio.h>
2847                 #include <sys/types.h>
2848                 #include <sys/socket.h>
2849                 #include <net/if.h>
2850         ], [
2851                 if_nametoindex(NULL);
2852         ], [
2853                 # Yes, we have it...
2854                 AC_MSG_RESULT(yes)
2855                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
2856         ], [
2857                 AC_MSG_RESULT(no)
2858         ])
2859         dnl **********************************
2860         dnl *** Check for access ***
2861         dnl **********************************
2862         AC_MSG_CHECKING(for access)
2863                 AC_TRY_LINK([
2864                 #include <unistd.h>
2865         ], [
2866                 access(NULL,0);
2867         ], [
2868                 # Yes, we have it...
2869                 AC_MSG_RESULT(yes)
2870                 AC_DEFINE(HAVE_ACCESS, 1, [Have access])
2871         ], [
2872                 AC_MSG_RESULT(no)
2873         ])
2874                         
2875         dnl **********************************
2876         dnl *** Checks for proclib         ***
2877         dnl **********************************
2878         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.)])
2879         dnl **********************************
2880         dnl *** Checks for MonoPosixHelper ***
2881         dnl **********************************
2882         AC_CHECK_HEADERS(checklist.h)
2883         AC_CHECK_HEADERS(pathconf.h)
2884         AC_CHECK_HEADERS(fstab.h)
2885         AC_CHECK_HEADERS(attr/xattr.h)
2886         AC_CHECK_HEADERS(sys/extattr.h)
2887         AC_CHECK_HEADERS(sys/sendfile.h)
2888         AC_CHECK_HEADERS(sys/statvfs.h)
2889         AC_CHECK_HEADERS(sys/statfs.h)
2890         AC_CHECK_HEADERS(sys/vfstab.h)
2891         AC_CHECK_HEADERS(sys/xattr.h)
2892         AC_CHECK_HEADERS(sys/mman.h)
2893         AC_CHECK_HEADERS(sys/param.h)
2894         AC_CHECK_HEADERS(sys/mount.h, [], [],
2895                 [
2896                 #ifdef HAVE_SYS_PARAM_H
2897                 # include <sys/param.h>
2898                 #endif
2899                 ])
2900         AC_CHECK_HEADERS(sys/mount.h)
2901         AC_CHECK_FUNCS(confstr)
2902         AC_CHECK_FUNCS(seekdir telldir)
2903         AC_CHECK_FUNCS(getdomainname)
2904         AC_CHECK_FUNCS(setdomainname)
2905         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
2906         AC_CHECK_FUNCS(setgroups)
2907         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
2908         AC_CHECK_FUNCS(getfsstat)
2909         AC_CHECK_FUNCS(lutimes futimes)
2910         AC_CHECK_FUNCS(mremap)
2911         AC_CHECK_FUNCS(remap_file_pages)
2912         AC_CHECK_FUNCS(posix_fadvise)
2913         AC_CHECK_FUNCS(posix_fallocate)
2914         AC_CHECK_FUNCS(posix_madvise)
2915         AC_CHECK_FUNCS(vsnprintf)
2916         AC_CHECK_FUNCS(sendfile)
2917         AC_CHECK_FUNCS(gethostid sethostid)
2918         AC_CHECK_FUNCS(sethostname)
2919         AC_CHECK_FUNCS(statfs)
2920         AC_CHECK_FUNCS(fstatfs)
2921         AC_CHECK_FUNCS(statvfs)
2922         AC_CHECK_FUNCS(fstatvfs)
2923         AC_CHECK_FUNCS(stime)
2924         AC_CHECK_FUNCS(ttyname_r)
2925         AC_CHECK_FUNCS(psignal)
2926         AC_CHECK_FUNCS(getlogin_r)
2927         AC_CHECK_FUNCS(lockf)
2928         AC_CHECK_FUNCS(swab)
2929         AC_CHECK_FUNCS(setusershell endusershell)
2930         AC_CHECK_FUNCS(futimens utimensat)
2931         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
2932         AC_CHECK_FUNCS(readv writev preadv pwritev)
2933         AC_CHECK_FUNCS(setpgid)
2934         AC_CHECK_FUNCS(system)
2935         AC_CHECK_FUNCS(fork execv execve)
2936         AC_CHECK_FUNCS(waitpid)
2937         AC_CHECK_FUNCS(accept4)
2938         AC_CHECK_FUNCS(localtime_r)
2939         AC_CHECK_FUNCS(mkdtemp)
2940         AC_CHECK_SIZEOF(size_t)
2941         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
2942                 [#include <sys/types.h>
2943                  #include <sys/stat.h>
2944                  #include <unistd.h>])
2945         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
2946                 [#include <sys/types.h>
2947                  #include <sys/stat.h>
2948                  #include <unistd.h>])
2949         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
2950                 [#include <sys/time.h>])
2951         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
2952                 [#include <sys/socket.h>])
2953         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
2954                 [#include <unistd.h>
2955                  #include <fcntl.h>])
2956         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
2957                 [#include <sys/uio.h>])
2958         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
2959                 [#include <sys/socket.h>])
2960         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
2961                 [#include <sys/poll.h>])
2962         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
2963                 [#include <sys/socket.h>])
2964         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
2965                 [#include <sys/socket.h>])
2966         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
2967                 [#include <netinet/in.h>])
2968         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
2969                 [#include <netinet/in.h>])
2970         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
2971                 [#include <sys/un.h>])
2972         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
2973                 [#include <sys/types.h>
2974                  #include <sys/stat.h>
2975                  #include <unistd.h>])
2976         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
2977                 [#include <time.h>])
2978         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
2979                 [#include <sys/time.h>
2980                  #include <sys/types.h>
2981                  #include <utime.h>])
2982         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
2983                 [#include <sys/time.h>])
2984         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
2985                 [#include <sys/types.h>
2986                  #include <utime.h>])
2987         AC_CHECK_MEMBERS(
2988                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
2989                 [#include <sys/types.h>
2990                  #include <dirent.h>])
2991         AC_CHECK_MEMBERS(
2992                 [struct passwd.pw_gecos],,, 
2993                 [#include <sys/types.h>
2994                  #include <pwd.h>])
2995         AC_CHECK_MEMBERS(
2996                 [struct statfs.f_flags],,, 
2997                 [#include <sys/types.h>
2998                  #include <sys/vfs.h>])
2999         AC_CHECK_MEMBERS(
3000                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
3001                 [#include <sys/types.h>
3002                  #include <sys/stat.h>
3003                  #include <unistd.h>])
3005         dnl Favour xattr through glibc, but use libattr if we have to
3006         AC_CHECK_FUNC(lsetxattr, ,
3007                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
3008         )
3009         AC_SUBST(XATTR_LIB)
3011         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
3012         AC_CHECK_MEMBERS(
3013                 [struct kinfo_proc.kp_proc],,, 
3014                 [#include <sys/types.h>
3015                  #include <sys/param.h>
3016                  #include <sys/sysctl.h>
3017                  #include <sys/proc.h>
3018                  ])
3020         dnl *********************************
3021         dnl *** Checks for Windows compilation ***
3022         dnl *********************************
3023         AC_CHECK_HEADERS(sys/time.h)
3024         AC_CHECK_HEADERS(sys/param.h)
3025         AC_CHECK_HEADERS(dirent.h)
3027         dnl ******************************************
3028         dnl *** Checks for OSX and iOS compilation ***
3029         dnl ******************************************
3030         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
3032         dnl *********************************
3033         dnl *** Check for Console 2.0 I/O ***
3034         dnl *********************************
3035         AC_CHECK_HEADERS([curses.h])
3036         AC_CHECK_HEADERS([term.h], [], [],
3037         [#if HAVE_CURSES_H
3038          #include <curses.h>
3039          #endif
3040         ])
3041         AC_CHECK_HEADERS([termios.h])
3043         dnl *********************************
3044         dnl *** Checks for random         ***
3045         dnl *********************************
3046         if test x$host_darwin = xno; then
3047                 AC_CHECK_HEADERS(sys/random.h)
3048                 AC_CHECK_FUNCS(getrandom getentropy)
3049         fi
3051         dnl *********************************
3052         dnl *** Checks for Mono.Native  ***
3053         dnl *********************************
3055         AC_MSG_CHECKING(for linux/in.h)
3056         AC_TRY_COMPILE([
3057                 #include <sys/socket.h>
3058                 #include <linux/in.h>
3059         ], [
3060         ],[
3061                 AC_MSG_RESULT(yes)
3062                 AC_DEFINE(HAVE_LINUX_IN_H, 1, [linux/in.h])
3063         ], [
3064                 AC_MSG_RESULT(no)
3065         ])
3067         AC_CHECK_HEADERS([linux/if_packet.h])
3069         AC_MSG_CHECKING(for struct in_pktinfo)
3070         AC_TRY_COMPILE([
3071                 #ifdef HAVE_LINUX_IN_H
3072                 #include <sys/socket.h>
3073                 #include <linux/in.h>
3074                 #else
3075                 #include <netinet/in.h>
3076                 #endif
3077         ], [
3078                 struct in_pktinfo pktinfo;
3079         ],[
3080                 AC_MSG_RESULT(yes)
3081                 AC_DEFINE(HAVE_IN_PKTINFO, 1, [struct in_pktinfo])
3082         ], [
3083                 AC_MSG_RESULT(no)
3084         ])
3086         AC_MSG_CHECKING(for struct ip_mreqn)
3087         AC_TRY_COMPILE([
3088                 #if HAVE_LINUX_IN_H
3089                 #include <sys/socket.h>
3090                 #include <linux/in.h>
3091                 #else
3092                 #include <netinet/in.h>
3093                 #endif
3094         ], [
3095                 struct ip_mreqn mreqn;
3096         ],[
3097                 AC_MSG_RESULT(yes)
3098                 AC_DEFINE(HAVE_IP_MREQN, 1, struct ip_mreqn)
3099         ], [
3100                 AC_MSG_RESULT(no)
3101         ])
3103         if test x$host_darwin = xno; then
3104                 AC_CHECK_TYPES([struct flock64], [AC_DEFINE(HAVE_FLOCK64, 1, struct flock64)], , [#include <fcntl.h>])
3105         fi
3107         if test x$mono_native_platform_ios = xno; then
3108                 # On iOS, `stat64()` is deprecated and there is no `struct stat64` and `stat()`
3109                 # is either 32-bit or 64-bit based on the device / simulator that you're running on.
3110                 AC_CHECK_FUNC(stat64,            [AC_DEFINE(HAVE_STAT64, 1, [stat64])])
3111         fi
3113         AC_CHECK_FUNC(lseek64,           [AC_DEFINE(HAVE_LSEEK64, 1, [lseek64])])
3114         AC_CHECK_FUNC(mmap64,            [AC_DEFINE(HAVE_MMAP64, 1, [mmap64])])
3115         AC_CHECK_FUNC(ftruncate64,       [AC_DEFINE(HAVE_FTRUNCATE64, 1, [ftruncate64])])
3116         AC_CHECK_FUNC(posix_fadvise64,   [AC_DEFINE(HAVE_POSIX_FADVISE64, 1, [posix_fadvise64])])
3117         AC_CHECK_DECL(pipe2,             [AC_DEFINE(HAVE_PIPE2, 1, [pipe2])])
3118         AC_CHECK_FUNC(getmntinfo,        [AC_DEFINE(HAVE_GETMNTINFO, 1, [getmntinfo])], [], [[#include <unistd.h>]])
3119         AC_CHECK_FUNC(strcpy_s,          [AC_DEFINE(HAVE_STRCPY_S, 1, [strcpy_s])])
3120         AC_CHECK_FUNC(strlcpy,           [AC_DEFINE(HAVE_STRLCPY, 1, [strlcpy])])
3121         AC_CHECK_FUNC(posix_fadvise,     [AC_DEFINE(HAVE_POSIX_FADVISE, 1, [posix_fadvise])])
3122         AC_CHECK_FUNC(ioctl,             [AC_DEFINE(HAVE_IOCTL, 1, [ioctl])])
3123         AC_CHECK_FUNC(sched_getaffinity, [AC_DEFINE(HAVE_SCHED_GETAFFINITY, 1, [sched_getaffinity])])
3124         AC_CHECK_FUNC(sched_setaffinity, [AC_DEFINE(HAVE_SCHED_SETAFFINITY, 1, [sched_setaffinity])])
3125         AC_CHECK_DECL(TIOCGWINSZ,        [AC_DEFINE(HAVE_TIOCGWINSZ, 1, [TIOCGWINSZ])], [], [[#include <sys/ioctl.h>]])
3126         AC_CHECK_FUNC(tcgetattr,         [AC_DEFINE(HAVE_TCGETATTR, 1, [tcgetattr])])
3127         AC_CHECK_FUNC(tcsetattr,         [AC_DEFINE(HAVE_TCSETATTR, 1, [tcsetattr])])
3128         AC_CHECK_FUNC(arc4random_buf,    [AC_DEFINE(HAVE_ARC4RANDOM_BUF, 1, [arc4random_buf])])
3129         AC_CHECK_DECL(ECHO,              [AC_DEFINE(HAVE_ECHO, 1, [ECHO])], [], [[#include <termios.h>]])
3130         AC_CHECK_DECL(ICANON,            [AC_DEFINE(HAVE_ICANON, 1, [ICANON])], [], [[#include <termios.h>]])
3131         AC_CHECK_DECL(TCSANOW,           [AC_DEFINE(HAVE_TCSANOW, 1, [TCSANOW])], [], [[#include <termios.h>]])
3133         AC_CHECK_DECL(O_CLOEXEC,         [AC_DEFINE(HAVE_O_CLOEXEC, 1, [O_CLOEXEC])], [], [[#include <fcntl.h>]])
3134         AC_CHECK_DECL(F_DUPFD_CLOEXEC,   [AC_DEFINE(HAVE_F_DUPFD_CLOEXEC, 1, [F_DUPFD_CLOEXEC])], [], [[#include <fcntl.h>]])
3136         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>]])
3137         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>]])
3138         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>]])
3139         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>]])
3140         AC_CHECK_MEMBER(struct dirent.d_namlen,       [AC_DEFINE(HAVE_DIRENT_NAME_LEN, 1, [struct dirent.d_namlen])], [], [[#include <dirent.h>]])
3141         AC_CHECK_MEMBER(struct statfs.f_fstypename,   [AC_DEFINE(HAVE_STATFS_FSTYPENAME, 1, [struct statfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3142         AC_CHECK_MEMBER(struct statvfs.f_fstypename,  [AC_DEFINE(HAVE_STATVFS_FSTYPENAME, 1, [struct statvfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3144         AC_MSG_CHECKING(for struct statfs)
3145         AC_TRY_COMPILE([
3146                 #if defined(HAVE_STATFS_FSTYPENAME) || defined(HAVE_STATVFS_FSTYPENAME)
3147                 #include <sys/mount.h>
3148                 #else
3149                 #include <sys/statfs.h>
3150                 #endif
3151         ], [
3152                 struct statfs;
3153         ],[
3154                 AC_MSG_RESULT(yes)
3155                 AC_DEFINE(HAVE_STATFS, 1, [struct statfs])
3156         ], [
3157                 AC_MSG_RESULT(no)
3158         ])
3160         if test "x$ac_cv_func_strerror_r_char_p" = "xyes" ; then
3161                 AC_DEFINE(HAVE_GNU_STRERROR_R, 1, [char* strerror(int errnum, char *buf, size_t buflen)])
3162         fi
3164         AC_MSG_CHECKING(for readdir_r)
3165         AC_TRY_COMPILE([
3166                 #include <dirent.h>
3167         ], [
3168                 DIR* dir;
3169                 struct dirent* entry;
3170                 struct dirent* result;
3171                 readdir_r(dir, entry, &result);
3172         ],[
3173                 AC_MSG_RESULT(yes)
3174                 AC_DEFINE(HAVE_READDIR_R, 1, [readdir_r])
3175         ], [
3176                 AC_MSG_RESULT(no)
3177         ])
3179         AC_MSG_CHECKING(for kevent with void *data)
3180         AC_TRY_COMPILE([
3181                 #include <sys/types.h>
3182                 #include <sys/event.h>
3183         ], [
3184                 struct kevent event;
3185                 void* data;
3186                 EV_SET(&event, 0, EVFILT_READ, 0, 0, 0, data);
3187         ],[
3188                 AC_MSG_RESULT(yes)
3189                 AC_DEFINE(KEVENT_HAS_VOID_UDATA, 1, [kevent with void *data])
3190         ], [
3191                 AC_MSG_RESULT(no)
3192         ])
3194         AC_CHECK_MEMBER(struct fd_set.fds_bits,   [AC_DEFINE(HAVE_FDS_BITS, 1, [struct fd_set.fds_bits])], [], [[#include <sys/select.h>]])
3195         AC_CHECK_MEMBER(struct fd_set.__fds_bits, [AC_DEFINE(HAVE_PRIVATE_FDS_BITS, 1, [struct fd_set.__fds_bits])], [], [[#include <sys/select.h>]])
3197         AC_MSG_CHECKING(for sendfile with 4 arguments)
3198         AC_TRY_COMPILE([
3199                 #include <sys/sendfile.h>
3200         ], [
3201                 int result = sendfile(0, 0, 0, 0);
3202         ],[
3203                 AC_MSG_RESULT(yes)
3204                 AC_DEFINE(HAVE_SENDFILE_4, 1, [sendfile with 4 arguments])
3205         ], [
3206                 AC_MSG_RESULT(no)
3207         ])
3209         AC_MSG_CHECKING(for sendfile with 6 arguments)
3210         AC_TRY_LINK([
3211                 #include <stdlib.h>
3212                 #include <sys/types.h>
3213                 #include <sys/socket.h>
3214                 #include <sys/uio.h>
3215         ], [
3216                 int result = sendfile(0, 0, 0, NULL, NULL, 0);
3217         ],[
3218                 AC_MSG_RESULT(yes)
3219                 AC_DEFINE(HAVE_SENDFILE_6, 1, [sendfile with 6 arguments])
3220         ], [
3221                 AC_MSG_RESULT(no)
3222         ])
3224         AC_CHECK_FUNC(fcopyfile,     [AC_DEFINE(HAVE_FCOPYFILE, 1, [fcopyfile])])
3225         AC_CHECK_FUNC(epoll_create1, [AC_DEFINE(HAVE_EPOLL, 1, [epoll_create1])])
3226         AC_CHECK_FUNC(accept4,       [AC_DEFINE(HAVE_ACCEPT4, 1, [accept4])])
3227         AC_CHECK_FUNC(kqueue,        [AC_DEFINE(HAVE_KQUEUE, 1, [kqueue])])
3229         ORIG_CFLAGS="$CFLAGS"
3230         CFLAGS="-Werror -Wsign-conversion"
3232         AC_MSG_CHECKING(for getnameinfo with signed flags)
3233         AC_TRY_COMPILE([
3234                 #include <sys/types.h>
3235                 #include <netdb.h>
3236         ], [
3237                 const struct sockaddr *addr;
3238                 socklen_t addrlen;
3239                 char *host;
3240                 socklen_t hostlen;
3241                 char *serv;
3242                 socklen_t servlen;
3243                 int flags;
3244                 int result = getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags);
3245         ],[
3246                 AC_MSG_RESULT(yes)
3247                 AC_DEFINE(HAVE_GETNAMEINFO_SIGNED_FLAGS, 1, [getnameinfo with signed flags])
3248         ], [
3249                 AC_MSG_RESULT(no)
3250         ])
3252         CFLAGS="$ORIG_CFLAGS"
3254         if test "x$host_linux" = "xyes"; then
3255                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 1, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3256         else
3257                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 0, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3258         fi
3260         ORIG_CFLAGS="$CFLAGS"
3261         CFLAGS="-Werror -Wsign-conversion"
3263         AC_MSG_CHECKING(for bind with unsigned addrlen)
3264         AC_TRY_COMPILE([
3265                 #include <sys/socket.h>
3266         ], [
3267                 int fd;
3268                 struct sockaddr* addr;
3269                 socklen_t addrLen;
3270                 bind(fd, addr, addrLen);
3271         ],[
3272                 AC_MSG_RESULT(yes)
3273                 AC_DEFINE(BIND_ADDRLEN_UNSIGNED, 1, [bind with unsigned addrlen])
3274         ], [
3275                 AC_MSG_RESULT(no)
3276         ])
3278         AC_MSG_CHECKING(for struct ipv6_mreq with unsigned ipv6mr_interface)
3279         AC_TRY_COMPILE([
3280                 #include <netinet/in.h>
3281                 #include <netinet/tcp.h>
3282         ], [
3283                 struct ipv6_mreq opt;
3284                 unsigned int index = 0;
3285                 opt.ipv6mr_interface = index;
3286         ],[
3287                 AC_MSG_RESULT(yes)
3288                 AC_DEFINE(IPV6MR_INTERFACE_UNSIGNED, 1, [struct ipv6_mreq with unsigned ipv6mr_interface])
3289         ], [
3290                 AC_MSG_RESULT(no)
3291         ])
3293         AC_MSG_CHECKING(for inotify_rm_watch with unsigned wd)
3294         AC_TRY_COMPILE([
3295                 #include <sys/inotify.h>
3296         ], [
3297                 intptr_t fd;
3298                 uint32_t wd;
3299                 int result = inotify_rm_watch(fd, wd);
3300         ],[
3301                 AC_MSG_RESULT(yes)
3302                 AC_DEFINE(INOTIFY_RM_WATCH_WD_UNSIGNED, 1, [inotify_rm_watch with unsigned wd])
3303         ], [
3304                 AC_MSG_RESULT(no)
3305         ])
3307         CFLAGS="$ORIG_CFLAGS"
3309         AC_MSG_CHECKING(for shm_open that works well enough with mmap)
3310         if test "x$ac_cv_func_shm_open" = "xno" -o "x$ac_cv_func_shm_open_working_with_mmap" = "xno" ; then
3311                 AC_MSG_RESULT(no)
3312         elif test "x$cross_compiling" = "xyes"; then
3313                 AC_MSG_RESULT(cross compiling, assuming yes)
3314                 AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3315         else
3316                 AC_TRY_RUN([
3317                         #include <sys/mman.h>
3318                         #include <fcntl.h>
3319                         #include <unistd.h>
3321                         int main ()
3322                         {
3323                                 int fd = shm_open("/mono_configure_shm_open", O_CREAT | O_RDWR, 0777);
3324                                 if (fd == -1)
3325                                         return -1;
3327                                 shm_unlink("/mono_configure_shm_open");
3329                                 // NOTE: PROT_EXEC and MAP_PRIVATE don't work well with shm_open
3330                                 //       on at least the current version of Mac OS X
3332                                 if (mmap(NULL, 1, PROT_EXEC, MAP_PRIVATE, fd, 0) == MAP_FAILED)
3333                                         return -1;
3335                                 return 0;
3336                         }
3337                 ],[
3338                         AC_MSG_RESULT(yes)
3339                         AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3340                 ], [
3341                         AC_MSG_RESULT(no)
3342                 ])
3343         fi
3345         AC_MSG_CHECKING(for getpriority with int who)
3346         AC_TRY_COMPILE([
3347                 #include <sys/resource.h>
3348         ], [
3349                 int which;
3350                 int who;
3351                 int result = getpriority(which, who);
3352         ],[
3353                 AC_MSG_RESULT(yes)
3354                 AC_DEFINE(PRIORITY_REQUIRES_INT_WHO, 1, [getpriority with int who])
3355         ], [
3356                 AC_MSG_RESULT(no)
3357         ])
3359         AC_MSG_CHECKING(for kevent with int parameters)
3360         AC_TRY_COMPILE([
3361                 #include <sys/types.h>
3362                 #include <sys/event.h>
3363         ], [
3364                 int kg;
3365                 const struct kevent* chagelist;
3366                 int nchanges;
3367                 struct kevent* eventlist;
3368                 int nevents;
3369                 const struct timespec* timeout;
3370                 int result = kevent(kg, chagelist, nchanges, eventlist, nevents, timeout);
3371         ],[
3372                 AC_MSG_RESULT(yes)
3373                 AC_DEFINE(KEVENT_REQUIRES_INT_PARAMS, 1, [kevent with int parameters])
3374         ], [
3375                 AC_MSG_RESULT(no)
3376         ])
3378         ORIG_CFLAGS="$CFLAGS"
3379         CFLAGS="-Werror -Wimplicit-function-declaration"
3381         AC_MSG_CHECKING(for mkstemps)
3382         AC_TRY_COMPILE([
3383                 #include <stdlib.h>
3384                 #include <unistd.h>
3385                 #include <string.h>
3386         ], [
3387                 char *template;
3388                 int suffixlen;
3389                 int result = mkstemps(template, suffixlen);
3390         ],[
3391                 AC_MSG_RESULT(yes)
3392                 AC_DEFINE(HAVE_MKSTEMPS, 1, [mkstemps])
3393                 have_mkstemps=yes
3394         ], [
3395                 AC_MSG_RESULT(no)
3396         ])
3398         CFLAGS="$ORIG_CFLAGS"
3400         if test "x$have_mkstemps" != "xyes" -a "x$ac_cv_func_mkstemp" != "xyes"; then
3401                 AC_MSG_ERROR([Cannot find mkstemps or mkstemp on this platform])
3402         fi
3404         AC_MSG_CHECKING(for tcp/var.h)
3405         AC_TRY_COMPILE([
3406                 #include <sys/types.h>
3407                 #include <sys/socketvar.h>
3408                 #include <netinet/ip.h>
3409                 #include <netinet/tcp.h>
3410                 #include <netinet/tcp_var.h>
3411         ], [
3412         ],[
3413                 AC_MSG_RESULT(yes)
3414                 AC_DEFINE(HAVE_TCP_VAR_H, 1, [tcp/var.h])
3415         ], [
3416                 AC_MSG_RESULT(no)
3417         ])
3419         AC_CHECK_HEADERS([sys/cdefs.h])
3421         AC_MSG_CHECKING(for TCPSTATE enum in netinet/tcp.h)
3422         AC_TRY_COMPILE([
3423                 #ifdef HAVE_SYS_CDEFS_H
3424                 #include <sys/cdefs.h>
3425                 #endif
3426                 #include <netinet/tcp.h>
3427         ], [
3428                 int result = TCP_ESTABLISHED;
3429         ],[
3430                 AC_MSG_RESULT(yes)
3431                 AC_DEFINE(HAVE_TCP_H_TCPSTATE_ENUM, 1, [TCPSTATE enum in netinet/tcp.h])
3432         ], [
3433                 AC_MSG_RESULT(no)
3434         ])
3436         AC_CHECK_DECL(TCPS_ESTABLISHED, [AC_DEFINE(HAVE_TCP_FSM_H, 1, [HAVE_TCP_FSM_H])], [], [[#include <netinet/tcp_fsm.h>]])
3438         AC_MSG_CHECKING(for struct rt_msghdr)
3439         AC_TRY_COMPILE([
3440                 #include <sys/types.h>
3441                 #include <net/route.h>
3442         ], [
3443                 struct rt_msghdr;
3444         ],[
3445                 AC_MSG_RESULT(yes)
3446                 AC_DEFINE(HAVE_RT_MSGHDR, 1, [struct rt_msghdr])
3447         ], [
3448                 AC_MSG_RESULT(no)
3449         ])
3451         AC_CHECK_HEADERS([sys/sysctl.h])
3452         AC_CHECK_HEADERS([linux/rtnetlink.h])
3454         AC_CHECK_FUNC(getpeereid,    [AC_DEFINE(HAVE_GETPEEREID, 1, [getpeereid])])
3455         AC_CHECK_FUNC(getdomainname, [AC_DEFINE(HAVE_GETDOMAINNAME, 1, [getdomainname])])
3456         AC_CHECK_FUNC(uname,         [AC_DEFINE(HAVE_UNAME, 1, [uname])])
3458         ORIG_CFLAGS="$CFLAGS"
3459         CFLAGS="-Werror -Weverything"
3461         AC_MSG_CHECKING(for getdomainname with size_t namelen)
3462         AC_TRY_COMPILE([
3463                 #include <unistd.h>
3464         ], [
3465                 size_t namelen = 20;
3466                 char name[20];
3467                 int result = getdomainname(name, namelen);
3468         ],[
3469                 AC_MSG_RESULT(yes)
3470                 AC_DEFINE(HAVE_GETDOMAINNAME_SIZET, 1, [getdomainname with size_t namelen])
3471         ], [
3472                 AC_MSG_RESULT(no)
3473         ])
3475         CFLAGS="$ORIG_CFLAGS"
3477         AC_CHECK_FUNC(inotify_init, [AC_DEFINE(HAVE_INOTIFY_INIT, 1, [inotify_init])])
3478         AC_CHECK_FUNC(inotify_add_watch, [AC_DEFINE(HAVE_INOTIFY_ADD_WATCH, 1, [inotify_add_watch])])
3479         AC_CHECK_FUNC(inotify_rm_watch, [AC_DEFINE(HAVE_INOTIFY_RM_WATCH, 1, [inotify_rm_watch])])
3481         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
3482                 AC_DEFINE(HAVE_INOTIFY, 1, [HAVE_INOTIFY])
3483         elif test "x$host_linux" = "xyes"; then
3484                 AC_MSG_ERROR([Cannot find inotify functions on a Linux platform.])
3485         fi
3487         AC_CHECK_HEADERS([crt_externs.h])
3489         AC_MSG_CHECKING(for _NSGetEnviron)
3490         AC_TRY_COMPILE([
3491                 #include <crt_externs.h>
3492         ], [
3493                 char **result = *(_NSGetEnviron());
3494         ],[
3495                 AC_MSG_RESULT(yes)
3496                 AC_DEFINE(HAVE_NSGETENVIRON, 1, [_NSGetEnviron])
3497         ], [
3498                 AC_MSG_RESULT(no)
3499         ])
3501         AC_CHECK_DECL(IN_EXCL_UNLINK, [AC_DEFINE(HAVE_IN_EXCL_UNLINK, 1, [IN_EXCL_UNLINK])], [], [[#include <sys/inotify.h>]])
3503 else
3504         dnl *********************************
3505         dnl *** Checks for Windows compilation ***
3506         dnl *********************************
3507         AC_CHECK_HEADERS(winternl.h)
3509         jdk_headers_found=no
3510         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
3511         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
3512         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
3513         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
3514         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
3515         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
3516         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
3518         dnl *********************************
3519         dnl *** Check for struct ip_mreqn ***
3520         dnl *********************************
3521         AC_MSG_CHECKING(for struct ip_mreqn)
3522         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3523                 struct ip_mreqn mreq;
3524                 mreq.imr_address.s_addr = 0;
3525         ], [
3526                 # Yes, we have it...
3527                 AC_MSG_RESULT(yes)
3528                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
3529         ], [
3530                 # We'll just have to try and use struct ip_mreq
3531                 AC_MSG_RESULT(no)
3532                 AC_MSG_CHECKING(for struct ip_mreq)
3533                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3534                         struct ip_mreq mreq;
3535                         mreq.imr_interface.s_addr = 0;
3536                 ], [
3537                         # Yes, we have it...
3538                         AC_MSG_RESULT(yes)
3539                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
3540                 ], [
3541                         # No multicast support
3542                         AC_MSG_RESULT(no)
3543                 ])
3544         ])
3546         dnl **********************************
3547         dnl *** Check for getaddrinfo ***
3548         dnl **********************************
3549         AC_MSG_CHECKING(for getaddrinfo)
3550                 AC_TRY_LINK([
3551                 #include <stdio.h>
3552                 #include <winsock2.h>
3553                 #include <ws2tcpip.h>
3554         ], [
3555                 getaddrinfo(NULL,NULL,NULL,NULL);
3556         ], [
3557                 # Yes, we have it...
3558                 AC_MSG_RESULT(yes)
3559                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
3560         ], [
3561                 AC_MSG_RESULT(no)
3562         ])
3564         dnl **********************************
3565         dnl *** Check for gethostbyname ***
3566         dnl **********************************
3567         AC_MSG_CHECKING(for gethostbyname)
3568                 AC_TRY_LINK([
3569                 #include <stdio.h>
3570                 #include <winsock2.h>
3571                 #include <ws2tcpip.h>
3572         ], [
3573                 gethostbyname(NULL);
3574         ], [
3575                 # Yes, we have it...
3576                 AC_MSG_RESULT(yes)
3577                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
3578         ], [
3579                 AC_MSG_RESULT(no)
3580         ])
3582         dnl **********************************
3583         dnl *** Check for getprotobyname ***
3584         dnl **********************************
3585         AC_MSG_CHECKING(for getprotobyname)
3586                 AC_TRY_LINK([
3587                 #include <stdio.h>
3588                 #include <winsock2.h>
3589                 #include <ws2tcpip.h>
3590         ], [
3591                 getprotobyname(NULL);
3592         ], [
3593                 # Yes, we have it...
3594                 AC_MSG_RESULT(yes)
3595                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
3596         ], [
3597                 AC_MSG_RESULT(no)
3598         ])
3600         dnl **********************************
3601         dnl *** Check for getnameinfo ***
3602         dnl **********************************
3603         AC_MSG_CHECKING(for getnameinfo)
3604                 AC_TRY_LINK([
3605                 #include <stdio.h>
3606                 #include <winsock2.h>
3607                 #include <ws2tcpip.h>
3608         ], [
3609                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
3610         ], [
3611                 # Yes, we have it...
3612                 AC_MSG_RESULT(yes)
3613                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
3614         ], [
3615                 AC_MSG_RESULT(no)
3616         ])
3618         dnl **********************************
3619         dnl *** Check for inet_ntop ***
3620         dnl **********************************
3621         AC_MSG_CHECKING(for inet_ntop)
3622                 AC_TRY_LINK([
3623                 #include <stdio.h>
3624                 #include <winsock2.h>
3625                 #include <ws2tcpip.h>
3626         ], [
3627                 inet_ntop (0, NULL, NULL, 0);
3628         ], [
3629                 # Yes, we have it...
3630                 AC_MSG_RESULT(yes)
3631                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
3632         ], [
3633                 AC_MSG_RESULT(no)
3634         ])
3636         dnl **********************************
3637         dnl *** Check for inet_pton ***
3638         dnl **********************************
3639         AC_MSG_CHECKING(for inet_pton)
3640                 AC_TRY_LINK([
3641                 #include <stdio.h>
3642                 #include <winsock2.h>
3643                 #include <ws2tcpip.h>
3644         ], [
3645                 #ifndef inet_pton
3646                 (void) inet_pton;
3647                 #endif
3648                 inet_pton (0, NULL, NULL);
3649         ], [
3650                 # Yes, we have it...
3651                 AC_MSG_RESULT(yes)
3652                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
3653         ], [
3654                 AC_MSG_RESULT(no)
3655         ])
3657         AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
3658         AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
3659         AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
3660         AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
3661         AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
3662         AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
3663         AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
3666 dnl socklen_t check
3667 AC_MSG_CHECKING(for socklen_t)
3668 AC_TRY_COMPILE([
3669 #include <sys/types.h>
3670 #include <sys/socket.h>
3672   socklen_t foo;
3674 ac_cv_c_socklen_t=yes
3675         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
3676         AC_MSG_RESULT(yes)
3678         AC_MSG_RESULT(no)
3681 AC_CHECK_FUNCS(execvp)
3683 dnl ****************************
3684 dnl *** Look for /dev/random ***
3685 dnl ****************************
3687 AC_MSG_CHECKING([if usage of random device is requested])
3688 AC_ARG_ENABLE(dev-random,
3689 [  --disable-dev-random    disable the use of the random device (enabled by default)],
3690 try_dev_random=$enableval, try_dev_random=yes)
3692 AC_MSG_RESULT($try_dev_random)
3694 case "{$build}" in
3696 dnl IBM i does not have /dev/random, use unblocking only
3698     *-*-os400*)
3699     NAME_DEV_RANDOM="/dev/urandom"
3700     ;;
3702 dnl Win32 does not have /dev/random, they have their own method...
3704     *-mingw*|*-*-cygwin*)
3705     ac_cv_have_dev_random=no
3706     ;;
3708 dnl Everywhere else, it's /dev/random
3710     *)
3711     NAME_DEV_RANDOM="/dev/random"
3712     ;;
3713 esac
3715 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
3717 dnl Now check if the device actually exists
3719 if test "x$try_dev_random" = "xyes"; then
3720     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
3721     [if test -r "$NAME_DEV_RANDOM" ; then
3722         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
3723     if test "x$ac_cv_have_dev_random" = "xyes"; then
3724         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
3725     fi
3726 else
3727     AC_MSG_CHECKING(for random device)
3728     ac_cv_have_dev_random=no
3729     AC_MSG_RESULT(has been disabled)
3732 if test "x$host_win32" = "xyes"; then
3733     AC_DEFINE(HAVE_CRYPT_RNG)
3736 if test "x$ac_cv_have_dev_random" = "xno" \
3737     && test "x$host_win32" = "xno"; then
3738     AC_MSG_WARN([[
3740 *** A system-provided entropy source was not found on this system.
3741 *** Because of this, the System.Security.Cryptography random number generator
3742 *** will throw a NotImplemented exception.
3744 *** If you are seeing this message, and you know your system DOES have an
3745 *** entropy collection in place, please report an issue on GitHub and
3746 *** provide information about the system and how to access the random device.
3748 *** Otherwise you can install either egd or prngd and set the environment
3749 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
3750 ***]])
3753 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)
3755 AC_MSG_CHECKING([if big-arrays are to be enabled])
3756 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)
3757 if test "x$enable_big_arrays" = "xyes" ; then
3758     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
3759         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
3760     else
3761         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
3762     fi
3764 AC_MSG_RESULT($enable_big_arrays)
3766 dnl **************
3767 dnl *** DTRACE ***
3768 dnl **************
3770 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
3772 if test "x$enable_dtrace" = "xyes"; then
3773    if test "x$has_dtrace" = "xno"; then
3774           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
3775    fi
3776    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
3777    if test "x$DTRACE" = "xno"; then
3778           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
3779           enable_dtrace=no
3780    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
3781           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
3782           enable_dtrace=no
3783    fi
3786 dtrace_g=no
3787 if test "x$enable_dtrace" = "xyes"; then
3788         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
3789         DTRACEFLAGS=
3790         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3791                 case "$host" in
3792                         powerpc-*-darwin*)
3793                         DTRACEFLAGS="-arch ppc64"
3794                         ;;
3795                         i*86-*-darwin*)
3796                         DTRACEFLAGS="-arch x86_64"
3797                         ;;
3798                         *)
3799                         DTRACEFLAGS=-64
3800                         ;;
3801                 esac
3802         else
3803                 case "$host" in
3804                         powerpc-*-darwin*)
3805                         DTRACEFLAGS="-arch ppc"
3806                         ;;
3807                         i*86-*-darwin*)
3808                         DTRACEFLAGS="-arch i386"
3809                         ;;
3810                         *)
3811                         DTRACEFLAGS=-32
3812                         ;;
3813                 esac
3814         fi
3815         AC_SUBST(DTRACEFLAGS)
3816         case "$host" in
3817                 *-*-solaris*)
3818                 dtrace_g=yes
3819                 ;;
3820         esac
3821         AC_CHECK_HEADERS([sys/sdt.h])
3823 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
3824 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
3826 dnl **************************
3827 dnl *** AOT cross offsets  ***
3828 dnl **************************
3830 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
3831     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
3833 dnl **************
3834 dnl ***  LLVM  ***
3835 dnl **************
3837 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
3838 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
3839 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)
3840 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
3841 AC_ARG_ENABLE(llvm-asserts,[  --enable-llvm-asserts Enable llvm asserts (option to LLVM in CMake)], enable_llvm_asserts=$enableval, enable_llvm_asserts=no)
3843 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
3845 if test "x$enable_llvm" = "xdefault"; then
3846    enable_llvm=$enable_llvm_default
3849 enable_llvm_msvc_only="no"
3850 if test "x$enable_llvm" = "xyes"; then
3851         if test "x$host_win32" = "xyes"; then
3852                 if test "x$cross_compiling" = "xno"; then
3853                         case "$target" in
3854                         x86_64*)
3855                                 AC_MSG_WARN("LLVM for host=Windows and target=Windows is only supported on x64 MSVC builds. Disabling LLVM for GCC build.")
3856                                 enable_llvm_msvc_only="yes"
3857                                 ;;
3858                         i686*)
3859                                 AC_MSG_ERROR("LLVM for host=Windows and target=Windows is only supported for x64 builds.")
3860                                 ;;
3861                         esac
3862                 fi
3863                 if test "x$enable_loadedllvm" = "xyes"; then
3864                         AC_MSG_WARN("Loadable LLVM currently not supported on Windows. Disabling feature.")
3865                         enable_loadedllvm=no
3866                 fi
3867         fi
3870 internal_llvm="no"
3871 if test "x$enable_llvm" = "xyes"; then
3872         if test "x$with_llvm" != "x"; then
3873                 EXTERNAL_LLVM_CONFIG=$with_llvm/bin/llvm-config
3874                 if test x$host_win32 = xyes; then
3875                         EXTERNAL_LLVM_CONFIG=$EXTERNAL_LLVM_CONFIG.exe
3876                 fi
3877                 if test ! -x $EXTERNAL_LLVM_CONFIG; then
3878                         AC_MSG_ERROR([LLVM executable $EXTERNAL_LLVM_CONFIG not found.])
3879                 fi
3880         else
3881                 if test x$host_win32 = xyes; then
3882                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config.exe, no)
3883                 else
3884                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config, no)
3885                 fi
3886                 if test "x$EXTERNAL_LLVM_CONFIG" = "xno"; then
3887                         internal_llvm=yes
3888                 fi
3889         fi
3891         LLVM_CODEGEN_LIBS="x86codegen"
3892         case "$target" in
3893         arm*)
3894                 LLVM_CODEGEN_LIBS="armcodegen"
3895                 ;;
3896         aarch64*)
3897                 LLVM_CODEGEN_LIBS="aarch64codegen"
3898                 ;;
3899         powerpc*)
3900                 LLVM_CODEGEN_LIBS="powerpccodegen"
3901                 ;;
3902         esac
3903         if test "x$host" != "x$target"; then
3904                 # No need for jit libs
3905                 LLVM_CODEGEN_LIBS=
3906         fi
3908         AC_SUBST(LLVM_CODEGEN_LIBS)
3909         AC_SUBST(EXTERNAL_LLVM_CONFIG)
3911         if test "x$host_win32" = "xyes" && test "x$cross_compiling" = "xno" &&  test "x$internal_llvm" = "xno"; then
3912                 EXTERNAL_LLVM_CONFIG_WIN32=$(cygpath -m $EXTERNAL_LLVM_CONFIG)
3913                 AC_SUBST(EXTERNAL_LLVM_CONFIG_WIN32)
3914         fi
3915         if test "x$enable_llvm_msvc_only" != "xyes"; then
3916                 AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
3917         else
3918                 AC_DEFINE(ENABLE_LLVM_MSVC_ONLY, 1, [Enable the LLVM back end])
3919         fi
3920 fi # ENABLE_LLVM
3922 # AC_DEFINE necessary for correct restore behavior on Linux
3923 AM_CONDITIONAL(INTERNAL_LLVM, [test "x$internal_llvm" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
3924 if test "x$internal_llvm" != "xno"; then
3925         if test "x$enable_llvm_msvc_only" != "xyes"; then
3926                 AC_DEFINE(INTERNAL_LLVM, 1, [LLVM used is being build during mono build])
3927         else
3928                 AC_DEFINE(INTERNAL_LLVM_MSVC_ONLY, 1, [LLVM used is being build during mono build])
3929         fi
3932 AM_CONDITIONAL(INTERNAL_LLVM_ASSERTS, [test "x$enable_llvm_asserts" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
3933 if test "x$enable_llvm_asserts" != "xno"; then
3934         if test "x$enable_llvm_msvc_only" != "xyes"; then
3935                 AC_DEFINE(INTERNAL_LLVM_ASSERTS, 1, [Build LLVM with assertions])
3936         else
3937                 AC_DEFINE(INTERNAL_LLVM_ASSERTS_MSVC_ONLY, 1, [Build LLVM with assertions])
3938         fi
3941 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes && test x$enable_llvm_msvc_only != xyes])
3943 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes && test x$enable_llvm_msvc_only != xyes])
3944 if test "x$enable_loadedllvm" = "xyes"; then
3945         if test "x$enable_llvm_msvc_only" != "xyes"; then
3946                 AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
3947         fi
3950 if test "x$enable_llvm" = "xyes"; then
3951         enable_llvm_runtime=yes
3954 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes && test x$enable_llvm_msvc_only != xyes])
3955 if test "x$enable_llvm_runtime" = "xyes"; then
3956         if test "x$enable_llvm_msvc_only" != "xyes"; then
3957                 AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
3958         else
3959                 AC_DEFINE(ENABLE_LLVM_RUNTIME_MSVC_ONLY, 1, [Runtime support code for llvm enabled])
3960         fi
3963 TARGET="unknown"
3964 ACCESS_UNALIGNED="yes"
3966 LIBC="libc.so.6"
3967 INTL="libc.so.6"
3968 SQLITE="libsqlite.so.0"
3969 SQLITE3="libsqlite3.so.0"
3970 X11="libX11.so"
3971 GDKX11="libgdk-x11-2.0.so.0"
3972 GTKX11="libgtk-x11-2.0.so.0"
3973 XINERAMA="libXinerama.so.1"
3975 sizeof_register="SIZEOF_VOID_P"
3977 jit_wanted=true
3978 boehm_supported=true
3979 BTLS_SUPPORTED=no
3980 BTLS_PLATFORM=
3982 case "$host" in
3983         wasm32*)
3984                 TARGET=WASM
3985                 arch_target=wasm
3986                 BTLS_SUPPORTED=no
3987                 ACCESS_UNALIGNED="no"
3988                 with_tls=pthread
3989                 target_wasm=yes
3990                 ;;
3991         mips*)
3992                 TARGET=MIPS;
3993                 arch_target=mips;
3994                 with_tls=pthread;
3995                 ACCESS_UNALIGNED="no"
3997                 AC_MSG_CHECKING(for mips n32)
3998                 AC_TRY_COMPILE([],[
3999                 #if _MIPS_SIM != _ABIN32
4000                 #error Not mips n32
4001                 #endif
4002                 ],[
4003                 AC_MSG_RESULT(yes)
4004                 sizeof_register=8
4005                 ],[
4006                 AC_MSG_RESULT(no)
4007                 ])
4008                 ;;
4009         i*86-*-*)
4010                 TARGET=X86;
4011                 arch_target=x86;
4012                 case $host_os in
4013                   solaris*)
4014                         LIBC="libc.so"
4015                         INTL="libintl.so"
4016                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
4017                                 TARGET=AMD64
4018                                 arch_target=amd64
4019                         fi
4021                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
4022                         # int astruct __attribute__ ((visibility ("hidden")));
4023                         # void foo ()
4024                         # {
4025                         #       void *p = &astruct;
4026                         # }
4027                         # gcc -fPIC --shared -o libfoo.so foo.c
4028                         # yields:
4029                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
4030                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
4031                         have_visibility_hidden=no
4032                         ;;
4033                   mingw*|cygwin*)
4034                         have_visibility_hidden=no
4035                         BTLS_SUPPORTED=no
4036                         BTLS_PLATFORM=i386
4037                         ;;
4038                   haiku*)
4039                         LIBC=libroot.so
4040                         ;;
4041                   linux*)
4042                         AOT_SUPPORTED="yes"
4043                         BTLS_SUPPORTED=yes
4044                         BTLS_PLATFORM=i386
4045                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4046                         ;;
4047                   darwin*)
4048                         AOT_SUPPORTED="yes"
4049                         BTLS_SUPPORTED=yes
4050                         BTLS_PLATFORM=i386
4051                         ;;
4052                   openbsd*|freebsd*|kfreebsd-gnu*)
4053                         AOT_SUPPORTED="yes"
4054                         BTLS_SUPPORTED=yes
4055                         BTLS_PLATFORM=i386
4056                         ;;
4057                 esac
4058                 ;;
4059         x86_64-*-* | amd64-*-*)
4060                 TARGET=AMD64;
4061                 arch_target=amd64;
4062                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
4063                         AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4064                         sizeof_register=8
4065                 fi
4066                 case $host_os in
4067                   linux*)
4068                         AOT_SUPPORTED="yes"
4069                         BTLS_SUPPORTED=yes
4070                         BTLS_PLATFORM=x86_64
4071                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4072                         ;;
4073                   darwin*)
4074                         AOT_SUPPORTED="yes"
4075                         BTLS_SUPPORTED=yes
4076                         BTLS_PLATFORM=x86_64
4077                         boehm_supported=false
4078                         ;;
4079                   openbsd*|freebsd*|kfreebsd-gnu*)
4080                         AOT_SUPPORTED="yes"
4081                         BTLS_SUPPORTED=yes
4082                         BTLS_PLATFORM=x86_64
4083                         ;;
4084                   mingw*|cygwin*)
4085                         BTLS_SUPPORTED=no
4086                         BTLS_PLATFORM=x86_64
4087                         ;;
4088                 esac
4089                 ;;
4090         sparc*-*-*)
4091                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4092                    TARGET=SPARC64
4093                 else
4094                         TARGET=SPARC
4095                 fi
4096                 arch_target=sparc;
4097                 ACCESS_UNALIGNED="no"
4098                 case $host_os in
4099                   linux*) ;;
4100                   *)
4101                         LIBC="libc.so"
4102                         INTL="libintl.so"
4103                 esac
4104                 if test x"$GCC" = xyes; then
4105                         # We don't support v8 cpus
4106                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
4107                 fi
4108                 if test x"$AR" = xfalse; then
4109                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
4110                 fi
4111                 ;;
4112         *-mingw*|*-*-cygwin*)
4113                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
4114                 have_visibility_hidden=no
4115                 INTL="intl"
4116                 ;;
4117         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
4118         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
4119         powerpc-*-freebsd* | powerpc*-*-aix* | powerpc*-*-os400* )
4120                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4121                         TARGET=POWERPC64;
4122                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
4123                         if ! (echo $CC | grep -q -- 'clang'); then
4124                                 CFLAGS="$CFLAGS -mminimal-toc"
4125                         fi
4126                 else
4127                         TARGET=POWERPC;
4128                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
4129                 fi
4130                 arch_target=ppc;
4131                 case $host_os in
4132                   aix*|os400*)
4133                         BTLS_SUPPORTED=yes
4134                         BTLS_PLATFORM=powerpc
4135                         dnl on AIX/PASE, shared libraries can be inside archives
4136                         dnl if they are, we specify them by lib.a(lib.so)
4137                         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX, so
4138                         LIBC="libc.a(shr_64.o)"
4139                         INTL="libintl.a(libintl.so.8)"
4140                         ;;
4141                   linux*)
4142                         BTLS_SUPPORTED=yes
4143                         BTLS_PLATFORM=powerpc
4144                         ;;
4145                 esac
4146                 ;;
4147         armv7k-*-darwin*)
4148                 TARGET=ARM;
4149                 TARGET_SYS=WATCHOS
4150                 arch_target=arm;
4151                 arm_fpu=VFP_HARD
4152                 ACCESS_UNALIGNED="no"
4153                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4154                 ;;
4156         arm*-darwin*)
4157                 TARGET=ARM;
4158                 arch_target=arm;
4159                 ACCESS_UNALIGNED="no"
4160                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4161                 ;;
4162         arm*-linux*)
4163                 TARGET=ARM;
4164                 arch_target=arm;
4165                 ACCESS_UNALIGNED="no"
4166                 AOT_SUPPORTED="yes"
4167                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4168                 BTLS_SUPPORTED=yes
4169                 BTLS_PLATFORM=arm
4170                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4171                 case "$target" in
4172                 arm*-linux*-gnueabi)
4173                         BTLS_PLATFORM=armsoft
4174                         ;;
4175                 esac
4176                 ;;
4177         arm*-netbsd*-eabi*)
4178                 TARGET=ARM;
4179                 arch_target=arm;
4180                 ACCESS_UNALIGNED="no"
4181                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4182                 ;;
4183         aarch64-*darwin*ilp32)
4184                 TARGET=ARM64;
4185                 arch_target=arm64
4186                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4187                 sizeof_register=8
4188                 # assuming no other target other than watchOS is using aarch64*darwin triple
4189                 TARGET_SYS=WATCHOS
4190                 ;;
4191         aarch64-*)
4192                 # https://lkml.org/lkml/2012/7/15/133
4193                 TARGET=ARM64
4194                 arch_target=arm64
4195                 boehm_supported=false
4196                 AOT_SUPPORTED="yes"
4197                 BTLS_SUPPORTED=yes
4198                 BTLS_PLATFORM=aarch64
4199                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4200                 ;;
4201         s390x-*-linux*)
4202                 TARGET=S390X;
4203                 arch_target=s390x;
4204                 ACCESS_UNALIGNED="yes"
4205                 BTLS_SUPPORTED=yes
4206                 BTLS_PLATFORM=s390x
4207                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
4208                 ;;
4209         riscv32-*)
4210                 TARGET=RISCV32
4211                 ACCESS_UNALIGNED=no
4212                 AOT_SUPPORTED=no
4213                 BTLS_SUPPORTED=yes
4214                 BTLS_PLATFORM=riscv32
4215                 arch_target=riscv32
4216                 boehm_supported=false
4217                 ;;
4218         riscv64*)
4219                 TARGET=RISCV64
4220                 ACCESS_UNALIGNED=no
4221                 AOT_SUPPORTED=no
4222                 BTLS_SUPPORTED=yes
4223                 BTLS_PLATFORM=riscv64
4224                 arch_target=riscv64
4225                 boehm_supported=false
4226                 ;;
4227 esac
4229 HOST=$TARGET
4231 if test "x$host" != "x$target"; then
4232    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
4233    enable_mcs_build=no
4234    enable_support_build=no
4235    BTLS_SUPPORTED=no
4236    # Can't use tls, since it depends on the runtime detection of tls offsets
4237    # in mono-compiler.h
4238    with_tls=pthread
4239    target_mach=no
4240    case "$target" in
4241    wasm32*)
4242                 TARGET=WASM
4243                 arch_target=wasm
4244                 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
4245                 ;;
4246    arm*-darwin*)
4247                 TARGET=ARM;
4248                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4249                 case "$target" in
4250                 armv7k-*)
4251                         arm_fpu=VFP_HARD
4252                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
4253                         ;;
4254                 esac            
4255                 ;;
4256    powerpc64-ps3-linux-gnu)
4257                 TARGET=POWERPC64
4258                 arch_target=powerpc64
4259                 AC_DEFINE(TARGET_PS3, 1, [...])
4260                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4261                 # uses this define
4262                 AC_DEFINE(__mono_ppc64__, 1, [...])
4263                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4264                 sizeof_register=8
4265                 target_byte_order=G_BIG_ENDIAN
4266                 ;;
4267    powerpc64-xbox360-linux-gnu)
4268                 TARGET=POWERPC64
4269                 arch_target=powerpc64
4270                 AC_DEFINE(TARGET_XBOX360, 1, [...])
4271                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4272                 # uses this define
4273                 sizeof_register=8
4274                 target_byte_order=G_BIG_ENDIAN
4275                 ;;
4276    arm*-linux-*)
4277                 TARGET=ARM;
4278                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4279                 ;;
4280    arm*-netbsd*-eabi*)
4281                 TARGET=ARM;
4282                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4283                 ;;
4284    i686*-linux-*)
4285                 TARGET=X86;
4286                 ;;
4287    i*86-apple-*)
4288                 TARGET=X86;
4289                 ;;
4290    x86_64*-linux-*)
4291                 TARGET=AMD64;
4292                 ;;
4293    x86_64-ps4-freebsd)
4294                 TARGET=AMD64;
4295                 AC_DEFINE(TARGET_PS4, 1, [...])
4296                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
4297                 CPPFLAGS="$CPPFLAGS"
4298                 target_win32=no
4299                 ;;
4300    aarch64*-linux-*)
4301                 TARGET=ARM64;
4302                 ;;
4303         aarch64-*)
4304                 TARGET=ARM64
4305                 ;;
4306         riscv32*)
4307                 TARGET=RISCV32
4308                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4309                 AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4310                 arch_target=riscv32
4311                 target_mach=no
4312                 with_tls=pthread
4313                 ;;
4314         riscv64*)
4315                 TARGET=RISCV64
4316                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4317                 AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4318                 arch_target=riscv64
4319                 target_mach=no
4320                 with_tls=pthread
4321                 ;;
4322         *)
4323                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
4324         esac
4326         case "$target" in
4327         *-darwin*)
4328                 target_mach=yes
4329                 ;;
4330         *-linux-android*)
4331                 AC_DEFINE(TARGET_ANDROID, 1, [...])
4332                 ;;
4333         esac
4336 case "$TARGET" in
4337 WASM)
4338         AC_DEFINE(TARGET_WASM, 1, [...])
4339         arch_target=wasm
4340         ;;
4341 X86)
4342         AC_DEFINE(TARGET_X86, 1, [...])
4343         arch_target=x86
4344         ;;
4345 AMD64)
4346         AC_DEFINE(TARGET_AMD64, 1, [...])
4347         arch_target=amd64
4348         ;;
4349 ARM)
4350         AC_DEFINE(TARGET_ARM, 1, [...])
4351         arch_target=arm
4352         ACCESS_UNALIGNED="no"
4353         ;;
4354 ARM64)
4355         AC_DEFINE(TARGET_ARM64, 1, [...])
4356         arch_target=arm64
4357         ;;
4358 POWERPC)
4359         AC_DEFINE(TARGET_POWERPC, 1, [...])
4360         ;;
4361 POWERPC64)
4362         AC_DEFINE(TARGET_POWERPC, 1, [...])
4363         AC_DEFINE(TARGET_POWERPC64, 1, [...])
4364         ;;
4365 S390X)
4366         AC_DEFINE(TARGET_S390X, 1, [...])
4367         ;;
4368 MIPS)
4369         AC_DEFINE(TARGET_MIPS, 1, [...])
4370         ;;
4371 SPARC)
4372         AC_DEFINE(TARGET_SPARC, 1, [...])
4373         ;;
4374 SPARC64)
4375         AC_DEFINE(TARGET_SPARC64, 1, [...])
4376         ;;
4377 RISCV32)
4378         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4379         AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4380         ;;
4381 RISCV64)
4382         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4383         AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4384         ;;
4385 esac
4387 case "$TARGET" in
4388 *32* | ARM | X86 | POWERPC | MIPS | SPARC | WASM | ARM6432)
4389     target_sizeof_void_p=4
4390     ;;
4391 *64* | S390X)
4392     target_sizeof_void_p=8
4393     ;;
4395     AC_MSG_ERROR([unknown target])
4396     ;;
4397 esac
4399 case "$HOST" in
4400 WASM)
4401         AC_DEFINE(HOST_WASM, 1, [...])
4402         ;;
4403 X86)
4404         AC_DEFINE(HOST_X86, 1, [...])
4405         ;;
4406 AMD64)
4407         AC_DEFINE(HOST_AMD64, 1, [...])
4408         ;;
4409 ARM)
4410         AC_DEFINE(HOST_ARM, 1, [...])
4411         ;;
4412 ARM64)
4413         AC_DEFINE(HOST_ARM64, 1, [...])
4414         ;;
4415 POWERPC)
4416         AC_DEFINE(HOST_POWERPC, 1, [...])
4417         ;;
4418 POWERPC64)
4419         AC_DEFINE(HOST_POWERPC, 1, [...])
4420         AC_DEFINE(HOST_POWERPC64, 1, [...])
4421         ;;
4422 S390X)
4423         AC_DEFINE(HOST_S390X, 1, [...])
4424         ;;
4425 MIPS)
4426         AC_DEFINE(HOST_MIPS, 1, [...])
4427         ;;
4428 SPARC)
4429         AC_DEFINE(HOST_SPARC, 1, [...])
4430         ;;
4431 SPARC64)
4432         AC_DEFINE(HOST_SPARC64, 1, [...])
4433         ;;
4434 RISCV32)
4435         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4436         AC_DEFINE([HOST_RISCV32], [1], [Host is 32-bit RISC-V])
4437         ;;
4438 RISCV64)
4439         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4440         AC_DEFINE([HOST_RISCV64], [1], [Host is 64-bit RISC-V])
4441         ;;
4442 esac
4444 MONO_ARCH_GSHAREDVT_SUPPORTED=0
4445 case "$HOST" in
4446 X86 | AMD64 | ARM | ARM64)
4447         MONO_ARCH_GSHAREDVT_SUPPORTED=1 # keep in sync with mini-{x86,amd64,arm,arm64}.h
4448         ;;
4449 esac
4451 AM_CONDITIONAL(MONO_ARCH_GSHAREDVT_SUPPORTED, test $MONO_ARCH_GSHAREDVT_SUPPORTED = 1)
4452 AM_CONDITIONAL(TARGET_WASM, test $arch_target = wasm)
4454 dnl *************
4455 dnl *** VTUNE ***
4456 dnl *************
4458 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
4459 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
4461 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
4463 if test "x$enable_vtune" = "xyes"; then
4464         if test "x$with_vtune" = "x"; then
4465                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
4466         else
4467                 VTUNE_PATH=$with_vtune
4468         fi
4469         VTUNE_INCLUDE=$VTUNE_PATH/include
4470         case "$TARGET" in
4471         X86)
4472                 VTUNE_LIB=$VTUNE_PATH/lib32
4473                 ;;
4474         AMD64)
4475                 VTUNE_LIB=$VTUNE_PATH/lib64
4476                 ;;
4477         *)
4478                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
4479                 ;;
4480         esac
4481         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
4482                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
4483         fi
4484         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
4485                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
4486         fi
4488         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
4489         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
4491         AC_SUBST(VTUNE_LIBS)
4492         AC_SUBST(VTUNE_CFLAGS)
4494 dnl Use GCC atomic ops if they work on the target.
4495 if test x$GCC = "xyes"; then
4496         case $TARGET in
4497         X86 | AMD64 | ARM | ARM64 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64 | RISCV32 | RISCV64)
4498                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
4499                 ;;
4500         esac
4503 if test "x$target_mach" = "xyes"; then
4505    if test "x$TARGET_SYS" = "xWATCHOS"; then
4506           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
4507           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4508           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4509           BTLS_SUPPORTED=no
4510    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64"; then
4511           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4512           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4513           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4514           BTLS_SUPPORTED=no
4515           target_ios=yes
4516    else
4517        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
4518        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
4519        #error fail this for ios
4520        #endif
4521        ], [
4522                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
4523           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
4524           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
4525           target_osx=yes
4526        ], [
4527           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4528           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4529           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4530           BTLS_SUPPORTED=no
4531                   target_ios=yes
4532        ])
4533         fi
4534    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
4537 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
4539 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
4541 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
4542    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
4543 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
4544    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
4545 else
4546    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
4549 AC_DEFINE_UNQUOTED(TARGET_SIZEOF_VOID_P,${target_sizeof_void_p},[wordsize of target])
4551 if test "x$sizeof_register" = "x4"; then
4552   AC_DEFINE(SIZEOF_REGISTER,4,[size of target machine integer registers])
4553 elif test "x$sizeof_register" = "x8"; then
4554   AC_DEFINE(SIZEOF_REGISTER,8,[size of target machine integer registers])
4555 else
4556   AC_DEFINE_UNQUOTED(SIZEOF_REGISTER,${target_sizeof_void_p},[size of target machine integer registers])
4559 if test "x$have_visibility_hidden" = "xyes"; then
4560    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
4563 if test "x$have_deprecated" = "xyes"; then
4564    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
4567 dnl 
4568 dnl Simple Generational checks (sgen)
4570 SGEN_DEFINES=
4571 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
4572 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
4573 if test x$buildsgen = xyes; then
4574    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
4575    SGEN_DEFINES="-DHAVE_SGEN_GC"
4577         conc_gc_msg=""
4578    if test x$with_sgen_default_concurrent != xno; then
4579        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
4580            conc_gc_msg=" (concurrent by default)"
4581    fi
4583    if test "x$gc_msg" = "x"; then
4584       gc_msg="sgen$conc_gc_msg"
4585    else
4586       gc_msg="sgen$conc_gc_msg and $gc_msg"
4587    fi
4589 AC_SUBST(SGEN_DEFINES)
4590 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
4592 jit_status="Building and using the JIT"
4594 libsuffix=".so"
4596 case "$host" in
4597      *-*-darwin*)
4598         libsuffix=".dylib"
4599         LIBC="libc.dylib"
4600         INTL="libintl.dylib"
4601         SQLITE="libsqlite.0.dylib"
4602         SQLITE3="libsqlite3.0.dylib"
4603         X11="libX11.dylib"
4604         GDKX11="libgdk-x11-2.0.dylib"
4605         GTKX11="libgtk-x11-2.0.dylib"
4606         ;;
4607      *-*-*netbsd*)
4608         LIBC="libc.so"
4609         INTL="libintl.so"
4610         SQLITE="libsqlite.so"
4611         SQLITE3="libsqlite3.so"
4612         ;;
4613      *-*-kfreebsd*-gnu)
4614         LIBC="libc.so.0.1"
4615         INTL="libc.so.0.1"
4616         X11="libX11.so.6"
4617         ;;
4618     *-*-*freebsd*)
4619         LIBC="libc.so.7"
4620         INTL="libintl.so"
4621         SQLITE="libsqlite.so"
4622         SQLITE3="libsqlite3.so"
4623         ;;
4624     *-*-*openbsd*)
4625         LIBC="libc.so"
4626         INTL="libintl.so"
4627         SQLITE="libsqlite.so"
4628         SQLITE3="libsqlite3.so"
4629         ;;
4630     *-*-*linux*)
4631         AC_PATH_X
4632         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
4633         AC_MSG_CHECKING(for the soname of libX11.so)
4634         for i in $x_libraries $dlsearch_path; do
4635                 for r in 4 5 6; do
4636                         if test -f $i/libX11.so.$r; then
4637                                 X11=libX11.so.$r
4638                                 AC_MSG_RESULT($X11)
4639                         fi
4640                 done
4641         done
4642         
4643         if test "x$X11" = "xlibX11.so"; then
4644                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
4645                 X11=libX11.so.6
4646         fi
4647         ;;
4648 esac
4650 AC_SUBST(libsuffix)
4652 ######################################
4653 # EGLIB CHECKS
4654 ######################################
4656 GNUC_PRETTY=
4657 GNUC_UNUSED=
4658 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
4659 if test x$GCC = xyes; then
4660    GNUC_UNUSED='__attribute__((__unused__))'
4661    GNUC_NORETURN='__attribute__((__noreturn__))'
4662    case $host_cpu in
4663      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
4664    esac
4666 AC_SUBST(GNUC_PRETTY)
4667 AC_SUBST(GNUC_UNUSED)
4668 AC_SUBST(GNUC_NORETURN)
4669 AC_SUBST(BREAKPOINT)
4671 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
4673 case $host in
4674 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
4675     PATHSEP='\\'
4676     SEARCHSEP=';'
4677     OS="WIN32"
4678     PIDTYPE='void *'
4679     ;;
4681     PATHSEP='/'
4682     SEARCHSEP=':'
4683     OS="UNIX"
4684     PIDTYPE='int'
4685     ;;
4686 esac
4688 case $host in
4689         *-*-solaris*)
4690         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
4691         ;;
4692 esac
4694 case $target in
4695 arm*-darwin*|aarch64*-*|riscv*)
4696     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
4697     ;;
4698 i*86-*-darwin*)
4699     ORDER=G_LITTLE_ENDIAN
4700     ;;
4701 *-*-haiku*)
4702     LDFLAGS="$LDFLAGS -ltextencoding"
4703     ;;
4704 *-*-openbsd*)
4705     CFLAGS="$CFLAGS -pthread"
4706     LDFLAGS="$LDFLAGS -pthread"
4707     ;;
4708 esac
4710 AC_SUBST(ORDER)
4711 AC_SUBST(CFLAGS)
4712 AC_SUBST(PATHSEP)
4713 AC_SUBST(SEARCHSEP)
4714 AC_SUBST(OS)
4715 AC_SUBST(PIDTYPE)
4717 # Defined for all targets/platforms using classic Windows API support.
4718 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
4719 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
4721 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf)
4722 AC_CHECK_FUNCS(getrlimit)
4723 AC_CHECK_FUNCS(fork execv execve)
4724 AC_CHECK_FUNCS(waitpid)
4726 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
4728 if test x$with_overridable_allocators = xyes; then
4729         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
4730   AC_MSG_NOTICE([Overridable allocator support enabled])
4731 else
4732   AC_MSG_NOTICE([Overridable allocator support disabled])
4736 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
4737 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
4738 # removed once support for 10.6 is dropped.
4740 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
4742 if test x$target_osx = xyes; then
4743 AC_CHECK_FUNCS(getpwuid_r)
4744 elif test x$target_ios = xno; then
4745 AC_CHECK_FUNCS(strndup getpwuid_r)
4748 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
4750 AC_SEARCH_LIBS(sqrtf, m)
4752 # nanosleep may not be part of libc, also search it in other libraries
4753 AC_SEARCH_LIBS(nanosleep, rt)
4755 AC_SEARCH_LIBS(dlopen, dl)
4756 old_ldflags="${LDFLAGS}"
4757 # GNU specific option, this confuses IBM ld, but do offer alternatives when possible
4758 if test $lt_cv_prog_gnu_ld = yes; then
4759         LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4760 else
4761         case $host in
4762         *-*-aix*|*-*-os400*)
4763                 ;;
4764         *)
4765                 dnl Try to use export-dynamic anyways
4766                 LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4767                 ;;
4768         esac
4770 AC_TRY_LINK(, [int i;], found_export_dynamic=yes, found_export_dynamic=no)
4771 if test $found_export_dynamic = no; then
4772         LDFLAGS="${old_ldflags}"
4775 AC_CHECK_HEADERS(getopt.h sys/select.h sys/time.h sys/wait.h pwd.h iconv.h sys/types.h sys/resource.h)
4776 dnl giconv.c will check on HAVE_ICONV_H but we need this for link time
4777 AC_CHECK_LIB(iconv, iconv_open)
4778 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
4779 AC_SUBST(HAVE_ALLOCA_H)
4781 # Get the exact type of size_t, not just its size.
4782 # This is so we can find an exact printf format among u, lu, llu, I64u.
4783 # To avoid warnings about slight mismatches.
4784 # C99 runtime "zu" dependency is being avoided here.
4786 # We have to compile as C++ because C is too lenient
4787 # and lets the wrong thing compile, with warnings.
4789 # Note: "zu" or ifdef <something> have the advantage
4790 # of producing installable "biarch" headers. i.e. one Mac header
4791 # for Mac/x86 and Mac/amd64.
4793 AC_LANG_PUSH(C++)
4795 # Check long before int because it is the overwhelming Unix answer,
4796 # across 32bit and 64bit systems -- fewer compiler invocations in autoconf.
4798 # long ahead of int also tends to produce biarch-compatible headers except Windows.
4800 AC_MSG_CHECKING(if size_t is unsigned long)
4801 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4802         #include <stddef.h>
4803         unsigned long *a = (size_t*)0;
4804 ])], [
4805         AC_MSG_RESULT(yes)
4806         AC_SUBST(GSIZE_FORMAT, '"lu"')
4807 ], [
4808         AC_MSG_RESULT(no)
4809         AC_MSG_CHECKING(if size_t is unsigned int)
4810         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4811                 #include <stddef.h>
4812                 unsigned *a = (size_t*)0;
4813         ])], [
4814                 AC_MSG_RESULT(yes)
4815                 AC_SUBST(GSIZE_FORMAT, '"u"')
4816         ], [
4817 # At this point the majority of systems have their answer,
4818 # and we descend into non-standard or new-standard territory.
4820 # Check __int64 first because I64 on some systems predates ll, enabling
4821 # new compiler/old runtime interop, and the types always have the same size.
4822                 AC_MSG_RESULT(no)
4823                 AC_MSG_CHECKING(if size_t is unsigned __int64)
4824                 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4825                         #include <stddef.h>
4826                         unsigned __int64 *a = (size_t*)0;
4827                 ])], [
4828                         AC_MSG_RESULT(yes)
4829                         AC_SUBST(GSIZE_FORMAT, '"I64u"')
4830                 ], [
4831                         AC_MSG_RESULT(no)
4832                         AC_MSG_CHECKING(if size_t is unsigned long long)
4833                         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4834                                 #include <stddef.h>
4835                                 unsigned long long *a = (size_t*)0;
4836                         ])], [
4837                                 AC_MSG_RESULT(yes)
4838                                 AC_SUBST(GSIZE_FORMAT, '"llu"')
4839                         ], [
4840                                 AC_MSG_RESULT(no)
4841                                 AC_MSG_ERROR(Unable to determine size_t among unsigned long, int, __int64, long long)
4842                         ] )
4843                 ] )
4844         ] )
4845 ] )
4847 AC_LANG_POP
4849 # If size_t/ptrdiff_t is correct, use it. Otherwise C99 [u]intptr_t.
4850 # This provides for an exact match with functions that
4851 # take size_t like malloc and pthread_attr_getstacksize, avoiding warnings.
4852 # uintptr_t is not necessarily the same.
4854 # ptrdiff_t is preferred over ssize_t as it is C89 vs. new Posix.
4855 # ssize_t looks nicer but ptrdiff_t is wrapped up as gssize anyway.
4857 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_size_t; then
4858    GSIZE="size_t"
4859    GSSIZE="ptrdiff_t"
4860 else
4861    GSIZE="uintptr_t"
4862    GSSIZE="intptr_t"
4865 AC_SUBST(GSIZE)
4866 AC_SUBST(GSSIZE)
4867 AC_SUBST(GSIZE_FORMAT)
4870 # END OF EGLIB CHECKS
4873 AC_ARG_WITH([libgdiplus],
4874         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
4875         [], [with_libgdiplus=installed])
4877 # default install location
4878 libgdiplus_install_loc=libgdiplus${libsuffix}
4879 case "$host" in
4880     *-*-*linux*)
4881     libgdiplus_install_loc=libgdiplus${libsuffix}.0
4882     ;;
4883 esac
4885 case $with_libgdiplus in
4886     no)
4887     libgdiplus_loc=
4888     ;;
4890     installed)
4891     libgdiplus_loc=
4892     if test x$cross_compiling = xno; then
4893         if test x$host_darwin = xyes; then
4894             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
4895             if test -x $a; then
4896               libgdiplus_install_loc=$a
4897               libgdiplus_loc=$a
4898             fi
4899         fi
4900     fi
4901     ;;
4903     yes|sibling)
4904     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
4905     ;;
4907     /*) # absolute path, assume it is an install location
4908     libgdiplus_loc=$with_libgdiplus
4909     libgdiplus_install_loc=$with_libgdiplus
4910     ;;
4912     *)
4913     libgdiplus_loc=`pwd`/$with_libgdiplus
4914     ;;
4915 esac
4916 AC_SUBST(libgdiplus_loc)
4917 AC_SUBST(libgdiplus_install_loc)
4919 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)
4920 if test "x$icall_symbol_map" = "xyes"; then
4921    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
4924 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
4925 if test "x$icall_export" = "xyes"; then
4926    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
4929 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
4930 if test "x$icall_tables" = "xno"; then
4931    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
4934 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
4936 if test "x$with_tls" = "x__thread"; then
4937         AC_DEFINE(MONO_KEYWORD_THREAD, __thread, [Have __thread keyword])
4938         # Pass the information to libgc
4939         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
4940         AC_MSG_CHECKING(if the tls_model attribute is supported)
4941         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
4942                 ], [
4943                         AC_MSG_RESULT(yes)
4944                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
4945                 ], [
4946                         AC_MSG_RESULT(no)
4947         ])
4950 if test ${TARGET} = ARM; then
4951         dnl ******************************************
4952         dnl *** Check to see what FPU is available ***
4953         dnl ******************************************
4954         AC_MSG_CHECKING(which FPU to use)
4956         #
4957         # This is a bit tricky:
4958         #
4959         # if (__ARM_PCS_VFP) {
4960         #       /* mfloat-abi=hard == VFP with hard ABI */
4961         # } elif (!__SOFTFP__) {
4962         #       /* mfloat-abi=softfp == VFP with soft ABI */
4963         # } else {
4964         #       /* mfloat-abi=soft == no VFP */
4965         # }
4966         #
4967         # The exception is iOS (w/ GCC) where none of the above
4968         # are defined (but iOS always uses the 'softfp' ABI).
4969         #
4970         # No support for FPA.
4971         #
4973         fpu=NONE
4975         # iOS GCC always uses the 'softfp' ABI.
4976         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
4977                 fpu=VFP
4978         fi
4980         # Are we using the 'hard' ABI?
4981         if test x$fpu = xNONE; then
4982                 AC_TRY_COMPILE([], [
4983                         #ifndef __ARM_PCS_VFP
4984                         #error "Float ABI is not 'hard'"
4985                         #endif
4986                 ], [
4987                         fpu=VFP_HARD
4988                 ], [
4989                         fpu=NONE
4990                 ])
4991         fi
4993         # No 'hard' ABI. 'soft' or 'softfp'?
4994         if test x$fpu = xNONE; then
4995                 AC_TRY_COMPILE([], [
4996                         #ifdef __SOFTFP__
4997                         #error "Float ABI is not 'softfp'"
4998                         #endif
4999                 ], [
5000                         fpu=VFP
5001                 ], [
5002                         fpu=NONE
5003                 ])
5004         fi
5006         if test x$arm_fpu != x; then
5007            fpu=$arm_fpu
5008         fi
5010         AC_MSG_RESULT($fpu)
5011         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
5012         unset fpu
5014         dnl *********************************************
5015         dnl *** Check which ARM version(s) we can use ***
5016         dnl *********************************************
5017         AC_MSG_CHECKING(which ARM version to use)
5019         AC_TRY_COMPILE([], [
5020                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
5021                 #error Not on ARM v5.
5022                 #endif
5023         ], [
5024                 arm_v5=yes
5026                 arm_ver=ARMv5
5027         ], [])
5029         AC_TRY_COMPILE([], [
5030                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
5031                 #error Not on ARM v6.
5032                 #endif
5033         ], [
5034                 arm_v5=yes
5035                 arm_v6=yes
5037                 arm_ver=ARMv6
5038         ], [])
5040         AC_TRY_COMPILE([], [
5041                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
5042                 #error Not on ARM v7.
5043                 #endif
5044         ], [
5045                 arm_v5=yes
5046                 arm_v6=yes
5047                 arm_v7=yes
5049                 arm_ver=ARMv7
5050         ], [])
5052         AC_MSG_RESULT($arm_ver)
5054         if test x$arm_v5 = xyes; then
5055                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
5056                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
5057         fi
5059         if test x$arm_v6 = xyes; then
5060                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
5061                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
5062         fi
5064         if test x$arm_v7 = xyes; then
5065                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
5066                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
5067         fi
5070 if test ${TARGET} = RISCV32 -o ${TARGET} = RISCV64; then
5071         AC_ARG_WITH([riscv-fpabi], [  --with-riscv-fpabi=auto,double,soft   Select RISC-V floating point ABI (auto)], [fpabi=$withval], [fpabi=double])
5073         AC_MSG_CHECKING([which RISC-V floating point ABI to use])
5075         if test x$fpabi = xauto; then
5076                 AC_TRY_COMPILE([], [
5077                         #ifdef __riscv_float_abi_double
5078                         #error "double"
5079                         #endif
5080                 ], [
5081                         fpabi=auto
5082                 ], [
5083                         fpabi=double
5084                 ])
5085         fi
5087         if test x$fpabi = xauto; then
5088                 AC_TRY_COMPILE([], [
5089                         #ifdef __riscv_float_abi_single
5090                         #error "single"
5091                         #endif
5092                 ], [
5093                         fpabi=auto
5094                 ], [
5095                         fpabi=single
5096                 ])
5097         fi
5099         if test x$fpabi = xauto; then
5100                 AC_TRY_COMPILE([], [
5101                         #ifdef __riscv_float_abi_soft
5102                         #error "soft"
5103                         #endif
5104                 ], [
5105                         fpabi=auto
5106                 ], [
5107                         fpabi=soft
5108                 ])
5109         fi
5111         case $fpabi in
5112         double)
5113                 AC_DEFINE([RISCV_FPABI_DOUBLE], [1], [RISC-V FPABI is double-precision])
5114                 AC_MSG_RESULT([double-precision])
5115                 ;;
5116         single)
5117                 AC_DEFINE([RISCV_FPABI_SINGLE], [1], [RISC-V FPABI is single-precision])
5118                 AC_MSG_ERROR([single-precision, not supported])
5119                 ;;
5120         soft)
5121                 AC_DEFINE([RISCV_FPABI_SOFT], [1], [RISC-V FPABI is soft float])
5122                 AC_MSG_RESULT([soft float])
5123                 ;;
5124         auto)
5125                 AC_MSG_ERROR([unknown])
5126                 ;;
5127         *)
5128                 AC_MSG_ERROR([invalid option: $fpabi])
5129                 ;;
5130         esac
5133 if test ${TARGET} = unknown; then
5134         CPPFLAGS="$CPPFLAGS -DNO_PORT"
5135         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
5138 if test "x$platform_android" = "xyes"; then
5139         case "x${TARGET}" in
5140         xARM)
5141                 case "x$arm_ver" in
5142                 xARMv5)
5143                         BTLS_SUPPORTED=yes
5144                         BTLS_PLATFORM=android-armv5
5145                         ;;
5146                 xARMv6)
5147                         BTLS_SUPPORTED=yes
5148                         BTLS_PLATFORM=android-armv6
5149                         ;;
5150                 xARMv7)
5151                         BTLS_SUPPORTED=yes
5152                         BTLS_PLATFORM=android-armv7
5153                         ;;
5154                 *)
5155                         BTLS_SUPPORTED=no
5156                         ;;
5157                 esac
5158                 ;;
5159         xARM64)
5160                 BTLS_SUPPORTED=yes
5161                 BTLS_PLATFORM=android-v8a
5162                 ;;
5163         xX86)
5164                 BTLS_SUPPORTED=yes
5165                 BTLS_PLATFORM=android-x86
5166                 ;;
5167         xAMD64)
5168                 BTLS_SUPPORTED=yes
5169                 BTLS_PLATFORM=android-x64
5170                 ;;
5171         *)
5172                 BTLS_SUPPORTED=no
5173                 ;;
5174         esac
5177 if test ${ACCESS_UNALIGNED} = no; then
5178         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
5181 if test x$host_darwin = xyes; then
5182         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
5183         AS_IF(
5184                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
5185                 [AC_MSG_RESULT([no])],
5186                 [
5187                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
5188                         AR_FLAGS="Scru"
5189                         RANLIB="$RANLIB -no_warning_for_no_symbols"
5190                         AC_MSG_RESULT([yes])
5191                 ]
5192         )
5195 case "x$libgc" in
5196         xincluded)
5197                 # Pass CPPFLAGS to libgc configure
5198                 # We should use a separate variable for this to avoid passing useless and
5199                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
5200                 # This should be executed late so we pick up the final version of CPPFLAGS
5201                 # The problem with this approach, is that during a reconfigure, the main
5202                 # configure scripts gets invoked with these arguments, so we use separate
5203                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
5204                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
5205                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
5206                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
5207                 fi
5208                 # Don't pass -finstrument-for-thread-suspension in, 
5209                 # if these are instrumented it will be very bad news 
5210                 # (infinite recursion, undefined parking behavior, etc)
5211                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
5212                 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\""
5213                 if test "x$support_boehm" = "xyes"; then
5214                         AC_CONFIG_SUBDIRS(libgc)
5215                 fi
5216                 ;;
5217 esac
5219 MALLOC_MEMPOOLS=no
5220 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
5221         if test x$with_malloc_mempools = xyes; then
5222                 MALLOC_MEMPOOLS=yes
5223                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
5224         fi
5228 DISABLE_MCS_DOCS=default
5229 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
5230         if test x$with_mcs_docs != xyes; then
5231                 DISABLE_MCS_DOCS=yes
5232         fi
5234 if test -n "$INSTALL_4_x_TRUE"; then :
5235         DISABLE_MCS_DOCS=yes
5237 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
5238    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
5241 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)],[
5242         if test x$with_lazy_gc_thread_creation != xno ; then
5243                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
5244         fi
5245 ], [with_lazy_gc_thread_creation=no])
5247 dnl *****************************
5248 dnl *** Thread suspend policy ***
5249 dnl *****************************
5251 dnl Set a default hybrid or cooperative suspend on some platforms
5253 dnl Coop default is set by the bitcode preset.
5255 dnl If coop isn't on by default, maybe hybrid should be?
5256 if test x$enable_cooperative_suspend_default != xyes; then
5257         case $HOST in
5258         X86 | AMD64)
5259                 dnl Some host/target confusion, there's no host_osx (and
5260                 dnl host_darwin would be true on iOS not just macOS).
5261                 if test x$target_osx = xyes; then
5262                         enable_hybrid_suspend_default=yes
5263                 elif test x$host_linux = xyes -o x$host_win32 = xyes; then
5264                         enable_hybrid_suspend_default=yes
5265                 fi
5266                 ;;
5267         esac
5270 dnl Now check if there were flags overriding the defaults
5272 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])
5273 AC_ARG_ENABLE(cooperative_suspend, [  --enable-cooperative-suspend      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [], [enable_cooperative_suspend=default])
5275 if test x$enable_cooperative_suspend = xdefault -a x$with_cooperative_gc != xdefault; then
5276         enable_cooperative_suspend=$with_cooperative_gc
5279 if test x$enable_cooperative_suspend = xdefault; then
5280         enable_cooperative_suspend=$enable_cooperative_suspend_default
5283 if test x$enable_cooperative_suspend != xno; then
5284         AC_DEFINE(ENABLE_COOP_SUSPEND,1,[Enable cooperative stop-the-world garbage collection.])
5287 AM_CONDITIONAL([ENABLE_COOP_SUSPEND], [test x$enable_cooperative_suspend != xno])
5289 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])
5291 if test x$enable_hybrid_suspend = xdefault; then
5292    enable_hybrid_suspend=$enable_hybrid_suspend_default
5295 if test x$enable_hybrid_suspend != xno -a x$enable_cooperative_suspend != xno ; then
5296         AC_MSG_ERROR([Hybrid suspend and Cooperative suspend cannot be both enabled.])
5299 if test x$enable_hybrid_suspend != xno ; then
5300         AC_DEFINE(ENABLE_HYBRID_SUSPEND,1,[Enable hybrid suspend for GC stop-the-world])
5303 AM_CONDITIONAL([ENABLE_HYBRID_SUSPEND], [test x$enable_hybrid_suspend != xno])
5305 dnl End of thread suspend policy
5307 dnl ***************************
5308 dnl *** feature experiments ***
5309 dnl ***************************
5311 dnl When adding experiments, also add to mono/utils/mono-experiments.def
5312 AC_ARG_ENABLE(experiment, [ --enable-experiment=LIST       Enable experimental fatures from the comma-separate LIST.  Available experiments: null],[
5314         if test x$enable_experiment != x ; then
5315                 AC_DEFINE(ENABLE_EXPERIMENTS,1,[Enable feature experiments])
5316         fi
5317         for feature in `echo "$enable_experiment" | sed -e "s/,/ /g"`; do
5318                 eval "mono_experiment_test_enable_$feature='yes'"
5319         done
5321         if test "x$mono_experiment_test_enable_all" = "xyes"; then
5322                 eval "mono_experiment_test_enable_null='yes'"
5323                 true
5324         fi
5326         if test "x$mono_experiment_test_enable_null" = "xyes"; then
5327                 AC_DEFINE(ENABLE_EXPERIMENT_null, 1, [Enable experiment 'null'])
5328         fi
5329 ],[])
5331 dnl **********************
5332 dnl *** checked builds ***
5333 dnl **********************
5335 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],[
5337         if test x$enable_checked_build != x ; then
5338                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
5339         fi
5340         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
5341                 eval "mono_checked_build_test_enable_$feature='yes'"
5342         done
5344         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
5345                 eval "mono_checked_build_test_enable_gc='yes'"
5346                 eval "mono_checked_build_test_enable_metadata='yes'"
5347                 eval "mono_checked_build_test_enable_thread='yes'"
5348                 eval "mono_checked_build_test_enable_private_types='yes'"
5349         fi
5351         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
5352                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
5353         fi
5355         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
5356                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
5357         fi
5359         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
5360                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
5361         fi
5363         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
5364                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
5365         fi
5366 ], [])
5368 dnl End of checked builds
5370 AC_CHECK_HEADER([malloc.h], 
5371                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
5372                         [Define to 1 if you have /usr/include/malloc.h.])],,)
5374 if test x"$GCC" = xyes; then
5375         # Implicit function declarations are not 64 bit safe
5376         # Do this late, since this causes lots of configure tests to fail
5377         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
5378         # jay has a lot of implicit declarations
5379         JAY_CFLAGS="-Wno-implicit-function-declaration"
5382 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
5383 # instead of libmono-static.a
5384 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
5385    LIBMONO_LA=libmini-static.la
5386 else
5387    if test x$buildsgen = xyes; then
5388       LIBMONO_LA=libmonosgen-$API_VER.la
5389    else
5390       LIBMONO_LA=libmonoboehm-$API_VER.la
5391    fi
5393 AC_SUBST(LIBMONO_LA)
5395 dnl **************
5396 dnl ***  Btls  ***
5397 dnl **************
5399 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
5400 AC_ARG_ENABLE(btls-lib, [  --disable-btls-lib             Disable building the BTLS native library], enable_btls_lib=$enableval, enable_btls_lib=$BTLS_SUPPORTED)
5401 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
5402 AC_ARG_WITH(btls_android_api, [  --with-btls-android-api        Android NDK API level for BTLS build])
5403 AC_ARG_WITH(btls_android_cmake_toolchain, [  --with-btls-android-cmake-toolchain        Path to the cmake toolchain file for Android])
5404 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])
5406 if test "x$with_btls_android_api" = "x" ; then
5407         case "$BTLS_PLATFORM" in
5408                 android-armv5)
5409                         with_btls_android_api=16" ;;
5410                 android-armv6)
5411                         with_btls_android_api=16" ;;
5412                 android-armv7)
5413                         with_btls_android_api=16 ;;
5414                 android-v8a)
5415                         with_btls_android_api=21 ;;
5416                 android-x86)
5417                         with_btls_android_api=16 ;;
5418                 android-x64)
5419                         with_btls_android_api=21 ;;
5420         esac
5423 if test "x$enable_btls" = "xno"; then
5424    enable_btls_lib=no
5427 AM_CONDITIONAL(BTLS, test x$enable_btls_lib = xyes)
5429 btls_android=no
5430 if test "x$enable_btls" = "xyes"; then
5431         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
5432         if test "x$CMAKE" = "xno"; then
5433                 AC_MSG_ERROR("cmake not found")
5434         fi
5436         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
5437         AC_SUBST(BTLS_ROOT)
5439         btls_arch=
5440         btls_cflags=
5441         BTLS_CMAKE_ARGS=
5443         if test "x$host_win32" = "xyes"; then
5444                 AC_CHECK_PROG(HAVE_YASM, yasm, yes, no)
5445         fi
5447         case "$BTLS_PLATFORM" in
5448         i386)
5449                 btls_arch=i386
5450                 btls_cflags="-m32"
5451                 case $host_os in
5452                         darwin*)
5453                                 btls_cflags="$btls_cflags -arch i386"
5454                                 ;;
5455                         mingw*|cygwin*)
5456                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5457                                 if test "x$HAVE_YASM" != "xyes"; then
5458                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5459                                 fi
5460                                 ;;
5461                 esac
5462                 ;;
5463         x86_64)
5464                 btls_arch=x86_64
5465                 case $host_os in
5466                         mingw*|cygwin*)
5467                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5468                                 if test "x$HAVE_YASM" != "xyes"; then
5469                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5470                                 fi
5471                                 ;;
5472                 esac
5473                 ;;
5474         arm)
5475                 btls_arch=arm
5476                 btls_cflags="-DOPENSSL_NO_ASM=1"
5477                 ;;
5478         armsoft)
5479                 btls_arch=arm
5480                 btls_cflags="-DOPENSSL_NO_ASM=1"
5481                 ;;
5482         aarch64)
5483                 btls_arch=aarch64
5484                 btls_cflags="-march=armv8-a+crypto"
5485                 ;;
5486         s390x)
5487                 btls_arch=s390x
5488                 ;;
5489         powerpc)
5490                 btls_arch=powerpc
5491                 case $host_os in
5492                         aix*|os400*)
5493                                 btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
5494                                 BTLS_CMAKE_ARGS="-DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
5495                 esac
5496                 ;;
5497         android-armv5)
5498                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5499                 ;;
5500         android-armv6)
5501                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5502                 ;;
5503         android-armv7)
5504                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5505                 ;;
5506         android-v8a)
5507                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5508                 ;;
5509         android-x86)
5510                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5511                 ;;
5512         android-x64)
5513                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=$with_btls_android_api"
5514                 ;;
5515         riscv32)
5516                 btls_arch=riscv32
5517                 ;;
5518         riscv64)
5519                 btls_arch=riscv64
5520                 ;;
5521         *)
5522                 AC_MSG_ERROR(Invalid BTLS platform)
5523         esac
5525         if test "x$platform_android" = "xyes"; then
5526                 if test "x$with_btls_android_cmake_toolchain" = "x"; then
5527                    with_btls_android_cmake_toolchain="$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
5528                 fi
5530                 if test "x$with_btls_android_ndk_asm_workaround" != "x"; then
5531                    BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DENABLE_NDK_ARM_WORKAROUND=ON"
5532                 fi
5534                 btls_android=yes
5535                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$with_btls_android_cmake_toolchain"
5536                 if test "x$with_btls_android_ndk" != "x"; then
5537                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
5538                 else
5539                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
5540                 fi
5541         fi
5543         if test "x$btls_arch" != "x"; then
5544                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
5545         fi
5547         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
5548         AC_SUBST(BTLS_ARCH)
5549         AC_SUBST(BTLS_CFLAGS)
5550         AC_SUBST(BTLS_PLATFORM)
5551         AC_SUBST(BTLS_CMAKE_ARGS)
5553         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
5554 else
5555         enable_btls=no
5558 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
5560 if test x$DISABLE_MCS_DOCS = xyes; then
5561    docs_dir=""
5562 else
5563    docs_dir=docs
5565 AC_SUBST(docs_dir)
5567 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
5568 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
5569 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
5571 libmono_ldflags="$libmono_ldflags $LIBS"
5573 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
5574 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
5575 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
5576 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
5577 AM_CONDITIONAL(X86, test x$TARGET = xX86)
5578 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
5579 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
5580 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
5581 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
5582 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
5583 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64)
5584 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
5585 AM_CONDITIONAL([RISCV], [test x$TARGET = xRISCV32 -o x$TARGET = xRISCV64])
5586 AM_CONDITIONAL([RISCV32], [test x$TARGET = xRISCV32])
5587 AM_CONDITIONAL([RISCV64], [test x$TARGET = xRISCV64])
5588 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
5589 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
5590 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
5591 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
5592 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
5593 AM_CONDITIONAL([HOST_RISCV], [test x$HOST = xRISCV32 -o x$HOST = xRISCV64])
5594 AM_CONDITIONAL([HOST_RISCV32], [test x$HOST = xRISCV32])
5595 AM_CONDITIONAL([HOST_RISCV64], [test x$HOST = xRISCV64])
5596 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
5598 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
5600 AC_SUBST(LIBC)
5601 AC_SUBST(INTL)
5602 AC_SUBST(SQLITE)
5603 AC_SUBST(SQLITE3)
5604 AC_SUBST(X11)
5605 AC_SUBST(GDKX11)
5606 AC_SUBST(GTKX11)
5607 AC_SUBST(XINERAMA)
5608 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
5609 AC_SUBST(arch_target)
5610 AC_SUBST(CFLAGS)
5611 AC_SUBST(CPPFLAGS)
5612 AC_SUBST(LDFLAGS)
5614 #This must always be defined when building the runtime
5615 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
5617 mono_build_root=`pwd`
5618 AC_SUBST(mono_build_root)
5620 AC_ARG_ENABLE(msvc,[  --enable-msvc    Build with Visual Studio (msvc) (defaults to no)], enable_msvc=$enableval, enable_msvc=no)
5621 if test x$host_win32 = xno; then
5622         if test x$enable_msvc = xyes; then
5623                 echo "Error, --enable-msvc only supported for Windows builds."
5624                 exit 1
5625         fi
5627 AM_CONDITIONAL(ENABLE_MSVC, test x$enable_msvc = xyes)
5629 if test "x$enable_msvc" = "xyes"; then
5630         if test "x$support_boehm" = "xyes"; then
5631                 echo "Error, Boehm GC is not supported when using --enable-msvc."
5632                 exit 1
5633         fi
5634         mono_msvc_build_dir='$(top_srcdir)'/msvc/build/sgen
5635         if test "x$host_cpu" = "xi686"; then
5636                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/Win32/lib/Release
5637                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/Win32/bin/Release
5638                 mono_runtime=msvc/build/sgen/Win32/bin/Release/mono-sgen.exe
5639         else
5640                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/x64/lib/Release
5641                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/x64/bin/Release
5642                 mono_runtime=msvc/build/sgen/x64/bin/Release/mono-sgen.exe
5643         fi
5644         AC_SUBST(mono_msvc_build_dir)
5645         AC_SUBST(mono_msvc_build_lib_dir)
5646         AC_SUBST(mono_msvc_build_bin_dir)
5647 else
5648         mono_runtime=mono/mini/mono
5651 AC_SUBST(mono_runtime)
5653 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/Microsoft.Net.Compilers.2.8.2/tools/csc.exe
5655 if test $csc_compiler = mcs; then
5656   CSC=$mcs_topdir/class/lib/build/mcs.exe
5657 else
5658   CSC=$CSC_LOCATION
5661 AM_CONDITIONAL([CSC_IS_ROSLYN], [test x$csc_compiler != xmcs])
5663 mono_cfg_root=$mono_build_root/runtime
5664 if test x$host_win32 = xyes; then
5665   if test "x$cross_compiling" = "xno"; then
5666     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
5667     CSC=`cygpath -m -a $CSC`
5668     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
5669   else
5670     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
5671   fi
5672 else
5673   mono_cfg_dir=$mono_cfg_root/etc
5675 AC_SUBST(mono_cfg_dir)
5677 AC_SUBST(CSC)
5679 AC_CONFIG_FILES([po/mcs/Makefile.in])
5681 AC_CONFIG_FILES([acceptance-tests/microbench-perf.sh],[chmod +x acceptance-tests/microbench-perf.sh])
5682 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
5683 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
5685 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
5686 [   depth=../../../..
5687     case $srcdir in
5688     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5689     .) reldir=$depth ;;
5690     *) reldir=$depth/$srcdir ;;
5691     esac
5692     $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
5693     cd runtime/etc/mono/1.0
5694     rm -f machine.config
5695     $LN_S $reldir/data/net_1_1/machine.config machine.config
5696     cd $depth
5697 ],[LN_S='$LN_S'])
5699 AC_CONFIG_COMMANDS([runtime/etc/mono/2.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/2.0
5707     cd runtime/etc/mono/2.0
5708     rm -f machine.config
5709     $LN_S $reldir/data/net_2_0/machine.config machine.config
5710     cd $depth
5711 ],[LN_S='$LN_S'])
5713 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.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 web.config
5723     $LN_S $reldir/data/net_2_0/web.config web.config
5724     cd $depth
5725 ],[LN_S='$LN_S'])
5727 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
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/
5735     cd runtime/etc/mono/
5736     rm -f browscap.ini
5737     $LN_S $reldir/data/browscap.ini browscap.ini
5738     cd $depth
5739 ],[LN_S='$LN_S'])
5741 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
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/2.0/Browsers/
5749     cd runtime/etc/mono/2.0/Browsers
5750     rm -f Compat.browser
5751     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5752     cd $depth
5753 ],[LN_S='$LN_S'])
5755 AC_CONFIG_COMMANDS([runtime/etc/mono/4.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/4.0/Browsers/
5763     cd runtime/etc/mono/4.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.5/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.5/Browsers/
5777     cd runtime/etc/mono/4.5/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.0/machine.config],
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.0
5791     cd runtime/etc/mono/4.0
5792     rm -f machine.config
5793     $LN_S $reldir/data/net_4_0/machine.config machine.config
5794     cd $depth
5795 ],[LN_S='$LN_S'])
5797 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.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 web.config
5807     $LN_S $reldir/data/net_4_0/web.config web.config
5808     cd $depth
5809 ],[LN_S='$LN_S'])
5811 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.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.5
5819     cd runtime/etc/mono/4.5
5820     rm -f machine.config
5821     $LN_S $reldir/data/net_4_5/machine.config machine.config
5822     cd $depth
5823 ],[LN_S='$LN_S'])
5825 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.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 web.config
5835     $LN_S $reldir/data/net_4_5/web.config web.config
5836     cd $depth
5837 ],[LN_S='$LN_S'])
5839 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])
5840 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])
5841 AC_CONFIG_COMMANDS([clean-llvm], [rm -f llvm/llvm_config.mk])
5843 # Anything involving -Werror must be done late because autoconf depends on compiling with warnings to be success.
5844 if test x"$GCC" = xyes && "x$with_jemalloc" != "xyes"; then
5846         # incompatible-pointer-types requires gcc circa 5.x
5848         ORIG_CFLAGS=$CFLAGS
5849         CFLAGS="$CFLAGS -Wincompatible-pointer-types -Werror"
5850         AC_MSG_CHECKING(for -Wincompatible-pointer-types option to gcc)
5851         AC_TRY_COMPILE([],[
5852         ], [
5853                 AC_MSG_RESULT(yes)
5854                 CFLAGS="$ORIG_CFLAGS -Werror=incompatible-pointer-types"
5855         ], [
5856                 AC_MSG_RESULT(no)
5857                 CFLAGS=$ORIG_CFLAGS
5858         ])
5862 # Mono.Native Support
5863 # -------------------
5864 # Mono.Native is the new name for both System.Native and System.Security.Cryptography.Apple.
5865 # It is built as a stand-alone shared library and not bundled with the runtime because we
5866 # may need to build two different versions of it.
5868 # Starting with macOS 10.12+ and iOS 10+, Apple introduced a new Unified API for some of the
5869 # crypto primitives that we're using as part of System.Security.Cryptography.Apple.
5871 # On Desktop, we can check at runtime whether the OS version is recent enough and switch
5872 # implementation accordingly.  We build a single `libmono_native` shared library.
5874 # However, on Mobile we cannot have any undefined symbols as this would break Bitcode.
5876 # During the mobile build, we are called with `CC` containing an explicit minium version flag,
5877 # which is eiter `-mmacosx-version-min=`, `-mios-simulator-version-min=` or `-miphoneos-version-min=`
5878 # depending on platform.
5880 # We build two versions of the shared library:
5881 # - `libmono_native_compat` is built with whichever minimum version is passed to us via `CC`.
5882 # - `libmono_native_unifed` is built with the minimum version set to macOS 10.12+ / iOS 10+.
5884 # For testing purpuses, there is a function called `mono_native_get_platform_type ()`
5885 # (see mono/native/mono-native-platform.c), which returns a `MonoNativePlatformType` enum value.
5886 # There is also `Mono.MonoNativePlatform.GetPlatformType ()` (see mcs/class/System/Mono/MonoNativePlatform.cs).
5888 # This can be called by automated tests both to ensure that the library has been correctly installed and also
5889 # to verify that it's the correct version of it.
5892 sed_version_pattern='[[0-9]]\{1,2\}\(\.[[0-9]]\{1,2\}\)'
5893 if test x$target_osx = xyes; then
5894         sed_remove_mac_version_pattern="s/-mmacosx-version-min=$sed_version_pattern//g"
5895         grep_find_mac_version_pattern="-mmacosx-version-min=$sed_version_pattern"
5896         mono_native_compat_version=`echo $CC | grep -o -e $grep_find_mac_version_pattern`
5897         MONO_NATIVE_CC=`echo $CC | sed -e $sed_remove_mac_version_pattern`
5898         MONO_NATIVE_CXX=`echo $CXX | sed -e $sed_remove_mac_version_pattern`
5899         MONO_NATIVE_CPPFLAGS=`echo $CPPFLAGS | sed -e $sed_remove_mac_version_pattern`
5900         MONO_NATIVE_CFLAGS=`echo $CFLAGS | sed -e $sed_remove_mac_version_pattern`
5901         MONO_NATIVE_CXXFLAGS=`echo $CXXFLAGS | sed -e $sed_remove_mac_version_pattern`
5902         MONO_NATIVE_LDFLAGS=`echo $LDFLAGS | sed -e $sed_remove_mac_version_pattern`
5904         mono_native=yes
5905         MONO_NATIVE_PLATFORM=macos
5906         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_MACOS"
5907         AC_MSG_CHECKING([Mono.Native support])
5908         AC_MSG_RESULT(macos)
5910         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer],
5911                 [!(MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12)])
5913         if test x$mono_native_compat = xyes; then
5914                 mono_native_compat=yes
5915                 mono_native_text="Mac OSX (compat+unified)"
5916                 MONO_NATIVE_COMPAT_CFLAGS="$CFLAGS $mono_native_compat_version"
5917                 MONO_NATIVE_COMPAT_LDFLAGS="$LDFLAGS $mono_native_compat_version"
5918                 MONO_NATIVE_UNIFIED_CFLAGS="$MONO_NATIVE_CFLAGS -mmacosx-version-min=10.12"
5919                 MONO_NATIVE_UNIFIED_LDFLAGS="$MONO_NATIVE_LDFLAGS -mmacosx-version-min=10.12"
5920         else
5921                 mono_native_compat=no
5922                 mono_native_text="Mac OSX"
5923         fi
5924 elif test x$mono_native_platform_ios = xyes; then
5925         AC_MONO_APPLE_TARGET(TARGET_OS_SIMULATOR, [mono_native_ios_sim=yes], [mono_native_ios_sim=no])
5927         AC_MONO_APPLE_TARGET(TARGET_OS_IOS, [
5928                 if test x$mono_native_ios_sim = xyes; then
5929                         mono_native_ios_target=ios-simulator
5930                         mono_native_text="iOS Simulator"
5931                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5932                 else
5933                         mono_native_ios_target=iphoneos
5934                         mono_native_text="iOS Device"
5935                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5936                 fi
5937                 mono_native_unified_version="10.0"
5938                 mono_native_compat_check="__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_10_0"
5939         ], [
5940                 AC_MONO_APPLE_TARGET(TARGET_OS_TV, [
5941                         if test x$mono_native_ios_sim = xyes; then
5942                                 mono_native_ios_target=tvos-simulator
5943                                 mono_native_text="AppleTV Simulator"
5944                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5945                         else
5946                                 mono_native_ios_target=tvos
5947                                 mono_native_text="AppleTV Device"
5948                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5949                         fi
5950                         mono_native_unified_version="10.0"
5951                         mono_native_compat_check="__TV_OS_VERSION_MIN_REQUIRED >= __TVOS_10_0"
5952                 ], [
5953                         AC_MONO_APPLE_TARGET(TARGET_OS_WATCH, [
5954                                 if test x$mono_native_ios_sim = xyes; then
5955                                         mono_native_ios_target=watchos-simulator
5956                                         mono_native_text="Apple Watch Simulator"
5957                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5958                                 else
5959                                         mono_native_ios_target=watchos
5960                                         mono_native_text="Apple Watch Device"
5961                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5962                                 fi
5963                                 mono_native_unified_version="5.0"
5964                                 mono_native_compat_check="__WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_5_0"
5965                         ], [
5966                                 AC_MSG_ERROR([Unknown iOS Target])
5967                         ])
5968                 ])
5969         ])
5971         AC_MSG_CHECKING([Mono.Native support])
5972         AC_MSG_RESULT([$mono_native_ios_target])
5974         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer], [!($mono_native_compat_check)])
5976         sed_remove_ios_version_pattern="s/-m\(.*\)-version-min=$sed_version_pattern//g"
5977         grep_find_ios_version_pattern="-m$mono_native_ios_target-version-min=$sed_version_pattern"
5979         mono_native_compat_version=`echo $CC | grep -o -e $grep_find_ios_version_pattern`
5981         if test x$with_bitcode = xyes; then
5982                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -no-undefined -fatal_warnings"
5983                 MONO_NATIVE_LIBADD="../mini/$LIBMONO_LA"
5984         else
5985                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -fatal_warnings"
5986         fi
5988         if test x$enable_gss = xyes; then
5989                 mono_native_ldflags="$mono_native_ldflags -framework GSS"
5990         fi
5992         MONO_NATIVE_CC=`echo $CC | sed -e $sed_remove_ios_version_pattern`
5993         MONO_NATIVE_CXX=`echo $CXX | sed -e $sed_remove_ios_version_pattern`
5994         MONO_NATIVE_CPPFLAGS=`echo $CPPFLAGS | sed -e $sed_remove_ios_version_pattern`
5995         MONO_NATIVE_CXXFLAGS=`echo $CXXFLAGS | sed -e $sed_remove_ios_version_pattern`
5996         MONO_NATIVE_CFLAGS=`echo $CFLAGS | sed -e $sed_remove_ios_version_pattern`
5997         MONO_NATIVE_LDFLAGS=`echo $LDFLAGS $mono_native_ldflags | sed -e $sed_remove_ios_version_pattern`
5999         if test x$mono_native_compat = xyes; then
6000                 mono_native_text="$mono_native_text (compat+unified)"
6001                 MONO_NATIVE_COMPAT_CFLAGS="$CFLAGS $mono_native_compat_version"
6002                 MONO_NATIVE_COMPAT_LDFLAGS="$LDFLAGS $mono_native_compat_version"
6003                 MONO_NATIVE_UNIFIED_CFLAGS="$MONO_NATIVE_CFLAGS -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6004                 MONO_NATIVE_UNIFIED_LDFLAGS="$MONO_NATIVE_LDFLAGS -m$mono_native_ios_target-version-min=$mono_native_unified_version"
6005         fi
6007         mono_native=yes
6008         MONO_NATIVE_PLATFORM=ios
6009 elif test x$host_linux = xyes; then
6010         mono_native_text="Linux"
6011         MONO_NATIVE_CC=$CC
6012         MONO_NATIVE_CXX=$CXX
6013         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6014         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6015         MONO_NATIVE_CFLAGS=$CFLAGS
6016         MONO_NATIVE_LDFLAGS=$LDFLAGS
6018         mono_native=yes
6019         mono_native_compat=no
6020         MONO_NATIVE_PLATFORM=linux
6021         AC_MSG_CHECKING([Mono.Native support])
6022         AC_MSG_RESULT(linux)
6024         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
6025 elif test x$target_wasm = xyes; then
6026         mono_native_text="wasm"
6027         MONO_NATIVE_CC=$CC
6028         MONO_NATIVE_CXX=$CXX
6029         # The system.native code uses _WASM_ to check for wasm
6030         MONO_NATIVE_CPPFLAGS="$CPPFLAGS -D_WASM_"
6031         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6032         MONO_NATIVE_CFLAGS=$CFLAGS
6033         MONO_NATIVE_LDFLAGS=$LDFLAGS
6035         mono_native=yes
6036         mono_native_compat=no
6037         MONO_NATIVE_PLATFORM=linux
6038         AC_MSG_CHECKING([Mono.Native support])
6039         AC_MSG_RESULT(wasm)
6041         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
6042 elif case $host_os in aix*|os400*) true;; *) false;; esac; then
6043         mono_native_text="AIX"
6044         MONO_NATIVE_CC=$CC
6045         MONO_NATIVE_CXX=$CXX
6046         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6047         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6048         MONO_NATIVE_CFLAGS=$CFLAGS
6049         MONO_NATIVE_LDFLAGS=$LDFLAGS
6051         mono_native=yes
6052         mono_native_compat=no
6053         MONO_NATIVE_PLATFORM=aix
6054         AC_MSG_CHECKING([Mono.Native support])
6055         AC_MSG_RESULT(aix)
6057         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_AIX"
6058 elif test x$platform_android = xyes; then
6059         mono_native_text="Android"
6060         MONO_NATIVE_CC=$CC
6061         MONO_NATIVE_CXX=$CXX
6062         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
6063         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
6064         MONO_NATIVE_CFLAGS=$CFLAGS
6065         MONO_NATIVE_LDFLAGS=$LDFLAGS
6067         mono_native=yes
6068         mono_native_compat=no
6069         MONO_NATIVE_PLATFORM=android
6070         AC_MSG_CHECKING([Mono.Native support])
6071         AC_MSG_RESULT(Android)
6073         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_ANDROID"
6074 else
6075         mono_native=no
6076         mono_native_text="no"
6077         AC_MSG_CHECKING([Mono.Native support])
6078         AC_MSG_RESULT(no)
6081 if test x$mono_native_compat = xyes; then
6082         MONO_NATIVE_LIBRARY_NAME=libmono-native-compat
6083 else
6084         MONO_NATIVE_LIBRARY_NAME=libmono-native
6087 AC_SUBST(MONO_NATIVE_PLATFORM)
6088 AC_SUBST(MONO_NATIVE_CC)
6089 AC_SUBST(MONO_NATIVE_CXX)
6090 AC_SUBST(MONO_NATIVE_CPPFLAGS)
6091 AC_SUBST(MONO_NATIVE_CXXFLAGS)
6092 AC_SUBST(MONO_NATIVE_CFLAGS)
6093 AC_SUBST(MONO_NATIVE_COMPAT_CFLAGS)
6094 AC_SUBST(MONO_NATIVE_UNIFIED_CFLAGS)
6095 AC_SUBST(MONO_NATIVE_LDFLAGS)
6096 AC_SUBST(MONO_NATIVE_COMPAT_LDFLAGS)
6097 AC_SUBST(MONO_NATIVE_UNIFIED_LDFLAGS)
6098 AC_SUBST(MONO_NATIVE_LIBRARY_NAME)
6099 AC_SUBST(MONO_NATIVE_LIBADD)
6101 AM_CONDITIONAL(MONO_NATIVE, test x$mono_native = xyes)
6102 AM_CONDITIONAL(MONO_NATIVE_COMPAT, test x$mono_native_compat = xyes)
6103 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_MACOS, test x$MONO_NATIVE_PLATFORM = xmacos)
6104 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_IOS, test x$MONO_NATIVE_PLATFORM = xios)
6105 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_LINUX, test x$MONO_NATIVE_PLATFORM = xlinux)
6106 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_AIX, test x$MONO_NATIVE_PLATFORM = xaix)
6107 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_ANDROID, test x$MONO_NATIVE_PLATFORM = xandroid)
6109 MONO_NATIVE_PLATFORM_TYPE_COMPAT="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_COMPAT"
6110 MONO_NATIVE_PLATFORM_TYPE_UNIFIED="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_UNIFIED"
6111 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE)
6112 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_COMPAT)
6113 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_UNIFIED)
6115 # Update all submodules recursively to ensure everything is checked out
6116 (cd $srcdir && scripts/update_submodules.sh)
6118 AC_OUTPUT([
6119 Makefile
6120 mono-uninstalled.pc
6121 acceptance-tests/Makefile
6122 llvm/Makefile
6123 scripts/mono-find-provides
6124 scripts/mono-find-requires
6125 mk/Makefile
6126 mono/Makefile
6127 mono/btls/Makefile
6128 mono/native/Makefile
6129 mono/utils/Makefile
6130 mono/utils/jemalloc/Makefile
6131 mono/metadata/Makefile
6132 mono/dis/Makefile
6133 mono/cil/Makefile
6134 mono/arch/Makefile
6135 mono/arch/x86/Makefile
6136 mono/arch/amd64/Makefile
6137 mono/arch/ppc/Makefile
6138 mono/arch/sparc/Makefile
6139 mono/arch/s390x/Makefile
6140 mono/arch/arm/Makefile
6141 mono/arch/arm64/Makefile
6142 mono/arch/mips/Makefile
6143 mono/arch/riscv/Makefile
6144 mono/sgen/Makefile
6145 mono/native/platform-type.c
6146 mono/native/platform-type-compat.c
6147 mono/native/platform-type-unified.c
6148 mono/tests/Makefile
6149 mono/tests/assembly-load-reference/Makefile
6150 mono/tests/tests-config
6151 mono/tests/gc-descriptors/Makefile
6152 mono/tests/testing_gac/Makefile
6153 mono/tests/llvmonly-mixed/Makefile
6154 mono/unit-tests/Makefile
6155 mono/benchmark/Makefile
6156 mono/mini/Makefile
6157 mono/profiler/Makefile
6158 mono/eglib/Makefile
6159 mono/eglib/eglib-config.h
6160 mono/eglib/test/Makefile
6161 m4/Makefile
6162 ikvm-native/Makefile
6163 scripts/Makefile
6164 man/Makefile
6165 docs/Makefile
6166 data/Makefile
6167 data/net_2_0/Makefile
6168 data/net_4_0/Makefile
6169 data/net_4_5/Makefile
6170 data/net_2_0/Browsers/Makefile
6171 data/net_4_0/Browsers/Makefile
6172 data/net_4_5/Browsers/Makefile
6173 data/mint.pc
6174 data/mono-2.pc
6175 data/monosgen-2.pc
6176 data/mono.pc
6177 data/mono-cairo.pc
6178 data/mono-nunit.pc
6179 data/mono-options.pc
6180 data/mono-lineeditor.pc
6181 data/monodoc.pc
6182 data/dotnet.pc
6183 data/dotnet35.pc
6184 data/wcf.pc
6185 data/cecil.pc
6186 data/system.web.extensions_1.0.pc
6187 data/system.web.extensions.design_1.0.pc
6188 data/system.web.mvc.pc
6189 data/system.web.mvc2.pc
6190 data/system.web.mvc3.pc
6191 data/aspnetwebstack.pc
6192 data/reactive.pc
6193 samples/Makefile
6194 support/Makefile
6195 data/config
6196 tools/Makefile
6197 tools/locale-builder/Makefile
6198 tools/sgen/Makefile
6199 tools/monograph/Makefile
6200 tools/pedump/Makefile
6201 runtime/Makefile
6202 msvc/Makefile
6203 po/Makefile
6206 if test x$host_win32 = xyes; then
6207    # Get rid of 'cyg' prefixes in library names
6208    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6209    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
6210    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
6211    # executable doesn't work...
6212    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6215 if test x$host_darwin = xyes; then
6216    # This doesn't seem to be required and it slows down parallel builds
6217    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
6221   case $prefix in
6222   NONE) prefix=$ac_default_prefix ;;
6223   esac
6224   case $exec_prefix in
6225   NONE) exec_prefix='${prefix}' ;;
6226   esac
6228   #
6229   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
6230   # any existing config.make.  This allows people to share the same source tree
6231   # with different build directories, one native and one cross
6232   #
6233   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
6235     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
6237     echo "prefix=$prefix" > $mcs_topdir/build/config.make
6238     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
6239     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
6240     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
6241     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
6242     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
6243     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
6244     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
6245     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
6247     case $INSTALL in
6248     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
6249     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
6250     esac
6252     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
6254     export VERSION
6255     [myver=$($AWK 'BEGIN {
6256       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
6257       if(length(vsplit [1]) > 4) {
6258         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
6259       }
6260       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
6261     }')]
6263     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
6264     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
6266     if test x$host_darwin = xyes; then
6267       echo "BUILD_PLATFORM = macos" >> $mcs_topdir/build/config.make
6268       echo "HOST_PLATFORM ?= macos" >> $mcs_topdir/build/config.make
6269       echo "XTEST_PLATFORM ?= osx" >> $mcs_topdir/build/config.make
6270     elif test x$host_win32 = xyes; then
6271       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
6272       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
6273       echo "XTEST_PLATFORM ?= windows" >> $mcs_topdir/build/config.make
6274     elif test x$host_linux = xyes; then
6275       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
6276       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6277       echo "XTEST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6278     else
6279       echo "BUILD_PLATFORM = unix" >> $mcs_topdir/build/config.make
6280       echo "HOST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6281       echo "XTEST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6282     fi
6284     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
6285       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
6286     fi
6288         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
6289            enable_system_aot=yes
6290         fi
6292     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
6293       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
6294     fi
6296     if test x$DISABLE_MCS_DOCS = xyes; then
6297       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
6298     fi
6300     if test x$has_extension_module != xno; then
6301         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
6302     fi
6303     
6304     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
6305     
6306     if test "x$test_bcl_opt" = "xyes"; then    
6307       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
6308     fi
6310     echo "CSC_LOCATION = $CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
6312     if test $csc_compiler = mcs; then
6313       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
6314     fi
6316     if test "x$AOT_BUILD_FLAGS" != "x" ; then
6317       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
6318       echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
6319       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
6320     fi
6322     if test "x$AOT_MODE" != "x" ; then
6323       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
6324     fi
6326     if test "x$enable_btls" = "xyes"; then
6327       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
6328     fi
6330     if test "x$mono_native" = "xyes"; then
6331       echo "MONO_NATIVE_SUPPORTED=true" >> $srcdir/$mcsdir/build/config.make
6332     else
6333       echo "MONO_NATIVE_SUPPORTED=false" >> $srcdir/$mcsdir/build/config.make
6334     fi
6336     if test x$mono_native_compat = xyes; then
6337       echo "MONO_NATIVE_USING_COMPAT=true" >> $srcdir/$mcsdir/build/config.make
6338     else
6339       echo "MONO_NATIVE_USING_COMPAT=false" >> $srcdir/$mcsdir/build/config.make
6340     fi
6342     echo "MONO_NATIVE_PLATFORM_TYPE=$MONO_NATIVE_PLATFORM_TYPE" >> $srcdir/$mcsdir/build/config.make
6343     echo "MONO_NATIVE_PLATFORM=$MONO_NATIVE_PLATFORM" >> $srcdir/$mcsdir/build/config.make
6345   fi
6349 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
6351 btls_platform_string=
6352 if test x$enable_btls = xyes; then
6353         if test x$btls_android = xyes; then
6354                 btls_platform_string=" (android:$BTLS_PLATFORM)"
6355         else
6356                 btls_platform_string=" ($BTLS_PLATFORM)"
6357         fi
6360 thread_suspend_msg=
6361 if test x$buildsgen = xyes; then
6362         if test x$enable_cooperative_suspend != xno; then
6363                 thread_suspend_msg="Suspend:       Cooperative"
6364         elif test x$enable_hybrid_suspend != xno; then
6365                 thread_suspend_msg="Suspend:       Hybrid"
6366         else
6367                 thread_suspend_msg="Suspend:       Preemptive"
6368         fi
6370         
6371 echo "
6372         mcs source:    $mcsdir
6373         C# Compiler:   $csc_compiler
6375    Engine:
6376         Host:          $host
6377         Target:        $target
6378         GC:            $gc_msg 
6379         $thread_suspend_msg
6380         TLS:           $with_tls
6381         SIGALTSTACK:   $with_sigaltstack
6382         Engine:        $jit_status
6383         BigArrays:     $enable_big_arrays
6384         DTrace:        $enable_dtrace
6385         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm, built in-tree: $internal_llvm, assertions: $enable_llvm_asserts, msvc only: $enable_llvm_msvc_only)
6386         Spectre:       $spectre_mitigation_status
6387         Mono.Native:   $mono_native_text
6389    Libraries:
6390         .NET 4.x:        $with_profile4_x
6391         Xamarin.Android: $with_monodroid
6392         Xamarin.iOS:     $with_monotouch
6393         Xamarin.WatchOS: $with_monotouch_watch
6394         Xamarin.TVOS:    $with_monotouch_tv
6395         Xamarin.Mac:     $with_xammac
6396         Windows AOT:     $with_winaot
6397         Orbis:           $with_orbis
6398         Unreal:          $with_unreal
6399         WebAssembly:     $with_wasm
6400         Test profiles:   AOT Full ($with_testing_aot_full), AOT Hybrid ($with_testing_aot_hybrid)
6401         JNI support:     $jdk_headers_found
6402         libgdiplus:      $libgdiplus_msg
6403         zlib:            $zlib_msg
6404         BTLS:            $enable_btls$btls_platform_string
6405         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
6406         crash reporting: $crash_reporting (private crashes: $with_crash_privacy)
6407         .NET Core:       $with_core
6408         $disabled
6410 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
6411    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)