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