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