Fix comparison of IntPtr with null (#9800)
[mono-project.git] / configure.ac
blob8a8ebdea1fd3f5ba8b8f792ec176be410b948ecd
1 # Process this file with autoconf to produce a configure script.
2 #AC_PREREQ([2.62])
4 AC_INIT(mono, [5.17.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
24 API_VER=2.0
25 AC_SUBST(API_VER)
27 AC_PROG_LN_S
29 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
31 MONO_VERSION_MAJOR=`echo $VERSION | cut -d . -f 1`
32 MONO_VERSION_MINOR=`echo $VERSION | cut -d . -f 2`
33 MONO_VERSION_BUILD=`echo $VERSION | cut -d . -f 3`
36 # This is the version of the corlib-runtime interface. When
37 # making changes to this interface (by changing the layout
38 # of classes the runtime knows about, changing icall signature or
39 # semantics etc), change this variable.
41 # This must be unique relative to corlib interface/semantics.
43 # Generate it with uuidgen. For example:
44 # perl -pi.bak -e "s/^MONO_CORLIB_VERSION=\S+/MONO_CORLIB_VERSION=`uuidgen`/" configure.ac
46 # There is no ordering of corlib versions, no old or new,
47 # the runtime expects an exact match.
49 MONO_CORLIB_VERSION=40525B4A-F860-49BF-936E-6B29CBBF357C
52 # Put a quoted #define in config.h.
53 # Substitute @MONO_CORLIB_VERSION@ unquoted.
55 AC_DEFINE_UNQUOTED(MONO_CORLIB_VERSION,"$MONO_CORLIB_VERSION",[Version of the corlib-runtime interface])
56 AC_SUBST(MONO_CORLIB_VERSION)
58 case $host_os in
59 *cygwin* )
60                  echo "Run configure using ./configure --host=i686-pc-mingw32"
61                  exit 1
62 esac
64 # In case of cygwin, override LN_S, irrespective of what it determines.
65 # The build uses cygwin, but the actual runtime doesn't.
66 case $host_os in
67 *cygwin* ) LN_S='cp -p';;
68 esac
71 # libgc defaults
73 libgc_configure_args=
75 # These variables are the CPPFLAGS/CFLAGS passed to libgc's configure
76 # libgc should inherit the original CFLAGS/CPPFLAGS passed to configure, i.e. -O0
77 CPPFLAGS_FOR_LIBGC=$CPPFLAGS
78 CFLAGS_FOR_LIBGC=$CFLAGS
79 CPPFLAGS_FOR_BTLS=$CPPFLAGS
80 CFLAGS_FOR_BTLS=$CFLAGS
82 # libgc uses some deprecated APIs
83 CFLAGS_FOR_LIBGC="$CFLAGS -Wno-deprecated-declarations"
86 # These are the flags that need to be stored in the mono.pc file for 
87 # compiling code that will embed Mono
89 libmono_cflags=""
90 libmono_ldflags=""
91 AC_SUBST(libmono_cflags)
92 AC_SUBST(libmono_ldflags)
94 # Variable to have relocatable .pc files (lib, or lib64)
95 # realpath isn't always available, and requires that all but the tip of the provided
96 # path exists. Fall back to the old behaviour, but realpath allows depth >1
97 # e.g. Debian puts Mono in /usr/bin and libs in /usr/lib/x86_64-linux-gnu/ which is
98 # too deep for the old method to work
99 reloc_libdir=`realpath --relative-to=${prefix} ${libdir} 2> /dev/null || basename ${libdir}`
100 AC_SUBST(reloc_libdir)
102 # Set to yes if Unix sockets cannot be created in an anonymous namespace
103 need_link_unlink=no
105 #Set to extra linker flags to be passed to the runtime binaries (mono /mono-sgen)
106 extra_runtime_ldflags=""
109 # Hack for WASM
110 # Current autotools (v1.15) doesn't have a triplet we can use for wasm so the kludge we do is to
111 # work around it by using a feature flag instead
112 AC_ARG_ENABLE(wasm,[  --enable-wasm    Hack to set the current runtime to target wasm], enable_wasm=$enableval)
114 # Thread configuration inspired by sleepycat's db
115 AC_MSG_CHECKING([host platform characteristics])
117 libgc_threads=no
118 has_dtrace=no
119 parallel_mark=yes
120 ikvm_native=yes
122 host_win32=no
123 target_win32=no
124 platform_android=no
125 platform_tizen=no
126 platform_ios=no
127 host_darwin=no
128 host_linux=no
131 if test "x$enable_wasm" = "xyes"; then
132 CFLAGS="$CFLAGS -D_REENTRANT -D_GNU_SOURCE -DNO_UNALIGNED_ACCESS -s WASM=1"
133 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DUSE_MMAP -D_GNU_SOURCE -DNO_UNALIGNED_ACCESS -s WASM=1"
134 libdl="-ldl"
135 libgc_threads=pthreads
136 platform_wasm=yes
138 else
140 case "$host" in
141         *-mingw*|*-*-cygwin*)
142                 AC_DEFINE(DISABLE_PORTABILITY,1,[Disable the io-portability layer])
143                 AC_DEFINE(HOST_NO_SYMLINKS,1,[This platform does not support symlinks])
144                 host_win32=yes
145                 mono_cv_clang=no
146                 if test "x$cross_compiling" = "xno"; then
147                         if test "x$host" = "x$build" -a "x$host" = "x$target"; then
148                                 target_win32=yes
149                         fi
150                 else
151                         if test "x$host" = "x$target"; then
152                                 target_win32=yes
153                         fi
154                 fi
155                 HOST_CC="gcc"
156                 # Windows 7 or later is required
157                 CPPFLAGS="$CPPFLAGS -DWINVER=0x0601 -D_WIN32_WINNT=0x0601 -D_WIN32_IE=0x0501 -D_UNICODE -DUNICODE -DWIN32_THREADS -DFD_SETSIZE=1024"
158                 LDFLAGS="$LDFLAGS -lbcrypt -lmswsock -lws2_32 -lole32 -loleaut32 -lpsapi -lversion -ladvapi32 -lwinmm -lkernel32 -liphlpapi"
159                 libmono_cflags="-mms-bitfields -mwindows"
160                 libmono_ldflags="-mms-bitfields -mwindows"
161                 libdl=
162                 libgc_threads=win32
163                 with_sigaltstack=no
164                 with_tls=pthread
165                 with_sgen_default_concurrent=yes
166                 LN_S=cp
167                 # This forces libgc to use the DllMain based thread registration code on win32
168                 libgc_configure_args="$libgc_configure_args --enable-win32-dllmain=yes"
169                 ;;
170         *-*-*netbsd*)
171                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DGC_NETBSD_THREADS -D_GNU_SOURCE"
172                 libmono_cflags="-D_REENTRANT"
173                 LDFLAGS="$LDFLAGS -pthread"
174                 CPPFLAGS="$CPPFLAGS -DHOST_BSD"
175                 libmono_ldflags="-pthread"
176                 need_link_unlink=yes
177                 libdl="-ldl"
178                 libgc_threads=pthreads
179                 with_sigaltstack=no
180                 use_sigposix=yes
181                 with_sgen_default_concurrent=yes
182                 ;;
183         *-*-kfreebsd*-gnu)
184                 CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP -DUSE_MUNMAP -DTHREAD_LOCAL_ALLOC -pthread"
185                 libmono_cflags="-D_REENTRANT -DTHREAD_LOCAL_ALLOC -pthread"
186                 libmono_ldflags="-lpthread -pthread"
187                 libdl="-ldl"
188                 libgc_threads=pthreads
189                 need_link_unlink=yes
190                 with_sigaltstack=no
191                 use_sigposix=yes
192                 with_sgen_default_concurrent=yes
193                 ;;
194         *-*-*freebsd*)
195                 if test "x$PTHREAD_CFLAGS" = "x"; then
196                         CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS"
197                         libmono_cflags=
198                 else
199                         CPPFLAGS="$CPPFLAGS $PTHREAD_CFLAGS -DGC_FREEBSD_THREADS"
200                         libmono_cflags="$PTHREAD_CFLAGS"
201                 fi
202                 if test "x$PTHREAD_LIBS" = "x"; then
203                         LDFLAGS="$LDFLAGS -pthread -L/usr/local/lib"
204                         libmono_ldflags="-pthread"
205                 else
206                         LDFLAGS="$LDFLAGS $PTHREAD_LIBS -L/usr/local/lib"
207                         libmono_ldflags="$PTHREAD_LIBS"
208                 fi
209                 CPPFLAGS="$CPPFLAGS -DHOST_BSD"
210                 need_link_unlink=yes
211                 AC_DEFINE(PTHREAD_POINTER_ID, 1, [pthread is a pointer])
212                 libdl=
213                 libgc_threads=pthreads
214                 use_sigposix=yes
215                 has_dtrace=yes
216                 with_sgen_default_concurrent=yes
217                 ;;
218         *-*-*openbsd*)
219                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_OPENBSD_THREADS -DHOST_BSD -D_REENTRANT -DUSE_MMAP"
220                 LDFLAGS="${LDFLAGS} -Wl,-zwxneeded"
221                 if test "x$disable_munmap" != "xyes"; then
222                 CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
223                 fi
224                 libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
225                 LDFLAGS="$LDFLAGS -pthread"
226                 need_link_unlink=yes
227                 AC_DEFINE(PTHREAD_POINTER_ID)
228                 libdl=
229                 libgc_threads=pthreads
230                 with_tls=pthread
231                 with_sigaltstack=no
232                 use_sigposix=yes
233                 with_sgen_default_concurrent=yes
234                 ;;
235         *-*-linux-android*)
236                 platform_android=yes
237                 AC_DEFINE(HOST_ANDROID,1,[Targeting the Android platform])
238                 AC_DEFINE(TARGET_ANDROID,1,[Targeting the Android platform])
240                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
241                 if test "x$disable_munmap" != "xyes"; then
242                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
243                 fi
244                 libmono_cflags="-D_REENTRANT"
245                 libdl="-ldl"
246                 libgc_threads=pthreads
247                 use_sigposix=yes
249                 with_tls=pthread
250                 with_sigaltstack=no
251                 with_static_mono=no
253                 # Android doesn't support boehm, as it's missing <link.h>
254                 support_boehm=no
255                 with_gc=sgen
257                 # isinf(3) requires -lm; see isinf check below
258                 LDFLAGS="$LDFLAGS -lm"
260                 # Bionic's <pthread.h> sets PTHREAD_STACK_MIN=2*PAGE_SIZE; doesn't define
261                 # PAGE_SIZE; breaks mono/io-layer/collection.c
262                 # Bionic doesn't provide S_IWRITE; breaks io-layer/io.c
263                 CFLAGS="$CFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
264                 CXXFLAGS="$CXXFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
266                 # to bypass the underscore linker check, can't work when cross-compiling
267                 mono_cv_uscore=yes
268                 mono_cv_clang=no
269                 ;;
270         *-*-linux*)
271                 host_linux=yes
272                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
273                 if test "x$disable_munmap" != "xyes"; then
274                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
275                 fi
276                 libmono_cflags="-D_REENTRANT"
277                 libdl="-ldl"
278                 libgc_threads=pthreads
279                 use_sigposix=yes
280                 if test "x$cross_compiling" != "xno"; then
281                         # to bypass the underscore linker check, not
282                         # available during cross-compilation
283                         mono_cv_uscore=no
284                 fi
285                 case "$host" in
286                 *-tizen-linux-*)
287                         platform_tizen=yes
288                         ;;
289                 esac
290                 case "$host" in
291                 aarch64-*)
292                         support_boehm=no
293                         with_gc=sgen
294                         ;;
295                 powerpc*-*-linux*)
296                         # https://bugzilla.novell.com/show_bug.cgi?id=504411
297                         disable_munmap=yes
298                         ;;
299                 esac
300                 with_sgen_default_concurrent=yes
301                 ;;
302         *-*-nacl*)
303                 echo "nacl no longer supported."
304                 exit 1
305                 ;;
306         *-*-hpux*)
307                 CPPFLAGS="$CPPFLAGS -DGC_HPUX_THREADS -D_HPUX_SOURCE -D_XOPEN_SOURCE_EXTENDED -D_REENTRANT"
308                 # +ESdbgasm only valid on bundled cc on RISC
309                 # silently ignored for ia64
310                 if test $GCC != "yes"; then
311                         CFLAGS="$CFLAGS +ESdbgasm"
312                         # Arrange for run-time dereferencing of null
313                         # pointers to produce a SIGSEGV signal.
314                         LDFLAGS="$LDFLAGS -z"
315                 fi
316                 CFLAGS="$CFLAGS +ESdbgasm"
317                 LDFLAGS="$LDFLAGS -z"
318                 libmono_cflags="-D_REENTRANT"
319                 libmono_ldflags="-lpthread"
320                 libgc_threads=pthreads
321                 need_link_unlink=yes
322                 use_sigposix=yes
323                 ;;
324         *-*-solaris*)
325                 CPPFLAGS="$CPPFLAGS -DGC_SOLARIS_THREADS -DGC_SOLARIS_PTHREADS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -DUSE_MMAP -DUSE_MUNMAP -DHOST_SOLARIS"
326                 need_link_unlink=yes
327                 libmono_cflags="-D_REENTRANT"
328                 libgc_threads=pthreads
329                 has_dtrace=yes
330                 use_sigposix=yes
331                 enable_solaris_tar_check=yes
332                 ;;
333         *-*-darwin*)
334                 parallel_mark="Disabled_Currently_Hangs_On_MacOSX"
335                 host_darwin=yes
336                 target_mach=yes
337                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_MACOSX_THREADS -DUSE_MMAP -DUSE_MUNMAP"
338                 libmono_cflags="-D_THREAD_SAFE"
339                 need_link_unlink=yes
340                 AC_DEFINE(PTHREAD_POINTER_ID)
341                 AC_DEFINE(USE_MACH_SEMA, 1, [...])
342                 libdl=
343                 libgc_threads=pthreads
344                 has_dtrace=yes
345                 if test "x$cross_compiling" = "xyes"; then
346                         has_broken_apple_cpp=yes
347                 fi
348                 dnl Snow Leopard is horribly broken -- it reports itself as i386-apple-darwin*, but
349                 dnl its gcc defaults to 64-bit mode.  They have also deprecated the usage of ucontext
350                 dnl we need to set some flags to build our 32-bit binaries on 10.6 properly
351                 case "$host" in
352                         dnl Snow Leopard and newer config.guess reports as this
353                         i*86-*-darwin*)
354                                 BROKEN_DARWIN_FLAGS="-arch i386"
355                                 BROKEN_DARWIN_CPPFLAGS=""
356                                 CPPFLAGS="$CPPFLAGS $BROKEN_DARWIN_CPPFLAGS"
357                                 CFLAGS="$CFLAGS $BROKEN_DARWIN_FLAGS"
358                                 CXXFLAGS="$CXXFLAGS $BROKEN_DARWIN_FLAGS"
359                                 CCASFLAGS="$CCASFLAGS $BROKEN_DARWIN_FLAGS"
360                                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC $BROKEN_DARWIN_CPPFLAGS"
361                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC $BROKEN_DARWIN_FLAGS"
362                                 with_sgen_default_concurrent=yes
363                                 ;;
364                         x*64-*-darwin*)
365                                 with_sgen_default_concurrent=yes
366                                 ;;
367                         arm*-darwin*)
368                                 platform_ios=yes
369                                 has_dtrace=no
370                                 ;;
371                         aarch64*-darwin*)
372                                 platform_ios=yes
373                                 ;;
374                 esac
375                 ;;
376         *-*-haiku*)
377                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -D_THREAD_SAFE"
378                 libmono_cflags="-D_REENTRANT -D_THREAD_SAFE"
379                 libdl=
380                 LIBS="$LIBS -lnetwork -ltextencoding"
381                 need_link_unlink=yes
382                 AC_DEFINE(PTHREAD_POINTER_ID)
383                 dnl Haiku does not support static TLS with __thread
384                 with_tls=pthread
385                 libgc_threads=pthreads
386                 use_sigposix=yes
387                 ;;
388         *-*-aix*|*-*-os400*)
389                 dnl Set up a 64-bit build
390                 CPPFLAGS="$CPPFLAGS -maix64 -DGC_AIX_THREADS -D_ALL_SOURCE -D_THREAD_SAFE -D_LARGE_FILES -D_REENTRANT"
391                 LDFLAGS="-maix64"
392                 libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
393                 dnl Would you believe GNU nm doesn't know how to process AIX libraries?
394                 dnl Hardcode IBM binutils in case GNU ones end up on our path. Also
395                 dnl specifiy 64-bit mode for tools.
396                 AR="/usr/bin/ar -X64"
397                 NM="/usr/bin/nm -X64"
398                 dnl SGen is the future (changes to Boehm support code would be
399                 dnl required if you wish to re-enable Boehm)
400                 support_boehm=no
401                 with_gc=sgen
402                 need_link_unlink=yes
403                 use_sigposix=yes
404                 dnl the valloc call to alloc the guard page bombs out, even with extending the data area
405                 with_sigaltstack=no
406                 dnl use pthread TLS, __thread has issues with the compiler flags we use
407                 with_tls=pthread
408                 dnl ppc Linux is the same? test further
409                 disable_munmap=yes
410                 ;;
411         *)
412                 AC_MSG_WARN([*** Please add $host to configure.ac checks!])
413                 libdl="-ldl"
414                 ;;
415 esac
417 # WASM hack
420 AC_MSG_RESULT(ok)
422 if test x$need_link_unlink = xyes; then
423    AC_DEFINE(NEED_LINK_UNLINK, 1, [Define if Unix sockets cannot be created in an anonymous namespace])
426 if test x$host_win32 = xyes; then
427    AC_DEFINE(HOST_WIN32, 1, [Host Platform is Win32])
430 if test x$target_win32 = xyes; then
431    AC_DEFINE(TARGET_WIN32, 1, [Target Platform is Win32])
434 if test x$host_darwin = xyes; then
435    AC_DEFINE(HOST_DARWIN, 1, [Host Platform is Darwin])
438 # Defined for all targets/platforms using classic Windows API support.
439 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
440 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
442 AC_SUBST(extra_runtime_ldflags)
443 AM_CONDITIONAL(HOST_WIN32, test x$host_win32 = xyes)
444 AM_CONDITIONAL(TARGET_WIN32, test x$target_win32 = xyes)
445 AM_CONDITIONAL(HOST_LINUX, echo x$target_os | grep -q linux)
446 AM_CONDITIONAL(HOST_DARWIN, test x$host_darwin = xyes)
447 AM_CONDITIONAL(HOST_SIGPOSIX, test x$use_sigposix = xyes)
448 AM_CONDITIONAL(HOST_ANDROID, test x$platform_android = xyes)
449 AM_CONDITIONAL(HOST_TIZEN, test x$platform_tizen = xyes)
450 AM_CONDITIONAL(HOST_IOS, test x$platform_ios = xyes)
451 AM_CONDITIONAL(HOST_WASM, test x$platform_wasm = xyes)
453 if test -z "$HOST_DARWIN_TRUE"; then :
454 PLATFORM_AOT_SUFFIX=.dylib
457 if test -z "$HOST_LINUX_TRUE"; then :
458 PLATFORM_AOT_SUFFIX=.so
461 if test -z "$HOST_WIN32_TRUE"; then :
462 PLATFORM_AOT_SUFFIX=.dll
465 AC_SUBST(PLATFORM_AOT_SUFFIX)
467 ## PLATFORM_AOT_SUFFIX not so simple for windows :-)
469 AC_CHECK_TOOL(CC, gcc, gcc)
470 AC_PROG_CC
471 AC_CHECK_TOOL(CXX, g++, g++)
472 AC_PROG_CXX
473 AM_PROG_AS
474 AC_PROG_INSTALL
475 AC_PROG_AWK
476 AM_PROG_CC_C_O
477 dnl We should use AM_PROG_AS, but it's not available on automake/aclocal 1.4
478 : ${CCAS='$(CC)'}
479 # Set ASFLAGS if not already set.
480 : ${CCASFLAGS='$(CFLAGS)'}
481 AC_SUBST(CCAS)
482 AC_SUBST(CCASFLAGS)
484 # AC_PROG_CXX helpfully sets CXX to g++ even if no c++ compiler is found so check
485 # GXX instead. See http://lists.gnu.org/archive/html/bug-autoconf/2002-04/msg00056.html
486 if test "x$CXX" = "xg++"; then
487         if test "x$GXX" != "xyes"; then
488                 # automake/libtool is so broken, it requires g++ even if the c++ sources
489                 # are inside automake conditionals
490                 AC_MSG_ERROR([You need to install g++])
491         fi
494 dnl may require a specific autoconf version
495 dnl AC_PROG_CC_FOR_BUILD
496 dnl CC_FOR_BUILD not automatically detected
497 CC_FOR_BUILD=$CC
498 CFLAGS_FOR_BUILD=$CFLAGS
499 BUILD_EXEEXT=
500 if test "x$cross_compiling" = "xyes"; then
501         CC_FOR_BUILD=cc
502         CFLAGS_FOR_BUILD=
503         BUILD_EXEEXT=""
505 AC_SUBST(CC_FOR_BUILD)
506 AC_SUBST(CFLAGS_FOR_BUILD)
507 AC_SUBST(HOST_CC)
508 AC_SUBST(BUILD_EXEEXT)
510 AM_CONDITIONAL(CROSS_COMPILING, [test x$cross_compiling = xyes])
511 AM_CONDITIONAL(USE_BATCH_FILES, [test x$host_win32 = xyes -a x$cross_compiling = xyes])
513 # Set STDC_HEADERS
514 AC_HEADER_STDC
515 AC_LIBTOOL_WIN32_DLL
516 # This causes monodis to not link correctly
517 #AC_DISABLE_FAST_INSTALL
519 #lookup makedev() header
520 AC_HEADER_MAJOR
522 AM_PROG_LIBTOOL
523 # Use dolt (http://dolt.freedesktop.org/) instead of libtool for building.
524 DOLT
526 export_ldflags=`(./libtool --config; echo eval echo \\$export_dynamic_flag_spec) | sh`
527 AC_SUBST(export_ldflags)
529 # Test whenever ld supports -version-script
530 AC_PROG_LD
531 AC_PROG_LD_GNU
533 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)
534 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)
535 AC_CHECK_HEADERS([linux/netlink.h linux/rtnetlink.h],
536                   [], [], [#include <stddef.h>
537                   #include <sys/socket.h>
538                   #include <linux/socket.h>])
540 AC_CHECK_HEADERS(sys/user.h, [], [],
542 #ifdef HAVE_SYS_PARAM_H
543 # include <sys/param.h>
544 #endif
547 AC_CHECK_HEADERS(linux/serial.h)
549 AC_CHECK_HEADER(zlib.h, [have_zlib=yes], [have_zlib=no])
550 if test x$have_zlib = xyes; then
551    AC_TRY_COMPILE([#include <zlib.h>], [
552    #if defined(ZLIB_VERNUM) && (ZLIB_VERNUM >= 0x1230)
553    #else
554    #error No good zlib found
555    #endif
556    ],[
557         AC_MSG_RESULT(Using system zlib)
558         zlib_msg="system zlib"
559         AC_DEFINE(HAVE_SYS_ZLIB,1,[Have system zlib])
560    ],[
561         AC_MSG_RESULT(Using embedded zlib)
562         have_zlib=no
563         zlib_msg="bundled zlib"
564    ])
567 AM_CONDITIONAL(HAVE_ZLIB, test x$have_zlib = xyes)
568 AC_DEFINE(HAVE_ZLIB,1,[Have system zlib])
570 # for mono/metadata/debug-symfile.c
571 AC_CHECK_HEADERS(elf.h)
573 # for support
574 AC_CHECK_HEADERS(poll.h)
575 AC_CHECK_HEADERS(sys/poll.h)
576 AC_CHECK_HEADERS(sys/wait.h)
577 AC_CHECK_HEADERS(grp.h)
578 AC_CHECK_HEADERS(syslog.h)
579 AC_CHECK_FUNCS(vsyslog)
581 # for mono/dis
582 AC_CHECK_HEADERS(wchar.h)
583 AC_CHECK_HEADERS(ieeefp.h)
584 AC_MSG_CHECKING(for isinf)
585 AC_TRY_LINK([#include <math.h>], [
586         int f = isinf (1.0);
587 ], [
588         AC_MSG_RESULT(yes)
589         AC_DEFINE(HAVE_ISINF, 1, [isinf available])
590 ], [
591         # We'll have to use signals
592         AC_MSG_RESULT(no)
594 # mingw
595 AC_CHECK_FUNCS(_finite, , AC_MSG_CHECKING(for _finite in math.h)
596         AC_TRY_LINK([#include <math.h>], 
597         [ _finite(0.0); ], 
598         AC_DEFINE(HAVE__FINITE, 1, [Have _finite in -lm]) AC_MSG_RESULT(yes),
599         AC_MSG_RESULT(no)))
601 # for Linux statfs support
602 AC_CHECK_HEADERS(linux/magic.h)
604 # For Android NDK unified headers
605 if test x$platform_android = xyes; then
606         AC_CHECK_HEADERS(machine/endian.h sys/endian.h)
607         AC_CHECK_HEADERS(android/legacy_signal_inlines.h, [have_android_signal_inlines=yes], [have_android_signal_inlines=no])
609         # Make sure SIGRT{MIN,MAX} work - they will fail to work with unified headers if building for
610         # API level < 21 *and* android/legacy_signal_inlines.h doesn't declare (and define) the required
611         # libc APIs to obtain values for SIGRT{MIN,MAX}. We perform the check only if android/legacy_signal_inlines.h
612         # is found because in other cases the macros will either work (for NDK < 14) or fail if the legacy header
613         # doesn't contain the required definitions (NDK 14)
614         if test x$have_android_signal_inlines = xyes; then
615                 AC_MSG_CHECKING([Whether Android SIGRTMIN/SGRTMAX macros are valid])
616                 AC_COMPILE_IFELSE([
617                         AC_LANG_PROGRAM([#include <android/legacy_signal_inlines.h>],[
618                                 int i;
619                                 for (i = SIGRTMIN + 1; i < SIGRTMAX; ++i) {
620                                 }
621                         ])],[
622                                 AC_MSG_RESULT(yes)
623                                 android_sigrtminmax_work=yes
624                         ],[
625                                 AC_MSG_RESULT(no)
626                                 android_sigrtminmax_work=no
627                         ]
628                 )
630                 if test x$android_sigrtminmax_work = xno; then
631                         AC_MSG_ERROR([Android SIGRTMIN/SIGRTMAX macros don't work in this NDK])
632                 fi
633         fi
635         # Attempt to detect whether we're using Android NDK unified headers
636         AC_CHECK_HEADERS(android/api-level.h, [have_android_api_level=yes], [have_android_api_level=no])
637         AC_CHECK_HEADERS(android/versioning.h, [have_android_versioning=yes], [have_android_versioning=no])
639         android_unified_headers=no
640         if test x$have_android_api_level = xyes; then
641                 if test x$have_android_versioning = xyes; then
642                         AC_MSG_CHECKING([whether using Android NDK unified headers])
644                         # Both macros are defined only in the NDK unified headers
645                         AC_COMPILE_IFELSE([
646                                 AC_LANG_PROGRAM([
647                                         #include <android/api-level.h>
648                                         #include <android/versioning.h>
649                                 ],[
650                                         #if __ANDROID_API_O__ == 26 && defined(__INTRODUCED_IN)
651                                         #else
652                                                 #error __ANDROID_API_O__ != 26 or the __INTRODUCED_IN macro not defined
653                                         #endif
654                                 ])],[
655                                         AC_MSG_RESULT(yes)
656                                         android_unified_headers=yes
657                                 ],[
658                                         AC_MSG_RESULT(no)
659                                         android_unified_headers=no
660                                 ]
661                         )
662                 fi
663         fi
665         if test x$android_unified_headers = xyes; then
666                 AC_DEFINE(ANDROID_UNIFIED_HEADERS, 1, [Whether Android NDK unified headers are used])
667         fi
668 fi # Android
670 # not 64 bit clean in cross-compile
671 if test "x$enable_wasm" = "xyes"; then
672 AC_DEFINE(SIZEOF_VOID_P,4)
673 AC_DEFINE(SIZEOF_LONG,4)
674 ac_cv_sizeof_void_p="4"
675 ac_cv_sizeof_long="4"
676 else
677 AC_CHECK_SIZEOF(void *)
678 AC_CHECK_SIZEOF(long)
681 AC_CHECK_SIZEOF(int)
682 AC_CHECK_SIZEOF(long long)
684 AC_CACHE_CHECK([for clang],
685         mono_cv_clang,[
686         AC_TRY_COMPILE([], [
687                 #ifdef __clang__
688                 #else
689                 #error "FAILED"
690                 #endif
691         ],
692         [mono_cv_clang=yes],
693         [mono_cv_clang=no],
694         [])
697 AC_ARG_ENABLE(visibility-hidden,
698 [  --disable-visibility-hidden    disable usage of -fvisiblity=hidden],
699    disable_visibility_hidden=yes, disable_visibility_hidden=no)
701 WARN=''
702 if test x"$GCC" = xyes; then
703                 WARN='-Wall -Wunused -Wmissing-declarations -Wpointer-arith -Wno-cast-qual -Wwrite-strings -Wno-switch -Wno-switch-enum -Wno-unused-value -Wno-attributes'
704                 CFLAGS="$CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs -Wno-format-zero-length"
706                 # We require C99 with some GNU extensions, e.g. `linux` macro
707                 CFLAGS="$CFLAGS -std=gnu99"
709                 # The runtime code does not respect ANSI C strict aliasing rules
710                 CFLAGS="$CFLAGS -fno-strict-aliasing"
712                 # We rely on signed overflow to behave
713                 CFLAGS="$CFLAGS -fwrapv"
715                 CFLAGS="$CFLAGS -DMONO_DLL_EXPORT"
716                 if test x"$disable_visibility_hidden" = xno; then
717                    # Don't export any symbols by default
718                    SHARED_CFLAGS="-fvisibility=hidden"
719                    CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
720                 fi
722                 ORIG_CFLAGS=$CFLAGS
723                 # Check for the normal version, since gcc ignores unknown -Wno options
724                 CFLAGS="$CFLAGS -Wunused-but-set-variable -Werror"
725                 AC_MSG_CHECKING(for -Wno-unused-but-set-variable option to gcc)
726                 AC_TRY_COMPILE([],[
727                 ], [
728                    AC_MSG_RESULT(yes)
729                    CFLAGS="$ORIG_CFLAGS -Wno-unused-but-set-variable"
730                 ], [
731                    AC_MSG_RESULT(no)
732                    CFLAGS=$ORIG_CFLAGS
733                 ])
735                 if test "x$mono_cv_clang" = "xyes"; then
736                    # https://bugzilla.samba.org/show_bug.cgi?id=8118
737                    WARN="$WARN -Qunused-arguments"
738                    WARN="$WARN -Wno-unused-function -Wno-tautological-compare -Wno-parentheses-equality -Wno-self-assign -Wno-return-stack-address -Wno-constant-logical-operand"
739                    # We rely on zero length arrays in structs
740                    WARN="$WARN -Wno-zero-length-array"
741                 fi
742 else
743         # The Sun Forte compiler complains about inline functions that access static variables
744         # so disable all inlining.
745         case "$host" in
746         *-*-solaris*)
747                 CFLAGS="$CFLAGS -Dinline="
748                 ;;
749         esac
751 CFLAGS="$WARN $CFLAGS -g"
752 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -g"
753 CPPFLAGS="$WARN $CPPFLAGS -g"
755 # Where's the 'mcs' source tree?
756 if test -d $srcdir/mcs; then
757   mcsdir=mcs
758 else
759   mcsdir=../mcs
762 AC_ARG_WITH(mcs-path, [  --with-mcs-path=/path/to/mcs      Specify an alternate mcs source tree],
763         if test x$with_mcs_path != "x" -a -d $with_mcs_path ; then
764                 mcsdir=$with_mcs_path
765         fi
768 AC_ARG_WITH(jumptables, [  --with-jumptables=yes,no      enable/disable support for jumptables (ARM-only for now) (defaults to no)],[],[with_jumptables=no])
771 # A sanity check to catch cases where the package was unpacked
772 # with an ancient tar program (Solaris)
774 AC_ARG_ENABLE(solaris-tar-check,
775 [  --disable-solaris-tar-check    disable solaris tar check],
776    do_solaris_tar_check=no, do_solaris_tar_check=yes)
778 if test x"$do_solaris_tar_check" = xyes -a x"$enable_solaris_tar_check" = xyes; then
779         AC_MSG_CHECKING(integrity of package)
780         if test -f $mcsdir/class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapTypeMapper.cs
781         then
782                 AC_MSG_RESULT(ok)
783         else
784                 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"
785                 AC_MSG_ERROR([$errorm])
786         fi
789 if test "x$with_mcs_path" != "x"; then
790 mcs_topdir=$(cd "$mcsdir" && pwd)
791 mcs_topdir_from_srcdir=$mcs_topdir
792 else
793 mcs_topdir=$(cd "$srcdir/$mcsdir" && pwd)
794 mcs_topdir_from_srcdir='$(top_builddir)'/$mcsdir
797 # Convert mcs_topdir* paths to Windows syntax.
798 if test x$cross_compiling$host_win32 = xnoyes; then
799   mcs_topdir=$(cygpath -m $mcs_topdir)
800   case $mcs_topdir_from_srcdir in
801     /cygdrive/*)
802         mcs_topdir_from_srcdir=$(cygpath -m $mcs_topdir_from_srcdir)
803         ;;
804   esac
807 AC_SUBST([mcs_topdir])
808 AC_SUBST([mcs_topdir_from_srcdir])
810 # gettext: prepare the translation directories. 
811 # we do not configure the full gettext, as we consume it dynamically from C#
812 AM_PO_SUBDIRS
814 if test "x$USE_NLS" = "xyes"; then
815    AC_CHECK_PROG(HAVE_MSGFMT, msgfmt,yes,no)
817    if test "x$HAVE_MSGFMT" = "xno"; then
818           AC_MSG_ERROR([msgfmt not found. You need to install the 'gettext' package, or pass --enable-nls=no to configure.])
819    fi
822 AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
824 pkg_config_path=
825 AC_ARG_WITH(crosspkgdir, [  --with-crosspkgdir=/path/to/pkg-config/dir      Change pkg-config dir to custom dir],
826         if test x$with_crosspkgdir = "x"; then
827                 if test -s $PKG_CONFIG_PATH; then
828                         pkg_config_path=$PKG_CONFIG_PATH
829                 fi
830         else
831                 pkg_config_path=$with_crosspkgdir
832                 PKG_CONFIG_PATH=$pkg_config_path
833                 export PKG_CONFIG_PATH
834         fi
837 AC_ARG_ENABLE(ninja,[  --enable-ninja    Enable using ninja where available], enable_ninja=$enableval)
838 AC_CHECK_PROG(HAVE_NINJA, ninja, yes, no)
839 AM_CONDITIONAL(NINJA, test x$enable_ninja = xyes -a x$HAVE_NINJA != xno)
841 AC_ARG_ENABLE(werror, [  --enable-werror Pass -Werror to the C compiler], werror_flag=$enableval, werror_flag=no)
842 if test x$werror_flag = xyes; then
843         WERROR_CFLAGS="-Werror"
845 AC_SUBST([WERROR_CFLAGS])
846 AC_SUBST([SHARED_CFLAGS])
848 GLIB_CFLAGS='-I$(top_srcdir)/mono/eglib -I$(top_builddir)/mono/eglib'
849   
850 AC_SUBST(GLIB_CFLAGS)
852 # Enable support for fast thread-local storage
853 # Some systems have broken support, so we allow to disable it.
854 AC_ARG_WITH(tls, [  --with-tls=__thread,pthread    select Thread Local Storage implementation (defaults to __thread)],[],[with_tls=__thread])
856 # Enable support for using sigaltstack for SIGSEGV and stack overflow handling
857 # This does not work on some platforms (bug #55253)
858 AC_ARG_WITH(sigaltstack, [  --with-sigaltstack=yes,no      enable/disable support for sigaltstack (defaults to yes)],[],[with_sigaltstack=yes])
860 AC_ARG_WITH(static_mono, [  --with-static_mono=yes,no      link mono statically to libmono (faster) (defaults to yes)],[],[with_static_mono=yes])
861 AC_ARG_WITH(shared_mono, [  --with-shared_mono=yes,no      build a shared libmono library (defaults to yes)],[],[with_shared_mono=yes])
862 # Same as --with-shared_mono=no
863 AC_ARG_ENABLE(libraries, [  --disable-libraries disable the build of libmono], enable_libraries=$enableval, enable_libraries=yes)
865 if test "x$enable_static" = "xno"; then
866    with_static_mono=no
869 if test "x$enable_shared" = "xno"; then
870    with_shared_mono=no
873 if test "x$enable_libraries" = "xno"; then
874    with_shared_mono=no
877 AM_CONDITIONAL(DISABLE_LIBRARIES, test x$enable_libraries = xno)
879 if test "x$host_win32" = "xyes"; then
880    # Boehm GC requires the runtime to be in its own dll
881    with_static_mono=no
884 AM_CONDITIONAL(STATIC_MONO, test x$with_static_mono != xno)
885 AM_CONDITIONAL(SHARED_MONO, test x$with_shared_mono != xno)
886 AC_ARG_ENABLE(mcs-build, [  --disable-mcs-build disable the build of the mcs directory], try_mcs_build=$enableval, enable_mcs_build=yes)
887 AC_ARG_ENABLE(support-build, [  --disable-support-build disable the build of the support directory], try_support_build=$enableval, enable_support_build=yes)
889 AC_ARG_WITH(xen_opt,   [  --with-xen_opt=yes,no          Enable Xen-specific behaviour (defaults to yes)],[],[with_xen_opt=yes])
890 if test "x$with_xen_opt" = "xyes" -a "x$mono_cv_clang" = "xno"; then
891         AC_DEFINE(MONO_XEN_OPT, 1, [Xen-specific behaviour])
892         ORIG_CFLAGS=$CFLAGS
893         CFLAGS="$CFLAGS -mno-tls-direct-seg-refs"
894         AC_MSG_CHECKING(for -mno-tls-direct-seg-refs option to gcc)
895         AC_TRY_COMPILE([], [
896         ], [
897            AC_MSG_RESULT(yes)
898            # Pass it to libgc as well
899            CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -mno-tls-direct-seg-refs"
900         ], [
901            AC_MSG_RESULT(no)
902            CFLAGS=$ORIG_CFLAGS
903         ])
906 AC_ARG_ENABLE(small-config, [  --enable-small-config Enable tweaks to reduce requirements (and capabilities)], enable_small_config=$enableval, enable_small_config=no)
908 if test x$enable_small_config = xyes; then
909         AC_DEFINE(MONO_SMALL_CONFIG,1,[Reduce runtime requirements (and capabilities)])
910         CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DSMALL_CONFIG"
913 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)
915 DISABLED_FEATURES=none
916 csc_compiler=default
917 endian=unknown
918 AC_C_BIGENDIAN([endian=big],[endian=little],[endian=unknown])
919 AC_MSG_CHECKING([CSharp compiler to use])
920 AC_ARG_WITH(csc, [  --with-csc=mcs,roslyn,default      Configures the CSharp compiler to use],[
921    if test x$withval = xmcs; then
922        csc_compiler=mcs
923    elif test x$withval = xroslyn; then
924        csc_compiler=roslyn
925    elif test x$withval = xdefault; then
926        :
927    else
928        AC_MSG_ERROR([You must supply one of "mcs", "roslyn" or "default" to the --with-csc option])
929    fi
930 ],[csc_compiler=default])
932 if test $csc_compiler = default; then
933    if test $endian = big; then
934       csc_compiler=mcs
935    elif test $endian = little; then
936       case "$host" in
937         powerpc*) csc_compiler=mcs ;;
938         *) csc_compiler=roslyn ;;
939       esac
940    else
941       csc_compiler=mcs
942    fi
944 AC_MSG_RESULT($csc_compiler)
946 AC_ARG_WITH(jemalloc,             [  --with-jemalloc=yes,no               If jemalloc is enabled (defaults to no)],                                     [], [with_jemalloc=no])
947 AC_ARG_WITH(jemalloc-always,      [  --with-jemalloc_always=yes,no        If jemalloc is enabled and always used (defaults to yes)],                    [], [with_jemalloc_always=no])
948 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])
951 if test x$target_win32 = xyes; then
952 with_jemalloc=no
953 with_jemalloc_assert=no
954 with_jemalloc_always=no
957 AM_CONDITIONAL(MONO_JEMALLOC_ASSERT, [test "x$with_jemalloc_assert" = "xyes"])
958 if test "x$with_jemalloc_assert" = "xyes"; then
959 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ASSERT"
960 AC_DEFINE(MONO_JEMALLOC_ASSERT, 1, [Make jemalloc assert for mono])
961 AC_SUBST(MONO_JEMALLOC_ASSERT, 1)
964 AM_CONDITIONAL(MONO_JEMALLOC_DEFAULT, [test "x$with_jemalloc_always" = "xyes"])
965 if test "x$with_jemalloc_always" = "xyes"; then
966 with_jemalloc=yes
967 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_DEFAULT"
968 AC_DEFINE(MONO_JEMALLOC_DEFAULT, 1, [Make jemalloc default for mono])
969 AC_SUBST(MONO_JEMALLOC_DEFAULT, 1)
972 AM_CONDITIONAL(MONO_JEMALLOC_ENABLED, [test "x$with_jemalloc" = "xyes"])
973 if test "x$with_jemalloc" = "xyes"; then
974 JEMALLOC_LDFLAGS="-L`pwd`/mono/utils/jemalloc/jemalloc/lib -ljemalloc_pic"
975 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ENABLED -I `pwd`/mono/utils/jemalloc/jemalloc/include"
976 JEMALLOC_AUTOCONF_FLAGS=" --build=$target --host=$host"
978 if test "x$target_mach" = "xyes"; then
979         JEMALLOC_CPPFLAGS=" -stdlib=libc++ "
982 AC_DEFINE(MONO_JEMALLOC_ENABLED, 1, [Enable jemalloc usage for mono])
983 AC_SUBST(MONO_JEMALLOC_ENABLED, 1)
985 AC_SUBST(JEMALLOC_CFLAGS)
986 AC_SUBST(JEMALLOC_CPPFLAGS)
987 AC_SUBST(JEMALLOC_LDFLAGS)
988 AC_SUBST(JEMALLOC_AUTOCONF_FLAGS)
991 # Terminology:
992 # Crash privacy - Attempts to not send identifying information in the crash dump / to protect the obscurity of the program control flow
993 # MERP - The MS telemetry profile. Not for general use.
994 # Structured crashes - crashes at runtime that trigger a stack walk by mono that happens cooperatively
996 # 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.
998 #--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.
999 #--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.
1000 #--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.
1001 #--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.
1003 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=no])
1004 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])
1006 if test "x$with_crash_privacy" = "xno"; then
1007 AC_DEFINE(MONO_PRIVATE_CRASHES,1,[Do not include names of unmanaged functions in the crash dump])
1010 if test "x$with_structured_crashes" = "xno"; then
1011 AC_DEFINE(DISABLE_STRUCTURED_CRASH,1,[Do not create structured crash files during unmanaged crashes])
1014 AC_ARG_ENABLE(monodroid, [ --enable-monodroid Enable runtime support for Monodroid (Xamarin.Android)], enable_monodroid=$enableval, enable_monodroid=no)
1015 AM_CONDITIONAL(ENABLE_MONODROID, test x$enable_monodroid = xyes)
1017 AC_ARG_ENABLE(monotouch, [ --enable-monotouch Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)], enable_monotouch=$enableval, enable_monotouch=no)
1018 AM_CONDITIONAL(ENABLE_MONOTOUCH, test x$enable_monotouch = xyes)
1020 if test x$enable_monodroid = xyes; then
1021         AC_DEFINE(ENABLE_MONODROID, 1, [Enable runtime support for Monodroid (Xamarin.Android)])
1024 if test x$enable_monotouch = xyes; then
1025         AC_DEFINE(ENABLE_MONOTOUCH, 1, [Enable runtime support for Monotouch (Xamarin.iOS and Xamarin.Mac)])
1028 AC_ARG_ENABLE(cxx, [  --enable-cxx   compile some code as C++])
1030 if test "x$enable_cxx" = "xyes"; then
1032         # FIXME Centos6 requires a different flag for prerelease C++11.
1033         #CXX_ADD_CFLAGS=' -xc++ -std=gnu++98 -fno-exceptions -fno-rtti '
1034         CXX_ADD_CFLAGS=' -xc++ -std=gnu++11 -fno-exceptions -fno-rtti '
1036         # -std=gnu99 -xc++ is not allowed and errors.
1037         CXX_REMOVE_CFLAGS=-std=gnu99
1038         # These give warnings and should be removed. They are C-only.
1039         # i.e. C++ never allows these, they are always errors and their warningness is not controllable.
1040         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs"
1041         # Likewise with CentOS 6 gcc 4.4.
1042         CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Werror-implicit-function-declaration"
1044         # The C-only-ness of -Wno-format-zero-length varies with gcc version.
1045         # It is C-only prior to 4.7. Using it with C++ prior to 4.7
1046         # generates a warning every time we run gcc which is very unsightly.
1047         # The warning is for e.g. sprintf(foo, "") which can just be
1048         # foo[0] = 0 but Mono's use is more elaborate, not as easy to "fix",
1049         # and completely legal and valid.
1050         # We have to switch to C++ and not just use -xc++ because of -std=gnu99 (error when combined with -xc++).
1051         # Alternatively, just run $CXX -xc++ -c /dev/null.
1052         AC_LANG_PUSH(C++)
1053         ORIG_CXXFLAGS=$CXXFLAGS
1054         CXXFLAGS="$CXXFLAGS -Werror -Wno-format-zero-length -xc++ "
1055         AC_MSG_CHECKING(or C-only-ness of -Wno-format-zero-length)
1056         AC_TRY_COMPILE([ ], [ ], [ AC_MSG_RESULT(yes) ],
1057                                  [ AC_MSG_RESULT(no)
1058                                    CXX_REMOVE_CFLAGS="$CXX_REMOVE_CFLAGS -Wno-format-zero-length" ])
1059         CXXFLAGS=$ORIG_CXXFLAGS
1060         AC_LANG_POP(C++)
1062 AC_SUBST(CXX_ADD_CFLAGS)
1063 AC_SUBST(CXX_REMOVE_CFLAGS)
1066 # Set the build profiles and options before things which use them
1069 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])
1070 AC_ARG_WITH(monodroid,           [  --with-monodroid=yes,no             If you want to build the MonoDroid assemblies (defaults to no)],            [], [with_monodroid=default])
1071 AC_ARG_WITH(monotouch,           [  --with-monotouch=yes,no             If you want to build the Xamarin.iOS assemblies (defaults to no)],          [], [with_monotouch=default])
1072 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])
1073 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])
1074 AC_ARG_WITH(bitcode,             [  --with-bitcode=yes,no               If bitcode is enabled (defaults to no)],                                    [], [with_bitcode=default])
1075 AC_ARG_WITH(xammac,              [  --with-xammac=yes,no                If you want to build the Xamarin.Mac assemblies (defaults to no)],          [], [with_xammac=default])
1076 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])
1077 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])
1078 AC_ARG_WITH(winaot,              [  --with-winaot=yes,no                If you want to build the Windows friendly AOT assemblies (defaults to no)], [], [with_winaot=default])
1079 AC_ARG_WITH(orbis,               [  --with-orbis=yes,no                 If you want to build the Orbis assemblies (defaults to no)], [], [with_orbis=default])
1080 AC_ARG_WITH(unreal,              [  --with-unreal=yes,no                If you want to build the Unreal assemblies (defaults to no)], [], [with_unreal=default])
1081 AC_ARG_WITH(wasm,                [  --with-wasm=yes,no                  If you want to build the WebAssembly (defaults to no)], [], [with_wasm=default])
1084 AC_ARG_WITH(runtime-preset, [  --with-runtime-preset=net_4_x,all,aot,aot_llvm,hybridaot,hybridaot_llvm,fullaot,fullaot_llvm,bitcode,unreal   Which default profile to build (defaults to net_4_x)],  [], [with_runtime_preset=net_4_x])
1085 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])
1086 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])
1087 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])
1090 dnl Spectre compiler mitigation flag checks
1092 if test "x$with_spectre_mitigation" = "xyes"; then
1093    AC_MSG_NOTICE([Compiler Spectre mitigation support checks])
1094    SPECTRE_CFLAGS=
1095    SPECTRE_INDIRECT_BRANCH_KIND=
1096    case "x$with_spectre_indirect_branch_choice" in
1097        xkeep) SPECTRE_INDIRECT_BRANCH_KIND=keep ;;
1098        xthunk) SPECTRE_INDIRECT_BRANCH_KIND=thunk ;;
1099        xinline) SPECTRE_INDIRECT_BRANCH_KIND=thunk-inline ;;
1100        xextern) SPECTRE_INDIRECT_BRANCH_KIND=thunk-extern ;;
1101        *) AC_MSG_ERROR([Invalid indirect jump thunk kind ($with_spectre_indirect_branch_choice)]) ;;
1102    esac
1104    SPECTRE_FUNCTION_RETURN_KIND=""
1105    case "x$with_spectre_function_return_choice" in
1106        xkeep) SPECTRE_FUNCTION_RETURN_KIND=keep ;;
1107        xthunk) SPECTRE_FUNCTION_RETURN_KIND=thunk ;;
1108        xinline) SPECTRE_FUNCTION_RETURN_KIND=thunk-inline ;;
1109        xextern) SPECTRE_FUNCTION_RETURN_KIND=thunk-extern ;;
1110        *) AC_MSG_ERROR([Invalid function return thunk kind ($with_spectre_function_return_choice)]) ;;
1111    esac
1113    AX_CHECK_COMPILE_FLAG(
1114         [ -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND ],
1115         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND" ]
1116    )
1118    AX_CHECK_COMPILE_FLAG(
1119         [ -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND ],
1120         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND" ]
1121    )
1123    if test "x$SPECTRE_CFLAGS" != "x" ; then
1124         CFLAGS="$CFLAGS $SPECTRE_CFLAGS"
1125         CXXFLAGS="$CXXFLAGS $SPECTRE_CFLAGS"
1126         spectre_mitigation_status="mitigation enabled"
1127    fi
1128 else
1129         spectre_mitigation_status="no mitigation"
1133 dnl Profile defaults
1135 TEST_PROFILE=default
1136 enable_llvm_default=no
1138 with_profile4_x_default=no
1139 with_monodroid_default=no
1140 with_monotouch_default=no
1141 with_monotouch_watch_default=no
1142 with_monotouch_tv_default=no
1143 with_xammac_default=no
1144 with_testing_aot_hybrid_default=no
1145 with_testing_aot_full_default=no
1146 with_winaot_default=no
1147 with_orbis_default=no
1148 with_unreal_default=no
1149 with_wasm_default=no
1151 with_bitcode_default=no
1152 enable_cooperative_suspend_default=no
1153 enable_hybrid_suspend_default=no
1155 INVARIANT_AOT_OPTIONS=nimt-trampolines=2000,ntrampolines=10000,nrgctx-fetch-trampolines=256,ngsharedvt-trampolines=4000
1157 AOT_BUILD_ATTRS=$INVARIANT_AOT_OPTIONS
1159 if test x$cross_compiling = xyes -o x$enable_mcs_build = xno; then
1160    DISABLE_MCS_DOCS_default=yes
1161 elif test x$with_runtime_preset = xnet_4_x; then
1162    with_profile4_x_default=yes
1163 elif test x$with_runtime_preset = xall; then
1164    with_profile4_x_default=yes
1165    with_monodroid_default=yes
1166    with_monotouch_default=yes
1167    with_monotouch_watch_default=yes
1168    with_monotouch_tv_default=yes
1169    with_xammac_default=yes
1170    with_winaot_default=yes
1171    with_orbis_default=yes
1172    with_unreal_default=yes
1173    with_wasm_default=yes
1174    with_testing_aot_hybrid_default=yes
1175    with_testing_aot_full_default=yes
1176 elif test x$with_runtime_preset = xbitcode; then
1177    DISABLE_MCS_DOCS_default=yes
1178    with_testing_aot_full_default=yes
1179    with_bitcode_default=yes
1180    enable_cooperative_suspend_default=yes
1181    TEST_PROFILE=testing_aot_full
1182    enable_llvm_default=yes
1184    mono_feature_disable_com='yes'
1185    mono_feature_disable_remoting='yes'
1186    mono_feature_disable_reflection_emit_save='yes'
1187    mono_feature_disable_reflection_emit='yes'
1188    mono_feature_disable_appdomains='yes'
1190    AOT_BUILD_FLAGS="--runtime=mobile --aot=llvmonly,$INVARIANT_AOT_OPTIONS"
1191    AOT_RUN_FLAGS="--runtime=mobile --llvmonly"
1192    AOT_MODE="llvmonly"
1193 elif test x$with_runtime_preset = xfullaot; then
1194    DISABLE_MCS_DOCS_default=yes
1195    with_testing_aot_full_default=yes
1196    TEST_PROFILE=testing_aot_full
1198    mono_feature_disable_com='yes'
1199    mono_feature_disable_remoting='yes'
1200    mono_feature_disable_reflection_emit_save='yes'
1201    mono_feature_disable_reflection_emit='yes'
1202    mono_feature_disable_appdomains='yes'
1204    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1205    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1206    AOT_MODE="full"
1207 elif test x$with_runtime_preset = xfullaot_llvm; then
1208    DISABLE_MCS_DOCS_default=yes
1209    with_testing_aot_full_default=yes
1210    TEST_PROFILE=testing_aot_full
1212    mono_feature_disable_com='yes'
1213    mono_feature_disable_remoting='yes'
1214    mono_feature_disable_reflection_emit_save='yes'
1215    mono_feature_disable_reflection_emit='yes'
1216    mono_feature_disable_appdomains='yes'
1218    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1219    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1220    AOT_MODE="full"
1221 elif test x$with_runtime_preset = xhybridaot; then
1222    DISABLE_MCS_DOCS_default=yes
1223    with_testing_aot_hybrid_default=yes
1224    TEST_PROFILE=testing_aot_hybrid 
1226    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1227    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1228 elif test x$with_runtime_preset = xhybridaot_llvm; then
1229    DISABLE_MCS_DOCS_default=yes
1230    with_testing_aot_hybrid_default=yes
1231    TEST_PROFILE=testing_aot_hybrid
1233    AOT_BUILD_FLAGS="--runtime=mobile --llvm --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1234    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1235 elif test x$with_runtime_preset = xaot; then
1236    with_profile4_x_default=yes
1238    AOT_BUILD_FLAGS="--aot=$INVARIANT_AOT_OPTIONS"
1239    AOT_RUN_FLAGS=""
1241    DISABLE_MCS_DOCS_default=yes
1242 elif test x$with_runtime_preset = xaot_llvm; then
1243    with_profile4_x_default=yes
1245    AOT_BUILD_FLAGS="--llvm --aot=$INVARIANT_AOT_OPTIONS"
1246    AOT_RUN_FLAGS=""
1248    DISABLE_MCS_DOCS_default=yes
1249 elif test x$with_runtime_preset = xwinaot; then
1250    DISABLE_MCS_DOCS_default=yes
1251    with_winaot_default=yes
1252    TEST_PROFILE=winaot
1254    mono_feature_disable_com='yes'
1255    mono_feature_disable_remoting='yes'
1256    mono_feature_disable_reflection_emit_save='yes'
1257    mono_feature_disable_reflection_emit='yes'
1258    mono_feature_disable_appdomains='yes'
1260    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1261    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1262    AOT_MODE="llvmonly"
1263 elif test x$with_runtime_preset = xorbis; then
1264    DISABLE_MCS_DOCS_default=yes
1265    with_orbis_default=yes
1266    TEST_PROFILE=orbis
1268    mono_feature_disable_com='yes'
1269    mono_feature_disable_remoting='yes'
1270    mono_feature_disable_reflection_emit_save='yes'
1271    mono_feature_disable_reflection_emit='yes'
1272    mono_feature_disable_appdomains='yes'
1274    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1275    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1276    AOT_MODE="full"
1277 elif test x$with_runtime_preset = xunreal; then
1278    DISABLE_MCS_DOCS_default=yes
1279    with_unreal_default=yes
1280    TEST_PROFILE=unreal
1282    mono_feature_disable_com='yes'
1283    mono_feature_disable_remoting='yes'
1284    mono_feature_disable_appdomains='no'
1286    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1287    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1288 elif test x$with_runtime_preset = xwasm; then
1289    DISABLE_MCS_DOCS_default=yes
1290    with_wasm_default=yes
1291    TEST_PROFILE=wasm
1293    mono_feature_disable_com='yes'
1294    mono_feature_disable_remoting='yes'
1295    mono_feature_disable_reflection_emit_save='yes'
1296    mono_feature_disable_reflection_emit='yes'
1297    mono_feature_disable_appdomains='yes'
1299    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1300    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1301 else
1302    with_profile4_x_default=yes
1305 if test "x$AOT_BUILD_FLAGS" != "x"; then :
1306    AC_SUBST(AOT_BUILD_FLAGS)
1307    AC_SUBST(AOT_RUN_FLAGS)
1308    # For llvmonlycheck + fullaotcheck
1309    AC_SUBST(INVARIANT_AOT_OPTIONS)
1312 AC_SUBST(TEST_PROFILE)
1314 if test "x$with_profile4_x" = "xdefault"; then
1315    with_profile4_x=$with_profile4_x_default
1317 if test "x$with_monodroid" = "xdefault"; then
1318    with_monodroid=$with_monodroid_default
1320 if test "x$with_monotouch" = "xdefault"; then
1321    with_monotouch=$with_monotouch_default
1323 if test "x$with_monotouch_watch" = "xdefault"; then
1324    with_monotouch_watch=$with_monotouch_watch_default
1326 if test "x$with_monotouch_tv" = "xdefault"; then
1327    with_monotouch_tv=$with_monotouch_tv_default
1329 if test "x$with_bitcode" = "xdefault"; then
1330    with_bitcode=$with_bitcode_default
1332 if test "x$with_xammac" = "xdefault"; then
1333    with_xammac=$with_xammac_default
1335 if test "x$with_testing_aot_hybrid" = "xdefault"; then
1336    with_testing_aot_hybrid=$with_testing_aot_hybrid_default
1338 if test "x$with_testing_aot_full" = "xdefault"; then
1339    with_testing_aot_full=$with_testing_aot_full_default
1341 if test "x$with_winaot" = "xdefault"; then
1342    with_winaot=$with_winaot_default
1344 if test "x$with_orbis" = "xdefault"; then
1345    with_orbis=$with_orbis_default
1347 if test "x$with_unreal" = "xdefault"; then
1348    with_unreal=$with_unreal_default
1350 if test "x$with_wasm" = "xdefault"; then
1351    with_wasm=$with_wasm_default
1355 AM_CONDITIONAL(INSTALL_4_x, [test "x$with_profile4_x" = "xyes"])
1356 AM_CONDITIONAL(INSTALL_MONODROID, [test "x$with_monodroid" != "xno"])
1357 AM_CONDITIONAL(INSTALL_MONOTOUCH, [test "x$with_monotouch" != "xno"])
1358 AM_CONDITIONAL(INSTALL_MONOTOUCH_WATCH, [test "x$with_monotouch_watch" != "xno"])
1359 AM_CONDITIONAL(INSTALL_MONOTOUCH_TV, [test "x$with_monotouch_tv" != "xno"])
1360 AM_CONDITIONAL(BITCODE, test "x$with_bitcode" = "xyes")
1361 AM_CONDITIONAL(INSTALL_XAMMAC, [test "x$with_xammac" != "xno"])
1362 AM_CONDITIONAL(INSTALL_TESTING_AOT_HYBRID, [test "x$with_testing_aot_hybrid" != "xno"])
1363 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL, [test "x$with_testing_aot_full" != "xno"])
1364 AM_CONDITIONAL(INSTALL_WINAOT, [test "x$with_winaot" != "xno"])
1365 AM_CONDITIONAL(INSTALL_ORBIS, [test "x$with_orbis" != "xno"])
1366 AM_CONDITIONAL(INSTALL_UNREAL, [test "x$with_unreal" != "xno"])
1367 AM_CONDITIONAL(INSTALL_WASM, [test "x$with_wasm" != "xno"])
1368 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"])
1369 AM_CONDITIONAL(HYBRID_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_hybrid"] || [test "x$TEST_PROFILE" = "xunreal"])
1371 default_profile=net_4_x
1372 if test -z "$INSTALL_MONODROID_TRUE"; then :
1373    default_profile=monodroid
1375 if test -z "$INSTALL_MONOTOUCH_TRUE"; then :
1376    default_profile=monotouch
1378 if test -z "$INSTALL_XAMMAC_TRUE"; then :
1379    default_profile=xammac
1381 if test -z "$INSTALL_TESTING_AOT_HYBRID_TRUE"; then :
1382    default_profile=testing_aot_hybrid
1384 if test -z "$INSTALL_TESTING_AOT_FULL_TRUE"; then :
1385    default_profile=testing_aot_full
1387 if test -z "$INSTALL_WINAOT_TRUE"; then :
1388    default_profile=winaot
1390 if test -z "$INSTALL_ORBIS_TRUE"; then :
1391    default_profile=orbis
1393 if test -z "$INSTALL_UNREAL_TRUE"; then :
1394    default_profile=unreal
1396 if test -z "$INSTALL_WASM_TRUE"; then :
1397    default_profile=wasm
1399 if test -z "$INSTALL_4_x_TRUE"; then :
1400    default_profile=net_4_x
1402 DEFAULT_PROFILE=$default_profile
1403 AC_SUBST(DEFAULT_PROFILE)
1406 # End build profile configuration
1409 if test x$USE_NLS = xprofile_default; then
1411         AC_MSG_CHECKING([NLS used])
1413         # We make the default value for USE_NLS
1414         # "no" on OSX because it isn't available on most
1415         # default OSX installs. The most common configurations will
1416         # all disable it, so this saves us typing.
1417         if test x$host_darwin = xyes; then
1418                 USE_NLS=no;
1419         else
1420                 USE_NLS=yes;
1421         fi
1423         AC_SUBST([USE_NLS])
1424         AC_MSG_RESULT([$USE_NLS])
1427 AC_ARG_ENABLE(minimal, [  --enable-minimal=LIST      drop support for LIST subsystems.
1428      LIST is a comma-separated list from: aot, profiler, decimal, pinvoke, debug, appdomains, verifier, 
1429      reflection_emit, reflection_emit_save, large_code, logging, com, ssa, generics, attach, jit, interpreter, simd, soft_debug, perfcounters, normalization, desktop_loader, shared_perfcounters, remoting,
1430          security, lldb, mdb, sgen_marksweep_conc, sgen_split_nursery, sgen_gc_bridge, sgen_debug_helpers.],
1432         for feature in `echo "$enable_minimal" | sed -e "s/,/ /g"`; do
1433                 eval "mono_feature_disable_$feature='yes'"
1434         done
1435         DISABLED_FEATURES=$enable_minimal
1436         disabled="Disabled:      $enable_minimal"
1437 ],[])
1439 AC_DEFINE_UNQUOTED(DISABLED_FEATURES, "$DISABLED_FEATURES", [String of disabled features])
1441 if test "x$mono_feature_disable_aot" = "xyes"; then
1442         AC_DEFINE(DISABLE_AOT, 1, [Disable AOT Compiler])
1443         enable_system_aot=no
1444         AC_MSG_NOTICE([Disabled AOT compiler])
1447 if test "x$mono_feature_disable_profiler" = "xyes"; then
1448         AC_DEFINE(DISABLE_PROFILER, 1, [Disable default profiler support])
1449         AC_MSG_NOTICE([Disabled support for the profiler])
1451 AM_CONDITIONAL(DISABLE_PROFILER, test x$mono_feature_disable_profiler = xyes)
1453 if test "x$mono_feature_disable_decimal" = "xyes"; then
1454         AC_DEFINE(DISABLE_DECIMAL, 1, [Disable System.Decimal support])
1455         AC_MSG_NOTICE([Disabled support for decimal])
1458 if test "x$mono_feature_disable_pinvoke" = "xyes"; then
1459         AC_DEFINE(DISABLE_PINVOKE, 1, [Disable P/Invoke support])
1460         AC_MSG_NOTICE([Disabled support for P/Invoke])
1463 if test "x$mono_feature_disable_debug" = "xyes"; then
1464         AC_DEFINE(DISABLE_DEBUG, 1, [Disable runtime debugging support])
1465         AC_MSG_NOTICE([Disabled support for runtime debugging])
1468 if test "x$mono_feature_disable_reflection_emit" = "xyes"; then
1469         AC_DEFINE(DISABLE_REFLECTION_EMIT, 1, [Disable reflection emit support])
1470         mono_feature_disable_reflection_emit_save=yes
1471         AC_MSG_NOTICE([Disabled support for Reflection.Emit])
1474 if test "x$mono_feature_disable_reflection_emit_save" = "xyes"; then
1475         AC_DEFINE(DISABLE_REFLECTION_EMIT_SAVE, 1, [Disable assembly saving support in reflection emit])
1476         AC_MSG_NOTICE([Disabled support for Reflection.Emit.Save])
1479 if test "x$mono_feature_disable_large_code" = "xyes"; then
1480         AC_DEFINE(DISABLE_LARGE_CODE, 1, [Disable support for huge assemblies])
1481         AC_MSG_NOTICE([Disabled support for large assemblies])
1484 if test "x$mono_feature_disable_logging" = "xyes"; then
1485         AC_DEFINE(DISABLE_LOGGING, 1, [Disable support debug logging])
1486         AC_MSG_NOTICE([Disabled support for logging])
1489 if test "x$mono_feature_disable_com" = "xyes"; then
1490         AC_DEFINE(DISABLE_COM, 1, [Disable COM support])
1491         AC_MSG_NOTICE([Disabled COM support])
1494 if test "x$mono_feature_disable_ssa" = "xyes"; then
1495         AC_DEFINE(DISABLE_SSA, 1, [Disable advanced SSA JIT optimizations])
1496         AC_MSG_NOTICE([Disabled SSA JIT optimizations])
1499 if test "x$mono_feature_disable_generics" = "xyes"; then
1500         AC_DEFINE(DISABLE_GENERICS, 1, [Disable generics support])
1501         AC_MSG_NOTICE([Disabled Generics Support])
1504 if test "x$mono_feature_disable_shadowcopy" = "xyes"; then
1505         AC_DEFINE(DISABLE_SHADOW_COPY, 1, [Disable Shadow Copy for AppDomains])
1506         AC_MSG_NOTICE([Disabled Shadow copy for AppDomains])
1509 if test "x$mono_feature_disable_portability" = "xyes"; then
1510         AC_DEFINE(DISABLE_PORTABILITY, 1, [Disables the IO portability layer])
1511         AC_MSG_NOTICE([Disabled IO Portability layer])
1514 if test "x$mono_feature_disable_attach" = "xyes"; then
1515         AC_DEFINE(DISABLE_ATTACH, 1, [Disable agent attach support])
1516         AC_MSG_NOTICE([Disabled agent attach])
1519 if test "x$mono_feature_disable_verifier" = "xyes"; then
1520         AC_DEFINE(DISABLE_VERIFIER, 1, [Disables the verifier])
1521         AC_MSG_NOTICE([Disabled the metadata and IL verifiers])
1524 if test "x$mono_feature_disable_jit" = "xyes"; then
1525         AC_DEFINE(DISABLE_JIT, 1, [Disable the JIT, only full-aot mode or interpreter will be supported by the runtime.])
1526         AC_MSG_NOTICE([Disabled the JIT engine, only full AOT or interpreter will be supported])
1529 AM_CONDITIONAL(DISABLE_JIT, test x$mono_feature_disable_jit = xyes)
1531 if test "x$mono_feature_disable_interpreter" = "xyes"; then
1532         AC_DEFINE(DISABLE_INTERPRETER, 1, [Disable the interpreter.])
1533         AC_MSG_NOTICE([Disabled the interpreter])
1536 AM_CONDITIONAL(DISABLE_INTERPRETER, test x$mono_feature_disable_interpreter = xyes)
1538 if test "x$mono_feature_disable_interpreter" != "xyes" -o "x$mono_feature_disable_jit" != "xyes"; then
1539         AC_DEFINE(ENABLE_ILGEN, 1, [Some VES is available at runtime])
1542 AM_CONDITIONAL(ENABLE_ILGEN, test x$mono_feature_disable_interpreter != xyes -o x$mono_feature_disable_jit != xyes)
1544 if test "x$mono_feature_disable_simd" = "xyes"; then
1545         AC_DEFINE(DISABLE_SIMD, 1, [Disable SIMD intrinsics related optimizations.])
1546         AC_MSG_NOTICE([Disabled SIMD support])
1549 if test "x$mono_feature_disable_soft_debug" = "xyes"; then
1550         AC_DEFINE(DISABLE_DEBUGGER_AGENT, 1, [Disable Soft Debugger Agent.])
1551         AC_MSG_NOTICE([Disabled Soft Debugger.])
1554 AM_CONDITIONAL(DISABLE_DEBUGGER_AGENT, test x$mono_feature_disable_debugger_agent = xyes)
1556 if test "x$mono_feature_disable_perfcounters" = "xyes"; then
1557         AC_DEFINE(DISABLE_PERFCOUNTERS, 1, [Disable Performance Counters.])
1558         AC_MSG_NOTICE([Disabled Performance Counters.])
1560 if test "x$mono_feature_disable_normalization" = "xyes"; then
1561         AC_DEFINE(DISABLE_NORMALIZATION, 1, [Disable String normalization support.])
1562         AC_MSG_NOTICE([Disabled String normalization support.])
1565 #TODO: remove assembly_remapping feature name once everyone is using desktop_loader
1566 if test "x$mono_feature_disable_assembly_remapping" = "xyes" || test "x$mono_feature_disable_desktop_loader" = "xyes"; then
1567         AC_DEFINE(DISABLE_DESKTOP_LOADER, 1, [Disable desktop assembly loader semantics.])
1568         AC_MSG_NOTICE([Disabled desktop assembly loader semantics.])
1571 if test "x$mono_feature_disable_shared_perfcounters" = "xyes"; then
1572         AC_DEFINE(DISABLE_SHARED_PERFCOUNTERS, 1, [Disable shared perfcounters.])
1573         AC_MSG_NOTICE([Disabled Shared perfcounters.])
1576 if test "x$mono_feature_disable_appdomains" = "xyes"; then
1577         AC_DEFINE(DISABLE_APPDOMAINS, 1, [Disable support for multiple appdomains.])
1578         AC_MSG_NOTICE([Disabled support for multiple appdomains.])
1581 if test "x$mono_feature_disable_remoting" = "xyes"; then
1582         AC_DEFINE(DISABLE_REMOTING, 1, [Disable remoting support (This disables type proxies and make com non-functional)])
1583         AC_MSG_NOTICE([Disabled remoting])
1586 if test "x$mono_feature_disable_security" = "xyes"; then
1587         AC_DEFINE(DISABLE_SECURITY, 1, [Disable CAS/CoreCLR security])
1588         AC_MSG_NOTICE([Disabled CAS/CoreCLR security manager (used e.g. for Moonlight)])
1591 if test "x$mono_feature_disable_lldb" = "xyes"; then
1592         AC_DEFINE(DISABLE_LLDB, 1, [Disable support code for the LLDB plugin.])
1593         AC_MSG_NOTICE([Disabled LLDB plugin support code.])
1596 if test "x$mono_feature_disable_mdb" = "xyes"; then
1597         AC_DEFINE(DISABLE_MDB, 1, [Disable support for .mdb symbol files.])
1598         AC_MSG_NOTICE([Disabled support for .mdb symbol files.])
1601 if test "x$mono_feature_disable_sgen_marksweep_conc" = "xyes"; then
1602         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_CONC, 1, [Disable concurrent gc support in SGEN.])
1603         AC_MSG_NOTICE([Disabled concurrent gc support in SGEN.])
1607 if test "x$mono_feature_disable_sgen_split_nursery" = "xyes"; then
1608         AC_DEFINE(DISABLE_SGEN_SPLIT_NURSERY, 1, [Disable minor=split support in SGEN.])
1609         AC_MSG_NOTICE([Disabled minor=split support in SGEN.])
1612 if test "x$mono_feature_disable_sgen_gc_bridge" = "xyes"; then
1613         AC_DEFINE(DISABLE_SGEN_GC_BRIDGE, 1, [Disable gc bridge support in SGEN.])
1614         AC_MSG_NOTICE([Disabled gc bridge support in SGEN.])
1617 if test "x$mono_feature_disable_sgen_debug_helpers" = "xyes"; then
1618         AC_DEFINE(DISABLE_SGEN_DEBUG_HELPERS, 1, [Disable debug helpers in SGEN.])
1619         AC_MSG_NOTICE([Disabled debug helpers in SGEN.])
1622 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
1623 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
1625 has_extension_module=no
1626 AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
1628         for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
1629                 if test x$extension = xdefault ; then
1630                         has_extension_module=yes;
1631                 fi
1632         done
1633         if test x$enable_extension_module = xyes; then
1634                 has_extension_module=yes;
1635         fi
1636 ], [])
1638 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
1640 if test x$has_extension_module != xno ; then
1641         AC_DEFINE([ENABLE_EXTENSION_MODULE], 1, [Extension module enabled])
1642         AC_MSG_NOTICE([Enabling mono extension module.])
1645 # Deprecated
1646 AC_ARG_ENABLE(gsharedvt, [  --enable-gsharedvt Enable generic valuetype sharing (Deprecated)], enable_gsharedvt=$enableval, enable_gsharedvt=no)
1648 AC_MSG_CHECKING(for visibility __attribute__)
1649 AC_COMPILE_IFELSE([
1650         AC_LANG_SOURCE([[
1651                 void __attribute__ ((visibility ("hidden"))) doit (void) {}
1652                 int main () { doit (); return 0; }
1653         ]])
1654 ], [
1655    have_visibility_hidden=yes
1656    AC_MSG_RESULT(yes)
1657 ], [
1658    have_visibility_hidden=no
1659    AC_MSG_RESULT(no)
1663 dnl Boehm GC configuration
1666 AC_ARG_WITH(libgc,   [  --with-libgc=included,none  Controls the Boehm GC config, default=included],[libgc=$with_libgc],[libgc=included])
1668 AC_ARG_ENABLE(boehm, [  --disable-boehm            Disable the Boehm GC.], support_boehm=$enableval,support_boehm=${support_boehm:-yes})
1669 AM_CONDITIONAL(SUPPORT_BOEHM, test x$support_boehm = xyes)
1671 if test "x$support_boehm" = "xyes"; then
1673         AC_ARG_ENABLE(parallel-mark, [  --enable-parallel-mark     Enables Boehm GC Parallel Marking], enable_parallel_mark=$enableval, enable_parallel_mark=$parallel_mark)
1674         if test x$enable_parallel_mark = xyes; then
1675                 libgc_configure_args="$libgc_configure_args --enable-parallel-mark"
1676         fi
1678         gc_msg=""
1679         LIBGC_CPPFLAGS=
1680         LIBGC_LIBS=
1681         LIBGC_STATIC_LIBS=
1682         libgc_dir=
1683         case "x$libgc" in
1684                 xincluded)
1685                         if test "x$support_boehm" = "xyes"; then
1686                                 libgc_dir=libgc
1687                         fi
1689                         LIBGC_CPPFLAGS='-I$(top_srcdir)/libgc/include'
1690                         LIBGC_LIBS='$(top_builddir)/libgc/libmonogc.la'
1691                         LIBGC_STATIC_LIBS='$(top_builddir)/libgc/libmonogc-static.la'
1693                         BOEHM_DEFINES="-DHAVE_BOEHM_GC"
1695                         if test x$target_win32 = xyes; then
1696                                 BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
1697                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
1698                         fi
1700                         gc_msg="Included Boehm GC with typed GC"
1701                         if test x$enable_parallel_mark = xyes; then
1702                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
1703                                 gc_msg="$gc_msg and parallel mark"
1704                         else
1705                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC)", [GC description])
1706                         fi
1707                         ;;
1709                 xboehm|xbohem|xyes)
1710                         AC_MSG_WARN("External Boehm is no longer supported")
1711                         ;;
1713                 xsgen)
1714                         AC_MSG_WARN("Use --with-sgen instead, --with-libgc= controls Boehm configuration")
1715                         ;;
1717                 xnone)
1718                         AC_MSG_WARN("Compiling mono without GC.")
1719                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description])
1720                         AC_DEFINE(HAVE_NULL_GC,1,[No GC support.])
1721                         gc_msg="none"
1722                         ;;
1723                 *)
1724                         AC_MSG_ERROR([Invalid argument $libgc to --with-libgc.])
1725                         ;;
1726         esac
1728         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])
1729         if test "x$large_heap" = "xyes"; then
1730            CPPFLAGS="$CPPFLAGS -DLARGE_CONFIG"
1731         fi
1733         AC_SUBST(LIBGC_CPPFLAGS)
1734         AC_SUBST(LIBGC_LIBS)
1735         AC_SUBST(LIBGC_STATIC_LIBS)
1736         AC_SUBST(libgc_dir)
1737         AC_SUBST(BOEHM_DEFINES)
1740 AM_CONDITIONAL(SUPPORT_NULLGC, test "x$libgc" = "xnone")
1743 dnl End of Boehm GC Configuration
1746 dnl *************************************
1747 dnl *** Checks for zero length arrays ***
1748 dnl *************************************
1749 AC_MSG_CHECKING(whether $CC supports zero length arrays)
1750 AC_TRY_COMPILE([
1751         struct s {
1752                 int  length;
1753                 char data [0];
1754         };
1755 ], [], [
1756         AC_MSG_RESULT(yes)
1757         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 0, [Length of zero length arrays])
1758 ], [
1759         AC_MSG_RESULT(no)
1760         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
1763 dnl ***********************************
1764 dnl *** Checks for signals
1765 dnl ***********************************
1766 AC_CHECK_HEADERS(signal.h)
1767 AC_CHECK_FUNCS(sigaction)
1768 AC_CHECK_FUNCS(kill)
1769 AC_CHECK_FUNCS(signal)
1771 # signal() is declared inline in Android headers
1772 # so we need to workaround it by overriding the check.
1773 if test x$platform_android = xyes; then
1774         AC_DEFINE(HAVE_SIGNAL,1)
1777 if test x$host_win32 = xno; then
1778         dnl *************************************
1779         dnl *** Checks for time capabilities ***
1780         dnl *************************************
1782         AC_MSG_CHECKING(for CLOCK_MONOTONIC)
1783         AC_TRY_COMPILE([#include <time.h>], [
1784                 const int foo = CLOCK_MONOTONIC;
1785         ],[
1786                 AC_MSG_RESULT(yes)
1787                 AC_DEFINE(HAVE_CLOCK_MONOTONIC, 1, [CLOCK_MONOTONIC])
1788         ], [
1789                 AC_MSG_RESULT(no)
1790         ])
1792         AC_MSG_CHECKING(for CLOCK_MONOTONIC_COARSE)
1793         AC_TRY_COMPILE([#include <time.h>], [
1794                 const int foo = CLOCK_MONOTONIC_COARSE;
1795         ],[
1796                 AC_MSG_RESULT(yes)
1797                 AC_DEFINE(HAVE_CLOCK_MONOTONIC_COARSE, 1, [CLOCK_MONOTONIC_COARSE])
1798         ], [
1799                 AC_MSG_RESULT(no)
1800         ])
1802         AC_MSG_CHECKING(for CLOCK_REALTIME)
1803         AC_TRY_COMPILE([#include <time.h>], [
1804                 const int foo = CLOCK_REALTIME;
1805         ],[
1806                 AC_MSG_RESULT(yes)
1807                 AC_DEFINE(HAVE_CLOCK_REALTIME, 1, [CLOCK_REALTIME])
1808         ], [
1809                 AC_MSG_RESULT(no)
1810         ])
1812         AC_CHECK_FUNC(mach_absolute_time, [AC_DEFINE(HAVE_MACH_ABSOLUTE_TIME, 1, [mach_absolute_time])])
1813         AC_CHECK_FUNC(gethrtime, [AC_DEFINE(HAVE_GETHRTIME, 1, [gethrtime])])
1814         AC_CHECK_FUNC(read_real_time, [AC_DEFINE(HAVE_READ_REAL_TIME, 1, [read_real_time])])
1815         AC_CHECK_FUNC(mach_timebase_info, [AC_DEFINE(HAVE_MACH_TIMEBASE_INFO, 1, [mach_timebase_info])])
1816         AC_CHECK_FUNC(futimes,            [AC_DEFINE(HAVE_FUTIMES, 1, [futimes])])
1817         AC_CHECK_FUNC(futimens,           [AC_DEFINE(HAVE_FUTIMENS, 1, [futimens])])
1819         dnl hires monotonic clock support
1820         AC_SEARCH_LIBS(clock_gettime, rt)
1821         AC_CHECK_FUNCS(clock_nanosleep)
1823         dnl dynamic loader support
1824         AC_CHECK_FUNC(dlopen, DL_LIB="",
1825                 AC_CHECK_LIB(dl, dlopen, DL_LIB="-ldl", dl_support=no)
1826         )
1827         if test x$dl_support = xno; then
1828                 AC_MSG_WARN([No dynamic loading support available])
1829         else
1830                 LIBS="$LIBS $DL_LIB"
1831                 AC_DEFINE(HAVE_DL_LOADER,1,[dlopen-based dynamic loader available])
1832                 dnl from glib's configure.ac
1833                 AC_CACHE_CHECK([for preceeding underscore in symbols],
1834                         mono_cv_uscore,[
1835                         AC_TRY_RUN([#include <dlfcn.h>
1836                         int mono_underscore_test (void) { return 42; }
1837                         int main() {
1838                           void *f1 = (void*)0, *f2 = (void*)0, *handle;
1839                           handle = dlopen ((void*)0, 0);
1840                           if (handle) {
1841                             f1 = dlsym (handle, "mono_underscore_test");
1842                             f2 = dlsym (handle, "_mono_underscore_test");
1843                           } return (!f2 || f1);
1844                         }],
1845                                 [mono_cv_uscore=yes],
1846                                 [mono_cv_uscore=no],
1847                         [])
1848                 ])
1849                 if test "x$mono_cv_uscore" = "xyes"; then
1850                         MONO_DL_NEED_USCORE=1
1851                 else
1852                         MONO_DL_NEED_USCORE=0
1853                 fi
1854                 AC_SUBST(MONO_DL_NEED_USCORE)
1855                 AC_CHECK_FUNC(dlerror)
1856         fi
1858         dnl ******************************************************************
1859         dnl *** Checks for the IKVM JNI interface library                  ***
1860         dnl ******************************************************************
1861         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])
1863         ikvm_native_dir=
1864         if test x$with_ikvm_native = xyes; then
1865                 ikvm_native_dir=ikvm-native
1866                 jdk_headers_found="IKVM Native"
1867         fi
1869         AC_SUBST(ikvm_native_dir)
1871         AC_CHECK_HEADERS(execinfo.h)
1873         AC_CHECK_HEADERS(sys/auxv.h sys/resource.h)
1875         AC_CHECK_FUNCS(getgrgid_r)
1876         AC_CHECK_FUNCS(getgrnam_r)
1877         AC_CHECK_FUNCS(getresuid)
1878         AC_CHECK_FUNCS(setresuid)
1879         AC_CHECK_FUNCS(kqueue)
1880         AC_CHECK_FUNCS(backtrace_symbols)
1881         AC_CHECK_FUNCS(mkstemp)
1882         AC_CHECK_FUNCS(mmap)
1883         AC_CHECK_FUNCS(madvise)
1884         AC_CHECK_FUNCS(getrusage)
1885         AC_CHECK_FUNCS(getpriority)
1886         AC_CHECK_FUNCS(setpriority)
1887         AC_CHECK_FUNCS(dl_iterate_phdr)
1888         AC_CHECK_FUNCS(dladdr)
1889         AC_CHECK_FUNCS(sysconf)
1890         AC_CHECK_FUNCS(getrlimit)
1891         AC_CHECK_FUNCS(prctl)
1892         AC_CHECK_FUNCS(arc4random)
1894         AC_CHECK_FUNCS(sched_getaffinity)
1895         AC_CHECK_FUNCS(sched_setaffinity)
1896         AC_CHECK_FUNCS(sched_getcpu)
1898         if test x$platform_android != xyes; then
1899                 AC_CHECK_FUNCS(getpwnam_r)
1900                 AC_CHECK_FUNCS(getpwuid_r)
1901         fi
1903         AC_FUNC_STRERROR_R()
1905         dnl ****************************************************************
1906         dnl *** Check for sched_setaffinity from glibc versions before   ***
1907         dnl *** 2.3.4. The older versions of the function only take 2    ***
1908         dnl *** parameters, not 3.                                       ***
1909         dnl ***                                                          ***
1910         dnl *** Because the interface change was not made in a minor     ***
1911         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
1912         dnl *** won't always indicate the interface sched_affinity has.  ***
1913         dnl ****************************************************************
1914         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
1915         AC_TRY_COMPILE([#include <sched.h>], [
1916             int mask = 1; 
1917             sched_setaffinity(0, &mask);
1918         ], [
1919                 # Yes, we have it...
1920                 AC_MSG_RESULT(yes)
1921                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
1922         ], [
1923                 # We have the new, three-parameter version
1924                 AC_MSG_RESULT(no)
1925         ])
1926         AC_TRY_COMPILE([#include <sched.h>], [
1927              CPU_COUNT((void *) 0);
1928         ], [
1929                 AC_MSG_RESULT(yes)
1930                 AC_DEFINE(GLIBC_HAS_CPU_COUNT, 1, [GLIBC has CPU_COUNT macro in sched.h])
1931         ], [
1932                 # We have the new, three-parameter version
1933                 AC_MSG_RESULT(no)
1934         ])
1936         dnl ******************************************************************
1937         dnl *** Check for large file support                               ***
1938         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
1939         dnl ******************************************************************
1940         
1941         # Check that off_t can represent 2**63 - 1 correctly, working around
1942         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
1943         # CPPFLAGS and sets $large_offt to yes if the test succeeds
1944         large_offt=no
1945         AC_DEFUN([LARGE_FILES], [
1946                 large_CPPFLAGS=$CPPFLAGS
1947                 CPPFLAGS="$CPPFLAGS $1"
1948                 AC_TRY_COMPILE([
1949                         #include <sys/types.h>
1950                         #include <limits.h>
1951                 ], [
1952                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
1953                         #define COMPILE_TIME_ASSERT(pred) \
1954                                 switch(0){case 0:case pred:;}
1955                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
1956                 ], [
1957                         AC_MSG_RESULT(ok)
1958                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
1959                         large_CPPFLAGS="$large_CPPFLAGS $1"
1960                         large_offt=yes
1961                 ], [
1962                         AC_MSG_RESULT(no)
1963                 ])
1964                 CPPFLAGS=$large_CPPFLAGS
1965         ])
1967         AC_MSG_CHECKING(if off_t is 64 bits wide)
1968         LARGE_FILES("")
1969         if test $large_offt = no; then
1970                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
1971                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
1972         fi
1973         if test $large_offt = no; then
1974                 AC_MSG_WARN([No 64 bit file size support available])
1975         fi
1976         
1977         dnl *****************************
1978         dnl *** Checks for libsocket  ***
1979         dnl *****************************
1980         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
1982         case "$host" in
1983                 *-*-*freebsd*)
1984                         dnl *****************************
1985                         dnl *** Checks for libinotify ***
1986                         dnl *****************************
1987                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
1988         esac
1990         dnl *******************************
1991         dnl *** Checks for MSG_NOSIGNAL ***
1992         dnl *******************************
1993         AC_MSG_CHECKING(for MSG_NOSIGNAL)
1994         AC_TRY_COMPILE([#include <sys/socket.h>], [
1995                 int f = MSG_NOSIGNAL;
1996         ], [
1997                 # Yes, we have it...
1998                 AC_MSG_RESULT(yes)
1999                 AC_DEFINE(HAVE_MSG_NOSIGNAL, 1, [Have MSG_NOSIGNAL])
2000         ], [
2001                 # We'll have to use signals
2002                 AC_MSG_RESULT(no)
2003         ])
2005         dnl *****************************
2006         dnl *** Checks for IPPROTO_IP ***
2007         dnl *****************************
2008         AC_MSG_CHECKING(for IPPROTO_IP)
2009         AC_TRY_COMPILE([#include <netinet/in.h>], [
2010                 int level = IPPROTO_IP;
2011         ], [
2012                 # Yes, we have it...
2013                 AC_MSG_RESULT(yes)
2014                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
2015         ], [
2016                 # We'll have to use getprotobyname
2017                 AC_MSG_RESULT(no)
2018         ])
2020         dnl *******************************
2021         dnl *** Checks for IPPROTO_IPV6 ***
2022         dnl *******************************
2023         AC_MSG_CHECKING(for IPPROTO_IPV6)
2024         AC_TRY_COMPILE([#include <netinet/in.h>], [
2025                 int level = IPPROTO_IPV6;
2026         ], [
2027                 # Yes, we have it...
2028                 AC_MSG_RESULT(yes)
2029                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
2030         ], [
2031                 # We'll have to use getprotobyname
2032                 AC_MSG_RESULT(no)
2033         ])
2035         dnl ******************************
2036         dnl *** Checks for IPPROTO_TCP ***
2037         dnl ******************************
2038         AC_MSG_CHECKING(for IPPROTO_TCP)
2039         AC_TRY_COMPILE([#include <netinet/in.h>], [
2040                 int level = IPPROTO_TCP;
2041         ], [
2042                 # Yes, we have it...
2043                 AC_MSG_RESULT(yes)
2044                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
2045         ], [
2046                 # We'll have to use getprotobyname
2047                 AC_MSG_RESULT(no)
2048         ])
2050         dnl *****************************
2051         dnl *** Checks for SOL_IP     ***
2052         dnl *****************************
2053         AC_MSG_CHECKING(for SOL_IP)
2054         AC_TRY_COMPILE([#include <netdb.h>], [
2055                 int level = SOL_IP;
2056         ], [
2057                 # Yes, we have it...
2058                 AC_MSG_RESULT(yes)
2059                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
2060         ], [
2061                 # We'll have to use getprotobyname
2062                 AC_MSG_RESULT(no)
2063         ])
2065         dnl *****************************
2066         dnl *** Checks for SOL_IPV6     ***
2067         dnl *****************************
2068         AC_MSG_CHECKING(for SOL_IPV6)
2069         AC_TRY_COMPILE([#include <netdb.h>], [
2070                 int level = SOL_IPV6;
2071         ], [
2072                 # Yes, we have it...
2073                 AC_MSG_RESULT(yes)
2074                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
2075         ], [
2076                 # We'll have to use getprotobyname
2077                 AC_MSG_RESULT(no)
2078         ])
2080         dnl *****************************
2081         dnl *** Checks for SOL_TCP    ***
2082         dnl *****************************
2083         AC_MSG_CHECKING(for SOL_TCP)
2084         AC_TRY_COMPILE([#include <netdb.h>], [
2085                 int level = SOL_TCP;
2086         ], [
2087                 # Yes, we have it...
2088                 AC_MSG_RESULT(yes)
2089                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
2090         ], [
2091                 # We'll have to use getprotobyname
2092                 AC_MSG_RESULT(no)
2093         ])
2095         dnl *****************************
2096         dnl *** Checks for IP_PKTINFO ***
2097         dnl *****************************
2098         AC_MSG_CHECKING(for IP_PKTINFO)
2099         AC_TRY_COMPILE([#include <linux/in.h>], [
2100                 int level = IP_PKTINFO;
2101         ], [
2102                 # Yes, we have it...
2103                 AC_MSG_RESULT(yes)
2104                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
2105         ], [
2106                 AC_MSG_RESULT(no)
2107         ])
2109         dnl *****************************
2110         dnl *** Checks for IPV6_PKTINFO ***
2111         dnl *****************************
2112         AC_MSG_CHECKING(for IPV6_PKTINFO)
2113         AC_TRY_COMPILE([#include <netdb.h>], [
2114                 int level = IPV6_PKTINFO;
2115         ], [
2116                 # Yes, we have it...
2117                 AC_MSG_RESULT(yes)
2118                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
2119         ], [
2120                 AC_MSG_RESULT(no)
2121         ])
2123         dnl **********************************
2124         dnl *** Checks for IP_DONTFRAG     ***
2125         dnl **********************************
2126         AC_MSG_CHECKING(for IP_DONTFRAG)
2127         AC_TRY_COMPILE([#include <netinet/in.h>], [
2128                 int level = IP_DONTFRAG;
2129         ], [
2130                 # Yes, we have it...
2131                 AC_MSG_RESULT(yes)
2132                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
2133         ], [
2134                 AC_MSG_RESULT(no)
2135         ])
2137         dnl **********************************
2138         dnl *** Checks for IP_DONTFRAGMENT ***
2139         dnl **********************************
2140         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
2141         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
2142                 int level = IP_DONTFRAGMENT;
2143         ], [
2144                 # Yes, we have it...
2145                 AC_MSG_RESULT(yes)
2146                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
2147         ], [
2148                 AC_MSG_RESULT(no)
2149         ])
2151         dnl **********************************
2152         dnl *** Checks for IP_MTU_DISCOVER ***
2153         dnl **********************************
2154         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
2155         AC_TRY_COMPILE([#include <linux/in.h>], [
2156                 int level = IP_MTU_DISCOVER;
2157         ], [
2158                 # Yes, we have it...
2159                 AC_MSG_RESULT(yes)
2160                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
2161         ], [
2162                 AC_MSG_RESULT(no)
2163         ])
2165         dnl **********************************
2166         dnl *** Checks for  IP_PMTUDISC_DO ***
2167         dnl **********************************
2168         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
2169         AC_TRY_COMPILE([#include <linux/in.h>], [
2170                 int level = IP_PMTUDISC_DO;
2171         ], [
2172                 # Yes, we have it...
2173                 AC_MSG_RESULT(yes)
2174                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
2175         ], [
2176                 AC_MSG_RESULT(no)
2177         ])
2179         dnl *********************************
2180         dnl *** Check for struct ip_mreqn ***
2181         dnl *********************************
2182         AC_MSG_CHECKING(for struct ip_mreqn)
2183         AC_TRY_COMPILE([#include <netinet/in.h>], [
2184                 struct ip_mreqn mreq;
2185                 mreq.imr_address.s_addr = 0;
2186         ], [
2187                 # Yes, we have it...
2188                 AC_MSG_RESULT(yes)
2189                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
2190         ], [
2191                 # We'll just have to try and use struct ip_mreq
2192                 AC_MSG_RESULT(no)
2193                 AC_MSG_CHECKING(for struct ip_mreq)
2194                 AC_TRY_COMPILE([#include <netinet/in.h>], [
2195                         struct ip_mreq mreq;
2196                         mreq.imr_interface.s_addr = 0;
2197                 ], [
2198                         # Yes, we have it...
2199                         AC_MSG_RESULT(yes)
2200                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
2201                 ], [
2202                         # No multicast support
2203                         AC_MSG_RESULT(no)
2204                 ])
2205         ])
2206         
2207         dnl **********************************
2208         dnl *** Check for getaddrinfo ***
2209         dnl **********************************
2210         AC_MSG_CHECKING(for getaddrinfo)
2211                 AC_TRY_LINK([
2212                 #include <stdio.h>
2213                 #include <netdb.h>
2214         ], [
2215                 getaddrinfo(NULL,NULL,NULL,NULL);
2216         ], [
2217                 # Yes, we have it...
2218                 AC_MSG_RESULT(yes)
2219                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2220         ], [
2221                 AC_MSG_RESULT(no)
2222         ])
2224         dnl **********************************
2225         dnl *** Check for gethostbyname2_r ***
2226         dnl **********************************
2227         AC_MSG_CHECKING(for gethostbyname2_r)
2228                 AC_TRY_LINK([
2229                 #include <stdio.h>
2230                 #include <netdb.h>
2231         ], [
2233                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
2234         ], [
2235                 # Yes, we have it...
2236                 AC_MSG_RESULT(yes)
2237                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
2238         ], [
2239                 AC_MSG_RESULT(no)
2240         ])
2242         dnl **********************************
2243         dnl *** Check for gethostbyname2 ***
2244         dnl **********************************
2245         AC_MSG_CHECKING(for gethostbyname2)
2246                 AC_TRY_LINK([
2247                 #include <stdio.h>
2248                 #include <netdb.h>
2249         ], [
2250                 gethostbyname2(NULL,0);
2251         ], [
2252                 # Yes, we have it...
2253                 AC_MSG_RESULT(yes)
2254                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
2255         ], [
2256                 AC_MSG_RESULT(no)
2257         ])
2259         dnl **********************************
2260         dnl *** Check for gethostbyname ***
2261         dnl **********************************
2262         AC_MSG_CHECKING(for gethostbyname)
2263                 AC_TRY_LINK([
2264                 #include <stdio.h>
2265                 #include <netdb.h>
2266         ], [
2267                 gethostbyname(NULL);
2268         ], [
2269                 # Yes, we have it...
2270                 AC_MSG_RESULT(yes)
2271                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2272         ], [
2273                 AC_MSG_RESULT(no)
2274         ])
2276         dnl **********************************
2277         dnl *** Check for getprotobyname ***
2278         dnl **********************************
2279         AC_MSG_CHECKING(for getprotobyname)
2280                 AC_TRY_LINK([
2281                 #include <stdio.h>
2282                 #include <netdb.h>
2283         ], [
2284                 getprotobyname(NULL);
2285         ], [
2286                 # Yes, we have it...
2287                 AC_MSG_RESULT(yes)
2288                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2289         ], [
2290                 AC_MSG_RESULT(no)
2291         ])
2293         dnl **********************************
2294         dnl *** Check for getnameinfo ***
2295         dnl **********************************
2296         AC_MSG_CHECKING(for getnameinfo)
2297                 AC_TRY_LINK([
2298                 #include <stdio.h>
2299                 #include <netdb.h>
2300         ], [
2301                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2302         ], [
2303                 # Yes, we have it...
2304                 AC_MSG_RESULT(yes)
2305                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2306         ], [
2307                 AC_MSG_RESULT(no)
2308         ])
2311         dnl **********************************
2312         dnl *** Check for inet_ntop ***
2313         dnl **********************************
2314         AC_MSG_CHECKING(for inet_ntop)
2315                 AC_TRY_LINK([
2316                 #include <stdio.h>
2317                 #include <arpa/inet.h>
2318         ], [
2319                 inet_ntop (0, NULL, NULL, 0);
2320         ], [
2321                 # Yes, we have it...
2322                 AC_MSG_RESULT(yes)
2323                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2324         ], [
2325                 AC_MSG_RESULT(no)
2326         ])
2328         dnl *****************************
2329         dnl *** Checks for libnsl     ***
2330         dnl *****************************
2331         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
2333         AC_CHECK_FUNCS(inet_pton inet_aton)
2335         dnl *****************************
2336         dnl *** Checks for libxnet    ***
2337         dnl *****************************
2338         case "${host}" in
2339                 *solaris* )
2340                         AC_MSG_CHECKING(for Solaris XPG4 support)
2341                         if test -f /usr/lib/libxnet.so; then
2342                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
2343                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
2344                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
2345                                 LIBS="$LIBS -lxnet"
2346                                 AC_MSG_RESULT(yes)
2347                         else
2348                                 AC_MSG_RESULT(no)
2349                         fi
2351                         if test "$GCC" = "yes"; then
2352                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
2353                         fi
2354                 ;;
2355         esac
2357         dnl *****************************
2358         dnl *** Checks for libpthread ***
2359         dnl *****************************
2360 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
2361 # and libpthread does not exist
2363         case "${host}" in
2364                 *-*-*haiku*)
2365                         dnl Haiku has pthread in libroot (libc equiv)
2366                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS")
2367                 ;;
2368                 *-*-*freebsd*)
2369                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2370                 ;;
2371                 *-*-*openbsd*)
2372                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2373                 ;;
2374                 *)
2375                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
2376                 ;;
2377         esac
2378         AC_CHECK_HEADERS(pthread.h)
2379         AC_CHECK_HEADERS(pthread_np.h)
2380         AC_CHECK_FUNCS(pthread_mutex_timedlock)
2381         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_setname_np pthread_cond_timedwait_relative_np)
2382         AC_CHECK_FUNCS(pthread_kill)
2383         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
2384         AC_TRY_COMPILE([ #include <pthread.h>], [
2385                 pthread_mutexattr_t attr;
2386                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
2387         ], [
2388                 AC_MSG_RESULT(ok)
2389         ], [
2390                 AC_MSG_RESULT(no)
2391                 AC_ERROR(Posix system lacks support for recursive mutexes)
2392         ])
2393         AC_CHECK_FUNCS(pthread_attr_setstacksize)
2394         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
2395         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
2397         dnl **********************************
2398         dnl *** Check for mincore ***
2399         dnl **********************************
2400         AC_MSG_CHECKING(for mincore)
2401                 AC_TRY_LINK([
2402                 #include <stdio.h>
2403                 #include <sys/types.h>
2404                 #include <sys/mman.h>
2405         ], [
2406                 mincore(NULL, 0, NULL);
2407         ], [
2408                 # Yes, we have it...
2409                 AC_MSG_RESULT(yes)
2410                 AC_DEFINE(HAVE_MINCORE, 1, [Have mincore])
2411         ], [
2412                 AC_MSG_RESULT(no)
2413         ])
2415         dnl ***********************************
2416         dnl *** Checks for working __thread ***
2417         dnl ***********************************
2418         AC_MSG_CHECKING(for working __thread)
2419         if test "x$with_tls" != "x__thread"; then
2420                 AC_MSG_RESULT(disabled)
2421         elif test "x$cross_compiling" = "xyes"; then
2422                 AC_MSG_RESULT(cross compiling, assuming yes)
2423         else
2424                 AC_TRY_RUN([
2425                         #if defined(__APPLE__) && defined(__clang__)
2426                         #error "__thread does not currently work with clang on Mac OS X"
2427                         #endif
2428                         
2429                         #include <pthread.h>
2430                         __thread int i;
2431                         static int res1, res2;
2433                         void thread_main (void *arg)
2434                         {
2435                                 i = arg;
2436                                 sleep (1);
2437                                 if (arg == 1)
2438                                         res1 = (i == arg);
2439                                 else
2440                                         res2 = (i == arg);
2441                         }
2443                         int main () {
2444                                 pthread_t t1, t2;
2446                                 i = 5;
2448                                 pthread_create (&t1, NULL, thread_main, 1);
2449                                 pthread_create (&t2, NULL, thread_main, 2);
2451                                 pthread_join (t1, NULL);
2452                                 pthread_join (t2, NULL);
2454                                 return !(res1 + res2 == 2);
2455                         }
2456                 ], [
2457                                 AC_MSG_RESULT(yes)
2458                 ], [
2459                                 AC_MSG_RESULT(no)
2460                                 with_tls=pthread
2461                 ])
2462         fi
2464         dnl **************************************
2465         dnl *** Checks for working sigaltstack ***
2466         dnl **************************************
2467         AC_MSG_CHECKING(for working sigaltstack)
2468         if test "x$with_sigaltstack" != "xyes"; then
2469                 AC_MSG_RESULT(disabled)
2470         elif test "x$cross_compiling" = "xyes"; then
2471                 AC_MSG_RESULT(cross compiling, assuming yes)
2472         else
2473                 AC_TRY_RUN([
2474                         #include <stdio.h>
2475                         #include <stdlib.h>
2476                         #include <unistd.h>
2477                         #include <signal.h>
2478                         #include <pthread.h>
2479                         #include <sys/wait.h>
2480                         #if defined(__FreeBSD__) || defined(__NetBSD__)
2481                         #define SA_STACK SA_ONSTACK
2482                         #endif
2483                         static void
2484                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
2485                         {
2486                                 exit (0);
2487                         }
2489                         volatile char*__ptr = NULL;
2490                         static void *
2491                         loop (void *ignored)
2492                         {
2493                                 *__ptr = 0;
2494                                 return NULL;
2495                         }
2497                         static void
2498                         child ()
2499                         {
2500                                 struct sigaction sa;
2501                                 stack_t sas;
2502                                 pthread_t id;
2503                                 pthread_attr_t attr;
2505                                 sa.sa_sigaction = sigsegv_signal_handler;
2506                                 sigemptyset (&sa.sa_mask);
2507                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
2508                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
2509                                         perror ("sigaction");
2510                                         return;
2511                                 }
2513                                 /* x86 darwin deliver segfaults using SIGBUS */
2514                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
2515                                         perror ("sigaction");
2516                                         return;
2517                                 }
2518                                 sas.ss_sp = malloc (SIGSTKSZ);
2519                                 sas.ss_size = SIGSTKSZ;
2520                                 sas.ss_flags = 0;
2521                                 if (sigaltstack (&sas, NULL) == -1) {
2522                                         perror ("sigaltstack");
2523                                         return;
2524                                 }
2526                                 pthread_attr_init (&attr);
2527                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
2528                                         printf ("pthread_create\n");
2529                                         return;
2530                                 }
2532                                 sleep (100);
2533                         }
2535                         int
2536                         main ()
2537                         {
2538                                 pid_t son;
2539                                 int status;
2540                                 int i;
2542                                 son = fork ();
2543                                 if (son == -1) {
2544                                         return 1;
2545                                 }
2547                                 if (son == 0) {
2548                                         child ();
2549                                         return 0;
2550                                 }
2552                                 for (i = 0; i < 300; ++i) {
2553                                         waitpid (son, &status, WNOHANG);
2554                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
2555                                                 return 0;
2556                                         usleep (10000);
2557                                 }
2559                                 kill (son, SIGKILL);
2560                                 return 1;
2561                         }
2563                 ], [
2564                                 AC_MSG_RESULT(yes)
2565                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
2566                 ], [
2567                                 with_sigaltstack=no
2568                                 AC_MSG_RESULT(no)
2569                 ])
2570         fi
2572         dnl ********************************
2573         dnl *** Checks for semaphore lib ***
2574         dnl ********************************
2575         # 'Real Time' functions on Solaris
2576         # posix4 on Solaris 2.6
2577         # pthread (first!) on Linux
2578         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
2580         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
2581         AC_CHECK_FUNCS(shm_open)
2583         dnl ********************************
2584         dnl *** Checks for timezone stuff **
2585         dnl ********************************
2586         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
2587                 AC_TRY_COMPILE([
2588                         #include <time.h>
2589                         ], [
2590                         struct tm tm;
2591                         tm.tm_gmtoff = 1;
2592                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
2593         if test $ac_cv_struct_tm_gmtoff = yes; then
2594                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
2595         else
2596                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
2597                         AC_TRY_COMPILE([
2598                                 #include <time.h>
2599                         ], [
2600                                 timezone = 1;
2601                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
2602                 if test $ac_cv_var_timezone = yes; then
2603                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
2604                 else
2605                         AC_ERROR(unable to find a way to determine timezone)
2606                 fi
2607         fi
2609         dnl *********************************
2610         dnl *** Checks for math functions ***
2611         dnl *********************************
2612         AC_SEARCH_LIBS(sqrtf, m)
2613         if test "x$has_broken_apple_cpp" != "xyes"; then
2614                 AC_CHECK_FUNCS(finite, , AC_MSG_CHECKING(for finite in math.h)
2615                         AC_TRY_LINK([#include <math.h>], 
2616                         [ finite(0.0); ], 
2617                         AC_DEFINE(HAVE_FINITE, 1, [Have finite in -lm]) AC_MSG_RESULT(yes),
2618                         AC_MSG_RESULT(no)))
2619         fi
2620         AC_CHECK_FUNCS(isfinite, , AC_MSG_CHECKING(for isfinite in math.h)
2621                 AC_TRY_LINK([#include <math.h>], 
2622                 [ isfinite(0.0); ], 
2623                 AC_DEFINE(HAVE_ISFINITE, 1, [Have isfinite]) AC_MSG_RESULT(yes),
2624                 AC_MSG_RESULT(no)))
2626         dnl ****************************************************************
2627         dnl *** Checks for working poll() (macosx defines it but doesn't ***
2628         dnl *** have it in the library (duh))                            ***
2629         dnl ****************************************************************
2630         AC_CHECK_FUNCS(poll)
2632         dnl *************************
2633         dnl *** Check for signbit ***
2634         dnl *************************
2635         AC_MSG_CHECKING(for signbit)
2636         AC_TRY_LINK([#include <math.h>], [
2637                 int s = signbit(1.0);
2638         ], [
2639                 AC_MSG_RESULT(yes)
2640                 AC_DEFINE(HAVE_SIGNBIT, 1, [Have signbit])
2641         ], [
2642                 AC_MSG_RESULT(no)
2643         ]) 
2645         dnl **********************************
2646         dnl *** epoll                      ***
2647         dnl **********************************
2648         AC_CHECK_HEADERS(sys/epoll.h)
2649         haveepoll=no
2650         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
2651         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
2652                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
2653         fi
2655         havekqueue=no
2657         AC_CHECK_HEADERS(sys/event.h)
2658         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
2660         dnl **************************************
2661         dnl * Darwin has a race that prevents us from using reliably:
2662         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
2663         dnl * Since kqueue is mostly used for scaling large web servers, 
2664         dnl * and very few folks run Mono on large web servers on OSX, falling
2665         dnl * back 
2666         dnl **************************************
2667         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
2668                 if test "x$host_darwin" = "xno"; then
2669                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
2670                 fi
2671         fi
2673         dnl ******************************
2674         dnl *** Checks for SIOCGIFCONF ***
2675         dnl ******************************
2676         AC_CHECK_HEADERS(sys/ioctl.h)
2677         AC_CHECK_HEADERS(net/if.h, [], [],
2678            [
2679            #ifdef HAVE_SYS_TYPES_H
2680            # include <sys/types.h>
2681            #endif
2682            #ifdef HAVE_SYS_SOCKET_H
2683            # include <sys/socket.h>
2684            #endif
2685            ])
2686         AC_MSG_CHECKING(for ifreq)
2687         AC_TRY_COMPILE([
2688                 #include <stdio.h>
2689                 #include <sys/ioctl.h>
2690                 #include <net/if.h>
2691                 ], [
2692                 struct ifconf ifc;
2693                 struct ifreq *ifr;
2694                 void *x;
2695                 ifc.ifc_len = 0;
2696                 ifc.ifc_buf = NULL;
2697                 x = (void *) &ifr->ifr_addr;
2698                 ],[
2699                         AC_MSG_RESULT(yes)
2700                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
2701                 ], [
2702                         AC_MSG_RESULT(no)
2703                 ])
2704         dnl **********************************
2705         dnl ***     Checks for sin_len     ***
2706         dnl **********************************
2707         AC_MSG_CHECKING(for sockaddr_in.sin_len)
2708         AC_TRY_COMPILE([
2709                 #include <netinet/in.h>
2710                 ], [
2711                 struct sockaddr_in saddr;
2712                 saddr.sin_len = sizeof (saddr);
2713                 ],[
2714                         AC_MSG_RESULT(yes)
2715                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
2716                 ], [
2717                         AC_MSG_RESULT(no)
2718                 ])      
2719         dnl **********************************
2720         dnl ***    Checks for sin6_len     ***
2721         dnl **********************************
2722         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
2723         AC_TRY_COMPILE([
2724                 #include <netinet/in.h>
2725                 ], [
2726                 struct sockaddr_in6 saddr6;
2727                 saddr6.sin6_len = sizeof (saddr6);
2728                 ],[
2729                         AC_MSG_RESULT(yes)
2730                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
2731                 ], [
2732                         AC_MSG_RESULT(no)
2733                 ])
2734         dnl **********************************
2735         dnl *** Check for getifaddrs       ***
2736         dnl **********************************
2737         AC_MSG_CHECKING(for getifaddrs)
2738                 AC_TRY_LINK([
2739                 #include <stdio.h>
2740                 #include <sys/types.h>
2741                 #include <sys/socket.h>
2742                 #include <ifaddrs.h>
2743         ], [
2744                 getifaddrs(NULL);
2745         ], [
2746                 # Yes, we have it...
2747                 AC_MSG_RESULT(yes)
2748                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
2749         ], [
2750                 AC_MSG_RESULT(no)
2751         ])
2752         dnl **********************************
2753         dnl *** Check for if_nametoindex   ***
2754         dnl **********************************
2755         AC_MSG_CHECKING(for if_nametoindex)
2756                 AC_TRY_LINK([
2757                 #include <stdio.h>
2758                 #include <sys/types.h>
2759                 #include <sys/socket.h>
2760                 #include <net/if.h>
2761         ], [
2762                 if_nametoindex(NULL);
2763         ], [
2764                 # Yes, we have it...
2765                 AC_MSG_RESULT(yes)
2766                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
2767         ], [
2768                 AC_MSG_RESULT(no)
2769         ])
2770         dnl **********************************
2771         dnl *** Check for access ***
2772         dnl **********************************
2773         AC_MSG_CHECKING(for access)
2774                 AC_TRY_LINK([
2775                 #include <unistd.h>
2776         ], [
2777                 access(NULL,0);
2778         ], [
2779                 # Yes, we have it...
2780                 AC_MSG_RESULT(yes)
2781                 AC_DEFINE(HAVE_ACCESS, 1, [Have access])
2782         ], [
2783                 AC_MSG_RESULT(no)
2784         ])
2785                         
2786         dnl **********************************
2787         dnl *** Checks for proclib         ***
2788         dnl **********************************
2789         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.)])
2790         dnl **********************************
2791         dnl *** Checks for MonoPosixHelper ***
2792         dnl **********************************
2793         AC_CHECK_HEADERS(checklist.h)
2794         AC_CHECK_HEADERS(pathconf.h)
2795         AC_CHECK_HEADERS(fstab.h)
2796         AC_CHECK_HEADERS(attr/xattr.h)
2797         AC_CHECK_HEADERS(sys/extattr.h)
2798         AC_CHECK_HEADERS(sys/sendfile.h)
2799         AC_CHECK_HEADERS(sys/statvfs.h)
2800         AC_CHECK_HEADERS(sys/statfs.h)
2801         AC_CHECK_HEADERS(sys/vfstab.h)
2802         AC_CHECK_HEADERS(sys/xattr.h)
2803         AC_CHECK_HEADERS(sys/mman.h)
2804         AC_CHECK_HEADERS(sys/param.h)
2805         AC_CHECK_HEADERS(sys/mount.h, [], [],
2806                 [
2807                 #ifdef HAVE_SYS_PARAM_H
2808                 # include <sys/param.h>
2809                 #endif
2810                 ])
2811         AC_CHECK_HEADERS(sys/mount.h)
2812         AC_CHECK_FUNCS(confstr)
2813         AC_CHECK_FUNCS(seekdir telldir)
2814         AC_CHECK_FUNCS(getdomainname)
2815         AC_CHECK_FUNCS(setdomainname)
2816         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
2817         AC_CHECK_FUNCS(setgroups)
2818         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
2819         AC_CHECK_FUNCS(getfsstat)
2820         AC_CHECK_FUNCS(lutimes futimes)
2821         AC_CHECK_FUNCS(mremap)
2822         AC_CHECK_FUNCS(remap_file_pages)
2823         AC_CHECK_FUNCS(posix_fadvise)
2824         AC_CHECK_FUNCS(posix_fallocate)
2825         AC_CHECK_FUNCS(posix_madvise)
2826         AC_CHECK_FUNCS(vsnprintf)
2827         AC_CHECK_FUNCS(sendfile)
2828         AC_CHECK_FUNCS(gethostid sethostid)
2829         AC_CHECK_FUNCS(sethostname)
2830         AC_CHECK_FUNCS(statfs)
2831         AC_CHECK_FUNCS(fstatfs)
2832         AC_CHECK_FUNCS(statvfs)
2833         AC_CHECK_FUNCS(fstatvfs)
2834         AC_CHECK_FUNCS(stime)
2835         AC_CHECK_FUNCS(ttyname_r)
2836         AC_CHECK_FUNCS(psignal)
2837         AC_CHECK_FUNCS(getlogin_r)
2838         AC_CHECK_FUNCS(lockf)
2839         AC_CHECK_FUNCS(swab)
2840         AC_CHECK_FUNCS(setusershell endusershell)
2841         AC_CHECK_FUNCS(futimens utimensat)
2842         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
2843         AC_CHECK_FUNCS(readv writev preadv pwritev)
2844         AC_CHECK_FUNCS(setpgid)
2845         AC_CHECK_FUNCS(system)
2846         AC_CHECK_FUNCS(fork execv execve)
2847         AC_CHECK_FUNCS(accept4)
2848         AC_CHECK_FUNCS(localtime_r)
2849         AC_CHECK_FUNCS(mkdtemp)
2850         AC_CHECK_SIZEOF(size_t)
2851         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
2852                 [#include <sys/types.h>
2853                  #include <sys/stat.h>
2854                  #include <unistd.h>])
2855         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
2856                 [#include <sys/types.h>
2857                  #include <sys/stat.h>
2858                  #include <unistd.h>])
2859         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
2860                 [#include <sys/time.h>])
2861         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
2862                 [#include <sys/socket.h>])
2863         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
2864                 [#include <unistd.h>
2865                  #include <fcntl.h>])
2866         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
2867                 [#include <sys/uio.h>])
2868         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
2869                 [#include <sys/socket.h>])
2870         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
2871                 [#include <sys/poll.h>])
2872         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
2873                 [#include <sys/socket.h>])
2874         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
2875                 [#include <sys/socket.h>])
2876         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
2877                 [#include <netinet/in.h>])
2878         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
2879                 [#include <netinet/in.h>])
2880         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
2881                 [#include <sys/un.h>])
2882         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
2883                 [#include <sys/types.h>
2884                  #include <sys/stat.h>
2885                  #include <unistd.h>])
2886         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
2887                 [#include <time.h>])
2888         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
2889                 [#include <sys/time.h>
2890                  #include <sys/types.h>
2891                  #include <utime.h>])
2892         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
2893                 [#include <sys/time.h>])
2894         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
2895                 [#include <sys/types.h>
2896                  #include <utime.h>])
2897         AC_CHECK_MEMBERS(
2898                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
2899                 [#include <sys/types.h>
2900                  #include <dirent.h>])
2901         AC_CHECK_MEMBERS(
2902                 [struct passwd.pw_gecos],,, 
2903                 [#include <sys/types.h>
2904                  #include <pwd.h>])
2905         AC_CHECK_MEMBERS(
2906                 [struct statfs.f_flags],,, 
2907                 [#include <sys/types.h>
2908                  #include <sys/vfs.h>])
2909         AC_CHECK_MEMBERS(
2910                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
2911                 [#include <sys/types.h>
2912                  #include <sys/stat.h>
2913                  #include <unistd.h>])
2915         dnl Favour xattr through glibc, but use libattr if we have to
2916         AC_CHECK_FUNC(lsetxattr, ,
2917                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
2918         )
2919         AC_SUBST(XATTR_LIB)
2921         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
2922         AC_CHECK_MEMBERS(
2923                 [struct kinfo_proc.kp_proc],,, 
2924                 [#include <sys/types.h>
2925                  #include <sys/param.h>
2926                  #include <sys/sysctl.h>
2927                  #include <sys/proc.h>
2928                  ])
2930         dnl *********************************
2931         dnl *** Checks for Windows compilation ***
2932         dnl *********************************
2933         AC_CHECK_HEADERS(sys/time.h)
2934         AC_CHECK_HEADERS(sys/param.h)
2935         AC_CHECK_HEADERS(dirent.h)
2937         dnl ******************************************
2938         dnl *** Checks for OSX and iOS compilation ***
2939         dnl ******************************************
2940         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
2942         dnl *********************************
2943         dnl *** Check for Console 2.0 I/O ***
2944         dnl *********************************
2945         AC_CHECK_HEADERS([curses.h])
2946         AC_CHECK_HEADERS([term.h], [], [],
2947         [#if HAVE_CURSES_H
2948          #include <curses.h>
2949          #endif
2950         ])
2951         AC_CHECK_HEADERS([termios.h])
2953         dnl *********************************
2954         dnl *** Checks for random         ***
2955         dnl *********************************
2956         if test x$host_darwin = xno; then
2957                 AC_CHECK_HEADERS(sys/random.h)
2958                 AC_CHECK_FUNCS(getrandom getentropy)
2959         fi
2961         dnl *********************************
2962         dnl *** Checks for System.Native  ***
2963         dnl *********************************
2965         AC_MSG_CHECKING(for linux/in.h)
2966         AC_TRY_COMPILE([
2967                 #include <sys/socket.h>
2968                 #include <linux/in.h>
2969         ], [
2970         ],[
2971                 AC_MSG_RESULT(yes)
2972                 AC_DEFINE(HAVE_LINUX_IN_H, 1, [linux/in.h])
2973         ], [
2974                 AC_MSG_RESULT(no)
2975         ])
2977         AC_MSG_CHECKING(for struct in_pktinfo)
2978         AC_TRY_COMPILE([
2979                 #ifdef HAVE_LINUX_IN_H
2980                 #include <sys/socket.h>
2981                 #include <linux/in.h>
2982                 #else
2983                 #include <netinet/in.h>
2984                 #endif
2985         ], [
2986                 struct in_pktinfo pktinfo;
2987         ],[
2988                 AC_MSG_RESULT(yes)
2989                 AC_DEFINE(HAVE_IN_PKTINFO, 1, [struct in_pktinfo])
2990         ], [
2991                 AC_MSG_RESULT(no)
2992         ])
2994         AC_MSG_CHECKING(for struct ip_mreqn)
2995         AC_TRY_COMPILE([
2996                 #if HAVE_LINUX_IN_H
2997                 #include <sys/socket.h>
2998                 #include <linux/in.h>
2999                 #else
3000                 #include <netinet/in.h>
3001                 #endif
3002         ], [
3003                 struct ip_mreqn mreqn;
3004         ],[
3005                 AC_MSG_RESULT(yes)
3006                 AC_DEFINE(HAVE_IP_MREQN, 1, struct ip_mreqn)
3007         ], [
3008                 AC_MSG_RESULT(no)
3009         ])
3011         if test x$host_darwin = xno; then
3012                 AC_MSG_CHECKING(for struct flock64)
3013                 AC_TRY_COMPILE([
3014                         #include <fcntl.h>
3015                 ], [
3016                         struct flock64;
3017                 ],[
3018                         AC_MSG_RESULT(yes)
3019                         AC_DEFINE(HAVE_FLOCK64, 1, struct flock64)
3020                 ], [
3021                         AC_MSG_RESULT(no)
3022                 ])
3023         fi
3025         AC_CHECK_FUNC(lseek64,           [AC_DEFINE(HAVE_LSEEK64, 1, [lseek64])])
3026         AC_CHECK_FUNC(mmap64,            [AC_DEFINE(HAVE_MMAP64, 1, [mmap64])])
3027         AC_CHECK_FUNC(ftruncate64,       [AC_DEFINE(HAVE_FTRUNCATE64, 1, [ftruncate64])])
3028         AC_CHECK_FUNC(posix_fadvise64,   [AC_DEFINE(HAVE_POSIX_FADVISE64, 1, [posix_fadvise64])])
3029         AC_CHECK_FUNC(stat64,            [AC_DEFINE(HAVE_STAT64, 1, [stat64])])
3030         AC_CHECK_DECL(pipe2,             [AC_DEFINE(HAVE_PIPE2, 1, [pipe2])])
3031         AC_CHECK_FUNC(getmntinfo,        [AC_DEFINE(HAVE_GETMNTINFO, 1, [getmntinfo])], [], [[#include <unistd.h>]])
3032         AC_CHECK_FUNC(strcpy_s,          [AC_DEFINE(HAVE_STRCPY_S, 1, [strcpy_s])])
3033         AC_CHECK_FUNC(strlcpy,           [AC_DEFINE(HAVE_STRLCPY, 1, [strlcpy])])
3034         AC_CHECK_FUNC(posix_fadvise,     [AC_DEFINE(HAVE_POSIX_FADVISE, 1, [posix_fadvise])])
3035         AC_CHECK_FUNC(ioctl,             [AC_DEFINE(HAVE_IOCTL, 1, [ioctl])])
3036         AC_CHECK_FUNC(sched_getaffinity, [AC_DEFINE(HAVE_SCHED_GETAFFINITY, 1, [sched_getaffinity])])
3037         AC_CHECK_FUNC(sched_setaffinity, [AC_DEFINE(HAVE_SCHED_SETAFFINITY, 1, [sched_setaffinity])])
3038         AC_CHECK_DECL(TIOCGWINSZ,        [AC_DEFINE(HAVE_TIOCGWINSZ, 1, [TIOCGWINSZ])], [], [[#include <sys/ioctl.h>]])
3039         AC_CHECK_FUNC(tcgetattr,         [AC_DEFINE(HAVE_TCGETATTR, 1, [tcgetattr])])
3040         AC_CHECK_FUNC(tcsetattr,         [AC_DEFINE(HAVE_TCSETATTR, 1, [tcsetattr])])
3041         AC_CHECK_FUNC(arc4random,        [AC_DEFINE(HAVE_ARC4RANDOM, 1, [arc4random])])
3042         AC_CHECK_DECL(ECHO,              [AC_DEFINE(HAVE_ECHO, 1, [ECHO])], [], [[#include <termios.h>]])
3043         AC_CHECK_DECL(ICANON,            [AC_DEFINE(HAVE_ICANON, 1, [ICANON])], [], [[#include <termios.h>]])
3044         AC_CHECK_DECL(TCSANOW,           [AC_DEFINE(HAVE_TCSANOW, 1, [TCSANOW])], [], [[#include <termios.h>]])
3046         AC_CHECK_DECL(O_CLOEXEC,         [AC_DEFINE(HAVE_O_CLOEXEC, 1, [O_CLOEXEC])], [], [[#include <fcntl.h>]])
3047         AC_CHECK_DECL(F_DUPFD_CLOEXEC,   [AC_DEFINE(HAVE_F_DUPFD_CLOEXEC, 1, [F_DUPFD_CLOEXEC])], [], [[#include <fcntl.h>]])
3049         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>]])
3050         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>]])
3051         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>]])
3052         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>]])
3053         AC_CHECK_MEMBER(struct dirent.d_namlen,       [AC_DEFINE(HAVE_DIRENT_NAME_LEN, 1, [struct dirent.d_namlen])], [], [[#include <dirent.h>]])
3054         AC_CHECK_MEMBER(struct statfs.f_fstypename,   [AC_DEFINE(HAVE_STATFS_FSTYPENAME, 1, [struct statfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3055         AC_CHECK_MEMBER(struct statvfs.f_fstypename,  [AC_DEFINE(HAVE_STATVFS_FSTYPENAME, 1, [struct statvfs.f_fstypename])], [], [[#include <sys/mount.h>]])
3057         AC_MSG_CHECKING(for struct statfs)
3058         AC_TRY_COMPILE([
3059                 #if defined(HAVE_STATFS_FSTYPENAME) || defined(HAVE_STATVFS_FSTYPENAME)
3060                 #include <sys/mount.h>
3061                 #else
3062                 #include <sys/statfs.h>
3063                 #endif
3064         ], [
3065                 struct statfs;
3066         ],[
3067                 AC_MSG_RESULT(yes)
3068                 AC_DEFINE(HAVE_STATFS, 1, [struct statfs])
3069         ], [
3070                 AC_MSG_RESULT(no)
3071         ])
3073         if test "x$ac_cv_func_strerror_r_char_p" = "xyes" ; then
3074                 AC_DEFINE(HAVE_GNU_STRERROR_R, 1, [char* strerror(int errnum, char *buf, size_t buflen)])
3075         fi
3077         AC_MSG_CHECKING(for readdir_r)
3078         AC_TRY_COMPILE([
3079                 #include <dirent.h>
3080         ], [
3081                 DIR* dir;
3082                 struct dirent* entry;
3083                 struct dirent* result;
3084                 readdir_r(dir, entry, &result);
3085         ],[
3086                 AC_MSG_RESULT(yes)
3087                 AC_DEFINE(HAVE_READDIR_R, 1, [readdir_r])
3088         ], [
3089                 AC_MSG_RESULT(no)
3090         ])
3092         AC_MSG_CHECKING(for kevent with void *data)
3093         AC_TRY_COMPILE([
3094                 #include <sys/types.h>
3095                 #include <sys/event.h>
3096         ], [
3097                 struct kevent event;
3098                 void* data;
3099                 EV_SET(&event, 0, EVFILT_READ, 0, 0, 0, data);
3100         ],[
3101                 AC_MSG_RESULT(yes)
3102                 AC_DEFINE(KEVENT_HAS_VOID_UDATA, 1, [kevent with void *data])
3103         ], [
3104                 AC_MSG_RESULT(no)
3105         ])
3107         AC_CHECK_MEMBER(struct fd_set.fds_bits,   [AC_DEFINE(HAVE_FDS_BITS, 1, [struct fd_set.fds_bits])], [], [[#include <sys/select.h>]])
3108         AC_CHECK_MEMBER(struct fd_set.__fds_bits, [AC_DEFINE(HAVE_PRIVATE_FDS_BITS, 1, [struct fd_set.__fds_bits])], [], [[#include <sys/select.h>]])
3110         AC_MSG_CHECKING(for sendfile with 4 arguments)
3111         AC_TRY_COMPILE([
3112                 #include <sys/sendfile.h>
3113         ], [
3114                 int result = sendfile(0, 0, 0, 0);
3115         ],[
3116                 AC_MSG_RESULT(yes)
3117                 AC_DEFINE(HAVE_SENDFILE_4, 1, [sendfile with 4 arguments])
3118         ], [
3119                 AC_MSG_RESULT(no)
3120         ])
3122         AC_MSG_CHECKING(for sendfile with 6 arguments)
3123         AC_TRY_LINK([
3124                 #include <stdlib.h>
3125                 #include <sys/types.h>
3126                 #include <sys/socket.h>
3127                 #include <sys/uio.h>
3128         ], [
3129                 int result = sendfile(0, 0, 0, NULL, NULL, 0);
3130         ],[
3131                 AC_MSG_RESULT(yes)
3132                 AC_DEFINE(HAVE_SENDFILE_6, 1, [sendfile with 6 arguments])
3133         ], [
3134                 AC_MSG_RESULT(no)
3135         ])
3137         AC_CHECK_FUNC(fcopyfile,     [AC_DEFINE(HAVE_FCOPYFILE, 1, [fcopyfile])])
3138         AC_CHECK_FUNC(epoll_create1, [AC_DEFINE(HAVE_EPOLL, 1, [epoll_create1])])
3139         AC_CHECK_FUNC(accept4,       [AC_DEFINE(HAVE_ACCEPT4, 1, [accept4])])
3140         AC_CHECK_FUNC(kqueue,        [AC_DEFINE(HAVE_KQUEUE, 1, [kqueue])])
3142         ORIG_CFLAGS="$CFLAGS"
3143         CFLAGS="-Werror -Wsign-conversion"
3145         AC_MSG_CHECKING(for getnameinfo with signed flags)
3146         AC_TRY_COMPILE([
3147                 #include <sys/types.h>
3148                 #include <netdb.h>
3149         ], [
3150                 const struct sockaddr *addr;
3151                 socklen_t addrlen;
3152                 char *host;
3153                 socklen_t hostlen;
3154                 char *serv;
3155                 socklen_t servlen;
3156                 int flags;
3157                 int result = getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags);
3158         ],[
3159                 AC_MSG_RESULT(yes)
3160                 AC_DEFINE(HAVE_GETNAMEINFO_SIGNED_FLAGS, 1, [getnameinfo with signed flags])
3161         ], [
3162                 AC_MSG_RESULT(no)
3163         ])
3165         CFLAGS="$ORIG_CFLAGS"
3167         if test "x$host_linux" = "xyes"; then
3168                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 1, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3169         else
3170                 AC_DEFINE(HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO, 0, [HAVE_SUPPORT_FOR_DUAL_MODE_IPV4_PACKET_INFO])
3171         fi
3173         ORIG_CFLAGS="$CFLAGS"
3174         CFLAGS="-Werror -Wsign-conversion"
3176         AC_MSG_CHECKING(for bind with unsigned addrlen)
3177         AC_TRY_COMPILE([
3178                 #include <sys/socket.h>
3179         ], [
3180                 int fd;
3181                 struct sockaddr* addr;
3182                 socklen_t addrLen;
3183                 bind(fd, addr, addrLen);
3184         ],[
3185                 AC_MSG_RESULT(yes)
3186                 AC_DEFINE(BIND_ADDRLEN_UNSIGNED, 1, [bind with unsigned addrlen])
3187         ], [
3188                 AC_MSG_RESULT(no)
3189         ])
3191         AC_MSG_CHECKING(for struct ipv6_mreq with unsigned ipv6mr_interface)
3192         AC_TRY_COMPILE([
3193                 #include <netinet/in.h>
3194                 #include <netinet/tcp.h>
3195         ], [
3196                 struct ipv6_mreq opt;
3197                 unsigned int index = 0;
3198                 opt.ipv6mr_interface = index;
3199         ],[
3200                 AC_MSG_RESULT(yes)
3201                 AC_DEFINE(IPV6MR_INTERFACE_UNSIGNED, 1, [struct ipv6_mreq with unsigned ipv6mr_interface])
3202         ], [
3203                 AC_MSG_RESULT(no)
3204         ])
3206         AC_MSG_CHECKING(for inotify_rm_watch with unsigned wd)
3207         AC_TRY_COMPILE([
3208                 #include <sys/inotify.h>
3209         ], [
3210                 intptr_t fd;
3211                 uint32_t wd;
3212                 int result = inotify_rm_watch(fd, wd);
3213         ],[
3214                 AC_MSG_RESULT(yes)
3215                 AC_DEFINE(INOTIFY_RM_WATCH_WD_UNSIGNED, 1, [inotify_rm_watch with unsigned wd])
3216         ], [
3217                 AC_MSG_RESULT(no)
3218         ])
3220         CFLAGS="$ORIG_CFLAGS"
3222         AC_MSG_CHECKING(for shm_open that works well enough with mmap)
3223         if test "x$ac_cv_func_shm_open" = "xno" -o "x$ac_cv_func_shm_open_working_with_mmap" = "xno" ; then
3224                 AC_MSG_RESULT(no)
3225         else
3226                 AC_TRY_RUN([
3227                         #include <sys/mman.h>
3228                         #include <fcntl.h>
3229                         #include <unistd.h>
3231                         int main ()
3232                         {
3233                                 int fd = shm_open("/mono_configure_shm_open", O_CREAT | O_RDWR, 0777);
3234                                 if (fd == -1)
3235                                         return -1;
3237                                 shm_unlink("/mono_configure_shm_open");
3239                                 // NOTE: PROT_EXEC and MAP_PRIVATE don't work well with shm_open
3240                                 //       on at least the current version of Mac OS X
3242                                 if (mmap(NULL, 1, PROT_EXEC, MAP_PRIVATE, fd, 0) == MAP_FAILED)
3243                                         return -1;
3245                                 return 0;
3246                         }
3247                 ],[
3248                         AC_MSG_RESULT(yes)
3249                         AC_DEFINE(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP, 1, [shm_open that works well enough with mmap])
3250                 ], [
3251                         AC_MSG_RESULT(no)
3252                 ])
3253         fi
3255         AC_MSG_CHECKING(for getpriority with int who)
3256         AC_TRY_COMPILE([
3257                 #include <sys/resource.h>
3258         ], [
3259                 int which;
3260                 int who;
3261                 int result = getpriority(which, who);
3262         ],[
3263                 AC_MSG_RESULT(yes)
3264                 AC_DEFINE(PRIORITY_REQUIRES_INT_WHO, 1, [getpriority with int who])
3265         ], [
3266                 AC_MSG_RESULT(no)
3267         ])
3269         AC_MSG_CHECKING(for kevent with int parameters)
3270         AC_TRY_COMPILE([
3271                 #include <sys/types.h>
3272                 #include <sys/event.h>
3273         ], [
3274                 int kg;
3275                 const struct kevent* chagelist;
3276                 int nchanges;
3277                 struct kevent* eventlist;
3278                 int nevents;
3279                 const struct timespec* timeout;
3280                 int result = kevent(kg, chagelist, nchanges, eventlist, nevents, timeout);
3281         ],[
3282                 AC_MSG_RESULT(yes)
3283                 AC_DEFINE(KEVENT_REQUIRES_INT_PARAMS, 1, [kevent with int parameters])
3284         ], [
3285                 AC_MSG_RESULT(no)
3286         ])
3288         ORIG_CFLAGS="$CFLAGS"
3289         CFLAGS="-Werror -Wimplicit-function-declaration"
3291         AC_MSG_CHECKING(for mkstemps)
3292         AC_TRY_COMPILE([
3293                 #include <stdlib.h>
3294                 #include <unistd.h>
3295                 #include <string.h>
3296         ], [
3297                 char *template;
3298                 int suffixlen;
3299                 int result = mkstemps(template, suffixlen);
3300         ],[
3301                 AC_MSG_RESULT(yes)
3302                 AC_DEFINE(HAVE_MKSTEMPS, 1, [mkstemps])
3303                 have_mkstemps=yes
3304         ], [
3305                 AC_MSG_RESULT(no)
3306         ])
3308         CFLAGS="$ORIG_CFLAGS"
3310         if test "x$have_mkstemps" != "xyes" -a "x$ac_cv_func_mkstemp" != "xyes"; then
3311                 AC_MSG_ERROR([Cannot find mkstemps or mkstemp on this platform])
3312         fi
3314         AC_MSG_CHECKING(for tcp/var.h)
3315         AC_TRY_COMPILE([
3316                 #include <sys/types.h>
3317                 #include <sys/socketvar.h>
3318                 #include <netinet/ip.h>
3319                 #include <netinet/tcp.h>
3320                 #include <netinet/tcp_var.h>
3321         ], [
3322         ],[
3323                 AC_MSG_RESULT(yes)
3324                 AC_DEFINE(HAVE_TCP_VAR_H, 1, [tcp/var.h])
3325         ], [
3326                 AC_MSG_RESULT(no)
3327         ])
3329         AC_CHECK_HEADERS([sys/cdefs.h])
3331         AC_MSG_CHECKING(for TCPSTATE enum in netinet/tcp.h)
3332         AC_TRY_COMPILE([
3333                 #ifdef HAVE_SYS_CDEFS_H
3334                 #include <sys/cdefs.h>
3335                 #endif
3336                 #include <netinet/tcp.h>
3337         ], [
3338                 int result = TCP_ESTABLISHED;
3339         ],[
3340                 AC_MSG_RESULT(yes)
3341                 AC_DEFINE(HAVE_TCP_H_TCPSTATE_ENUM, 1, [TCPSTATE enum in netinet/tcp.h])
3342         ], [
3343                 AC_MSG_RESULT(no)
3344         ])
3346         AC_CHECK_DECL(TCPS_ESTABLISHED, [AC_DEFINE(HAVE_TCP_FSM_H, 1, [HAVE_TCP_FSM_H])], [], [[#include <netinet/tcp_fsm.h>]])
3348         AC_MSG_CHECKING(for struct rt_msghdr)
3349         AC_TRY_COMPILE([
3350                 #include <sys/types.h>
3351                 #include <net/route.h>
3352         ], [
3353                 struct rt_msghdr;
3354         ],[
3355                 AC_MSG_RESULT(yes)
3356                 AC_DEFINE(HAVE_RT_MSGHDR, 1, [struct rt_msghdr])
3357         ], [
3358                 AC_MSG_RESULT(no)
3359         ])
3361         AC_CHECK_HEADERS([sys/sysctl.h])
3362         AC_CHECK_HEADERS([linux/rtnetlink.h])
3364         AC_CHECK_FUNC(getpeereid,    [AC_DEFINE(HAVE_GETPEEREID, 1, [getpeereid])])
3365         AC_CHECK_FUNC(getdomainname, [AC_DEFINE(HAVE_GETDOMAINNAME, 1, [getdomainname])])
3366         AC_CHECK_FUNC(uname,         [AC_DEFINE(HAVE_UNAME, 1, [uname])])
3368         ORIG_CFLAGS="$CFLAGS"
3369         CFLAGS="-Werror -Weverything"
3371         AC_MSG_CHECKING(for getdomainname with size_t namelen)
3372         AC_TRY_COMPILE([
3373                 #include <unistd.h>
3374         ], [
3375                 size_t namelen = 20;
3376                 char name[20];
3377                 int result = getdomainname(name, namelen);
3378         ],[
3379                 AC_MSG_RESULT(yes)
3380                 AC_DEFINE(HAVE_GETDOMAINNAME_SIZET, 1, [getdomainname with size_t namelen])
3381         ], [
3382                 AC_MSG_RESULT(no)
3383         ])
3385         CFLAGS="$ORIG_CFLAGS"
3387         AC_CHECK_FUNC(inotify_init, [AC_DEFINE(HAVE_INOTIFY_INIT, 1, [inotify_init])])
3388         AC_CHECK_FUNC(inotify_add_watch, [AC_DEFINE(HAVE_INOTIFY_ADD_WATCH, 1, [inotify_add_watch])])
3389         AC_CHECK_FUNC(inotify_rm_watch, [AC_DEFINE(HAVE_INOTIFY_RM_WATCH, 1, [inotify_rm_watch])])
3391         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
3392                 AC_DEFINE(HAVE_INOTIFY, 1, [HAVE_INOTIFY])
3393         elif test "x$host_linux" = "xyes"; then
3394                 AC_MSG_ERROR([Cannot find inotify functions on a Linux platform.])
3395         fi
3397         AC_CHECK_HEADERS([crt_externs.h])
3399         AC_MSG_CHECKING(for _NSGetEnviron)
3400         AC_TRY_COMPILE([
3401                 #include <crt_externs.h>
3402         ], [
3403                 char **result = *(_NSGetEnviron());
3404         ],[
3405                 AC_MSG_RESULT(yes)
3406                 AC_DEFINE(HAVE_NSGETENVIRON, 1, [_NSGetEnviron])
3407         ], [
3408                 AC_MSG_RESULT(no)
3409         ])
3411         AC_CHECK_DECL(IN_EXCL_UNLINK, [AC_DEFINE(HAVE_IN_EXCL_UNLINK, 1, [IN_EXCL_UNLINK])], [], [[#include <sys/inotify.h>]])
3413 else
3414         dnl *********************************
3415         dnl *** Checks for Windows compilation ***
3416         dnl *********************************
3417         AC_CHECK_HEADERS(winternl.h)
3419         jdk_headers_found=no
3420         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
3421         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
3422         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
3423         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
3424         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
3425         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
3426         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
3428         dnl *********************************
3429         dnl *** Check for struct ip_mreqn ***
3430         dnl *********************************
3431         AC_MSG_CHECKING(for struct ip_mreqn)
3432         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3433                 struct ip_mreqn mreq;
3434                 mreq.imr_address.s_addr = 0;
3435         ], [
3436                 # Yes, we have it...
3437                 AC_MSG_RESULT(yes)
3438                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
3439         ], [
3440                 # We'll just have to try and use struct ip_mreq
3441                 AC_MSG_RESULT(no)
3442                 AC_MSG_CHECKING(for struct ip_mreq)
3443                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
3444                         struct ip_mreq mreq;
3445                         mreq.imr_interface.s_addr = 0;
3446                 ], [
3447                         # Yes, we have it...
3448                         AC_MSG_RESULT(yes)
3449                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
3450                 ], [
3451                         # No multicast support
3452                         AC_MSG_RESULT(no)
3453                 ])
3454         ])
3456         dnl **********************************
3457         dnl *** Check for getaddrinfo ***
3458         dnl **********************************
3459         AC_MSG_CHECKING(for getaddrinfo)
3460                 AC_TRY_LINK([
3461                 #include <stdio.h>
3462                 #include <winsock2.h>
3463                 #include <ws2tcpip.h>
3464         ], [
3465                 getaddrinfo(NULL,NULL,NULL,NULL);
3466         ], [
3467                 # Yes, we have it...
3468                 AC_MSG_RESULT(yes)
3469                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
3470         ], [
3471                 AC_MSG_RESULT(no)
3472         ])
3474         dnl **********************************
3475         dnl *** Check for gethostbyname ***
3476         dnl **********************************
3477         AC_MSG_CHECKING(for gethostbyname)
3478                 AC_TRY_LINK([
3479                 #include <stdio.h>
3480                 #include <winsock2.h>
3481                 #include <ws2tcpip.h>
3482         ], [
3483                 gethostbyname(NULL);
3484         ], [
3485                 # Yes, we have it...
3486                 AC_MSG_RESULT(yes)
3487                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
3488         ], [
3489                 AC_MSG_RESULT(no)
3490         ])
3492         dnl **********************************
3493         dnl *** Check for getprotobyname ***
3494         dnl **********************************
3495         AC_MSG_CHECKING(for getprotobyname)
3496                 AC_TRY_LINK([
3497                 #include <stdio.h>
3498                 #include <winsock2.h>
3499                 #include <ws2tcpip.h>
3500         ], [
3501                 getprotobyname(NULL);
3502         ], [
3503                 # Yes, we have it...
3504                 AC_MSG_RESULT(yes)
3505                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
3506         ], [
3507                 AC_MSG_RESULT(no)
3508         ])
3510         dnl **********************************
3511         dnl *** Check for getnameinfo ***
3512         dnl **********************************
3513         AC_MSG_CHECKING(for getnameinfo)
3514                 AC_TRY_LINK([
3515                 #include <stdio.h>
3516                 #include <winsock2.h>
3517                 #include <ws2tcpip.h>
3518         ], [
3519                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
3520         ], [
3521                 # Yes, we have it...
3522                 AC_MSG_RESULT(yes)
3523                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
3524         ], [
3525                 AC_MSG_RESULT(no)
3526         ])
3528         dnl **********************************
3529         dnl *** Check for inet_ntop ***
3530         dnl **********************************
3531         AC_MSG_CHECKING(for inet_ntop)
3532                 AC_TRY_LINK([
3533                 #include <stdio.h>
3534                 #include <winsock2.h>
3535                 #include <ws2tcpip.h>
3536         ], [
3537                 inet_ntop (0, NULL, NULL, 0);
3538         ], [
3539                 # Yes, we have it...
3540                 AC_MSG_RESULT(yes)
3541                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
3542         ], [
3543                 AC_MSG_RESULT(no)
3544         ])
3546         dnl **********************************
3547         dnl *** Check for inet_pton ***
3548         dnl **********************************
3549         AC_MSG_CHECKING(for inet_pton)
3550                 AC_TRY_LINK([
3551                 #include <stdio.h>
3552                 #include <winsock2.h>
3553                 #include <ws2tcpip.h>
3554         ], [
3555                 #ifndef inet_pton
3556                 (void) inet_pton;
3557                 #endif
3558                 inet_pton (0, NULL, NULL);
3559         ], [
3560                 # Yes, we have it...
3561                 AC_MSG_RESULT(yes)
3562                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
3563         ], [
3564                 AC_MSG_RESULT(no)
3565         ])
3567         AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
3568         AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
3569         AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
3570         AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
3571         AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
3572         AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
3573         AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
3576 dnl socklen_t check
3577 AC_MSG_CHECKING(for socklen_t)
3578 AC_TRY_COMPILE([
3579 #include <sys/types.h>
3580 #include <sys/socket.h>
3582   socklen_t foo;
3584 ac_cv_c_socklen_t=yes
3585         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
3586         AC_MSG_RESULT(yes)
3588         AC_MSG_RESULT(no)
3591 AC_MSG_CHECKING(for array element initializer support)
3592 AC_TRY_COMPILE([#include <sys/socket.h>], [
3593         const int array[] = {[1] = 2,};
3594 ], [
3595         # Yes, we have it...
3596         AC_MSG_RESULT(yes)
3597         AC_DEFINE(HAVE_ARRAY_ELEM_INIT,1,[Supports C99 array initialization])
3598 ], [
3599         # We'll have to use signals
3600         AC_MSG_RESULT(no)
3603 AC_CHECK_FUNCS(trunc, , AC_MSG_CHECKING(for trunc in math.h)
3604         # Simply calling trunc (0.0) is no good since gcc will optimize the call away
3605         AC_TRY_LINK([#include <math.h>], 
3606         [ static void *p = &trunc; ],
3607         [
3608                 AC_DEFINE(HAVE_TRUNC) 
3609                 AC_MSG_RESULT(yes)
3610                 ac_cv_trunc=yes
3611         ],
3612         AC_MSG_RESULT(no)))
3614 if test "x$ac_cv_truncl" != "xyes"; then
3615    AC_CHECK_LIB(sunmath, aintl, [ AC_DEFINE(HAVE_AINTL, 1, [Has the 'aintl' function]) LIBS="$LIBS -lsunmath"])
3618 AC_CHECK_FUNCS(execvp)
3620 dnl ****************************
3621 dnl *** Look for /dev/random ***
3622 dnl ****************************
3624 AC_MSG_CHECKING([if usage of random device is requested])
3625 AC_ARG_ENABLE(dev-random,
3626 [  --disable-dev-random    disable the use of the random device (enabled by default)],
3627 try_dev_random=$enableval, try_dev_random=yes)
3629 AC_MSG_RESULT($try_dev_random)
3631 case "{$build}" in
3633 dnl IBM i does not have /dev/random, use unblocking only
3635     *-*-os400*)
3636     NAME_DEV_RANDOM="/dev/urandom"
3637     ;;
3639 dnl Win32 does not have /dev/random, they have their own method...
3641     *-mingw*|*-*-cygwin*)
3642     ac_cv_have_dev_random=no
3643     ;;
3645 dnl Everywhere else, it's /dev/random
3647     *)
3648     NAME_DEV_RANDOM="/dev/random"
3649     ;;
3650 esac
3652 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
3654 dnl Now check if the device actually exists
3656 if test "x$try_dev_random" = "xyes"; then
3657     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
3658     [if test -r "$NAME_DEV_RANDOM" ; then
3659         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
3660     if test "x$ac_cv_have_dev_random" = "xyes"; then
3661         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
3662     fi
3663 else
3664     AC_MSG_CHECKING(for random device)
3665     ac_cv_have_dev_random=no
3666     AC_MSG_RESULT(has been disabled)
3669 if test "x$host_win32" = "xyes"; then
3670     AC_DEFINE(HAVE_CRYPT_RNG)
3673 if test "x$ac_cv_have_dev_random" = "xno" \
3674     && test "x$host_win32" = "xno"; then
3675     AC_MSG_WARN([[
3677 *** A system-provided entropy source was not found on this system.
3678 *** Because of this, the System.Security.Cryptography random number generator
3679 *** will throw a NotImplemented exception.
3681 *** If you are seeing this message, and you know your system DOES have an
3682 *** entropy collection in place, please report an issue on GitHub and
3683 *** provide information about the system and how to access the random device.
3685 *** Otherwise you can install either egd or prngd and set the environment
3686 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
3687 ***]])
3690 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)
3692 AC_MSG_CHECKING([if big-arrays are to be enabled])
3693 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)
3694 if test "x$enable_big_arrays" = "xyes" ; then
3695     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
3696         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
3697     else
3698         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
3699     fi
3701 AC_MSG_RESULT($enable_big_arrays)
3703 dnl **************
3704 dnl *** DTRACE ***
3705 dnl **************
3707 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
3709 if test "x$enable_dtrace" = "xyes"; then
3710    if test "x$has_dtrace" = "xno"; then
3711           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
3712    fi
3713    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
3714    if test "x$DTRACE" = "xno"; then
3715           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
3716           enable_dtrace=no
3717    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
3718           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
3719           enable_dtrace=no
3720    fi
3723 dtrace_g=no
3724 if test "x$enable_dtrace" = "xyes"; then
3725         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
3726         DTRACEFLAGS=
3727         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3728                 case "$host" in
3729                         powerpc-*-darwin*)
3730                         DTRACEFLAGS="-arch ppc64"
3731                         ;;
3732                         i*86-*-darwin*)
3733                         DTRACEFLAGS="-arch x86_64"
3734                         ;;
3735                         *)
3736                         DTRACEFLAGS=-64
3737                         ;;
3738                 esac
3739         else
3740                 case "$host" in
3741                         powerpc-*-darwin*)
3742                         DTRACEFLAGS="-arch ppc"
3743                         ;;
3744                         i*86-*-darwin*)
3745                         DTRACEFLAGS="-arch i386"
3746                         ;;
3747                         *)
3748                         DTRACEFLAGS=-32
3749                         ;;
3750                 esac
3751         fi
3752         AC_SUBST(DTRACEFLAGS)
3753         case "$host" in
3754                 *-*-solaris*)
3755                 dtrace_g=yes
3756                 ;;
3757         esac
3758         AC_CHECK_HEADERS([sys/sdt.h])
3760 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
3761 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
3763 dnl **************************
3764 dnl *** AOT cross offsets  ***
3765 dnl **************************
3767 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
3768     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
3770 dnl **************
3771 dnl ***  LLVM  ***
3772 dnl **************
3774 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
3775 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
3776 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)
3777 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
3778 AC_ARG_ENABLE(llvm-asserts,[  --enable-llvm-asserts Enable llvm asserts (option to LLVM in CMake)], enable_llvm_asserts=$enableval, enable_llvm_asserts=no)
3780 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
3782 if test "x$enable_llvm" = "xdefault"; then
3783    enable_llvm=$enable_llvm_default
3786 internal_llvm="no"
3787 if test "x$enable_llvm" = "xyes"; then
3788         if test "x$with_llvm" != "x"; then
3789                 EXTERNAL_LLVM_CONFIG=$with_llvm/bin/llvm-config
3790                 if test ! -x $EXTERNAL_LLVM_CONFIG; then
3791                         AC_MSG_ERROR([LLVM executable $EXTERNAL_LLVM_CONFIG not found.])
3792                 fi
3793         else
3794                 AC_PATH_PROG(EXTERNAL_LLVM_CONFIG, llvm-config, no)
3795                 if test "x$EXTERNAL_LLVM_CONFIG" = "xno"; then
3796                         internal_llvm=yes
3797                 else
3798                         with_llvm=`$EXTERNAL_LLVM_CONFIG --prefix`
3799                 fi
3800         fi
3801           
3802         if test "x$host_win32" != "xyes"; then
3803                 LLVM_CODEGEN_LIBS="x86codegen"
3804                 case "$target" in
3805                 arm*)
3806                         LLVM_CODEGEN_LIBS="armcodegen"
3807                         ;;
3808                 aarch64*)
3809                         LLVM_CODEGEN_LIBS="aarch64codegen"
3810                         ;;
3811                 powerpc*)
3812                         LLVM_CODEGEN_LIBS="powerpccodegen"
3813                         ;;
3814                 esac
3815                 if test "x$host" != "x$target"; then
3816                         # No need for jit libs
3817                         LLVM_CODEGEN_LIBS=
3818                 fi
3820                 AC_SUBST(LLVM_CODEGEN_LIBS)
3821                 AC_SUBST(EXTERNAL_LLVM_CONFIG)
3822         else # is win32
3823                 AC_MSG_ERROR([LLVM for Windows only supported using Visual Studio build mono runtime, see http://www.mono-project.com/docs/advanced/mono-llvm/ for more details.])
3824         fi # win32
3825         
3826         AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
3827 fi # ENABLE_LLVM
3829 # AC_DEFINE necessary for correct restore behavior on Linux
3830 AM_CONDITIONAL(INTERNAL_LLVM, [test "x$internal_llvm" != "xno"])
3831 if test "x$internal_llvm" != "xno"; then
3832    AC_DEFINE(INTERNAL_LLVM, 1, [LLVM used is being build during mono build])
3835 AM_CONDITIONAL(INTERNAL_LLVM_ASSERTS, [test "x$enable_llvm_asserts" != "xno"])
3836 if test "x$internal_llvm_asserts" != "xno"; then
3837    AC_DEFINE(INTERNAL_LLVM_ASSERTS, 1, [Build LLVM with assertions])
3840 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes])
3842 if test "x$enable_loadedllvm" = "xyes"; then
3843    AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
3845 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes])
3847 if test "x$enable_llvm" = "xyes"; then
3848    enable_llvm_runtime=yes
3850 if test "x$enable_llvm_runtime" = "xyes"; then
3851    AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
3853 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes])
3855 TARGET="unknown"
3856 ACCESS_UNALIGNED="yes"
3858 LIBC="libc.so.6"
3859 INTL="libc.so.6"
3860 SQLITE="libsqlite.so.0"
3861 SQLITE3="libsqlite3.so.0"
3862 X11="libX11.so"
3863 GDKX11="libgdk-x11-2.0.so.0"
3864 GTKX11="libgtk-x11-2.0.so.0"
3865 XINERAMA="libXinerama.so.1"
3867 sizeof_register="SIZEOF_VOID_P"
3869 jit_wanted=true
3870 boehm_supported=true
3871 BTLS_SUPPORTED=no
3872 BTLS_PLATFORM=
3874 if test "x$enable_wasm" = "xyes"; then
3875 TARGET=WASM
3876 HOST=WASM
3877 arch_target=wasm
3878 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
3879 AC_DEFINE(HOST_WASM, 1, [Host wasm])
3880 BTLS_SUPPORTED=no
3881 with_tls=pthread
3882 target_mach=no
3884 else
3886 case "$host" in
3887         mips*)
3888                 TARGET=MIPS;
3889                 arch_target=mips;
3890                 with_tls=pthread;
3891                 ACCESS_UNALIGNED="no"
3893                 AC_MSG_CHECKING(for mips n32)
3894                 AC_TRY_COMPILE([],[
3895                 #if _MIPS_SIM != _ABIN32
3896                 #error Not mips n32
3897                 #endif
3898                 ],[
3899                 AC_MSG_RESULT(yes)
3900                 sizeof_register=8
3901                 ],[
3902                 AC_MSG_RESULT(no)
3903                 ])
3904                 ;;
3905         i*86-*-*)
3906                 TARGET=X86;
3907                 arch_target=x86;
3908                 case $host_os in
3909                   solaris*)
3910                         LIBC="libc.so"
3911                         INTL="libintl.so"
3912                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3913                                 TARGET=AMD64
3914                                 arch_target=amd64
3915                         fi
3917                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
3918                         # int astruct __attribute__ ((visibility ("hidden")));
3919                         # void foo ()
3920                         # {
3921                         #       void *p = &astruct;
3922                         # }
3923                         # gcc -fPIC --shared -o libfoo.so foo.c
3924                         # yields:
3925                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
3926                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
3927                         have_visibility_hidden=no
3928                         ;;
3929                   mingw*|cygwin*)
3930                         have_visibility_hidden=no                 
3931                         ;;
3932                   haiku*)
3933                         LIBC=libroot.so
3934                         ;;
3935                   linux*)
3936                         AOT_SUPPORTED="yes"
3937                         BTLS_SUPPORTED=yes
3938                         BTLS_PLATFORM=i386
3939                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3940                         ;;
3941                   darwin*)
3942                         AOT_SUPPORTED="yes"
3943                         BTLS_SUPPORTED=yes
3944                         BTLS_PLATFORM=i386
3945                         ;;
3946                   openbsd*|freebsd*|kfreebsd-gnu*)
3947                         AOT_SUPPORTED="yes"
3948                         BTLS_SUPPORTED=yes
3949                         BTLS_PLATFORM=i386
3950                         ;;
3951                 esac
3952                 ;;
3953         x86_64-*-* | amd64-*-*)
3954                 TARGET=AMD64;
3955                 arch_target=amd64;
3956                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
3957                         AC_DEFINE(__mono_ilp32__, 1, [64 bit mode with 4 byte longs and pointers])
3958                         sizeof_register=8
3959                 fi
3960                 case $host_os in
3961                   linux*)
3962                         AOT_SUPPORTED="yes"
3963                         BTLS_SUPPORTED=yes
3964                         BTLS_PLATFORM=x86_64
3965                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3966                         ;;
3967                   darwin*)
3968                         AOT_SUPPORTED="yes"
3969                         BTLS_SUPPORTED=yes
3970                         BTLS_PLATFORM=x86_64
3971                         boehm_supported=false
3972                         ;;
3973                   openbsd*|freebsd*|kfreebsd-gnu*)
3974                         AOT_SUPPORTED="yes"
3975                         BTLS_SUPPORTED=yes
3976                         BTLS_PLATFORM=x86_64
3977                         ;;
3978                   mingw*)
3979                         ;;
3980                 esac
3981                 ;;
3982         sparc*-*-*)
3983                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
3984                    TARGET=SPARC64
3985                 else
3986                         TARGET=SPARC
3987                 fi
3988                 arch_target=sparc;
3989                 ACCESS_UNALIGNED="no"
3990                 case $host_os in
3991                   linux*) ;;
3992                   *)
3993                         LIBC="libc.so"
3994                         INTL="libintl.so"
3995                 esac
3996                 if test x"$GCC" = xyes; then
3997                         # We don't support v8 cpus
3998                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
3999                 fi
4000                 if test x"$AR" = xfalse; then
4001                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
4002                 fi
4003                 ;;
4004         *-mingw*|*-*-cygwin*)
4005                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
4006                 have_visibility_hidden=no
4007                 INTL="intl"
4008                 ;;
4009         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
4010         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
4011         powerpc-*-freebsd* | powerpc-*-aix* | powerpc-*-os400* )
4012                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
4013                         TARGET=POWERPC64;
4014                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
4015                         if ! (echo $CC | grep -q -- 'clang'); then
4016                                 CFLAGS="$CFLAGS -mminimal-toc"
4017                         fi
4018                 else
4019                         TARGET=POWERPC;
4020                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
4021                 fi
4022                 arch_target=ppc;
4023                 case $host_os in
4024                   aix*|os400*)
4025                         BTLS_SUPPORTED=yes
4026                         BTLS_PLATFORM=powerpc
4027                         dnl on AIX/PASE, shared libraries can be inside archives
4028                         dnl if they are, we specify them by lib.a(lib.so)
4029                         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX, so
4030                         LIBC="libc.a(shr_64.o)"
4031                         INTL="libintl.a(libintl.so.8)"
4032                         ;;
4033                   linux*)
4034                         BTLS_SUPPORTED=yes
4035                         BTLS_PLATFORM=powerpc
4036                         ;;
4037                 esac
4038                 ;;
4039         armv7k-*-darwin*)
4040                 TARGET=ARM;
4041                 TARGET_SYS=WATCHOS
4042                 arch_target=arm;
4043                 arm_fpu=VFP_HARD
4044                 ACCESS_UNALIGNED="no"
4045                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4046                 ;;
4048         arm*-darwin*)
4049                 TARGET=ARM;
4050                 arch_target=arm;
4051                 ACCESS_UNALIGNED="no"
4052                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4053                 ;;
4054         arm*-linux*)
4055                 TARGET=ARM;
4056                 arch_target=arm;
4057                 ACCESS_UNALIGNED="no"
4058                 AOT_SUPPORTED="yes"
4059                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4060                 BTLS_SUPPORTED=yes
4061                 BTLS_PLATFORM=arm
4062                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4063                 case "$target" in
4064                 arm*-linux*-gnueabi)
4065                         BTLS_PLATFORM=armsoft
4066                         ;;
4067                 esac
4068                 ;;
4069         arm*-netbsd*-eabi*)
4070                 TARGET=ARM;
4071                 arch_target=arm;
4072                 ACCESS_UNALIGNED="no"
4073                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4074                 ;;
4075         aarch64-*)
4076                 # https://lkml.org/lkml/2012/7/15/133
4077                 TARGET=ARM64
4078                 arch_target=arm64
4079                 boehm_supported=false
4080                 AOT_SUPPORTED="yes"
4081                 BTLS_SUPPORTED=yes
4082                 BTLS_PLATFORM=aarch64
4083                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
4084                 ;;
4085         s390x-*-linux*)
4086                 TARGET=S390X;
4087                 arch_target=s390x;
4088                 ACCESS_UNALIGNED="yes"
4089                 BTLS_SUPPORTED=yes
4090                 BTLS_PLATFORM=s390x
4091                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
4092                 ;;
4093 esac
4095 HOST=$TARGET
4097 if test "x$host" != "x$target"; then
4098    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
4099    enable_mcs_build=no
4100    enable_support_build=no
4101    BTLS_SUPPORTED=no
4102    case "$target" in
4103    arm*-darwin*)
4104                 TARGET=ARM;
4105                 arch_target=arm;
4106                 ACCESS_UNALIGNED="no"
4107                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4108                 # Can't use tls, since it depends on the runtime detection of tls offsets
4109                 # in mono-compiler.h
4110                 with_tls=pthread
4111                 case "$target" in
4112                 armv7k-*)
4113                         arm_fpu=VFP_HARD
4114                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
4115                         ;;
4116                 esac            
4117                 ;;
4118    powerpc64-ps3-linux-gnu)
4119                 TARGET=POWERPC64
4120                 arch_target=powerpc64
4121                 AC_DEFINE(TARGET_PS3, 1, [...])
4122                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4123                 # uses this define
4124                 AC_DEFINE(__mono_ppc64__, 1, [...])
4125                 AC_DEFINE(__mono_ilp32__, 1, [64 bit mode with 4 byte longs and pointers])
4126                 sizeof_register=8
4127                 target_byte_order=G_BIG_ENDIAN
4128                 ;;
4129    powerpc64-xbox360-linux-gnu)
4130                 TARGET=POWERPC64
4131                 arch_target=powerpc64
4132                 AC_DEFINE(TARGET_XBOX360, 1, [...])
4133                 # It would be better to just use TARGET_POWERPC64, but lots of code already
4134                 # uses this define
4135                 sizeof_register=8
4136                 target_byte_order=G_BIG_ENDIAN
4137                 ;;
4138    arm*-linux-*)
4139                 TARGET=ARM;
4140                 arch_target=arm;
4141                 AC_DEFINE(TARGET_ARM, 1, [...])
4142                 ACCESS_UNALIGNED="no"
4143                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4144                 # Can't use tls, since it depends on the runtime detection of tls offsets
4145                 # in mono-compiler.h
4146                 with_tls=pthread
4147                 target_mach=no
4148                 case "$target" in
4149                 armv7l-unknown-linux-gnueabi*)
4150                         # TEGRA
4151                         CPPFLAGS="$CPPFLAGS"
4152                         ;;
4153                 armv5-*-linux-androideabi*)
4154                         AC_DEFINE(TARGET_ANDROID, 1, [...])
4155                         CPPFLAGS="$CPPFLAGS"
4156                         ;;
4157                 *-linux-androideabi*)
4158                         AC_DEFINE(TARGET_ANDROID, 1, [...])
4159                         CPPFLAGS="$CPPFLAGS"
4160                         ;;
4161                 esac
4162                 ;;
4163    arm*-netbsd*-eabi*)
4164                 TARGET=ARM;
4165                 arch_target=arm;
4166                 AC_DEFINE(TARGET_ARM, 1, [...])
4167                 ACCESS_UNALIGNED="no"
4168                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
4169                 # Can't use tls, since it depends on the runtime detection of tls offsets
4170                 # in mono-compiler.h
4171                 with_tls=pthread
4172                 target_mach=no
4173                 ;;
4174    i686*-linux-*)
4175                 TARGET=X86;
4176                 arch_target=x86;
4177                 AC_DEFINE(TARGET_X86, 1, [...])
4178                 CPPFLAGS="$CPPFLAGS"
4179                 # Can't use tls, since it depends on the runtime detection of tls offsets
4180                 # in mono-compiler.h            
4181                 with_tls=pthread
4182                 target_mach=no
4184                 case "$target" in
4185                 *-linux-android*)
4186                         AC_DEFINE(TARGET_ANDROID, 1, [...])
4187                         ;;
4188                 esac
4189                 ;;
4190    x86_64*-linux-*)
4191                 TARGET=AMD64;
4192                 arch_target=amd64;
4193                 AC_DEFINE(TARGET_AMD64, 1, [...])
4194                 CPPFLAGS="$CPPFLAGS"
4195                 # Can't use tls, since it depends on the runtime detection of tls offsets
4196                 # in mono-compiler.h
4197                 with_tls=pthread
4198                 target_mach=no
4200                 case "$target" in
4201                 *-linux-android*)
4202                         AC_DEFINE(TARGET_ANDROID, 1, [...])
4203                         ;;
4204                 esac
4205                 ;;
4206    x86_64-ps4-freebsd)
4207                 TARGET=AMD64;
4208                 arch_target=amd64;
4209                 AC_DEFINE(TARGET_AMD64, 1, [...])
4210                 AC_DEFINE(TARGET_PS4, 1, [...])
4211                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
4212                 CPPFLAGS="$CPPFLAGS"
4213                 # Can't use tls, since it depends on the runtime detection of tls offsets
4214                 # in mono-compiler.h
4215                 with_tls=pthread
4216                 target_mach=no
4217                 target_win32=no
4218                 ;;
4219    aarch64*-linux-*)
4220                 TARGET=ARM64;
4221                 arch_target=arm64;
4222                 AC_DEFINE(TARGET_ARM64, 1, [...])
4223                 CPPFLAGS="$CPPFLAGS"
4224                 # Can't use tls, since it depends on the runtime detection of tls offsets
4225                 # in mono-compiler.h
4226                 with_tls=pthread
4227                 target_mach=no
4228                 case "$target" in
4229                 *-linux-android*)
4230                         AC_DEFINE(TARGET_ANDROID, 1, [...])
4231                         ;;
4232                 esac
4233                 ;;
4234         aarch64-*)
4235                 TARGET=ARM64
4236                 ;;
4237         *)
4238                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
4239         esac
4242 case "$TARGET" in
4243 X86)
4244         AC_DEFINE(TARGET_X86, 1, [...])
4245         ;;
4246 AMD64)
4247         AC_DEFINE(TARGET_AMD64, 1, [...])
4248         ;;
4249 ARM)
4250         AC_DEFINE(TARGET_ARM, 1, [...])
4251         ;;
4252 ARM64)
4253         AC_DEFINE(TARGET_ARM64, 1, [...])
4254         ;;
4255 POWERPC)
4256         AC_DEFINE(TARGET_POWERPC, 1, [...])
4257         ;;
4258 POWERPC64)
4259         AC_DEFINE(TARGET_POWERPC, 1, [...])
4260         AC_DEFINE(TARGET_POWERPC64, 1, [...])
4261         ;;
4262 S390X)
4263         AC_DEFINE(TARGET_S390X, 1, [...])
4264         ;;
4265 MIPS)
4266         AC_DEFINE(TARGET_MIPS, 1, [...])
4267         ;;
4268 SPARC)
4269         AC_DEFINE(TARGET_SPARC, 1, [...])
4270         ;;
4271 SPARC64)
4272         AC_DEFINE(TARGET_SPARC64, 1, [...])
4273         ;;
4274 esac
4276 case "$HOST" in
4277 X86)
4278         AC_DEFINE(HOST_X86, 1, [...])
4279         ;;
4280 AMD64)
4281         AC_DEFINE(HOST_AMD64, 1, [...])
4282         ;;
4283 ARM)
4284         AC_DEFINE(HOST_ARM, 1, [...])
4285         ;;
4286 ARM64)
4287         AC_DEFINE(HOST_ARM64, 1, [...])
4288         ;;
4289 POWERPC)
4290         AC_DEFINE(HOST_POWERPC, 1, [...])
4291         ;;
4292 POWERPC64)
4293         AC_DEFINE(HOST_POWERPC, 1, [...])
4294         AC_DEFINE(HOST_POWERPC64, 1, [...])
4295         ;;
4296 S390X)
4297         AC_DEFINE(HOST_S390X, 1, [...])
4298         ;;
4299 MIPS)
4300         AC_DEFINE(HOST_MIPS, 1, [...])
4301         ;;
4302 SPARC)
4303         AC_DEFINE(HOST_SPARC, 1, [...])
4304         ;;
4305 SPARC64)
4306         AC_DEFINE(HOST_SPARC64, 1, [...])
4307         ;;
4308 esac
4310 #WASM hack
4313 MONO_ARCH_GSHAREDVT_SUPPORTED=0
4314 case "$HOST" in
4315 X86 | AMD64 | ARM | ARM64)
4316         MONO_ARCH_GSHAREDVT_SUPPORTED=1 # keep in sync with mini-{x86,amd64,arm,arm64}.h
4317         ;;
4318 esac
4320 AM_CONDITIONAL(MONO_ARCH_GSHAREDVT_SUPPORTED, test $MONO_ARCH_GSHAREDVT_SUPPORTED = 1)
4322 dnl *************
4323 dnl *** VTUNE ***
4324 dnl *************
4326 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
4327 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
4329 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
4331 if test "x$enable_vtune" = "xyes"; then
4332         if test "x$with_vtune" = "x"; then
4333                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
4334         else
4335                 VTUNE_PATH=$with_vtune
4336         fi
4337         VTUNE_INCLUDE=$VTUNE_PATH/include
4338         case "$TARGET" in
4339         X86)
4340                 VTUNE_LIB=$VTUNE_PATH/lib32
4341                 ;;
4342         AMD64)
4343                 VTUNE_LIB=$VTUNE_PATH/lib64
4344                 ;;
4345         *)
4346                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
4347                 ;;
4348         esac
4349         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
4350                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
4351         fi
4352         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
4353                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
4354         fi
4356         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
4357         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
4359         AC_SUBST(VTUNE_LIBS)
4360         AC_SUBST(VTUNE_CFLAGS)
4362 dnl Use GCC atomic ops if they work on the target.
4363 if test x$GCC = "xyes"; then
4364         case $TARGET in
4365         X86 | AMD64 | ARM | ARM64 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64)
4366                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
4367                 ;;
4368         esac
4371 if test "x$target_mach" = "xyes"; then
4373    if test "x$TARGET_SYS" = "xWATCHOS"; then
4374           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
4375           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4376           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
4377           BTLS_SUPPORTED=no
4378    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64"; then
4379           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4380           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4381           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4382           BTLS_SUPPORTED=no
4383    else
4384        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
4385        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
4386        #error fail this for ios
4387        #endif
4388        ], [
4389                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
4390           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
4391           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
4392           target_osx=yes
4393        ], [
4394           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
4395           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
4396           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
4397           BTLS_SUPPORTED=no
4398                   target_ios=yes
4399        ])
4400         fi
4401    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
4404 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
4406 if test "x$sizeof_register" = "x4"; then
4407    AC_DEFINE(SIZEOF_REGISTER,4,[size of machine integer registers])
4408 elif test "x$sizeof_register" = "x8"; then
4409    AC_DEFINE(SIZEOF_REGISTER,8,[size of machine integer registers])
4410 else
4411    AC_DEFINE(SIZEOF_REGISTER,SIZEOF_VOID_P,[size of machine integer registers])
4414 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
4416 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
4417    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
4418 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
4419    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
4420 else
4421    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
4424 if test "x$have_visibility_hidden" = "xyes"; then
4425    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
4428 if test "x$have_deprecated" = "xyes"; then
4429    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
4432 dnl 
4433 dnl Simple Generational checks (sgen)
4435 SGEN_DEFINES=
4436 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
4437 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
4438 if test x$buildsgen = xyes; then
4439    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
4440    SGEN_DEFINES="-DHAVE_SGEN_GC"
4442         conc_gc_msg=""
4443    if test x$with_sgen_default_concurrent != xno; then
4444        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
4445            conc_gc_msg=" (concurrent by default)"
4446    fi
4448    if test "x$gc_msg" = "x"; then
4449       gc_msg="sgen$conc_gc_msg"
4450    else
4451       gc_msg="sgen$conc_gc_msg and $gc_msg"
4452    fi
4454 AC_SUBST(SGEN_DEFINES)
4455 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
4457 jit_status="Building and using the JIT"
4459 libsuffix=".so"
4461 case "$host" in
4462      *-*-darwin*)
4463         libsuffix=".dylib"
4464         LIBC="libc.dylib"
4465         INTL="libintl.dylib"
4466         SQLITE="libsqlite.0.dylib"
4467         SQLITE3="libsqlite3.0.dylib"
4468         X11="libX11.dylib"
4469         GDKX11="libgdk-x11-2.0.dylib"
4470         GTKX11="libgtk-x11-2.0.dylib"
4471         ;;
4472      *-*-*netbsd*)
4473         LIBC="libc.so"
4474         INTL="libintl.so"
4475         SQLITE="libsqlite.so"
4476         SQLITE3="libsqlite3.so"
4477         ;;
4478      *-*-kfreebsd*-gnu)
4479         LIBC="libc.so.0.1"
4480         INTL="libc.so.0.1"
4481         X11="libX11.so.6"
4482         ;;
4483     *-*-*freebsd*)
4484         LIBC="libc.so.7"
4485         INTL="libintl.so"
4486         SQLITE="libsqlite.so"
4487         SQLITE3="libsqlite3.so"
4488         ;;
4489     *-*-*openbsd*)
4490         LIBC="libc.so"
4491         INTL="libintl.so"
4492         SQLITE="libsqlite.so"
4493         SQLITE3="libsqlite3.so"
4494         ;;
4495     *-*-*linux*)
4496         AC_PATH_X
4497         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
4498         AC_MSG_CHECKING(for the soname of libX11.so)
4499         for i in $x_libraries $dlsearch_path; do
4500                 for r in 4 5 6; do
4501                         if test -f $i/libX11.so.$r; then
4502                                 X11=libX11.so.$r
4503                                 AC_MSG_RESULT($X11)
4504                         fi
4505                 done
4506         done
4507         
4508         if test "x$X11" = "xlibX11.so"; then
4509                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
4510                 X11=libX11.so.6
4511         fi
4512         ;;
4513 esac
4515 AC_SUBST(libsuffix)
4517 ######################################
4518 # EGLIB CHECKS
4519 ######################################
4521 GNUC_PRETTY=
4522 GNUC_UNUSED=
4523 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
4524 if test x$GCC = xyes; then
4525    GNUC_UNUSED='__attribute__((__unused__))'
4526    GNUC_NORETURN='__attribute__((__noreturn__))'
4527    case $host_cpu in
4528      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
4529    esac
4531 AC_SUBST(GNUC_PRETTY)
4532 AC_SUBST(GNUC_UNUSED)
4533 AC_SUBST(GNUC_NORETURN)
4534 AC_SUBST(BREAKPOINT)
4536 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
4538 case $host in
4539 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
4540     PATHSEP='\\'
4541     SEARCHSEP=';'
4542     OS="WIN32"
4543     PIDTYPE='void *'
4544     ;;
4546     PATHSEP='/'
4547     SEARCHSEP=':'
4548     OS="UNIX"
4549     PIDTYPE='int'
4550     ;;
4551 esac
4553 case $host in
4554         *-*-solaris*)
4555         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
4556         ;;
4557 esac
4559 case $target in
4560 arm*-darwin*|aarch64*-*)
4561     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
4562     ;;
4563 i*86-*-darwin*)
4564     ORDER=G_LITTLE_ENDIAN
4565     ;;
4566 *-*-haiku*)
4567     LDFLAGS="$LDFLAGS -ltextencoding"
4568     ;;
4569 *-*-openbsd*)
4570     CFLAGS="$CFLAGS -pthread"
4571     LDFLAGS="$LDFLAGS -pthread"
4572     ;;
4573 esac
4575 AC_SUBST(ORDER)
4576 AC_SUBST(CFLAGS)
4577 AC_SUBST(PATHSEP)
4578 AC_SUBST(SEARCHSEP)
4579 AC_SUBST(OS)
4580 AC_SUBST(PIDTYPE)
4582 # Defined for all targets/platforms using classic Windows API support.
4583 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
4584 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
4586 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf)
4587 AC_CHECK_FUNCS(getrlimit)
4588 AC_CHECK_FUNCS(fork execv execve)
4590 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
4592 if test x$with_overridable_allocators = xyes; then
4593         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
4594   AC_MSG_NOTICE([Overridable allocator support enabled])
4595 else
4596   AC_MSG_NOTICE([Overridable allocator support disabled])
4600 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
4601 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
4602 # removed once support for 10.6 is dropped.
4604 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
4606 if test x$target_osx = xyes; then
4607 AC_CHECK_FUNCS(getpwuid_r)
4608 elif test x$target_ios = xno; then
4609 AC_CHECK_FUNCS(strndup getpwuid_r)
4612 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
4614 AC_SEARCH_LIBS(sqrtf, m)
4616 # nanosleep may not be part of libc, also search it in other libraries
4617 AC_SEARCH_LIBS(nanosleep, rt)
4619 AC_SEARCH_LIBS(dlopen, dl)
4620 old_ldflags="${LDFLAGS}"
4621 # GNU specific option, this confuses IBM ld, but do offer alternatives when possible
4622 if test $lt_cv_prog_gnu_ld = yes; then
4623         LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4624 else
4625         case $host in
4626         *-*-aix*|*-*-os400*)
4627                 ;;
4628         *)
4629                 dnl Try to use export-dynamic anyways
4630                 LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4631                 ;;
4632         esac
4634 AC_TRY_LINK(, [int i;], found_export_dynamic=yes, found_export_dynamic=no)
4635 if test $found_export_dynamic = no; then
4636         LDFLAGS="${old_ldflags}"
4639 AC_CHECK_HEADERS(getopt.h sys/select.h sys/time.h sys/wait.h pwd.h iconv.h localcharset.h sys/types.h sys/resource.h)
4640 AC_CHECK_LIB([iconv], [locale_charset],[],[AC_CHECK_LIB([charset], [locale_charset],[LIBS+=" -liconv -lcharset"])])
4641 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
4642 AC_SUBST(HAVE_ALLOCA_H)
4644 # Get the exact type of size_t, not just its size.
4645 # This is so we can find an exact printf format among u, lu, llu, I64u.
4646 # To avoid warnings about slight mismatches.
4647 # C99 runtime "zu" dependency is being avoided here.
4649 # We have to compile as C++ because C is too lenient
4650 # and lets the wrong thing compile, with warnings.
4652 # Note: "zu" or ifdef <something> have the advantage
4653 # of producing installable "biarch" headers. i.e. one Mac header
4654 # for Mac/x86 and Mac/amd64.
4656 AC_LANG_PUSH(C++)
4658 # Check long before int because it is the overwhelming Unix answer,
4659 # across 32bit and 64bit systems -- fewer compiler invocations in autoconf.
4661 # long ahead of int also tends to produce biarch-compatible headers except Windows.
4663 AC_MSG_CHECKING(if size_t is unsigned long)
4664 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4665         #include <stddef.h>
4666         unsigned long *a = (size_t*)0;
4667 ])], [
4668         AC_MSG_RESULT(yes)
4669         AC_SUBST(GSIZE_FORMAT, '"%lu"')
4670 ], [
4671         AC_MSG_RESULT(no)
4672         AC_MSG_CHECKING(if size_t is unsigned int)
4673         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4674                 #include <stddef.h>
4675                 unsigned *a = (size_t*)0;
4676         ])], [
4677                 AC_MSG_RESULT(yes)
4678                 AC_SUBST(GSIZE_FORMAT, '"%u"')
4679         ], [
4680 # At this point the majority of systems have their answer,
4681 # and we descend into non-standard or new-standard territory.
4683 # Check __int64 first because I64 on some systems predates ll, enabling
4684 # new compiler/old runtime interop, and the types always have the same size.
4685                 AC_MSG_RESULT(no)
4686                 AC_MSG_CHECKING(if size_t is unsigned __int64)
4687                 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4688                         #include <stddef.h>
4689                         unsigned __int64 *a = (size_t*)0;
4690                 ])], [
4691                         AC_MSG_RESULT(yes)
4692                         AC_SUBST(GSIZE_FORMAT, '"%I64u"')
4693                 ], [
4694                         AC_MSG_RESULT(no)
4695                         AC_MSG_CHECKING(if size_t is unsigned long long)
4696                         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
4697                                 #include <stddef.h>
4698                                 unsigned long long *a = (size_t*)0;
4699                         ])], [
4700                                 AC_MSG_RESULT(yes)
4701                                 AC_SUBST(GSIZE_FORMAT, '"%llu"')
4702                         ], [
4703                                 AC_MSG_RESULT(no)
4704                                 AC_MSG_ERROR(Unable to determine size_t among unsigned long, int, __int64, long long)
4705                         ] )
4706                 ] )
4707         ] )
4708 ] )
4710 AC_LANG_POP
4712 # If size_t/ptrdiff_t is correct, use it. Otherwise C99 [u]intptr_t.
4713 # This provides for an exact match with functions that
4714 # take size_t like malloc and pthread_attr_getstacksize, avoiding warnings.
4715 # uintptr_t is not necessarily the same.
4717 # ptrdiff_t is preferred over ssize_t as it is C89 vs. new Posix.
4718 # ssize_t looks nicer but ptrdiff_t is wrapped up as gssize anyway.
4720 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_size_t; then
4721    GSIZE="size_t"
4722    GSSIZE="ptrdiff_t"
4723 else
4724    GSIZE="uintptr_t"
4725    GSSIZE="intptr_t"
4728 AC_SUBST(GSIZE)
4729 AC_SUBST(GSSIZE)
4730 AC_SUBST(GSIZE_FORMAT)
4733 # END OF EGLIB CHECKS
4736 AC_ARG_WITH([libgdiplus],
4737         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
4738         [], [with_libgdiplus=installed])
4740 # default install location
4741 libgdiplus_install_loc=libgdiplus${libsuffix}
4742 case "$host" in
4743     *-*-*linux*)
4744     libgdiplus_install_loc=libgdiplus${libsuffix}.0
4745     ;;
4746 esac
4748 case $with_libgdiplus in
4749     no)
4750     libgdiplus_loc=
4751     ;;
4753     installed)
4754     libgdiplus_loc=
4755     if test x$cross_compiling = xno; then
4756         if test x$host_darwin = xyes; then
4757             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
4758             if test -x $a; then
4759               libgdiplus_install_loc=$a
4760               libgdiplus_loc=$a
4761             fi
4762         fi
4763     fi
4764     ;;
4766     yes|sibling)
4767     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
4768     ;;
4770     /*) # absolute path, assume it is an install location
4771     libgdiplus_loc=$with_libgdiplus
4772     libgdiplus_install_loc=$with_libgdiplus
4773     ;;
4775     *)
4776     libgdiplus_loc=`pwd`/$with_libgdiplus
4777     ;;
4778 esac
4779 AC_SUBST(libgdiplus_loc)
4780 AC_SUBST(libgdiplus_install_loc)
4782 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)
4783 if test "x$icall_symbol_map" = "xyes"; then
4784    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
4787 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
4788 if test "x$icall_export" = "xyes"; then
4789    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
4792 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
4793 if test "x$icall_tables" = "xno"; then
4794    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
4797 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
4799 if test "x$with_tls" = "x__thread"; then
4800         AC_DEFINE(MONO_KEYWORD_THREAD, __thread, [Have __thread keyword])
4801         # Pass the information to libgc
4802         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
4803         AC_MSG_CHECKING(if the tls_model attribute is supported)
4804         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
4805                 ], [
4806                         AC_MSG_RESULT(yes)
4807                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
4808                 ], [
4809                         AC_MSG_RESULT(no)
4810         ])
4813 if test ${TARGET} = ARM; then
4814         dnl ******************************************
4815         dnl *** Check to see what FPU is available ***
4816         dnl ******************************************
4817         AC_MSG_CHECKING(which FPU to use)
4819         #
4820         # This is a bit tricky:
4821         #
4822         # if (__ARM_PCS_VFP) {
4823         #       /* mfloat-abi=hard == VFP with hard ABI */
4824         # } elif (!__SOFTFP__) {
4825         #       /* mfloat-abi=softfp == VFP with soft ABI */
4826         # } else {
4827         #       /* mfloat-abi=soft == no VFP */
4828         # }
4829         #
4830         # The exception is iOS (w/ GCC) where none of the above
4831         # are defined (but iOS always uses the 'softfp' ABI).
4832         #
4833         # No support for FPA.
4834         #
4836         fpu=NONE
4838         # iOS GCC always uses the 'softfp' ABI.
4839         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
4840                 fpu=VFP
4841         fi
4843         # Are we using the 'hard' ABI?
4844         if test x$fpu = xNONE; then
4845                 AC_TRY_COMPILE([], [
4846                         #ifndef __ARM_PCS_VFP
4847                         #error "Float ABI is not 'hard'"
4848                         #endif
4849                 ], [
4850                         fpu=VFP_HARD
4851                 ], [
4852                         fpu=NONE
4853                 ])
4854         fi
4856         # No 'hard' ABI. 'soft' or 'softfp'?
4857         if test x$fpu = xNONE; then
4858                 AC_TRY_COMPILE([], [
4859                         #ifdef __SOFTFP__
4860                         #error "Float ABI is not 'softfp'"
4861                         #endif
4862                 ], [
4863                         fpu=VFP
4864                 ], [
4865                         fpu=NONE
4866                 ])
4867         fi
4869         if test x$arm_fpu != x; then
4870            fpu=$arm_fpu
4871         fi
4873         AC_MSG_RESULT($fpu)
4874         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
4875         unset fpu
4877         dnl *********************************************
4878         dnl *** Check which ARM version(s) we can use ***
4879         dnl *********************************************
4880         AC_MSG_CHECKING(which ARM version to use)
4882         AC_TRY_COMPILE([], [
4883                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
4884                 #error Not on ARM v5.
4885                 #endif
4886         ], [
4887                 arm_v5=yes
4889                 arm_ver=ARMv5
4890         ], [])
4892         AC_TRY_COMPILE([], [
4893                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
4894                 #error Not on ARM v6.
4895                 #endif
4896         ], [
4897                 arm_v5=yes
4898                 arm_v6=yes
4900                 arm_ver=ARMv6
4901         ], [])
4903         AC_TRY_COMPILE([], [
4904                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
4905                 #error Not on ARM v7.
4906                 #endif
4907         ], [
4908                 arm_v5=yes
4909                 arm_v6=yes
4910                 arm_v7=yes
4912                 arm_ver=ARMv7
4913         ], [])
4915         AC_MSG_RESULT($arm_ver)
4917         if test x$arm_v5 = xyes; then
4918                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
4919                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
4920         fi
4922         if test x$arm_v6 = xyes; then
4923                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
4924                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
4925         fi
4927         if test x$arm_v7 = xyes; then
4928                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
4929                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
4930         fi
4933 if test ${TARGET} = unknown; then
4934         CPPFLAGS="$CPPFLAGS -DNO_PORT"
4935         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
4938 if test "x$platform_android" = "xyes"; then
4939         case "x${TARGET}" in
4940         xARM)
4941                 case "x$arm_ver" in
4942                 xARMv5)
4943                         BTLS_SUPPORTED=yes
4944                         BTLS_PLATFORM=android-armv5
4945                         ;;
4946                 xARMv6)
4947                         BTLS_SUPPORTED=yes
4948                         BTLS_PLATFORM=android-armv6
4949                         ;;
4950                 xARMv7)
4951                         BTLS_SUPPORTED=yes
4952                         BTLS_PLATFORM=android-armv7
4953                         ;;
4954                 *)
4955                         BTLS_SUPPORTED=no
4956                         ;;
4957                 esac
4958                 ;;
4959         xARM64)
4960                 BTLS_SUPPORTED=yes
4961                 BTLS_PLATFORM=android-v8a
4962                 ;;
4963         xX86)
4964                 BTLS_SUPPORTED=yes
4965                 BTLS_PLATFORM=android-x86
4966                 ;;
4967         xAMD64)
4968                 BTLS_SUPPORTED=yes
4969                 BTLS_PLATFORM=android-x64
4970                 ;;
4971         *)
4972                 BTLS_SUPPORTED=no
4973                 ;;
4974         esac
4977 if test ${ACCESS_UNALIGNED} = no; then
4978         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
4981 if test x$host_darwin = xyes; then
4982         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
4983         AS_IF(
4984                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
4985                 [AC_MSG_RESULT([no])],
4986                 [
4987                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
4988                         AR_FLAGS="Scru"
4989                         RANLIB="$RANLIB -no_warning_for_no_symbols"
4990                         AC_MSG_RESULT([yes])
4991                 ]
4992         )
4995 case "x$libgc" in
4996         xincluded)
4997                 # Pass CPPFLAGS to libgc configure
4998                 # We should use a separate variable for this to avoid passing useless and
4999                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
5000                 # This should be executed late so we pick up the final version of CPPFLAGS
5001                 # The problem with this approach, is that during a reconfigure, the main
5002                 # configure scripts gets invoked with these arguments, so we use separate
5003                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
5004                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
5005                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
5006                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
5007                 fi
5008                 # Don't pass -finstrument-for-thread-suspension in, 
5009                 # if these are instrumented it will be very bad news 
5010                 # (infinite recursion, undefined parking behavior, etc)
5011                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
5012                 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\""
5013                 if test "x$support_boehm" = "xyes"; then
5014                         AC_CONFIG_SUBDIRS(libgc)
5015                 fi
5016                 ;;
5017 esac
5019 MALLOC_MEMPOOLS=no
5020 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
5021         if test x$with_malloc_mempools = xyes; then
5022                 MALLOC_MEMPOOLS=yes
5023                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
5024         fi
5028 DISABLE_MCS_DOCS=default
5029 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
5030         if test x$with_mcs_docs != xyes; then
5031                 DISABLE_MCS_DOCS=yes
5032         fi
5034 if test -n "$INSTALL_4_x_TRUE"; then :
5035         DISABLE_MCS_DOCS=yes
5037 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
5038    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
5041 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)],[
5042         if test x$with_lazy_gc_thread_creation != xno ; then
5043                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
5044         fi
5045 ], [with_lazy_gc_thread_creation=no])
5047 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])
5048 AC_ARG_ENABLE(cooperative_suspend, [  --enable-cooperative-suspend      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [], [enable_cooperative_suspend=default])
5050 if test x$enable_cooperative_suspend = xdefault -a x$with_cooperative_gc != xdefault; then
5051         enable_cooperative_suspend=$with_cooperative_gc
5054 if test x$enable_cooperative_suspend = xdefault; then
5055         enable_cooperative_suspend=$enable_cooperative_suspend_default
5058 if test x$enable_cooperative_suspend != xno; then
5059         AC_DEFINE(ENABLE_COOP_SUSPEND,1,[Enable cooperative stop-the-world garbage collection.])
5062 AM_CONDITIONAL([ENABLE_COOP_SUSPEND], [test x$enable_cooperative_suspend != xno])
5064 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])
5066 if test x$enable_hybrid_suspend = xdefault; then
5067    enable_hybrid_suspend=$enable_hybrid_suspend_default
5070 if test x$enable_hybrid_suspend != xno -a x$enable_cooperative_suspend != xno ; then
5071         AC_MSG_ERROR([Hybrid suspend and Cooperative suspend cannot be both enabled.])
5074 if test x$enable_hybrid_suspend != xno ; then
5075         AC_DEFINE(ENABLE_HYBRID_SUSPEND,1,[Enable hybrid suspend for GC stop-the-world])
5078 AM_CONDITIONAL([ENABLE_HYBRID_SUSPEND], [test x$enable_hybrid_suspend != xno])
5080 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],[
5082         if test x$enable_checked_build != x ; then
5083                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
5084         fi
5085         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
5086                 eval "mono_checked_build_test_enable_$feature='yes'"
5087         done
5089         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
5090                 eval "mono_checked_build_test_enable_gc='yes'"
5091                 eval "mono_checked_build_test_enable_metadata='yes'"
5092                 eval "mono_checked_build_test_enable_thread='yes'"
5093                 eval "mono_checked_build_test_enable_private_types='yes'"
5094         fi
5096         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
5097                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
5098         fi
5100         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
5101                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
5102         fi
5104         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
5105                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
5106         fi
5108         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
5109                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
5110         fi
5111 ], [])
5113 AC_CHECK_HEADER([malloc.h], 
5114                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
5115                         [Define to 1 if you have /usr/include/malloc.h.])],,)
5117 if test x"$GCC" = xyes; then
5118         # Implicit function declarations are not 64 bit safe
5119         # Do this late, since this causes lots of configure tests to fail
5120         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
5121         # jay has a lot of implicit declarations
5122         JAY_CFLAGS="-Wno-implicit-function-declaration"
5125 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
5126 # instead of libmono-static.a
5127 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
5128    LIBMONO_LA=libmini-static.la
5129 else
5130    if test x$buildsgen = xyes; then
5131       LIBMONO_LA=libmonosgen-$API_VER.la
5132    else
5133       LIBMONO_LA=libmonoboehm-$API_VER.la
5134    fi
5136 AC_SUBST(LIBMONO_LA)
5138 dnl **************
5139 dnl ***  Btls  ***
5140 dnl **************
5142 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
5143 AC_ARG_ENABLE(btls-lib, [  --disable-btls-lib             Disable building the BTLS native library], enable_btls_lib=$enableval, enable_btls_lib=$BTLS_SUPPORTED)
5144 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
5146 if test "x$enable_btls" = "xno"; then
5147    enable_btls_lib=no
5150 AM_CONDITIONAL(BTLS, test x$enable_btls_lib = xyes)
5152 btls_android=no
5153 if test "x$enable_btls" = "xyes"; then
5154         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
5155         if test "x$CMAKE" = "xno"; then
5156                 AC_MSG_ERROR("cmake not found")
5157         fi
5159         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
5160         AC_SUBST(BTLS_ROOT)
5162         btls_arch=
5163         btls_cflags=
5164         BTLS_CMAKE_ARGS=
5166         case "$BTLS_PLATFORM" in
5167         i386)
5168                 btls_arch=i386
5169                 btls_cflags="-m32"
5170                 case $host_os in
5171                         darwin*)
5172                                 btls_cflags="$btls_cflags -arch i386"
5173                 esac
5174                 ;;
5175         x86_64)
5176                 btls_arch=x86_64
5177                 ;;
5178         arm)
5179                 btls_arch=arm
5180                 btls_cflags="-DOPENSSL_NO_ASM=1"
5181                 ;;
5182         armsoft)
5183                 btls_arch=arm
5184                 btls_cflags="-DOPENSSL_NO_ASM=1"
5185                 ;;
5186         aarch64)
5187                 btls_arch=aarch64
5188                 btls_cflags="-march=armv8-a+crypto"
5189                 ;;
5190         s390x)
5191                 btls_arch=s390x
5192                 ;;
5193         powerpc)
5194                 btls_arch=powerpc
5195                 case $host_os in
5196                         aix*|os400*)
5197                                 btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
5198                                 BTLS_CMAKE_ARGS="-DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
5199                 esac
5200                 ;;
5201         android-armv5)
5202                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
5203                 ;;
5204         android-armv6)
5205                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
5206                 ;;
5207         android-armv7)
5208                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=14"
5209                 ;;
5210         android-v8a)
5211                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=21"
5212                 ;;
5213         android-x86)
5214                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=14"
5215                 ;;
5216         android-x64)
5217                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=21"
5218                 ;;
5219         *)
5220                 AC_MSG_ERROR(Invalid BTLS platform)
5221         esac
5223         if test "x$platform_android" = "xyes"; then
5224                 btls_android=yes
5225                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
5226                 if test "x$with_btls_android_ndk" != "x"; then
5227                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
5228                 else
5229                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
5230                 fi
5231         fi
5233         if test "x$btls_arch" != "x"; then
5234                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
5235         fi
5237         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
5238         AC_SUBST(BTLS_ARCH)
5239         AC_SUBST(BTLS_CFLAGS)
5240         AC_SUBST(BTLS_PLATFORM)
5241         AC_SUBST(BTLS_CMAKE_ARGS)
5243         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
5244 else
5245         enable_btls=no
5248 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
5250 if test x$DISABLE_MCS_DOCS = xyes; then
5251    docs_dir=""
5252 else
5253    docs_dir=docs
5255 AC_SUBST(docs_dir)
5257 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
5258 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
5259 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
5261 libmono_ldflags="$libmono_ldflags $LIBS"
5263 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
5264 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
5265 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
5266 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
5267 AM_CONDITIONAL(X86, test x$TARGET = xX86)
5268 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
5269 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
5270 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
5271 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
5272 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
5273 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64)
5274 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
5275 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
5276 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
5277 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
5278 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
5279 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
5280 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
5282 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
5284 AC_SUBST(LIBC)
5285 AC_SUBST(INTL)
5286 AC_SUBST(SQLITE)
5287 AC_SUBST(SQLITE3)
5288 AC_SUBST(X11)
5289 AC_SUBST(GDKX11)
5290 AC_SUBST(GTKX11)
5291 AC_SUBST(XINERAMA)
5292 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
5293 AC_SUBST(arch_target)
5294 AC_SUBST(CFLAGS)
5295 AC_SUBST(CPPFLAGS)
5296 AC_SUBST(LDFLAGS)
5298 #This must always be defined when building the runtime
5299 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
5301 mono_build_root=`pwd`
5302 AC_SUBST(mono_build_root)
5304 mono_runtime=mono/mini/mono
5305 AC_SUBST(mono_runtime)
5307 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/Microsoft.Net.Compilers.2.8.2/tools/csc.exe
5309 if test $csc_compiler = mcs; then
5310   CSC=$mcs_topdir/class/lib/build/mcs.exe
5311 else
5312   CSC=$CSC_LOCATION
5315 AM_CONDITIONAL([CSC_IS_ROSLYN], [test x$csc_compiler != xmcs])
5317 mono_cfg_root=$mono_build_root/runtime
5318 if test x$host_win32 = xyes; then
5319   if test "x$cross_compiling" = "xno"; then
5320     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
5321     CSC=`cygpath -m -a $CSC`
5322     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
5323   else
5324     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
5325   fi
5326 else
5327   mono_cfg_dir=$mono_cfg_root/etc
5329 AC_SUBST(mono_cfg_dir)
5331 AC_SUBST(CSC)
5333 AC_CONFIG_FILES([po/mcs/Makefile.in])
5335 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
5336 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
5338 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
5339 [   depth=../../../..
5340     case $srcdir in
5341     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5342     .) reldir=$depth ;;
5343     *) reldir=$depth/$srcdir ;;
5344     esac
5345     $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
5346     cd runtime/etc/mono/1.0
5347     rm -f machine.config
5348     $LN_S $reldir/data/net_1_1/machine.config machine.config
5349     cd $depth
5350 ],[LN_S='$LN_S'])
5352 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
5353 [   depth=../../../..
5354     case $srcdir in
5355     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5356     .) reldir=$depth ;;
5357     *) reldir=$depth/$srcdir ;;
5358     esac
5359     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5360     cd runtime/etc/mono/2.0
5361     rm -f machine.config
5362     $LN_S $reldir/data/net_2_0/machine.config machine.config
5363     cd $depth
5364 ],[LN_S='$LN_S'])
5366 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
5367 [   depth=../../../..
5368     case $srcdir in
5369     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5370     .) reldir=$depth ;;
5371     *) reldir=$depth/$srcdir ;;
5372     esac
5373     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
5374     cd runtime/etc/mono/2.0
5375     rm -f web.config
5376     $LN_S $reldir/data/net_2_0/web.config web.config
5377     cd $depth
5378 ],[LN_S='$LN_S'])
5380 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
5381 [   depth=../../..
5382     case $srcdir in
5383     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5384     .) reldir=$depth ;;
5385     *) reldir=$depth/$srcdir ;;
5386     esac
5387     $ac_aux_dir/install-sh -d runtime/etc/mono/
5388     cd runtime/etc/mono/
5389     rm -f browscap.ini
5390     $LN_S $reldir/data/browscap.ini browscap.ini
5391     cd $depth
5392 ],[LN_S='$LN_S'])
5394 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
5395 [   depth=../../../../..
5396     case $srcdir in
5397     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5398     .) reldir=$depth ;;
5399     *) reldir=$depth/$srcdir ;;
5400     esac
5401     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
5402     cd runtime/etc/mono/2.0/Browsers
5403     rm -f Compat.browser
5404     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5405     cd $depth
5406 ],[LN_S='$LN_S'])
5408 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
5409 [   depth=../../../../..
5410     case $srcdir in
5411     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5412     .) reldir=$depth ;;
5413     *) reldir=$depth/$srcdir ;;
5414     esac
5415     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
5416     cd runtime/etc/mono/4.0/Browsers
5417     rm -f Compat.browser
5418     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5419     cd $depth
5420 ],[LN_S='$LN_S'])
5422 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
5423 [   depth=../../../../..
5424     case $srcdir in
5425     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5426     .) reldir=$depth ;;
5427     *) reldir=$depth/$srcdir ;;
5428     esac
5429     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
5430     cd runtime/etc/mono/4.5/Browsers
5431     rm -f Compat.browser
5432     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
5433     cd $depth
5434 ],[LN_S='$LN_S'])
5436 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
5437 [   depth=../../../..
5438     case $srcdir in
5439     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5440     .) reldir=$depth ;;
5441     *) reldir=$depth/$srcdir ;;
5442     esac
5443     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5444     cd runtime/etc/mono/4.0
5445     rm -f machine.config
5446     $LN_S $reldir/data/net_4_0/machine.config machine.config
5447     cd $depth
5448 ],[LN_S='$LN_S'])
5450 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
5451 [   depth=../../../..
5452     case $srcdir in
5453     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5454     .) reldir=$depth ;;
5455     *) reldir=$depth/$srcdir ;;
5456     esac
5457     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
5458     cd runtime/etc/mono/4.0
5459     rm -f web.config
5460     $LN_S $reldir/data/net_4_0/web.config web.config
5461     cd $depth
5462 ],[LN_S='$LN_S'])
5464 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
5465 [   depth=../../../..
5466     case $srcdir in
5467     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5468     .) reldir=$depth ;;
5469     *) reldir=$depth/$srcdir ;;
5470     esac
5471     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5472     cd runtime/etc/mono/4.5
5473     rm -f machine.config
5474     $LN_S $reldir/data/net_4_5/machine.config machine.config
5475     cd $depth
5476 ],[LN_S='$LN_S'])
5478 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
5479 [   depth=../../../..
5480     case $srcdir in
5481     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
5482     .) reldir=$depth ;;
5483     *) reldir=$depth/$srcdir ;;
5484     esac
5485     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
5486     cd runtime/etc/mono/4.5
5487     rm -f web.config
5488     $LN_S $reldir/data/net_4_5/web.config web.config
5489     cd $depth
5490 ],[LN_S='$LN_S'])
5492 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])
5493 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])
5495 # Anything involving -Werror must be done late because autoconf depends on compiling with warnings to be success.
5496 if test x"$GCC" = xyes; then
5498         # incompatible-pointer-types requires gcc circa 5.x
5500         ORIG_CFLAGS=$CFLAGS
5501         CFLAGS="$CFLAGS -Wincompatible-pointer-types -Werror"
5502         AC_MSG_CHECKING(for -Wincompatible-pointer-types option to gcc)
5503         AC_TRY_COMPILE([],[
5504         ], [
5505                 AC_MSG_RESULT(yes)
5506                 CFLAGS="$ORIG_CFLAGS -Werror=incompatible-pointer-types"
5507         ], [
5508                 AC_MSG_RESULT(no)
5509                 CFLAGS=$ORIG_CFLAGS
5510         ])
5513 # Update all submodules recursively to ensure everything is checked out
5514 $srcdir/scripts/update_submodules.sh
5516 AC_OUTPUT([
5517 Makefile
5518 mono-uninstalled.pc
5519 acceptance-tests/Makefile
5520 llvm/Makefile
5521 scripts/mono-find-provides
5522 scripts/mono-find-requires
5523 mk/Makefile
5524 mono/Makefile
5525 mono/btls/Makefile
5526 mono/utils/Makefile
5527 mono/utils/jemalloc/Makefile
5528 mono/metadata/Makefile
5529 mono/dis/Makefile
5530 mono/cil/Makefile
5531 mono/arch/Makefile
5532 mono/arch/x86/Makefile
5533 mono/arch/amd64/Makefile
5534 mono/arch/ppc/Makefile
5535 mono/arch/sparc/Makefile
5536 mono/arch/s390x/Makefile
5537 mono/arch/arm/Makefile
5538 mono/arch/arm64/Makefile
5539 mono/arch/mips/Makefile
5540 mono/sgen/Makefile
5541 mono/tests/Makefile
5542 mono/tests/tests-config
5543 mono/tests/gc-descriptors/Makefile
5544 mono/tests/testing_gac/Makefile
5545 mono/unit-tests/Makefile
5546 mono/benchmark/Makefile
5547 mono/mini/Makefile
5548 mono/profiler/Makefile
5549 mono/eglib/Makefile
5550 mono/eglib/eglib-config.h
5551 m4/Makefile
5552 ikvm-native/Makefile
5553 scripts/Makefile
5554 man/Makefile
5555 docs/Makefile
5556 data/Makefile
5557 data/net_2_0/Makefile
5558 data/net_4_0/Makefile
5559 data/net_4_5/Makefile
5560 data/net_2_0/Browsers/Makefile
5561 data/net_4_0/Browsers/Makefile
5562 data/net_4_5/Browsers/Makefile
5563 data/mint.pc
5564 data/mono-2.pc
5565 data/monosgen-2.pc
5566 data/mono.pc
5567 data/mono-cairo.pc
5568 data/mono-nunit.pc
5569 data/mono-options.pc
5570 data/mono-lineeditor.pc
5571 data/monodoc.pc
5572 data/dotnet.pc
5573 data/dotnet35.pc
5574 data/wcf.pc
5575 data/cecil.pc
5576 data/system.web.extensions_1.0.pc
5577 data/system.web.extensions.design_1.0.pc
5578 data/system.web.mvc.pc
5579 data/system.web.mvc2.pc
5580 data/system.web.mvc3.pc
5581 data/aspnetwebstack.pc
5582 data/reactive.pc
5583 samples/Makefile
5584 support/Makefile
5585 data/config
5586 tools/Makefile
5587 tools/locale-builder/Makefile
5588 tools/sgen/Makefile
5589 tools/monograph/Makefile
5590 tools/pedump/Makefile
5591 runtime/Makefile
5592 msvc/Makefile
5593 po/Makefile
5596 if test x$host_win32 = xyes; then
5597    # Get rid of 'cyg' prefixes in library names
5598    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
5599    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
5600    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
5601    # executable doesn't work...
5602    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
5605 if test x$host_darwin = xyes; then
5606    # This doesn't seem to be required and it slows down parallel builds
5607    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
5611   case $prefix in
5612   NONE) prefix=$ac_default_prefix ;;
5613   esac
5614   case $exec_prefix in
5615   NONE) exec_prefix='${prefix}' ;;
5616   esac
5618   #
5619   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
5620   # any existing config.make.  This allows people to share the same source tree
5621   # with different build directories, one native and one cross
5622   #
5623   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
5625     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
5627     echo "prefix=$prefix" > $mcs_topdir/build/config.make
5628     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
5629     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
5630     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
5631     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
5632     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
5633     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
5634     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
5635     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
5637     case $INSTALL in
5638     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
5639     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
5640     esac
5642     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
5644     export VERSION
5645     [myver=$($AWK 'BEGIN {
5646       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
5647       if(length(vsplit [1]) > 4) {
5648         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
5649       }
5650       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
5651     }')]
5653     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
5654     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
5656     if test x$host_darwin = xyes; then
5657       echo "BUILD_PLATFORM = macos" >> $mcs_topdir/build/config.make
5658       echo "HOST_PLATFORM ?= macos" >> $mcs_topdir/build/config.make
5659       echo "XTEST_PLATFORM ?= osx" >> $mcs_topdir/build/config.make
5660     elif test x$host_win32 = xyes; then
5661       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
5662       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
5663       echo "XTEST_PLATFORM ?= windows" >> $mcs_topdir/build/config.make
5664     elif test x$host_linux = xyes; then
5665       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
5666       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
5667       echo "XTEST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
5668     else
5669       echo "BUILD_PLATFORM = unix" >> $mcs_topdir/build/config.make
5670       echo "HOST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
5671       echo "XTEST_PLATFORM ?= unix" >> $mcs_topdir/build/config.make
5672     fi
5674     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
5675       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
5676     fi
5678         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
5679            enable_system_aot=yes
5680         fi
5682     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
5683       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
5684     fi
5686     if test x$DISABLE_MCS_DOCS = xyes; then
5687       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
5688     fi
5690     if test x$has_extension_module != xno; then
5691         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
5692     fi
5693     
5694     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
5695     
5696     if test "x$test_bcl_opt" = "xyes"; then    
5697       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
5698     fi
5700     echo "CSC_LOCATION = $CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
5702     if test $csc_compiler = mcs; then
5703       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
5704     fi
5706     if test "x$AOT_BUILD_FLAGS" != "x" ; then
5707       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
5708       echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
5709       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
5710     fi
5712     if test "x$AOT_MODE" != "x" ; then
5713       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
5714     fi
5716     if test "x$enable_btls" = "xyes"; then
5717       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
5718     fi
5720   fi
5724 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
5726 btls_platform_string=
5727 if test x$enable_btls = xyes; then
5728         if test x$btls_android = xyes; then
5729                 btls_platform_string=" (android:$BTLS_PLATFORM)"
5730         else
5731                 btls_platform_string=" ($BTLS_PLATFORM)"
5732         fi
5735 thread_suspend_msg=
5736 if test x$buildsgen = xyes; then
5737         if test x$enable_cooperative_suspend = xyes; then
5738                 thread_suspend_msg="Suspend:       Cooperative"
5739         elif test x$enable_hybrid_suspend = xyes; then
5740                 thread_suspend_msg="Suspend:       Hybrid"
5741         else
5742                 thread_suspend_msg="Suspend:       Preemptive"
5743         fi
5745         
5746 echo "
5747         mcs source:    $mcsdir
5748         C# Compiler:   $csc_compiler
5750    Engine:
5751         Host:          $host
5752         Target:        $target
5753         GC:            $gc_msg 
5754         $thread_suspend_msg
5755         TLS:           $with_tls
5756         SIGALTSTACK:   $with_sigaltstack
5757         Engine:        $jit_status
5758         BigArrays:     $enable_big_arrays
5759         DTrace:        $enable_dtrace
5760         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm, built in-tree: $internal_llvm, assertions: $enable_llvm_asserts)
5761         Spectre:       $spectre_mitigation_status
5763    Libraries:
5764         .NET 4.x:        $with_profile4_x
5765         Xamarin.Android: $with_monodroid
5766         Xamarin.iOS:     $with_monotouch
5767         Xamarin.WatchOS: $with_monotouch_watch
5768         Xamarin.TVOS:    $with_monotouch_tv
5769         Xamarin.Mac:     $with_xammac
5770         Windows AOT:     $with_winaot
5771         Orbis:           $with_orbis
5772         Unreal:          $with_unreal
5773         WebAssembly:     $with_wasm
5774         Test profiles:   AOT Full ($with_testing_aot_full), AOT Hybrid ($with_testing_aot_hybrid)
5775         JNI support:     $jdk_headers_found
5776         libgdiplus:      $libgdiplus_msg
5777         zlib:            $zlib_msg
5778         BTLS:            $enable_btls$btls_platform_string
5779         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
5780         $disabled
5782 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
5783    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)