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