[corlib] Import FileSystemInfo and family from CoreFX (#11342)
[mono-project.git] / configure.ac
blob0a224b2be630b908bf04f8d5ae266ddedc8b92fb
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=0C41185A-B349-47B0-B592-2409FE8B0134
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,fullaotinterp_llvm  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 = xfullaotinterp_llvm; then
1262    with_testing_aot_full_interp_default=yes
1263    TEST_PROFILE=testing_aot_full_interp_llvm
1265    # mscorlib.dll aot compilation crashes
1266    mono_feature_disable_com='yes'
1268    AOT_BUILD_FLAGS="-O=gsharedvt --llvm --aot=full,interp,$INVARIANT_AOT_OPTIONS"
1269    AOT_RUN_FLAGS="--full-aot-interp"
1270 elif test x$with_runtime_preset = xaot; then
1271    with_profile4_x_default=yes
1273    AOT_BUILD_FLAGS="--aot=$INVARIANT_AOT_OPTIONS"
1274    AOT_RUN_FLAGS=""
1276    DISABLE_MCS_DOCS_default=yes
1277 elif test x$with_runtime_preset = xaot_llvm; then
1278    with_profile4_x_default=yes
1280    AOT_BUILD_FLAGS="--llvm --aot=$INVARIANT_AOT_OPTIONS"
1281    AOT_RUN_FLAGS=""
1283    DISABLE_MCS_DOCS_default=yes
1284 elif test x$with_runtime_preset = xwinaot; then
1285    DISABLE_MCS_DOCS_default=yes
1286    with_winaot_default=yes
1287    TEST_PROFILE=winaot
1289    mono_feature_disable_com='yes'
1290    mono_feature_disable_remoting='yes'
1291    mono_feature_disable_reflection_emit_save='yes'
1292    mono_feature_disable_reflection_emit='yes'
1293    mono_feature_disable_appdomains='yes'
1295    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1296    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1297    AOT_MODE="llvmonly"
1298 elif test x$with_runtime_preset = xorbis; then
1299    DISABLE_MCS_DOCS_default=yes
1300    with_orbis_default=yes
1301    TEST_PROFILE=orbis
1303    mono_feature_disable_com='yes'
1304    mono_feature_disable_remoting='yes'
1305    mono_feature_disable_reflection_emit_save='yes'
1306    mono_feature_disable_reflection_emit='yes'
1307    mono_feature_disable_appdomains='yes'
1309    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1310    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1311    AOT_MODE="full"
1312 elif test x$with_runtime_preset = xunreal; then
1313    DISABLE_MCS_DOCS_default=yes
1314    with_unreal_default=yes
1315    TEST_PROFILE=unreal
1317    mono_feature_disable_com='yes'
1318    mono_feature_disable_remoting='yes'
1319    mono_feature_disable_appdomains='no'
1321    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1322    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1323 elif test x$with_runtime_preset = xwasm; then
1324    DISABLE_MCS_DOCS_default=yes
1325    with_wasm_default=yes
1326    TEST_PROFILE=wasm
1328    mono_feature_disable_com='yes'
1329    mono_feature_disable_remoting='yes'
1330    mono_feature_disable_reflection_emit_save='yes'
1331    mono_feature_disable_reflection_emit='yes'
1332    mono_feature_disable_appdomains='yes'
1334    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1335    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1336 else
1337    TEST_PROFILE=net_4_x
1338    with_profile4_x_default=yes
1341 if test "x$AOT_BUILD_FLAGS" != "x"; then :
1342    AC_SUBST(AOT_BUILD_FLAGS)
1343    AC_SUBST(AOT_RUN_FLAGS)
1344    # For llvmonlycheck + fullaotcheck
1345    AC_SUBST(INVARIANT_AOT_OPTIONS)
1348 AC_SUBST(TEST_PROFILE)
1350 if test "x$with_profile4_x" = "xdefault"; then
1351    with_profile4_x=$with_profile4_x_default
1353 if test "x$with_monodroid" = "xdefault"; then
1354    with_monodroid=$with_monodroid_default
1356 if test "x$with_monotouch" = "xdefault"; then
1357    with_monotouch=$with_monotouch_default
1359 if test "x$with_monotouch_watch" = "xdefault"; then
1360    with_monotouch_watch=$with_monotouch_watch_default
1362 if test "x$with_monotouch_tv" = "xdefault"; then
1363    with_monotouch_tv=$with_monotouch_tv_default
1365 if test "x$with_bitcode" = "xdefault"; then
1366    with_bitcode=$with_bitcode_default
1368 if test "x$with_xammac" = "xdefault"; then
1369    with_xammac=$with_xammac_default
1371 if test "x$with_testing_aot_full_interp" = "xdefault"; then
1372    with_testing_aot_full_interp=$with_testing_aot_full_interp_default
1374 if test "x$with_testing_aot_hybrid" = "xdefault"; then
1375    with_testing_aot_hybrid=$with_testing_aot_hybrid_default
1377 if test "x$with_testing_aot_full" = "xdefault"; then
1378    with_testing_aot_full=$with_testing_aot_full_default
1380 if test "x$with_winaot" = "xdefault"; then
1381    with_winaot=$with_winaot_default
1383 if test "x$with_orbis" = "xdefault"; then
1384    with_orbis=$with_orbis_default
1386 if test "x$with_unreal" = "xdefault"; then
1387    with_unreal=$with_unreal_default
1389 if test "x$with_wasm" = "xdefault"; then
1390    with_wasm=$with_wasm_default
1394 AM_CONDITIONAL(INSTALL_4_x, [test "x$with_profile4_x" = "xyes"])
1395 AM_CONDITIONAL(INSTALL_MONODROID, [test "x$with_monodroid" != "xno"])
1396 AM_CONDITIONAL(INSTALL_MONOTOUCH, [test "x$with_monotouch" != "xno"])
1397 AM_CONDITIONAL(INSTALL_MONOTOUCH_WATCH, [test "x$with_monotouch_watch" != "xno"])
1398 AM_CONDITIONAL(INSTALL_MONOTOUCH_TV, [test "x$with_monotouch_tv" != "xno"])
1399 AM_CONDITIONAL(BITCODE, test "x$with_bitcode" = "xyes")
1400 AM_CONDITIONAL(INSTALL_XAMMAC, [test "x$with_xammac" != "xno"])
1401 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL_INTERP, [test "x$with_testing_aot_full_interp" != "xno"])
1402 AM_CONDITIONAL(INSTALL_TESTING_AOT_HYBRID, [test "x$with_testing_aot_hybrid" != "xno"])
1403 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL, [test "x$with_testing_aot_full" != "xno"])
1404 AM_CONDITIONAL(INSTALL_WINAOT, [test "x$with_winaot" != "xno"])
1405 AM_CONDITIONAL(INSTALL_ORBIS, [test "x$with_orbis" != "xno"])
1406 AM_CONDITIONAL(INSTALL_UNREAL, [test "x$with_unreal" != "xno"])
1407 AM_CONDITIONAL(INSTALL_WASM, [test "x$with_wasm" != "xno"])
1408 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"])
1409 AM_CONDITIONAL(HYBRID_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_hybrid"] || [test "x$TEST_PROFILE" = "xunreal"])
1410 AM_CONDITIONAL(AOT_FULL_INTERP_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full_interp"])
1411 AM_CONDITIONAL(AOT_FULL_INTERP_LLVM_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_full_interp_llvm"])
1412 AM_CONDITIONAL(DEFAULT_TESTS, [test "x$TEST_PROFILE" = "xnet_4_x"])
1414 default_profile=net_4_x
1415 if test -z "$INSTALL_MONODROID_TRUE"; then :
1416    default_profile=monodroid
1418 if test -z "$INSTALL_MONOTOUCH_TRUE"; then :
1419    default_profile=monotouch
1421 if test -z "$INSTALL_XAMMAC_TRUE"; then :
1422    default_profile=xammac
1424 if test -z "$INSTALL_TESTING_AOT_FULL_INTERP_TRUE"; then :
1425    default_profile=testing_aot_full_interp
1427 if test -z "$INSTALL_TESTING_AOT_HYBRID_TRUE"; then :
1428    default_profile=testing_aot_hybrid
1430 if test -z "$INSTALL_TESTING_AOT_FULL_TRUE"; then :
1431    default_profile=testing_aot_full
1433 if test -z "$INSTALL_WINAOT_TRUE"; then :
1434    default_profile=winaot
1436 if test -z "$INSTALL_ORBIS_TRUE"; then :
1437    default_profile=orbis
1439 if test -z "$INSTALL_UNREAL_TRUE"; then :
1440    default_profile=unreal
1442 if test -z "$INSTALL_WASM_TRUE"; then :
1443    default_profile=wasm
1445 if test -z "$INSTALL_4_x_TRUE"; then :
1446    default_profile=net_4_x
1448 DEFAULT_PROFILE=$default_profile
1449 AC_SUBST(DEFAULT_PROFILE)
1452 # End build profile configuration
1455 if test x$USE_NLS = xprofile_default; then
1457         AC_MSG_CHECKING([NLS used])
1459         # We make the default value for USE_NLS
1460         # "no" on OSX because it isn't available on most
1461         # default OSX installs. The most common configurations will
1462         # all disable it, so this saves us typing.
1463         if test x$host_darwin = xyes; then
1464                 USE_NLS=no;
1465         else
1466                 USE_NLS=yes;
1467         fi
1469         AC_SUBST([USE_NLS])
1470         AC_MSG_RESULT([$USE_NLS])
1473 AC_ARG_ENABLE(minimal, [  --enable-minimal=LIST      drop support for LIST subsystems.
1474      LIST is a comma-separated list from: aot, profiler, decimal, pinvoke, debug, appdomains, verifier, 
1475      reflection_emit, reflection_emit_save, large_code, logging, com, ssa, generics, attach, jit, interpreter, simd, soft_debug, perfcounters, normalization, desktop_loader, shared_perfcounters, remoting,
1476          security, lldb, mdb, assert_messages, sgen_marksweep_conc, sgen_split_nursery, sgen_gc_bridge, sgen_debug_helpers.],
1478         for feature in `echo "$enable_minimal" | sed -e "s/,/ /g"`; do
1479                 eval "mono_feature_disable_$feature='yes'"
1480         done
1481         DISABLED_FEATURES=$enable_minimal
1482         disabled="Disabled:      $enable_minimal"
1483 ],[])
1485 AC_DEFINE_UNQUOTED(DISABLED_FEATURES, "$DISABLED_FEATURES", [String of disabled features])
1487 if test "x$mono_feature_disable_aot" = "xyes"; then
1488         AC_DEFINE(DISABLE_AOT, 1, [Disable AOT Compiler])
1489         enable_system_aot=no
1490         AC_MSG_NOTICE([Disabled AOT compiler])
1493 if test "x$mono_feature_disable_profiler" = "xyes"; then
1494         AC_DEFINE(DISABLE_PROFILER, 1, [Disable default profiler support])
1495         AC_MSG_NOTICE([Disabled support for the profiler])
1497 AM_CONDITIONAL(DISABLE_PROFILER, test x$mono_feature_disable_profiler = xyes)
1499 if test "x$mono_feature_disable_decimal" = "xyes"; then
1500         AC_DEFINE(DISABLE_DECIMAL, 1, [Disable System.Decimal support])
1501         AC_MSG_NOTICE([Disabled support for decimal])
1504 if test "x$mono_feature_disable_pinvoke" = "xyes"; then
1505         AC_DEFINE(DISABLE_PINVOKE, 1, [Disable P/Invoke support])
1506         AC_MSG_NOTICE([Disabled support for P/Invoke])
1509 if test "x$mono_feature_disable_debug" = "xyes"; then
1510         AC_DEFINE(DISABLE_DEBUG, 1, [Disable runtime debugging support])
1511         AC_MSG_NOTICE([Disabled support for runtime debugging])
1514 if test "x$mono_feature_disable_reflection_emit" = "xyes"; then
1515         AC_DEFINE(DISABLE_REFLECTION_EMIT, 1, [Disable reflection emit support])
1516         mono_feature_disable_reflection_emit_save=yes
1517         AC_MSG_NOTICE([Disabled support for Reflection.Emit])
1520 if test "x$mono_feature_disable_reflection_emit_save" = "xyes"; then
1521         AC_DEFINE(DISABLE_REFLECTION_EMIT_SAVE, 1, [Disable assembly saving support in reflection emit])
1522         AC_MSG_NOTICE([Disabled support for Reflection.Emit.Save])
1525 if test "x$mono_feature_disable_large_code" = "xyes"; then
1526         AC_DEFINE(DISABLE_LARGE_CODE, 1, [Disable support for huge assemblies])
1527         AC_MSG_NOTICE([Disabled support for large assemblies])
1530 if test "x$mono_feature_disable_logging" = "xyes"; then
1531         AC_DEFINE(DISABLE_LOGGING, 1, [Disable support debug logging])
1532         AC_MSG_NOTICE([Disabled support for logging])
1535 if test "x$mono_feature_disable_com" = "xyes"; then
1536         AC_DEFINE(DISABLE_COM, 1, [Disable COM support])
1537         AC_MSG_NOTICE([Disabled COM support])
1540 if test "x$mono_feature_disable_ssa" = "xyes"; then
1541         AC_DEFINE(DISABLE_SSA, 1, [Disable advanced SSA JIT optimizations])
1542         AC_MSG_NOTICE([Disabled SSA JIT optimizations])
1545 if test "x$mono_feature_disable_generics" = "xyes"; then
1546         AC_DEFINE(DISABLE_GENERICS, 1, [Disable generics support])
1547         AC_MSG_NOTICE([Disabled Generics Support])
1550 if test "x$mono_feature_disable_shadowcopy" = "xyes"; then
1551         AC_DEFINE(DISABLE_SHADOW_COPY, 1, [Disable Shadow Copy for AppDomains])
1552         AC_MSG_NOTICE([Disabled Shadow copy for AppDomains])
1555 if test "x$mono_feature_disable_portability" = "xyes"; then
1556         AC_DEFINE(DISABLE_PORTABILITY, 1, [Disables the IO portability layer])
1557         AC_MSG_NOTICE([Disabled IO Portability layer])
1560 if test "x$mono_feature_disable_attach" = "xyes"; then
1561         AC_DEFINE(DISABLE_ATTACH, 1, [Disable agent attach support])
1562         AC_MSG_NOTICE([Disabled agent attach])
1565 if test "x$mono_feature_disable_verifier" = "xyes"; then
1566         AC_DEFINE(DISABLE_VERIFIER, 1, [Disables the verifier])
1567         AC_MSG_NOTICE([Disabled the metadata and IL verifiers])
1570 if test "x$mono_feature_disable_jit" = "xyes"; then
1571         AC_DEFINE(DISABLE_JIT, 1, [Disable the JIT, only full-aot mode or interpreter will be supported by the runtime.])
1572         AC_MSG_NOTICE([Disabled the JIT engine, only full AOT or interpreter will be supported])
1575 AM_CONDITIONAL(DISABLE_JIT, test x$mono_feature_disable_jit = xyes)
1577 if test "x$mono_feature_disable_interpreter" = "xyes"; then
1578         AC_DEFINE(DISABLE_INTERPRETER, 1, [Disable the interpreter.])
1579         AC_MSG_NOTICE([Disabled the interpreter])
1582 AM_CONDITIONAL(DISABLE_INTERPRETER, test x$mono_feature_disable_interpreter = xyes)
1584 if test "x$mono_feature_disable_interpreter" != "xyes" -o "x$mono_feature_disable_jit" != "xyes"; then
1585         AC_DEFINE(ENABLE_ILGEN, 1, [Some VES is available at runtime])
1588 AM_CONDITIONAL(ENABLE_ILGEN, test x$mono_feature_disable_interpreter != xyes -o x$mono_feature_disable_jit != xyes)
1590 if test "x$mono_feature_disable_simd" = "xyes"; then
1591         AC_DEFINE(DISABLE_SIMD, 1, [Disable SIMD intrinsics related optimizations.])
1592         AC_MSG_NOTICE([Disabled SIMD support])
1595 if test "x$mono_feature_disable_soft_debug" = "xyes"; then
1596         AC_DEFINE(DISABLE_DEBUGGER_AGENT, 1, [Disable Soft Debugger Agent.])
1597         AC_MSG_NOTICE([Disabled Soft Debugger.])
1600 AM_CONDITIONAL(DISABLE_DEBUGGER_AGENT, test x$mono_feature_disable_debugger_agent = xyes)
1602 if test "x$mono_feature_disable_perfcounters" = "xyes"; then
1603         AC_DEFINE(DISABLE_PERFCOUNTERS, 1, [Disable Performance Counters.])
1604         AC_MSG_NOTICE([Disabled Performance Counters.])
1606 if test "x$mono_feature_disable_normalization" = "xyes"; then
1607         AC_DEFINE(DISABLE_NORMALIZATION, 1, [Disable String normalization support.])
1608         AC_MSG_NOTICE([Disabled String normalization support.])
1611 #TODO: remove assembly_remapping feature name once everyone is using desktop_loader
1612 if test "x$mono_feature_disable_assembly_remapping" = "xyes" || test "x$mono_feature_disable_desktop_loader" = "xyes"; then
1613         AC_DEFINE(DISABLE_DESKTOP_LOADER, 1, [Disable desktop assembly loader semantics.])
1614         AC_MSG_NOTICE([Disabled desktop assembly loader semantics.])
1617 if test "x$mono_feature_disable_shared_perfcounters" = "xyes"; then
1618         AC_DEFINE(DISABLE_SHARED_PERFCOUNTERS, 1, [Disable shared perfcounters.])
1619         AC_MSG_NOTICE([Disabled Shared perfcounters.])
1622 if test "x$mono_feature_disable_appdomains" = "xyes"; then
1623         AC_DEFINE(DISABLE_APPDOMAINS, 1, [Disable support for multiple appdomains.])
1624         AC_MSG_NOTICE([Disabled support for multiple appdomains.])
1627 if test "x$mono_feature_disable_remoting" = "xyes"; then
1628         AC_DEFINE(DISABLE_REMOTING, 1, [Disable remoting support (This disables type proxies and make com non-functional)])
1629         AC_MSG_NOTICE([Disabled remoting])
1632 if test "x$mono_feature_disable_security" = "xyes"; then
1633         AC_DEFINE(DISABLE_SECURITY, 1, [Disable CAS/CoreCLR security])
1634         AC_MSG_NOTICE([Disabled CAS/CoreCLR security manager (used e.g. for Moonlight)])
1637 if test "x$mono_feature_disable_lldb" = "xyes"; then
1638         AC_DEFINE(DISABLE_LLDB, 1, [Disable support code for the LLDB plugin.])
1639         AC_MSG_NOTICE([Disabled LLDB plugin support code.])
1642 if test "x$mono_feature_disable_mdb" = "xyes"; then
1643         AC_DEFINE(DISABLE_MDB, 1, [Disable support for .mdb symbol files.])
1644         AC_MSG_NOTICE([Disabled support for .mdb symbol files.])
1647 if test "x$mono_feature_disable_assert_messages" = "xyes"; then
1648         AC_DEFINE(DISABLE_ASSERT_MESSAGES, 1, [Disable assertion messages.])
1649         AC_MSG_NOTICE([Disabled assertion messages.])
1652 if test "x$mono_feature_disable_sgen_marksweep_conc" = "xyes"; then
1653         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_CONC, 1, [Disable concurrent gc support in SGEN.])
1654         AC_MSG_NOTICE([Disabled concurrent gc support in SGEN.])
1658 if test "x$mono_feature_disable_sgen_split_nursery" = "xyes"; then
1659         AC_DEFINE(DISABLE_SGEN_SPLIT_NURSERY, 1, [Disable minor=split support in SGEN.])
1660         AC_MSG_NOTICE([Disabled minor=split support in SGEN.])
1663 if test "x$mono_feature_disable_sgen_gc_bridge" = "xyes"; then
1664         AC_DEFINE(DISABLE_SGEN_GC_BRIDGE, 1, [Disable gc bridge support in SGEN.])
1665         AC_MSG_NOTICE([Disabled gc bridge support in SGEN.])
1668 if test "x$mono_feature_disable_sgen_debug_helpers" = "xyes"; then
1669         AC_DEFINE(DISABLE_SGEN_DEBUG_HELPERS, 1, [Disable debug helpers in SGEN.])
1670         AC_MSG_NOTICE([Disabled debug helpers in SGEN.])
1673 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
1674 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
1676 has_extension_module=no
1677 AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
1679         for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
1680                 if test x$extension = xdefault ; then
1681                         has_extension_module=yes;
1682                 fi
1683         done
1684         if test x$enable_extension_module = xyes; then
1685                 has_extension_module=yes;
1686         fi
1687 ], [])
1689 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
1691 if test x$has_extension_module != xno ; then
1692         AC_DEFINE([ENABLE_EXTENSION_MODULE], 1, [Extension module enabled])
1693         AC_MSG_NOTICE([Enabling mono extension module.])
1696 # Deprecated
1697 AC_ARG_ENABLE(gsharedvt, [  --enable-gsharedvt Enable generic valuetype sharing (Deprecated)], enable_gsharedvt=$enableval, enable_gsharedvt=no)
1699 AC_MSG_CHECKING(for visibility __attribute__)
1700 AC_COMPILE_IFELSE([
1701         AC_LANG_SOURCE([[
1702                 void __attribute__ ((visibility ("hidden"))) doit (void) {}
1703                 int main () { doit (); return 0; }
1704         ]])
1705 ], [
1706    have_visibility_hidden=yes
1707    AC_MSG_RESULT(yes)
1708 ], [
1709    have_visibility_hidden=no
1710    AC_MSG_RESULT(no)
1714 dnl Boehm GC configuration
1717 AC_ARG_WITH(libgc,   [  --with-libgc=included,none  Controls the Boehm GC config, default=included],[libgc=$with_libgc],[libgc=included])
1719 AC_ARG_ENABLE(boehm, [  --disable-boehm            Disable the Boehm GC.], support_boehm=$enableval,support_boehm=${support_boehm:-yes})
1720 AM_CONDITIONAL(SUPPORT_BOEHM, test x$support_boehm = xyes)
1722 if test "x$support_boehm" = "xyes"; then
1724         AC_ARG_ENABLE(parallel-mark, [  --enable-parallel-mark     Enables Boehm GC Parallel Marking], enable_parallel_mark=$enableval, enable_parallel_mark=$parallel_mark)
1725         if test x$enable_parallel_mark = xyes; then
1726                 libgc_configure_args="$libgc_configure_args --enable-parallel-mark"
1727         fi
1729         gc_msg=""
1730         LIBGC_CPPFLAGS=
1731         LIBGC_LIBS=
1732         LIBGC_STATIC_LIBS=
1733         libgc_dir=
1734         case "x$libgc" in
1735                 xincluded)
1736                         if test "x$support_boehm" = "xyes"; then
1737                                 libgc_dir=libgc
1738                         fi
1740                         LIBGC_CPPFLAGS='-I$(top_srcdir)/libgc/include'
1741                         LIBGC_LIBS='$(top_builddir)/libgc/libmonogc.la'
1742                         LIBGC_STATIC_LIBS='$(top_builddir)/libgc/libmonogc-static.la'
1744                         BOEHM_DEFINES="-DHAVE_BOEHM_GC"
1746                         if test x$target_win32 = xyes; then
1747                                 BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
1748                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
1749                         fi
1751                         gc_msg="Included Boehm GC with typed GC"
1752                         if test x$enable_parallel_mark = xyes; then
1753                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
1754                                 gc_msg="$gc_msg and parallel mark"
1755                         else
1756                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC)", [GC description])
1757                         fi
1758                         ;;
1760                 xboehm|xbohem|xyes)
1761                         AC_MSG_WARN("External Boehm is no longer supported")
1762                         ;;
1764                 xsgen)
1765                         AC_MSG_WARN("Use --with-sgen instead, --with-libgc= controls Boehm configuration")
1766                         ;;
1768                 xnone)
1769                         AC_MSG_WARN("Compiling mono without GC.")
1770                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description])
1771                         AC_DEFINE(HAVE_NULL_GC,1,[No GC support.])
1772                         gc_msg="none"
1773                         ;;
1774                 *)
1775                         AC_MSG_ERROR([Invalid argument $libgc to --with-libgc.])
1776                         ;;
1777         esac
1779         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])
1780         if test "x$large_heap" = "xyes"; then
1781            CPPFLAGS="$CPPFLAGS -DLARGE_CONFIG"
1782         fi
1784         AC_SUBST(LIBGC_CPPFLAGS)
1785         AC_SUBST(LIBGC_LIBS)
1786         AC_SUBST(LIBGC_STATIC_LIBS)
1787         AC_SUBST(libgc_dir)
1788         AC_SUBST(BOEHM_DEFINES)
1791 AM_CONDITIONAL(SUPPORT_NULLGC, test "x$libgc" = "xnone")
1794 dnl End of Boehm GC Configuration
1797 dnl *************************************
1798 dnl *** Checks for zero length arrays ***
1799 dnl *************************************
1800 AC_MSG_CHECKING(whether $CC supports zero length arrays)
1801 AC_TRY_COMPILE([
1802         struct s {
1803                 int  length;
1804                 char data [0];
1805         };
1806 ], [], [
1807         AC_MSG_RESULT(yes)
1808         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 0, [Length of zero length arrays])
1809 ], [
1810         AC_MSG_RESULT(no)
1811         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
1814 dnl ***********************************
1815 dnl *** Checks for signals
1816 dnl ***********************************
1817 AC_CHECK_HEADERS(signal.h)
1818 AC_CHECK_FUNCS(sigaction)
1819 AC_CHECK_FUNCS(kill)
1820 AC_CHECK_FUNCS(signal)
1822 # signal() is declared inline in Android headers
1823 # so we need to workaround it by overriding the check.
1824 if test x$platform_android = xyes; then
1825         AC_DEFINE(HAVE_SIGNAL,1)
1828 dnl ***********************************
1829 dnl *** Checks for availability of GSS dependencies (krb5, gss.framework, etc)
1830 dnl ***********************************
1831 enable_gss=no;
1832 AC_MSG_CHECKING(for GSS/GSS.h)
1833 AC_TRY_COMPILE([
1834     #include <GSS/GSS.h>
1835 ], [
1837     AC_MSG_RESULT(yes)
1838     AC_DEFINE(HAVE_GSSFW_HEADERS, 1, [GSS/GSS.h])
1839     AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
1840     enable_gss=yes
1841 ], [
1842     AC_MSG_RESULT(no)
1845 AC_MSG_CHECKING(for gssapi/gssapi_ext.h)
1846 AC_TRY_COMPILE([
1847     #include <gssapi/gssapi_ext.h>
1848 ], [
1850     AC_MSG_RESULT(yes)
1851     enable_gss=yes
1852 ], [
1853     AC_MSG_RESULT(no)
1856 AC_MSG_CHECKING(for GSS_SPNEGO_MECHANISM)
1857 AC_TRY_COMPILE([
1858     #include <gssapi/gssapi_ext.h>
1859     #include <gssapi/gssapi_krb5.h>
1860     gss_OID_set_desc gss_mech_spnego_OID_set_desc = {.count = 1, .elements = GSS_SPNEGO_MECHANISM};
1861 ], [
1863     AC_MSG_RESULT(yes)
1864     AC_DEFINE(HAVE_GSS_SPNEGO_MECHANISM, 1, [GSS_SPNEGO_MECHANISM])
1865 ], [
1866     AC_MSG_RESULT(no)
1869 AM_CONDITIONAL(ENABLE_GSS, test x$enable_gss = xyes)
1871 # `target_ios=yes` does not detect watch devices and fails when cross-compiling
1872 AC_MONO_APPLE_TARGET(TARGET_OS_IPHONE, [mono_native_platform_ios=yes])
1874 if test x$host_win32 = xno; then
1875         dnl *************************************
1876         dnl *** Checks for time capabilities ***
1877         dnl *************************************
1879         AC_MSG_CHECKING(for CLOCK_MONOTONIC)
1880         AC_TRY_COMPILE([#include <time.h>], [
1881                 const int foo = CLOCK_MONOTONIC;
1882         ],[
1883                 AC_MSG_RESULT(yes)
1884                 AC_DEFINE(HAVE_CLOCK_MONOTONIC, 1, [CLOCK_MONOTONIC])
1885         ], [
1886                 AC_MSG_RESULT(no)
1887         ])
1889         AC_MSG_CHECKING(for CLOCK_MONOTONIC_COARSE)
1890         AC_TRY_COMPILE([#include <time.h>], [
1891                 const int foo = CLOCK_MONOTONIC_COARSE;
1892         ],[
1893                 AC_MSG_RESULT(yes)
1894                 AC_DEFINE(HAVE_CLOCK_MONOTONIC_COARSE, 1, [CLOCK_MONOTONIC_COARSE])
1895         ], [
1896                 AC_MSG_RESULT(no)
1897         ])
1899         AC_MSG_CHECKING(for CLOCK_REALTIME)
1900         AC_TRY_COMPILE([#include <time.h>], [
1901                 const int foo = CLOCK_REALTIME;
1902         ],[
1903                 AC_MSG_RESULT(yes)
1904                 AC_DEFINE(HAVE_CLOCK_REALTIME, 1, [CLOCK_REALTIME])
1905         ], [
1906                 AC_MSG_RESULT(no)
1907         ])
1909         AC_CHECK_FUNC(mach_absolute_time, [AC_DEFINE(HAVE_MACH_ABSOLUTE_TIME, 1, [mach_absolute_time])])
1910         AC_CHECK_FUNC(gethrtime, [AC_DEFINE(HAVE_GETHRTIME, 1, [gethrtime])])
1911         AC_CHECK_FUNC(read_real_time, [AC_DEFINE(HAVE_READ_REAL_TIME, 1, [read_real_time])])
1912         AC_CHECK_FUNC(mach_timebase_info, [AC_DEFINE(HAVE_MACH_TIMEBASE_INFO, 1, [mach_timebase_info])])
1913         AC_CHECK_FUNC(futimes,            [AC_DEFINE(HAVE_FUTIMES, 1, [futimes])])
1914         AC_CHECK_FUNC(futimens,           [AC_DEFINE(HAVE_FUTIMENS, 1, [futimens])])
1916         dnl hires monotonic clock support
1917         AC_SEARCH_LIBS(clock_gettime, rt)
1918         AC_CHECK_FUNCS(clock_nanosleep)
1920         dnl dynamic loader support
1921         AC_CHECK_FUNC(dlopen, DL_LIB="",
1922                 AC_CHECK_LIB(dl, dlopen, DL_LIB="-ldl", dl_support=no)
1923         )
1924         if test x$dl_support = xno; then
1925                 AC_MSG_WARN([No dynamic loading support available])
1926         else
1927                 LIBS="$LIBS $DL_LIB"
1928                 AC_DEFINE(HAVE_DL_LOADER,1,[dlopen-based dynamic loader available])
1929                 dnl from glib's configure.ac
1930                 AC_CACHE_CHECK([for preceeding underscore in symbols],
1931                         mono_cv_uscore,[
1932                         AC_TRY_RUN([#include <dlfcn.h>
1933                         int mono_underscore_test (void) { return 42; }
1934                         int main() {
1935                           void *f1 = (void*)0, *f2 = (void*)0, *handle;
1936                           handle = dlopen ((void*)0, 0);
1937                           if (handle) {
1938                             f1 = dlsym (handle, "mono_underscore_test");
1939                             f2 = dlsym (handle, "_mono_underscore_test");
1940                           } return (!f2 || f1);
1941                         }],
1942                                 [mono_cv_uscore=yes],
1943                                 [mono_cv_uscore=no],
1944                         [])
1945                 ])
1946                 if test "x$mono_cv_uscore" = "xyes"; then
1947                         MONO_DL_NEED_USCORE=1
1948                 else
1949                         MONO_DL_NEED_USCORE=0
1950                 fi
1951                 AC_SUBST(MONO_DL_NEED_USCORE)
1952                 AC_CHECK_FUNC(dlerror)
1953         fi
1955         dnl ******************************************************************
1956         dnl *** Checks for the IKVM JNI interface library                  ***
1957         dnl ******************************************************************
1958         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])
1960         ikvm_native_dir=
1961         if test x$with_ikvm_native = xyes; then
1962                 ikvm_native_dir=ikvm-native
1963                 jdk_headers_found="IKVM Native"
1964         fi
1966         AC_SUBST(ikvm_native_dir)
1968         AC_CHECK_HEADERS(execinfo.h)
1970         AC_CHECK_HEADERS(sys/auxv.h sys/resource.h)
1972         AC_CHECK_FUNCS(getgrgid_r)
1973         AC_CHECK_FUNCS(getgrnam_r)
1974         AC_CHECK_FUNCS(getresuid)
1975         AC_CHECK_FUNCS(setresuid)
1976         AC_CHECK_FUNCS(kqueue)
1977         AC_CHECK_FUNCS(backtrace_symbols)
1978         AC_CHECK_FUNCS(mkstemp)
1979         AC_CHECK_FUNCS(mmap)
1980         AC_CHECK_FUNCS(madvise)
1981         AC_CHECK_FUNCS(getrusage)
1982         AC_CHECK_FUNCS(getpriority)
1983         AC_CHECK_FUNCS(setpriority)
1984         AC_CHECK_FUNCS(dl_iterate_phdr)
1985         AC_CHECK_FUNCS(dladdr)
1986         AC_CHECK_FUNCS(sysconf)
1987         AC_CHECK_FUNCS(getrlimit)
1988         AC_CHECK_FUNCS(prctl)
1989         AC_CHECK_FUNCS(arc4random)
1990         AC_CHECK_FUNCS(nl_langinfo)
1992         AC_CHECK_FUNCS(sched_getaffinity)
1993         AC_CHECK_FUNCS(sched_setaffinity)
1994         AC_CHECK_FUNCS(sched_getcpu)
1996         if test x$platform_android != xyes; then
1997                 AC_CHECK_FUNCS(getpwnam_r)
1998                 AC_CHECK_FUNCS(getpwuid_r)
1999         fi
2001         AC_FUNC_STRERROR_R()
2003         dnl ****************************************************************
2004         dnl *** Check for sched_setaffinity from glibc versions before   ***
2005         dnl *** 2.3.4. The older versions of the function only take 2    ***
2006         dnl *** parameters, not 3.                                       ***
2007         dnl ***                                                          ***
2008         dnl *** Because the interface change was not made in a minor     ***
2009         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
2010         dnl *** won't always indicate the interface sched_affinity has.  ***
2011         dnl ****************************************************************
2012         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
2013         AC_TRY_COMPILE([#include <sched.h>], [
2014             int mask = 1; 
2015             sched_setaffinity(0, &mask);
2016         ], [
2017                 # Yes, we have it...
2018                 AC_MSG_RESULT(yes)
2019                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
2020         ], [
2021                 # We have the new, three-parameter version
2022                 AC_MSG_RESULT(no)
2023         ])
2024         AC_TRY_COMPILE([#include <sched.h>], [
2025              CPU_COUNT((void *) 0);
2026         ], [
2027                 AC_MSG_RESULT(yes)
2028                 AC_DEFINE(GLIBC_HAS_CPU_COUNT, 1, [GLIBC has CPU_COUNT macro in sched.h])
2029         ], [
2030                 # We have the new, three-parameter version
2031                 AC_MSG_RESULT(no)
2032         ])
2034         dnl ******************************************************************
2035         dnl *** Check for large file support                               ***
2036         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
2037         dnl ******************************************************************
2038         
2039         # Check that off_t can represent 2**63 - 1 correctly, working around
2040         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
2041         # CPPFLAGS and sets $large_offt to yes if the test succeeds
2042         large_offt=no
2043         AC_DEFUN([LARGE_FILES], [
2044                 large_CPPFLAGS=$CPPFLAGS
2045                 CPPFLAGS="$CPPFLAGS $1"
2046                 AC_TRY_COMPILE([
2047                         #include <sys/types.h>
2048                         #include <limits.h>
2049                 ], [
2050                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
2051                         #define COMPILE_TIME_ASSERT(pred) \
2052                                 switch(0){case 0:case pred:;}
2053                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
2054                 ], [
2055                         AC_MSG_RESULT(ok)
2056                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
2057                         large_CPPFLAGS="$large_CPPFLAGS $1"
2058                         large_offt=yes
2059                 ], [
2060                         AC_MSG_RESULT(no)
2061                 ])
2062                 CPPFLAGS=$large_CPPFLAGS
2063         ])
2065         AC_MSG_CHECKING(if off_t is 64 bits wide)
2066         LARGE_FILES("")
2067         if test $large_offt = no; then
2068                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
2069                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
2070         fi
2071         if test $large_offt = no; then
2072                 AC_MSG_WARN([No 64 bit file size support available])
2073         fi
2074         
2075         dnl *****************************
2076         dnl *** Checks for libsocket  ***
2077         dnl *****************************
2078         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
2080         case "$host" in
2081                 *-*-*freebsd*)
2082                         dnl *****************************
2083                         dnl *** Checks for libinotify ***
2084                         dnl *****************************
2085                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
2086         esac
2088         dnl *******************************
2089         dnl *** Checks for MSG_NOSIGNAL ***
2090         dnl *******************************
2091         AC_MSG_CHECKING(for MSG_NOSIGNAL)
2092         AC_TRY_COMPILE([#include <sys/socket.h>], [
2093                 int f = MSG_NOSIGNAL;
2094         ], [
2095                 # Yes, we have it...
2096                 AC_MSG_RESULT(yes)
2097                 AC_DEFINE(HAVE_MSG_NOSIGNAL, 1, [Have MSG_NOSIGNAL])
2098         ], [
2099                 # We'll have to use signals
2100                 AC_MSG_RESULT(no)
2101         ])
2103         dnl *****************************
2104         dnl *** Checks for IPPROTO_IP ***
2105         dnl *****************************
2106         AC_MSG_CHECKING(for IPPROTO_IP)
2107         AC_TRY_COMPILE([#include <netinet/in.h>], [
2108                 int level = IPPROTO_IP;
2109         ], [
2110                 # Yes, we have it...
2111                 AC_MSG_RESULT(yes)
2112                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
2113         ], [
2114                 # We'll have to use getprotobyname
2115                 AC_MSG_RESULT(no)
2116         ])
2118         dnl *******************************
2119         dnl *** Checks for IPPROTO_IPV6 ***
2120         dnl *******************************
2121         AC_MSG_CHECKING(for IPPROTO_IPV6)
2122         AC_TRY_COMPILE([#include <netinet/in.h>], [
2123                 int level = IPPROTO_IPV6;
2124         ], [
2125                 # Yes, we have it...
2126                 AC_MSG_RESULT(yes)
2127                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
2128         ], [
2129                 # We'll have to use getprotobyname
2130                 AC_MSG_RESULT(no)
2131         ])
2133         dnl ******************************
2134         dnl *** Checks for IPPROTO_TCP ***
2135         dnl ******************************
2136         AC_MSG_CHECKING(for IPPROTO_TCP)
2137         AC_TRY_COMPILE([#include <netinet/in.h>], [
2138                 int level = IPPROTO_TCP;
2139         ], [
2140                 # Yes, we have it...
2141                 AC_MSG_RESULT(yes)
2142                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
2143         ], [
2144                 # We'll have to use getprotobyname
2145                 AC_MSG_RESULT(no)
2146         ])
2148         dnl *****************************
2149         dnl *** Checks for SOL_IP     ***
2150         dnl *****************************
2151         AC_MSG_CHECKING(for SOL_IP)
2152         AC_TRY_COMPILE([#include <netdb.h>], [
2153                 int level = SOL_IP;
2154         ], [
2155                 # Yes, we have it...
2156                 AC_MSG_RESULT(yes)
2157                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
2158         ], [
2159                 # We'll have to use getprotobyname
2160                 AC_MSG_RESULT(no)
2161         ])
2163         dnl *****************************
2164         dnl *** Checks for SOL_IPV6     ***
2165         dnl *****************************
2166         AC_MSG_CHECKING(for SOL_IPV6)
2167         AC_TRY_COMPILE([#include <netdb.h>], [
2168                 int level = SOL_IPV6;
2169         ], [
2170                 # Yes, we have it...
2171                 AC_MSG_RESULT(yes)
2172                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
2173         ], [
2174                 # We'll have to use getprotobyname
2175                 AC_MSG_RESULT(no)
2176         ])
2178         dnl *****************************
2179         dnl *** Checks for SOL_TCP    ***
2180         dnl *****************************
2181         AC_MSG_CHECKING(for SOL_TCP)
2182         AC_TRY_COMPILE([#include <netdb.h>], [
2183                 int level = SOL_TCP;
2184         ], [
2185                 # Yes, we have it...
2186                 AC_MSG_RESULT(yes)
2187                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
2188         ], [
2189                 # We'll have to use getprotobyname
2190                 AC_MSG_RESULT(no)
2191         ])
2193         dnl *****************************
2194         dnl *** Checks for IP_PKTINFO ***
2195         dnl *****************************
2196         AC_MSG_CHECKING(for IP_PKTINFO)
2197         AC_TRY_COMPILE([#include <linux/in.h>], [
2198                 int level = IP_PKTINFO;
2199         ], [
2200                 # Yes, we have it...
2201                 AC_MSG_RESULT(yes)
2202                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
2203         ], [
2204                 AC_MSG_RESULT(no)
2205         ])
2207         dnl *****************************
2208         dnl *** Checks for IPV6_PKTINFO ***
2209         dnl *****************************
2210         AC_MSG_CHECKING(for IPV6_PKTINFO)
2211         AC_TRY_COMPILE([#include <netdb.h>], [
2212                 int level = IPV6_PKTINFO;
2213         ], [
2214                 # Yes, we have it...
2215                 AC_MSG_RESULT(yes)
2216                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
2217         ], [
2218                 AC_MSG_RESULT(no)
2219         ])
2221         dnl **********************************
2222         dnl *** Checks for IP_DONTFRAG     ***
2223         dnl **********************************
2224         AC_MSG_CHECKING(for IP_DONTFRAG)
2225         AC_TRY_COMPILE([#include <netinet/in.h>], [
2226                 int level = IP_DONTFRAG;
2227         ], [
2228                 # Yes, we have it...
2229                 AC_MSG_RESULT(yes)
2230                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
2231         ], [
2232                 AC_MSG_RESULT(no)
2233         ])
2235         dnl **********************************
2236         dnl *** Checks for IP_DONTFRAGMENT ***
2237         dnl **********************************
2238         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
2239         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
2240                 int level = IP_DONTFRAGMENT;
2241         ], [
2242                 # Yes, we have it...
2243                 AC_MSG_RESULT(yes)
2244                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
2245         ], [
2246                 AC_MSG_RESULT(no)
2247         ])
2249         dnl **********************************
2250         dnl *** Checks for IP_MTU_DISCOVER ***
2251         dnl **********************************
2252         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
2253         AC_TRY_COMPILE([#include <linux/in.h>], [
2254                 int level = IP_MTU_DISCOVER;
2255         ], [
2256                 # Yes, we have it...
2257                 AC_MSG_RESULT(yes)
2258                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
2259         ], [
2260                 AC_MSG_RESULT(no)
2261         ])
2263         dnl **********************************
2264         dnl *** Checks for  IP_PMTUDISC_DO ***
2265         dnl **********************************
2266         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
2267         AC_TRY_COMPILE([#include <linux/in.h>], [
2268                 int level = IP_PMTUDISC_DO;
2269         ], [
2270                 # Yes, we have it...
2271                 AC_MSG_RESULT(yes)
2272                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
2273         ], [
2274                 AC_MSG_RESULT(no)
2275         ])
2277         dnl *********************************
2278         dnl *** Check for struct ip_mreqn ***
2279         dnl *********************************
2280         AC_MSG_CHECKING(for struct ip_mreqn)
2281         AC_TRY_COMPILE([#include <netinet/in.h>], [
2282                 struct ip_mreqn mreq;
2283                 mreq.imr_address.s_addr = 0;
2284         ], [
2285                 # Yes, we have it...
2286                 AC_MSG_RESULT(yes)
2287                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
2288         ], [
2289                 # We'll just have to try and use struct ip_mreq
2290                 AC_MSG_RESULT(no)
2291                 AC_MSG_CHECKING(for struct ip_mreq)
2292                 AC_TRY_COMPILE([#include <netinet/in.h>], [
2293                         struct ip_mreq mreq;
2294                         mreq.imr_interface.s_addr = 0;
2295                 ], [
2296                         # Yes, we have it...
2297                         AC_MSG_RESULT(yes)
2298                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
2299                 ], [
2300                         # No multicast support
2301                         AC_MSG_RESULT(no)
2302                 ])
2303         ])
2304         
2305         dnl **********************************
2306         dnl *** Check for getaddrinfo ***
2307         dnl **********************************
2308         AC_MSG_CHECKING(for getaddrinfo)
2309                 AC_TRY_LINK([
2310                 #include <stdio.h>
2311                 #include <netdb.h>
2312         ], [
2313                 getaddrinfo(NULL,NULL,NULL,NULL);
2314         ], [
2315                 # Yes, we have it...
2316                 AC_MSG_RESULT(yes)
2317                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2318         ], [
2319                 AC_MSG_RESULT(no)
2320         ])
2322         dnl **********************************
2323         dnl *** Check for gethostbyname2_r ***
2324         dnl **********************************
2325         AC_MSG_CHECKING(for gethostbyname2_r)
2326                 AC_TRY_LINK([
2327                 #include <stdio.h>
2328                 #include <netdb.h>
2329         ], [
2331                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
2332         ], [
2333                 # Yes, we have it...
2334                 AC_MSG_RESULT(yes)
2335                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
2336         ], [
2337                 AC_MSG_RESULT(no)
2338         ])
2340         dnl **********************************
2341         dnl *** Check for gethostbyname2 ***
2342         dnl **********************************
2343         AC_MSG_CHECKING(for gethostbyname2)
2344                 AC_TRY_LINK([
2345                 #include <stdio.h>
2346                 #include <netdb.h>
2347         ], [
2348                 gethostbyname2(NULL,0);
2349         ], [
2350                 # Yes, we have it...
2351                 AC_MSG_RESULT(yes)
2352                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
2353         ], [
2354                 AC_MSG_RESULT(no)
2355         ])
2357         dnl **********************************
2358         dnl *** Check for gethostbyname ***
2359         dnl **********************************
2360         AC_MSG_CHECKING(for gethostbyname)
2361                 AC_TRY_LINK([
2362                 #include <stdio.h>
2363                 #include <netdb.h>
2364         ], [
2365                 gethostbyname(NULL);
2366         ], [
2367                 # Yes, we have it...
2368                 AC_MSG_RESULT(yes)
2369                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2370         ], [
2371                 AC_MSG_RESULT(no)
2372         ])
2374         dnl **********************************
2375         dnl *** Check for getprotobyname ***
2376         dnl **********************************
2377         AC_MSG_CHECKING(for getprotobyname)
2378                 AC_TRY_LINK([
2379                 #include <stdio.h>
2380                 #include <netdb.h>
2381         ], [
2382                 getprotobyname(NULL);
2383         ], [
2384                 # Yes, we have it...
2385                 AC_MSG_RESULT(yes)
2386                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2387         ], [
2388                 AC_MSG_RESULT(no)
2389         ])
2391         dnl **********************************
2392         dnl *** Check for getprotobyname_r ***
2393         dnl **********************************
2394         AC_MSG_CHECKING(for getprotobyname_r)
2395                 AC_TRY_LINK([
2396                 #include <stdio.h>
2397                 #include <netdb.h>
2398         ], [
2399                 getprotobyname_r(NULL, NULL, NULL, 0, NULL);
2400         ], [
2401                 # Yes, we have it...
2402                 AC_MSG_RESULT(yes)
2403                 AC_DEFINE(HAVE_GETPROTOBYNAME_R, 1, [Have getprotobyname_r])
2404         ], [
2405                 AC_MSG_RESULT(no)
2406         ])
2408         dnl **********************************
2409         dnl *** Check for getnameinfo ***
2410         dnl **********************************
2411         AC_MSG_CHECKING(for getnameinfo)
2412                 AC_TRY_LINK([
2413                 #include <stdio.h>
2414                 #include <netdb.h>
2415         ], [
2416                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2417         ], [
2418                 # Yes, we have it...
2419                 AC_MSG_RESULT(yes)
2420                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2421         ], [
2422                 AC_MSG_RESULT(no)
2423         ])
2426         dnl **********************************
2427         dnl *** Check for inet_ntop ***
2428         dnl **********************************
2429         AC_MSG_CHECKING(for inet_ntop)
2430                 AC_TRY_LINK([
2431                 #include <stdio.h>
2432                 #include <arpa/inet.h>
2433         ], [
2434                 inet_ntop (0, NULL, NULL, 0);
2435         ], [
2436                 # Yes, we have it...
2437                 AC_MSG_RESULT(yes)
2438                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2439         ], [
2440                 AC_MSG_RESULT(no)
2441         ])
2443         dnl *****************************
2444         dnl *** Checks for libnsl     ***
2445         dnl *****************************
2446         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
2448         AC_CHECK_FUNCS(inet_pton inet_aton)
2450         dnl *****************************
2451         dnl *** Checks for libxnet    ***
2452         dnl *****************************
2453         case "${host}" in
2454                 *solaris* )
2455                         AC_MSG_CHECKING(for Solaris XPG4 support)
2456                         if test -f /usr/lib/libxnet.so; then
2457                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
2458                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
2459                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
2460                                 LIBS="$LIBS -lxnet"
2461                                 AC_MSG_RESULT(yes)
2462                         else
2463                                 AC_MSG_RESULT(no)
2464                         fi
2466                         if test "$GCC" = "yes"; then
2467                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
2468                         fi
2469                 ;;
2470         esac
2472         dnl *****************************
2473         dnl *** Checks for libpthread ***
2474         dnl *****************************
2475 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
2476 # and libpthread does not exist
2478         case "${host}" in
2479                 *-*-*haiku*)
2480                         dnl Haiku has pthread in libroot (libc equiv)
2481                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS")
2482                 ;;
2483                 *-*-*freebsd*)
2484                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2485                 ;;
2486                 *-*-*openbsd*)
2487                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2488                 ;;
2489                 *)
2490                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
2491                 ;;
2492         esac
2493         AC_CHECK_HEADERS(pthread.h)
2494         AC_CHECK_HEADERS(pthread_np.h)
2495         AC_CHECK_FUNCS(pthread_mutex_timedlock)
2496         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_getname_np pthread_setname_np pthread_cond_timedwait_relative_np)
2497         AC_CHECK_FUNCS(pthread_kill)
2498         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
2499         AC_TRY_COMPILE([ #include <pthread.h>], [
2500                 pthread_mutexattr_t attr;
2501                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
2502         ], [
2503                 AC_MSG_RESULT(ok)
2504         ], [
2505                 AC_MSG_RESULT(no)
2506                 AC_ERROR(Posix system lacks support for recursive mutexes)
2507         ])
2508         AC_CHECK_FUNCS(pthread_attr_setstacksize)
2509         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
2510         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
2511         AC_CHECK_FUNCS(mincore mlock munlock)
2513         dnl ***********************************
2514         dnl *** Checks for working __thread ***
2515         dnl ***********************************
2516         AC_MSG_CHECKING(for working __thread)
2517         if test "x$with_tls" != "x__thread"; then
2518                 AC_MSG_RESULT(disabled)
2519         elif test "x$cross_compiling" = "xyes"; then
2520                 AC_MSG_RESULT(cross compiling, assuming yes)
2521         else
2522                 AC_TRY_RUN([
2523                         #if defined(__APPLE__) && defined(__clang__)
2524                         #error "__thread does not currently work with clang on Mac OS X"
2525                         #endif
2526                         
2527                         #include <pthread.h>
2528                         __thread int i;
2529                         static int res1, res2;
2531                         void thread_main (void *arg)
2532                         {
2533                                 i = arg;
2534                                 sleep (1);
2535                                 if (arg == 1)
2536                                         res1 = (i == arg);
2537                                 else
2538                                         res2 = (i == arg);
2539                         }
2541                         int main () {
2542                                 pthread_t t1, t2;
2544                                 i = 5;
2546                                 pthread_create (&t1, NULL, thread_main, 1);
2547                                 pthread_create (&t2, NULL, thread_main, 2);
2549                                 pthread_join (t1, NULL);
2550                                 pthread_join (t2, NULL);
2552                                 return !(res1 + res2 == 2);
2553                         }
2554                 ], [
2555                                 AC_MSG_RESULT(yes)
2556                 ], [
2557                                 AC_MSG_RESULT(no)
2558                                 with_tls=pthread
2559                 ])
2560         fi
2562         dnl **************************************
2563         dnl *** Checks for working sigaltstack ***
2564         dnl **************************************
2565         AC_MSG_CHECKING(for working sigaltstack)
2566         if test "x$with_sigaltstack" != "xyes"; then
2567                 AC_MSG_RESULT(disabled)
2568         elif test "x$cross_compiling" = "xyes"; then
2569                 AC_MSG_RESULT(cross compiling, assuming yes)
2570         else
2571                 AC_TRY_RUN([
2572                         #include <stdio.h>
2573                         #include <stdlib.h>
2574                         #include <unistd.h>
2575                         #include <signal.h>
2576                         #include <pthread.h>
2577                         #include <sys/wait.h>
2578                         #if defined(__FreeBSD__) || defined(__NetBSD__)
2579                         #define SA_STACK SA_ONSTACK
2580                         #endif
2581                         static void
2582                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
2583                         {
2584                                 exit (0);
2585                         }
2587                         volatile char*__ptr = NULL;
2588                         static void *
2589                         loop (void *ignored)
2590                         {
2591                                 *__ptr = 0;
2592                                 return NULL;
2593                         }
2595                         static void
2596                         child ()
2597                         {
2598                                 struct sigaction sa;
2599                                 stack_t sas;
2600                                 pthread_t id;
2601                                 pthread_attr_t attr;
2603                                 sa.sa_sigaction = sigsegv_signal_handler;
2604                                 sigemptyset (&sa.sa_mask);
2605                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
2606                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
2607                                         perror ("sigaction");
2608                                         return;
2609                                 }
2611                                 /* x86 darwin deliver segfaults using SIGBUS */
2612                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
2613                                         perror ("sigaction");
2614                                         return;
2615                                 }
2616                                 sas.ss_sp = malloc (SIGSTKSZ);
2617                                 sas.ss_size = SIGSTKSZ;
2618                                 sas.ss_flags = 0;
2619                                 if (sigaltstack (&sas, NULL) == -1) {
2620                                         perror ("sigaltstack");
2621                                         return;
2622                                 }
2624                                 pthread_attr_init (&attr);
2625                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
2626                                         printf ("pthread_create\n");
2627                                         return;
2628                                 }
2630                                 sleep (100);
2631                         }
2633                         int
2634                         main ()
2635                         {
2636                                 pid_t son;
2637                                 int status;
2638                                 int i;
2640                                 son = fork ();
2641                                 if (son == -1) {
2642                                         return 1;
2643                                 }
2645                                 if (son == 0) {
2646                                         child ();
2647                                         return 0;
2648                                 }
2650                                 for (i = 0; i < 300; ++i) {
2651                                         waitpid (son, &status, WNOHANG);
2652                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
2653                                                 return 0;
2654                                         usleep (10000);
2655                                 }
2657                                 kill (son, SIGKILL);
2658                                 return 1;
2659                         }
2661                 ], [
2662                                 AC_MSG_RESULT(yes)
2663                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
2664                 ], [
2665                                 with_sigaltstack=no
2666                                 AC_MSG_RESULT(no)
2667                 ])
2668         fi
2670         dnl ********************************
2671         dnl *** Checks for semaphore lib ***
2672         dnl ********************************
2673         # 'Real Time' functions on Solaris
2674         # posix4 on Solaris 2.6
2675         # pthread (first!) on Linux
2676         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
2678         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
2679         AC_CHECK_FUNCS(shm_open)
2681         dnl ********************************
2682         dnl *** Checks for timezone stuff **
2683         dnl ********************************
2684         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
2685                 AC_TRY_COMPILE([
2686                         #include <time.h>
2687                         ], [
2688                         struct tm tm;
2689                         tm.tm_gmtoff = 1;
2690                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
2691         if test $ac_cv_struct_tm_gmtoff = yes; then
2692                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
2693         else
2694                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
2695                         AC_TRY_COMPILE([
2696                                 #include <time.h>
2697                         ], [
2698                                 timezone = 1;
2699                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
2700                 if test $ac_cv_var_timezone = yes; then
2701                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
2702                 else
2703                         AC_ERROR(unable to find a way to determine timezone)
2704                 fi
2705         fi
2707         dnl *********************************
2708         dnl *** Checks for math functions ***
2709         dnl *********************************
2710         AC_SEARCH_LIBS(sqrtf, m)
2712         dnl ****************************************************************
2713         dnl *** Checks for working poll() (macosx defines it but doesn't ***
2714         dnl *** have it in the library (duh))                            ***
2715         dnl ****************************************************************
2716         AC_CHECK_FUNCS(poll)
2718         dnl **********************************
2719         dnl *** epoll                      ***
2720         dnl **********************************
2721         AC_CHECK_HEADERS(sys/epoll.h)
2722         haveepoll=no
2723         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
2724         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
2725                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
2726         fi
2728         havekqueue=no
2730         AC_CHECK_HEADERS(sys/event.h)
2731         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
2733         dnl **************************************
2734         dnl * Darwin has a race that prevents us from using reliably:
2735         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
2736         dnl * Since kqueue is mostly used for scaling large web servers, 
2737         dnl * and very few folks run Mono on large web servers on OSX, falling
2738         dnl * back 
2739         dnl **************************************
2740         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
2741                 if test "x$host_darwin" = "xno"; then
2742                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
2743                 fi
2744         fi
2746         dnl ******************************
2747         dnl *** Checks for SIOCGIFCONF ***
2748         dnl ******************************
2749         AC_CHECK_HEADERS(sys/ioctl.h)
2750         AC_CHECK_HEADERS(net/if.h, [], [],
2751            [
2752            #ifdef HAVE_SYS_TYPES_H
2753            # include <sys/types.h>
2754            #endif
2755            #ifdef HAVE_SYS_SOCKET_H
2756            # include <sys/socket.h>
2757            #endif
2758            ])
2759         AC_MSG_CHECKING(for ifreq)
2760         AC_TRY_COMPILE([
2761                 #include <stdio.h>
2762                 #include <sys/ioctl.h>
2763                 #include <net/if.h>
2764                 ], [
2765                 struct ifconf ifc;
2766                 struct ifreq *ifr;
2767                 void *x;
2768                 ifc.ifc_len = 0;
2769                 ifc.ifc_buf = NULL;
2770                 x = (void *) &ifr->ifr_addr;
2771                 ],[
2772                         AC_MSG_RESULT(yes)
2773                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
2774                 ], [
2775                         AC_MSG_RESULT(no)
2776                 ])
2777         dnl **********************************
2778         dnl ***     Checks for sin_len     ***
2779         dnl **********************************
2780         AC_MSG_CHECKING(for sockaddr_in.sin_len)
2781         AC_TRY_COMPILE([
2782                 #include <netinet/in.h>
2783                 ], [
2784                 struct sockaddr_in saddr;
2785                 saddr.sin_len = sizeof (saddr);
2786                 ],[
2787                         AC_MSG_RESULT(yes)
2788                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
2789                 ], [
2790                         AC_MSG_RESULT(no)
2791                 ])      
2792         dnl **********************************
2793         dnl ***    Checks for sin6_len     ***
2794         dnl **********************************
2795         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
2796         AC_TRY_COMPILE([
2797                 #include <netinet/in.h>
2798                 ], [
2799                 struct sockaddr_in6 saddr6;
2800                 saddr6.sin6_len = sizeof (saddr6);
2801                 ],[
2802                         AC_MSG_RESULT(yes)
2803                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
2804                 ], [
2805                         AC_MSG_RESULT(no)
2806                 ])
2807         dnl **********************************
2808         dnl *** Check for getifaddrs       ***
2809         dnl **********************************
2810         AC_MSG_CHECKING(for getifaddrs)
2811                 AC_TRY_LINK([
2812                 #include <stdio.h>
2813                 #include <sys/types.h>
2814                 #include <sys/socket.h>
2815                 #include <ifaddrs.h>
2816         ], [
2817                 getifaddrs(NULL);
2818         ], [
2819                 # Yes, we have it...
2820                 AC_MSG_RESULT(yes)
2821                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
2822         ], [
2823                 AC_MSG_RESULT(no)
2824         ])
2825         dnl **********************************
2826         dnl *** Check for if_nametoindex   ***
2827         dnl **********************************
2828         AC_MSG_CHECKING(for if_nametoindex)
2829                 AC_TRY_LINK([
2830                 #include <stdio.h>
2831                 #include <sys/types.h>
2832                 #include <sys/socket.h>
2833                 #include <net/if.h>
2834         ], [
2835                 if_nametoindex(NULL);
2836         ], [
2837                 # Yes, we have it...
2838                 AC_MSG_RESULT(yes)
2839                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
2840         ], [
2841                 AC_MSG_RESULT(no)
2842         ])
2843         dnl **********************************
2844         dnl *** Check for access ***
2845         dnl **********************************
2846         AC_MSG_CHECKING(for access)
2847                 AC_TRY_LINK([
2848                 #include <unistd.h>
2849         ], [
2850                 access(NULL,0);
2851         ], [
2852                 # Yes, we have it...
2853                 AC_MSG_RESULT(yes)
2854                 AC_DEFINE(HAVE_ACCESS, 1, [Have access])
2855         ], [
2856                 AC_MSG_RESULT(no)
2857         ])
2858                         
2859         dnl **********************************
2860         dnl *** Checks for proclib         ***
2861         dnl **********************************
2862         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.)])
2863         dnl **********************************
2864         dnl *** Checks for MonoPosixHelper ***
2865         dnl **********************************
2866         AC_CHECK_HEADERS(checklist.h)
2867         AC_CHECK_HEADERS(pathconf.h)
2868         AC_CHECK_HEADERS(fstab.h)
2869         AC_CHECK_HEADERS(attr/xattr.h)
2870         AC_CHECK_HEADERS(sys/extattr.h)
2871         AC_CHECK_HEADERS(sys/sendfile.h)
2872         AC_CHECK_HEADERS(sys/statvfs.h)
2873         AC_CHECK_HEADERS(sys/statfs.h)
2874         AC_CHECK_HEADERS(sys/vfstab.h)
2875         AC_CHECK_HEADERS(sys/xattr.h)
2876         AC_CHECK_HEADERS(sys/mman.h)
2877         AC_CHECK_HEADERS(sys/param.h)
2878         AC_CHECK_HEADERS(sys/mount.h, [], [],
2879                 [
2880                 #ifdef HAVE_SYS_PARAM_H
2881                 # include <sys/param.h>
2882                 #endif
2883                 ])
2884         AC_CHECK_HEADERS(sys/mount.h)
2885         AC_CHECK_FUNCS(confstr)
2886         AC_CHECK_FUNCS(seekdir telldir)
2887         AC_CHECK_FUNCS(getdomainname)
2888         AC_CHECK_FUNCS(setdomainname)
2889         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
2890         AC_CHECK_FUNCS(setgroups)
2891         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
2892         AC_CHECK_FUNCS(getfsstat)
2893         AC_CHECK_FUNCS(lutimes futimes)
2894         AC_CHECK_FUNCS(mremap)
2895         AC_CHECK_FUNCS(remap_file_pages)
2896         AC_CHECK_FUNCS(posix_fadvise)
2897         AC_CHECK_FUNCS(posix_fallocate)
2898         AC_CHECK_FUNCS(posix_madvise)
2899         AC_CHECK_FUNCS(vsnprintf)
2900         AC_CHECK_FUNCS(sendfile)
2901         AC_CHECK_FUNCS(gethostid sethostid)
2902         AC_CHECK_FUNCS(sethostname)
2903         AC_CHECK_FUNCS(statfs)
2904         AC_CHECK_FUNCS(fstatfs)
2905         AC_CHECK_FUNCS(statvfs)
2906         AC_CHECK_FUNCS(fstatvfs)
2907         AC_CHECK_FUNCS(stime)
2908         AC_CHECK_FUNCS(ttyname_r)
2909         AC_CHECK_FUNCS(psignal)
2910         AC_CHECK_FUNCS(getlogin_r)
2911         AC_CHECK_FUNCS(lockf)
2912         AC_CHECK_FUNCS(swab)
2913         AC_CHECK_FUNCS(setusershell endusershell)
2914         AC_CHECK_FUNCS(futimens utimensat)
2915         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
2916         AC_CHECK_FUNCS(readv writev preadv pwritev)
2917         AC_CHECK_FUNCS(setpgid)
2918         AC_CHECK_FUNCS(system)
2919         AC_CHECK_FUNCS(fork execv execve)
2920         AC_CHECK_FUNCS(waitpid)
2921         AC_CHECK_FUNCS(accept4)
2922         AC_CHECK_FUNCS(localtime_r)
2923         AC_CHECK_FUNCS(mkdtemp)
2924         AC_CHECK_SIZEOF(size_t)
2925         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
2926                 [#include <sys/types.h>
2927                  #include <sys/stat.h>
2928                  #include <unistd.h>])
2929         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
2930                 [#include <sys/types.h>
2931                  #include <sys/stat.h>
2932                  #include <unistd.h>])
2933         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
2934                 [#include <sys/time.h>])
2935         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
2936                 [#include <sys/socket.h>])
2937         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
2938                 [#include <unistd.h>
2939                  #include <fcntl.h>])
2940         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
2941                 [#include <sys/uio.h>])
2942         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
2943                 [#include <sys/socket.h>])
2944         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
2945                 [#include <sys/poll.h>])
2946         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
2947                 [#include <sys/socket.h>])
2948         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
2949                 [#include <sys/socket.h>])
2950         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
2951                 [#include <netinet/in.h>])
2952         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
2953                 [#include <netinet/in.h>])
2954         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
2955                 [#include <sys/un.h>])
2956         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
2957                 [#include <sys/types.h>
2958                  #include <sys/stat.h>
2959                  #include <unistd.h>])
2960         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
2961                 [#include <time.h>])
2962         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
2963                 [#include <sys/time.h>
2964                  #include <sys/types.h>
2965                  #include <utime.h>])
2966         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
2967                 [#include <sys/time.h>])
2968         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
2969                 [#include <sys/types.h>
2970                  #include <utime.h>])
2971         AC_CHECK_MEMBERS(
2972                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
2973                 [#include <sys/types.h>
2974                  #include <dirent.h>])
2975         AC_CHECK_MEMBERS(
2976                 [struct passwd.pw_gecos],,, 
2977                 [#include <sys/types.h>
2978                  #include <pwd.h>])
2979         AC_CHECK_MEMBERS(
2980                 [struct statfs.f_flags],,, 
2981                 [#include <sys/types.h>
2982                  #include <sys/vfs.h>])
2983         AC_CHECK_MEMBERS(
2984                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
2985                 [#include <sys/types.h>
2986                  #include <sys/stat.h>
2987                  #include <unistd.h>])
2989         dnl Favour xattr through glibc, but use libattr if we have to
2990         AC_CHECK_FUNC(lsetxattr, ,
2991                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
2992         )
2993         AC_SUBST(XATTR_LIB)
2995         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
2996         AC_CHECK_MEMBERS(
2997                 [struct kinfo_proc.kp_proc],,, 
2998                 [#include <sys/types.h>
2999                  #include <sys/param.h>
3000                  #include <sys/sysctl.h>
3001                  #include <sys/proc.h>
3002                  ])
3004         dnl *********************************
3005         dnl *** Checks for Windows compilation ***
3006         dnl *********************************
3007         AC_CHECK_HEADERS(sys/time.h)
3008         AC_CHECK_HEADERS(sys/param.h)
3009         AC_CHECK_HEADERS(dirent.h)
3011         dnl ******************************************
3012         dnl *** Checks for OSX and iOS compilation ***
3013         dnl ******************************************
3014         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
3016         dnl *********************************
3017         dnl *** Check for Console 2.0 I/O ***
3018         dnl *********************************
3019         AC_CHECK_HEADERS([curses.h])
3020         AC_CHECK_HEADERS([term.h], [], [],
3021         [#if HAVE_CURSES_H
3022          #include <curses.h>
3023          #endif
3024         ])
3025         AC_CHECK_HEADERS([termios.h])
3027         dnl *********************************
3028         dnl *** Checks for random         ***
3029         dnl *********************************
3030         if test x$host_darwin = xno; then
3031                 AC_CHECK_HEADERS(sys/random.h)
3032                 AC_CHECK_FUNCS(getrandom getentropy)
3033         fi
3035         dnl *********************************
3036         dnl *** Checks for Mono.Native  ***
3037         dnl *********************************
3039         AC_MSG_CHECKING(for linux/in.h)
3040         AC_TRY_COMPILE([
3041                 #include <sys/socket.h>
3042                 #include <linux/in.h>
3043         ], [
3044         ],[
3045                 AC_MSG_RESULT(yes)
3046                 AC_DEFINE(HAVE_LINUX_IN_H, 1, [linux/in.h])
3047         ], [
3048                 AC_MSG_RESULT(no)
3049         ])
3051         AC_MSG_CHECKING(for struct in_pktinfo)
3052         AC_TRY_COMPILE([
3053                 #ifdef HAVE_LINUX_IN_H
3054                 #include <sys/socket.h>
3055                 #include <linux/in.h>
3056                 #else
3057                 #include <netinet/in.h>
3058                 #endif
3059         ], [
3060                 struct in_pktinfo pktinfo;
3061         ],[
3062                 AC_MSG_RESULT(yes)
3063                 AC_DEFINE(HAVE_IN_PKTINFO, 1, [struct in_pktinfo])
3064         ], [
3065                 AC_MSG_RESULT(no)
3066         ])
3068         AC_MSG_CHECKING(for struct ip_mreqn)
3069         AC_TRY_COMPILE([
3070                 #if HAVE_LINUX_IN_H
3071                 #include <sys/socket.h>
3072                 #include <linux/in.h>
3073                 #else
3074                 #include <netinet/in.h>
3075                 #endif
3076         ], [
3077                 struct ip_mreqn mreqn;
3078         ],[
3079                 AC_MSG_RESULT(yes)
3080                 AC_DEFINE(HAVE_IP_MREQN, 1, struct ip_mreqn)
3081         ], [
3082                 AC_MSG_RESULT(no)
3083         ])
3085         if test x$host_darwin = xno; then
3086                 AC_CHECK_TYPES([struct flock64], [AC_DEFINE(HAVE_FLOCK64, 1, struct flock64)], , [#include <fcntl.h>])
3087         fi
3089         if test x$mono_native_platform_ios = xno; then
3090                 # On iOS, `stat64()` is deprecated and there is no `struct stat64` and `stat()`
3091                 # is either 32-bit or 64-bit based on the device / simulator that you're running on.
3092                 AC_CHECK_FUNC(stat64,            [AC_DEFINE(HAVE_STAT64, 1, [stat64])])
3093         fi
3095         AC_CHECK_FUNC(lseek64,           [AC_DEFINE(HAVE_LSEEK64, 1, [lseek64])])
3096         AC_CHECK_FUNC(mmap64,            [AC_DEFINE(HAVE_MMAP64, 1, [mmap64])])
3097         AC_CHECK_FUNC(ftruncate64,       [AC_DEFINE(HAVE_FTRUNCATE64, 1, [ftruncate64])])
3098         AC_CHECK_FUNC(posix_fadvise64,   [AC_DEFINE(HAVE_POSIX_FADVISE64, 1, [posix_fadvise64])])
3099         AC_CHECK_DECL(pipe2,             [AC_DEFINE(HAVE_PIPE2, 1, [pipe2])])
3100         AC_CHECK_FUNC(getmntinfo,        [AC_DEFINE(HAVE_GETMNTINFO, 1, [getmntinfo])], [], [[#include <unistd.h>]])
3101         AC_CHECK_FUNC(strcpy_s,          [AC_DEFINE(HAVE_STRCPY_S, 1, [strcpy_s])])
3102         AC_CHECK_FUNC(strlcpy,           [AC_DEFINE(HAVE_STRLCPY, 1, [strlcpy])])
3103         AC_CHECK_FUNC(posix_fadvise,     [AC_DEFINE(HAVE_POSIX_FADVISE, 1, [posix_fadvise])])
3104         AC_CHECK_FUNC(ioctl,             [AC_DEFINE(HAVE_IOCTL, 1, [ioctl])])
3105         AC_CHECK_FUNC(sched_getaffinity, [AC_DEFINE(HAVE_SCHED_GETAFFINITY, 1, [sched_getaffinity])])
3106         AC_CHECK_FUNC(sched_setaffinity, [AC_DEFINE(HAVE_SCHED_SETAFFINITY, 1, [sched_setaffinity])])
3107         AC_CHECK_DECL(TIOCGWINSZ,        [AC_DEFINE(HAVE_TIOCGWINSZ, 1, [TIOCGWINSZ])], [], [[#include <sys/ioctl.h>]])
3108         AC_CHECK_FUNC(tcgetattr,         [AC_DEFINE(HAVE_TCGETATTR, 1, [tcgetattr])])
3109         AC_CHECK_FUNC(tcsetattr,         [AC_DEFINE(HAVE_TCSETATTR, 1, [tcsetattr])])
3110         AC_CHECK_FUNC(arc4random,        [AC_DEFINE(HAVE_ARC4RANDOM, 1, [arc4random])])
3111         AC_CHECK_DECL(ECHO,              [AC_DEFINE(HAVE_ECHO, 1, [ECHO])], [], [[#include <termios.h>]])
3112         AC_CHECK_DECL(ICANON,            [AC_DEFINE(HAVE_ICANON, 1, [ICANON])], [], [[#include <termios.h>]])
3113         AC_CHECK_DECL(TCSANOW,           [AC_DEFINE(HAVE_TCSANOW, 1, [TCSANOW])], [], [[#include <termios.h>]])
3115         AC_CHECK_DECL(O_CLOEXEC,         [AC_DEFINE(HAVE_O_CLOEXEC, 1, [O_CLOEXEC])], [], [[#include <fcntl.h>]])
3116         AC_CHECK_DECL(F_DUPFD_CLOEXEC,   [AC_DEFINE(HAVE_F_DUPFD_CLOEXEC, 1, [F_DUPFD_CLOEXEC])], [], [[#include <fcntl.h>]])
3118         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>]])
3119         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>]])
3120         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>]])
3121         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>]])
3122         AC_CHECK_MEMBER(struct dirent.d_namlen,       [AC_DEFINE(HAVE_DIRENT_NAME_LEN, 1, [struct dirent.d_namlen])], [], [[#include <dirent.h>]])
3123         AC_CHECK_MEMBER(struct statfs.f_fstypename,   [AC_DEFINE(HAVE_STATFS_FSTYPENAME, 1, [struct statfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3124         AC_CHECK_MEMBER(struct statvfs.f_fstypename,  [AC_DEFINE(HAVE_STATVFS_FSTYPENAME, 1, [struct statvfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3126         AC_MSG_CHECKING(for struct statfs)
3127         AC_TRY_COMPILE([
3128                 #if defined(HAVE_STATFS_FSTYPENAME) || defined(HAVE_STATVFS_FSTYPENAME)
3129                 #include <sys/mount.h>
3130                 #else
3131                 #include <sys/statfs.h>
3132                 #endif
3133         ], [
3134                 struct statfs;
3135         ],[
3136                 AC_MSG_RESULT(yes)
3137                 AC_DEFINE(HAVE_STATFS, 1, [struct statfs])
3138         ], [
3139                 AC_MSG_RESULT(no)
3140         ])
3142         if test "x$ac_cv_func_strerror_r_char_p" = "xyes" ; then
3143                 AC_DEFINE(HAVE_GNU_STRERROR_R, 1, [char* strerror(int errnum, char *buf, size_t buflen)])
3144         fi
3146         AC_MSG_CHECKING(for readdir_r)
3147         AC_TRY_COMPILE([
3148                 #include <dirent.h>
3149         ], [
3150                 DIR* dir;
3151                 struct dirent* entry;
3152                 struct dirent* result;
3153                 readdir_r(dir, entry, &result);
3154         ],[
3155                 AC_MSG_RESULT(yes)
3156                 AC_DEFINE(HAVE_READDIR_R, 1, [readdir_r])
3157         ], [
3158                 AC_MSG_RESULT(no)
3159         ])
3161         AC_MSG_CHECKING(for kevent with void *data)
3162         AC_TRY_COMPILE([
3163                 #include <sys/types.h>
3164                 #include <sys/event.h>
3165         ], [
3166                 struct kevent event;
3167                 void* data;
3168                 EV_SET(&event, 0, EVFILT_READ, 0, 0, 0, data);
3169         ],[
3170                 AC_MSG_RESULT(yes)
3171                 AC_DEFINE(KEVENT_HAS_VOID_UDATA, 1, [kevent with void *data])
3172         ], [
3173                 AC_MSG_RESULT(no)
3174         ])
3176         AC_CHECK_MEMBER(struct fd_set.fds_bits,   [AC_DEFINE(HAVE_FDS_BITS, 1, [struct fd_set.fds_bits])], [], [[#include <sys/select.h>]])
3177         AC_CHECK_MEMBER(struct fd_set.__fds_bits, [AC_DEFINE(HAVE_PRIVATE_FDS_BITS, 1, [struct fd_set.__fds_bits])], [], [[#include <sys/select.h>]])
3179         AC_MSG_CHECKING(for sendfile with 4 arguments)
3180         AC_TRY_COMPILE([
3181                 #include <sys/sendfile.h>
3182         ], [
3183                 int result = sendfile(0, 0, 0, 0);
3184         ],[
3185                 AC_MSG_RESULT(yes)
3186                 AC_DEFINE(HAVE_SENDFILE_4, 1, [sendfile with 4 arguments])
3187         ], [
3188                 AC_MSG_RESULT(no)
3189         ])
3191         AC_MSG_CHECKING(for sendfile with 6 arguments)
3192         AC_TRY_LINK([
3193                 #include <stdlib.h>
3194                 #include <sys/types.h>
3195                 #include <sys/socket.h>
3196                 #include <sys/uio.h>
3197         ], [
3198                 int result = sendfile(0, 0, 0, NULL, NULL, 0);
3199         ],[
3200                 AC_MSG_RESULT(yes)
3201                 AC_DEFINE(HAVE_SENDFILE_6, 1, [sendfile with 6 arguments])
3202         ], [
3203                 AC_MSG_RESULT(no)
3204         ])
3206         AC_CHECK_FUNC(fcopyfile,     [AC_DEFINE(HAVE_FCOPYFILE, 1, [fcopyfile])])
3207         AC_CHECK_FUNC(epoll_create1, [AC_DEFINE(HAVE_EPOLL, 1, [epoll_create1])])
3208         AC_CHECK_FUNC(accept4,       [AC_DEFINE(HAVE_ACCEPT4, 1, [accept4])])
3209         AC_CHECK_FUNC(kqueue,        [AC_DEFINE(HAVE_KQUEUE, 1, [kqueue])])
3211         ORIG_CFLAGS="$CFLAGS"
3212         CFLAGS="-Werror -Wsign-conversion"
3214         AC_MSG_CHECKING(for getnameinfo with signed flags)
3215         AC_TRY_COMPILE([
3216                 #include <sys/types.h>
3217                 #include <netdb.h>
3218         ], [
3219                 const struct sockaddr *addr;
3220                 socklen_t addrlen;
3221                 char *host;
3222                 socklen_t hostlen;
3223                 char *serv;
3224                 socklen_t servlen;
3225                 int flags;
3226                 int result = getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags);
3227         ],[
3228                 AC_MSG_RESULT(yes)
3229                 AC_DEFINE(HAVE_GETNAMEINFO_SIGNED_FLAGS, 1, [getnameinfo with signed flags])
3230         ], [
3231                 AC_MSG_RESULT(no)
3232         ])
3234         CFLAGS="$ORIG_CFLAGS"
3236         if test "x$host_linux" = "xyes"; then
3237                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 1, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3238         else
3239                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 0, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3240         fi
3242         ORIG_CFLAGS="$CFLAGS"
3243         CFLAGS="-Werror -Wsign-conversion"
3245         AC_MSG_CHECKING(for bind with unsigned addrlen)
3246         AC_TRY_COMPILE([
3247                 #include <sys/socket.h>
3248         ], [
3249                 int fd;
3250                 struct sockaddr* addr;
3251                 socklen_t addrLen;
3252                 bind(fd, addr, addrLen);
3253         ],[
3254                 AC_MSG_RESULT(yes)
3255                 AC_DEFINE(BIND_ADDRLEN_UNSIGNED, 1, [bind with unsigned addrlen])
3256         ], [
3257                 AC_MSG_RESULT(no)
3258         ])
3260         AC_MSG_CHECKING(for struct ipv6_mreq with unsigned ipv6mr_interface)
3261         AC_TRY_COMPILE([
3262                 #include <netinet/in.h>
3263                 #include <netinet/tcp.h>
3264         ], [
3265                 struct ipv6_mreq opt;
3266                 unsigned int index = 0;
3267                 opt.ipv6mr_interface = index;
3268         ],[
3269                 AC_MSG_RESULT(yes)
3270                 AC_DEFINE(IPV6MR_INTERFACE_UNSIGNED, 1, [struct ipv6_mreq with unsigned ipv6mr_interface])
3271         ], [
3272                 AC_MSG_RESULT(no)
3273         ])
3275         AC_MSG_CHECKING(for inotify_rm_watch with unsigned wd)
3276         AC_TRY_COMPILE([
3277                 #include <sys/inotify.h>
3278         ], [
3279                 intptr_t fd;
3280                 uint32_t wd;
3281                 int result = inotify_rm_watch(fd, wd);
3282         ],[
3283                 AC_MSG_RESULT(yes)
3284                 AC_DEFINE(INOTIFY_RM_WATCH_WD_UNSIGNED, 1, [inotify_rm_watch with unsigned wd])
3285         ], [
3286                 AC_MSG_RESULT(no)
3287         ])
3289         CFLAGS="$ORIG_CFLAGS"
3291         AC_MSG_CHECKING(for shm_open that works well enough with mmap)
3292         if test "x$ac_cv_func_shm_open" = "xno" -o "x$ac_cv_func_shm_open_working_with_mmap" = "xno" ; then
3293                 AC_MSG_RESULT(no)
3294         else
3295                 AC_TRY_RUN([
3296                         #include <sys/mman.h>
3297                         #include <fcntl.h>
3298                         #include <unistd.h>
3300                         int main ()
3301                         {
3302                                 int fd = shm_open("/mono_configure_shm_open", O_CREAT | O_RDWR, 0777);
3303                                 if (fd == -1)
3304                                         return -1;
3306                                 shm_unlink("/mono_configure_shm_open");
3308                                 // NOTE: PROT_EXEC and MAP_PRIVATE don't work well with shm_open
3309                                 //       on at least the current version of Mac OS X
3311                                 if (mmap(NULL, 1, PROT_EXEC, MAP_PRIVATE, fd, 0) == MAP_FAILED)
3312                                         return -1;
3314                                 return 0;
3315                         }
3316                 ],[
3317                         AC_MSG_RESULT(yes)
3318                         AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3319                 ], [
3320                         AC_MSG_RESULT(no)
3321                 ])
3322         fi
3324         AC_MSG_CHECKING(for getpriority with int who)
3325         AC_TRY_COMPILE([
3326                 #include <sys/resource.h>
3327         ], [
3328                 int which;
3329                 int who;
3330                 int result = getpriority(which, who);
3331         ],[
3332                 AC_MSG_RESULT(yes)
3333                 AC_DEFINE(PRIORITY_REQUIRES_INT_WHO, 1, [getpriority with int who])
3334         ], [
3335                 AC_MSG_RESULT(no)
3336         ])
3338         AC_MSG_CHECKING(for kevent with int parameters)
3339         AC_TRY_COMPILE([
3340                 #include <sys/types.h>
3341                 #include <sys/event.h>
3342         ], [
3343                 int kg;
3344                 const struct kevent* chagelist;
3345                 int nchanges;
3346                 struct kevent* eventlist;
3347                 int nevents;
3348                 const struct timespec* timeout;
3349                 int result = kevent(kg, chagelist, nchanges, eventlist, nevents, timeout);
3350         ],[
3351                 AC_MSG_RESULT(yes)
3352                 AC_DEFINE(KEVENT_REQUIRES_INT_PARAMS, 1, [kevent with int parameters])
3353         ], [
3354                 AC_MSG_RESULT(no)
3355         ])
3357         ORIG_CFLAGS="$CFLAGS"
3358         CFLAGS="-Werror -Wimplicit-function-declaration"
3360         AC_MSG_CHECKING(for mkstemps)
3361         AC_TRY_COMPILE([
3362                 #include <stdlib.h>
3363                 #include <unistd.h>
3364                 #include <string.h>
3365         ], [
3366                 char *template;
3367                 int suffixlen;
3368                 int result = mkstemps(template, suffixlen);
3369         ],[
3370                 AC_MSG_RESULT(yes)
3371                 AC_DEFINE(HAVE_MKSTEMPS, 1, [mkstemps])
3372                 have_mkstemps=yes
3373         ], [
3374                 AC_MSG_RESULT(no)
3375         ])
3377         CFLAGS="$ORIG_CFLAGS"
3379         if test "x$have_mkstemps" != "xyes" -a "x$ac_cv_func_mkstemp" != "xyes"; then
3380                 AC_MSG_ERROR([Cannot find mkstemps or mkstemp on this platform])
3381         fi
3383         AC_MSG_CHECKING(for tcp/var.h)
3384         AC_TRY_COMPILE([
3385                 #include <sys/types.h>
3386                 #include <sys/socketvar.h>
3387                 #include <netinet/ip.h>
3388                 #include <netinet/tcp.h>
3389                 #include <netinet/tcp_var.h>
3390         ], [
3391         ],[
3392                 AC_MSG_RESULT(yes)
3393                 AC_DEFINE(HAVE_TCP_VAR_H, 1, [tcp/var.h])
3394         ], [
3395                 AC_MSG_RESULT(no)
3396         ])
3398         AC_CHECK_HEADERS([sys/cdefs.h])
3400         AC_MSG_CHECKING(for TCPSTATE enum in netinet/tcp.h)
3401         AC_TRY_COMPILE([
3402                 #ifdef HAVE_SYS_CDEFS_H
3403                 #include <sys/cdefs.h>
3404                 #endif
3405                 #include <netinet/tcp.h>
3406         ], [
3407                 int result = TCP_ESTABLISHED;
3408         ],[
3409                 AC_MSG_RESULT(yes)
3410                 AC_DEFINE(HAVE_TCP_H_TCPSTATE_ENUM, 1, [TCPSTATE enum in netinet/tcp.h])
3411         ], [
3412                 AC_MSG_RESULT(no)
3413         ])
3415         AC_CHECK_DECL(TCPS_ESTABLISHED, [AC_DEFINE(HAVE_TCP_FSM_H, 1, [HAVE_TCP_FSM_H])], [], [[#include <netinet/tcp_fsm.h>]])
3417         AC_MSG_CHECKING(for struct rt_msghdr)
3418         AC_TRY_COMPILE([
3419                 #include <sys/types.h>
3420                 #include <net/route.h>
3421         ], [
3422                 struct rt_msghdr;
3423         ],[
3424                 AC_MSG_RESULT(yes)
3425                 AC_DEFINE(HAVE_RT_MSGHDR, 1, [struct rt_msghdr])
3426         ], [
3427                 AC_MSG_RESULT(no)
3428         ])
3430         AC_CHECK_HEADERS([sys/sysctl.h])
3431         AC_CHECK_HEADERS([linux/rtnetlink.h])
3433         AC_CHECK_FUNC(getpeereid,    [AC_DEFINE(HAVE_GETPEEREID, 1, [getpeereid])])
3434         AC_CHECK_FUNC(getdomainname, [AC_DEFINE(HAVE_GETDOMAINNAME, 1, [getdomainname])])
3435         AC_CHECK_FUNC(uname,         [AC_DEFINE(HAVE_UNAME, 1, [uname])])
3437         ORIG_CFLAGS="$CFLAGS"
3438         CFLAGS="-Werror -Weverything"
3440         AC_MSG_CHECKING(for getdomainname with size_t namelen)
3441         AC_TRY_COMPILE([
3442                 #include <unistd.h>
3443         ], [
3444                 size_t namelen = 20;
3445                 char name[20];
3446                 int result = getdomainname(name, namelen);
3447         ],[
3448                 AC_MSG_RESULT(yes)
3449                 AC_DEFINE(HAVE_GETDOMAINNAME_SIZET, 1, [getdomainname with size_t namelen])
3450         ], [
3451                 AC_MSG_RESULT(no)
3452         ])
3454         CFLAGS="$ORIG_CFLAGS"
3456         AC_CHECK_FUNC(inotify_init, [AC_DEFINE(HAVE_INOTIFY_INIT, 1, [inotify_init])])
3457         AC_CHECK_FUNC(inotify_add_watch, [AC_DEFINE(HAVE_INOTIFY_ADD_WATCH, 1, [inotify_add_watch])])
3458         AC_CHECK_FUNC(inotify_rm_watch, [AC_DEFINE(HAVE_INOTIFY_RM_WATCH, 1, [inotify_rm_watch])])
3460         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
3461                 AC_DEFINE(HAVE_INOTIFY, 1, [HAVE_INOTIFY])
3462         elif test "x$host_linux" = "xyes"; then
3463                 AC_MSG_ERROR([Cannot find inotify functions on a Linux platform.])
3464         fi
3466         AC_CHECK_HEADERS([crt_externs.h])
3468         AC_MSG_CHECKING(for _NSGetEnviron)
3469         AC_TRY_COMPILE([
3470                 #include <crt_externs.h>
3471         ], [
3472                 char **result = *(_NSGetEnviron());
3473         ],[
3474                 AC_MSG_RESULT(yes)
3475                 AC_DEFINE(HAVE_NSGETENVIRON, 1, [_NSGetEnviron])
3476         ], [
3477                 AC_MSG_RESULT(no)
3478         ])
3480         AC_CHECK_DECL(IN_EXCL_UNLINK, [AC_DEFINE(HAVE_IN_EXCL_UNLINK, 1, [IN_EXCL_UNLINK])], [], [[#include <sys/inotify.h>]])
3482 else
3483         dnl *********************************
3484         dnl *** Checks for Windows compilation ***
3485         dnl *********************************
3486         AC_CHECK_HEADERS(winternl.h)
3488         jdk_headers_found=no
3489         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
3490         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
3491         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
3492         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
3493         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
3494         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
3495         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
3497         dnl *********************************
3498         dnl *** Check for struct ip_mreqn ***
3499         dnl *********************************
3500         AC_MSG_CHECKING(for struct ip_mreqn)
3501         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3502                 struct ip_mreqn mreq;
3503                 mreq.imr_address.s_addr = 0;
3504         ], [
3505                 # Yes, we have it...
3506                 AC_MSG_RESULT(yes)
3507                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
3508         ], [
3509                 # We'll just have to try and use struct ip_mreq
3510                 AC_MSG_RESULT(no)
3511                 AC_MSG_CHECKING(for struct ip_mreq)
3512                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3513                         struct ip_mreq mreq;
3514                         mreq.imr_interface.s_addr = 0;
3515                 ], [
3516                         # Yes, we have it...
3517                         AC_MSG_RESULT(yes)
3518                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
3519                 ], [
3520                         # No multicast support
3521                         AC_MSG_RESULT(no)
3522                 ])
3523         ])
3525         dnl **********************************
3526         dnl *** Check for getaddrinfo ***
3527         dnl **********************************
3528         AC_MSG_CHECKING(for getaddrinfo)
3529                 AC_TRY_LINK([
3530                 #include <stdio.h>
3531                 #include <winsock2.h>
3532                 #include <ws2tcpip.h>
3533         ], [
3534                 getaddrinfo(NULL,NULL,NULL,NULL);
3535         ], [
3536                 # Yes, we have it...
3537                 AC_MSG_RESULT(yes)
3538                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
3539         ], [
3540                 AC_MSG_RESULT(no)
3541         ])
3543         dnl **********************************
3544         dnl *** Check for gethostbyname ***
3545         dnl **********************************
3546         AC_MSG_CHECKING(for gethostbyname)
3547                 AC_TRY_LINK([
3548                 #include <stdio.h>
3549                 #include <winsock2.h>
3550                 #include <ws2tcpip.h>
3551         ], [
3552                 gethostbyname(NULL);
3553         ], [
3554                 # Yes, we have it...
3555                 AC_MSG_RESULT(yes)
3556                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
3557         ], [
3558                 AC_MSG_RESULT(no)
3559         ])
3561         dnl **********************************
3562         dnl *** Check for getprotobyname ***
3563         dnl **********************************
3564         AC_MSG_CHECKING(for getprotobyname)
3565                 AC_TRY_LINK([
3566                 #include <stdio.h>
3567                 #include <winsock2.h>
3568                 #include <ws2tcpip.h>
3569         ], [
3570                 getprotobyname(NULL);
3571         ], [
3572                 # Yes, we have it...
3573                 AC_MSG_RESULT(yes)
3574                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
3575         ], [
3576                 AC_MSG_RESULT(no)
3577         ])
3579         dnl **********************************
3580         dnl *** Check for getnameinfo ***
3581         dnl **********************************
3582         AC_MSG_CHECKING(for getnameinfo)
3583                 AC_TRY_LINK([
3584                 #include <stdio.h>
3585                 #include <winsock2.h>
3586                 #include <ws2tcpip.h>
3587         ], [
3588                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
3589         ], [
3590                 # Yes, we have it...
3591                 AC_MSG_RESULT(yes)
3592                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
3593         ], [
3594                 AC_MSG_RESULT(no)
3595         ])
3597         dnl **********************************
3598         dnl *** Check for inet_ntop ***
3599         dnl **********************************
3600         AC_MSG_CHECKING(for inet_ntop)
3601                 AC_TRY_LINK([
3602                 #include <stdio.h>
3603                 #include <winsock2.h>
3604                 #include <ws2tcpip.h>
3605         ], [
3606                 inet_ntop (0, NULL, NULL, 0);
3607         ], [
3608                 # Yes, we have it...
3609                 AC_MSG_RESULT(yes)
3610                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
3611         ], [
3612                 AC_MSG_RESULT(no)
3613         ])
3615         dnl **********************************
3616         dnl *** Check for inet_pton ***
3617         dnl **********************************
3618         AC_MSG_CHECKING(for inet_pton)
3619                 AC_TRY_LINK([
3620                 #include <stdio.h>
3621                 #include <winsock2.h>
3622                 #include <ws2tcpip.h>
3623         ], [
3624                 #ifndef inet_pton
3625                 (void) inet_pton;
3626                 #endif
3627                 inet_pton (0, NULL, NULL);
3628         ], [
3629                 # Yes, we have it...
3630                 AC_MSG_RESULT(yes)
3631                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
3632         ], [
3633                 AC_MSG_RESULT(no)
3634         ])
3636         AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
3637         AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
3638         AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
3639         AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
3640         AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
3641         AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
3642         AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
3645 dnl socklen_t check
3646 AC_MSG_CHECKING(for socklen_t)
3647 AC_TRY_COMPILE([
3648 #include <sys/types.h>
3649 #include <sys/socket.h>
3651   socklen_t foo;
3653 ac_cv_c_socklen_t=yes
3654         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
3655         AC_MSG_RESULT(yes)
3657         AC_MSG_RESULT(no)
3660 AC_CHECK_FUNCS(execvp)
3662 dnl ****************************
3663 dnl *** Look for /dev/random ***
3664 dnl ****************************
3666 AC_MSG_CHECKING([if usage of random device is requested])
3667 AC_ARG_ENABLE(dev-random,
3668 [  --disable-dev-random    disable the use of the random device (enabled by default)],
3669 try_dev_random=$enableval, try_dev_random=yes)
3671 AC_MSG_RESULT($try_dev_random)
3673 case "{$build}" in
3675 dnl IBM i does not have /dev/random, use unblocking only
3677     *-*-os400*)
3678     NAME_DEV_RANDOM="/dev/urandom"
3679     ;;
3681 dnl Win32 does not have /dev/random, they have their own method...
3683     *-mingw*|*-*-cygwin*)
3684     ac_cv_have_dev_random=no
3685     ;;
3687 dnl Everywhere else, it's /dev/random
3689     *)
3690     NAME_DEV_RANDOM="/dev/random"
3691     ;;
3692 esac
3694 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
3696 dnl Now check if the device actually exists
3698 if test "x$try_dev_random" = "xyes"; then
3699     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
3700     [if test -r "$NAME_DEV_RANDOM" ; then
3701         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
3702     if test "x$ac_cv_have_dev_random" = "xyes"; then
3703         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
3704     fi
3705 else
3706     AC_MSG_CHECKING(for random device)
3707     ac_cv_have_dev_random=no
3708     AC_MSG_RESULT(has been disabled)
3711 if test "x$host_win32" = "xyes"; then
3712     AC_DEFINE(HAVE_CRYPT_RNG)
3715 if test "x$ac_cv_have_dev_random" = "xno" \
3716     && test "x$host_win32" = "xno"; then
3717     AC_MSG_WARN([[
3719 *** A system-provided entropy source was not found on this system.
3720 *** Because of this, the System.Security.Cryptography random number generator
3721 *** will throw a NotImplemented exception.
3723 *** If you are seeing this message, and you know your system DOES have an
3724 *** entropy collection in place, please report an issue on GitHub and
3725 *** provide information about the system and how to access the random device.
3727 *** Otherwise you can install either egd or prngd and set the environment
3728 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
3729 ***]])
3732 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)
3734 AC_MSG_CHECKING([if big-arrays are to be enabled])
3735 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)
3736 if test "x$enable_big_arrays" = "xyes" ; then
3737     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
3738         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
3739     else
3740         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
3741     fi
3743 AC_MSG_RESULT($enable_big_arrays)
3745 dnl **************
3746 dnl *** DTRACE ***
3747 dnl **************
3749 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
3751 if test "x$enable_dtrace" = "xyes"; then
3752    if test "x$has_dtrace" = "xno"; then
3753           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
3754    fi
3755    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
3756    if test "x$DTRACE" = "xno"; then
3757           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
3758           enable_dtrace=no
3759    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
3760           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
3761           enable_dtrace=no
3762    fi
3765 dtrace_g=no
3766 if test "x$enable_dtrace" = "xyes"; then
3767         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
3768         DTRACEFLAGS=
3769         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3770                 case "$host" in
3771                         powerpc-*-darwin*)
3772                         DTRACEFLAGS="-arch ppc64"
3773                         ;;
3774                         i*86-*-darwin*)
3775                         DTRACEFLAGS="-arch x86_64"
3776                         ;;
3777                         *)
3778                         DTRACEFLAGS=-64
3779                         ;;
3780                 esac
3781         else
3782                 case "$host" in
3783                         powerpc-*-darwin*)
3784                         DTRACEFLAGS="-arch ppc"
3785                         ;;
3786                         i*86-*-darwin*)
3787                         DTRACEFLAGS="-arch i386"
3788                         ;;
3789                         *)
3790                         DTRACEFLAGS=-32
3791                         ;;
3792                 esac
3793         fi
3794         AC_SUBST(DTRACEFLAGS)
3795         case "$host" in
3796                 *-*-solaris*)
3797                 dtrace_g=yes
3798                 ;;
3799         esac
3800         AC_CHECK_HEADERS([sys/sdt.h])
3802 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
3803 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
3805 dnl **************************
3806 dnl *** AOT cross offsets  ***
3807 dnl **************************
3809 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
3810     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
3812 dnl **************
3813 dnl ***  LLVM  ***
3814 dnl **************
3816 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
3817 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
3818 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)
3819 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
3820 AC_ARG_ENABLE(llvm-asserts,[  --enable-llvm-asserts Enable llvm asserts (option to LLVM in CMake)], enable_llvm_asserts=$enableval, enable_llvm_asserts=no)
3822 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
3824 if test "x$enable_llvm" = "xdefault"; then
3825    enable_llvm=$enable_llvm_default
3828 internal_llvm="no"
3829 if test "x$enable_llvm" = "xyes"; then
3830         if test "x$with_llvm" != "x"; then
3831                 EXTERNAL_LLVM_CONFIG=$with_llvm/bin/llvm-config
3832                 if test x$host_win32 = xyes; then
3833                         EXTERNAL_LLVM_CONFIG=$EXTERNAL_LLVM_CONFIG.exe
3834                 fi
3835                 if test ! -x $EXTERNAL_LLVM_CONFIG; then
3836                         AC_MSG_ERROR([LLVM executable $EXTERNAL_LLVM_CONFIG not found.])
3837                 fi
3838         else
3839                 if test x$host_win32 = xyes; then
3840                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config.exe, no)
3841                 else
3842                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config, no)
3843                 fi
3844                 if test "x$EXTERNAL_LLVM_CONFIG" = "xno"; then
3845                         internal_llvm=yes
3846                 fi
3847         fi
3849         LLVM_CODEGEN_LIBS="x86codegen"
3850         case "$target" in
3851         arm*)
3852                 LLVM_CODEGEN_LIBS="armcodegen"
3853                 ;;
3854         aarch64*)
3855                 LLVM_CODEGEN_LIBS="aarch64codegen"
3856                 ;;
3857         powerpc*)
3858                 LLVM_CODEGEN_LIBS="powerpccodegen"
3859                 ;;
3860         esac
3861         if test "x$host" != "x$target"; then
3862                 # No need for jit libs
3863                 LLVM_CODEGEN_LIBS=
3864         fi
3866         AC_SUBST(LLVM_CODEGEN_LIBS)
3867         AC_SUBST(EXTERNAL_LLVM_CONFIG)
3869         if test "x$host_win32" = "xyes" && test "x$cross_compiling" = "xno" &&  test "x$internal_llvm" = "xno"; then
3870                 EXTERNAL_LLVM_CONFIG_WIN32=$(cygpath -m $EXTERNAL_LLVM_CONFIG)
3871                 AC_SUBST(EXTERNAL_LLVM_CONFIG_WIN32)
3872         fi
3873         AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
3874 fi # ENABLE_LLVM
3876 # AC_DEFINE necessary for correct restore behavior on Linux
3877 AM_CONDITIONAL(INTERNAL_LLVM, [test "x$internal_llvm" != "xno"])
3878 if test "x$internal_llvm" != "xno"; then
3879    AC_DEFINE(INTERNAL_LLVM, 1, [LLVM used is being build during mono build])
3882 AM_CONDITIONAL(INTERNAL_LLVM_ASSERTS, [test "x$enable_llvm_asserts" != "xno"])
3883 if test "x$enable_llvm_asserts" != "xno"; then
3884    AC_DEFINE(INTERNAL_LLVM_ASSERTS, 1, [Build LLVM with assertions])
3887 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes])
3889 if test "x$enable_loadedllvm" = "xyes"; then
3890    AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
3892 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes])
3894 if test "x$enable_llvm" = "xyes"; then
3895    enable_llvm_runtime=yes
3897 if test "x$enable_llvm_runtime" = "xyes"; then
3898    AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
3900 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes])
3902 TARGET="unknown"
3903 ACCESS_UNALIGNED="yes"
3905 LIBC="libc.so.6"
3906 INTL="libc.so.6"
3907 SQLITE="libsqlite.so.0"
3908 SQLITE3="libsqlite3.so.0"
3909 X11="libX11.so"
3910 GDKX11="libgdk-x11-2.0.so.0"
3911 GTKX11="libgtk-x11-2.0.so.0"
3912 XINERAMA="libXinerama.so.1"
3914 sizeof_register="SIZEOF_VOID_P"
3916 jit_wanted=true
3917 boehm_supported=true
3918 BTLS_SUPPORTED=no
3919 BTLS_PLATFORM=
3921 case "$host" in
3922         wasm32*)
3923                 TARGET=WASM
3924                 arch_target=wasm
3925                 BTLS_SUPPORTED=no
3926                 ACCESS_UNALIGNED="no"
3927                 with_tls=pthread
3928                 ;;
3929         mips*)
3930                 TARGET=MIPS;
3931                 arch_target=mips;
3932                 with_tls=pthread;
3933                 ACCESS_UNALIGNED="no"
3935                 AC_MSG_CHECKING(for mips n32)
3936                 AC_TRY_COMPILE([],[
3937                 #if _MIPS_SIM != _ABIN32
3938                 #error Not mips n32
3939                 #endif
3940                 ],[
3941                 AC_MSG_RESULT(yes)
3942                 sizeof_register=8
3943                 ],[
3944                 AC_MSG_RESULT(no)
3945                 ])
3946                 ;;
3947         i*86-*-*)
3948                 TARGET=X86;
3949                 arch_target=x86;
3950                 case $host_os in
3951                   solaris*)
3952                         LIBC="libc.so"
3953                         INTL="libintl.so"
3954                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3955                                 TARGET=AMD64
3956                                 arch_target=amd64
3957                         fi
3959                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
3960                         # int astruct __attribute__ ((visibility ("hidden")));
3961                         # void foo ()
3962                         # {
3963                         #       void *p = &astruct;
3964                         # }
3965                         # gcc -fPIC --shared -o libfoo.so foo.c
3966                         # yields:
3967                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
3968                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
3969                         have_visibility_hidden=no
3970                         ;;
3971                   mingw*|cygwin*)
3972                         have_visibility_hidden=no
3973                         BTLS_SUPPORTED=no
3974                         BTLS_PLATFORM=i386
3975                         ;;
3976                   haiku*)
3977                         LIBC=libroot.so
3978                         ;;
3979                   linux*)
3980                         AOT_SUPPORTED="yes"
3981                         BTLS_SUPPORTED=yes
3982                         BTLS_PLATFORM=i386
3983                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3984                         ;;
3985                   darwin*)
3986                         AOT_SUPPORTED="yes"
3987                         BTLS_SUPPORTED=yes
3988                         BTLS_PLATFORM=i386
3989                         ;;
3990                   openbsd*|freebsd*|kfreebsd-gnu*)
3991                         AOT_SUPPORTED="yes"
3992                         BTLS_SUPPORTED=yes
3993                         BTLS_PLATFORM=i386
3994                         ;;
3995                 esac
3996                 ;;
3997         x86_64-*-* | amd64-*-*)
3998                 TARGET=AMD64;
3999                 arch_target=amd64;
4000                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
4001                         AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4002                         sizeof_register=8
4003                 fi
4004                 case $host_os in
4005                   linux*)
4006                         AOT_SUPPORTED="yes"
4007                         BTLS_SUPPORTED=yes
4008                         BTLS_PLATFORM=x86_64
4009                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4010                         ;;
4011                   darwin*)
4012                         AOT_SUPPORTED="yes"
4013                         BTLS_SUPPORTED=yes
4014                         BTLS_PLATFORM=x86_64
4015                         boehm_supported=false
4016                         ;;
4017                   openbsd*|freebsd*|kfreebsd-gnu*)
4018                         AOT_SUPPORTED="yes"
4019                         BTLS_SUPPORTED=yes
4020                         BTLS_PLATFORM=x86_64
4021                         ;;
4022                   mingw*|cygwin*)
4023                         BTLS_SUPPORTED=no
4024                         BTLS_PLATFORM=x86_64
4025                         ;;
4026                 esac
4027                 ;;
4028         sparc*-*-*)
4029                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4030                    TARGET=SPARC64
4031                 else
4032                         TARGET=SPARC
4033                 fi
4034                 arch_target=sparc;
4035                 ACCESS_UNALIGNED="no"
4036                 case $host_os in
4037                   linux*) ;;
4038                   *)
4039                         LIBC="libc.so"
4040                         INTL="libintl.so"
4041                 esac
4042                 if test x"$GCC" = xyes; then
4043                         # We don't support v8 cpus
4044                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
4045                 fi
4046                 if test x"$AR" = xfalse; then
4047                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
4048                 fi
4049                 ;;
4050         *-mingw*|*-*-cygwin*)
4051                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
4052                 have_visibility_hidden=no
4053                 INTL="intl"
4054                 ;;
4055         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
4056         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
4057         powerpc-*-freebsd* | powerpc*-*-aix* | powerpc*-*-os400* )
4058                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4059                         TARGET=POWERPC64;
4060                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
4061                         if ! (echo $CC | grep -q -- 'clang'); then
4062                                 CFLAGS="$CFLAGS -mminimal-toc"
4063                         fi
4064                 else
4065                         TARGET=POWERPC;
4066                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
4067                 fi
4068                 arch_target=ppc;
4069                 case $host_os in
4070                   aix*|os400*)
4071                         BTLS_SUPPORTED=yes
4072                         BTLS_PLATFORM=powerpc
4073                         dnl on AIX/PASE, shared libraries can be inside archives
4074                         dnl if they are, we specify them by lib.a(lib.so)
4075                         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX, so
4076                         LIBC="libc.a(shr_64.o)"
4077                         INTL="libintl.a(libintl.so.8)"
4078                         ;;
4079                   linux*)
4080                         BTLS_SUPPORTED=yes
4081                         BTLS_PLATFORM=powerpc
4082                         ;;
4083                 esac
4084                 ;;
4085         armv7k-*-darwin*)
4086                 TARGET=ARM;
4087                 TARGET_SYS=WATCHOS
4088                 arch_target=arm;
4089                 arm_fpu=VFP_HARD
4090                 ACCESS_UNALIGNED="no"
4091                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4092                 ;;
4094         arm*-darwin*)
4095                 TARGET=ARM;
4096                 arch_target=arm;
4097                 ACCESS_UNALIGNED="no"
4098                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4099                 ;;
4100         arm*-linux*)
4101                 TARGET=ARM;
4102                 arch_target=arm;
4103                 ACCESS_UNALIGNED="no"
4104                 AOT_SUPPORTED="yes"
4105                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4106                 BTLS_SUPPORTED=yes
4107                 BTLS_PLATFORM=arm
4108                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4109                 case "$target" in
4110                 arm*-linux*-gnueabi)
4111                         BTLS_PLATFORM=armsoft
4112                         ;;
4113                 esac
4114                 ;;
4115         arm*-netbsd*-eabi*)
4116                 TARGET=ARM;
4117                 arch_target=arm;
4118                 ACCESS_UNALIGNED="no"
4119                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4120                 ;;
4121         aarch64-*)
4122                 # https://lkml.org/lkml/2012/7/15/133
4123                 TARGET=ARM64
4124                 arch_target=arm64
4125                 boehm_supported=false
4126                 AOT_SUPPORTED="yes"
4127                 BTLS_SUPPORTED=yes
4128                 BTLS_PLATFORM=aarch64
4129                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4130                 ;;
4131         s390x-*-linux*)
4132                 TARGET=S390X;
4133                 arch_target=s390x;
4134                 ACCESS_UNALIGNED="yes"
4135                 BTLS_SUPPORTED=yes
4136                 BTLS_PLATFORM=s390x
4137                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
4138                 ;;
4139         riscv32-*)
4140                 TARGET=RISCV32
4141                 ACCESS_UNALIGNED=no
4142                 AOT_SUPPORTED=no
4143                 BTLS_SUPPORTED=yes
4144                 BTLS_PLATFORM=riscv32
4145                 arch_target=riscv32
4146                 boehm_supported=false
4147                 ;;
4148         riscv64*)
4149                 TARGET=RISCV64
4150                 ACCESS_UNALIGNED=no
4151                 AOT_SUPPORTED=no
4152                 BTLS_SUPPORTED=yes
4153                 BTLS_PLATFORM=riscv64
4154                 arch_target=riscv64
4155                 boehm_supported=false
4156                 ;;
4157 esac
4159 HOST=$TARGET
4161 if test "x$host" != "x$target"; then
4162    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
4163    enable_mcs_build=no
4164    enable_support_build=no
4165    BTLS_SUPPORTED=no
4166    # Can't use tls, since it depends on the runtime detection of tls offsets
4167    # in mono-compiler.h
4168    with_tls=pthread
4169    target_mach=no
4170    case "$target" in
4171    wasm32*)
4172                 TARGET=WASM
4173                 arch_target=wasm
4174                 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
4175                 ;;
4176    arm*-darwin*)
4177                 TARGET=ARM;
4178                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4179                 case "$target" in
4180                 armv7k-*)
4181                         arm_fpu=VFP_HARD
4182                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
4183                         ;;
4184                 esac            
4185                 ;;
4186    powerpc64-ps3-linux-gnu)
4187                 TARGET=POWERPC64
4188                 arch_target=powerpc64
4189                 AC_DEFINE(TARGET_PS3, 1, [...])
4190                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4191                 # uses this define
4192                 AC_DEFINE(__mono_ppc64__, 1, [...])
4193                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4194                 sizeof_register=8
4195                 target_byte_order=G_BIG_ENDIAN
4196                 ;;
4197    powerpc64-xbox360-linux-gnu)
4198                 TARGET=POWERPC64
4199                 arch_target=powerpc64
4200                 AC_DEFINE(TARGET_XBOX360, 1, [...])
4201                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4202                 # uses this define
4203                 sizeof_register=8
4204                 target_byte_order=G_BIG_ENDIAN
4205                 ;;
4206    arm*-linux-*)
4207                 TARGET=ARM;
4208                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4209                 ;;
4210    arm*-netbsd*-eabi*)
4211                 TARGET=ARM;
4212                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4213                 ;;
4214    i686*-linux-*)
4215                 TARGET=X86;
4216                 ;;
4217    i*86-apple-*)
4218                 TARGET=X86;
4219                 ;;
4220    x86_64*-linux-*)
4221                 TARGET=AMD64;
4222                 ;;
4223    x86_64-ps4-freebsd)
4224                 TARGET=AMD64;
4225                 AC_DEFINE(TARGET_PS4, 1, [...])
4226                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
4227                 CPPFLAGS="$CPPFLAGS"
4228                 target_win32=no
4229                 ;;
4230    aarch64*-linux-*)
4231                 TARGET=ARM64;
4232                 ;;
4233         aarch64-*)
4234                 TARGET=ARM64
4235                 ;;
4236         riscv32*)
4237                 TARGET=RISCV32
4238                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4239                 AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4240                 arch_target=riscv32
4241                 target_mach=no
4242                 with_tls=pthread
4243                 ;;
4244         riscv64*)
4245                 TARGET=RISCV64
4246                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4247                 AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4248                 arch_target=riscv64
4249                 target_mach=no
4250                 with_tls=pthread
4251                 ;;
4252         *)
4253                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
4254         esac
4256         case "$target" in
4257         *-darwin*)
4258                 target_mach=yes
4259                 ;;
4260         *-linux-android*)
4261                 AC_DEFINE(TARGET_ANDROID, 1, [...])
4262                 ;;
4263         esac
4266 case "$TARGET" in
4267 WASM)
4268         AC_DEFINE(TARGET_WASM, 1, [...])
4269         arch_target=wasm
4270         ;;
4271 X86)
4272         AC_DEFINE(TARGET_X86, 1, [...])
4273         arch_target=x86
4274         ;;
4275 AMD64)
4276         AC_DEFINE(TARGET_AMD64, 1, [...])
4277         arch_target=amd64
4278         ;;
4279 ARM)
4280         AC_DEFINE(TARGET_ARM, 1, [...])
4281         arch_target=arm
4282         ACCESS_UNALIGNED="no"
4283         ;;
4284 ARM64)
4285         AC_DEFINE(TARGET_ARM64, 1, [...])
4286         arch_target=arm64
4287         ;;
4288 POWERPC)
4289         AC_DEFINE(TARGET_POWERPC, 1, [...])
4290         ;;
4291 POWERPC64)
4292         AC_DEFINE(TARGET_POWERPC, 1, [...])
4293         AC_DEFINE(TARGET_POWERPC64, 1, [...])
4294         ;;
4295 S390X)
4296         AC_DEFINE(TARGET_S390X, 1, [...])
4297         ;;
4298 MIPS)
4299         AC_DEFINE(TARGET_MIPS, 1, [...])
4300         ;;
4301 SPARC)
4302         AC_DEFINE(TARGET_SPARC, 1, [...])
4303         ;;
4304 SPARC64)
4305         AC_DEFINE(TARGET_SPARC64, 1, [...])
4306         ;;
4307 RISCV32)
4308         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4309         AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4310         ;;
4311 RISCV64)
4312         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4313         AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4314         ;;
4315 esac
4317 case "$TARGET" in
4318 *32* | ARM | X86 | POWERPC | MIPS | SPARC | WASM | ARM6432)
4319     target_sizeof_void_p=4
4320     ;;
4321 *64* | S390X)
4322     target_sizeof_void_p=8
4323     ;;
4325     AC_MSG_ERROR([unknown target])
4326     ;;
4327 esac
4329 case "$HOST" in
4330 WASM)
4331         AC_DEFINE(HOST_WASM, 1, [...])
4332         ;;
4333 X86)
4334         AC_DEFINE(HOST_X86, 1, [...])
4335         ;;
4336 AMD64)
4337         AC_DEFINE(HOST_AMD64, 1, [...])
4338         ;;
4339 ARM)
4340         AC_DEFINE(HOST_ARM, 1, [...])
4341         ;;
4342 ARM64)
4343         AC_DEFINE(HOST_ARM64, 1, [...])
4344         ;;
4345 POWERPC)
4346         AC_DEFINE(HOST_POWERPC, 1, [...])
4347         ;;
4348 POWERPC64)
4349         AC_DEFINE(HOST_POWERPC, 1, [...])
4350         AC_DEFINE(HOST_POWERPC64, 1, [...])
4351         ;;
4352 S390X)
4353         AC_DEFINE(HOST_S390X, 1, [...])
4354         ;;
4355 MIPS)
4356         AC_DEFINE(HOST_MIPS, 1, [...])
4357         ;;
4358 SPARC)
4359         AC_DEFINE(HOST_SPARC, 1, [...])
4360         ;;
4361 SPARC64)
4362         AC_DEFINE(HOST_SPARC64, 1, [...])
4363         ;;
4364 RISCV32)
4365         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4366         AC_DEFINE([HOST_RISCV32], [1], [Host is 32-bit RISC-V])
4367         ;;
4368 RISCV64)
4369         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4370         AC_DEFINE([HOST_RISCV64], [1], [Host is 64-bit RISC-V])
4371         ;;
4372 esac
4374 MONO_ARCH_GSHAREDVT_SUPPORTED=0
4375 case "$HOST" in
4376 X86 | AMD64 | ARM | ARM64)
4377         MONO_ARCH_GSHAREDVT_SUPPORTED=1 # keep in sync with mini-{x86,amd64,arm,arm64}.h
4378         ;;
4379 esac
4381 AM_CONDITIONAL(MONO_ARCH_GSHAREDVT_SUPPORTED, test $MONO_ARCH_GSHAREDVT_SUPPORTED = 1)
4382 AM_CONDITIONAL(TARGET_WASM, test $arch_target = wasm)
4384 dnl *************
4385 dnl *** VTUNE ***
4386 dnl *************
4388 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
4389 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
4391 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
4393 if test "x$enable_vtune" = "xyes"; then
4394         if test "x$with_vtune" = "x"; then
4395                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
4396         else
4397                 VTUNE_PATH=$with_vtune
4398         fi
4399         VTUNE_INCLUDE=$VTUNE_PATH/include
4400         case "$TARGET" in
4401         X86)
4402                 VTUNE_LIB=$VTUNE_PATH/lib32
4403                 ;;
4404         AMD64)
4405                 VTUNE_LIB=$VTUNE_PATH/lib64
4406                 ;;
4407         *)
4408                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
4409                 ;;
4410         esac
4411         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
4412                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
4413         fi
4414         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
4415                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
4416         fi
4418         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
4419         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
4421         AC_SUBST(VTUNE_LIBS)
4422         AC_SUBST(VTUNE_CFLAGS)
4424 dnl Use GCC atomic ops if they work on the target.
4425 if test x$GCC = "xyes"; then
4426         case $TARGET in
4427         X86 | AMD64 | ARM | ARM64 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64 | RISCV32 | RISCV64)
4428                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
4429                 ;;
4430         esac
4433 if test "x$target_mach" = "xyes"; then
4435    if test "x$TARGET_SYS" = "xWATCHOS"; then
4436           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
4437           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4438           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4439           BTLS_SUPPORTED=no
4440    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64"; then
4441           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4442           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4443           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4444           BTLS_SUPPORTED=no
4445           target_ios=yes
4446    else
4447        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
4448        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
4449        #error fail this for ios
4450        #endif
4451        ], [
4452                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
4453           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
4454           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
4455           target_osx=yes
4456        ], [
4457           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4458           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4459           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4460           BTLS_SUPPORTED=no
4461                   target_ios=yes
4462        ])
4463         fi
4464    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
4467 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
4469 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
4471 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
4472    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
4473 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
4474    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
4475 else
4476    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
4479 AC_DEFINE_UNQUOTED(TARGET_SIZEOF_VOID_P,${target_sizeof_void_p},[wordsize of target])
4481 if test "x$sizeof_register" = "x4"; then
4482   AC_DEFINE(SIZEOF_REGISTER,4,[size of target machine integer registers])
4483 elif test "x$sizeof_register" = "x8"; then
4484   AC_DEFINE(SIZEOF_REGISTER,8,[size of target machine integer registers])
4485 else
4486   AC_DEFINE_UNQUOTED(SIZEOF_REGISTER,${target_sizeof_void_p},[size of target machine integer registers])
4489 if test "x$have_visibility_hidden" = "xyes"; then
4490    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
4493 if test "x$have_deprecated" = "xyes"; then
4494    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
4497 dnl 
4498 dnl Simple Generational checks (sgen)
4500 SGEN_DEFINES=
4501 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
4502 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
4503 if test x$buildsgen = xyes; then
4504    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
4505    SGEN_DEFINES="-DHAVE_SGEN_GC"
4507         conc_gc_msg=""
4508    if test x$with_sgen_default_concurrent != xno; then
4509        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
4510            conc_gc_msg=" (concurrent by default)"
4511    fi
4513    if test "x$gc_msg" = "x"; then
4514       gc_msg="sgen$conc_gc_msg"
4515    else
4516       gc_msg="sgen$conc_gc_msg and $gc_msg"
4517    fi
4519 AC_SUBST(SGEN_DEFINES)
4520 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
4522 jit_status="Building and using the JIT"
4524 libsuffix=".so"
4526 case "$host" in
4527      *-*-darwin*)
4528         libsuffix=".dylib"
4529         LIBC="libc.dylib"
4530         INTL="libintl.dylib"
4531         SQLITE="libsqlite.0.dylib"
4532         SQLITE3="libsqlite3.0.dylib"
4533         X11="libX11.dylib"
4534         GDKX11="libgdk-x11-2.0.dylib"
4535         GTKX11="libgtk-x11-2.0.dylib"
4536         ;;
4537      *-*-*netbsd*)
4538         LIBC="libc.so"
4539         INTL="libintl.so"
4540         SQLITE="libsqlite.so"
4541         SQLITE3="libsqlite3.so"
4542         ;;
4543      *-*-kfreebsd*-gnu)
4544         LIBC="libc.so.0.1"
4545         INTL="libc.so.0.1"
4546         X11="libX11.so.6"
4547         ;;
4548     *-*-*freebsd*)
4549         LIBC="libc.so.7"
4550         INTL="libintl.so"
4551         SQLITE="libsqlite.so"
4552         SQLITE3="libsqlite3.so"
4553         ;;
4554     *-*-*openbsd*)
4555         LIBC="libc.so"
4556         INTL="libintl.so"
4557         SQLITE="libsqlite.so"
4558         SQLITE3="libsqlite3.so"
4559         ;;
4560     *-*-*linux*)
4561         AC_PATH_X
4562         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
4563         AC_MSG_CHECKING(for the soname of libX11.so)
4564         for i in $x_libraries $dlsearch_path; do
4565                 for r in 4 5 6; do
4566                         if test -f $i/libX11.so.$r; then
4567                                 X11=libX11.so.$r
4568                                 AC_MSG_RESULT($X11)
4569                         fi
4570                 done
4571         done
4572         
4573         if test "x$X11" = "xlibX11.so"; then
4574                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
4575                 X11=libX11.so.6
4576         fi
4577         ;;
4578 esac
4580 AC_SUBST(libsuffix)
4582 ######################################
4583 # EGLIB CHECKS
4584 ######################################
4586 GNUC_PRETTY=
4587 GNUC_UNUSED=
4588 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
4589 if test x$GCC = xyes; then
4590    GNUC_UNUSED='__attribute__((__unused__))'
4591    GNUC_NORETURN='__attribute__((__noreturn__))'
4592    case $host_cpu in
4593      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
4594    esac
4596 AC_SUBST(GNUC_PRETTY)
4597 AC_SUBST(GNUC_UNUSED)
4598 AC_SUBST(GNUC_NORETURN)
4599 AC_SUBST(BREAKPOINT)
4601 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
4603 case $host in
4604 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
4605     PATHSEP='\\'
4606     SEARCHSEP=';'
4607     OS="WIN32"
4608     PIDTYPE='void *'
4609     ;;
4611     PATHSEP='/'
4612     SEARCHSEP=':'
4613     OS="UNIX"
4614     PIDTYPE='int'
4615     ;;
4616 esac
4618 case $host in
4619         *-*-solaris*)
4620         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
4621         ;;
4622 esac
4624 case $target in
4625 arm*-darwin*|aarch64*-*|riscv*)
4626     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
4627     ;;
4628 i*86-*-darwin*)
4629     ORDER=G_LITTLE_ENDIAN
4630     ;;
4631 *-*-haiku*)
4632     LDFLAGS="$LDFLAGS -ltextencoding"
4633     ;;
4634 *-*-openbsd*)
4635     CFLAGS="$CFLAGS -pthread"
4636     LDFLAGS="$LDFLAGS -pthread"
4637     ;;
4638 esac
4640 AC_SUBST(ORDER)
4641 AC_SUBST(CFLAGS)
4642 AC_SUBST(PATHSEP)
4643 AC_SUBST(SEARCHSEP)
4644 AC_SUBST(OS)
4645 AC_SUBST(PIDTYPE)
4647 # Defined for all targets/platforms using classic Windows API support.
4648 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
4649 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
4651 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf)
4652 AC_CHECK_FUNCS(getrlimit)
4653 AC_CHECK_FUNCS(fork execv execve)
4654 AC_CHECK_FUNCS(waitpid)
4656 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
4658 if test x$with_overridable_allocators = xyes; then
4659         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
4660   AC_MSG_NOTICE([Overridable allocator support enabled])
4661 else
4662   AC_MSG_NOTICE([Overridable allocator support disabled])
4666 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
4667 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
4668 # removed once support for 10.6 is dropped.
4670 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
4672 if test x$target_osx = xyes; then
4673 AC_CHECK_FUNCS(getpwuid_r)
4674 elif test x$target_ios = xno; then
4675 AC_CHECK_FUNCS(strndup getpwuid_r)
4678 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
4680 AC_SEARCH_LIBS(sqrtf, m)
4682 # nanosleep may not be part of libc, also search it in other libraries
4683 AC_SEARCH_LIBS(nanosleep, rt)
4685 AC_SEARCH_LIBS(dlopen, dl)
4686 old_ldflags="${LDFLAGS}"
4687 # GNU specific option, this confuses IBM ld, but do offer alternatives when possible
4688 if test $lt_cv_prog_gnu_ld = yes; then
4689         LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4690 else
4691         case $host in
4692         *-*-aix*|*-*-os400*)
4693                 ;;
4694         *)
4695                 dnl Try to use export-dynamic anyways
4696                 LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4697                 ;;
4698         esac
4700 AC_TRY_LINK(, [int i;], found_export_dynamic=yes, found_export_dynamic=no)
4701 if test $found_export_dynamic = no; then
4702         LDFLAGS="${old_ldflags}"
4705 AC_CHECK_HEADERS(getopt.h sys/select.h sys/time.h sys/wait.h pwd.h iconv.h sys/types.h sys/resource.h)
4706 dnl giconv.c will check on HAVE_ICONV_H but we need this for link time
4707 AC_CHECK_LIB(iconv, iconv_open)
4708 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
4709 AC_SUBST(HAVE_ALLOCA_H)
4711 # Get the exact type of size_t, not just its size.
4712 # This is so we can find an exact printf format among u, lu, llu, I64u.
4713 # To avoid warnings about slight mismatches.
4714 # C99 runtime "zu" dependency is being avoided here.
4716 # We have to compile as C++ because C is too lenient
4717 # and lets the wrong thing compile, with warnings.
4719 # Note: "zu" or ifdef <something> have the advantage
4720 # of producing installable "biarch" headers. i.e. one Mac header
4721 # for Mac/x86 and Mac/amd64.
4723 AC_LANG_PUSH(C++)
4725 # Check long before int because it is the overwhelming Unix answer,
4726 # across 32bit and 64bit systems -- fewer compiler invocations in autoconf.
4728 # long ahead of int also tends to produce biarch-compatible headers except Windows.
4730 AC_MSG_CHECKING(if size_t is unsigned long)
4731 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4732         #include <stddef.h>
4733         unsigned long *a = (size_t*)0;
4734 ])], [
4735         AC_MSG_RESULT(yes)
4736         AC_SUBST(GSIZE_FORMAT, '"lu"')
4737 ], [
4738         AC_MSG_RESULT(no)
4739         AC_MSG_CHECKING(if size_t is unsigned int)
4740         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4741                 #include <stddef.h>
4742                 unsigned *a = (size_t*)0;
4743         ])], [
4744                 AC_MSG_RESULT(yes)
4745                 AC_SUBST(GSIZE_FORMAT, '"u"')
4746         ], [
4747 # At this point the majority of systems have their answer,
4748 # and we descend into non-standard or new-standard territory.
4750 # Check __int64 first because I64 on some systems predates ll, enabling
4751 # new compiler/old runtime interop, and the types always have the same size.
4752                 AC_MSG_RESULT(no)
4753                 AC_MSG_CHECKING(if size_t is unsigned __int64)
4754                 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4755                         #include <stddef.h>
4756                         unsigned __int64 *a = (size_t*)0;
4757                 ])], [
4758                         AC_MSG_RESULT(yes)
4759                         AC_SUBST(GSIZE_FORMAT, '"I64u"')
4760                 ], [
4761                         AC_MSG_RESULT(no)
4762                         AC_MSG_CHECKING(if size_t is unsigned long long)
4763                         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4764                                 #include <stddef.h>
4765                                 unsigned long long *a = (size_t*)0;
4766                         ])], [
4767                                 AC_MSG_RESULT(yes)
4768                                 AC_SUBST(GSIZE_FORMAT, '"llu"')
4769                         ], [
4770                                 AC_MSG_RESULT(no)
4771                                 AC_MSG_ERROR(Unable to determine size_t among unsigned long, int, __int64, long long)
4772                         ] )
4773                 ] )
4774         ] )
4775 ] )
4777 AC_LANG_POP
4779 # If size_t/ptrdiff_t is correct, use it. Otherwise C99 [u]intptr_t.
4780 # This provides for an exact match with functions that
4781 # take size_t like malloc and pthread_attr_getstacksize, avoiding warnings.
4782 # uintptr_t is not necessarily the same.
4784 # ptrdiff_t is preferred over ssize_t as it is C89 vs. new Posix.
4785 # ssize_t looks nicer but ptrdiff_t is wrapped up as gssize anyway.
4787 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_size_t; then
4788    GSIZE="size_t"
4789    GSSIZE="ptrdiff_t"
4790 else
4791    GSIZE="uintptr_t"
4792    GSSIZE="intptr_t"
4795 AC_SUBST(GSIZE)
4796 AC_SUBST(GSSIZE)
4797 AC_SUBST(GSIZE_FORMAT)
4800 # END OF EGLIB CHECKS
4803 AC_ARG_WITH([libgdiplus],
4804         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
4805         [], [with_libgdiplus=installed])
4807 # default install location
4808 libgdiplus_install_loc=libgdiplus${libsuffix}
4809 case "$host" in
4810     *-*-*linux*)
4811     libgdiplus_install_loc=libgdiplus${libsuffix}.0
4812     ;;
4813 esac
4815 case $with_libgdiplus in
4816     no)
4817     libgdiplus_loc=
4818     ;;
4820     installed)
4821     libgdiplus_loc=
4822     if test x$cross_compiling = xno; then
4823         if test x$host_darwin = xyes; then
4824             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
4825             if test -x $a; then
4826               libgdiplus_install_loc=$a
4827               libgdiplus_loc=$a
4828             fi
4829         fi
4830     fi
4831     ;;
4833     yes|sibling)
4834     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
4835     ;;
4837     /*) # absolute path, assume it is an install location
4838     libgdiplus_loc=$with_libgdiplus
4839     libgdiplus_install_loc=$with_libgdiplus
4840     ;;
4842     *)
4843     libgdiplus_loc=`pwd`/$with_libgdiplus
4844     ;;
4845 esac
4846 AC_SUBST(libgdiplus_loc)
4847 AC_SUBST(libgdiplus_install_loc)
4849 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)
4850 if test "x$icall_symbol_map" = "xyes"; then
4851    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
4854 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
4855 if test "x$icall_export" = "xyes"; then
4856    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
4859 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
4860 if test "x$icall_tables" = "xno"; then
4861    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
4864 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
4866 if test "x$with_tls" = "x__thread"; then
4867         AC_DEFINE(MONO_KEYWORD_THREAD, __thread, [Have __thread keyword])
4868         # Pass the information to libgc
4869         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
4870         AC_MSG_CHECKING(if the tls_model attribute is supported)
4871         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
4872                 ], [
4873                         AC_MSG_RESULT(yes)
4874                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
4875                 ], [
4876                         AC_MSG_RESULT(no)
4877         ])
4880 if test ${TARGET} = ARM; then
4881         dnl ******************************************
4882         dnl *** Check to see what FPU is available ***
4883         dnl ******************************************
4884         AC_MSG_CHECKING(which FPU to use)
4886         #
4887         # This is a bit tricky:
4888         #
4889         # if (__ARM_PCS_VFP) {
4890         #       /* mfloat-abi=hard == VFP with hard ABI */
4891         # } elif (!__SOFTFP__) {
4892         #       /* mfloat-abi=softfp == VFP with soft ABI */
4893         # } else {
4894         #       /* mfloat-abi=soft == no VFP */
4895         # }
4896         #
4897         # The exception is iOS (w/ GCC) where none of the above
4898         # are defined (but iOS always uses the 'softfp' ABI).
4899         #
4900         # No support for FPA.
4901         #
4903         fpu=NONE
4905         # iOS GCC always uses the 'softfp' ABI.
4906         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
4907                 fpu=VFP
4908         fi
4910         # Are we using the 'hard' ABI?
4911         if test x$fpu = xNONE; then
4912                 AC_TRY_COMPILE([], [
4913                         #ifndef __ARM_PCS_VFP
4914                         #error "Float ABI is not 'hard'"
4915                         #endif
4916                 ], [
4917                         fpu=VFP_HARD
4918                 ], [
4919                         fpu=NONE
4920                 ])
4921         fi
4923         # No 'hard' ABI. 'soft' or 'softfp'?
4924         if test x$fpu = xNONE; then
4925                 AC_TRY_COMPILE([], [
4926                         #ifdef __SOFTFP__
4927                         #error "Float ABI is not 'softfp'"
4928                         #endif
4929                 ], [
4930                         fpu=VFP
4931                 ], [
4932                         fpu=NONE
4933                 ])
4934         fi
4936         if test x$arm_fpu != x; then
4937            fpu=$arm_fpu
4938         fi
4940         AC_MSG_RESULT($fpu)
4941         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
4942         unset fpu
4944         dnl *********************************************
4945         dnl *** Check which ARM version(s) we can use ***
4946         dnl *********************************************
4947         AC_MSG_CHECKING(which ARM version to use)
4949         AC_TRY_COMPILE([], [
4950                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
4951                 #error Not on ARM v5.
4952                 #endif
4953         ], [
4954                 arm_v5=yes
4956                 arm_ver=ARMv5
4957         ], [])
4959         AC_TRY_COMPILE([], [
4960                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
4961                 #error Not on ARM v6.
4962                 #endif
4963         ], [
4964                 arm_v5=yes
4965                 arm_v6=yes
4967                 arm_ver=ARMv6
4968         ], [])
4970         AC_TRY_COMPILE([], [
4971                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
4972                 #error Not on ARM v7.
4973                 #endif
4974         ], [
4975                 arm_v5=yes
4976                 arm_v6=yes
4977                 arm_v7=yes
4979                 arm_ver=ARMv7
4980         ], [])
4982         AC_MSG_RESULT($arm_ver)
4984         if test x$arm_v5 = xyes; then
4985                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
4986                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
4987         fi
4989         if test x$arm_v6 = xyes; then
4990                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
4991                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
4992         fi
4994         if test x$arm_v7 = xyes; then
4995                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
4996                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
4997         fi
5000 if test ${TARGET} = RISCV32 -o ${TARGET} = RISCV64; then
5001         AC_ARG_WITH([riscv-fpabi], [  --with-riscv-fpabi=auto,double,soft   Select RISC-V floating point ABI (auto)], [fpabi=$withval], [fpabi=double])
5003         AC_MSG_CHECKING([which RISC-V floating point ABI to use])
5005         if test x$fpabi = xauto; then
5006                 AC_TRY_COMPILE([], [
5007                         #ifdef __riscv_float_abi_double
5008                         #error "double"
5009                         #endif
5010                 ], [
5011                 ], [
5012                         fpabi=double
5013                 ])
5014         fi
5016         if test x$fpabi = xauto; then
5017                 AC_TRY_COMPILE([], [
5018                         #ifdef __riscv_float_abi_single
5019                         #error "single"
5020                         #endif
5021                 ], [
5022                 ], [
5023                         fpabi=single
5024                 ])
5025         fi
5027         if test x$fpabi = xauto; then
5028                 AC_TRY_COMPILE([], [
5029                         #ifdef __riscv_float_abi_soft
5030                         #error "soft"
5031                         #endif
5032                 ], [
5033                 ], [
5034                         fpabi=soft
5035                 ])
5036         fi
5038         case $fpabi in
5039         double)
5040                 AC_DEFINE([RISCV_FPABI_DOUBLE], [1], [RISC-V FPABI is double-precision])
5041                 AC_MSG_RESULT([double-precision])
5042                 ;;
5043         single)
5044                 AC_DEFINE([RISCV_FPABI_SINGLE], [1], [RISC-V FPABI is single-precision])
5045                 AC_MSG_ERROR([single-precision, not supported])
5046                 ;;
5047         soft)
5048                 AC_DEFINE([RISCV_FPABI_SOFT], [1], [RISC-V FPABI is soft float])
5049                 AC_MSG_RESULT([soft float])
5050                 ;;
5051         auto)
5052                 AC_MSG_ERROR([unknown])
5053                 ;;
5054         *)
5055                 AC_MSG_ERROR([invalid option: $fpabi])
5056                 ;;
5057         esac
5060 if test ${TARGET} = unknown; then
5061         CPPFLAGS="$CPPFLAGS -DNO_PORT"
5062         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
5065 if test "x$platform_android" = "xyes"; then
5066         case "x${TARGET}" in
5067         xARM)
5068                 case "x$arm_ver" in
5069                 xARMv5)
5070                         BTLS_SUPPORTED=yes
5071                         BTLS_PLATFORM=android-armv5
5072                         ;;
5073                 xARMv6)
5074                         BTLS_SUPPORTED=yes
5075                         BTLS_PLATFORM=android-armv6
5076                         ;;
5077                 xARMv7)
5078                         BTLS_SUPPORTED=yes
5079                         BTLS_PLATFORM=android-armv7
5080                         ;;
5081                 *)
5082                         BTLS_SUPPORTED=no
5083                         ;;
5084                 esac
5085                 ;;
5086         xARM64)
5087                 BTLS_SUPPORTED=yes
5088                 BTLS_PLATFORM=android-v8a
5089                 ;;
5090         xX86)
5091                 BTLS_SUPPORTED=yes
5092                 BTLS_PLATFORM=android-x86
5093                 ;;
5094         xAMD64)
5095                 BTLS_SUPPORTED=yes
5096                 BTLS_PLATFORM=android-x64
5097                 ;;
5098         *)
5099                 BTLS_SUPPORTED=no
5100                 ;;
5101         esac
5104 if test ${ACCESS_UNALIGNED} = no; then
5105         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
5108 if test x$host_darwin = xyes; then
5109         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
5110         AS_IF(
5111                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
5112                 [AC_MSG_RESULT([no])],
5113                 [
5114                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
5115                         AR_FLAGS="Scru"
5116                         RANLIB="$RANLIB -no_warning_for_no_symbols"
5117                         AC_MSG_RESULT([yes])
5118                 ]
5119         )
5122 case "x$libgc" in
5123         xincluded)
5124                 # Pass CPPFLAGS to libgc configure
5125                 # We should use a separate variable for this to avoid passing useless and
5126                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
5127                 # This should be executed late so we pick up the final version of CPPFLAGS
5128                 # The problem with this approach, is that during a reconfigure, the main
5129                 # configure scripts gets invoked with these arguments, so we use separate
5130                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
5131                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
5132                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
5133                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
5134                 fi
5135                 # Don't pass -finstrument-for-thread-suspension in, 
5136                 # if these are instrumented it will be very bad news 
5137                 # (infinite recursion, undefined parking behavior, etc)
5138                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
5139                 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\""
5140                 if test "x$support_boehm" = "xyes"; then
5141                         AC_CONFIG_SUBDIRS(libgc)
5142                 fi
5143                 ;;
5144 esac
5146 MALLOC_MEMPOOLS=no
5147 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
5148         if test x$with_malloc_mempools = xyes; then
5149                 MALLOC_MEMPOOLS=yes
5150                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
5151         fi
5155 DISABLE_MCS_DOCS=default
5156 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
5157         if test x$with_mcs_docs != xyes; then
5158                 DISABLE_MCS_DOCS=yes
5159         fi
5161 if test -n "$INSTALL_4_x_TRUE"; then :
5162         DISABLE_MCS_DOCS=yes
5164 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
5165    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
5168 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)],[
5169         if test x$with_lazy_gc_thread_creation != xno ; then
5170                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
5171         fi
5172 ], [with_lazy_gc_thread_creation=no])
5174 dnl *****************************
5175 dnl *** Thread suspend policy ***
5176 dnl *****************************
5178 dnl Set a default hybrid or cooperative suspend on some platforms
5180 dnl Coop default is set by the bitcode preset.
5182 dnl If coop isn't on by default, maybe hybrid should be?
5183 if test x$enable_cooperative_suspend_default != xyes; then
5184         case $HOST in
5185         X86 | AMD64)
5186                 dnl Some host/target confusion, there's no host_osx (and
5187                 dnl host_darwin would be true on iOS not just macOS).
5188                 if test x$target_osx = xyes; then
5189                         enable_hybrid_suspend_default=yes
5190                 elif test x$host_linux = xyes -o x$host_win32 = xyes; then
5191                         enable_hybrid_suspend_default=yes
5192                 fi
5193                 ;;
5194         esac
5197 dnl Now check if there were flags overriding the defaults
5199 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])
5200 AC_ARG_ENABLE(cooperative_suspend, [  --enable-cooperative-suspend      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [], [enable_cooperative_suspend=default])
5202 if test x$enable_cooperative_suspend = xdefault -a x$with_cooperative_gc != xdefault; then
5203         enable_cooperative_suspend=$with_cooperative_gc
5206 if test x$enable_cooperative_suspend = xdefault; then
5207         enable_cooperative_suspend=$enable_cooperative_suspend_default
5210 if test x$enable_cooperative_suspend != xno; then
5211         AC_DEFINE(ENABLE_COOP_SUSPEND,1,[Enable cooperative stop-the-world garbage collection.])
5214 AM_CONDITIONAL([ENABLE_COOP_SUSPEND], [test x$enable_cooperative_suspend != xno])
5216 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])
5218 if test x$enable_hybrid_suspend = xdefault; then
5219    enable_hybrid_suspend=$enable_hybrid_suspend_default
5222 if test x$enable_hybrid_suspend != xno -a x$enable_cooperative_suspend != xno ; then
5223         AC_MSG_ERROR([Hybrid suspend and Cooperative suspend cannot be both enabled.])
5226 if test x$enable_hybrid_suspend != xno ; then
5227         AC_DEFINE(ENABLE_HYBRID_SUSPEND,1,[Enable hybrid suspend for GC stop-the-world])
5230 AM_CONDITIONAL([ENABLE_HYBRID_SUSPEND], [test x$enable_hybrid_suspend != xno])
5232 dnl End of thread suspend policy
5234 dnl ***************************
5235 dnl *** feature experiments ***
5236 dnl ***************************
5238 dnl When adding experiments, also add to mono/utils/mono-experiments.def
5239 AC_ARG_ENABLE(experiment, [ --enable-experiment=LIST       Enable experimental fatures from the comma-separate LIST.  Available experiments: null],[
5241         if test x$enable_experiment != x ; then
5242                 AC_DEFINE(ENABLE_EXPERIMENTS,1,[Enable feature experiments])
5243         fi
5244         for feature in `echo "$enable_experiment" | sed -e "s/,/ /g"`; do
5245                 eval "mono_experiment_test_enable_$feature='yes'"
5246         done
5248         if test "x$mono_experiment_test_enable_all" = "xyes"; then
5249                 eval "mono_experiment_test_enable_null='yes'"
5250                 true
5251         fi
5253         if test "x$mono_experiment_test_enable_null" = "xyes"; then
5254                 AC_DEFINE(ENABLE_EXPERIMENT_null, 1, [Enable experiment 'null'])
5255         fi
5256 ],[])
5258 dnl **********************
5259 dnl *** checked builds ***
5260 dnl **********************
5262 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],[
5264         if test x$enable_checked_build != x ; then
5265                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
5266         fi
5267         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
5268                 eval "mono_checked_build_test_enable_$feature='yes'"
5269         done
5271         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
5272                 eval "mono_checked_build_test_enable_gc='yes'"
5273                 eval "mono_checked_build_test_enable_metadata='yes'"
5274                 eval "mono_checked_build_test_enable_thread='yes'"
5275                 eval "mono_checked_build_test_enable_private_types='yes'"
5276         fi
5278         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
5279                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
5280         fi
5282         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
5283                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
5284         fi
5286         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
5287                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
5288         fi
5290         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
5291                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
5292         fi
5293 ], [])
5295 dnl End of checked builds
5297 AC_CHECK_HEADER([malloc.h], 
5298                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
5299                         [Define to 1 if you have /usr/include/malloc.h.])],,)
5301 if test x"$GCC" = xyes; then
5302         # Implicit function declarations are not 64 bit safe
5303         # Do this late, since this causes lots of configure tests to fail
5304         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
5305         # jay has a lot of implicit declarations
5306         JAY_CFLAGS="-Wno-implicit-function-declaration"
5309 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
5310 # instead of libmono-static.a
5311 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
5312    LIBMONO_LA=libmini-static.la
5313 else
5314    if test x$buildsgen = xyes; then
5315       LIBMONO_LA=libmonosgen-$API_VER.la
5316    else
5317       LIBMONO_LA=libmonoboehm-$API_VER.la
5318    fi
5320 AC_SUBST(LIBMONO_LA)
5322 dnl **************
5323 dnl ***  Btls  ***
5324 dnl **************
5326 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
5327 AC_ARG_ENABLE(btls-lib, [  --disable-btls-lib             Disable building the BTLS native library], enable_btls_lib=$enableval, enable_btls_lib=$BTLS_SUPPORTED)
5328 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
5330 if test "x$enable_btls" = "xno"; then
5331    enable_btls_lib=no
5334 AM_CONDITIONAL(BTLS, test x$enable_btls_lib = xyes)
5336 btls_android=no
5337 if test "x$enable_btls" = "xyes"; then
5338         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
5339         if test "x$CMAKE" = "xno"; then
5340                 AC_MSG_ERROR("cmake not found")
5341         fi
5343         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
5344         AC_SUBST(BTLS_ROOT)
5346         btls_arch=
5347         btls_cflags=
5348         BTLS_CMAKE_ARGS=
5350         if test "x$host_win32" = "xyes"; then
5351                 AC_CHECK_PROG(HAVE_YASM, yasm, yes, no)
5352         fi
5354         case "$BTLS_PLATFORM" in
5355         i386)
5356                 btls_arch=i386
5357                 btls_cflags="-m32"
5358                 case $host_os in
5359                         darwin*)
5360                                 btls_cflags="$btls_cflags -arch i386"
5361                                 ;;
5362                         mingw*|cygwin*)
5363                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5364                                 if test "x$HAVE_YASM" != "xyes"; then
5365                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5366                                 fi
5367                                 ;;
5368                 esac
5369                 ;;
5370         x86_64)
5371                 btls_arch=x86_64
5372                 case $host_os in
5373                         mingw*|cygwin*)
5374                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5375                                 if test "x$HAVE_YASM" != "xyes"; then
5376                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5377                                 fi
5378                                 ;;
5379                 esac
5380                 ;;
5381         arm)
5382                 btls_arch=arm
5383                 btls_cflags="-DOPENSSL_NO_ASM=1"
5384                 ;;
5385         armsoft)
5386                 btls_arch=arm
5387                 btls_cflags="-DOPENSSL_NO_ASM=1"
5388                 ;;
5389         aarch64)
5390                 btls_arch=aarch64
5391                 btls_cflags="-march=armv8-a+crypto"
5392                 ;;
5393         s390x)
5394                 btls_arch=s390x
5395                 ;;
5396         powerpc)
5397                 btls_arch=powerpc
5398                 case $host_os in
5399                         aix*|os400*)
5400                                 btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
5401                                 BTLS_CMAKE_ARGS="-DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
5402                 esac
5403                 ;;
5404         android-armv5)
5405                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
5406                 ;;
5407         android-armv6)
5408                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
5409                 ;;
5410         android-armv7)
5411                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=14"
5412                 ;;
5413         android-v8a)
5414                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=21"
5415                 ;;
5416         android-x86)
5417                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=14"
5418                 ;;
5419         android-x64)
5420                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=21"
5421                 ;;
5422         riscv32)
5423                 btls_arch=riscv32
5424                 ;;
5425         riscv64)
5426                 btls_arch=riscv64
5427                 ;;
5428         *)
5429                 AC_MSG_ERROR(Invalid BTLS platform)
5430         esac
5432         if test "x$platform_android" = "xyes"; then
5433                 btls_android=yes
5434                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
5435                 if test "x$with_btls_android_ndk" != "x"; then
5436                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
5437                 else
5438                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
5439                 fi
5440         fi
5442         if test "x$btls_arch" != "x"; then
5443                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
5444         fi
5446         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
5447         AC_SUBST(BTLS_ARCH)
5448         AC_SUBST(BTLS_CFLAGS)
5449         AC_SUBST(BTLS_PLATFORM)
5450         AC_SUBST(BTLS_CMAKE_ARGS)
5452         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
5453 else
5454         enable_btls=no
5457 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
5459 if test x$DISABLE_MCS_DOCS = xyes; then
5460    docs_dir=""
5461 else
5462    docs_dir=docs
5464 AC_SUBST(docs_dir)
5466 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
5467 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
5468 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
5470 libmono_ldflags="$libmono_ldflags $LIBS"
5472 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
5473 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
5474 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
5475 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
5476 AM_CONDITIONAL(X86, test x$TARGET = xX86)
5477 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
5478 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
5479 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
5480 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
5481 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
5482 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64)
5483 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
5484 AM_CONDITIONAL([RISCV], [test x$TARGET = xRISCV32 -o x$TARGET = xRISCV64])
5485 AM_CONDITIONAL([RISCV32], [test x$TARGET = xRISCV32])
5486 AM_CONDITIONAL([RISCV64], [test x$TARGET = xRISCV64])
5487 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
5488 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
5489 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
5490 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
5491 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
5492 AM_CONDITIONAL([HOST_RISCV], [test x$HOST = xRISCV32 -o x$HOST = xRISCV64])
5493 AM_CONDITIONAL([HOST_RISCV32], [test x$HOST = xRISCV32])
5494 AM_CONDITIONAL([HOST_RISCV64], [test x$HOST = xRISCV64])
5495 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
5497 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
5499 AC_SUBST(LIBC)
5500 AC_SUBST(INTL)
5501 AC_SUBST(SQLITE)
5502 AC_SUBST(SQLITE3)
5503 AC_SUBST(X11)
5504 AC_SUBST(GDKX11)
5505 AC_SUBST(GTKX11)
5506 AC_SUBST(XINERAMA)
5507 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
5508 AC_SUBST(arch_target)
5509 AC_SUBST(CFLAGS)
5510 AC_SUBST(CPPFLAGS)
5511 AC_SUBST(LDFLAGS)
5513 #This must always be defined when building the runtime
5514 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
5516 mono_build_root=`pwd`
5517 AC_SUBST(mono_build_root)
5519 AC_ARG_ENABLE(msvc,[  --enable-msvc    Build with Visual Studio (msvc) (defaults to no)], enable_msvc=$enableval, enable_msvc=no)
5520 if test x$host_win32 = xno; then
5521         if test x$enable_msvc = xyes; then
5522                 echo "Error, --enable-msvc only supported for Windows builds."
5523                 exit 1
5524         fi
5526 AM_CONDITIONAL(ENABLE_MSVC, test x$enable_msvc = xyes)
5528 if test "x$enable_msvc" = "xyes"; then
5529         if test "x$support_boehm" = "xyes"; then
5530                 echo "Error, Boehm GC is not supported when using --enable-msvc."
5531                 exit 1
5532         fi
5533         mono_msvc_build_dir='$(top_srcdir)'/msvc/build/sgen
5534         if test "x$host_cpu" = "xi686"; then
5535                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/Win32/lib/Release
5536                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/Win32/bin/Release
5537                 mono_runtime=msvc/build/sgen/Win32/bin/Release/mono-sgen.exe
5538         else
5539                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/x64/lib/Release
5540                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/x64/bin/Release
5541                 mono_runtime=msvc/build/sgen/x64/bin/Release/mono-sgen.exe
5542         fi
5543         AC_SUBST(mono_msvc_build_dir)
5544         AC_SUBST(mono_msvc_build_lib_dir)
5545         AC_SUBST(mono_msvc_build_bin_dir)
5546 else
5547         mono_runtime=mono/mini/mono
5550 AC_SUBST(mono_runtime)
5552 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/Microsoft.Net.Compilers.2.8.2/tools/csc.exe
5554 if test $csc_compiler = mcs; then
5555   CSC=$mcs_topdir/class/lib/build/mcs.exe
5556 else
5557   CSC=$CSC_LOCATION
5560 AM_CONDITIONAL([CSC_IS_ROSLYN], [test x$csc_compiler != xmcs])
5562 mono_cfg_root=$mono_build_root/runtime
5563 if test x$host_win32 = xyes; then
5564   if test "x$cross_compiling" = "xno"; then
5565     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
5566     CSC=`cygpath -m -a $CSC`
5567     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
5568   else
5569     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
5570   fi
5571 else
5572   mono_cfg_dir=$mono_cfg_root/etc
5574 AC_SUBST(mono_cfg_dir)
5576 AC_SUBST(CSC)
5578 AC_CONFIG_FILES([po/mcs/Makefile.in])
5580 AC_CONFIG_FILES([acceptance-tests/microbench-perf.sh],[chmod +x acceptance-tests/microbench-perf.sh])
5581 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
5582 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
5584 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
5585 [   depth=../../../..
5586     case $srcdir in
5587     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5588     .) reldir=$depth ;;
5589     *) reldir=$depth/$srcdir ;;
5590     esac
5591     $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
5592     cd runtime/etc/mono/1.0
5593     rm -f machine.config
5594     $LN_S $reldir/data/net_1_1/machine.config machine.config
5595     cd $depth
5596 ],[LN_S='$LN_S'])
5598 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
5599 [   depth=../../../..
5600     case $srcdir in
5601     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5602     .) reldir=$depth ;;
5603     *) reldir=$depth/$srcdir ;;
5604     esac
5605     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5606     cd runtime/etc/mono/2.0
5607     rm -f machine.config
5608     $LN_S $reldir/data/net_2_0/machine.config machine.config
5609     cd $depth
5610 ],[LN_S='$LN_S'])
5612 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
5613 [   depth=../../../..
5614     case $srcdir in
5615     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5616     .) reldir=$depth ;;
5617     *) reldir=$depth/$srcdir ;;
5618     esac
5619     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5620     cd runtime/etc/mono/2.0
5621     rm -f web.config
5622     $LN_S $reldir/data/net_2_0/web.config web.config
5623     cd $depth
5624 ],[LN_S='$LN_S'])
5626 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
5627 [   depth=../../..
5628     case $srcdir in
5629     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5630     .) reldir=$depth ;;
5631     *) reldir=$depth/$srcdir ;;
5632     esac
5633     $ac_aux_dir/install-sh -d runtime/etc/mono/
5634     cd runtime/etc/mono/
5635     rm -f browscap.ini
5636     $LN_S $reldir/data/browscap.ini browscap.ini
5637     cd $depth
5638 ],[LN_S='$LN_S'])
5640 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
5641 [   depth=../../../../..
5642     case $srcdir in
5643     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5644     .) reldir=$depth ;;
5645     *) reldir=$depth/$srcdir ;;
5646     esac
5647     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
5648     cd runtime/etc/mono/2.0/Browsers
5649     rm -f Compat.browser
5650     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5651     cd $depth
5652 ],[LN_S='$LN_S'])
5654 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
5655 [   depth=../../../../..
5656     case $srcdir in
5657     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5658     .) reldir=$depth ;;
5659     *) reldir=$depth/$srcdir ;;
5660     esac
5661     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
5662     cd runtime/etc/mono/4.0/Browsers
5663     rm -f Compat.browser
5664     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5665     cd $depth
5666 ],[LN_S='$LN_S'])
5668 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
5669 [   depth=../../../../..
5670     case $srcdir in
5671     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5672     .) reldir=$depth ;;
5673     *) reldir=$depth/$srcdir ;;
5674     esac
5675     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
5676     cd runtime/etc/mono/4.5/Browsers
5677     rm -f Compat.browser
5678     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5679     cd $depth
5680 ],[LN_S='$LN_S'])
5682 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
5683 [   depth=../../../..
5684     case $srcdir in
5685     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5686     .) reldir=$depth ;;
5687     *) reldir=$depth/$srcdir ;;
5688     esac
5689     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5690     cd runtime/etc/mono/4.0
5691     rm -f machine.config
5692     $LN_S $reldir/data/net_4_0/machine.config machine.config
5693     cd $depth
5694 ],[LN_S='$LN_S'])
5696 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
5697 [   depth=../../../..
5698     case $srcdir in
5699     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5700     .) reldir=$depth ;;
5701     *) reldir=$depth/$srcdir ;;
5702     esac
5703     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5704     cd runtime/etc/mono/4.0
5705     rm -f web.config
5706     $LN_S $reldir/data/net_4_0/web.config web.config
5707     cd $depth
5708 ],[LN_S='$LN_S'])
5710 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
5711 [   depth=../../../..
5712     case $srcdir in
5713     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5714     .) reldir=$depth ;;
5715     *) reldir=$depth/$srcdir ;;
5716     esac
5717     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5718     cd runtime/etc/mono/4.5
5719     rm -f machine.config
5720     $LN_S $reldir/data/net_4_5/machine.config machine.config
5721     cd $depth
5722 ],[LN_S='$LN_S'])
5724 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
5725 [   depth=../../../..
5726     case $srcdir in
5727     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5728     .) reldir=$depth ;;
5729     *) reldir=$depth/$srcdir ;;
5730     esac
5731     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5732     cd runtime/etc/mono/4.5
5733     rm -f web.config
5734     $LN_S $reldir/data/net_4_5/web.config web.config
5735     cd $depth
5736 ],[LN_S='$LN_S'])
5738 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])
5739 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])
5740 AC_CONFIG_COMMANDS([clean-llvm], [rm -f llvm/llvm_config.mk])
5742 # Anything involving -Werror must be done late because autoconf depends on compiling with warnings to be success.
5743 if test x"$GCC" = xyes; then
5745         # incompatible-pointer-types requires gcc circa 5.x
5747         ORIG_CFLAGS=$CFLAGS
5748         CFLAGS="$CFLAGS -Wincompatible-pointer-types -Werror"
5749         AC_MSG_CHECKING(for -Wincompatible-pointer-types option to gcc)
5750         AC_TRY_COMPILE([],[
5751         ], [
5752                 AC_MSG_RESULT(yes)
5753                 CFLAGS="$ORIG_CFLAGS -Werror=incompatible-pointer-types"
5754         ], [
5755                 AC_MSG_RESULT(no)
5756                 CFLAGS=$ORIG_CFLAGS
5757         ])
5761 # Mono.Native Support
5762 # -------------------
5763 # Mono.Native is the new name for both System.Native and System.Security.Cryptography.Apple.
5764 # It is built as a stand-alone shared library and not bundled with the runtime because we
5765 # may need to build two different versions of it.
5767 # Starting with macOS 10.12+ and iOS 10+, Apple introduced a new Unified API for some of the
5768 # crypto primitives that we're using as part of System.Security.Cryptography.Apple.
5770 # On Desktop, we can check at runtime whether the OS version is recent enough and switch
5771 # implementation accordingly.  We build a single `libmono_native` shared library.
5773 # However, on Mobile we cannot have any undefined symbols as this would break Bitcode.
5775 # During the mobile build, we are called with `CC` containing an explicit minium version flag,
5776 # which is eiter `-mmacosx-version-min=`, `-mios-simulator-version-min=` or `-miphoneos-version-min=`
5777 # depending on platform.
5779 # We build two versions of the shared library:
5780 # - `libmono_native_compat` is built with whichever minimum version is passed to us via `CC`.
5781 # - `libmono_native_unifed` is built with the minimum version set to macOS 10.12+ / iOS 10+.
5783 # For testing purpuses, there is a function called `mono_native_get_platform_type ()`
5784 # (see mono/native/mono-native-platform.c), which returns a `MonoNativePlatformType` enum value.
5785 # There is also `Mono.MonoNativePlatform.GetPlatformType ()` (see mcs/class/System/Mono/MonoNativePlatform.cs).
5787 # This can be called by automated tests both to ensure that the library has been correctly installed and also
5788 # to verify that it's the correct version of it.
5791 sed_version_pattern='[[0-9]]\{1,2\}\(\.[[0-9]]\{1,2\}\)'
5792 if test x$target_osx = xyes; then
5793         sed_remove_mac_version_pattern="s/-mmacosx-version-min=$sed_version_pattern//g"
5794         grep_find_mac_version_pattern="-mmacosx-version-min=$sed_version_pattern"
5795         mono_native_compat_version=`echo $CC | grep -o -e $grep_find_mac_version_pattern`
5796         MONO_NATIVE_CC=`echo $CC | sed -e $sed_remove_mac_version_pattern`
5797         MONO_NATIVE_CXX=`echo $CXX | sed -e $sed_remove_mac_version_pattern`
5798         MONO_NATIVE_CPPFLAGS=`echo $CPPFLAGS | sed -e $sed_remove_mac_version_pattern`
5799         MONO_NATIVE_CFLAGS=`echo $CFLAGS | sed -e $sed_remove_mac_version_pattern`
5800         MONO_NATIVE_CXXFLAGS=`echo $CXXFLAGS | sed -e $sed_remove_mac_version_pattern`
5801         MONO_NATIVE_LDFLAGS=`echo $LDFLAGS | sed -e $sed_remove_mac_version_pattern`
5803         mono_native=yes
5804         MONO_NATIVE_PLATFORM=macos
5805         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_MACOS"
5806         AC_MSG_CHECKING([Mono.Native support])
5807         AC_MSG_RESULT(macos)
5809         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer],
5810                 [!(MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12)])
5812         if test x$mono_native_compat = xyes; then
5813                 mono_native_compat=yes
5814                 mono_native_text="Mac OSX (compat+unified)"
5815                 MONO_NATIVE_COMPAT_CFLAGS="$CFLAGS $mono_native_compat_version"
5816                 MONO_NATIVE_COMPAT_LDFLAGS="$LDFLAGS $mono_native_compat_version"
5817                 MONO_NATIVE_UNIFIED_CFLAGS="$MONO_NATIVE_CFLAGS -mmacosx-version-min=10.12"
5818                 MONO_NATIVE_UNIFIED_LDFLAGS="$MONO_NATIVE_LDFLAGS -mmacosx-version-min=10.12"
5819         else
5820                 mono_native_compat=no
5821                 mono_native_text="Mac OSX"
5822         fi
5823 elif test x$mono_native_platform_ios = xyes; then
5824         AC_MONO_APPLE_TARGET(TARGET_OS_SIMULATOR, [mono_native_ios_sim=yes], [mono_native_ios_sim=no])
5826         AC_MONO_APPLE_TARGET(TARGET_OS_IOS, [
5827                 if test x$mono_native_ios_sim = xyes; then
5828                         mono_native_ios_target=ios-simulator
5829                         mono_native_text="iOS Simulator"
5830                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5831                 else
5832                         mono_native_ios_target=iphoneos
5833                         mono_native_text="iOS Device"
5834                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5835                 fi
5836                 mono_native_unified_version="10.0"
5837                 mono_native_compat_check="__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_10_0"
5838         ], [
5839                 AC_MONO_APPLE_TARGET(TARGET_OS_TV, [
5840                         if test x$mono_native_ios_sim = xyes; then
5841                                 mono_native_ios_target=tvos-simulator
5842                                 mono_native_text="AppleTV Simulator"
5843                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5844                         else
5845                                 mono_native_ios_target=tvos
5846                                 mono_native_text="AppleTV Device"
5847                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5848                         fi
5849                         mono_native_unified_version="10.0"
5850                         mono_native_compat_check="__TV_OS_VERSION_MIN_REQUIRED >= __TVOS_10_0"
5851                 ], [
5852                         AC_MONO_APPLE_TARGET(TARGET_OS_WATCH, [
5853                                 if test x$mono_native_ios_sim = xyes; then
5854                                         mono_native_ios_target=watchos-simulator
5855                                         mono_native_text="Apple Watch Simulator"
5856                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5857                                 else
5858                                         mono_native_ios_target=watchos
5859                                         mono_native_text="Apple Watch Device"
5860                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5861                                 fi
5862                                 mono_native_unified_version="5.0"
5863                                 mono_native_compat_check="__WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_5_0"
5864                         ], [
5865                                 AC_MSG_ERROR([Unknown iOS Target])
5866                         ])
5867                 ])
5868         ])
5870         AC_MSG_CHECKING([Mono.Native support])
5871         AC_MSG_RESULT([$mono_native_ios_target])
5873         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer], [!($mono_native_compat_check)])
5875         sed_remove_ios_version_pattern="s/-m\(.*\)-version-min=$sed_version_pattern//g"
5876         grep_find_ios_version_pattern="-m$mono_native_ios_target-version-min=$sed_version_pattern"
5878         mono_native_compat_version=`echo $CC | grep -o -e $grep_find_ios_version_pattern`
5880         if test x$with_bitcode = xyes; then
5881                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -no-undefined -fatal_warnings"
5882                 MONO_NATIVE_LIBADD="../mini/$LIBMONO_LA"
5883         else
5884                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -fatal_warnings"
5885         fi
5887         if test x$enable_gss = xyes; then
5888                 mono_native_ldflags="$mono_native_ldflags -framework GSS"
5889         fi
5891         MONO_NATIVE_CC=`echo $CC | sed -e $sed_remove_ios_version_pattern`
5892         MONO_NATIVE_CXX=`echo $CXX | sed -e $sed_remove_ios_version_pattern`
5893         MONO_NATIVE_CPPFLAGS=`echo $CPPFLAGS | sed -e $sed_remove_ios_version_pattern`
5894         MONO_NATIVE_CXXFLAGS=`echo $CXXFLAGS | sed -e $sed_remove_ios_version_pattern`
5895         MONO_NATIVE_CFLAGS=`echo $CFLAGS | sed -e $sed_remove_ios_version_pattern`
5896         MONO_NATIVE_LDFLAGS=`echo $LDFLAGS $mono_native_ldflags | sed -e $sed_remove_ios_version_pattern`
5898         if test x$mono_native_compat = xyes; then
5899                 mono_native_text="$mono_native_text (compat+unified)"
5900                 MONO_NATIVE_COMPAT_CFLAGS="$CFLAGS $mono_native_compat_version"
5901                 MONO_NATIVE_COMPAT_LDFLAGS="$LDFLAGS $mono_native_compat_version"
5902                 MONO_NATIVE_UNIFIED_CFLAGS="$MONO_NATIVE_CFLAGS -m$mono_native_ios_target-version-min=$mono_native_unified_version"
5903                 MONO_NATIVE_UNIFIED_LDFLAGS="$MONO_NATIVE_LDFLAGS -m$mono_native_ios_target-version-min=$mono_native_unified_version"
5904         fi
5906         mono_native=yes
5907         MONO_NATIVE_PLATFORM=ios
5908 elif test x$host_linux = xyes; then
5909         mono_native_text="Linux"
5910         MONO_NATIVE_CC=$CC
5911         MONO_NATIVE_CXX=$CXX
5912         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
5913         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
5914         MONO_NATIVE_CFLAGS=$CFLAGS
5915         MONO_NATIVE_LDFLAGS=$LDFLAGS
5917         mono_native=yes
5918         mono_native_compat=no
5919         MONO_NATIVE_PLATFORM=linux
5920         AC_MSG_CHECKING([Mono.Native support])
5921         AC_MSG_RESULT(linux)
5923         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
5924 elif case $host_os in aix*|os400*) true;; *) false;; esac; then
5925         mono_native_text="AIX"
5926         MONO_NATIVE_CC=$CC
5927         MONO_NATIVE_CXX=$CXX
5928         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
5929         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
5930         MONO_NATIVE_CFLAGS=$CFLAGS
5931         MONO_NATIVE_LDFLAGS=$LDFLAGS
5933         mono_native=yes
5934         mono_native_compat=no
5935         MONO_NATIVE_PLATFORM=aix
5936         AC_MSG_CHECKING([Mono.Native support])
5937         AC_MSG_RESULT(aix)
5939         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_AIX"
5940 else
5941         mono_native=no
5942         mono_native_text="no"
5943         AC_MSG_CHECKING([Mono.Native support])
5944         AC_MSG_RESULT(no)
5947 if test x$mono_native_compat = xyes; then
5948         MONO_NATIVE_LIBRARY_NAME=libmono-native-compat
5949 else
5950         MONO_NATIVE_LIBRARY_NAME=libmono-native
5953 AC_SUBST(MONO_NATIVE_PLATFORM)
5954 AC_SUBST(MONO_NATIVE_CC)
5955 AC_SUBST(MONO_NATIVE_CXX)
5956 AC_SUBST(MONO_NATIVE_CPPFLAGS)
5957 AC_SUBST(MONO_NATIVE_CXXFLAGS)
5958 AC_SUBST(MONO_NATIVE_CFLAGS)
5959 AC_SUBST(MONO_NATIVE_COMPAT_CFLAGS)
5960 AC_SUBST(MONO_NATIVE_UNIFIED_CFLAGS)
5961 AC_SUBST(MONO_NATIVE_LDFLAGS)
5962 AC_SUBST(MONO_NATIVE_COMPAT_LDFLAGS)
5963 AC_SUBST(MONO_NATIVE_UNIFIED_LDFLAGS)
5964 AC_SUBST(MONO_NATIVE_LIBRARY_NAME)
5965 AC_SUBST(MONO_NATIVE_LIBADD)
5967 AM_CONDITIONAL(MONO_NATIVE, test x$mono_native = xyes)
5968 AM_CONDITIONAL(MONO_NATIVE_COMPAT, test x$mono_native_compat = xyes)
5969 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_MACOS, test x$MONO_NATIVE_PLATFORM = xmacos)
5970 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_IOS, test x$MONO_NATIVE_PLATFORM = xios)
5971 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_LINUX, test x$MONO_NATIVE_PLATFORM = xlinux)
5972 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_AIX, test x$MONO_NATIVE_PLATFORM = xaix)
5974 MONO_NATIVE_PLATFORM_TYPE_COMPAT="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_COMPAT"
5975 MONO_NATIVE_PLATFORM_TYPE_UNIFIED="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_UNIFIED"
5976 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE)
5977 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_COMPAT)
5978 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_UNIFIED)
5980 # Update all submodules recursively to ensure everything is checked out
5981 (cd $srcdir && scripts/update_submodules.sh)
5983 AC_OUTPUT([
5984 Makefile
5985 mono-uninstalled.pc
5986 acceptance-tests/Makefile
5987 llvm/Makefile
5988 scripts/mono-find-provides
5989 scripts/mono-find-requires
5990 mk/Makefile
5991 mono/Makefile
5992 mono/btls/Makefile
5993 mono/native/Makefile
5994 mono/utils/Makefile
5995 mono/utils/jemalloc/Makefile
5996 mono/metadata/Makefile
5997 mono/dis/Makefile
5998 mono/cil/Makefile
5999 mono/arch/Makefile
6000 mono/arch/x86/Makefile
6001 mono/arch/amd64/Makefile
6002 mono/arch/ppc/Makefile
6003 mono/arch/sparc/Makefile
6004 mono/arch/s390x/Makefile
6005 mono/arch/arm/Makefile
6006 mono/arch/arm64/Makefile
6007 mono/arch/mips/Makefile
6008 mono/arch/riscv/Makefile
6009 mono/sgen/Makefile
6010 mono/native/platform-type.c
6011 mono/native/platform-type-compat.c
6012 mono/native/platform-type-unified.c
6013 mono/tests/Makefile
6014 mono/tests/assembly-load-reference/Makefile
6015 mono/tests/tests-config
6016 mono/tests/gc-descriptors/Makefile
6017 mono/tests/testing_gac/Makefile
6018 mono/unit-tests/Makefile
6019 mono/benchmark/Makefile
6020 mono/mini/Makefile
6021 mono/profiler/Makefile
6022 mono/eglib/Makefile
6023 mono/eglib/eglib-config.h
6024 mono/eglib/test/Makefile
6025 m4/Makefile
6026 ikvm-native/Makefile
6027 scripts/Makefile
6028 man/Makefile
6029 docs/Makefile
6030 data/Makefile
6031 data/net_2_0/Makefile
6032 data/net_4_0/Makefile
6033 data/net_4_5/Makefile
6034 data/net_2_0/Browsers/Makefile
6035 data/net_4_0/Browsers/Makefile
6036 data/net_4_5/Browsers/Makefile
6037 data/mint.pc
6038 data/mono-2.pc
6039 data/monosgen-2.pc
6040 data/mono.pc
6041 data/mono-cairo.pc
6042 data/mono-nunit.pc
6043 data/mono-options.pc
6044 data/mono-lineeditor.pc
6045 data/monodoc.pc
6046 data/dotnet.pc
6047 data/dotnet35.pc
6048 data/wcf.pc
6049 data/cecil.pc
6050 data/system.web.extensions_1.0.pc
6051 data/system.web.extensions.design_1.0.pc
6052 data/system.web.mvc.pc
6053 data/system.web.mvc2.pc
6054 data/system.web.mvc3.pc
6055 data/aspnetwebstack.pc
6056 data/reactive.pc
6057 samples/Makefile
6058 support/Makefile
6059 data/config
6060 tools/Makefile
6061 tools/locale-builder/Makefile
6062 tools/sgen/Makefile
6063 tools/monograph/Makefile
6064 tools/pedump/Makefile
6065 runtime/Makefile
6066 msvc/Makefile
6067 po/Makefile
6070 if test x$host_win32 = xyes; then
6071    # Get rid of 'cyg' prefixes in library names
6072    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6073    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
6074    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
6075    # executable doesn't work...
6076    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6079 if test x$host_darwin = xyes; then
6080    # This doesn't seem to be required and it slows down parallel builds
6081    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
6085   case $prefix in
6086   NONE) prefix=$ac_default_prefix ;;
6087   esac
6088   case $exec_prefix in
6089   NONE) exec_prefix='${prefix}' ;;
6090   esac
6092   #
6093   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
6094   # any existing config.make.  This allows people to share the same source tree
6095   # with different build directories, one native and one cross
6096   #
6097   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
6099     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
6101     echo "prefix=$prefix" > $mcs_topdir/build/config.make
6102     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
6103     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
6104     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
6105     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
6106     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
6107     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
6108     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
6109     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
6111     case $INSTALL in
6112     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
6113     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
6114     esac
6116     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
6118     export VERSION
6119     [myver=$($AWK 'BEGIN {
6120       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
6121       if(length(vsplit [1]) > 4) {
6122         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
6123       }
6124       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
6125     }')]
6127     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
6128     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
6130     if test x$host_darwin = xyes; then
6131       echo "BUILD_PLATFORM = macos" >> $mcs_topdir/build/config.make
6132       echo "HOST_PLATFORM ?= macos" >> $mcs_topdir/build/config.make
6133       echo "XTEST_PLATFORM ?= osx" >> $mcs_topdir/build/config.make
6134     elif test x$host_win32 = xyes; then
6135       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
6136       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
6137       echo "XTEST_PLATFORM ?= windows" >> $mcs_topdir/build/config.make
6138     elif test x$host_linux = xyes; then
6139       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
6140       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6141       echo "XTEST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6142     else
6143       echo "BUILD_PLATFORM = unix" >> $mcs_topdir/build/config.make
6144       echo "HOST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6145       echo "XTEST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6146     fi
6148     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
6149       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
6150     fi
6152         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
6153            enable_system_aot=yes
6154         fi
6156     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
6157       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
6158     fi
6160     if test x$DISABLE_MCS_DOCS = xyes; then
6161       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
6162     fi
6164     if test x$has_extension_module != xno; then
6165         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
6166     fi
6167     
6168     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
6169     
6170     if test "x$test_bcl_opt" = "xyes"; then    
6171       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
6172     fi
6174     echo "CSC_LOCATION = $CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
6176     if test $csc_compiler = mcs; then
6177       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
6178     fi
6180     if test "x$AOT_BUILD_FLAGS" != "x" ; then
6181       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
6182       echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
6183       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
6184     fi
6186     if test "x$AOT_MODE" != "x" ; then
6187       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
6188     fi
6190     if test "x$enable_btls" = "xyes"; then
6191       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
6192     fi
6194     if test "x$mono_native" = "xyes"; then
6195       echo "MONO_NATIVE_SUPPORTED=true" >> $srcdir/$mcsdir/build/config.make
6196     else
6197       echo "MONO_NATIVE_SUPPORTED=false" >> $srcdir/$mcsdir/build/config.make
6198     fi
6200     if test x$mono_native_compat = xyes; then
6201       echo "MONO_NATIVE_USING_COMPAT=true" >> $srcdir/$mcsdir/build/config.make
6202     else
6203       echo "MONO_NATIVE_USING_COMPAT=false" >> $srcdir/$mcsdir/build/config.make
6204     fi
6206     echo "MONO_NATIVE_PLATFORM_TYPE=$MONO_NATIVE_PLATFORM_TYPE" >> $srcdir/$mcsdir/build/config.make
6207     echo "MONO_NATIVE_PLATFORM=$MONO_NATIVE_PLATFORM" >> $srcdir/$mcsdir/build/config.make
6209   fi
6213 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
6215 btls_platform_string=
6216 if test x$enable_btls = xyes; then
6217         if test x$btls_android = xyes; then
6218                 btls_platform_string=" (android:$BTLS_PLATFORM)"
6219         else
6220                 btls_platform_string=" ($BTLS_PLATFORM)"
6221         fi
6224 thread_suspend_msg=
6225 if test x$buildsgen = xyes; then
6226         if test x$enable_cooperative_suspend != xno; then
6227                 thread_suspend_msg="Suspend:       Cooperative"
6228         elif test x$enable_hybrid_suspend != xno; then
6229                 thread_suspend_msg="Suspend:       Hybrid"
6230         else
6231                 thread_suspend_msg="Suspend:       Preemptive"
6232         fi
6234         
6235 echo "
6236         mcs source:    $mcsdir
6237         C# Compiler:   $csc_compiler
6239    Engine:
6240         Host:          $host
6241         Target:        $target
6242         GC:            $gc_msg 
6243         $thread_suspend_msg
6244         TLS:           $with_tls
6245         SIGALTSTACK:   $with_sigaltstack
6246         Engine:        $jit_status
6247         BigArrays:     $enable_big_arrays
6248         DTrace:        $enable_dtrace
6249         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm, built in-tree: $internal_llvm, assertions: $enable_llvm_asserts)
6250         Spectre:       $spectre_mitigation_status
6251         Mono.Native:   $mono_native_text
6253    Libraries:
6254         .NET 4.x:        $with_profile4_x
6255         Xamarin.Android: $with_monodroid
6256         Xamarin.iOS:     $with_monotouch
6257         Xamarin.WatchOS: $with_monotouch_watch
6258         Xamarin.TVOS:    $with_monotouch_tv
6259         Xamarin.Mac:     $with_xammac
6260         Windows AOT:     $with_winaot
6261         Orbis:           $with_orbis
6262         Unreal:          $with_unreal
6263         WebAssembly:     $with_wasm
6264         Test profiles:   AOT Full ($with_testing_aot_full), AOT Hybrid ($with_testing_aot_hybrid)
6265         JNI support:     $jdk_headers_found
6266         libgdiplus:      $libgdiplus_msg
6267         zlib:            $zlib_msg
6268         BTLS:            $enable_btls$btls_platform_string
6269         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
6270         crash reporting: $crash_reporting (private crashes: $with_crash_privacy)
6271         $disabled
6273 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
6274    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)