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