Null terminate in mono_string_to_byvalstr like the comment says (#11985)
[mono-project.git] / configure.ac
blobb6183afa10cdd4f38afe54a953a60a6d36cc570a
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=26622411-EB89-4555-AA99-51C982BC19EF
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 enable_llvm_msvc_only="no"
3829 if test "x$enable_llvm" = "xyes"; then
3830         if test "x$host_win32" = "xyes"; then
3831                 if test "x$cross_compiling" = "xno"; then
3832                         case "$target" in
3833                         x86_64*)
3834                                 AC_MSG_WARN("LLVM for host=Windows and target=Windows is only supported on x64 MSVC builds. Disabling LLVM for GCC build.")
3835                                 enable_llvm_msvc_only="yes"
3836                                 ;;
3837                         i686*)
3838                                 AC_MSG_ERROR("LLVM for host=Windows and target=Windows is only supported for x64 builds.")
3839                                 ;;
3840                         esac
3841                 fi
3842                 if test "x$enable_loadedllvm" = "xyes"; then
3843                         AC_MSG_WARN("Loadable LLVM currently not supported on Windows. Disabling feature.")
3844                         enable_loadedllvm=no
3845                 fi
3846         fi
3849 internal_llvm="no"
3850 if test "x$enable_llvm" = "xyes"; then
3851         if test "x$with_llvm" != "x"; then
3852                 EXTERNAL_LLVM_CONFIG=$with_llvm/bin/llvm-config
3853                 if test x$host_win32 = xyes; then
3854                         EXTERNAL_LLVM_CONFIG=$EXTERNAL_LLVM_CONFIG.exe
3855                 fi
3856                 if test ! -x $EXTERNAL_LLVM_CONFIG; then
3857                         AC_MSG_ERROR([LLVM executable $EXTERNAL_LLVM_CONFIG not found.])
3858                 fi
3859         else
3860                 if test x$host_win32 = xyes; then
3861                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config.exe, no)
3862                 else
3863                         AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config, no)
3864                 fi
3865                 if test "x$EXTERNAL_LLVM_CONFIG" = "xno"; then
3866                         internal_llvm=yes
3867                 fi
3868         fi
3870         LLVM_CODEGEN_LIBS="x86codegen"
3871         case "$target" in
3872         arm*)
3873                 LLVM_CODEGEN_LIBS="armcodegen"
3874                 ;;
3875         aarch64*)
3876                 LLVM_CODEGEN_LIBS="aarch64codegen"
3877                 ;;
3878         powerpc*)
3879                 LLVM_CODEGEN_LIBS="powerpccodegen"
3880                 ;;
3881         esac
3882         if test "x$host" != "x$target"; then
3883                 # No need for jit libs
3884                 LLVM_CODEGEN_LIBS=
3885         fi
3887         AC_SUBST(LLVM_CODEGEN_LIBS)
3888         AC_SUBST(EXTERNAL_LLVM_CONFIG)
3890         if test "x$host_win32" = "xyes" && test "x$cross_compiling" = "xno" &&  test "x$internal_llvm" = "xno"; then
3891                 EXTERNAL_LLVM_CONFIG_WIN32=$(cygpath -m $EXTERNAL_LLVM_CONFIG)
3892                 AC_SUBST(EXTERNAL_LLVM_CONFIG_WIN32)
3893         fi
3894         if test "x$enable_llvm_msvc_only" != "xyes"; then
3895                 AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
3896         else
3897                 AC_DEFINE(ENABLE_LLVM_MSVC_ONLY, 1, [Enable the LLVM back end])
3898         fi
3899 fi # ENABLE_LLVM
3901 # AC_DEFINE necessary for correct restore behavior on Linux
3902 AM_CONDITIONAL(INTERNAL_LLVM, [test "x$internal_llvm" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
3903 if test "x$internal_llvm" != "xno"; then
3904         if test "x$enable_llvm_msvc_only" != "xyes"; then
3905                 AC_DEFINE(INTERNAL_LLVM, 1, [LLVM used is being build during mono build])
3906         else
3907                 AC_DEFINE(INTERNAL_LLVM_MSVC_ONLY, 1, [LLVM used is being build during mono build])
3908         fi
3911 AM_CONDITIONAL(INTERNAL_LLVM_ASSERTS, [test "x$enable_llvm_asserts" != "xno" && test "x$enable_llvm_msvc_only" != "xyes"])
3912 if test "x$enable_llvm_asserts" != "xno"; then
3913         if test "x$enable_llvm_msvc_only" != "xyes"; then
3914                 AC_DEFINE(INTERNAL_LLVM_ASSERTS, 1, [Build LLVM with assertions])
3915         else
3916                 AC_DEFINE(INTERNAL_LLVM_ASSERTS_MSVC_ONLY, 1, [Build LLVM with assertions])
3917         fi
3920 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes && test x$enable_llvm_msvc_only != xyes])
3922 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes && test x$enable_llvm_msvc_only != xyes])
3923 if test "x$enable_loadedllvm" = "xyes"; then
3924         if test "x$enable_llvm_msvc_only" != "xyes"; then
3925                 AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
3926         fi
3929 if test "x$enable_llvm" = "xyes"; then
3930         enable_llvm_runtime=yes
3933 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes && test x$enable_llvm_msvc_only != xyes])
3934 if test "x$enable_llvm_runtime" = "xyes"; then
3935         if test "x$enable_llvm_msvc_only" != "xyes"; then
3936                 AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
3937         else
3938                 AC_DEFINE(ENABLE_LLVM_RUNTIME_MSVC_ONLY, 1, [Runtime support code for llvm enabled])
3939         fi
3942 TARGET="unknown"
3943 ACCESS_UNALIGNED="yes"
3945 LIBC="libc.so.6"
3946 INTL="libc.so.6"
3947 SQLITE="libsqlite.so.0"
3948 SQLITE3="libsqlite3.so.0"
3949 X11="libX11.so"
3950 GDKX11="libgdk-x11-2.0.so.0"
3951 GTKX11="libgtk-x11-2.0.so.0"
3952 XINERAMA="libXinerama.so.1"
3954 sizeof_register="SIZEOF_VOID_P"
3956 jit_wanted=true
3957 boehm_supported=true
3958 BTLS_SUPPORTED=no
3959 BTLS_PLATFORM=
3961 case "$host" in
3962         wasm32*)
3963                 TARGET=WASM
3964                 arch_target=wasm
3965                 BTLS_SUPPORTED=no
3966                 ACCESS_UNALIGNED="no"
3967                 with_tls=pthread
3968                 ;;
3969         mips*)
3970                 TARGET=MIPS;
3971                 arch_target=mips;
3972                 with_tls=pthread;
3973                 ACCESS_UNALIGNED="no"
3975                 AC_MSG_CHECKING(for mips n32)
3976                 AC_TRY_COMPILE([],[
3977                 #if _MIPS_SIM != _ABIN32
3978                 #error Not mips n32
3979                 #endif
3980                 ],[
3981                 AC_MSG_RESULT(yes)
3982                 sizeof_register=8
3983                 ],[
3984                 AC_MSG_RESULT(no)
3985                 ])
3986                 ;;
3987         i*86-*-*)
3988                 TARGET=X86;
3989                 arch_target=x86;
3990                 case $host_os in
3991                   solaris*)
3992                         LIBC="libc.so"
3993                         INTL="libintl.so"
3994                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3995                                 TARGET=AMD64
3996                                 arch_target=amd64
3997                         fi
3999                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
4000                         # int astruct __attribute__ ((visibility ("hidden")));
4001                         # void foo ()
4002                         # {
4003                         #       void *p = &astruct;
4004                         # }
4005                         # gcc -fPIC --shared -o libfoo.so foo.c
4006                         # yields:
4007                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
4008                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
4009                         have_visibility_hidden=no
4010                         ;;
4011                   mingw*|cygwin*)
4012                         have_visibility_hidden=no
4013                         BTLS_SUPPORTED=no
4014                         BTLS_PLATFORM=i386
4015                         ;;
4016                   haiku*)
4017                         LIBC=libroot.so
4018                         ;;
4019                   linux*)
4020                         AOT_SUPPORTED="yes"
4021                         BTLS_SUPPORTED=yes
4022                         BTLS_PLATFORM=i386
4023                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4024                         ;;
4025                   darwin*)
4026                         AOT_SUPPORTED="yes"
4027                         BTLS_SUPPORTED=yes
4028                         BTLS_PLATFORM=i386
4029                         ;;
4030                   openbsd*|freebsd*|kfreebsd-gnu*)
4031                         AOT_SUPPORTED="yes"
4032                         BTLS_SUPPORTED=yes
4033                         BTLS_PLATFORM=i386
4034                         ;;
4035                 esac
4036                 ;;
4037         x86_64-*-* | amd64-*-*)
4038                 TARGET=AMD64;
4039                 arch_target=amd64;
4040                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
4041                         AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4042                         sizeof_register=8
4043                 fi
4044                 case $host_os in
4045                   linux*)
4046                         AOT_SUPPORTED="yes"
4047                         BTLS_SUPPORTED=yes
4048                         BTLS_PLATFORM=x86_64
4049                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4050                         ;;
4051                   darwin*)
4052                         AOT_SUPPORTED="yes"
4053                         BTLS_SUPPORTED=yes
4054                         BTLS_PLATFORM=x86_64
4055                         boehm_supported=false
4056                         ;;
4057                   openbsd*|freebsd*|kfreebsd-gnu*)
4058                         AOT_SUPPORTED="yes"
4059                         BTLS_SUPPORTED=yes
4060                         BTLS_PLATFORM=x86_64
4061                         ;;
4062                   mingw*|cygwin*)
4063                         BTLS_SUPPORTED=no
4064                         BTLS_PLATFORM=x86_64
4065                         ;;
4066                 esac
4067                 ;;
4068         sparc*-*-*)
4069                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4070                    TARGET=SPARC64
4071                 else
4072                         TARGET=SPARC
4073                 fi
4074                 arch_target=sparc;
4075                 ACCESS_UNALIGNED="no"
4076                 case $host_os in
4077                   linux*) ;;
4078                   *)
4079                         LIBC="libc.so"
4080                         INTL="libintl.so"
4081                 esac
4082                 if test x"$GCC" = xyes; then
4083                         # We don't support v8 cpus
4084                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
4085                 fi
4086                 if test x"$AR" = xfalse; then
4087                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
4088                 fi
4089                 ;;
4090         *-mingw*|*-*-cygwin*)
4091                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
4092                 have_visibility_hidden=no
4093                 INTL="intl"
4094                 ;;
4095         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
4096         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
4097         powerpc-*-freebsd* | powerpc*-*-aix* | powerpc*-*-os400* )
4098                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4099                         TARGET=POWERPC64;
4100                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
4101                         if ! (echo $CC | grep -q -- 'clang'); then
4102                                 CFLAGS="$CFLAGS -mminimal-toc"
4103                         fi
4104                 else
4105                         TARGET=POWERPC;
4106                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
4107                 fi
4108                 arch_target=ppc;
4109                 case $host_os in
4110                   aix*|os400*)
4111                         BTLS_SUPPORTED=yes
4112                         BTLS_PLATFORM=powerpc
4113                         dnl on AIX/PASE, shared libraries can be inside archives
4114                         dnl if they are, we specify them by lib.a(lib.so)
4115                         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX, so
4116                         LIBC="libc.a(shr_64.o)"
4117                         INTL="libintl.a(libintl.so.8)"
4118                         ;;
4119                   linux*)
4120                         BTLS_SUPPORTED=yes
4121                         BTLS_PLATFORM=powerpc
4122                         ;;
4123                 esac
4124                 ;;
4125         armv7k-*-darwin*)
4126                 TARGET=ARM;
4127                 TARGET_SYS=WATCHOS
4128                 arch_target=arm;
4129                 arm_fpu=VFP_HARD
4130                 ACCESS_UNALIGNED="no"
4131                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4132                 ;;
4134         arm*-darwin*)
4135                 TARGET=ARM;
4136                 arch_target=arm;
4137                 ACCESS_UNALIGNED="no"
4138                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4139                 ;;
4140         arm*-linux*)
4141                 TARGET=ARM;
4142                 arch_target=arm;
4143                 ACCESS_UNALIGNED="no"
4144                 AOT_SUPPORTED="yes"
4145                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4146                 BTLS_SUPPORTED=yes
4147                 BTLS_PLATFORM=arm
4148                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4149                 case "$target" in
4150                 arm*-linux*-gnueabi)
4151                         BTLS_PLATFORM=armsoft
4152                         ;;
4153                 esac
4154                 ;;
4155         arm*-netbsd*-eabi*)
4156                 TARGET=ARM;
4157                 arch_target=arm;
4158                 ACCESS_UNALIGNED="no"
4159                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4160                 ;;
4161         aarch64-*)
4162                 # https://lkml.org/lkml/2012/7/15/133
4163                 TARGET=ARM64
4164                 arch_target=arm64
4165                 boehm_supported=false
4166                 AOT_SUPPORTED="yes"
4167                 BTLS_SUPPORTED=yes
4168                 BTLS_PLATFORM=aarch64
4169                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4170                 ;;
4171         s390x-*-linux*)
4172                 TARGET=S390X;
4173                 arch_target=s390x;
4174                 ACCESS_UNALIGNED="yes"
4175                 BTLS_SUPPORTED=yes
4176                 BTLS_PLATFORM=s390x
4177                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
4178                 ;;
4179         riscv32-*)
4180                 TARGET=RISCV32
4181                 ACCESS_UNALIGNED=no
4182                 AOT_SUPPORTED=no
4183                 BTLS_SUPPORTED=yes
4184                 BTLS_PLATFORM=riscv32
4185                 arch_target=riscv32
4186                 boehm_supported=false
4187                 ;;
4188         riscv64*)
4189                 TARGET=RISCV64
4190                 ACCESS_UNALIGNED=no
4191                 AOT_SUPPORTED=no
4192                 BTLS_SUPPORTED=yes
4193                 BTLS_PLATFORM=riscv64
4194                 arch_target=riscv64
4195                 boehm_supported=false
4196                 ;;
4197 esac
4199 HOST=$TARGET
4201 if test "x$host" != "x$target"; then
4202    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
4203    enable_mcs_build=no
4204    enable_support_build=no
4205    BTLS_SUPPORTED=no
4206    # Can't use tls, since it depends on the runtime detection of tls offsets
4207    # in mono-compiler.h
4208    with_tls=pthread
4209    target_mach=no
4210    case "$target" in
4211    wasm32*)
4212                 TARGET=WASM
4213                 arch_target=wasm
4214                 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
4215                 ;;
4216    arm*-darwin*)
4217                 TARGET=ARM;
4218                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4219                 case "$target" in
4220                 armv7k-*)
4221                         arm_fpu=VFP_HARD
4222                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
4223                         ;;
4224                 esac            
4225                 ;;
4226    powerpc64-ps3-linux-gnu)
4227                 TARGET=POWERPC64
4228                 arch_target=powerpc64
4229                 AC_DEFINE(TARGET_PS3, 1, [...])
4230                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4231                 # uses this define
4232                 AC_DEFINE(__mono_ppc64__, 1, [...])
4233                 AC_DEFINE(MONO_ARCH_ILP32, 1, [64 bit mode with 4 byte longs and pointers])
4234                 sizeof_register=8
4235                 target_byte_order=G_BIG_ENDIAN
4236                 ;;
4237    powerpc64-xbox360-linux-gnu)
4238                 TARGET=POWERPC64
4239                 arch_target=powerpc64
4240                 AC_DEFINE(TARGET_XBOX360, 1, [...])
4241                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4242                 # uses this define
4243                 sizeof_register=8
4244                 target_byte_order=G_BIG_ENDIAN
4245                 ;;
4246    arm*-linux-*)
4247                 TARGET=ARM;
4248                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4249                 ;;
4250    arm*-netbsd*-eabi*)
4251                 TARGET=ARM;
4252                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4253                 ;;
4254    i686*-linux-*)
4255                 TARGET=X86;
4256                 ;;
4257    i*86-apple-*)
4258                 TARGET=X86;
4259                 ;;
4260    x86_64*-linux-*)
4261                 TARGET=AMD64;
4262                 ;;
4263    x86_64-ps4-freebsd)
4264                 TARGET=AMD64;
4265                 AC_DEFINE(TARGET_PS4, 1, [...])
4266                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
4267                 CPPFLAGS="$CPPFLAGS"
4268                 target_win32=no
4269                 ;;
4270    aarch64*-linux-*)
4271                 TARGET=ARM64;
4272                 ;;
4273         aarch64-*)
4274                 TARGET=ARM64
4275                 ;;
4276         riscv32*)
4277                 TARGET=RISCV32
4278                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4279                 AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4280                 arch_target=riscv32
4281                 target_mach=no
4282                 with_tls=pthread
4283                 ;;
4284         riscv64*)
4285                 TARGET=RISCV64
4286                 AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4287                 AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4288                 arch_target=riscv64
4289                 target_mach=no
4290                 with_tls=pthread
4291                 ;;
4292         *)
4293                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
4294         esac
4296         case "$target" in
4297         *-darwin*)
4298                 target_mach=yes
4299                 ;;
4300         *-linux-android*)
4301                 AC_DEFINE(TARGET_ANDROID, 1, [...])
4302                 ;;
4303         esac
4306 case "$TARGET" in
4307 WASM)
4308         AC_DEFINE(TARGET_WASM, 1, [...])
4309         arch_target=wasm
4310         ;;
4311 X86)
4312         AC_DEFINE(TARGET_X86, 1, [...])
4313         arch_target=x86
4314         ;;
4315 AMD64)
4316         AC_DEFINE(TARGET_AMD64, 1, [...])
4317         arch_target=amd64
4318         ;;
4319 ARM)
4320         AC_DEFINE(TARGET_ARM, 1, [...])
4321         arch_target=arm
4322         ACCESS_UNALIGNED="no"
4323         ;;
4324 ARM64)
4325         AC_DEFINE(TARGET_ARM64, 1, [...])
4326         arch_target=arm64
4327         ;;
4328 POWERPC)
4329         AC_DEFINE(TARGET_POWERPC, 1, [...])
4330         ;;
4331 POWERPC64)
4332         AC_DEFINE(TARGET_POWERPC, 1, [...])
4333         AC_DEFINE(TARGET_POWERPC64, 1, [...])
4334         ;;
4335 S390X)
4336         AC_DEFINE(TARGET_S390X, 1, [...])
4337         ;;
4338 MIPS)
4339         AC_DEFINE(TARGET_MIPS, 1, [...])
4340         ;;
4341 SPARC)
4342         AC_DEFINE(TARGET_SPARC, 1, [...])
4343         ;;
4344 SPARC64)
4345         AC_DEFINE(TARGET_SPARC64, 1, [...])
4346         ;;
4347 RISCV32)
4348         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4349         AC_DEFINE([TARGET_RISCV32], [1], [Target is 32-bit RISC-V])
4350         ;;
4351 RISCV64)
4352         AC_DEFINE([TARGET_RISCV], [1], [Target is RISC-V])
4353         AC_DEFINE([TARGET_RISCV64], [1], [Target is 64-bit RISC-V])
4354         ;;
4355 esac
4357 case "$TARGET" in
4358 *32* | ARM | X86 | POWERPC | MIPS | SPARC | WASM | ARM6432)
4359     target_sizeof_void_p=4
4360     ;;
4361 *64* | S390X)
4362     target_sizeof_void_p=8
4363     ;;
4365     AC_MSG_ERROR([unknown target])
4366     ;;
4367 esac
4369 case "$HOST" in
4370 WASM)
4371         AC_DEFINE(HOST_WASM, 1, [...])
4372         ;;
4373 X86)
4374         AC_DEFINE(HOST_X86, 1, [...])
4375         ;;
4376 AMD64)
4377         AC_DEFINE(HOST_AMD64, 1, [...])
4378         ;;
4379 ARM)
4380         AC_DEFINE(HOST_ARM, 1, [...])
4381         ;;
4382 ARM64)
4383         AC_DEFINE(HOST_ARM64, 1, [...])
4384         ;;
4385 POWERPC)
4386         AC_DEFINE(HOST_POWERPC, 1, [...])
4387         ;;
4388 POWERPC64)
4389         AC_DEFINE(HOST_POWERPC, 1, [...])
4390         AC_DEFINE(HOST_POWERPC64, 1, [...])
4391         ;;
4392 S390X)
4393         AC_DEFINE(HOST_S390X, 1, [...])
4394         ;;
4395 MIPS)
4396         AC_DEFINE(HOST_MIPS, 1, [...])
4397         ;;
4398 SPARC)
4399         AC_DEFINE(HOST_SPARC, 1, [...])
4400         ;;
4401 SPARC64)
4402         AC_DEFINE(HOST_SPARC64, 1, [...])
4403         ;;
4404 RISCV32)
4405         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4406         AC_DEFINE([HOST_RISCV32], [1], [Host is 32-bit RISC-V])
4407         ;;
4408 RISCV64)
4409         AC_DEFINE([HOST_RISCV], [1], [Host is RISC-V])
4410         AC_DEFINE([HOST_RISCV64], [1], [Host is 64-bit RISC-V])
4411         ;;
4412 esac
4414 MONO_ARCH_GSHAREDVT_SUPPORTED=0
4415 case "$HOST" in
4416 X86 | AMD64 | ARM | ARM64)
4417         MONO_ARCH_GSHAREDVT_SUPPORTED=1 # keep in sync with mini-{x86,amd64,arm,arm64}.h
4418         ;;
4419 esac
4421 AM_CONDITIONAL(MONO_ARCH_GSHAREDVT_SUPPORTED, test $MONO_ARCH_GSHAREDVT_SUPPORTED = 1)
4422 AM_CONDITIONAL(TARGET_WASM, test $arch_target = wasm)
4424 dnl *************
4425 dnl *** VTUNE ***
4426 dnl *************
4428 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
4429 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
4431 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
4433 if test "x$enable_vtune" = "xyes"; then
4434         if test "x$with_vtune" = "x"; then
4435                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
4436         else
4437                 VTUNE_PATH=$with_vtune
4438         fi
4439         VTUNE_INCLUDE=$VTUNE_PATH/include
4440         case "$TARGET" in
4441         X86)
4442                 VTUNE_LIB=$VTUNE_PATH/lib32
4443                 ;;
4444         AMD64)
4445                 VTUNE_LIB=$VTUNE_PATH/lib64
4446                 ;;
4447         *)
4448                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
4449                 ;;
4450         esac
4451         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
4452                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
4453         fi
4454         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
4455                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
4456         fi
4458         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
4459         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
4461         AC_SUBST(VTUNE_LIBS)
4462         AC_SUBST(VTUNE_CFLAGS)
4464 dnl Use GCC atomic ops if they work on the target.
4465 if test x$GCC = "xyes"; then
4466         case $TARGET in
4467         X86 | AMD64 | ARM | ARM64 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64 | RISCV32 | RISCV64)
4468                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
4469                 ;;
4470         esac
4473 if test "x$target_mach" = "xyes"; then
4475    if test "x$TARGET_SYS" = "xWATCHOS"; then
4476           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
4477           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4478           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4479           BTLS_SUPPORTED=no
4480    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64"; then
4481           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4482           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4483           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4484           BTLS_SUPPORTED=no
4485           target_ios=yes
4486    else
4487        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
4488        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
4489        #error fail this for ios
4490        #endif
4491        ], [
4492                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
4493           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
4494           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
4495           target_osx=yes
4496        ], [
4497           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4498           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4499           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4500           BTLS_SUPPORTED=no
4501                   target_ios=yes
4502        ])
4503         fi
4504    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
4507 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
4509 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
4511 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
4512    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
4513 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
4514    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
4515 else
4516    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
4519 AC_DEFINE_UNQUOTED(TARGET_SIZEOF_VOID_P,${target_sizeof_void_p},[wordsize of target])
4521 if test "x$sizeof_register" = "x4"; then
4522   AC_DEFINE(SIZEOF_REGISTER,4,[size of target machine integer registers])
4523 elif test "x$sizeof_register" = "x8"; then
4524   AC_DEFINE(SIZEOF_REGISTER,8,[size of target machine integer registers])
4525 else
4526   AC_DEFINE_UNQUOTED(SIZEOF_REGISTER,${target_sizeof_void_p},[size of target machine integer registers])
4529 if test "x$have_visibility_hidden" = "xyes"; then
4530    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
4533 if test "x$have_deprecated" = "xyes"; then
4534    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
4537 dnl 
4538 dnl Simple Generational checks (sgen)
4540 SGEN_DEFINES=
4541 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
4542 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
4543 if test x$buildsgen = xyes; then
4544    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
4545    SGEN_DEFINES="-DHAVE_SGEN_GC"
4547         conc_gc_msg=""
4548    if test x$with_sgen_default_concurrent != xno; then
4549        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
4550            conc_gc_msg=" (concurrent by default)"
4551    fi
4553    if test "x$gc_msg" = "x"; then
4554       gc_msg="sgen$conc_gc_msg"
4555    else
4556       gc_msg="sgen$conc_gc_msg and $gc_msg"
4557    fi
4559 AC_SUBST(SGEN_DEFINES)
4560 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
4562 jit_status="Building and using the JIT"
4564 libsuffix=".so"
4566 case "$host" in
4567      *-*-darwin*)
4568         libsuffix=".dylib"
4569         LIBC="libc.dylib"
4570         INTL="libintl.dylib"
4571         SQLITE="libsqlite.0.dylib"
4572         SQLITE3="libsqlite3.0.dylib"
4573         X11="libX11.dylib"
4574         GDKX11="libgdk-x11-2.0.dylib"
4575         GTKX11="libgtk-x11-2.0.dylib"
4576         ;;
4577      *-*-*netbsd*)
4578         LIBC="libc.so"
4579         INTL="libintl.so"
4580         SQLITE="libsqlite.so"
4581         SQLITE3="libsqlite3.so"
4582         ;;
4583      *-*-kfreebsd*-gnu)
4584         LIBC="libc.so.0.1"
4585         INTL="libc.so.0.1"
4586         X11="libX11.so.6"
4587         ;;
4588     *-*-*freebsd*)
4589         LIBC="libc.so.7"
4590         INTL="libintl.so"
4591         SQLITE="libsqlite.so"
4592         SQLITE3="libsqlite3.so"
4593         ;;
4594     *-*-*openbsd*)
4595         LIBC="libc.so"
4596         INTL="libintl.so"
4597         SQLITE="libsqlite.so"
4598         SQLITE3="libsqlite3.so"
4599         ;;
4600     *-*-*linux*)
4601         AC_PATH_X
4602         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
4603         AC_MSG_CHECKING(for the soname of libX11.so)
4604         for i in $x_libraries $dlsearch_path; do
4605                 for r in 4 5 6; do
4606                         if test -f $i/libX11.so.$r; then
4607                                 X11=libX11.so.$r
4608                                 AC_MSG_RESULT($X11)
4609                         fi
4610                 done
4611         done
4612         
4613         if test "x$X11" = "xlibX11.so"; then
4614                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
4615                 X11=libX11.so.6
4616         fi
4617         ;;
4618 esac
4620 AC_SUBST(libsuffix)
4622 ######################################
4623 # EGLIB CHECKS
4624 ######################################
4626 GNUC_PRETTY=
4627 GNUC_UNUSED=
4628 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
4629 if test x$GCC = xyes; then
4630    GNUC_UNUSED='__attribute__((__unused__))'
4631    GNUC_NORETURN='__attribute__((__noreturn__))'
4632    case $host_cpu in
4633      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
4634    esac
4636 AC_SUBST(GNUC_PRETTY)
4637 AC_SUBST(GNUC_UNUSED)
4638 AC_SUBST(GNUC_NORETURN)
4639 AC_SUBST(BREAKPOINT)
4641 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
4643 case $host in
4644 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
4645     PATHSEP='\\'
4646     SEARCHSEP=';'
4647     OS="WIN32"
4648     PIDTYPE='void *'
4649     ;;
4651     PATHSEP='/'
4652     SEARCHSEP=':'
4653     OS="UNIX"
4654     PIDTYPE='int'
4655     ;;
4656 esac
4658 case $host in
4659         *-*-solaris*)
4660         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
4661         ;;
4662 esac
4664 case $target in
4665 arm*-darwin*|aarch64*-*|riscv*)
4666     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
4667     ;;
4668 i*86-*-darwin*)
4669     ORDER=G_LITTLE_ENDIAN
4670     ;;
4671 *-*-haiku*)
4672     LDFLAGS="$LDFLAGS -ltextencoding"
4673     ;;
4674 *-*-openbsd*)
4675     CFLAGS="$CFLAGS -pthread"
4676     LDFLAGS="$LDFLAGS -pthread"
4677     ;;
4678 esac
4680 AC_SUBST(ORDER)
4681 AC_SUBST(CFLAGS)
4682 AC_SUBST(PATHSEP)
4683 AC_SUBST(SEARCHSEP)
4684 AC_SUBST(OS)
4685 AC_SUBST(PIDTYPE)
4687 # Defined for all targets/platforms using classic Windows API support.
4688 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
4689 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
4691 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf)
4692 AC_CHECK_FUNCS(getrlimit)
4693 AC_CHECK_FUNCS(fork execv execve)
4694 AC_CHECK_FUNCS(waitpid)
4696 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
4698 if test x$with_overridable_allocators = xyes; then
4699         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
4700   AC_MSG_NOTICE([Overridable allocator support enabled])
4701 else
4702   AC_MSG_NOTICE([Overridable allocator support disabled])
4706 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
4707 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
4708 # removed once support for 10.6 is dropped.
4710 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
4712 if test x$target_osx = xyes; then
4713 AC_CHECK_FUNCS(getpwuid_r)
4714 elif test x$target_ios = xno; then
4715 AC_CHECK_FUNCS(strndup getpwuid_r)
4718 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
4720 AC_SEARCH_LIBS(sqrtf, m)
4722 # nanosleep may not be part of libc, also search it in other libraries
4723 AC_SEARCH_LIBS(nanosleep, rt)
4725 AC_SEARCH_LIBS(dlopen, dl)
4726 old_ldflags="${LDFLAGS}"
4727 # GNU specific option, this confuses IBM ld, but do offer alternatives when possible
4728 if test $lt_cv_prog_gnu_ld = yes; then
4729         LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4730 else
4731         case $host in
4732         *-*-aix*|*-*-os400*)
4733                 ;;
4734         *)
4735                 dnl Try to use export-dynamic anyways
4736                 LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4737                 ;;
4738         esac
4740 AC_TRY_LINK(, [int i;], found_export_dynamic=yes, found_export_dynamic=no)
4741 if test $found_export_dynamic = no; then
4742         LDFLAGS="${old_ldflags}"
4745 AC_CHECK_HEADERS(getopt.h sys/select.h sys/time.h sys/wait.h pwd.h iconv.h sys/types.h sys/resource.h)
4746 dnl giconv.c will check on HAVE_ICONV_H but we need this for link time
4747 AC_CHECK_LIB(iconv, iconv_open)
4748 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
4749 AC_SUBST(HAVE_ALLOCA_H)
4751 # Get the exact type of size_t, not just its size.
4752 # This is so we can find an exact printf format among u, lu, llu, I64u.
4753 # To avoid warnings about slight mismatches.
4754 # C99 runtime "zu" dependency is being avoided here.
4756 # We have to compile as C++ because C is too lenient
4757 # and lets the wrong thing compile, with warnings.
4759 # Note: "zu" or ifdef <something> have the advantage
4760 # of producing installable "biarch" headers. i.e. one Mac header
4761 # for Mac/x86 and Mac/amd64.
4763 AC_LANG_PUSH(C++)
4765 # Check long before int because it is the overwhelming Unix answer,
4766 # across 32bit and 64bit systems -- fewer compiler invocations in autoconf.
4768 # long ahead of int also tends to produce biarch-compatible headers except Windows.
4770 AC_MSG_CHECKING(if size_t is unsigned long)
4771 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4772         #include <stddef.h>
4773         unsigned long *a = (size_t*)0;
4774 ])], [
4775         AC_MSG_RESULT(yes)
4776         AC_SUBST(GSIZE_FORMAT, '"lu"')
4777 ], [
4778         AC_MSG_RESULT(no)
4779         AC_MSG_CHECKING(if size_t is unsigned int)
4780         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4781                 #include <stddef.h>
4782                 unsigned *a = (size_t*)0;
4783         ])], [
4784                 AC_MSG_RESULT(yes)
4785                 AC_SUBST(GSIZE_FORMAT, '"u"')
4786         ], [
4787 # At this point the majority of systems have their answer,
4788 # and we descend into non-standard or new-standard territory.
4790 # Check __int64 first because I64 on some systems predates ll, enabling
4791 # new compiler/old runtime interop, and the types always have the same size.
4792                 AC_MSG_RESULT(no)
4793                 AC_MSG_CHECKING(if size_t is unsigned __int64)
4794                 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4795                         #include <stddef.h>
4796                         unsigned __int64 *a = (size_t*)0;
4797                 ])], [
4798                         AC_MSG_RESULT(yes)
4799                         AC_SUBST(GSIZE_FORMAT, '"I64u"')
4800                 ], [
4801                         AC_MSG_RESULT(no)
4802                         AC_MSG_CHECKING(if size_t is unsigned long long)
4803                         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4804                                 #include <stddef.h>
4805                                 unsigned long long *a = (size_t*)0;
4806                         ])], [
4807                                 AC_MSG_RESULT(yes)
4808                                 AC_SUBST(GSIZE_FORMAT, '"llu"')
4809                         ], [
4810                                 AC_MSG_RESULT(no)
4811                                 AC_MSG_ERROR(Unable to determine size_t among unsigned long, int, __int64, long long)
4812                         ] )
4813                 ] )
4814         ] )
4815 ] )
4817 AC_LANG_POP
4819 # If size_t/ptrdiff_t is correct, use it. Otherwise C99 [u]intptr_t.
4820 # This provides for an exact match with functions that
4821 # take size_t like malloc and pthread_attr_getstacksize, avoiding warnings.
4822 # uintptr_t is not necessarily the same.
4824 # ptrdiff_t is preferred over ssize_t as it is C89 vs. new Posix.
4825 # ssize_t looks nicer but ptrdiff_t is wrapped up as gssize anyway.
4827 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_size_t; then
4828    GSIZE="size_t"
4829    GSSIZE="ptrdiff_t"
4830 else
4831    GSIZE="uintptr_t"
4832    GSSIZE="intptr_t"
4835 AC_SUBST(GSIZE)
4836 AC_SUBST(GSSIZE)
4837 AC_SUBST(GSIZE_FORMAT)
4840 # END OF EGLIB CHECKS
4843 AC_ARG_WITH([libgdiplus],
4844         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
4845         [], [with_libgdiplus=installed])
4847 # default install location
4848 libgdiplus_install_loc=libgdiplus${libsuffix}
4849 case "$host" in
4850     *-*-*linux*)
4851     libgdiplus_install_loc=libgdiplus${libsuffix}.0
4852     ;;
4853 esac
4855 case $with_libgdiplus in
4856     no)
4857     libgdiplus_loc=
4858     ;;
4860     installed)
4861     libgdiplus_loc=
4862     if test x$cross_compiling = xno; then
4863         if test x$host_darwin = xyes; then
4864             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
4865             if test -x $a; then
4866               libgdiplus_install_loc=$a
4867               libgdiplus_loc=$a
4868             fi
4869         fi
4870     fi
4871     ;;
4873     yes|sibling)
4874     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
4875     ;;
4877     /*) # absolute path, assume it is an install location
4878     libgdiplus_loc=$with_libgdiplus
4879     libgdiplus_install_loc=$with_libgdiplus
4880     ;;
4882     *)
4883     libgdiplus_loc=`pwd`/$with_libgdiplus
4884     ;;
4885 esac
4886 AC_SUBST(libgdiplus_loc)
4887 AC_SUBST(libgdiplus_install_loc)
4889 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)
4890 if test "x$icall_symbol_map" = "xyes"; then
4891    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
4894 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
4895 if test "x$icall_export" = "xyes"; then
4896    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
4899 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
4900 if test "x$icall_tables" = "xno"; then
4901    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
4904 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
4906 if test "x$with_tls" = "x__thread"; then
4907         AC_DEFINE(MONO_KEYWORD_THREAD, __thread, [Have __thread keyword])
4908         # Pass the information to libgc
4909         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
4910         AC_MSG_CHECKING(if the tls_model attribute is supported)
4911         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
4912                 ], [
4913                         AC_MSG_RESULT(yes)
4914                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
4915                 ], [
4916                         AC_MSG_RESULT(no)
4917         ])
4920 if test ${TARGET} = ARM; then
4921         dnl ******************************************
4922         dnl *** Check to see what FPU is available ***
4923         dnl ******************************************
4924         AC_MSG_CHECKING(which FPU to use)
4926         #
4927         # This is a bit tricky:
4928         #
4929         # if (__ARM_PCS_VFP) {
4930         #       /* mfloat-abi=hard == VFP with hard ABI */
4931         # } elif (!__SOFTFP__) {
4932         #       /* mfloat-abi=softfp == VFP with soft ABI */
4933         # } else {
4934         #       /* mfloat-abi=soft == no VFP */
4935         # }
4936         #
4937         # The exception is iOS (w/ GCC) where none of the above
4938         # are defined (but iOS always uses the 'softfp' ABI).
4939         #
4940         # No support for FPA.
4941         #
4943         fpu=NONE
4945         # iOS GCC always uses the 'softfp' ABI.
4946         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
4947                 fpu=VFP
4948         fi
4950         # Are we using the 'hard' ABI?
4951         if test x$fpu = xNONE; then
4952                 AC_TRY_COMPILE([], [
4953                         #ifndef __ARM_PCS_VFP
4954                         #error "Float ABI is not 'hard'"
4955                         #endif
4956                 ], [
4957                         fpu=VFP_HARD
4958                 ], [
4959                         fpu=NONE
4960                 ])
4961         fi
4963         # No 'hard' ABI. 'soft' or 'softfp'?
4964         if test x$fpu = xNONE; then
4965                 AC_TRY_COMPILE([], [
4966                         #ifdef __SOFTFP__
4967                         #error "Float ABI is not 'softfp'"
4968                         #endif
4969                 ], [
4970                         fpu=VFP
4971                 ], [
4972                         fpu=NONE
4973                 ])
4974         fi
4976         if test x$arm_fpu != x; then
4977            fpu=$arm_fpu
4978         fi
4980         AC_MSG_RESULT($fpu)
4981         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
4982         unset fpu
4984         dnl *********************************************
4985         dnl *** Check which ARM version(s) we can use ***
4986         dnl *********************************************
4987         AC_MSG_CHECKING(which ARM version to use)
4989         AC_TRY_COMPILE([], [
4990                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
4991                 #error Not on ARM v5.
4992                 #endif
4993         ], [
4994                 arm_v5=yes
4996                 arm_ver=ARMv5
4997         ], [])
4999         AC_TRY_COMPILE([], [
5000                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
5001                 #error Not on ARM v6.
5002                 #endif
5003         ], [
5004                 arm_v5=yes
5005                 arm_v6=yes
5007                 arm_ver=ARMv6
5008         ], [])
5010         AC_TRY_COMPILE([], [
5011                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
5012                 #error Not on ARM v7.
5013                 #endif
5014         ], [
5015                 arm_v5=yes
5016                 arm_v6=yes
5017                 arm_v7=yes
5019                 arm_ver=ARMv7
5020         ], [])
5022         AC_MSG_RESULT($arm_ver)
5024         if test x$arm_v5 = xyes; then
5025                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
5026                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
5027         fi
5029         if test x$arm_v6 = xyes; then
5030                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
5031                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
5032         fi
5034         if test x$arm_v7 = xyes; then
5035                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
5036                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
5037         fi
5040 if test ${TARGET} = RISCV32 -o ${TARGET} = RISCV64; then
5041         AC_ARG_WITH([riscv-fpabi], [  --with-riscv-fpabi=auto,double,soft   Select RISC-V floating point ABI (auto)], [fpabi=$withval], [fpabi=double])
5043         AC_MSG_CHECKING([which RISC-V floating point ABI to use])
5045         if test x$fpabi = xauto; then
5046                 AC_TRY_COMPILE([], [
5047                         #ifdef __riscv_float_abi_double
5048                         #error "double"
5049                         #endif
5050                 ], [
5051                 ], [
5052                         fpabi=double
5053                 ])
5054         fi
5056         if test x$fpabi = xauto; then
5057                 AC_TRY_COMPILE([], [
5058                         #ifdef __riscv_float_abi_single
5059                         #error "single"
5060                         #endif
5061                 ], [
5062                 ], [
5063                         fpabi=single
5064                 ])
5065         fi
5067         if test x$fpabi = xauto; then
5068                 AC_TRY_COMPILE([], [
5069                         #ifdef __riscv_float_abi_soft
5070                         #error "soft"
5071                         #endif
5072                 ], [
5073                 ], [
5074                         fpabi=soft
5075                 ])
5076         fi
5078         case $fpabi in
5079         double)
5080                 AC_DEFINE([RISCV_FPABI_DOUBLE], [1], [RISC-V FPABI is double-precision])
5081                 AC_MSG_RESULT([double-precision])
5082                 ;;
5083         single)
5084                 AC_DEFINE([RISCV_FPABI_SINGLE], [1], [RISC-V FPABI is single-precision])
5085                 AC_MSG_ERROR([single-precision, not supported])
5086                 ;;
5087         soft)
5088                 AC_DEFINE([RISCV_FPABI_SOFT], [1], [RISC-V FPABI is soft float])
5089                 AC_MSG_RESULT([soft float])
5090                 ;;
5091         auto)
5092                 AC_MSG_ERROR([unknown])
5093                 ;;
5094         *)
5095                 AC_MSG_ERROR([invalid option: $fpabi])
5096                 ;;
5097         esac
5100 if test ${TARGET} = unknown; then
5101         CPPFLAGS="$CPPFLAGS -DNO_PORT"
5102         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
5105 if test "x$platform_android" = "xyes"; then
5106         case "x${TARGET}" in
5107         xARM)
5108                 case "x$arm_ver" in
5109                 xARMv5)
5110                         BTLS_SUPPORTED=yes
5111                         BTLS_PLATFORM=android-armv5
5112                         ;;
5113                 xARMv6)
5114                         BTLS_SUPPORTED=yes
5115                         BTLS_PLATFORM=android-armv6
5116                         ;;
5117                 xARMv7)
5118                         BTLS_SUPPORTED=yes
5119                         BTLS_PLATFORM=android-armv7
5120                         ;;
5121                 *)
5122                         BTLS_SUPPORTED=no
5123                         ;;
5124                 esac
5125                 ;;
5126         xARM64)
5127                 BTLS_SUPPORTED=yes
5128                 BTLS_PLATFORM=android-v8a
5129                 ;;
5130         xX86)
5131                 BTLS_SUPPORTED=yes
5132                 BTLS_PLATFORM=android-x86
5133                 ;;
5134         xAMD64)
5135                 BTLS_SUPPORTED=yes
5136                 BTLS_PLATFORM=android-x64
5137                 ;;
5138         *)
5139                 BTLS_SUPPORTED=no
5140                 ;;
5141         esac
5144 if test ${ACCESS_UNALIGNED} = no; then
5145         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
5148 if test x$host_darwin = xyes; then
5149         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
5150         AS_IF(
5151                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
5152                 [AC_MSG_RESULT([no])],
5153                 [
5154                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
5155                         AR_FLAGS="Scru"
5156                         RANLIB="$RANLIB -no_warning_for_no_symbols"
5157                         AC_MSG_RESULT([yes])
5158                 ]
5159         )
5162 case "x$libgc" in
5163         xincluded)
5164                 # Pass CPPFLAGS to libgc configure
5165                 # We should use a separate variable for this to avoid passing useless and
5166                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
5167                 # This should be executed late so we pick up the final version of CPPFLAGS
5168                 # The problem with this approach, is that during a reconfigure, the main
5169                 # configure scripts gets invoked with these arguments, so we use separate
5170                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
5171                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
5172                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
5173                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
5174                 fi
5175                 # Don't pass -finstrument-for-thread-suspension in, 
5176                 # if these are instrumented it will be very bad news 
5177                 # (infinite recursion, undefined parking behavior, etc)
5178                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
5179                 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\""
5180                 if test "x$support_boehm" = "xyes"; then
5181                         AC_CONFIG_SUBDIRS(libgc)
5182                 fi
5183                 ;;
5184 esac
5186 MALLOC_MEMPOOLS=no
5187 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
5188         if test x$with_malloc_mempools = xyes; then
5189                 MALLOC_MEMPOOLS=yes
5190                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
5191         fi
5195 DISABLE_MCS_DOCS=default
5196 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
5197         if test x$with_mcs_docs != xyes; then
5198                 DISABLE_MCS_DOCS=yes
5199         fi
5201 if test -n "$INSTALL_4_x_TRUE"; then :
5202         DISABLE_MCS_DOCS=yes
5204 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
5205    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
5208 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)],[
5209         if test x$with_lazy_gc_thread_creation != xno ; then
5210                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
5211         fi
5212 ], [with_lazy_gc_thread_creation=no])
5214 dnl *****************************
5215 dnl *** Thread suspend policy ***
5216 dnl *****************************
5218 dnl Set a default hybrid or cooperative suspend on some platforms
5220 dnl Coop default is set by the bitcode preset.
5222 dnl If coop isn't on by default, maybe hybrid should be?
5223 if test x$enable_cooperative_suspend_default != xyes; then
5224         case $HOST in
5225         X86 | AMD64)
5226                 dnl Some host/target confusion, there's no host_osx (and
5227                 dnl host_darwin would be true on iOS not just macOS).
5228                 if test x$target_osx = xyes; then
5229                         enable_hybrid_suspend_default=yes
5230                 elif test x$host_linux = xyes -o x$host_win32 = xyes; then
5231                         enable_hybrid_suspend_default=yes
5232                 fi
5233                 ;;
5234         esac
5237 dnl Now check if there were flags overriding the defaults
5239 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])
5240 AC_ARG_ENABLE(cooperative_suspend, [  --enable-cooperative-suspend      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [], [enable_cooperative_suspend=default])
5242 if test x$enable_cooperative_suspend = xdefault -a x$with_cooperative_gc != xdefault; then
5243         enable_cooperative_suspend=$with_cooperative_gc
5246 if test x$enable_cooperative_suspend = xdefault; then
5247         enable_cooperative_suspend=$enable_cooperative_suspend_default
5250 if test x$enable_cooperative_suspend != xno; then
5251         AC_DEFINE(ENABLE_COOP_SUSPEND,1,[Enable cooperative stop-the-world garbage collection.])
5254 AM_CONDITIONAL([ENABLE_COOP_SUSPEND], [test x$enable_cooperative_suspend != xno])
5256 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])
5258 if test x$enable_hybrid_suspend = xdefault; then
5259    enable_hybrid_suspend=$enable_hybrid_suspend_default
5262 if test x$enable_hybrid_suspend != xno -a x$enable_cooperative_suspend != xno ; then
5263         AC_MSG_ERROR([Hybrid suspend and Cooperative suspend cannot be both enabled.])
5266 if test x$enable_hybrid_suspend != xno ; then
5267         AC_DEFINE(ENABLE_HYBRID_SUSPEND,1,[Enable hybrid suspend for GC stop-the-world])
5270 AM_CONDITIONAL([ENABLE_HYBRID_SUSPEND], [test x$enable_hybrid_suspend != xno])
5272 dnl End of thread suspend policy
5274 dnl ***************************
5275 dnl *** feature experiments ***
5276 dnl ***************************
5278 dnl When adding experiments, also add to mono/utils/mono-experiments.def
5279 AC_ARG_ENABLE(experiment, [ --enable-experiment=LIST       Enable experimental fatures from the comma-separate LIST.  Available experiments: null],[
5281         if test x$enable_experiment != x ; then
5282                 AC_DEFINE(ENABLE_EXPERIMENTS,1,[Enable feature experiments])
5283         fi
5284         for feature in `echo "$enable_experiment" | sed -e "s/,/ /g"`; do
5285                 eval "mono_experiment_test_enable_$feature='yes'"
5286         done
5288         if test "x$mono_experiment_test_enable_all" = "xyes"; then
5289                 eval "mono_experiment_test_enable_null='yes'"
5290                 true
5291         fi
5293         if test "x$mono_experiment_test_enable_null" = "xyes"; then
5294                 AC_DEFINE(ENABLE_EXPERIMENT_null, 1, [Enable experiment 'null'])
5295         fi
5296 ],[])
5298 dnl **********************
5299 dnl *** checked builds ***
5300 dnl **********************
5302 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],[
5304         if test x$enable_checked_build != x ; then
5305                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
5306         fi
5307         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
5308                 eval "mono_checked_build_test_enable_$feature='yes'"
5309         done
5311         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
5312                 eval "mono_checked_build_test_enable_gc='yes'"
5313                 eval "mono_checked_build_test_enable_metadata='yes'"
5314                 eval "mono_checked_build_test_enable_thread='yes'"
5315                 eval "mono_checked_build_test_enable_private_types='yes'"
5316         fi
5318         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
5319                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
5320         fi
5322         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
5323                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
5324         fi
5326         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
5327                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
5328         fi
5330         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
5331                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
5332         fi
5333 ], [])
5335 dnl End of checked builds
5337 AC_CHECK_HEADER([malloc.h], 
5338                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
5339                         [Define to 1 if you have /usr/include/malloc.h.])],,)
5341 if test x"$GCC" = xyes; then
5342         # Implicit function declarations are not 64 bit safe
5343         # Do this late, since this causes lots of configure tests to fail
5344         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
5345         # jay has a lot of implicit declarations
5346         JAY_CFLAGS="-Wno-implicit-function-declaration"
5349 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
5350 # instead of libmono-static.a
5351 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
5352    LIBMONO_LA=libmini-static.la
5353 else
5354    if test x$buildsgen = xyes; then
5355       LIBMONO_LA=libmonosgen-$API_VER.la
5356    else
5357       LIBMONO_LA=libmonoboehm-$API_VER.la
5358    fi
5360 AC_SUBST(LIBMONO_LA)
5362 dnl **************
5363 dnl ***  Btls  ***
5364 dnl **************
5366 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
5367 AC_ARG_ENABLE(btls-lib, [  --disable-btls-lib             Disable building the BTLS native library], enable_btls_lib=$enableval, enable_btls_lib=$BTLS_SUPPORTED)
5368 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
5370 if test "x$enable_btls" = "xno"; then
5371    enable_btls_lib=no
5374 AM_CONDITIONAL(BTLS, test x$enable_btls_lib = xyes)
5376 btls_android=no
5377 if test "x$enable_btls" = "xyes"; then
5378         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
5379         if test "x$CMAKE" = "xno"; then
5380                 AC_MSG_ERROR("cmake not found")
5381         fi
5383         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
5384         AC_SUBST(BTLS_ROOT)
5386         btls_arch=
5387         btls_cflags=
5388         BTLS_CMAKE_ARGS=
5390         if test "x$host_win32" = "xyes"; then
5391                 AC_CHECK_PROG(HAVE_YASM, yasm, yes, no)
5392         fi
5394         case "$BTLS_PLATFORM" in
5395         i386)
5396                 btls_arch=i386
5397                 btls_cflags="-m32"
5398                 case $host_os in
5399                         darwin*)
5400                                 btls_cflags="$btls_cflags -arch i386"
5401                                 ;;
5402                         mingw*|cygwin*)
5403                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5404                                 if test "x$HAVE_YASM" != "xyes"; then
5405                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5406                                 fi
5407                                 ;;
5408                 esac
5409                 ;;
5410         x86_64)
5411                 btls_arch=x86_64
5412                 case $host_os in
5413                         mingw*|cygwin*)
5414                                 btls_cflags="-DNOCRYPT $WIN32_CPPFLAGS"
5415                                 if test "x$HAVE_YASM" != "xyes"; then
5416                                         BTLS_CMAKE_ARGS="-DOPENSSL_NO_ASM=1"
5417                                 fi
5418                                 ;;
5419                 esac
5420                 ;;
5421         arm)
5422                 btls_arch=arm
5423                 btls_cflags="-DOPENSSL_NO_ASM=1"
5424                 ;;
5425         armsoft)
5426                 btls_arch=arm
5427                 btls_cflags="-DOPENSSL_NO_ASM=1"
5428                 ;;
5429         aarch64)
5430                 btls_arch=aarch64
5431                 btls_cflags="-march=armv8-a+crypto"
5432                 ;;
5433         s390x)
5434                 btls_arch=s390x
5435                 ;;
5436         powerpc)
5437                 btls_arch=powerpc
5438                 case $host_os in
5439                         aix*|os400*)
5440                                 btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
5441                                 BTLS_CMAKE_ARGS="-DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
5442                 esac
5443                 ;;
5444         android-armv5)
5445                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
5446                 ;;
5447         android-armv6)
5448                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
5449                 ;;
5450         android-armv7)
5451                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=14"
5452                 ;;
5453         android-v8a)
5454                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=21"
5455                 ;;
5456         android-x86)
5457                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=14"
5458                 ;;
5459         android-x64)
5460                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=21"
5461                 ;;
5462         riscv32)
5463                 btls_arch=riscv32
5464                 ;;
5465         riscv64)
5466                 btls_arch=riscv64
5467                 ;;
5468         *)
5469                 AC_MSG_ERROR(Invalid BTLS platform)
5470         esac
5472         if test "x$platform_android" = "xyes"; then
5473                 btls_android=yes
5474                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
5475                 if test "x$with_btls_android_ndk" != "x"; then
5476                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
5477                 else
5478                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
5479                 fi
5480         fi
5482         if test "x$btls_arch" != "x"; then
5483                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
5484         fi
5486         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
5487         AC_SUBST(BTLS_ARCH)
5488         AC_SUBST(BTLS_CFLAGS)
5489         AC_SUBST(BTLS_PLATFORM)
5490         AC_SUBST(BTLS_CMAKE_ARGS)
5492         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
5493 else
5494         enable_btls=no
5497 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
5499 if test x$DISABLE_MCS_DOCS = xyes; then
5500    docs_dir=""
5501 else
5502    docs_dir=docs
5504 AC_SUBST(docs_dir)
5506 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
5507 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
5508 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
5510 libmono_ldflags="$libmono_ldflags $LIBS"
5512 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
5513 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
5514 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
5515 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
5516 AM_CONDITIONAL(X86, test x$TARGET = xX86)
5517 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
5518 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
5519 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
5520 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
5521 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
5522 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64)
5523 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
5524 AM_CONDITIONAL([RISCV], [test x$TARGET = xRISCV32 -o x$TARGET = xRISCV64])
5525 AM_CONDITIONAL([RISCV32], [test x$TARGET = xRISCV32])
5526 AM_CONDITIONAL([RISCV64], [test x$TARGET = xRISCV64])
5527 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
5528 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
5529 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
5530 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
5531 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
5532 AM_CONDITIONAL([HOST_RISCV], [test x$HOST = xRISCV32 -o x$HOST = xRISCV64])
5533 AM_CONDITIONAL([HOST_RISCV32], [test x$HOST = xRISCV32])
5534 AM_CONDITIONAL([HOST_RISCV64], [test x$HOST = xRISCV64])
5535 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
5537 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
5539 AC_SUBST(LIBC)
5540 AC_SUBST(INTL)
5541 AC_SUBST(SQLITE)
5542 AC_SUBST(SQLITE3)
5543 AC_SUBST(X11)
5544 AC_SUBST(GDKX11)
5545 AC_SUBST(GTKX11)
5546 AC_SUBST(XINERAMA)
5547 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
5548 AC_SUBST(arch_target)
5549 AC_SUBST(CFLAGS)
5550 AC_SUBST(CPPFLAGS)
5551 AC_SUBST(LDFLAGS)
5553 #This must always be defined when building the runtime
5554 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
5556 mono_build_root=`pwd`
5557 AC_SUBST(mono_build_root)
5559 AC_ARG_ENABLE(msvc,[  --enable-msvc    Build with Visual Studio (msvc) (defaults to no)], enable_msvc=$enableval, enable_msvc=no)
5560 if test x$host_win32 = xno; then
5561         if test x$enable_msvc = xyes; then
5562                 echo "Error, --enable-msvc only supported for Windows builds."
5563                 exit 1
5564         fi
5566 AM_CONDITIONAL(ENABLE_MSVC, test x$enable_msvc = xyes)
5568 if test "x$enable_msvc" = "xyes"; then
5569         if test "x$support_boehm" = "xyes"; then
5570                 echo "Error, Boehm GC is not supported when using --enable-msvc."
5571                 exit 1
5572         fi
5573         mono_msvc_build_dir='$(top_srcdir)'/msvc/build/sgen
5574         if test "x$host_cpu" = "xi686"; then
5575                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/Win32/lib/Release
5576                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/Win32/bin/Release
5577                 mono_runtime=msvc/build/sgen/Win32/bin/Release/mono-sgen.exe
5578         else
5579                 mono_msvc_build_lib_dir='$(mono_msvc_build_dir)'/x64/lib/Release
5580                 mono_msvc_build_bin_dir='$(mono_msvc_build_dir)'/x64/bin/Release
5581                 mono_runtime=msvc/build/sgen/x64/bin/Release/mono-sgen.exe
5582         fi
5583         AC_SUBST(mono_msvc_build_dir)
5584         AC_SUBST(mono_msvc_build_lib_dir)
5585         AC_SUBST(mono_msvc_build_bin_dir)
5586 else
5587         mono_runtime=mono/mini/mono
5590 AC_SUBST(mono_runtime)
5592 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/Microsoft.Net.Compilers.2.8.2/tools/csc.exe
5594 if test $csc_compiler = mcs; then
5595   CSC=$mcs_topdir/class/lib/build/mcs.exe
5596 else
5597   CSC=$CSC_LOCATION
5600 AM_CONDITIONAL([CSC_IS_ROSLYN], [test x$csc_compiler != xmcs])
5602 mono_cfg_root=$mono_build_root/runtime
5603 if test x$host_win32 = xyes; then
5604   if test "x$cross_compiling" = "xno"; then
5605     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
5606     CSC=`cygpath -m -a $CSC`
5607     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
5608   else
5609     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
5610   fi
5611 else
5612   mono_cfg_dir=$mono_cfg_root/etc
5614 AC_SUBST(mono_cfg_dir)
5616 AC_SUBST(CSC)
5618 AC_CONFIG_FILES([po/mcs/Makefile.in])
5620 AC_CONFIG_FILES([acceptance-tests/microbench-perf.sh],[chmod +x acceptance-tests/microbench-perf.sh])
5621 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
5622 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
5624 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
5625 [   depth=../../../..
5626     case $srcdir in
5627     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5628     .) reldir=$depth ;;
5629     *) reldir=$depth/$srcdir ;;
5630     esac
5631     $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
5632     cd runtime/etc/mono/1.0
5633     rm -f machine.config
5634     $LN_S $reldir/data/net_1_1/machine.config machine.config
5635     cd $depth
5636 ],[LN_S='$LN_S'])
5638 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
5639 [   depth=../../../..
5640     case $srcdir in
5641     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5642     .) reldir=$depth ;;
5643     *) reldir=$depth/$srcdir ;;
5644     esac
5645     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5646     cd runtime/etc/mono/2.0
5647     rm -f machine.config
5648     $LN_S $reldir/data/net_2_0/machine.config machine.config
5649     cd $depth
5650 ],[LN_S='$LN_S'])
5652 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
5653 [   depth=../../../..
5654     case $srcdir in
5655     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5656     .) reldir=$depth ;;
5657     *) reldir=$depth/$srcdir ;;
5658     esac
5659     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5660     cd runtime/etc/mono/2.0
5661     rm -f web.config
5662     $LN_S $reldir/data/net_2_0/web.config web.config
5663     cd $depth
5664 ],[LN_S='$LN_S'])
5666 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
5667 [   depth=../../..
5668     case $srcdir in
5669     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5670     .) reldir=$depth ;;
5671     *) reldir=$depth/$srcdir ;;
5672     esac
5673     $ac_aux_dir/install-sh -d runtime/etc/mono/
5674     cd runtime/etc/mono/
5675     rm -f browscap.ini
5676     $LN_S $reldir/data/browscap.ini browscap.ini
5677     cd $depth
5678 ],[LN_S='$LN_S'])
5680 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
5681 [   depth=../../../../..
5682     case $srcdir in
5683     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5684     .) reldir=$depth ;;
5685     *) reldir=$depth/$srcdir ;;
5686     esac
5687     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
5688     cd runtime/etc/mono/2.0/Browsers
5689     rm -f Compat.browser
5690     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5691     cd $depth
5692 ],[LN_S='$LN_S'])
5694 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
5695 [   depth=../../../../..
5696     case $srcdir in
5697     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5698     .) reldir=$depth ;;
5699     *) reldir=$depth/$srcdir ;;
5700     esac
5701     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
5702     cd runtime/etc/mono/4.0/Browsers
5703     rm -f Compat.browser
5704     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5705     cd $depth
5706 ],[LN_S='$LN_S'])
5708 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
5709 [   depth=../../../../..
5710     case $srcdir in
5711     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5712     .) reldir=$depth ;;
5713     *) reldir=$depth/$srcdir ;;
5714     esac
5715     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
5716     cd runtime/etc/mono/4.5/Browsers
5717     rm -f Compat.browser
5718     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5719     cd $depth
5720 ],[LN_S='$LN_S'])
5722 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
5723 [   depth=../../../..
5724     case $srcdir in
5725     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5726     .) reldir=$depth ;;
5727     *) reldir=$depth/$srcdir ;;
5728     esac
5729     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5730     cd runtime/etc/mono/4.0
5731     rm -f machine.config
5732     $LN_S $reldir/data/net_4_0/machine.config machine.config
5733     cd $depth
5734 ],[LN_S='$LN_S'])
5736 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
5737 [   depth=../../../..
5738     case $srcdir in
5739     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5740     .) reldir=$depth ;;
5741     *) reldir=$depth/$srcdir ;;
5742     esac
5743     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5744     cd runtime/etc/mono/4.0
5745     rm -f web.config
5746     $LN_S $reldir/data/net_4_0/web.config web.config
5747     cd $depth
5748 ],[LN_S='$LN_S'])
5750 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
5751 [   depth=../../../..
5752     case $srcdir in
5753     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5754     .) reldir=$depth ;;
5755     *) reldir=$depth/$srcdir ;;
5756     esac
5757     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5758     cd runtime/etc/mono/4.5
5759     rm -f machine.config
5760     $LN_S $reldir/data/net_4_5/machine.config machine.config
5761     cd $depth
5762 ],[LN_S='$LN_S'])
5764 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
5765 [   depth=../../../..
5766     case $srcdir in
5767     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5768     .) reldir=$depth ;;
5769     *) reldir=$depth/$srcdir ;;
5770     esac
5771     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5772     cd runtime/etc/mono/4.5
5773     rm -f web.config
5774     $LN_S $reldir/data/net_4_5/web.config web.config
5775     cd $depth
5776 ],[LN_S='$LN_S'])
5778 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])
5779 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])
5780 AC_CONFIG_COMMANDS([clean-llvm], [rm -f llvm/llvm_config.mk])
5782 # Anything involving -Werror must be done late because autoconf depends on compiling with warnings to be success.
5783 if test x"$GCC" = xyes; then
5785         # incompatible-pointer-types requires gcc circa 5.x
5787         ORIG_CFLAGS=$CFLAGS
5788         CFLAGS="$CFLAGS -Wincompatible-pointer-types -Werror"
5789         AC_MSG_CHECKING(for -Wincompatible-pointer-types option to gcc)
5790         AC_TRY_COMPILE([],[
5791         ], [
5792                 AC_MSG_RESULT(yes)
5793                 CFLAGS="$ORIG_CFLAGS -Werror=incompatible-pointer-types"
5794         ], [
5795                 AC_MSG_RESULT(no)
5796                 CFLAGS=$ORIG_CFLAGS
5797         ])
5801 # Mono.Native Support
5802 # -------------------
5803 # Mono.Native is the new name for both System.Native and System.Security.Cryptography.Apple.
5804 # It is built as a stand-alone shared library and not bundled with the runtime because we
5805 # may need to build two different versions of it.
5807 # Starting with macOS 10.12+ and iOS 10+, Apple introduced a new Unified API for some of the
5808 # crypto primitives that we're using as part of System.Security.Cryptography.Apple.
5810 # On Desktop, we can check at runtime whether the OS version is recent enough and switch
5811 # implementation accordingly.  We build a single `libmono_native` shared library.
5813 # However, on Mobile we cannot have any undefined symbols as this would break Bitcode.
5815 # During the mobile build, we are called with `CC` containing an explicit minium version flag,
5816 # which is eiter `-mmacosx-version-min=`, `-mios-simulator-version-min=` or `-miphoneos-version-min=`
5817 # depending on platform.
5819 # We build two versions of the shared library:
5820 # - `libmono_native_compat` is built with whichever minimum version is passed to us via `CC`.
5821 # - `libmono_native_unifed` is built with the minimum version set to macOS 10.12+ / iOS 10+.
5823 # For testing purpuses, there is a function called `mono_native_get_platform_type ()`
5824 # (see mono/native/mono-native-platform.c), which returns a `MonoNativePlatformType` enum value.
5825 # There is also `Mono.MonoNativePlatform.GetPlatformType ()` (see mcs/class/System/Mono/MonoNativePlatform.cs).
5827 # This can be called by automated tests both to ensure that the library has been correctly installed and also
5828 # to verify that it's the correct version of it.
5831 sed_version_pattern='[[0-9]]\{1,2\}\(\.[[0-9]]\{1,2\}\)'
5832 if test x$target_osx = xyes; then
5833         sed_remove_mac_version_pattern="s/-mmacosx-version-min=$sed_version_pattern//g"
5834         grep_find_mac_version_pattern="-mmacosx-version-min=$sed_version_pattern"
5835         mono_native_compat_version=`echo $CC | grep -o -e $grep_find_mac_version_pattern`
5836         MONO_NATIVE_CC=`echo $CC | sed -e $sed_remove_mac_version_pattern`
5837         MONO_NATIVE_CXX=`echo $CXX | sed -e $sed_remove_mac_version_pattern`
5838         MONO_NATIVE_CPPFLAGS=`echo $CPPFLAGS | sed -e $sed_remove_mac_version_pattern`
5839         MONO_NATIVE_CFLAGS=`echo $CFLAGS | sed -e $sed_remove_mac_version_pattern`
5840         MONO_NATIVE_CXXFLAGS=`echo $CXXFLAGS | sed -e $sed_remove_mac_version_pattern`
5841         MONO_NATIVE_LDFLAGS=`echo $LDFLAGS | sed -e $sed_remove_mac_version_pattern`
5843         mono_native=yes
5844         MONO_NATIVE_PLATFORM=macos
5845         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_MACOS"
5846         AC_MSG_CHECKING([Mono.Native support])
5847         AC_MSG_RESULT(macos)
5849         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer],
5850                 [!(MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12)])
5852         if test x$mono_native_compat = xyes; then
5853                 mono_native_compat=yes
5854                 mono_native_text="Mac OSX (compat+unified)"
5855                 MONO_NATIVE_COMPAT_CFLAGS="$CFLAGS $mono_native_compat_version"
5856                 MONO_NATIVE_COMPAT_LDFLAGS="$LDFLAGS $mono_native_compat_version"
5857                 MONO_NATIVE_UNIFIED_CFLAGS="$MONO_NATIVE_CFLAGS -mmacosx-version-min=10.12"
5858                 MONO_NATIVE_UNIFIED_LDFLAGS="$MONO_NATIVE_LDFLAGS -mmacosx-version-min=10.12"
5859         else
5860                 mono_native_compat=no
5861                 mono_native_text="Mac OSX"
5862         fi
5863 elif test x$mono_native_platform_ios = xyes; then
5864         AC_MONO_APPLE_TARGET(TARGET_OS_SIMULATOR, [mono_native_ios_sim=yes], [mono_native_ios_sim=no])
5866         AC_MONO_APPLE_TARGET(TARGET_OS_IOS, [
5867                 if test x$mono_native_ios_sim = xyes; then
5868                         mono_native_ios_target=ios-simulator
5869                         mono_native_text="iOS Simulator"
5870                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5871                 else
5872                         mono_native_ios_target=iphoneos
5873                         mono_native_text="iOS Device"
5874                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_IPHONE | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5875                 fi
5876                 mono_native_unified_version="10.0"
5877                 mono_native_compat_check="__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_10_0"
5878         ], [
5879                 AC_MONO_APPLE_TARGET(TARGET_OS_TV, [
5880                         if test x$mono_native_ios_sim = xyes; then
5881                                 mono_native_ios_target=tvos-simulator
5882                                 mono_native_text="AppleTV Simulator"
5883                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5884                         else
5885                                 mono_native_ios_target=tvos
5886                                 mono_native_text="AppleTV Device"
5887                                 MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_TV | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5888                         fi
5889                         mono_native_unified_version="10.0"
5890                         mono_native_compat_check="__TV_OS_VERSION_MIN_REQUIRED >= __TVOS_10_0"
5891                 ], [
5892                         AC_MONO_APPLE_TARGET(TARGET_OS_WATCH, [
5893                                 if test x$mono_native_ios_sim = xyes; then
5894                                         mono_native_ios_target=watchos-simulator
5895                                         mono_native_text="Apple Watch Simulator"
5896                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_SIMULATOR"
5897                                 else
5898                                         mono_native_ios_target=watchos
5899                                         mono_native_text="Apple Watch Device"
5900                                         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_IOS | MONO_NATIVE_PLATFORM_TYPE_WATCH | MONO_NATIVE_PLATFORM_TYPE_DEVICE"
5901                                 fi
5902                                 mono_native_unified_version="5.0"
5903                                 mono_native_compat_check="__WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_5_0"
5904                         ], [
5905                                 AC_MSG_ERROR([Unknown iOS Target])
5906                         ])
5907                 ])
5908         ])
5910         AC_MSG_CHECKING([Mono.Native support])
5911         AC_MSG_RESULT([$mono_native_ios_target])
5913         AC_MONO_APPLE_AVAILABLE(mono_native_compat, [whether we need the compatibility layer], [!($mono_native_compat_check)])
5915         sed_remove_ios_version_pattern="s/-m\(.*\)-version-min=$sed_version_pattern//g"
5916         grep_find_ios_version_pattern="-m$mono_native_ios_target-version-min=$sed_version_pattern"
5918         mono_native_compat_version=`echo $CC | grep -o -e $grep_find_ios_version_pattern`
5920         if test x$with_bitcode = xyes; then
5921                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -no-undefined -fatal_warnings"
5922                 MONO_NATIVE_LIBADD="../mini/$LIBMONO_LA"
5923         else
5924                 mono_native_ldflags="-framework CoreFoundation -framework Foundation -fatal_warnings"
5925         fi
5927         if test x$enable_gss = xyes; then
5928                 mono_native_ldflags="$mono_native_ldflags -framework GSS"
5929         fi
5931         MONO_NATIVE_CC=`echo $CC | sed -e $sed_remove_ios_version_pattern`
5932         MONO_NATIVE_CXX=`echo $CXX | sed -e $sed_remove_ios_version_pattern`
5933         MONO_NATIVE_CPPFLAGS=`echo $CPPFLAGS | sed -e $sed_remove_ios_version_pattern`
5934         MONO_NATIVE_CXXFLAGS=`echo $CXXFLAGS | sed -e $sed_remove_ios_version_pattern`
5935         MONO_NATIVE_CFLAGS=`echo $CFLAGS | sed -e $sed_remove_ios_version_pattern`
5936         MONO_NATIVE_LDFLAGS=`echo $LDFLAGS $mono_native_ldflags | sed -e $sed_remove_ios_version_pattern`
5938         if test x$mono_native_compat = xyes; then
5939                 mono_native_text="$mono_native_text (compat+unified)"
5940                 MONO_NATIVE_COMPAT_CFLAGS="$CFLAGS $mono_native_compat_version"
5941                 MONO_NATIVE_COMPAT_LDFLAGS="$LDFLAGS $mono_native_compat_version"
5942                 MONO_NATIVE_UNIFIED_CFLAGS="$MONO_NATIVE_CFLAGS -m$mono_native_ios_target-version-min=$mono_native_unified_version"
5943                 MONO_NATIVE_UNIFIED_LDFLAGS="$MONO_NATIVE_LDFLAGS -m$mono_native_ios_target-version-min=$mono_native_unified_version"
5944         fi
5946         mono_native=yes
5947         MONO_NATIVE_PLATFORM=ios
5948 elif test x$host_linux = xyes; then
5949         mono_native_text="Linux"
5950         MONO_NATIVE_CC=$CC
5951         MONO_NATIVE_CXX=$CXX
5952         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
5953         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
5954         MONO_NATIVE_CFLAGS=$CFLAGS
5955         MONO_NATIVE_LDFLAGS=$LDFLAGS
5957         mono_native=yes
5958         mono_native_compat=no
5959         MONO_NATIVE_PLATFORM=linux
5960         AC_MSG_CHECKING([Mono.Native support])
5961         AC_MSG_RESULT(linux)
5963         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_LINUX"
5964 elif case $host_os in aix*|os400*) true;; *) false;; esac; then
5965         mono_native_text="AIX"
5966         MONO_NATIVE_CC=$CC
5967         MONO_NATIVE_CXX=$CXX
5968         MONO_NATIVE_CPPFLAGS=$CPPFLAGS
5969         MONO_NATIVE_CXXFLAGS=$CXXFLAGS
5970         MONO_NATIVE_CFLAGS=$CFLAGS
5971         MONO_NATIVE_LDFLAGS=$LDFLAGS
5973         mono_native=yes
5974         mono_native_compat=no
5975         MONO_NATIVE_PLATFORM=aix
5976         AC_MSG_CHECKING([Mono.Native support])
5977         AC_MSG_RESULT(aix)
5979         MONO_NATIVE_PLATFORM_TYPE="MONO_NATIVE_PLATFORM_TYPE_AIX"
5980 else
5981         mono_native=no
5982         mono_native_text="no"
5983         AC_MSG_CHECKING([Mono.Native support])
5984         AC_MSG_RESULT(no)
5987 if test x$mono_native_compat = xyes; then
5988         MONO_NATIVE_LIBRARY_NAME=libmono-native-compat
5989 else
5990         MONO_NATIVE_LIBRARY_NAME=libmono-native
5993 AC_SUBST(MONO_NATIVE_PLATFORM)
5994 AC_SUBST(MONO_NATIVE_CC)
5995 AC_SUBST(MONO_NATIVE_CXX)
5996 AC_SUBST(MONO_NATIVE_CPPFLAGS)
5997 AC_SUBST(MONO_NATIVE_CXXFLAGS)
5998 AC_SUBST(MONO_NATIVE_CFLAGS)
5999 AC_SUBST(MONO_NATIVE_COMPAT_CFLAGS)
6000 AC_SUBST(MONO_NATIVE_UNIFIED_CFLAGS)
6001 AC_SUBST(MONO_NATIVE_LDFLAGS)
6002 AC_SUBST(MONO_NATIVE_COMPAT_LDFLAGS)
6003 AC_SUBST(MONO_NATIVE_UNIFIED_LDFLAGS)
6004 AC_SUBST(MONO_NATIVE_LIBRARY_NAME)
6005 AC_SUBST(MONO_NATIVE_LIBADD)
6007 AM_CONDITIONAL(MONO_NATIVE, test x$mono_native = xyes)
6008 AM_CONDITIONAL(MONO_NATIVE_COMPAT, test x$mono_native_compat = xyes)
6009 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_MACOS, test x$MONO_NATIVE_PLATFORM = xmacos)
6010 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_IOS, test x$MONO_NATIVE_PLATFORM = xios)
6011 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_LINUX, test x$MONO_NATIVE_PLATFORM = xlinux)
6012 AM_CONDITIONAL(MONO_NATIVE_PLATFORM_AIX, test x$MONO_NATIVE_PLATFORM = xaix)
6014 MONO_NATIVE_PLATFORM_TYPE_COMPAT="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_COMPAT"
6015 MONO_NATIVE_PLATFORM_TYPE_UNIFIED="$MONO_NATIVE_PLATFORM_TYPE | MONO_NATIVE_PLATFORM_TYPE_UNIFIED"
6016 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE)
6017 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_COMPAT)
6018 AC_SUBST(MONO_NATIVE_PLATFORM_TYPE_UNIFIED)
6020 # Update all submodules recursively to ensure everything is checked out
6021 (cd $srcdir && scripts/update_submodules.sh)
6023 AC_OUTPUT([
6024 Makefile
6025 mono-uninstalled.pc
6026 acceptance-tests/Makefile
6027 llvm/Makefile
6028 scripts/mono-find-provides
6029 scripts/mono-find-requires
6030 mk/Makefile
6031 mono/Makefile
6032 mono/btls/Makefile
6033 mono/native/Makefile
6034 mono/utils/Makefile
6035 mono/utils/jemalloc/Makefile
6036 mono/metadata/Makefile
6037 mono/dis/Makefile
6038 mono/cil/Makefile
6039 mono/arch/Makefile
6040 mono/arch/x86/Makefile
6041 mono/arch/amd64/Makefile
6042 mono/arch/ppc/Makefile
6043 mono/arch/sparc/Makefile
6044 mono/arch/s390x/Makefile
6045 mono/arch/arm/Makefile
6046 mono/arch/arm64/Makefile
6047 mono/arch/mips/Makefile
6048 mono/arch/riscv/Makefile
6049 mono/sgen/Makefile
6050 mono/native/platform-type.c
6051 mono/native/platform-type-compat.c
6052 mono/native/platform-type-unified.c
6053 mono/tests/Makefile
6054 mono/tests/assembly-load-reference/Makefile
6055 mono/tests/tests-config
6056 mono/tests/gc-descriptors/Makefile
6057 mono/tests/testing_gac/Makefile
6058 mono/unit-tests/Makefile
6059 mono/benchmark/Makefile
6060 mono/mini/Makefile
6061 mono/profiler/Makefile
6062 mono/eglib/Makefile
6063 mono/eglib/eglib-config.h
6064 mono/eglib/test/Makefile
6065 m4/Makefile
6066 ikvm-native/Makefile
6067 scripts/Makefile
6068 man/Makefile
6069 docs/Makefile
6070 data/Makefile
6071 data/net_2_0/Makefile
6072 data/net_4_0/Makefile
6073 data/net_4_5/Makefile
6074 data/net_2_0/Browsers/Makefile
6075 data/net_4_0/Browsers/Makefile
6076 data/net_4_5/Browsers/Makefile
6077 data/mint.pc
6078 data/mono-2.pc
6079 data/monosgen-2.pc
6080 data/mono.pc
6081 data/mono-cairo.pc
6082 data/mono-nunit.pc
6083 data/mono-options.pc
6084 data/mono-lineeditor.pc
6085 data/monodoc.pc
6086 data/dotnet.pc
6087 data/dotnet35.pc
6088 data/wcf.pc
6089 data/cecil.pc
6090 data/system.web.extensions_1.0.pc
6091 data/system.web.extensions.design_1.0.pc
6092 data/system.web.mvc.pc
6093 data/system.web.mvc2.pc
6094 data/system.web.mvc3.pc
6095 data/aspnetwebstack.pc
6096 data/reactive.pc
6097 samples/Makefile
6098 support/Makefile
6099 data/config
6100 tools/Makefile
6101 tools/locale-builder/Makefile
6102 tools/sgen/Makefile
6103 tools/monograph/Makefile
6104 tools/pedump/Makefile
6105 runtime/Makefile
6106 msvc/Makefile
6107 po/Makefile
6110 if test x$host_win32 = xyes; then
6111    # Get rid of 'cyg' prefixes in library names
6112    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6113    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
6114    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
6115    # executable doesn't work...
6116    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
6119 if test x$host_darwin = xyes; then
6120    # This doesn't seem to be required and it slows down parallel builds
6121    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
6125   case $prefix in
6126   NONE) prefix=$ac_default_prefix ;;
6127   esac
6128   case $exec_prefix in
6129   NONE) exec_prefix='${prefix}' ;;
6130   esac
6132   #
6133   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
6134   # any existing config.make.  This allows people to share the same source tree
6135   # with different build directories, one native and one cross
6136   #
6137   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
6139     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
6141     echo "prefix=$prefix" > $mcs_topdir/build/config.make
6142     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
6143     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
6144     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
6145     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
6146     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
6147     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
6148     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
6149     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
6151     case $INSTALL in
6152     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
6153     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
6154     esac
6156     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
6158     export VERSION
6159     [myver=$($AWK 'BEGIN {
6160       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
6161       if(length(vsplit [1]) > 4) {
6162         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
6163       }
6164       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
6165     }')]
6167     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
6168     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
6170     if test x$host_darwin = xyes; then
6171       echo "BUILD_PLATFORM = macos" >> $mcs_topdir/build/config.make
6172       echo "HOST_PLATFORM ?= macos" >> $mcs_topdir/build/config.make
6173       echo "XTEST_PLATFORM ?= osx" >> $mcs_topdir/build/config.make
6174     elif test x$host_win32 = xyes; then
6175       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
6176       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
6177       echo "XTEST_PLATFORM ?= windows" >> $mcs_topdir/build/config.make
6178     elif test x$host_linux = xyes; then
6179       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
6180       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6181       echo "XTEST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
6182     else
6183       echo "BUILD_PLATFORM = unix" >> $mcs_topdir/build/config.make
6184       echo "HOST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6185       echo "XTEST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
6186     fi
6188     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
6189       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
6190     fi
6192         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
6193            enable_system_aot=yes
6194         fi
6196     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
6197       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
6198     fi
6200     if test x$DISABLE_MCS_DOCS = xyes; then
6201       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
6202     fi
6204     if test x$has_extension_module != xno; then
6205         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
6206     fi
6207     
6208     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
6209     
6210     if test "x$test_bcl_opt" = "xyes"; then    
6211       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
6212     fi
6214     echo "CSC_LOCATION = $CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
6216     if test $csc_compiler = mcs; then
6217       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
6218     fi
6220     if test "x$AOT_BUILD_FLAGS" != "x" ; then
6221       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
6222       echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
6223       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
6224     fi
6226     if test "x$AOT_MODE" != "x" ; then
6227       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
6228     fi
6230     if test "x$enable_btls" = "xyes"; then
6231       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
6232     fi
6234     if test "x$mono_native" = "xyes"; then
6235       echo "MONO_NATIVE_SUPPORTED=true" >> $srcdir/$mcsdir/build/config.make
6236     else
6237       echo "MONO_NATIVE_SUPPORTED=false" >> $srcdir/$mcsdir/build/config.make
6238     fi
6240     if test x$mono_native_compat = xyes; then
6241       echo "MONO_NATIVE_USING_COMPAT=true" >> $srcdir/$mcsdir/build/config.make
6242     else
6243       echo "MONO_NATIVE_USING_COMPAT=false" >> $srcdir/$mcsdir/build/config.make
6244     fi
6246     echo "MONO_NATIVE_PLATFORM_TYPE=$MONO_NATIVE_PLATFORM_TYPE" >> $srcdir/$mcsdir/build/config.make
6247     echo "MONO_NATIVE_PLATFORM=$MONO_NATIVE_PLATFORM" >> $srcdir/$mcsdir/build/config.make
6249   fi
6253 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
6255 btls_platform_string=
6256 if test x$enable_btls = xyes; then
6257         if test x$btls_android = xyes; then
6258                 btls_platform_string=" (android:$BTLS_PLATFORM)"
6259         else
6260                 btls_platform_string=" ($BTLS_PLATFORM)"
6261         fi
6264 thread_suspend_msg=
6265 if test x$buildsgen = xyes; then
6266         if test x$enable_cooperative_suspend != xno; then
6267                 thread_suspend_msg="Suspend:       Cooperative"
6268         elif test x$enable_hybrid_suspend != xno; then
6269                 thread_suspend_msg="Suspend:       Hybrid"
6270         else
6271                 thread_suspend_msg="Suspend:       Preemptive"
6272         fi
6274         
6275 echo "
6276         mcs source:    $mcsdir
6277         C# Compiler:   $csc_compiler
6279    Engine:
6280         Host:          $host
6281         Target:        $target
6282         GC:            $gc_msg 
6283         $thread_suspend_msg
6284         TLS:           $with_tls
6285         SIGALTSTACK:   $with_sigaltstack
6286         Engine:        $jit_status
6287         BigArrays:     $enable_big_arrays
6288         DTrace:        $enable_dtrace
6289         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm, built in-tree: $internal_llvm, assertions: $enable_llvm_asserts, msvc only: $enable_llvm_msvc_only)
6290         Spectre:       $spectre_mitigation_status
6291         Mono.Native:   $mono_native_text
6293    Libraries:
6294         .NET 4.x:        $with_profile4_x
6295         Xamarin.Android: $with_monodroid
6296         Xamarin.iOS:     $with_monotouch
6297         Xamarin.WatchOS: $with_monotouch_watch
6298         Xamarin.TVOS:    $with_monotouch_tv
6299         Xamarin.Mac:     $with_xammac
6300         Windows AOT:     $with_winaot
6301         Orbis:           $with_orbis
6302         Unreal:          $with_unreal
6303         WebAssembly:     $with_wasm
6304         Test profiles:   AOT Full ($with_testing_aot_full), AOT Hybrid ($with_testing_aot_hybrid)
6305         JNI support:     $jdk_headers_found
6306         libgdiplus:      $libgdiplus_msg
6307         zlib:            $zlib_msg
6308         BTLS:            $enable_btls$btls_platform_string
6309         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
6310         crash reporting: $crash_reporting (private crashes: $with_crash_privacy)
6311         $disabled
6313 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
6314    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)