[runtime] Add a 'generated file' warning to mini/Makefile.am. (#8286)
[mono-project.git] / configure.ac
blob9b13ac3f6d4908781c6de050e32271df8d01cc03
1 # Process this file with autoconf to produce a configure script.
2 #AC_PREREQ([2.62])
4 AC_INIT(mono, [5.15.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`
35 # This is the version number of the corlib-runtime interface. When
36 # making changes to this interface (by changing the layout
37 # of classes the runtime knows about, changing icall signature or
38 # semantics etc), increment this variable.
40 # This can be reset to 0 when Mono's version number is bumped
41 # since it's part of the corlib version (the prefix '1' in the full
42 # version number is to ensure the number isn't treated as octal in C)
43 MONO_CORLIB_COUNTER=3
44 MONO_CORLIB_VERSION=`printf "1%02d%02d%02d%03d" $MONO_VERSION_MAJOR $MONO_VERSION_MINOR 0 $MONO_CORLIB_COUNTER`
46 AC_DEFINE_UNQUOTED(MONO_CORLIB_VERSION,$MONO_CORLIB_VERSION,[Version of the corlib-runtime interface])
47 AC_SUBST(MONO_CORLIB_VERSION)
49 case $host_os in
50 *cygwin* )
51                  echo "Run configure using ./configure --host=i686-pc-mingw32"
52                  exit 1
53 esac
55 # In case of cygwin, override LN_S, irrespective of what it determines.
56 # The build uses cygwin, but the actual runtime doesn't.
57 case $host_os in
58 *cygwin* ) LN_S='cp -p';;
59 esac
62 # libgc defaults
64 libgc_configure_args=
66 # These variables are the CPPFLAGS/CFLAGS passed to libgc's configure
67 # libgc should inherit the original CFLAGS/CPPFLAGS passed to configure, i.e. -O0
68 CPPFLAGS_FOR_LIBGC=$CPPFLAGS
69 CFLAGS_FOR_LIBGC=$CFLAGS
70 CPPFLAGS_FOR_BTLS=$CPPFLAGS
71 CFLAGS_FOR_BTLS=$CFLAGS
73 # libgc uses some deprecated APIs
74 CFLAGS_FOR_LIBGC="$CFLAGS -Wno-deprecated-declarations"
77 # These are the flags that need to be stored in the mono.pc file for 
78 # compiling code that will embed Mono
80 libmono_cflags=""
81 libmono_ldflags=""
82 AC_SUBST(libmono_cflags)
83 AC_SUBST(libmono_ldflags)
85 # Variable to have relocatable .pc files (lib, or lib64)
86 # realpath isn't always available, and requires that all but the tip of the provided
87 # path exists. Fall back to the old behaviour, but realpath allows depth >1
88 # e.g. Debian puts Mono in /usr/bin and libs in /usr/lib/x86_64-linux-gnu/ which is
89 # too deep for the old method to work
90 reloc_libdir=`realpath --relative-to=${prefix} ${libdir} 2> /dev/null || basename ${libdir}`
91 AC_SUBST(reloc_libdir)
93 # Set to yes if Unix sockets cannot be created in an anonymous namespace
94 need_link_unlink=no
96 #Set to extra linker flags to be passed to the runtime binaries (mono /mono-sgen)
97 extra_runtime_ldflags=""
100 # Hack for WASM
101 # Current autotools (v1.15) doesn't have a triplet we can use for wasm so the kludge we do is to
102 # work around it by using a feature flag instead
103 AC_ARG_ENABLE(wasm,[  --enable-wasm    Hack to set the current runtime to target wasm], enable_wasm=$enableval)
105 # Thread configuration inspired by sleepycat's db
106 AC_MSG_CHECKING([host platform characteristics])
108 libgc_threads=no
109 has_dtrace=no
110 parallel_mark=yes
111 ikvm_native=yes
113 host_win32=no
114 target_win32=no
115 platform_android=no
116 platform_tizen=no
117 platform_ios=no
118 host_darwin=no
121 if test "x$enable_wasm" = "xyes"; then
122 CFLAGS="$CFLAGS -D_REENTRANT -D_GNU_SOURCE -DNO_UNALIGNED_ACCESS -s WASM=1"
123 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DUSE_MMAP -D_GNU_SOURCE -DNO_UNALIGNED_ACCESS -s WASM=1"
124 libdl="-ldl"
125 libgc_threads=pthreads
126 platform_wasm=yes
128 else
130 case "$host" in
131         *-mingw*|*-*-cygwin*)
132                 AC_DEFINE(DISABLE_PORTABILITY,1,[Disable the io-portability layer])
133                 AC_DEFINE(HOST_NO_SYMLINKS,1,[This platform does not support symlinks])
134                 host_win32=yes
135                 mono_cv_clang=no
136                 if test "x$cross_compiling" = "xno"; then
137                         if test "x$host" = "x$build" -a "x$host" = "x$target"; then
138                                 target_win32=yes
139                         fi
140                 else
141                         if test "x$host" = "x$target"; then
142                                 target_win32=yes
143                         fi
144                 fi
145                 HOST_CC="gcc"
146                 # Windows Vista or later is required
147                 CPPFLAGS="$CPPFLAGS -DWINVER=0x0600 -D_WIN32_WINNT=0x0600 -D_WIN32_IE=0x0501 -D_UNICODE -DUNICODE -DWIN32_THREADS -DFD_SETSIZE=1024"
148                 LDFLAGS="$LDFLAGS -lmswsock -lws2_32 -lole32 -loleaut32 -lpsapi -lversion -ladvapi32 -lwinmm -lkernel32 -liphlpapi"
149                 libmono_cflags="-mms-bitfields -mwindows"
150                 libmono_ldflags="-mms-bitfields -mwindows"
151                 libdl=
152                 libgc_threads=win32
153                 with_sigaltstack=no
154                 with_tls=pthread
155                 with_sgen_default_concurrent=yes
156                 LN_S=cp
157                 # This forces libgc to use the DllMain based thread registration code on win32
158                 libgc_configure_args="$libgc_configure_args --enable-win32-dllmain=yes"
159                 ;;
160         *-*-*netbsd*)
161                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -DGC_NETBSD_THREADS -D_GNU_SOURCE"
162                 libmono_cflags="-D_REENTRANT"
163                 LDFLAGS="$LDFLAGS -pthread"
164                 CPPFLAGS="$CPPFLAGS -DHOST_BSD"
165                 libmono_ldflags="-pthread"
166                 need_link_unlink=yes
167                 libdl="-ldl"
168                 libgc_threads=pthreads
169                 with_sigaltstack=no
170                 use_sigposix=yes
171                 with_sgen_default_concurrent=yes
172                 ;;
173         *-*-kfreebsd*-gnu)
174                 CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP -DUSE_MUNMAP -DTHREAD_LOCAL_ALLOC -pthread"
175                 libmono_cflags="-D_REENTRANT -DTHREAD_LOCAL_ALLOC -pthread"
176                 libmono_ldflags="-lpthread -pthread"
177                 libdl="-ldl"
178                 libgc_threads=pthreads
179                 need_link_unlink=yes
180                 with_sigaltstack=no
181                 use_sigposix=yes
182                 with_sgen_default_concurrent=yes
183                 ;;
184         *-*-*freebsd*)
185                 if test "x$PTHREAD_CFLAGS" = "x"; then
186                         CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS"
187                         libmono_cflags=
188                 else
189                         CPPFLAGS="$CPPFLAGS $PTHREAD_CFLAGS -DGC_FREEBSD_THREADS"
190                         libmono_cflags="$PTHREAD_CFLAGS"
191                 fi
192                 if test "x$PTHREAD_LIBS" = "x"; then
193                         LDFLAGS="$LDFLAGS -pthread -L/usr/local/lib"
194                         libmono_ldflags="-pthread"
195                 else
196                         LDFLAGS="$LDFLAGS $PTHREAD_LIBS -L/usr/local/lib"
197                         libmono_ldflags="$PTHREAD_LIBS"
198                 fi
199                 CPPFLAGS="$CPPFLAGS -DHOST_BSD"
200                 need_link_unlink=yes
201                 AC_DEFINE(PTHREAD_POINTER_ID, 1, [pthread is a pointer])
202                 libdl=
203                 libgc_threads=pthreads
204                 use_sigposix=yes
205                 has_dtrace=yes
206                 with_sgen_default_concurrent=yes
207                 ;;
208         *-*-*openbsd*)
209                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_OPENBSD_THREADS -DHOST_BSD -D_REENTRANT -DUSE_MMAP"
210                 LDFLAGS="${LDFLAGS} -Wl,-zwxneeded"
211                 if test "x$disable_munmap" != "xyes"; then
212                 CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
213                 fi
214                 libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
215                 LDFLAGS="$LDFLAGS -pthread"
216                 need_link_unlink=yes
217                 AC_DEFINE(PTHREAD_POINTER_ID)
218                 libdl=
219                 libgc_threads=pthreads
220                 with_tls=pthread
221                 with_sigaltstack=no
222                 use_sigposix=yes
223                 with_sgen_default_concurrent=yes
224                 ;;
225         *-*-linux-android*)
226                 platform_android=yes
227                 AC_DEFINE(HOST_ANDROID,1,[Targeting the Android platform])
228                 AC_DEFINE(TARGET_ANDROID,1,[Targeting the Android platform])
230                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
231                 if test "x$disable_munmap" != "xyes"; then
232                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
233                 fi
234                 libmono_cflags="-D_REENTRANT"
235                 libdl="-ldl"
236                 libgc_threads=pthreads
237                 use_sigposix=yes
239                 with_tls=pthread
240                 with_sigaltstack=no
241                 with_static_mono=no
243                 # Android doesn't support boehm, as it's missing <link.h>
244                 support_boehm=no
245                 with_gc=sgen
247                 # isinf(3) requires -lm; see isinf check below
248                 LDFLAGS="$LDFLAGS -lm"
250                 # Bionic's <pthread.h> sets PTHREAD_STACK_MIN=2*PAGE_SIZE; doesn't define
251                 # PAGE_SIZE; breaks mono/io-layer/collection.c
252                 # Bionic doesn't provide S_IWRITE; breaks io-layer/io.c
253                 CFLAGS="$CFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
254                 CXXFLAGS="$CXXFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
256                 # to bypass the underscore linker check, can't work when cross-compiling
257                 mono_cv_uscore=yes
258                 mono_cv_clang=no
259                 ;;
260         *-*-linux*)
261                 CPPFLAGS="$CPPFLAGS -DGC_LINUX_THREADS -D_GNU_SOURCE -D_REENTRANT -DUSE_MMAP"
262                 if test "x$disable_munmap" != "xyes"; then
263                         CPPFLAGS="$CPPFLAGS -DUSE_MUNMAP"
264                 fi
265                 libmono_cflags="-D_REENTRANT"
266                 libdl="-ldl"
267                 libgc_threads=pthreads
268                 use_sigposix=yes
269                 if test "x$cross_compiling" != "xno"; then
270                         # to bypass the underscore linker check, not
271                         # available during cross-compilation
272                         mono_cv_uscore=no
273                 fi
274                 case "$host" in
275                 *-tizen-linux-*)
276                         platform_tizen=yes
277                         ;;
278                 esac
279                 case "$host" in
280                 aarch64-*)
281                         support_boehm=no
282                         with_gc=sgen
283                         ;;
284                 powerpc*-*-linux*)
285                         # https://bugzilla.novell.com/show_bug.cgi?id=504411
286                         disable_munmap=yes
287                         ;;
288                 esac
289                 with_sgen_default_concurrent=yes
290                 ;;
291         *-*-nacl*)
292                 echo "nacl no longer supported."
293                 exit 1
294                 ;;
295         *-*-hpux*)
296                 CPPFLAGS="$CPPFLAGS -DGC_HPUX_THREADS -D_HPUX_SOURCE -D_XOPEN_SOURCE_EXTENDED -D_REENTRANT"
297                 # +ESdbgasm only valid on bundled cc on RISC
298                 # silently ignored for ia64
299                 if test $GCC != "yes"; then
300                         CFLAGS="$CFLAGS +ESdbgasm"
301                         # Arrange for run-time dereferencing of null
302                         # pointers to produce a SIGSEGV signal.
303                         LDFLAGS="$LDFLAGS -z"
304                 fi
305                 CFLAGS="$CFLAGS +ESdbgasm"
306                 LDFLAGS="$LDFLAGS -z"
307                 libmono_cflags="-D_REENTRANT"
308                 libmono_ldflags="-lpthread"
309                 libgc_threads=pthreads
310                 need_link_unlink=yes
311                 use_sigposix=yes
312                 ;;
313         *-*-solaris*)
314                 CPPFLAGS="$CPPFLAGS -DGC_SOLARIS_THREADS -DGC_SOLARIS_PTHREADS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -DUSE_MMAP -DUSE_MUNMAP -DHOST_SOLARIS"
315                 need_link_unlink=yes
316                 libmono_cflags="-D_REENTRANT"
317                 libgc_threads=pthreads
318                 has_dtrace=yes
319                 use_sigposix=yes
320                 enable_solaris_tar_check=yes
321                 ;;
322         *-*-darwin*)
323                 parallel_mark="Disabled_Currently_Hangs_On_MacOSX"
324                 host_darwin=yes
325                 target_mach=yes
326                 CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_MACOSX_THREADS -DUSE_MMAP -DUSE_MUNMAP"
327                 libmono_cflags="-D_THREAD_SAFE"
328                 need_link_unlink=yes
329                 AC_DEFINE(PTHREAD_POINTER_ID)
330                 AC_DEFINE(USE_MACH_SEMA, 1, [...])
331                 libdl=
332                 libgc_threads=pthreads
333                 has_dtrace=yes
334                 if test "x$cross_compiling" = "xyes"; then
335                         has_broken_apple_cpp=yes
336                 fi
337                 dnl Snow Leopard is horribly broken -- it reports itself as i386-apple-darwin*, but
338                 dnl its gcc defaults to 64-bit mode.  They have also deprecated the usage of ucontext
339                 dnl we need to set some flags to build our 32-bit binaries on 10.6 properly
340                 case "$host" in
341                         dnl Snow Leopard and newer config.guess reports as this
342                         i*86-*-darwin*)
343                                 BROKEN_DARWIN_FLAGS="-arch i386 -D_XOPEN_SOURCE"
344                                 BROKEN_DARWIN_CPPFLAGS="-D_XOPEN_SOURCE"
345                                 CPPFLAGS="$CPPFLAGS $BROKEN_DARWIN_CPPFLAGS"
346                                 CFLAGS="$CFLAGS $BROKEN_DARWIN_FLAGS"
347                                 CXXFLAGS="$CXXFLAGS $BROKEN_DARWIN_FLAGS"
348                                 CCASFLAGS="$CCASFLAGS $BROKEN_DARWIN_FLAGS"
349                                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC $BROKEN_DARWIN_CPPFLAGS"
350                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC $BROKEN_DARWIN_FLAGS"
351                                 with_sgen_default_concurrent=yes
352                                 ;;
353                         x*64-*-darwin*)
354                                 with_sgen_default_concurrent=yes
355                                 ;;
356                         arm*-darwin*)
357                                 platform_ios=yes
358                                 has_dtrace=no
359                                 ;;
360                         aarch64*-darwin*)
361                                 platform_ios=yes
362                                 ;;
363                 esac
364                 ;;
365         *-*-haiku*)
366                 CPPFLAGS="$CPPFLAGS -D_REENTRANT -D_THREAD_SAFE"
367                 libmono_cflags="-D_REENTRANT -D_THREAD_SAFE"
368                 libdl=
369                 LIBS="$LIBS -lnetwork -ltextencoding"
370                 need_link_unlink=yes
371                 AC_DEFINE(PTHREAD_POINTER_ID)
372                 dnl Haiku does not support static TLS with __thread
373                 with_tls=pthread
374                 libgc_threads=pthreads
375                 use_sigposix=yes
376                 ;;
377         *-*-aix*|*-*-os400*)
378                 dnl Set up a 64-bit build
379                 CPPFLAGS="$CPPFLAGS -maix64 -DGC_AIX_THREADS -D_ALL_SOURCE -D_THREAD_SAFE -D_LARGE_FILES -D_REENTRANT"
380                 LDFLAGS="-maix64"
381                 libmono_cflags="-D_THREAD_SAFE -D_REENTRANT"
382                 dnl Would you believe GNU nm doesn't know how to process AIX libraries?
383                 dnl Hardcode IBM binutils in case GNU ones end up on our path. Also
384                 dnl specifiy 64-bit mode for tools.
385                 AR="/usr/bin/ar -X64"
386                 NM="/usr/bin/nm -X64"
387                 dnl SGen is the future (changes to Boehm support code would be
388                 dnl required if you wish to re-enable Boehm)
389                 support_boehm=no
390                 with_gc=sgen
391                 need_link_unlink=yes
392                 use_sigposix=yes
393                 dnl the valloc call to alloc the guard page bombs out, even with extending the data area
394                 with_sigaltstack=no
395                 dnl use pthread TLS, __thread has issues with the compiler flags we use
396                 with_tls=pthread
397                 dnl ppc Linux is the same? test further
398                 disable_munmap=yes
399                 ;;
400         *)
401                 AC_MSG_WARN([*** Please add $host to configure.ac checks!])
402                 libdl="-ldl"
403                 ;;
404 esac
406 # WASM hack
409 AC_MSG_RESULT(ok)
411 if test x$need_link_unlink = xyes; then
412    AC_DEFINE(NEED_LINK_UNLINK, 1, [Define if Unix sockets cannot be created in an anonymous namespace])
415 if test x$host_win32 = xyes; then
416    AC_DEFINE(HOST_WIN32, 1, [Host Platform is Win32])
419 if test x$target_win32 = xyes; then
420    AC_DEFINE(TARGET_WIN32, 1, [Target Platform is Win32])
423 if test x$host_darwin = xyes; then
424    AC_DEFINE(HOST_DARWIN, 1, [Host Platform is Darwin])
427 # Defined for all targets/platforms using classic Windows API support.
428 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
429 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
431 AC_SUBST(extra_runtime_ldflags)
432 AM_CONDITIONAL(HOST_WIN32, test x$host_win32 = xyes)
433 AM_CONDITIONAL(TARGET_WIN32, test x$target_win32 = xyes)
434 AM_CONDITIONAL(HOST_LINUX, echo x$target_os | grep -q linux)
435 AM_CONDITIONAL(HOST_DARWIN, test x$host_darwin = xyes)
436 AM_CONDITIONAL(HOST_SIGPOSIX, test x$use_sigposix = xyes)
437 AM_CONDITIONAL(HOST_ANDROID, test x$platform_android = xyes)
438 AM_CONDITIONAL(HOST_TIZEN, test x$platform_tizen = xyes)
439 AM_CONDITIONAL(HOST_IOS, test x$platform_ios = xyes)
440 AM_CONDITIONAL(HOST_WASM, test x$platform_wasm = xyes)
442 if test -z "$HOST_DARWIN_TRUE"; then :
443 PLATFORM_AOT_SUFFIX=.dylib
446 if test -z "$HOST_LINUX_TRUE"; then :
447 PLATFORM_AOT_SUFFIX=.so
450 if test -z "$HOST_WIN32_TRUE"; then :
451 PLATFORM_AOT_SUFFIX=.dll
454 AC_SUBST(PLATFORM_AOT_SUFFIX)
456 ## PLATFORM_AOT_SUFFIX not so simple for windows :-)
458 AC_CHECK_TOOL(CC, gcc, gcc)
459 AC_PROG_CC
460 AC_CHECK_TOOL(CXX, g++, g++)
461 AC_PROG_CXX
462 AM_PROG_AS
463 AC_PROG_INSTALL
464 AC_PROG_AWK
465 AM_PROG_CC_C_O
466 dnl We should use AM_PROG_AS, but it's not available on automake/aclocal 1.4
467 : ${CCAS='$(CC)'}
468 # Set ASFLAGS if not already set.
469 : ${CCASFLAGS='$(CFLAGS)'}
470 AC_SUBST(CCAS)
471 AC_SUBST(CCASFLAGS)
473 # AC_PROG_CXX helpfully sets CXX to g++ even if no c++ compiler is found so check
474 # GXX instead. See http://lists.gnu.org/archive/html/bug-autoconf/2002-04/msg00056.html
475 if test "x$CXX" = "xg++"; then
476         if test "x$GXX" != "xyes"; then
477                 # automake/libtool is so broken, it requires g++ even if the c++ sources
478                 # are inside automake conditionals
479                 AC_MSG_ERROR([You need to install g++])
480         fi
483 dnl may require a specific autoconf version
484 dnl AC_PROG_CC_FOR_BUILD
485 dnl CC_FOR_BUILD not automatically detected
486 CC_FOR_BUILD=$CC
487 CFLAGS_FOR_BUILD=$CFLAGS
488 BUILD_EXEEXT=
489 if test "x$cross_compiling" = "xyes"; then
490         CC_FOR_BUILD=cc
491         CFLAGS_FOR_BUILD=
492         BUILD_EXEEXT=""
494 AC_SUBST(CC_FOR_BUILD)
495 AC_SUBST(CFLAGS_FOR_BUILD)
496 AC_SUBST(HOST_CC)
497 AC_SUBST(BUILD_EXEEXT)
499 AM_CONDITIONAL(CROSS_COMPILING, [test x$cross_compiling = xyes])
500 AM_CONDITIONAL(USE_BATCH_FILES, [test x$host_win32 = xyes -a x$cross_compiling = xyes])
502 # Set STDC_HEADERS
503 AC_HEADER_STDC
504 AC_LIBTOOL_WIN32_DLL
505 # This causes monodis to not link correctly
506 #AC_DISABLE_FAST_INSTALL
508 #lookup makedev() header
509 AC_HEADER_MAJOR
511 AM_PROG_LIBTOOL
512 # Use dolt (http://dolt.freedesktop.org/) instead of libtool for building.
513 DOLT
515 export_ldflags=`(./libtool --config; echo eval echo \\$export_dynamic_flag_spec) | sh`
516 AC_SUBST(export_ldflags)
518 # Test whenever ld supports -version-script
519 AC_PROG_LD
520 AC_PROG_LD_GNU
522 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)
523 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)
524 AC_CHECK_HEADERS([linux/netlink.h linux/rtnetlink.h],
525                   [], [], [#include <stddef.h>
526                   #include <sys/socket.h>
527                   #include <linux/socket.h>])
529 AC_CHECK_HEADERS(sys/user.h, [], [],
531 #ifdef HAVE_SYS_PARAM_H
532 # include <sys/param.h>
533 #endif
536 AC_CHECK_HEADERS(linux/serial.h)
538 AC_CHECK_HEADER(zlib.h, [have_zlib=yes], [have_zlib=no])
539 if test x$have_zlib = xyes; then
540    AC_TRY_COMPILE([#include <zlib.h>], [
541    #if defined(ZLIB_VERNUM) && (ZLIB_VERNUM >= 0x1230)
542    #else
543    #error No good zlib found
544    #endif
545    ],[
546         AC_MSG_RESULT(Using system zlib)
547         zlib_msg="system zlib"
548         AC_DEFINE(HAVE_SYS_ZLIB,1,[Have system zlib])
549    ],[
550         AC_MSG_RESULT(Using embedded zlib)
551         have_zlib=no
552         zlib_msg="bundled zlib"
553    ])
556 AM_CONDITIONAL(HAVE_ZLIB, test x$have_zlib = xyes)
557 AC_DEFINE(HAVE_ZLIB,1,[Have system zlib])
559 # for mono/metadata/debug-symfile.c
560 AC_CHECK_HEADERS(elf.h)
562 # for support
563 AC_CHECK_HEADERS(poll.h)
564 AC_CHECK_HEADERS(sys/poll.h)
565 AC_CHECK_HEADERS(sys/wait.h)
566 AC_CHECK_HEADERS(grp.h)
567 AC_CHECK_HEADERS(syslog.h)
568 AC_CHECK_FUNCS(vsyslog)
570 # for mono/dis
571 AC_CHECK_HEADERS(wchar.h)
572 AC_CHECK_HEADERS(ieeefp.h)
573 AC_MSG_CHECKING(for isinf)
574 AC_TRY_LINK([#include <math.h>], [
575         int f = isinf (1.0);
576 ], [
577         AC_MSG_RESULT(yes)
578         AC_DEFINE(HAVE_ISINF, 1, [isinf available])
579 ], [
580         # We'll have to use signals
581         AC_MSG_RESULT(no)
583 # mingw
584 AC_CHECK_FUNCS(_finite, , AC_MSG_CHECKING(for _finite in math.h)
585         AC_TRY_LINK([#include <math.h>], 
586         [ _finite(0.0); ], 
587         AC_DEFINE(HAVE__FINITE, 1, [Have _finite in -lm]) AC_MSG_RESULT(yes),
588         AC_MSG_RESULT(no)))
590 # for Linux statfs support
591 AC_CHECK_HEADERS(linux/magic.h)
593 # For Android NDK unified headers
594 if test x$platform_android = xyes; then
595         AC_CHECK_HEADERS(machine/endian.h sys/endian.h)
596         AC_CHECK_HEADERS(android/legacy_signal_inlines.h, [have_android_signal_inlines=yes], [have_android_signal_inlines=no])
598         # Make sure SIGRT{MIN,MAX} work - they will fail to work with unified headers if building for
599         # API level < 21 *and* android/legacy_signal_inlines.h doesn't declare (and define) the required
600         # libc APIs to obtain values for SIGRT{MIN,MAX}. We perform the check only if android/legacy_signal_inlines.h
601         # is found because in other cases the macros will either work (for NDK < 14) or fail if the legacy header
602         # doesn't contain the required definitions (NDK 14)
603         if test x$have_android_signal_inlines = xyes; then
604                 AC_MSG_CHECKING([Whether Android SIGRTMIN/SGRTMAX macros are valid])
605                 AC_COMPILE_IFELSE([
606                         AC_LANG_PROGRAM([#include <android/legacy_signal_inlines.h>],[
607                                 int i;
608                                 for (i = SIGRTMIN + 1; i < SIGRTMAX; ++i) {
609                                 }
610                         ])],[
611                                 AC_MSG_RESULT(yes)
612                                 android_sigrtminmax_work=yes
613                         ],[
614                                 AC_MSG_RESULT(no)
615                                 android_sigrtminmax_work=no
616                         ]
617                 )
619                 if test x$android_sigrtminmax_work = xno; then
620                         AC_MSG_ERROR([Android SIGRTMIN/SIGRTMAX macros don't work in this NDK])
621                 fi
622         fi
624         # Attempt to detect whether we're using Android NDK unified headers
625         AC_CHECK_HEADERS(android/api-level.h, [have_android_api_level=yes], [have_android_api_level=no])
626         AC_CHECK_HEADERS(android/versioning.h, [have_android_versioning=yes], [have_android_versioning=no])
628         android_unified_headers=no
629         if test x$have_android_api_level = xyes; then
630                 if test x$have_android_versioning = xyes; then
631                         AC_MSG_CHECKING([whether using Android NDK unified headers])
633                         # Both macros are defined only in the NDK unified headers
634                         AC_COMPILE_IFELSE([
635                                 AC_LANG_PROGRAM([
636                                         #include <android/api-level.h>
637                                         #include <android/versioning.h>
638                                 ],[
639                                         #if __ANDROID_API_O__ == 26 && defined(__INTRODUCED_IN)
640                                         #else
641                                                 #error __ANDROID_API_O__ != 26 or the __INTRODUCED_IN macro not defined
642                                         #endif
643                                 ])],[
644                                         AC_MSG_RESULT(yes)
645                                         android_unified_headers=yes
646                                 ],[
647                                         AC_MSG_RESULT(no)
648                                         android_unified_headers=no
649                                 ]
650                         )
651                 fi
652         fi
654         if test x$android_unified_headers = xyes; then
655                 AC_DEFINE(ANDROID_UNIFIED_HEADERS, 1, [Whether Android NDK unified headers are used])
656         fi
657 fi # Android
659 # not 64 bit clean in cross-compile
660 if test "x$enable_wasm" = "xyes"; then
661 AC_DEFINE(SIZEOF_VOID_P,4)
662 AC_DEFINE(SIZEOF_LONG,4)
663 ac_cv_sizeof_void_p="4"
664 ac_cv_sizeof_long="4"
665 else
666 AC_CHECK_SIZEOF(void *)
667 AC_CHECK_SIZEOF(long)
670 AC_CHECK_SIZEOF(int)
671 AC_CHECK_SIZEOF(long long)
673 AC_CACHE_CHECK([for clang],
674         mono_cv_clang,[
675         AC_TRY_COMPILE([], [
676                 #ifdef __clang__
677                 #else
678                 #error "FAILED"
679                 #endif
680         ],
681         [mono_cv_clang=yes],
682         [mono_cv_clang=no],
683         [])
686 AC_ARG_ENABLE(visibility-hidden,
687 [  --disable-visibility-hidden    disable usage of -fvisiblity=hidden],
688    disable_visibility_hidden=yes, disable_visibility_hidden=no)
690 WARN=''
691 if test x"$GCC" = xyes; then
692         WARN='-Wall -Wunused -Wmissing-prototypes -Wmissing-declarations -Wstrict-prototypes  -Wmissing-prototypes -Wnested-externs -Wpointer-arith -Wno-cast-qual -Wwrite-strings -Wno-switch -Wno-switch-enum -Wno-unused-value -Wno-attributes -Wno-format-zero-length'
694                 # We require C99 with some GNU extensions, e.g. `linux` macro
695                 CFLAGS="$CFLAGS -std=gnu99"
697                 # The runtime code does not respect ANSI C strict aliasing rules
698                 CFLAGS="$CFLAGS -fno-strict-aliasing"
700                 # We rely on signed overflow to behave
701                 CFLAGS="$CFLAGS -fwrapv"
703                 CFLAGS="$CFLAGS -DMONO_DLL_EXPORT"
704                 if test x"$disable_visibility_hidden" = xno; then
705                    # Don't export any symbols by default
706                    SHARED_CFLAGS="-fvisibility=hidden"
707                    CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
708                 fi
710                 ORIG_CFLAGS=$CFLAGS
711                 # Check for the normal version, since gcc ignores unknown -Wno options
712                 CFLAGS="$CFLAGS -Wunused-but-set-variable -Werror"
713                 AC_MSG_CHECKING(for -Wno-unused-but-set-variable option to gcc)
714                 AC_TRY_COMPILE([],[
715                 ], [
716                    AC_MSG_RESULT(yes)
717                    CFLAGS="$ORIG_CFLAGS -Wno-unused-but-set-variable"
718                 ], [
719                    AC_MSG_RESULT(no)
720                    CFLAGS=$ORIG_CFLAGS
721                 ])
723                 if test "x$mono_cv_clang" = "xyes"; then
724                    # https://bugzilla.samba.org/show_bug.cgi?id=8118
725                    WARN="$WARN -Qunused-arguments"
726                    WARN="$WARN -Wno-unused-function -Wno-tautological-compare -Wno-parentheses-equality -Wno-self-assign -Wno-return-stack-address -Wno-constant-logical-operand"
727                    # We rely on zero length arrays in structs
728                    WARN="$WARN -Wno-zero-length-array"
729                 fi
730 else
731         # The Sun Forte compiler complains about inline functions that access static variables
732         # so disable all inlining.
733         case "$host" in
734         *-*-solaris*)
735                 CFLAGS="$CFLAGS -Dinline="
736                 ;;
737         esac
739 CFLAGS="$CFLAGS -g $WARN"
740 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -g"
741 CPPFLAGS="$CPPFLAGS -g $WARN"
743 # Where's the 'mcs' source tree?
744 if test -d $srcdir/mcs; then
745   mcsdir=mcs
746 else
747   mcsdir=../mcs
750 AC_ARG_WITH(mcs-path, [  --with-mcs-path=/path/to/mcs      Specify an alternate mcs source tree],
751         if test x$with_mcs_path != "x" -a -d $with_mcs_path ; then
752                 mcsdir=$with_mcs_path
753         fi
756 AC_ARG_WITH(jumptables, [  --with-jumptables=yes,no      enable/disable support for jumptables (ARM-only for now) (defaults to no)],[],[with_jumptables=no])
759 # A sanity check to catch cases where the package was unpacked
760 # with an ancient tar program (Solaris)
762 AC_ARG_ENABLE(solaris-tar-check,
763 [  --disable-solaris-tar-check    disable solaris tar check],
764    do_solaris_tar_check=no, do_solaris_tar_check=yes)
766 if test x"$do_solaris_tar_check" = xyes -a x"$enable_solaris_tar_check" = xyes; then
767         AC_MSG_CHECKING(integrity of package)
768         if test -f $mcsdir/class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapTypeMapper.cs
769         then
770                 AC_MSG_RESULT(ok)
771         else
772                 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"
773                 AC_MSG_ERROR([$errorm])
774         fi
777 if test "x$with_mcs_path" != "x"; then
778 mcs_topdir=$(cd "$mcsdir" && pwd)
779 mcs_topdir_from_srcdir=$mcs_topdir
780 else
781 mcs_topdir=$(cd "$srcdir/$mcsdir" && pwd)
782 mcs_topdir_from_srcdir='$(top_builddir)'/$mcsdir
785 # Convert mcs_topdir* paths to Windows syntax.
786 if test x$cross_compiling$host_win32 = xnoyes; then
787   mcs_topdir=$(cygpath -m $mcs_topdir)
788   case $mcs_topdir_from_srcdir in
789     /cygdrive/*)
790         mcs_topdir_from_srcdir=$(cygpath -m $mcs_topdir_from_srcdir)
791         ;;
792   esac
795 AC_SUBST([mcs_topdir])
796 AC_SUBST([mcs_topdir_from_srcdir])
798 # gettext: prepare the translation directories. 
799 # we do not configure the full gettext, as we consume it dynamically from C#
800 AM_PO_SUBDIRS
802 if test "x$USE_NLS" = "xyes"; then
803    AC_CHECK_PROG(HAVE_MSGFMT, msgfmt,yes,no)
805    if test "x$HAVE_MSGFMT" = "xno"; then
806           AC_MSG_ERROR([msgfmt not found. You need to install the 'gettext' package, or pass --enable-nls=no to configure.])
807    fi
810 AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
812 pkg_config_path=
813 AC_ARG_WITH(crosspkgdir, [  --with-crosspkgdir=/path/to/pkg-config/dir      Change pkg-config dir to custom dir],
814         if test x$with_crosspkgdir = "x"; then
815                 if test -s $PKG_CONFIG_PATH; then
816                         pkg_config_path=$PKG_CONFIG_PATH
817                 fi
818         else
819                 pkg_config_path=$with_crosspkgdir
820                 PKG_CONFIG_PATH=$pkg_config_path
821                 export PKG_CONFIG_PATH
822         fi
825 AC_ARG_ENABLE(ninja,[  --enable-ninja    Enable using ninja where available], enable_ninja=$enableval)
826 AC_CHECK_PROG(HAVE_NINJA, ninja, yes, no)
827 AM_CONDITIONAL(NINJA, test x$enable_ninja = xyes -a x$HAVE_NINJA != xno)
829 AC_ARG_ENABLE(werror, [  --enable-werror Pass -Werror to the C compiler], werror_flag=$enableval, werror_flag=no)
830 if test x$werror_flag = xyes; then
831         WERROR_CFLAGS="-Werror"
833 AC_SUBST([WERROR_CFLAGS])
834 AC_SUBST([SHARED_CFLAGS])
836 GLIB_CFLAGS='-I$(top_srcdir)/mono/eglib -I$(top_builddir)/mono/eglib'
837   
838 AC_SUBST(GLIB_CFLAGS)
840 # Enable support for fast thread-local storage
841 # Some systems have broken support, so we allow to disable it.
842 AC_ARG_WITH(tls, [  --with-tls=__thread,pthread    select Thread Local Storage implementation (defaults to __thread)],[],[with_tls=__thread])
844 # Enable support for using sigaltstack for SIGSEGV and stack overflow handling
845 # This does not work on some platforms (bug #55253)
846 AC_ARG_WITH(sigaltstack, [  --with-sigaltstack=yes,no      enable/disable support for sigaltstack (defaults to yes)],[],[with_sigaltstack=yes])
848 AC_ARG_WITH(static_mono, [  --with-static_mono=yes,no      link mono statically to libmono (faster) (defaults to yes)],[],[with_static_mono=yes])
849 AC_ARG_WITH(shared_mono, [  --with-shared_mono=yes,no      build a shared libmono library (defaults to yes)],[],[with_shared_mono=yes])
850 # Same as --with-shared_mono=no
851 AC_ARG_ENABLE(libraries, [  --disable-libraries disable the build of libmono], enable_libraries=$enableval, enable_libraries=yes)
853 if test "x$enable_static" = "xno"; then
854    with_static_mono=no
857 if test "x$enable_shared" = "xno"; then
858    with_shared_mono=no
861 if test "x$enable_libraries" = "xno"; then
862    with_shared_mono=no
865 AM_CONDITIONAL(DISABLE_LIBRARIES, test x$enable_libraries = xno)
867 if test "x$host_win32" = "xyes"; then
868    # Boehm GC requires the runtime to be in its own dll
869    with_static_mono=no
872 AM_CONDITIONAL(STATIC_MONO, test x$with_static_mono != xno)
873 AM_CONDITIONAL(SHARED_MONO, test x$with_shared_mono != xno)
874 AC_ARG_ENABLE(mcs-build, [  --disable-mcs-build disable the build of the mcs directory], try_mcs_build=$enableval, enable_mcs_build=yes)
875 AC_ARG_ENABLE(support-build, [  --disable-support-build disable the build of the support directory], try_support_build=$enableval, enable_support_build=yes)
877 AC_ARG_WITH(xen_opt,   [  --with-xen_opt=yes,no          Enable Xen-specific behaviour (defaults to yes)],[],[with_xen_opt=yes])
878 if test "x$with_xen_opt" = "xyes" -a "x$mono_cv_clang" = "xno"; then
879         AC_DEFINE(MONO_XEN_OPT, 1, [Xen-specific behaviour])
880         ORIG_CFLAGS=$CFLAGS
881         CFLAGS="$CFLAGS -mno-tls-direct-seg-refs"
882         AC_MSG_CHECKING(for -mno-tls-direct-seg-refs option to gcc)
883         AC_TRY_COMPILE([], [
884         ], [
885            AC_MSG_RESULT(yes)
886            # Pass it to libgc as well
887            CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -mno-tls-direct-seg-refs"
888         ], [
889            AC_MSG_RESULT(no)
890            CFLAGS=$ORIG_CFLAGS
891         ])
894 AC_ARG_ENABLE(small-config, [  --enable-small-config Enable tweaks to reduce requirements (and capabilities)], enable_small_config=$enableval, enable_small_config=no)
896 if test x$enable_small_config = xyes; then
897         AC_DEFINE(MONO_SMALL_CONFIG,1,[Reduce runtime requirements (and capabilities)])
898         CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DSMALL_CONFIG"
901 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)
903 DISABLED_FEATURES=none
904 csc_compiler=default
905 endian=unknown
906 AC_C_BIGENDIAN([endian=big],[endian=little],[endian=unknown])
907 AC_MSG_CHECKING([CSharp compiler to use])
908 AC_ARG_WITH(csc, [  --with-csc=mcs,roslyn,default      Configures the CSharp compiler to use],[
909    if test x$withval = xmcs; then
910        csc_compiler=mcs
911    elif test x$withval = xroslyn; then
912        csc_compiler=roslyn
913    elif test x$withval = xdefault; then
914        :
915    else
916        AC_MSG_ERROR([You must supply one of "mcs", "roslyn" or "default" to the --with-csc option])
917    fi
918 ],[csc_compiler=default])
920 if test $csc_compiler = default; then
921    if test $endian = big; then
922       csc_compiler=mcs
923    elif test $endian = little; then
924       case "$host" in
925         powerpc*) csc_compiler=mcs ;;
926         *) csc_compiler=roslyn ;;
927       esac
928    else
929       csc_compiler=mcs
930    fi
932 AC_MSG_RESULT($csc_compiler)
934 AC_ARG_WITH(jemalloc,             [  --with-jemalloc=yes,no               If jemalloc is enabled (defaults to no)],                                     [], [with_jemalloc=no])
935 AC_ARG_WITH(jemalloc-always,      [  --with-jemalloc_always=yes,no        If jemalloc is enabled and always used (defaults to yes)],                    [], [with_jemalloc_always=no])
936 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])
939 if test x$target_win32 = xyes; then
940 with_jemalloc=no
941 with_jemalloc_assert=no
942 with_jemalloc_always=no
945 AM_CONDITIONAL(MONO_JEMALLOC_ASSERT, [test "x$with_jemalloc_assert" = "xyes"])
946 if test "x$with_jemalloc_assert" = "xyes"; then
947 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ASSERT"
948 AC_DEFINE(MONO_JEMALLOC_ASSERT, 1, [Make jemalloc assert for mono])
949 AC_SUBST(MONO_JEMALLOC_ASSERT, 1)
952 AM_CONDITIONAL(MONO_JEMALLOC_DEFAULT, [test "x$with_jemalloc_always" = "xyes"])
953 if test "x$with_jemalloc_always" = "xyes"; then
954 with_jemalloc=yes
955 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_DEFAULT"
956 AC_DEFINE(MONO_JEMALLOC_DEFAULT, 1, [Make jemalloc default for mono])
957 AC_SUBST(MONO_JEMALLOC_DEFAULT, 1)
960 AM_CONDITIONAL(MONO_JEMALLOC_ENABLED, [test "x$with_jemalloc" = "xyes"])
961 if test "x$with_jemalloc" = "xyes"; then
962 JEMALLOC_LDFLAGS="-L`pwd`/mono/utils/jemalloc/jemalloc/lib -ljemalloc_pic"
963 JEMALLOC_CFLAGS+=" -DMONO_JEMALLOC_ENABLED -I `pwd`/mono/utils/jemalloc/jemalloc/include"
964 JEMALLOC_AUTOCONF_FLAGS=" --build=$target --host=$host"
966 if test "x$target_mach" = "xyes"; then
967         JEMALLOC_CPPFLAGS=" -stdlib=libc++ "
970 AC_DEFINE(MONO_JEMALLOC_ENABLED, 1, [Enable jemalloc usage for mono])
971 AC_SUBST(MONO_JEMALLOC_ENABLED, 1)
973 AC_SUBST(JEMALLOC_CFLAGS)
974 AC_SUBST(JEMALLOC_CPPFLAGS)
975 AC_SUBST(JEMALLOC_LDFLAGS)
976 AC_SUBST(JEMALLOC_AUTOCONF_FLAGS)
980 # Set the build profiles and options before things which use them
983 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])
984 AC_ARG_WITH(monodroid,           [  --with-monodroid=yes,no             If you want to build the MonoDroid assemblies (defaults to no)],            [], [with_monodroid=default])
985 AC_ARG_WITH(monotouch,           [  --with-monotouch=yes,no             If you want to build the Xamarin.iOS assemblies (defaults to no)],          [], [with_monotouch=default])
986 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])
987 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])
988 AC_ARG_WITH(bitcode,             [  --with-bitcode=yes,no               If bitcode is enabled (defaults to no)],                                    [], [with_bitcode=default])
989 AC_ARG_WITH(xammac,              [  --with-xammac=yes,no                If you want to build the Xamarin.Mac assemblies (defaults to no)],          [], [with_xammac=default])
990 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])
991 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])
992 AC_ARG_WITH(winaot,              [  --with-winaot=yes,no                If you want to build the Windows friendly AOT assemblies (defaults to no)], [], [with_winaot=default])
993 AC_ARG_WITH(orbis,               [  --with-orbis=yes,no                 If you want to build the Orbis assemblies (defaults to no)], [], [with_orbis=default])
994 AC_ARG_WITH(unreal,              [  --with-unreal=yes,no                If you want to build the Unreal assemblies (defaults to no)], [], [with_unreal=default])
995 AC_ARG_WITH(wasm,                [  --with-wasm=yes,no                  If you want to build the WebAssembly (defaults to no)], [], [with_wasm=default])
998 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])
999 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])
1000 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])
1001 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])
1004 dnl Spectre compiler mitigation flag checks
1006 if test "x$with_spectre_mitigation" = "xyes"; then
1007    AC_MSG_NOTICE([Compiler Spectre mitigation support checks])
1008    SPECTRE_CFLAGS=
1009    SPECTRE_INDIRECT_BRANCH_KIND=
1010    case "x$with_spectre_indirect_branch_choice" in
1011        xkeep) SPECTRE_INDIRECT_BRANCH_KIND=keep ;;
1012        xthunk) SPECTRE_INDIRECT_BRANCH_KIND=thunk ;;
1013        xinline) SPECTRE_INDIRECT_BRANCH_KIND=thunk-inline ;;
1014        xextern) SPECTRE_INDIRECT_BRANCH_KIND=thunk-extern ;;
1015        *) AC_MSG_ERROR([Invalid indirect jump thunk kind ($with_spectre_indirect_branch_choice)]) ;;
1016    esac
1018    SPECTRE_FUNCTION_RETURN_KIND=""
1019    case "x$with_spectre_function_return_choice" in
1020        xkeep) SPECTRE_FUNCTION_RETURN_KIND=keep ;;
1021        xthunk) SPECTRE_FUNCTION_RETURN_KIND=thunk ;;
1022        xinline) SPECTRE_FUNCTION_RETURN_KIND=thunk-inline ;;
1023        xextern) SPECTRE_FUNCTION_RETURN_KIND=thunk-extern ;;
1024        *) AC_MSG_ERROR([Invalid function return thunk kind ($with_spectre_function_return_choice)]) ;;
1025    esac
1027    AX_CHECK_COMPILE_FLAG(
1028         [ -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND ],
1029         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mindirect-branch=$SPECTRE_INDIRECT_BRANCH_KIND" ]
1030    )
1032    AX_CHECK_COMPILE_FLAG(
1033         [ -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND ],
1034         [ SPECTRE_CFLAGS="$SPECTRE_CFLAGS -mfunction-return=$SPECTRE_FUNCTION_RETURN_KIND" ]
1035    )
1037    if test "x$SPECTRE_CFLAGS" != "x" ; then
1038         CFLAGS="$CFLAGS $SPECTRE_CFLAGS"
1039         CXXFLAGS="$CXXFLAGS $SPECTRE_CFLAGS"
1040         spectre_mitigation_status="mitigation enabled"
1041    fi
1042 else
1043         spectre_mitigation_status="no mitigation"
1047 dnl Profile defaults
1049 TEST_PROFILE=default
1050 enable_llvm_default=no
1052 with_profile4_x_default=no
1053 with_monodroid_default=no
1054 with_monotouch_default=no
1055 with_monotouch_watch_default=no
1056 with_monotouch_tv_default=no
1057 with_xammac_default=no
1058 with_testing_aot_hybrid_default=no
1059 with_testing_aot_full_default=no
1060 with_winaot_default=no
1061 with_orbis_default=no
1062 with_unreal_default=no
1063 with_wasm_default=no
1065 with_bitcode_default=no
1066 enable_cooperative_suspend_default=no
1068 INVARIANT_AOT_OPTIONS=nimt-trampolines=2000,ntrampolines=10000,nrgctx-fetch-trampolines=256,ngsharedvt-trampolines=4000
1070 AOT_BUILD_ATTRS=$INVARIANT_AOT_OPTIONS
1072 if test x$cross_compiling = xyes -o x$enable_mcs_build = xno; then
1073    DISABLE_MCS_DOCS_default=yes
1074 elif test x$with_runtime_preset = xnet_4_x; then
1075    with_profile4_x_default=yes
1076 elif test x$with_runtime_preset = xall; then
1077    with_profile4_x_default=yes
1078    with_monodroid_default=yes
1079    with_monotouch_default=yes
1080    with_monotouch_watch_default=yes
1081    with_monotouch_tv_default=yes
1082    with_xammac_default=yes
1083    with_winaot_default=yes
1084    with_orbis_default=yes
1085    with_unreal_default=yes
1086    with_wasm_default=yes
1087    with_testing_aot_hybrid_default=yes
1088    with_testing_aot_full_default=yes
1089 elif test x$with_runtime_preset = xbitcode; then
1090    DISABLE_MCS_DOCS_default=yes
1091    with_testing_aot_full_default=yes
1092    with_bitcode_default=yes
1093    enable_cooperative_suspend_default=yes
1094    TEST_PROFILE=testing_aot_full
1095    enable_llvm_default=yes
1097    mono_feature_disable_com='yes'
1098    mono_feature_disable_remoting='yes'
1099    mono_feature_disable_reflection_emit_save='yes'
1100    mono_feature_disable_reflection_emit='yes'
1101    mono_feature_disable_appdomains='yes'
1103    AOT_BUILD_FLAGS="--runtime=mobile --aot=llvmonly,$INVARIANT_AOT_OPTIONS"
1104    AOT_RUN_FLAGS="--runtime=mobile --llvmonly"
1105    AOT_MODE="llvmonly"
1106 elif test x$with_runtime_preset = xfullaot; then
1107    DISABLE_MCS_DOCS_default=yes
1108    with_testing_aot_full_default=yes
1109    TEST_PROFILE=testing_aot_full
1111    mono_feature_disable_com='yes'
1112    mono_feature_disable_remoting='yes'
1113    mono_feature_disable_reflection_emit_save='yes'
1114    mono_feature_disable_reflection_emit='yes'
1115    mono_feature_disable_appdomains='yes'
1117    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"
1118    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1119    AOT_MODE="full"
1120 elif test x$with_runtime_preset = xfullaot_llvm; then
1121    DISABLE_MCS_DOCS_default=yes
1122    with_testing_aot_full_default=yes
1123    TEST_PROFILE=testing_aot_full
1125    mono_feature_disable_com='yes'
1126    mono_feature_disable_remoting='yes'
1127    mono_feature_disable_reflection_emit_save='yes'
1128    mono_feature_disable_reflection_emit='yes'
1129    mono_feature_disable_appdomains='yes'
1131    AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --llvm --aot=full,$INVARIANT_AOT_OPTIONS"
1132    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1133    AOT_MODE="full"
1134 elif test x$with_runtime_preset = xhybridaot; then
1135    DISABLE_MCS_DOCS_default=yes
1136    with_testing_aot_hybrid_default=yes
1137    TEST_PROFILE=testing_aot_hybrid 
1139    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1140    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1141 elif test x$with_runtime_preset = xhybridaot_llvm; then
1142    DISABLE_MCS_DOCS_default=yes
1143    with_testing_aot_hybrid_default=yes
1144    TEST_PROFILE=testing_aot_hybrid
1146    AOT_BUILD_FLAGS="--runtime=mobile --llvm --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1147    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1148 elif test x$with_runtime_preset = xaot; then
1149    with_profile4_x_default=yes
1151    AOT_BUILD_FLAGS="--aot=$INVARIANT_AOT_OPTIONS"
1152    AOT_RUN_FLAGS=""
1154    DISABLE_MCS_DOCS_default=yes
1155 elif test x$with_runtime_preset = xaot_llvm; then
1156    with_profile4_x_default=yes
1158    AOT_BUILD_FLAGS="--llvm --aot=$INVARIANT_AOT_OPTIONS"
1159    AOT_RUN_FLAGS=""
1161    DISABLE_MCS_DOCS_default=yes
1162 elif test x$with_runtime_preset = xwinaot; then
1163    DISABLE_MCS_DOCS_default=yes
1164    with_winaot_default=yes
1165    TEST_PROFILE=winaot
1167    mono_feature_disable_com='yes'
1168    mono_feature_disable_remoting='yes'
1169    mono_feature_disable_reflection_emit_save='yes'
1170    mono_feature_disable_reflection_emit='yes'
1171    mono_feature_disable_appdomains='yes'
1173    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1174    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1175    AOT_MODE="llvmonly"
1176 elif test x$with_runtime_preset = xorbis; then
1177    DISABLE_MCS_DOCS_default=yes
1178    with_orbis_default=yes
1179    TEST_PROFILE=orbis
1181    mono_feature_disable_com='yes'
1182    mono_feature_disable_remoting='yes'
1183    mono_feature_disable_reflection_emit_save='yes'
1184    mono_feature_disable_reflection_emit='yes'
1185    mono_feature_disable_appdomains='yes'
1187    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1188    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1189    AOT_MODE="full"
1190 elif test x$with_runtime_preset = xunreal; then
1191    DISABLE_MCS_DOCS_default=yes
1192    with_unreal_default=yes
1193    TEST_PROFILE=unreal
1195    mono_feature_disable_com='yes'
1196    mono_feature_disable_remoting='yes'
1197    mono_feature_disable_appdomains='no'
1199    AOT_BUILD_FLAGS="--runtime=mobile --aot=hybrid,$INVARIANT_AOT_OPTIONS"
1200    AOT_RUN_FLAGS="--runtime=mobile --hybrid-aot"
1201 elif test x$with_runtime_preset = xwasm; then
1202    DISABLE_MCS_DOCS_default=yes
1203    with_wasm_default=yes
1204    TEST_PROFILE=wasm
1206    mono_feature_disable_com='yes'
1207    mono_feature_disable_remoting='yes'
1208    mono_feature_disable_reflection_emit_save='yes'
1209    mono_feature_disable_reflection_emit='yes'
1210    mono_feature_disable_appdomains='yes'
1212    AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
1213    AOT_RUN_FLAGS="--runtime=mobile --full-aot"
1214 else
1215    with_profile4_x_default=yes
1218 if test "x$AOT_BUILD_FLAGS" != "x"; then :
1219    AC_SUBST(AOT_BUILD_FLAGS)
1220    AC_SUBST(AOT_RUN_FLAGS)
1221    # For llvmonlycheck + fullaotcheck
1222    AC_SUBST(INVARIANT_AOT_OPTIONS)
1225 AC_SUBST(TEST_PROFILE)
1227 if test "x$with_profile4_x" = "xdefault"; then
1228    with_profile4_x=$with_profile4_x_default
1230 if test "x$with_monodroid" = "xdefault"; then
1231    with_monodroid=$with_monodroid_default
1233 if test "x$with_monotouch" = "xdefault"; then
1234    with_monotouch=$with_monotouch_default
1236 if test "x$with_monotouch_watch" = "xdefault"; then
1237    with_monotouch_watch=$with_monotouch_watch_default
1239 if test "x$with_monotouch_tv" = "xdefault"; then
1240    with_monotouch_tv=$with_monotouch_tv_default
1242 if test "x$with_bitcode" = "xdefault"; then
1243    with_bitcode=$with_bitcode_default
1245 if test "x$with_xammac" = "xdefault"; then
1246    with_xammac=$with_xammac_default
1248 if test "x$with_testing_aot_hybrid" = "xdefault"; then
1249    with_testing_aot_hybrid=$with_testing_aot_hybrid_default
1251 if test "x$with_testing_aot_full" = "xdefault"; then
1252    with_testing_aot_full=$with_testing_aot_full_default
1254 if test "x$with_winaot" = "xdefault"; then
1255    with_winaot=$with_winaot_default
1257 if test "x$with_orbis" = "xdefault"; then
1258    with_orbis=$with_orbis_default
1260 if test "x$with_unreal" = "xdefault"; then
1261    with_unreal=$with_unreal_default
1263 if test "x$with_wasm" = "xdefault"; then
1264    with_wasm=$with_wasm_default
1268 AM_CONDITIONAL(INSTALL_4_x, [test "x$with_profile4_x" = "xyes"])
1269 AM_CONDITIONAL(INSTALL_MONODROID, [test "x$with_monodroid" != "xno"])
1270 AM_CONDITIONAL(INSTALL_MONOTOUCH, [test "x$with_monotouch" != "xno"])
1271 AM_CONDITIONAL(INSTALL_MONOTOUCH_WATCH, [test "x$with_monotouch_watch" != "xno"])
1272 AM_CONDITIONAL(INSTALL_MONOTOUCH_TV, [test "x$with_monotouch_tv" != "xno"])
1273 AM_CONDITIONAL(BITCODE, test "x$with_bitcode" = "xyes")
1274 AM_CONDITIONAL(INSTALL_XAMMAC, [test "x$with_xammac" != "xno"])
1275 AM_CONDITIONAL(INSTALL_TESTING_AOT_HYBRID, [test "x$with_testing_aot_hybrid" != "xno"])
1276 AM_CONDITIONAL(INSTALL_TESTING_AOT_FULL, [test "x$with_testing_aot_full" != "xno"])
1277 AM_CONDITIONAL(INSTALL_WINAOT, [test "x$with_winaot" != "xno"])
1278 AM_CONDITIONAL(INSTALL_ORBIS, [test "x$with_orbis" != "xno"])
1279 AM_CONDITIONAL(INSTALL_UNREAL, [test "x$with_unreal" != "xno"])
1280 AM_CONDITIONAL(INSTALL_WASM, [test "x$with_wasm" != "xno"])
1281 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"])
1282 AM_CONDITIONAL(HYBRID_AOT_TESTS, [test "x$TEST_PROFILE" = "xtesting_aot_hybrid"] || [test "x$TEST_PROFILE" = "xunreal"])
1284 default_profile=net_4_x
1285 if test -z "$INSTALL_MONODROID_TRUE"; then :
1286    default_profile=monodroid
1288 if test -z "$INSTALL_MONOTOUCH_TRUE"; then :
1289    default_profile=monotouch
1291 if test -z "$INSTALL_XAMMAC_TRUE"; then :
1292    default_profile=xammac
1294 if test -z "$INSTALL_TESTING_AOT_HYBRID_TRUE"; then :
1295    default_profile=testing_aot_hybrid
1297 if test -z "$INSTALL_TESTING_AOT_FULL_TRUE"; then :
1298    default_profile=testing_aot_full
1300 if test -z "$INSTALL_WINAOT_TRUE"; then :
1301    default_profile=winaot
1303 if test -z "$INSTALL_ORBIS_TRUE"; then :
1304    default_profile=orbis
1306 if test -z "$INSTALL_UNREAL_TRUE"; then :
1307    default_profile=unreal
1309 if test -z "$INSTALL_WASM_TRUE"; then :
1310    default_profile=wasm
1312 if test -z "$INSTALL_4_x_TRUE"; then :
1313    default_profile=net_4_x
1315 DEFAULT_PROFILE=$default_profile
1316 AC_SUBST(DEFAULT_PROFILE)
1319 # End build profile configuration
1322 if test x$USE_NLS = xprofile_default; then
1324         AC_MSG_CHECKING([NLS used])
1326         # We make the default value for USE_NLS
1327         # "no" on OSX because it isn't available on most
1328         # default OSX installs. The most common configurations will
1329         # all disable it, so this saves us typing.
1330         if test x$host_darwin = xyes; then
1331                 USE_NLS=no;
1332         else
1333                 USE_NLS=yes;
1334         fi
1336         AC_SUBST([USE_NLS])
1337         AC_MSG_RESULT([$USE_NLS])
1340 AC_ARG_ENABLE(minimal, [  --enable-minimal=LIST      drop support for LIST subsystems.
1341      LIST is a comma-separated list from: aot, profiler, decimal, pinvoke, debug, appdomains, verifier, 
1342      reflection_emit, reflection_emit_save, large_code, logging, com, ssa, generics, attach, jit, interpreter, simd, soft_debug, perfcounters, normalization, desktop_loader, shared_perfcounters, remoting,
1343          security, lldb, mdb, sgen_marksweep_conc, sgen_split_nursery, sgen_gc_bridge, sgen_debug_helpers.],
1345         for feature in `echo "$enable_minimal" | sed -e "s/,/ /g"`; do
1346                 eval "mono_feature_disable_$feature='yes'"
1347         done
1348         DISABLED_FEATURES=$enable_minimal
1349         disabled="Disabled:      $enable_minimal"
1350 ],[])
1352 AC_DEFINE_UNQUOTED(DISABLED_FEATURES, "$DISABLED_FEATURES", [String of disabled features])
1354 if test "x$mono_feature_disable_aot" = "xyes"; then
1355         AC_DEFINE(DISABLE_AOT, 1, [Disable AOT Compiler])
1356         enable_system_aot=no
1357         AC_MSG_NOTICE([Disabled AOT compiler])
1360 if test "x$mono_feature_disable_profiler" = "xyes"; then
1361         AC_DEFINE(DISABLE_PROFILER, 1, [Disable default profiler support])
1362         AC_MSG_NOTICE([Disabled support for the profiler])
1364 AM_CONDITIONAL(DISABLE_PROFILER, test x$mono_feature_disable_profiler = xyes)
1366 if test "x$mono_feature_disable_decimal" = "xyes"; then
1367         AC_DEFINE(DISABLE_DECIMAL, 1, [Disable System.Decimal support])
1368         AC_MSG_NOTICE([Disabled support for decimal])
1371 if test "x$mono_feature_disable_pinvoke" = "xyes"; then
1372         AC_DEFINE(DISABLE_PINVOKE, 1, [Disable P/Invoke support])
1373         AC_MSG_NOTICE([Disabled support for P/Invoke])
1376 if test "x$mono_feature_disable_debug" = "xyes"; then
1377         AC_DEFINE(DISABLE_DEBUG, 1, [Disable runtime debugging support])
1378         AC_MSG_NOTICE([Disabled support for runtime debugging])
1381 if test "x$mono_feature_disable_reflection_emit" = "xyes"; then
1382         AC_DEFINE(DISABLE_REFLECTION_EMIT, 1, [Disable reflection emit support])
1383         mono_feature_disable_reflection_emit_save=yes
1384         AC_MSG_NOTICE([Disabled support for Reflection.Emit])
1387 if test "x$mono_feature_disable_reflection_emit_save" = "xyes"; then
1388         AC_DEFINE(DISABLE_REFLECTION_EMIT_SAVE, 1, [Disable assembly saving support in reflection emit])
1389         AC_MSG_NOTICE([Disabled support for Reflection.Emit.Save])
1392 if test "x$mono_feature_disable_large_code" = "xyes"; then
1393         AC_DEFINE(DISABLE_LARGE_CODE, 1, [Disable support for huge assemblies])
1394         AC_MSG_NOTICE([Disabled support for large assemblies])
1397 if test "x$mono_feature_disable_logging" = "xyes"; then
1398         AC_DEFINE(DISABLE_LOGGING, 1, [Disable support debug logging])
1399         AC_MSG_NOTICE([Disabled support for logging])
1402 if test "x$mono_feature_disable_com" = "xyes"; then
1403         AC_DEFINE(DISABLE_COM, 1, [Disable COM support])
1404         AC_MSG_NOTICE([Disabled COM support])
1407 if test "x$mono_feature_disable_ssa" = "xyes"; then
1408         AC_DEFINE(DISABLE_SSA, 1, [Disable advanced SSA JIT optimizations])
1409         AC_MSG_NOTICE([Disabled SSA JIT optimizations])
1412 if test "x$mono_feature_disable_generics" = "xyes"; then
1413         AC_DEFINE(DISABLE_GENERICS, 1, [Disable generics support])
1414         AC_MSG_NOTICE([Disabled Generics Support])
1417 if test "x$mono_feature_disable_shadowcopy" = "xyes"; then
1418         AC_DEFINE(DISABLE_SHADOW_COPY, 1, [Disable Shadow Copy for AppDomains])
1419         AC_MSG_NOTICE([Disabled Shadow copy for AppDomains])
1422 if test "x$mono_feature_disable_portability" = "xyes"; then
1423         AC_DEFINE(DISABLE_PORTABILITY, 1, [Disables the IO portability layer])
1424         AC_MSG_NOTICE([Disabled IO Portability layer])
1427 if test "x$mono_feature_disable_attach" = "xyes"; then
1428         AC_DEFINE(DISABLE_ATTACH, 1, [Disable agent attach support])
1429         AC_MSG_NOTICE([Disabled agent attach])
1432 if test "x$mono_feature_disable_verifier" = "xyes"; then
1433         AC_DEFINE(DISABLE_VERIFIER, 1, [Disables the verifier])
1434         AC_MSG_NOTICE([Disabled the metadata and IL verifiers])
1437 if test "x$mono_feature_disable_jit" = "xyes"; then
1438         AC_DEFINE(DISABLE_JIT, 1, [Disable the JIT, only full-aot mode or interpreter will be supported by the runtime.])
1439         AC_MSG_NOTICE([Disabled the JIT engine, only full AOT or interpreter will be supported])
1442 AM_CONDITIONAL(DISABLE_JIT, test x$mono_feature_disable_jit = xyes)
1444 if test "x$mono_feature_disable_interpreter" = "xyes"; then
1445         AC_DEFINE(DISABLE_INTERPRETER, 1, [Disable the interpreter.])
1446         AC_MSG_NOTICE([Disabled the interpreter])
1449 AM_CONDITIONAL(DISABLE_INTERPRETER, test x$mono_feature_disable_interpreter = xyes)
1451 if test "x$mono_feature_disable_interpreter" != "xyes" -o "x$mono_feature_disable_jit" != "xyes"; then
1452         AC_DEFINE(ENABLE_ILGEN, 1, [Some VES is available at runtime])
1455 AM_CONDITIONAL(ENABLE_ILGEN, test x$mono_feature_disable_interpreter != xyes -o x$mono_feature_disable_jit != xyes)
1457 if test "x$mono_feature_disable_simd" = "xyes"; then
1458         AC_DEFINE(DISABLE_SIMD, 1, [Disable SIMD intrinsics related optimizations.])
1459         AC_MSG_NOTICE([Disabled SIMD support])
1462 if test "x$mono_feature_disable_soft_debug" = "xyes"; then
1463         AC_DEFINE(DISABLE_DEBUGGER_AGENT, 1, [Disable Soft Debugger Agent.])
1464         AC_MSG_NOTICE([Disabled Soft Debugger.])
1467 AM_CONDITIONAL(DISABLE_DEBUGGER_AGENT, test x$mono_feature_disable_debugger_agent = xyes)
1469 if test "x$mono_feature_disable_perfcounters" = "xyes"; then
1470         AC_DEFINE(DISABLE_PERFCOUNTERS, 1, [Disable Performance Counters.])
1471         AC_MSG_NOTICE([Disabled Performance Counters.])
1473 if test "x$mono_feature_disable_normalization" = "xyes"; then
1474         AC_DEFINE(DISABLE_NORMALIZATION, 1, [Disable String normalization support.])
1475         AC_MSG_NOTICE([Disabled String normalization support.])
1478 #TODO: remove assembly_remapping feature name once everyone is using desktop_loader
1479 if test "x$mono_feature_disable_assembly_remapping" = "xyes" || test "x$mono_feature_disable_desktop_loader" = "xyes"; then
1480         AC_DEFINE(DISABLE_DESKTOP_LOADER, 1, [Disable desktop assembly loader semantics.])
1481         AC_MSG_NOTICE([Disabled desktop assembly loader semantics.])
1484 if test "x$mono_feature_disable_shared_perfcounters" = "xyes"; then
1485         AC_DEFINE(DISABLE_SHARED_PERFCOUNTERS, 1, [Disable shared perfcounters.])
1486         AC_MSG_NOTICE([Disabled Shared perfcounters.])
1489 if test "x$mono_feature_disable_appdomains" = "xyes"; then
1490         AC_DEFINE(DISABLE_APPDOMAINS, 1, [Disable support for multiple appdomains.])
1491         AC_MSG_NOTICE([Disabled support for multiple appdomains.])
1494 if test "x$mono_feature_disable_remoting" = "xyes"; then
1495         AC_DEFINE(DISABLE_REMOTING, 1, [Disable remoting support (This disables type proxies and make com non-functional)])
1496         AC_MSG_NOTICE([Disabled remoting])
1499 if test "x$mono_feature_disable_security" = "xyes"; then
1500         AC_DEFINE(DISABLE_SECURITY, 1, [Disable CAS/CoreCLR security])
1501         AC_MSG_NOTICE([Disabled CAS/CoreCLR security manager (used e.g. for Moonlight)])
1504 if test "x$mono_feature_disable_lldb" = "xyes"; then
1505         AC_DEFINE(DISABLE_LLDB, 1, [Disable support code for the LLDB plugin.])
1506         AC_MSG_NOTICE([Disabled LLDB plugin support code.])
1509 if test "x$mono_feature_disable_mdb" = "xyes"; then
1510         AC_DEFINE(DISABLE_MDB, 1, [Disable support for .mdb symbol files.])
1511         AC_MSG_NOTICE([Disabled support for .mdb symbol files.])
1514 if test "x$mono_feature_disable_sgen_marksweep_conc" = "xyes"; then
1515         AC_DEFINE(DISABLE_SGEN_MAJOR_MARKSWEEP_CONC, 1, [Disable concurrent gc support in SGEN.])
1516         AC_MSG_NOTICE([Disabled concurrent gc support in SGEN.])
1520 if test "x$mono_feature_disable_sgen_split_nursery" = "xyes"; then
1521         AC_DEFINE(DISABLE_SGEN_SPLIT_NURSERY, 1, [Disable minor=split support in SGEN.])
1522         AC_MSG_NOTICE([Disabled minor=split support in SGEN.])
1525 if test "x$mono_feature_disable_sgen_gc_bridge" = "xyes"; then
1526         AC_DEFINE(DISABLE_SGEN_GC_BRIDGE, 1, [Disable gc bridge support in SGEN.])
1527         AC_MSG_NOTICE([Disabled gc bridge support in SGEN.])
1530 if test "x$mono_feature_disable_sgen_debug_helpers" = "xyes"; then
1531         AC_DEFINE(DISABLE_SGEN_DEBUG_HELPERS, 1, [Disable debug helpers in SGEN.])
1532         AC_MSG_NOTICE([Disabled debug helpers in SGEN.])
1535 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
1536 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
1538 has_extension_module=no
1539 AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
1541         for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
1542                 if test x$extension = xdefault ; then
1543                         has_extension_module=yes;
1544                 fi
1545         done
1546         if test x$enable_extension_module = xyes; then
1547                 has_extension_module=yes;
1548         fi
1549 ], [])
1551 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
1553 if test x$has_extension_module != xno ; then
1554         AC_DEFINE([ENABLE_EXTENSION_MODULE], 1, [Extension module enabled])
1555         AC_MSG_NOTICE([Enabling mono extension module.])
1558 # Deprecated
1559 AC_ARG_ENABLE(gsharedvt, [  --enable-gsharedvt Enable generic valuetype sharing (Deprecated)], enable_gsharedvt=$enableval, enable_gsharedvt=no)
1561 AC_MSG_CHECKING(for visibility __attribute__)
1562 AC_COMPILE_IFELSE([
1563         AC_LANG_SOURCE([[
1564                 void __attribute__ ((visibility ("hidden"))) doit (void) {}
1565                 int main () { doit (); return 0; }
1566         ]])
1567 ], [
1568    have_visibility_hidden=yes
1569    AC_MSG_RESULT(yes)
1570 ], [
1571    have_visibility_hidden=no
1572    AC_MSG_RESULT(no)
1576 dnl Boehm GC configuration
1579 AC_ARG_WITH(libgc,   [  --with-libgc=included,none  Controls the Boehm GC config, default=included],[libgc=$with_libgc],[libgc=included])
1581 AC_ARG_ENABLE(boehm, [  --disable-boehm            Disable the Boehm GC.], support_boehm=$enableval,support_boehm=${support_boehm:-yes})
1582 AM_CONDITIONAL(SUPPORT_BOEHM, test x$support_boehm = xyes)
1584 if test "x$support_boehm" = "xyes"; then
1586         AC_ARG_ENABLE(parallel-mark, [  --enable-parallel-mark     Enables Boehm GC Parallel Marking], enable_parallel_mark=$enableval, enable_parallel_mark=$parallel_mark)
1587         if test x$enable_parallel_mark = xyes; then
1588                 libgc_configure_args="$libgc_configure_args --enable-parallel-mark"
1589         fi
1591         gc_msg=""
1592         LIBGC_CPPFLAGS=
1593         LIBGC_LIBS=
1594         LIBGC_STATIC_LIBS=
1595         libgc_dir=
1596         case "x$libgc" in
1597                 xincluded)
1598                         if test "x$support_boehm" = "xyes"; then
1599                                 libgc_dir=libgc
1600                         fi
1602                         LIBGC_CPPFLAGS='-I$(top_srcdir)/libgc/include'
1603                         LIBGC_LIBS='$(top_builddir)/libgc/libmonogc.la'
1604                         LIBGC_STATIC_LIBS='$(top_builddir)/libgc/libmonogc-static.la'
1606                         BOEHM_DEFINES="-DHAVE_BOEHM_GC"
1608                         if test x$target_win32 = xyes; then
1609                                 BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
1610                                 CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
1611                         fi
1613                         gc_msg="Included Boehm GC with typed GC"
1614                         if test x$enable_parallel_mark = xyes; then
1615                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
1616                                 gc_msg="$gc_msg and parallel mark"
1617                         else
1618                                 AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC)", [GC description])
1619                         fi
1620                         ;;
1622                 xboehm|xbohem|xyes)
1623                         AC_MSG_WARN("External Boehm is no longer supported")
1624                         ;;
1626                 xsgen)
1627                         AC_MSG_WARN("Use --with-sgen instead, --with-libgc= controls Boehm configuration")
1628                         ;;
1630                 xnone)
1631                         AC_MSG_WARN("Compiling mono without GC.")
1632                         AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description])
1633                         AC_DEFINE(HAVE_NULL_GC,1,[No GC support.])
1634                         gc_msg="none"
1635                         ;;
1636                 *)
1637                         AC_MSG_ERROR([Invalid argument $libgc to --with-libgc.])
1638                         ;;
1639         esac
1641         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])
1642         if test "x$large_heap" = "xyes"; then
1643            CPPFLAGS="$CPPFLAGS -DLARGE_CONFIG"
1644         fi
1646         AC_SUBST(LIBGC_CPPFLAGS)
1647         AC_SUBST(LIBGC_LIBS)
1648         AC_SUBST(LIBGC_STATIC_LIBS)
1649         AC_SUBST(libgc_dir)
1650         AC_SUBST(BOEHM_DEFINES)
1653 AM_CONDITIONAL(SUPPORT_NULLGC, test "x$libgc" = "xnone")
1656 dnl End of Boehm GC Configuration
1659 dnl *************************************
1660 dnl *** Checks for zero length arrays ***
1661 dnl *************************************
1662 AC_MSG_CHECKING(whether $CC supports zero length arrays)
1663 AC_TRY_COMPILE([
1664         struct s {
1665                 int  length;
1666                 char data [0];
1667         };
1668 ], [], [
1669         AC_MSG_RESULT(yes)
1670         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 0, [Length of zero length arrays])
1671 ], [
1672         AC_MSG_RESULT(no)
1673         AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
1676 dnl ***********************************
1677 dnl *** Checks for signals
1678 dnl ***********************************
1679 AC_CHECK_HEADERS(signal.h)
1680 AC_CHECK_FUNCS(sigaction)
1681 AC_CHECK_FUNCS(kill)
1682 AC_CHECK_FUNCS(signal)
1684 # signal() is declared inline in Android headers
1685 # so we need to workaround it by overriding the check.
1686 if test x$platform_android = xyes; then
1687         AC_DEFINE(HAVE_SIGNAL,1)
1690 if test x$host_win32 = xno; then
1691         dnl *************************************
1692         dnl *** Checks for time capabilities ***
1693         dnl *************************************
1695         AC_MSG_CHECKING(for CLOCK_MONOTONIC)
1696         AC_TRY_COMPILE([#include <time.h>], [
1697                 const int foo = CLOCK_MONOTONIC;
1698         ],[
1699                 AC_MSG_RESULT(yes)
1700                 AC_DEFINE(HAVE_CLOCK_MONOTONIC, 1, [CLOCK_MONOTONIC])
1701         ], [
1702                 AC_MSG_RESULT(no)
1703         ])
1705         AC_MSG_CHECKING(for CLOCK_MONOTONIC_COARSE)
1706         AC_TRY_COMPILE([#include <time.h>], [
1707                 const int foo = CLOCK_MONOTONIC_COARSE;
1708         ],[
1709                 AC_MSG_RESULT(yes)
1710                 AC_DEFINE(HAVE_CLOCK_MONOTONIC_COARSE, 1, [CLOCK_MONOTONIC_COARSE])
1711         ], [
1712                 AC_MSG_RESULT(no)
1713         ])
1715         AC_CHECK_FUNC(mach_absolute_time, [AC_DEFINE(HAVE_MACH_ABSOLUTE_TIME, 1, [mach_absolute_time])])
1716         AC_CHECK_FUNC(gethrtime, [AC_DEFINE(HAVE_GETHRTIME, 1, [gethrtime])])
1717         AC_CHECK_FUNC(read_real_time, [AC_DEFINE(HAVE_READ_REAL_TIME, 1, [read_real_time])])
1719         dnl hires monotonic clock support
1720         AC_SEARCH_LIBS(clock_gettime, rt)
1721         AC_CHECK_FUNCS(clock_nanosleep)
1723         dnl dynamic loader support
1724         AC_CHECK_FUNC(dlopen, DL_LIB="",
1725                 AC_CHECK_LIB(dl, dlopen, DL_LIB="-ldl", dl_support=no)
1726         )
1727         if test x$dl_support = xno; then
1728                 AC_MSG_WARN([No dynamic loading support available])
1729         else
1730                 LIBS="$LIBS $DL_LIB"
1731                 AC_DEFINE(HAVE_DL_LOADER,1,[dlopen-based dynamic loader available])
1732                 dnl from glib's configure.ac
1733                 AC_CACHE_CHECK([for preceeding underscore in symbols],
1734                         mono_cv_uscore,[
1735                         AC_TRY_RUN([#include <dlfcn.h>
1736                         int mono_underscore_test (void) { return 42; }
1737                         int main() {
1738                           void *f1 = (void*)0, *f2 = (void*)0, *handle;
1739                           handle = dlopen ((void*)0, 0);
1740                           if (handle) {
1741                             f1 = dlsym (handle, "mono_underscore_test");
1742                             f2 = dlsym (handle, "_mono_underscore_test");
1743                           } return (!f2 || f1);
1744                         }],
1745                                 [mono_cv_uscore=yes],
1746                                 [mono_cv_uscore=no],
1747                         [])
1748                 ])
1749                 if test "x$mono_cv_uscore" = "xyes"; then
1750                         MONO_DL_NEED_USCORE=1
1751                 else
1752                         MONO_DL_NEED_USCORE=0
1753                 fi
1754                 AC_SUBST(MONO_DL_NEED_USCORE)
1755                 AC_CHECK_FUNC(dlerror)
1756         fi
1758         dnl ******************************************************************
1759         dnl *** Checks for the IKVM JNI interface library                  ***
1760         dnl ******************************************************************
1761         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])
1763         ikvm_native_dir=
1764         if test x$with_ikvm_native = xyes; then
1765                 ikvm_native_dir=ikvm-native
1766                 jdk_headers_found="IKVM Native"
1767         fi
1769         AC_SUBST(ikvm_native_dir)
1771         AC_CHECK_HEADERS(execinfo.h)
1773         AC_CHECK_HEADERS(sys/auxv.h sys/resource.h)
1775         AC_CHECK_FUNCS(getgrgid_r)
1776         AC_CHECK_FUNCS(getgrnam_r)
1777         AC_CHECK_FUNCS(getresuid)
1778         AC_CHECK_FUNCS(setresuid)
1779         AC_CHECK_FUNCS(kqueue)
1780         AC_CHECK_FUNCS(backtrace_symbols)
1781         AC_CHECK_FUNCS(mkstemp)
1782         AC_CHECK_FUNCS(mmap)
1783         AC_CHECK_FUNCS(madvise)
1784         AC_CHECK_FUNCS(getrusage)
1785         AC_CHECK_FUNCS(getpriority)
1786         AC_CHECK_FUNCS(setpriority)
1787         AC_CHECK_FUNCS(dl_iterate_phdr)
1788         AC_CHECK_FUNCS(dladdr)
1789         AC_CHECK_FUNCS(sysconf)
1790         AC_CHECK_FUNCS(getrlimit)
1791         AC_CHECK_FUNCS(prctl)
1793         AC_CHECK_FUNCS(sched_getaffinity)
1794         AC_CHECK_FUNCS(sched_setaffinity)
1795         AC_CHECK_FUNCS(sched_getcpu)
1797         if test x$platform_android != xyes; then
1798                 AC_CHECK_FUNCS(getpwnam_r)
1799                 AC_CHECK_FUNCS(getpwuid_r)
1800         fi
1802         AC_FUNC_STRERROR_R()
1804         dnl ****************************************************************
1805         dnl *** Check for sched_setaffinity from glibc versions before   ***
1806         dnl *** 2.3.4. The older versions of the function only take 2    ***
1807         dnl *** parameters, not 3.                                       ***
1808         dnl ***                                                          ***
1809         dnl *** Because the interface change was not made in a minor     ***
1810         dnl *** version rev, the __GLIBC__ and __GLIBC_MINOR__ macros    ***
1811         dnl *** won't always indicate the interface sched_affinity has.  ***
1812         dnl ****************************************************************
1813         AC_MSG_CHECKING(for sched_setaffinity from glibc < 2.3.4)
1814         AC_TRY_COMPILE([#include <sched.h>], [
1815             int mask = 1; 
1816             sched_setaffinity(0, &mask);
1817         ], [
1818                 # Yes, we have it...
1819                 AC_MSG_RESULT(yes)
1820                 AC_DEFINE(GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY, 1, [Have GLIBC_BEFORE_2_3_4_SCHED_SETAFFINITY])
1821         ], [
1822                 # We have the new, three-parameter version
1823                 AC_MSG_RESULT(no)
1824         ])
1825         AC_TRY_COMPILE([#include <sched.h>], [
1826              CPU_COUNT((void *) 0);
1827         ], [
1828                 AC_MSG_RESULT(yes)
1829                 AC_DEFINE(GLIBC_HAS_CPU_COUNT, 1, [GLIBC has CPU_COUNT macro in sched.h])
1830         ], [
1831                 # We have the new, three-parameter version
1832                 AC_MSG_RESULT(no)
1833         ])
1835         dnl ******************************************************************
1836         dnl *** Check for large file support                               ***
1837         dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
1838         dnl ******************************************************************
1839         
1840         # Check that off_t can represent 2**63 - 1 correctly, working around
1841         # potential compiler bugs.  Defines LARGE_FILE_SUPPORT, adds $1 to
1842         # CPPFLAGS and sets $large_offt to yes if the test succeeds
1843         large_offt=no
1844         AC_DEFUN([LARGE_FILES], [
1845                 large_CPPFLAGS=$CPPFLAGS
1846                 CPPFLAGS="$CPPFLAGS $1"
1847                 AC_TRY_COMPILE([
1848                         #include <sys/types.h>
1849                         #include <limits.h>
1850                 ], [
1851                         /* Lifted this compile time assert method from: http://www.jaggersoft.com/pubs/CVu11_3.html */
1852                         #define COMPILE_TIME_ASSERT(pred) \
1853                                 switch(0){case 0:case pred:;}
1854                         COMPILE_TIME_ASSERT(sizeof(off_t) * CHAR_BIT == 64);
1855                 ], [
1856                         AC_MSG_RESULT(ok)
1857                         AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
1858                         large_CPPFLAGS="$large_CPPFLAGS $1"
1859                         large_offt=yes
1860                 ], [
1861                         AC_MSG_RESULT(no)
1862                 ])
1863                 CPPFLAGS=$large_CPPFLAGS
1864         ])
1866         AC_MSG_CHECKING(if off_t is 64 bits wide)
1867         LARGE_FILES("")
1868         if test $large_offt = no; then
1869                 AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
1870                 LARGE_FILES("-D_FILE_OFFSET_BITS=64")
1871         fi
1872         if test $large_offt = no; then
1873                 AC_MSG_WARN([No 64 bit file size support available])
1874         fi
1875         
1876         dnl *****************************
1877         dnl *** Checks for libsocket  ***
1878         dnl *****************************
1879         AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
1881         case "$host" in
1882                 *-*-*freebsd*)
1883                         dnl *****************************
1884                         dnl *** Checks for libinotify ***
1885                         dnl *****************************
1886                         AC_CHECK_LIB(inotify, inotify_init, LIBS="$LIBS -linotify")
1887         esac
1889         dnl *******************************
1890         dnl *** Checks for MSG_NOSIGNAL ***
1891         dnl *******************************
1892         AC_MSG_CHECKING(for MSG_NOSIGNAL)
1893         AC_TRY_COMPILE([#include <sys/socket.h>], [
1894                 int f = MSG_NOSIGNAL;
1895         ], [
1896                 # Yes, we have it...
1897                 AC_MSG_RESULT(yes)
1898                 AC_DEFINE(HAVE_MSG_NOSIGNAL, 1, [Have MSG_NOSIGNAL])
1899         ], [
1900                 # We'll have to use signals
1901                 AC_MSG_RESULT(no)
1902         ])
1904         dnl *****************************
1905         dnl *** Checks for IPPROTO_IP ***
1906         dnl *****************************
1907         AC_MSG_CHECKING(for IPPROTO_IP)
1908         AC_TRY_COMPILE([#include <netinet/in.h>], [
1909                 int level = IPPROTO_IP;
1910         ], [
1911                 # Yes, we have it...
1912                 AC_MSG_RESULT(yes)
1913                 AC_DEFINE(HAVE_IPPROTO_IP, 1, [Have IPPROTO_IP])
1914         ], [
1915                 # We'll have to use getprotobyname
1916                 AC_MSG_RESULT(no)
1917         ])
1919         dnl *******************************
1920         dnl *** Checks for IPPROTO_IPV6 ***
1921         dnl *******************************
1922         AC_MSG_CHECKING(for IPPROTO_IPV6)
1923         AC_TRY_COMPILE([#include <netinet/in.h>], [
1924                 int level = IPPROTO_IPV6;
1925         ], [
1926                 # Yes, we have it...
1927                 AC_MSG_RESULT(yes)
1928                 AC_DEFINE(HAVE_IPPROTO_IPV6, 1, [Have IPPROTO_IPV6])
1929         ], [
1930                 # We'll have to use getprotobyname
1931                 AC_MSG_RESULT(no)
1932         ])
1934         dnl ******************************
1935         dnl *** Checks for IPPROTO_TCP ***
1936         dnl ******************************
1937         AC_MSG_CHECKING(for IPPROTO_TCP)
1938         AC_TRY_COMPILE([#include <netinet/in.h>], [
1939                 int level = IPPROTO_TCP;
1940         ], [
1941                 # Yes, we have it...
1942                 AC_MSG_RESULT(yes)
1943                 AC_DEFINE(HAVE_IPPROTO_TCP, 1, [Have IPPROTO_TCP])
1944         ], [
1945                 # We'll have to use getprotobyname
1946                 AC_MSG_RESULT(no)
1947         ])
1949         dnl *****************************
1950         dnl *** Checks for SOL_IP     ***
1951         dnl *****************************
1952         AC_MSG_CHECKING(for SOL_IP)
1953         AC_TRY_COMPILE([#include <netdb.h>], [
1954                 int level = SOL_IP;
1955         ], [
1956                 # Yes, we have it...
1957                 AC_MSG_RESULT(yes)
1958                 AC_DEFINE(HAVE_SOL_IP, 1, [Have SOL_IP])
1959         ], [
1960                 # We'll have to use getprotobyname
1961                 AC_MSG_RESULT(no)
1962         ])
1964         dnl *****************************
1965         dnl *** Checks for SOL_IPV6     ***
1966         dnl *****************************
1967         AC_MSG_CHECKING(for SOL_IPV6)
1968         AC_TRY_COMPILE([#include <netdb.h>], [
1969                 int level = SOL_IPV6;
1970         ], [
1971                 # Yes, we have it...
1972                 AC_MSG_RESULT(yes)
1973                 AC_DEFINE(HAVE_SOL_IPV6, 1, [Have SOL_IPV6])
1974         ], [
1975                 # We'll have to use getprotobyname
1976                 AC_MSG_RESULT(no)
1977         ])
1979         dnl *****************************
1980         dnl *** Checks for SOL_TCP    ***
1981         dnl *****************************
1982         AC_MSG_CHECKING(for SOL_TCP)
1983         AC_TRY_COMPILE([#include <netdb.h>], [
1984                 int level = SOL_TCP;
1985         ], [
1986                 # Yes, we have it...
1987                 AC_MSG_RESULT(yes)
1988                 AC_DEFINE(HAVE_SOL_TCP, 1, [Have SOL_TCP])
1989         ], [
1990                 # We'll have to use getprotobyname
1991                 AC_MSG_RESULT(no)
1992         ])
1994         dnl *****************************
1995         dnl *** Checks for IP_PKTINFO ***
1996         dnl *****************************
1997         AC_MSG_CHECKING(for IP_PKTINFO)
1998         AC_TRY_COMPILE([#include <linux/in.h>], [
1999                 int level = IP_PKTINFO;
2000         ], [
2001                 # Yes, we have it...
2002                 AC_MSG_RESULT(yes)
2003                 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
2004         ], [
2005                 AC_MSG_RESULT(no)
2006         ])
2008         dnl *****************************
2009         dnl *** Checks for IPV6_PKTINFO ***
2010         dnl *****************************
2011         AC_MSG_CHECKING(for IPV6_PKTINFO)
2012         AC_TRY_COMPILE([#include <netdb.h>], [
2013                 int level = IPV6_PKTINFO;
2014         ], [
2015                 # Yes, we have it...
2016                 AC_MSG_RESULT(yes)
2017                 AC_DEFINE(HAVE_IPV6_PKTINFO, 1, [Have IPV6_PKTINFO])
2018         ], [
2019                 AC_MSG_RESULT(no)
2020         ])
2022         dnl **********************************
2023         dnl *** Checks for IP_DONTFRAG     ***
2024         dnl **********************************
2025         AC_MSG_CHECKING(for IP_DONTFRAG)
2026         AC_TRY_COMPILE([#include <netinet/in.h>], [
2027                 int level = IP_DONTFRAG;
2028         ], [
2029                 # Yes, we have it...
2030                 AC_MSG_RESULT(yes)
2031                 AC_DEFINE(HAVE_IP_DONTFRAG, 1, [Have IP_DONTFRAG])
2032         ], [
2033                 AC_MSG_RESULT(no)
2034         ])
2036         dnl **********************************
2037         dnl *** Checks for IP_DONTFRAGMENT ***
2038         dnl **********************************
2039         AC_MSG_CHECKING(for IP_DONTFRAGMENT)
2040         AC_TRY_COMPILE([#include <Ws2ipdef.h>], [
2041                 int level = IP_DONTFRAGMENT;
2042         ], [
2043                 # Yes, we have it...
2044                 AC_MSG_RESULT(yes)
2045                 AC_DEFINE(HAVE_IP_DONTFRAGMENT, 1, [Have IP_DONTFRAGMENT])
2046         ], [
2047                 AC_MSG_RESULT(no)
2048         ])
2050         dnl **********************************
2051         dnl *** Checks for IP_MTU_DISCOVER ***
2052         dnl **********************************
2053         AC_MSG_CHECKING(for IP_MTU_DISCOVER)
2054         AC_TRY_COMPILE([#include <linux/in.h>], [
2055                 int level = IP_MTU_DISCOVER;
2056         ], [
2057                 # Yes, we have it...
2058                 AC_MSG_RESULT(yes)
2059                 AC_DEFINE(HAVE_IP_MTU_DISCOVER, 1, [Have IP_MTU_DISCOVER])
2060         ], [
2061                 AC_MSG_RESULT(no)
2062         ])
2064         dnl **********************************
2065         dnl *** Checks for  IP_PMTUDISC_DO ***
2066         dnl **********************************
2067         AC_MSG_CHECKING(for IP_PMTUDISC_DO)
2068         AC_TRY_COMPILE([#include <linux/in.h>], [
2069                 int level = IP_PMTUDISC_DO;
2070         ], [
2071                 # Yes, we have it...
2072                 AC_MSG_RESULT(yes)
2073                 AC_DEFINE(HAVE_IP_PMTUDISC_DO, 1, [Have IP_PMTUDISC_DO])
2074         ], [
2075                 AC_MSG_RESULT(no)
2076         ])
2078         dnl *********************************
2079         dnl *** Check for struct ip_mreqn ***
2080         dnl *********************************
2081         AC_MSG_CHECKING(for struct ip_mreqn)
2082         AC_TRY_COMPILE([#include <netinet/in.h>], [
2083                 struct ip_mreqn mreq;
2084                 mreq.imr_address.s_addr = 0;
2085         ], [
2086                 # Yes, we have it...
2087                 AC_MSG_RESULT(yes)
2088                 AC_DEFINE(HAVE_STRUCT_IP_MREQN, 1, [Have struct ip_mreqn])
2089         ], [
2090                 # We'll just have to try and use struct ip_mreq
2091                 AC_MSG_RESULT(no)
2092                 AC_MSG_CHECKING(for struct ip_mreq)
2093                 AC_TRY_COMPILE([#include <netinet/in.h>], [
2094                         struct ip_mreq mreq;
2095                         mreq.imr_interface.s_addr = 0;
2096                 ], [
2097                         # Yes, we have it...
2098                         AC_MSG_RESULT(yes)
2099                         AC_DEFINE(HAVE_STRUCT_IP_MREQ, 1, [Have struct ip_mreq])
2100                 ], [
2101                         # No multicast support
2102                         AC_MSG_RESULT(no)
2103                 ])
2104         ])
2105         
2106         dnl **********************************
2107         dnl *** Check for getaddrinfo ***
2108         dnl **********************************
2109         AC_MSG_CHECKING(for getaddrinfo)
2110                 AC_TRY_LINK([
2111                 #include <stdio.h>
2112                 #include <netdb.h>
2113         ], [
2114                 getaddrinfo(NULL,NULL,NULL,NULL);
2115         ], [
2116                 # Yes, we have it...
2117                 AC_MSG_RESULT(yes)
2118                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2119         ], [
2120                 AC_MSG_RESULT(no)
2121         ])
2123         dnl **********************************
2124         dnl *** Check for gethostbyname2_r ***
2125         dnl **********************************
2126         AC_MSG_CHECKING(for gethostbyname2_r)
2127                 AC_TRY_LINK([
2128                 #include <stdio.h>
2129                 #include <netdb.h>
2130         ], [
2132                 gethostbyname2_r(NULL,0,NULL,NULL,0,NULL,NULL);
2133         ], [
2134                 # Yes, we have it...
2135                 AC_MSG_RESULT(yes)
2136                 AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [Have gethostbyname2_r])
2137         ], [
2138                 AC_MSG_RESULT(no)
2139         ])
2141         dnl **********************************
2142         dnl *** Check for gethostbyname2 ***
2143         dnl **********************************
2144         AC_MSG_CHECKING(for gethostbyname2)
2145                 AC_TRY_LINK([
2146                 #include <stdio.h>
2147                 #include <netdb.h>
2148         ], [
2149                 gethostbyname2(NULL,0);
2150         ], [
2151                 # Yes, we have it...
2152                 AC_MSG_RESULT(yes)
2153                 AC_DEFINE(HAVE_GETHOSTBYNAME2, 1, [Have gethostbyname2])
2154         ], [
2155                 AC_MSG_RESULT(no)
2156         ])
2158         dnl **********************************
2159         dnl *** Check for gethostbyname ***
2160         dnl **********************************
2161         AC_MSG_CHECKING(for gethostbyname)
2162                 AC_TRY_LINK([
2163                 #include <stdio.h>
2164                 #include <netdb.h>
2165         ], [
2166                 gethostbyname(NULL);
2167         ], [
2168                 # Yes, we have it...
2169                 AC_MSG_RESULT(yes)
2170                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2171         ], [
2172                 AC_MSG_RESULT(no)
2173         ])
2175         dnl **********************************
2176         dnl *** Check for getprotobyname ***
2177         dnl **********************************
2178         AC_MSG_CHECKING(for getprotobyname)
2179                 AC_TRY_LINK([
2180                 #include <stdio.h>
2181                 #include <netdb.h>
2182         ], [
2183                 getprotobyname(NULL);
2184         ], [
2185                 # Yes, we have it...
2186                 AC_MSG_RESULT(yes)
2187                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2188         ], [
2189                 AC_MSG_RESULT(no)
2190         ])
2192         dnl **********************************
2193         dnl *** Check for getnameinfo ***
2194         dnl **********************************
2195         AC_MSG_CHECKING(for getnameinfo)
2196                 AC_TRY_LINK([
2197                 #include <stdio.h>
2198                 #include <netdb.h>
2199         ], [
2200                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2201         ], [
2202                 # Yes, we have it...
2203                 AC_MSG_RESULT(yes)
2204                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2205         ], [
2206                 AC_MSG_RESULT(no)
2207         ])
2210         dnl **********************************
2211         dnl *** Check for inet_ntop ***
2212         dnl **********************************
2213         AC_MSG_CHECKING(for inet_ntop)
2214                 AC_TRY_LINK([
2215                 #include <stdio.h>
2216                 #include <arpa/inet.h>
2217         ], [
2218                 inet_ntop (0, NULL, NULL, 0);
2219         ], [
2220                 # Yes, we have it...
2221                 AC_MSG_RESULT(yes)
2222                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2223         ], [
2224                 AC_MSG_RESULT(no)
2225         ])
2227         dnl *****************************
2228         dnl *** Checks for libnsl     ***
2229         dnl *****************************
2230         AC_CHECK_FUNC(gethostbyaddr, , AC_CHECK_LIB(nsl, gethostbyaddr, LIBS="$LIBS -lnsl"))
2232         AC_CHECK_FUNCS(inet_pton inet_aton)
2234         dnl *****************************
2235         dnl *** Checks for libxnet    ***
2236         dnl *****************************
2237         case "${host}" in
2238                 *solaris* )
2239                         AC_MSG_CHECKING(for Solaris XPG4 support)
2240                         if test -f /usr/lib/libxnet.so; then
2241                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=500"
2242                                 CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
2243                                 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=1"
2244                                 LIBS="$LIBS -lxnet"
2245                                 AC_MSG_RESULT(yes)
2246                         else
2247                                 AC_MSG_RESULT(no)
2248                         fi
2250                         if test "$GCC" = "yes"; then
2251                                 CFLAGS="$CFLAGS -Wno-char-subscripts"
2252                         fi
2253                 ;;
2254         esac
2256         dnl *****************************
2257         dnl *** Checks for libpthread ***
2258         dnl *****************************
2259 # on FreeBSD -STABLE, the pthreads functions all reside in libc_r
2260 # and libpthread does not exist
2262         case "${host}" in
2263                 *-*-*haiku*)
2264                         dnl Haiku has pthread in libroot (libc equiv)
2265                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS")
2266                 ;;
2267                 *-*-*freebsd*)
2268                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2269                 ;;
2270                 *-*-*openbsd*)
2271                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread")
2272                 ;;
2273                 *)
2274                         AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread")
2275                 ;;
2276         esac
2277         AC_CHECK_HEADERS(pthread.h)
2278         AC_CHECK_HEADERS(pthread_np.h)
2279         AC_CHECK_FUNCS(pthread_mutex_timedlock)
2280         AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_setname_np pthread_cond_timedwait_relative_np)
2281         AC_CHECK_FUNCS(pthread_kill)
2282         AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE)
2283         AC_TRY_COMPILE([ #include <pthread.h>], [
2284                 pthread_mutexattr_t attr;
2285                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
2286         ], [
2287                 AC_MSG_RESULT(ok)
2288         ], [
2289                 AC_MSG_RESULT(no)
2290                 AC_ERROR(Posix system lacks support for recursive mutexes)
2291         ])
2292         AC_CHECK_FUNCS(pthread_attr_setstacksize)
2293         AC_CHECK_FUNCS(pthread_attr_getstack pthread_attr_getstacksize)
2294         AC_CHECK_FUNCS(pthread_get_stacksize_np pthread_get_stackaddr_np)
2296         dnl **********************************
2297         dnl *** Check for mincore ***
2298         dnl **********************************
2299         AC_MSG_CHECKING(for mincore)
2300                 AC_TRY_LINK([
2301                 #include <stdio.h>
2302                 #include <sys/types.h>
2303                 #include <sys/mman.h>
2304         ], [
2305                 mincore(NULL, 0, NULL);
2306         ], [
2307                 # Yes, we have it...
2308                 AC_MSG_RESULT(yes)
2309                 AC_DEFINE(HAVE_MINCORE, 1, [Have mincore])
2310         ], [
2311                 AC_MSG_RESULT(no)
2312         ])
2314         dnl ***********************************
2315         dnl *** Checks for working __thread ***
2316         dnl ***********************************
2317         AC_MSG_CHECKING(for working __thread)
2318         if test "x$with_tls" != "x__thread"; then
2319                 AC_MSG_RESULT(disabled)
2320         elif test "x$cross_compiling" = "xyes"; then
2321                 AC_MSG_RESULT(cross compiling, assuming yes)
2322         else
2323                 AC_TRY_RUN([
2324                         #if defined(__APPLE__) && defined(__clang__)
2325                         #error "__thread does not currently work with clang on Mac OS X"
2326                         #endif
2327                         
2328                         #include <pthread.h>
2329                         __thread int i;
2330                         static int res1, res2;
2332                         void thread_main (void *arg)
2333                         {
2334                                 i = arg;
2335                                 sleep (1);
2336                                 if (arg == 1)
2337                                         res1 = (i == arg);
2338                                 else
2339                                         res2 = (i == arg);
2340                         }
2342                         int main () {
2343                                 pthread_t t1, t2;
2345                                 i = 5;
2347                                 pthread_create (&t1, NULL, thread_main, 1);
2348                                 pthread_create (&t2, NULL, thread_main, 2);
2350                                 pthread_join (t1, NULL);
2351                                 pthread_join (t2, NULL);
2353                                 return !(res1 + res2 == 2);
2354                         }
2355                 ], [
2356                                 AC_MSG_RESULT(yes)
2357                 ], [
2358                                 AC_MSG_RESULT(no)
2359                                 with_tls=pthread
2360                 ])
2361         fi
2363         dnl **************************************
2364         dnl *** Checks for working sigaltstack ***
2365         dnl **************************************
2366         AC_MSG_CHECKING(for working sigaltstack)
2367         if test "x$with_sigaltstack" != "xyes"; then
2368                 AC_MSG_RESULT(disabled)
2369         elif test "x$cross_compiling" = "xyes"; then
2370                 AC_MSG_RESULT(cross compiling, assuming yes)
2371         else
2372                 AC_TRY_RUN([
2373                         #include <stdio.h>
2374                         #include <stdlib.h>
2375                         #include <unistd.h>
2376                         #include <signal.h>
2377                         #include <pthread.h>
2378                         #include <sys/wait.h>
2379                         #if defined(__FreeBSD__) || defined(__NetBSD__)
2380                         #define SA_STACK SA_ONSTACK
2381                         #endif
2382                         static void
2383                         sigsegv_signal_handler (int _dummy, siginfo_t *info, void *context)
2384                         {
2385                                 exit (0);
2386                         }
2388                         volatile char*__ptr = NULL;
2389                         static void *
2390                         loop (void *ignored)
2391                         {
2392                                 *__ptr = 0;
2393                                 return NULL;
2394                         }
2396                         static void
2397                         child ()
2398                         {
2399                                 struct sigaction sa;
2400                                 stack_t sas;
2401                                 pthread_t id;
2402                                 pthread_attr_t attr;
2404                                 sa.sa_sigaction = sigsegv_signal_handler;
2405                                 sigemptyset (&sa.sa_mask);
2406                                 sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
2407                                 if (sigaction (SIGSEGV, &sa, NULL) == -1) {
2408                                         perror ("sigaction");
2409                                         return;
2410                                 }
2412                                 /* x86 darwin deliver segfaults using SIGBUS */
2413                                 if (sigaction (SIGBUS, &sa, NULL) == -1) {
2414                                         perror ("sigaction");
2415                                         return;
2416                                 }
2417                                 sas.ss_sp = malloc (SIGSTKSZ);
2418                                 sas.ss_size = SIGSTKSZ;
2419                                 sas.ss_flags = 0;
2420                                 if (sigaltstack (&sas, NULL) == -1) {
2421                                         perror ("sigaltstack");
2422                                         return;
2423                                 }
2425                                 pthread_attr_init (&attr);
2426                                 if (pthread_create(&id, &attr, loop, &attr) != 0) {
2427                                         printf ("pthread_create\n");
2428                                         return;
2429                                 }
2431                                 sleep (100);
2432                         }
2434                         int
2435                         main ()
2436                         {
2437                                 pid_t son;
2438                                 int status;
2439                                 int i;
2441                                 son = fork ();
2442                                 if (son == -1) {
2443                                         return 1;
2444                                 }
2446                                 if (son == 0) {
2447                                         child ();
2448                                         return 0;
2449                                 }
2451                                 for (i = 0; i < 300; ++i) {
2452                                         waitpid (son, &status, WNOHANG);
2453                                         if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
2454                                                 return 0;
2455                                         usleep (10000);
2456                                 }
2458                                 kill (son, SIGKILL);
2459                                 return 1;
2460                         }
2462                 ], [
2463                                 AC_MSG_RESULT(yes)
2464                                 AC_DEFINE(HAVE_WORKING_SIGALTSTACK, 1, [Have a working sigaltstack])
2465                 ], [
2466                                 with_sigaltstack=no
2467                                 AC_MSG_RESULT(no)
2468                 ])
2469         fi
2471         dnl ********************************
2472         dnl *** Checks for semaphore lib ***
2473         dnl ********************************
2474         # 'Real Time' functions on Solaris
2475         # posix4 on Solaris 2.6
2476         # pthread (first!) on Linux
2477         AC_SEARCH_LIBS(sem_init, pthread rt posix4) 
2479         AC_SEARCH_LIBS(shm_open, pthread rt posix4) 
2480         AC_CHECK_FUNCS(shm_open)
2482         dnl ********************************
2483         dnl *** Checks for timezone stuff **
2484         dnl ********************************
2485         AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
2486                 AC_TRY_COMPILE([
2487                         #include <time.h>
2488                         ], [
2489                         struct tm tm;
2490                         tm.tm_gmtoff = 1;
2491                         ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
2492         if test $ac_cv_struct_tm_gmtoff = yes; then
2493                 AC_DEFINE(HAVE_TM_GMTOFF, 1, [Have tm_gmtoff])
2494         else
2495                 AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
2496                         AC_TRY_COMPILE([
2497                                 #include <time.h>
2498                         ], [
2499                                 timezone = 1;
2500                         ], ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
2501                 if test $ac_cv_var_timezone = yes; then
2502                         AC_DEFINE(HAVE_TIMEZONE, 1, [Have timezone variable])
2503                 else
2504                         AC_ERROR(unable to find a way to determine timezone)
2505                 fi
2506         fi
2508         dnl *********************************
2509         dnl *** Checks for math functions ***
2510         dnl *********************************
2511         AC_SEARCH_LIBS(sqrtf, m)
2512         if test "x$has_broken_apple_cpp" != "xyes"; then
2513                 AC_CHECK_FUNCS(finite, , AC_MSG_CHECKING(for finite in math.h)
2514                         AC_TRY_LINK([#include <math.h>], 
2515                         [ finite(0.0); ], 
2516                         AC_DEFINE(HAVE_FINITE, 1, [Have finite in -lm]) AC_MSG_RESULT(yes),
2517                         AC_MSG_RESULT(no)))
2518         fi
2519         AC_CHECK_FUNCS(isfinite, , AC_MSG_CHECKING(for isfinite in math.h)
2520                 AC_TRY_LINK([#include <math.h>], 
2521                 [ isfinite(0.0); ], 
2522                 AC_DEFINE(HAVE_ISFINITE, 1, [Have isfinite]) AC_MSG_RESULT(yes),
2523                 AC_MSG_RESULT(no)))
2525         dnl ****************************************************************
2526         dnl *** Checks for working poll() (macosx defines it but doesn't ***
2527         dnl *** have it in the library (duh))                            ***
2528         dnl ****************************************************************
2529         AC_CHECK_FUNCS(poll)
2531         dnl *************************
2532         dnl *** Check for signbit ***
2533         dnl *************************
2534         AC_MSG_CHECKING(for signbit)
2535         AC_TRY_LINK([#include <math.h>], [
2536                 int s = signbit(1.0);
2537         ], [
2538                 AC_MSG_RESULT(yes)
2539                 AC_DEFINE(HAVE_SIGNBIT, 1, [Have signbit])
2540         ], [
2541                 AC_MSG_RESULT(no)
2542         ]) 
2544         dnl **********************************
2545         dnl *** epoll                      ***
2546         dnl **********************************
2547         AC_CHECK_HEADERS(sys/epoll.h)
2548         haveepoll=no
2549         AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
2550         if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
2551                 AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
2552         fi
2554         havekqueue=no
2556         AC_CHECK_HEADERS(sys/event.h)
2557         AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
2559         dnl **************************************
2560         dnl * Darwin has a race that prevents us from using reliably:
2561         dnl * http://lists.apple.com/archives/darwin-dev/2011/Jun/msg00016.html
2562         dnl * Since kqueue is mostly used for scaling large web servers, 
2563         dnl * and very few folks run Mono on large web servers on OSX, falling
2564         dnl * back 
2565         dnl **************************************
2566         if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
2567                 if test "x$host_darwin" = "xno"; then
2568                         AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
2569                 fi
2570         fi
2572         dnl ******************************
2573         dnl *** Checks for SIOCGIFCONF ***
2574         dnl ******************************
2575         AC_CHECK_HEADERS(sys/ioctl.h)
2576         AC_CHECK_HEADERS(net/if.h, [], [],
2577            [
2578            #ifdef HAVE_SYS_TYPES_H
2579            # include <sys/types.h>
2580            #endif
2581            #ifdef HAVE_SYS_SOCKET_H
2582            # include <sys/socket.h>
2583            #endif
2584            ])
2585         AC_MSG_CHECKING(for ifreq)
2586         AC_TRY_COMPILE([
2587                 #include <stdio.h>
2588                 #include <sys/ioctl.h>
2589                 #include <net/if.h>
2590                 ], [
2591                 struct ifconf ifc;
2592                 struct ifreq *ifr;
2593                 void *x;
2594                 ifc.ifc_len = 0;
2595                 ifc.ifc_buf = NULL;
2596                 x = (void *) &ifr->ifr_addr;
2597                 ],[
2598                         AC_MSG_RESULT(yes)
2599                         AC_DEFINE(HAVE_SIOCGIFCONF, 1, [Can get interface list])
2600                 ], [
2601                         AC_MSG_RESULT(no)
2602                 ])
2603         dnl **********************************
2604         dnl ***     Checks for sin_len     ***
2605         dnl **********************************
2606         AC_MSG_CHECKING(for sockaddr_in.sin_len)
2607         AC_TRY_COMPILE([
2608                 #include <netinet/in.h>
2609                 ], [
2610                 struct sockaddr_in saddr;
2611                 saddr.sin_len = sizeof (saddr);
2612                 ],[
2613                         AC_MSG_RESULT(yes)
2614                         AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [sockaddr_in has sin_len])
2615                 ], [
2616                         AC_MSG_RESULT(no)
2617                 ])      
2618         dnl **********************************
2619         dnl ***    Checks for sin6_len     ***
2620         dnl **********************************
2621         AC_MSG_CHECKING(for sockaddr_in6.sin6_len)
2622         AC_TRY_COMPILE([
2623                 #include <netinet/in.h>
2624                 ], [
2625                 struct sockaddr_in6 saddr6;
2626                 saddr6.sin6_len = sizeof (saddr6);
2627                 ],[
2628                         AC_MSG_RESULT(yes)
2629                         AC_DEFINE(HAVE_SOCKADDR_IN6_SIN_LEN, 1, [sockaddr_in6 has sin6_len])
2630                 ], [
2631                         AC_MSG_RESULT(no)
2632                 ])
2633         dnl **********************************
2634         dnl *** Check for getifaddrs       ***
2635         dnl **********************************
2636         AC_MSG_CHECKING(for getifaddrs)
2637                 AC_TRY_LINK([
2638                 #include <stdio.h>
2639                 #include <sys/types.h>
2640                 #include <sys/socket.h>
2641                 #include <ifaddrs.h>
2642         ], [
2643                 getifaddrs(NULL);
2644         ], [
2645                 # Yes, we have it...
2646                 AC_MSG_RESULT(yes)
2647                 AC_DEFINE(HAVE_GETIFADDRS, 1, [Have getifaddrs])
2648         ], [
2649                 AC_MSG_RESULT(no)
2650         ])
2651         dnl **********************************
2652         dnl *** Check for if_nametoindex   ***
2653         dnl **********************************
2654         AC_MSG_CHECKING(for if_nametoindex)
2655                 AC_TRY_LINK([
2656                 #include <stdio.h>
2657                 #include <sys/types.h>
2658                 #include <sys/socket.h>
2659                 #include <net/if.h>
2660         ], [
2661                 if_nametoindex(NULL);
2662         ], [
2663                 # Yes, we have it...
2664                 AC_MSG_RESULT(yes)
2665                 AC_DEFINE(HAVE_IF_NAMETOINDEX, 1, [Have if_nametoindex])
2666         ], [
2667                 AC_MSG_RESULT(no)
2668         ])
2669         dnl **********************************
2670         dnl *** Check for access ***
2671         dnl **********************************
2672         AC_MSG_CHECKING(for access)
2673                 AC_TRY_LINK([
2674                 #include <unistd.h>
2675         ], [
2676                 access(NULL,0);
2677         ], [
2678                 # Yes, we have it...
2679                 AC_MSG_RESULT(yes)
2680                 AC_DEFINE(HAVE_ACCESS, 1, [Have access])
2681         ], [
2682                 AC_MSG_RESULT(no)
2683         ])
2684                         
2685         dnl **********************************
2686         dnl *** Checks for proclib         ***
2687         dnl **********************************
2688         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.)])
2689         dnl **********************************
2690         dnl *** Checks for MonoPosixHelper ***
2691         dnl **********************************
2692         AC_CHECK_HEADERS(checklist.h)
2693         AC_CHECK_HEADERS(pathconf.h)
2694         AC_CHECK_HEADERS(fstab.h)
2695         AC_CHECK_HEADERS(attr/xattr.h)
2696         AC_CHECK_HEADERS(sys/extattr.h)
2697         AC_CHECK_HEADERS(sys/sendfile.h)
2698         AC_CHECK_HEADERS(sys/statvfs.h)
2699         AC_CHECK_HEADERS(sys/statfs.h)
2700         AC_CHECK_HEADERS(sys/vfstab.h)
2701         AC_CHECK_HEADERS(sys/xattr.h)
2702         AC_CHECK_HEADERS(sys/mman.h)
2703         AC_CHECK_HEADERS(sys/param.h)
2704         AC_CHECK_HEADERS(sys/mount.h, [], [],
2705                 [
2706                 #ifdef HAVE_SYS_PARAM_H
2707                 # include <sys/param.h>
2708                 #endif
2709                 ])
2710         AC_CHECK_HEADERS(sys/mount.h)
2711         AC_CHECK_FUNCS(confstr)
2712         AC_CHECK_FUNCS(seekdir telldir)
2713         AC_CHECK_FUNCS(getdomainname)
2714         AC_CHECK_FUNCS(setdomainname)
2715         AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
2716         AC_CHECK_FUNCS(setgroups)
2717         AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
2718         AC_CHECK_FUNCS(getfsstat)
2719         AC_CHECK_FUNCS(lutimes futimes)
2720         AC_CHECK_FUNCS(mremap)
2721         AC_CHECK_FUNCS(remap_file_pages)
2722         AC_CHECK_FUNCS(posix_fadvise)
2723         AC_CHECK_FUNCS(posix_fallocate)
2724         AC_CHECK_FUNCS(posix_madvise)
2725         AC_CHECK_FUNCS(vsnprintf)
2726         AC_CHECK_FUNCS(sendfile)
2727         AC_CHECK_FUNCS(gethostid sethostid)
2728         AC_CHECK_FUNCS(sethostname)
2729         AC_CHECK_FUNCS(statfs)
2730         AC_CHECK_FUNCS(fstatfs)
2731         AC_CHECK_FUNCS(statvfs)
2732         AC_CHECK_FUNCS(fstatvfs)
2733         AC_CHECK_FUNCS(stime)
2734         AC_CHECK_FUNCS(strerror_r)
2735         AC_CHECK_FUNCS(ttyname_r)
2736         AC_CHECK_FUNCS(psignal)
2737         AC_CHECK_FUNCS(getlogin_r)
2738         AC_CHECK_FUNCS(lockf)
2739         AC_CHECK_FUNCS(swab)
2740         AC_CHECK_FUNCS(setusershell endusershell)
2741         AC_CHECK_FUNCS(futimens utimensat)
2742         AC_CHECK_FUNCS(fstatat mknodat readlinkat)
2743         AC_CHECK_FUNCS(readv writev preadv pwritev)
2744         AC_CHECK_FUNCS(setpgid)
2745         AC_CHECK_FUNCS(system)
2746         AC_CHECK_FUNCS(fork execv execve)
2747         AC_CHECK_FUNCS(accept4)
2748         AC_CHECK_FUNCS(localtime_r)
2749         AC_CHECK_FUNCS(mkdtemp)
2750         AC_CHECK_SIZEOF(size_t)
2751         AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
2752                 [#include <sys/types.h>
2753                  #include <sys/stat.h>
2754                  #include <unistd.h>])
2755         AC_CHECK_TYPES([blkcnt_t], [AC_DEFINE(HAVE_BLKCNT_T)], ,
2756                 [#include <sys/types.h>
2757                  #include <sys/stat.h>
2758                  #include <unistd.h>])
2759         AC_CHECK_TYPES([suseconds_t], [AC_DEFINE(HAVE_SUSECONDS_T)], ,
2760                 [#include <sys/time.h>])
2761         AC_CHECK_TYPES([struct cmsghdr], [AC_DEFINE(HAVE_STRUCT_CMSGHDR)], ,
2762                 [#include <sys/socket.h>])
2763         AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
2764                 [#include <unistd.h>
2765                  #include <fcntl.h>])
2766         AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
2767                 [#include <sys/uio.h>])
2768         AC_CHECK_TYPES([struct linger], [AC_DEFINE(HAVE_STRUCT_LINGER)], ,
2769                 [#include <sys/socket.h>])
2770         AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
2771                 [#include <sys/poll.h>])
2772         AC_CHECK_TYPES([struct sockaddr], [AC_DEFINE(HAVE_STRUCT_SOCKADDR)], ,
2773                 [#include <sys/socket.h>])
2774         AC_CHECK_TYPES([struct sockaddr_storage], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)], ,
2775                 [#include <sys/socket.h>])
2776         AC_CHECK_TYPES([struct sockaddr_in], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN)], ,
2777                 [#include <netinet/in.h>])
2778         AC_CHECK_TYPES([struct sockaddr_in6], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)], ,
2779                 [#include <netinet/in.h>])
2780         AC_CHECK_TYPES([struct sockaddr_un], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_UN)], ,
2781                 [#include <sys/un.h>])
2782         AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
2783                 [#include <sys/types.h>
2784                  #include <sys/stat.h>
2785                  #include <unistd.h>])
2786         AC_CHECK_TYPES([struct timespec], [AC_DEFINE(HAVE_STRUCT_TIMESPEC)], ,
2787                 [#include <time.h>])
2788         AC_CHECK_TYPES([struct timeval], [AC_DEFINE(HAVE_STRUCT_TIMEVAL)], ,
2789                 [#include <sys/time.h>
2790                  #include <sys/types.h>
2791                  #include <utime.h>])
2792         AC_CHECK_TYPES([struct timezone], [AC_DEFINE(HAVE_STRUCT_TIMEZONE)], ,
2793                 [#include <sys/time.h>])
2794         AC_CHECK_TYPES([struct utimbuf], [AC_DEFINE(HAVE_STRUCT_UTIMBUF)], ,
2795                 [#include <sys/types.h>
2796                  #include <utime.h>])
2797         AC_CHECK_MEMBERS(
2798                 [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
2799                 [#include <sys/types.h>
2800                  #include <dirent.h>])
2801         AC_CHECK_MEMBERS(
2802                 [struct passwd.pw_gecos],,, 
2803                 [#include <sys/types.h>
2804                  #include <pwd.h>])
2805         AC_CHECK_MEMBERS(
2806                 [struct statfs.f_flags],,, 
2807                 [#include <sys/types.h>
2808                  #include <sys/vfs.h>])
2809         AC_CHECK_MEMBERS(
2810                 [struct stat.st_atim, struct stat.st_mtim, struct stat.st_atimespec, struct stat.st_ctim],,, 
2811                 [#include <sys/types.h>
2812                  #include <sys/stat.h>
2813                  #include <unistd.h>])
2815         dnl Favour xattr through glibc, but use libattr if we have to
2816         AC_CHECK_FUNC(lsetxattr, ,
2817                 AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",)
2818         )
2819         AC_SUBST(XATTR_LIB)
2821         dnl kinfo_proc.kp_proc works on darwin but fails on other simil-bsds
2822         AC_CHECK_MEMBERS(
2823                 [struct kinfo_proc.kp_proc],,, 
2824                 [#include <sys/types.h>
2825                  #include <sys/param.h>
2826                  #include <sys/sysctl.h>
2827                  #include <sys/proc.h>
2828                  ])
2830         dnl *********************************
2831         dnl *** Checks for Windows compilation ***
2832         dnl *********************************
2833         AC_CHECK_HEADERS(sys/time.h)
2834         AC_CHECK_HEADERS(sys/param.h)
2835         AC_CHECK_HEADERS(dirent.h)
2837         dnl ******************************************
2838         dnl *** Checks for OSX and iOS compilation ***
2839         dnl ******************************************
2840         AC_CHECK_HEADERS(CommonCrypto/CommonDigest.h)
2842         dnl *********************************
2843         dnl *** Check for Console 2.0 I/O ***
2844         dnl *********************************
2845         AC_CHECK_HEADERS([curses.h])
2846         AC_CHECK_HEADERS([term.h], [], [],
2847         [#if HAVE_CURSES_H
2848          #include <curses.h>
2849          #endif
2850         ])
2851         AC_CHECK_HEADERS([termios.h])
2853         dnl *********************************
2854         dnl *** Checks for random         ***
2855         dnl *********************************
2856         if test x$host_darwin = xno; then
2857                 AC_CHECK_HEADERS(sys/random.h)
2858                 AC_CHECK_FUNCS(getrandom getentropy)
2859         fi
2860 else
2861         dnl *********************************
2862         dnl *** Checks for Windows compilation ***
2863         dnl *********************************
2864         AC_CHECK_HEADERS(winternl.h)
2866         jdk_headers_found=no
2867         AC_CHECK_LIB(ws2_32, main, LIBS="$LIBS -lws2_32", AC_ERROR(bad mingw install?))
2868         AC_CHECK_LIB(psapi, main, LIBS="$LIBS -lpsapi", AC_ERROR(bad mingw install?))
2869         AC_CHECK_LIB(ole32, main, LIBS="$LIBS -lole32", AC_ERROR(bad mingw install?))
2870         AC_CHECK_LIB(winmm, main, LIBS="$LIBS -lwinmm", AC_ERROR(bad mingw install?))
2871         AC_CHECK_LIB(oleaut32, main, LIBS="$LIBS -loleaut32", AC_ERROR(bad mingw install?))
2872         AC_CHECK_LIB(advapi32, main, LIBS="$LIBS -ladvapi32", AC_ERROR(bad mingw install?))
2873         AC_CHECK_LIB(version, main, LIBS="$LIBS -lversion", AC_ERROR(bad mingw install?))
2875         dnl *********************************
2876         dnl *** Check for struct ip_mreqn ***
2877         dnl *********************************
2878         AC_MSG_CHECKING(for struct ip_mreqn)
2879         AC_TRY_COMPILE([#include <ws2tcpip.h>], [
2880                 struct ip_mreqn mreq;
2881                 mreq.imr_address.s_addr = 0;
2882         ], [
2883                 # Yes, we have it...
2884                 AC_MSG_RESULT(yes)
2885                 AC_DEFINE(HAVE_STRUCT_IP_MREQN)
2886         ], [
2887                 # We'll just have to try and use struct ip_mreq
2888                 AC_MSG_RESULT(no)
2889                 AC_MSG_CHECKING(for struct ip_mreq)
2890                 AC_TRY_COMPILE([#include <ws2tcpip.h>], [
2891                         struct ip_mreq mreq;
2892                         mreq.imr_interface.s_addr = 0;
2893                 ], [
2894                         # Yes, we have it...
2895                         AC_MSG_RESULT(yes)
2896                         AC_DEFINE(HAVE_STRUCT_IP_MREQ)
2897                 ], [
2898                         # No multicast support
2899                         AC_MSG_RESULT(no)
2900                 ])
2901         ])
2903         dnl **********************************
2904         dnl *** Check for getaddrinfo ***
2905         dnl **********************************
2906         AC_MSG_CHECKING(for getaddrinfo)
2907                 AC_TRY_LINK([
2908                 #include <stdio.h>
2909                 #include <winsock2.h>
2910                 #include <ws2tcpip.h>
2911         ], [
2912                 getaddrinfo(NULL,NULL,NULL,NULL);
2913         ], [
2914                 # Yes, we have it...
2915                 AC_MSG_RESULT(yes)
2916                 AC_DEFINE(HAVE_GETADDRINFO, 1, [Have getaddrinfo])
2917         ], [
2918                 AC_MSG_RESULT(no)
2919         ])
2921         dnl **********************************
2922         dnl *** Check for gethostbyname ***
2923         dnl **********************************
2924         AC_MSG_CHECKING(for gethostbyname)
2925                 AC_TRY_LINK([
2926                 #include <stdio.h>
2927                 #include <winsock2.h>
2928                 #include <ws2tcpip.h>
2929         ], [
2930                 gethostbyname(NULL);
2931         ], [
2932                 # Yes, we have it...
2933                 AC_MSG_RESULT(yes)
2934                 AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [Have gethostbyname])
2935         ], [
2936                 AC_MSG_RESULT(no)
2937         ])
2939         dnl **********************************
2940         dnl *** Check for getprotobyname ***
2941         dnl **********************************
2942         AC_MSG_CHECKING(for getprotobyname)
2943                 AC_TRY_LINK([
2944                 #include <stdio.h>
2945                 #include <winsock2.h>
2946                 #include <ws2tcpip.h>
2947         ], [
2948                 getprotobyname(NULL);
2949         ], [
2950                 # Yes, we have it...
2951                 AC_MSG_RESULT(yes)
2952                 AC_DEFINE(HAVE_GETPROTOBYNAME, 1, [Have getprotobyname])
2953         ], [
2954                 AC_MSG_RESULT(no)
2955         ])
2957         dnl **********************************
2958         dnl *** Check for getnameinfo ***
2959         dnl **********************************
2960         AC_MSG_CHECKING(for getnameinfo)
2961                 AC_TRY_LINK([
2962                 #include <stdio.h>
2963                 #include <winsock2.h>
2964                 #include <ws2tcpip.h>
2965         ], [
2966                 getnameinfo (NULL, 0, NULL, 0, NULL, 0, 0);
2967         ], [
2968                 # Yes, we have it...
2969                 AC_MSG_RESULT(yes)
2970                 AC_DEFINE(HAVE_GETNAMEINFO, 1, [Have getnameinfo])
2971         ], [
2972                 AC_MSG_RESULT(no)
2973         ])
2975         dnl **********************************
2976         dnl *** Check for inet_ntop ***
2977         dnl **********************************
2978         AC_MSG_CHECKING(for inet_ntop)
2979                 AC_TRY_LINK([
2980                 #include <stdio.h>
2981                 #include <winsock2.h>
2982                 #include <ws2tcpip.h>
2983         ], [
2984                 inet_ntop (0, NULL, NULL, 0);
2985         ], [
2986                 # Yes, we have it...
2987                 AC_MSG_RESULT(yes)
2988                 AC_DEFINE(HAVE_INET_NTOP, 1, [Have inet_ntop])
2989         ], [
2990                 AC_MSG_RESULT(no)
2991         ])
2993         dnl **********************************
2994         dnl *** Check for inet_pton ***
2995         dnl **********************************
2996         AC_MSG_CHECKING(for inet_pton)
2997                 AC_TRY_LINK([
2998                 #include <stdio.h>
2999                 #include <winsock2.h>
3000                 #include <ws2tcpip.h>
3001         ], [
3002                 #ifndef inet_pton
3003                 (void) inet_pton;
3004                 #endif
3005                 inet_pton (0, NULL, NULL);
3006         ], [
3007                 # Yes, we have it...
3008                 AC_MSG_RESULT(yes)
3009                 AC_DEFINE(HAVE_INET_PTON, 1, [Have inet_pton])
3010         ], [
3011                 AC_MSG_RESULT(no)
3012         ])
3014         AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
3015         AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
3016         AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
3017         AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
3018         AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
3019         AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
3020         AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
3023 dnl socklen_t check
3024 AC_MSG_CHECKING(for socklen_t)
3025 AC_TRY_COMPILE([
3026 #include <sys/types.h>
3027 #include <sys/socket.h>
3029   socklen_t foo;
3031 ac_cv_c_socklen_t=yes
3032         AC_DEFINE(HAVE_SOCKLEN_T, 1, [Have socklen_t])
3033         AC_MSG_RESULT(yes)
3035         AC_MSG_RESULT(no)
3038 AC_MSG_CHECKING(for array element initializer support)
3039 AC_TRY_COMPILE([#include <sys/socket.h>], [
3040         const int array[] = {[1] = 2,};
3041 ], [
3042         # Yes, we have it...
3043         AC_MSG_RESULT(yes)
3044         AC_DEFINE(HAVE_ARRAY_ELEM_INIT,1,[Supports C99 array initialization])
3045 ], [
3046         # We'll have to use signals
3047         AC_MSG_RESULT(no)
3050 AC_CHECK_FUNCS(trunc, , AC_MSG_CHECKING(for trunc in math.h)
3051         # Simply calling trunc (0.0) is no good since gcc will optimize the call away
3052         AC_TRY_LINK([#include <math.h>], 
3053         [ static void *p = &trunc; ],
3054         [
3055                 AC_DEFINE(HAVE_TRUNC) 
3056                 AC_MSG_RESULT(yes)
3057                 ac_cv_trunc=yes
3058         ],
3059         AC_MSG_RESULT(no)))
3061 if test "x$ac_cv_truncl" != "xyes"; then
3062    AC_CHECK_LIB(sunmath, aintl, [ AC_DEFINE(HAVE_AINTL, 1, [Has the 'aintl' function]) LIBS="$LIBS -lsunmath"])
3065 AC_CHECK_FUNCS(execvp)
3067 dnl ****************************
3068 dnl *** Look for /dev/random ***
3069 dnl ****************************
3071 AC_MSG_CHECKING([if usage of random device is requested])
3072 AC_ARG_ENABLE(dev-random,
3073 [  --disable-dev-random    disable the use of the random device (enabled by default)],
3074 try_dev_random=$enableval, try_dev_random=yes)
3076 AC_MSG_RESULT($try_dev_random)
3078 case "{$build}" in
3080 dnl IBM i does not have /dev/random, use unblocking only
3082     *-*-os400*)
3083     NAME_DEV_RANDOM="/dev/urandom"
3084     ;;
3086 dnl Win32 does not have /dev/random, they have their own method...
3088     *-mingw*|*-*-cygwin*)
3089     ac_cv_have_dev_random=no
3090     ;;
3092 dnl Everywhere else, it's /dev/random
3094     *)
3095     NAME_DEV_RANDOM="/dev/random"
3096     ;;
3097 esac
3099 AC_DEFINE_UNQUOTED(NAME_DEV_RANDOM, "$NAME_DEV_RANDOM", [Name of /dev/random])
3101 dnl Now check if the device actually exists
3103 if test "x$try_dev_random" = "xyes"; then
3104     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
3105     [if test -r "$NAME_DEV_RANDOM" ; then
3106         ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
3107     if test "x$ac_cv_have_dev_random" = "xyes"; then
3108         AC_DEFINE(HAVE_CRYPT_RNG, 1, [Have /dev/random])
3109     fi
3110 else
3111     AC_MSG_CHECKING(for random device)
3112     ac_cv_have_dev_random=no
3113     AC_MSG_RESULT(has been disabled)
3116 if test "x$host_win32" = "xyes"; then
3117     AC_DEFINE(HAVE_CRYPT_RNG)
3120 if test "x$ac_cv_have_dev_random" = "xno" \
3121     && test "x$host_win32" = "xno"; then
3122     AC_MSG_WARN([[
3124 *** A system-provided entropy source was not found on this system.
3125 *** Because of this, the System.Security.Cryptography random number generator
3126 *** will throw a NotImplemented exception.
3128 *** If you are seeing this message, and you know your system DOES have an
3129 *** entropy collection in place, please report an issue on GitHub and
3130 *** provide information about the system and how to access the random device.
3132 *** Otherwise you can install either egd or prngd and set the environment
3133 *** variable MONO_EGD_SOCKET to point to the daemon's socket to use that.
3134 ***]])
3137 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)
3139 AC_MSG_CHECKING([if big-arrays are to be enabled])
3140 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)
3141 if test "x$enable_big_arrays" = "xyes" ; then
3142     if  test "x$ac_cv_sizeof_void_p" = "x8"; then
3143         AC_DEFINE(MONO_BIG_ARRAYS,1,[Enable the allocation and indexing of arrays greater than Int32.MaxValue])
3144     else
3145         AC_MSG_ERROR([The allocation and indexing of arrays greater than Int32.MaxValue is not supported on this platform.])
3146     fi
3148 AC_MSG_RESULT($enable_big_arrays)
3150 dnl **************
3151 dnl *** DTRACE ***
3152 dnl **************
3154 AC_ARG_ENABLE(dtrace,[  --enable-dtrace Enable DTrace probes], enable_dtrace=$enableval, enable_dtrace=$has_dtrace)
3156 if test "x$enable_dtrace" = "xyes"; then
3157    if test "x$has_dtrace" = "xno"; then
3158           AC_MSG_ERROR([DTrace probes are not supported on this platform.])
3159    fi
3160    AC_PATH_PROG(DTRACE, [dtrace], [no], [$PATH:/usr/sbin])
3161    if test "x$DTRACE" = "xno"; then
3162           AC_MSG_RESULT([dtrace utility not found, dtrace support disabled.])
3163           enable_dtrace=no
3164    elif ! $DTRACE -h -s $srcdir/data/mono.d > /dev/null 2>&1; then
3165           AC_MSG_RESULT([dtrace doesn't support -h option, dtrace support disabled.])
3166           enable_dtrace=no
3167    fi
3170 dtrace_g=no
3171 if test "x$enable_dtrace" = "xyes"; then
3172         AC_DEFINE(ENABLE_DTRACE, 1, [Enable DTrace probes])
3173         DTRACEFLAGS=
3174         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3175                 case "$host" in
3176                         powerpc-*-darwin*)
3177                         DTRACEFLAGS="-arch ppc64"
3178                         ;;
3179                         i*86-*-darwin*)
3180                         DTRACEFLAGS="-arch x86_64"
3181                         ;;
3182                         *)
3183                         DTRACEFLAGS=-64
3184                         ;;
3185                 esac
3186         else
3187                 case "$host" in
3188                         powerpc-*-darwin*)
3189                         DTRACEFLAGS="-arch ppc"
3190                         ;;
3191                         i*86-*-darwin*)
3192                         DTRACEFLAGS="-arch i386"
3193                         ;;
3194                         *)
3195                         DTRACEFLAGS=-32
3196                         ;;
3197                 esac
3198         fi
3199         AC_SUBST(DTRACEFLAGS)
3200         case "$host" in
3201                 *-*-solaris*)
3202                 dtrace_g=yes
3203                 ;;
3204         esac
3205         AC_CHECK_HEADERS([sys/sdt.h])
3207 AM_CONDITIONAL(ENABLE_DTRACE, [test x$enable_dtrace = xyes])
3208 AM_CONDITIONAL(DTRACE_G_REQUIRED, [test x$dtrace_g = xyes])
3210 dnl **************************
3211 dnl *** AOT cross offsets  ***
3212 dnl **************************
3214 AC_ARG_WITH(cross-offsets, [  --with-cross-offsets=<offsets file path>    Explicit AOT cross offsets file],
3215     AC_DEFINE_UNQUOTED(MONO_OFFSETS_FILE, "$withval", [AOT cross offsets file]))
3217 dnl **************
3218 dnl ***  LLVM  ***
3219 dnl **************
3221 AC_ARG_ENABLE(llvm,[  --enable-llvm     Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=default)
3222 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
3223 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)
3224 AC_ARG_ENABLE(llvm-runtime,[  --enable-llvm-runtime     Enable runtime support for llvmonly code], enable_llvm_runtime=$enableval, enable_llvm_runtime=no)
3226 AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
3228 if test "x$enable_llvm" = "xdefault"; then
3229    enable_llvm=$enable_llvm_default
3232 if test "x$enable_llvm" = "xyes"; then
3233    if test "x$with_llvm" != "x"; then
3234           LLVM_CONFIG=$with_llvm/bin/llvm-config
3235           if test x$host_win32 = xyes; then
3236                 LLVM_CONFIG=$LLVM_CONFIG.exe
3237           fi
3238           if test ! -x $LLVM_CONFIG; then
3239                  AC_MSG_ERROR([LLVM executable $LLVM_CONFIG not found.])
3240       fi
3241    else
3242       AC_PATH_PROG(LLVM_CONFIG, llvm-config, no)
3243       if test "x$LLVM_CONFIG" = "xno"; then
3244              AC_MSG_ERROR([llvm-config not found.])
3245       fi
3246    fi
3248    llvm_codegen="x86codegen"
3249    LLVM_ARCH_LIBS="-lLLVMX86Disassembler -lLLVMX86CodeGen -lLLVMX86AsmParser -lLLVMX86Desc -lLLVMX86Info -lLLVMX86AsmPrinter -lLLVMX86Utils"
3250    case "$target" in
3251    arm*)
3252                 llvm_codegen="armcodegen"
3253                 LLVM_ARCH_LIBS="-lLLVMARMDisassembler -lLLVMARMCodeGen -lLLVMARMAsmParser -lLLVMARMDesc -lLLVMARMInfo -lLLVMARMAsmPrinter"
3254                 ;;
3255    aarch64*)
3256                 llvm_codegen="aarch64codegen"
3257                 LLVM_ARCH_LIBS="-lLLVMARMDisassembler -lLLVMARMCodeGen -lLLVMARMAsmParser -lLLVMARMDesc -lLLVMARMInfo -lLLVMARMAsmPrinter"
3258                 ;;
3259    powerpc*)
3260                 llvm_codegen="powerpccodegen"
3261                 LLVM_ARCH_LIBS="-lLLVMPowerPCDisassembler -lLLVMPowerPCCodeGen -lLLVMPowerPCAsmParser -lLLVMPowerPCDesc -lLLVMPowerPCInfo -lLLVMPowerPCAsmPrinter"
3262                 ;;
3263    esac
3265    if test "x$host_win32" = "xno"; then
3267    # Should be something like '2.6' or '2.7svn'
3268    llvm_version=`$LLVM_CONFIG --version`
3269    llvm_api_version=`$LLVM_CONFIG --mono-api-version 2>/dev/null`
3270    AC_MSG_CHECKING(LLVM version)
3271    AC_MSG_RESULT($llvm_version $llvm_api_version)
3272    if echo $llvm_version | grep -q 'mono'; then
3273           if test "x$enable_llvm_version_check" = "xyes"; then
3274                  if test "$llvm_version" != "$expected_llvm_version"; then
3275                         AC_MSG_ERROR([Expected llvm version $expected_llvm_version, but llvm-config --version returned $llvm_version"])
3276                  fi
3277           fi
3278    else
3279           AC_MSG_ERROR([Compiling with stock LLVM is not supported, please use the Mono LLVM repo at https://github.com/mono/llvm, with the GIT branch which matches this version of mono, i.e. 'mono-2-10' for Mono 2.10.])
3280    fi
3282    # The output of --cflags seems to include optimizations flags too
3283    if test $llvm_api_version -gt 100; then
3284           # The --cflags argument includes all kinds of warnings -pendantic etc.
3285           LLVM_CFLAGS="-I$with_llvm/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS"
3286           LLVM_CXXFLAGS="-I$with_llvm/include -std=c++11 -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS"
3287    else
3288           LLVM_CFLAGS=`$LLVM_CONFIG --cflags | sed -e 's/-O2//g' | sed -e 's/-O0//g' | sed -e 's/-fomit-frame-pointer//g' | sed -e 's/-fPIC//g'`
3289       LLVM_CXXFLAGS=`$LLVM_CONFIG --cxxflags | sed -e 's/-O2//g' | sed -e 's/-O0//g' | sed -e 's/-fomit-frame-pointer//g' | sed -e 's/-fPIC//g'`
3290    fi
3291    # LLVM is compiled with -fno-rtti, so we need this too, since our classes inherit
3292    # from LLVM classes.
3293    LLVM_CXXFLAGS="$LLVM_CXXFLAGS -fno-rtti -fexceptions"
3294    LLVM_LDFLAGS=`$LLVM_CONFIG --ldflags`
3295    # This might include empty lines
3296    LLVM_SYSTEM_LIBS=`$LLVM_CONFIG --system-libs 2>/dev/null | grep -- -`
3297    llvm_jit_supported=yes
3298    llvm_jit_libs="jit mcjit $llvm_codegen"
3299    if test "x$host" != "x$target"; then
3300       # No need for jit libs
3301           llvm_jit_supported=no
3302       llvm_jit_libs=""
3303    elif test $llvm_api_version -gt 100; then
3304       llvm_jit_libs="orcjit $llvm_codegen"
3305    fi
3306    LLVM_LIBS=`$LLVM_CONFIG --libs analysis core bitwriter $llvm_jit_libs`
3307    if test "x$LLVM_LIBS" = "x"; then
3308           echo "$LLVM_CONFIG --libs failed."
3309           exit 1
3310    fi
3311    LLVM_LIBS="$LLVM_LIBS $LLVM_LDFLAGS $LLVM_SYSTEM_LIBS"
3312    # The c++ standard library used by llvm doesn't show up in $LLVM_SYSTEM_LIBS so add it manually
3313    if echo $LLVM_CXXFLAGS | grep -q -- '-stdlib=libc++'; then
3314       LLVM_LIBS="$LLVM_LIBS -lc++"
3315    else
3316       LLVM_LIBS="$LLVM_LIBS -lstdc++"
3317    fi
3319    expected_llvm_version="3.4svn-mono-mono/e656cac"
3321    else
3322        LLVM_CFLAGS="-I$with_llvm/include -DNDEBUG -D__NO_CTYPE_INLINE -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS"
3323        LLVM_CXXFLAGS="$LLVM_CFLAGS -std=gnu++11 -fvisibility-inlines-hidden -fno-rtti -Woverloaded-virtual -Wcast-qual"
3324        LLVM_LDFLAGS="-L$with_llvm/lib"
3325        LLVM_SYSTEM_LIBS="-lshell32 -lpsapi -limagehlp -ldbghelp -lm"
3326        LLVM_LIBS="-lLLVMLTO -lLLVMObjCARCOpts -lLLVMLinker -lLLVMipo -lLLVMVectorize -lLLVMBitWriter \
3327          -lLLVMTableGen -lLLVMDebugInfo -lLLVMOption -lLLVMSelectionDAG -lLLVMAsmPrinter \
3328          -lLLVMMCDisassembler -lLLVMJIT -lLLVMAnalysis -lLLVMTarget \
3329          -lLLVMIRReader -lLLVMAsmParser -lLLVMLineEditor -lLLVMMCAnalysis -lLLVMInstrumentation \
3330          -lLLVMInterpreter -lLLVMCodeGen -lLLVMScalarOpts -lLLVMInstCombine -lLLVMTransformUtils \
3331          -lLLVMipa -lLLVMAnalysis -lLLVMProfileData -lLLVMMCJIT -lLLVMTarget -lLLVMRuntimeDyld \
3332          -lLLVMObject -lLLVMMCParser -lLLVMBitReader -lLLVMExecutionEngine -lLLVMMC -lLLVMCore \
3333          -lLLVMSupport -lstdc++"
3334        LLVM_LIBS="$LLVM_LIBS $LLVM_ARCH_LIBS $LLVM_SYSTEM_LIBS"
3336        llvm_config_path=$with_llvm/include/llvm/Config/llvm-config.h
3337        llvm_api_version=`awk '/MONO_API_VERSION/ { print $3 }' $llvm_config_path`
3338    fi  
3340    if test "x$llvm_api_version" = "x"; then
3341           LLVM_CFLAGS="$LLVM_CFLAGS -DLLVM_API_VERSION=0"
3342           LLVM_CXXFLAGS="$LLVM_CXXFLAGS -DLLVM_API_VERSION=0"
3343    else
3344           LLVM_CFLAGS="$LLVM_CFLAGS -DLLVM_API_VERSION=$llvm_api_version"
3345           LLVM_CXXFLAGS="$LLVM_CXXFLAGS -DLLVM_API_VERSION=$llvm_api_version"
3346    fi   
3348    AC_DEFINE_UNQUOTED(LLVM_VERSION, "$llvm_version", [Full version of LLVM libraries])
3350    AC_SUBST(LLVM_CFLAGS)
3351    AC_SUBST(LLVM_CXXFLAGS)
3352    AC_SUBST(LLVM_LIBS)
3353    AC_SUBST(LLVM_LDFLAGS)
3354    AC_DEFINE(ENABLE_LLVM, 1, [Enable the LLVM back end])
3357 AM_CONDITIONAL(ENABLE_LLVM, [test x$enable_llvm = xyes])
3358 if test "x$enable_loadedllvm" = "xyes"; then
3359    AC_DEFINE(MONO_LLVM_LOADED, 1, [The LLVM back end is dynamically loaded])
3361 AM_CONDITIONAL(LOADED_LLVM, [test x$enable_loadedllvm = xyes])
3363 if test "x$enable_llvm" = "xyes"; then
3364    enable_llvm_runtime=yes
3366 if test "x$enable_llvm_runtime" = "xyes"; then
3367    AC_DEFINE(ENABLE_LLVM_RUNTIME, 1, [Runtime support code for llvm enabled])
3369 AM_CONDITIONAL(ENABLE_LLVM_RUNTIME, [test x$enable_llvm_runtime = xyes])
3371 TARGET="unknown"
3372 ACCESS_UNALIGNED="yes"
3374 LIBC="libc.so.6"
3375 INTL="libc.so.6"
3376 SQLITE="libsqlite.so.0"
3377 SQLITE3="libsqlite3.so.0"
3378 X11="libX11.so"
3379 GDKX11="libgdk-x11-2.0.so.0"
3380 GTKX11="libgtk-x11-2.0.so.0"
3381 XINERAMA="libXinerama.so.1"
3383 sizeof_register="SIZEOF_VOID_P"
3385 jit_wanted=true
3386 boehm_supported=true
3387 BTLS_SUPPORTED=no
3388 BTLS_PLATFORM=
3390 if test "x$enable_wasm" = "xyes"; then
3391 TARGET=WASM
3392 HOST=WASM
3393 arch_target=wasm
3394 AC_DEFINE(TARGET_WASM, 1, [Target wasm])
3395 AC_DEFINE(HOST_WASM, 1, [Host wasm])
3396 BTLS_SUPPORTED=no
3397 with_tls=pthread
3398 target_mach=no
3400 else
3402 case "$host" in
3403         mips*)
3404                 TARGET=MIPS;
3405                 arch_target=mips;
3406                 with_tls=pthread;
3407                 ACCESS_UNALIGNED="no"
3409                 AC_MSG_CHECKING(for mips n32)
3410                 AC_TRY_COMPILE([],[
3411                 #if _MIPS_SIM != _ABIN32
3412                 #error Not mips n32
3413                 #endif
3414                 ],[
3415                 AC_MSG_RESULT(yes)
3416                 sizeof_register=8
3417                 ],[
3418                 AC_MSG_RESULT(no)
3419                 ])
3420                 ;;
3421         i*86-*-*)
3422                 TARGET=X86;
3423                 arch_target=x86;
3424                 case $host_os in
3425                   solaris*)
3426                         LIBC="libc.so"
3427                         INTL="libintl.so"
3428                         if test "x$ac_cv_sizeof_void_p" = "x8"; then
3429                                 TARGET=AMD64
3430                                 arch_target=amd64
3431                         fi
3433                         # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. A test case:
3434                         # int astruct __attribute__ ((visibility ("hidden")));
3435                         # void foo ()
3436                         # {
3437                         #       void *p = &astruct;
3438                         # }
3439                         # gcc -fPIC --shared -o libfoo.so foo.c
3440                         # yields:
3441                         # foo.c:6: warning: visibility attribute not supported in this configuration; ignored
3442                         # ld: fatal: relocation error: R_386_GOTOFF: file /var/tmp//ccxYR96k.o: symbol astruct: relocation must bind locally
3443                         have_visibility_hidden=no
3444                         ;;
3445                   mingw*|cygwin*)
3446                         have_visibility_hidden=no                 
3447                         ;;
3448                   haiku*)
3449                         LIBC=libroot.so
3450                         ;;
3451                   linux*)
3452                         AOT_SUPPORTED="yes"
3453                         BTLS_SUPPORTED=yes
3454                         BTLS_PLATFORM=i386
3455                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3456                         ;;
3457                   darwin*)
3458                         AOT_SUPPORTED="yes"
3459                         BTLS_SUPPORTED=yes
3460                         BTLS_PLATFORM=i386
3461                         ;;
3462                   openbsd*|freebsd*|kfreebsd-gnu*)
3463                         AOT_SUPPORTED="yes"
3464                         BTLS_SUPPORTED=yes
3465                         BTLS_PLATFORM=i386
3466                         ;;
3467                 esac
3468                 ;;
3469         x86_64-*-* | amd64-*-*)
3470                 TARGET=AMD64;
3471                 arch_target=amd64;
3472                 if test "x$ac_cv_sizeof_void_p" = "x4"; then
3473                         AC_DEFINE(__mono_ilp32__, 1, [64 bit mode with 4 byte longs and pointers])
3474                         sizeof_register=8
3475                 fi
3476                 case $host_os in
3477                   linux*)
3478                         AOT_SUPPORTED="yes"
3479                         BTLS_SUPPORTED=yes
3480                         BTLS_PLATFORM=x86_64
3481                         AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3482                         ;;
3483                   darwin*)
3484                         AOT_SUPPORTED="yes"
3485                         BTLS_SUPPORTED=yes
3486                         BTLS_PLATFORM=x86_64
3487                         boehm_supported=false
3488                         ;;
3489                   openbsd*|freebsd*|kfreebsd-gnu*)
3490                         AOT_SUPPORTED="yes"
3491                         BTLS_SUPPORTED=yes
3492                         BTLS_PLATFORM=x86_64
3493                         ;;
3494                   mingw*)
3495                         ;;
3496                 esac
3497                 ;;
3498         sparc*-*-*)
3499                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
3500                    TARGET=SPARC64
3501                 else
3502                         TARGET=SPARC
3503                 fi
3504                 arch_target=sparc;
3505                 ACCESS_UNALIGNED="no"
3506                 case $host_os in
3507                   linux*) ;;
3508                   *)
3509                         LIBC="libc.so"
3510                         INTL="libintl.so"
3511                 esac
3512                 if test x"$GCC" = xyes; then
3513                         # We don't support v8 cpus
3514                         CFLAGS="$CFLAGS -Wno-cast-align -mcpu=v9"
3515                 fi
3516                 if test x"$AR" = xfalse; then
3517                         AC_MSG_ERROR([The required utility 'ar' is not found in your PATH. Usually it can be found in /usr/ccs/bin.])
3518                 fi
3519                 ;;
3520         *-mingw*|*-*-cygwin*)
3521                 # When this is enabled, it leads to very strange crashes at runtime (gcc-3.4.4)
3522                 have_visibility_hidden=no
3523                 INTL="intl"
3524                 ;;
3525         macppc-*-openbsd* | powerpc*-*-linux* | powerpc-*-openbsd* | \
3526         powerpc-*-sysv* | powerpc-*-darwin* | powerpc-*-netbsd* | \
3527         powerpc-*-freebsd* | powerpc-*-aix* | powerpc-*-os400* )
3528                 if test "x$ac_cv_sizeof_void_p" = "x8"; then
3529                         TARGET=POWERPC64;
3530                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__ -D__mono_ppc64__"
3531                         CFLAGS="$CFLAGS -mminimal-toc"
3532                 else
3533                         TARGET=POWERPC;
3534                         CPPFLAGS="$CPPFLAGS -D__mono_ppc__"
3535                 fi
3536                 arch_target=ppc;
3537                 case $host_os in
3538                   aix*|os400*)
3539                         BTLS_SUPPORTED=yes
3540                         BTLS_PLATFORM=powerpc
3541                         dnl on AIX/PASE, shared libraries can be inside archives
3542                         dnl if they are, we specify them by lib.a(lib.so)
3543                         dnl we may hardcode 64-bit names at times, but we don't do 32-bit AIX, so
3544                         LIBC="libc.a(shr_64.o)"
3545                         INTL="libintl.a(libintl.so.8)"
3546                         ;;
3547                   linux*)
3548                         BTLS_SUPPORTED=yes
3549                         BTLS_PLATFORM=powerpc
3550                         ;;
3551                 esac
3552                 ;;
3553         armv7k-*-darwin*)
3554                 TARGET=ARM;
3555                 TARGET_SYS=WATCHOS
3556                 arch_target=arm;
3557                 arm_fpu=VFP_HARD
3558                 ACCESS_UNALIGNED="no"
3559                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3560                 ;;
3562         arm*-darwin*)
3563                 TARGET=ARM;
3564                 arch_target=arm;
3565                 ACCESS_UNALIGNED="no"
3566                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3567                 ;;
3568         arm*-linux*)
3569                 TARGET=ARM;
3570                 arch_target=arm;
3571                 ACCESS_UNALIGNED="no"
3572                 AOT_SUPPORTED="yes"
3573                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3574                 BTLS_SUPPORTED=yes
3575                 BTLS_PLATFORM=arm
3576                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3577                 case "$target" in
3578                 arm*-linux*-gnueabi)
3579                         BTLS_PLATFORM=armsoft
3580                         ;;
3581                 esac
3582                 ;;
3583         arm*-netbsd*-eabi*)
3584                 TARGET=ARM;
3585                 arch_target=arm;
3586                 ACCESS_UNALIGNED="no"
3587                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3588                 ;;
3589         aarch64-*)
3590                 # https://lkml.org/lkml/2012/7/15/133
3591                 TARGET=ARM64
3592                 arch_target=arm64
3593                 boehm_supported=false
3594                 AOT_SUPPORTED="yes"
3595                 BTLS_SUPPORTED=yes
3596                 BTLS_PLATFORM=aarch64
3597                 AC_CHECK_HEADER(stdalign.h,[],[BTLS_SUPPORTED=no])
3598                 ;;
3599         s390x-*-linux*)
3600                 TARGET=S390X;
3601                 arch_target=s390x;
3602                 ACCESS_UNALIGNED="yes"
3603                 BTLS_SUPPORTED=yes
3604                 BTLS_PLATFORM=s390x
3605                 CFLAGS="$CFLAGS -mbackchain -D__USE_STRING_INLINES"
3606                 ;;
3607 esac
3609 HOST=$TARGET
3611 if test "x$host" != "x$target"; then
3612    AC_DEFINE(MONO_CROSS_COMPILE,1,[The runtime is compiled for cross-compiling mode])
3613    enable_mcs_build=no
3614    enable_support_build=no
3615    BTLS_SUPPORTED=no
3616    case "$target" in
3617    arm*-darwin*)
3618                 TARGET=ARM;
3619                 arch_target=arm;
3620                 ACCESS_UNALIGNED="no"
3621                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3622                 # Can't use tls, since it depends on the runtime detection of tls offsets
3623                 # in mono-compiler.h
3624                 with_tls=pthread
3625                 case "$target" in
3626                 armv7k-*)
3627                         arm_fpu=VFP_HARD
3628                         AC_DEFINE(TARGET_WATCHOS, 1, [...])
3629                         ;;
3630                 esac            
3631                 ;;
3632    powerpc64-ps3-linux-gnu)
3633                 TARGET=POWERPC64
3634                 arch_target=powerpc64
3635                 AC_DEFINE(TARGET_PS3, 1, [...])
3636                 # It would be better to just use TARGET_POWERPC64, but lots of code already
3637                 # uses this define
3638                 AC_DEFINE(__mono_ppc64__, 1, [...])
3639                 AC_DEFINE(__mono_ilp32__, 1, [64 bit mode with 4 byte longs and pointers])
3640                 sizeof_register=8
3641                 target_byte_order=G_BIG_ENDIAN
3642                 ;;
3643    powerpc64-xbox360-linux-gnu)
3644                 TARGET=POWERPC64
3645                 arch_target=powerpc64
3646                 AC_DEFINE(TARGET_XBOX360, 1, [...])
3647                 # It would be better to just use TARGET_POWERPC64, but lots of code already
3648                 # uses this define
3649                 sizeof_register=8
3650                 target_byte_order=G_BIG_ENDIAN
3651                 ;;
3652    arm*-linux-*)
3653                 TARGET=ARM;
3654                 arch_target=arm;
3655                 AC_DEFINE(TARGET_ARM, 1, [...])
3656                 ACCESS_UNALIGNED="no"
3657                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3658                 # Can't use tls, since it depends on the runtime detection of tls offsets
3659                 # in mono-compiler.h
3660                 with_tls=pthread
3661                 target_mach=no
3662                 case "$target" in
3663                 armv7l-unknown-linux-gnueabi*)
3664                         # TEGRA
3665                         CPPFLAGS="$CPPFLAGS"
3666                         ;;
3667                 armv5-*-linux-androideabi*)
3668                         AC_DEFINE(TARGET_ANDROID, 1, [...])
3669                         CPPFLAGS="$CPPFLAGS"
3670                         ;;
3671                 *-linux-androideabi*)
3672                         AC_DEFINE(TARGET_ANDROID, 1, [...])
3673                         CPPFLAGS="$CPPFLAGS"
3674                         ;;
3675                 esac
3676                 ;;
3677    arm*-netbsd*-eabi*)
3678                 TARGET=ARM;
3679                 arch_target=arm;
3680                 AC_DEFINE(TARGET_ARM, 1, [...])
3681                 ACCESS_UNALIGNED="no"
3682                 CPPFLAGS="$CPPFLAGS -D__ARM_EABI__"
3683                 # Can't use tls, since it depends on the runtime detection of tls offsets
3684                 # in mono-compiler.h
3685                 with_tls=pthread
3686                 target_mach=no
3687                 ;;
3688    i686*-linux-*)
3689                 TARGET=X86;
3690                 arch_target=x86;
3691                 AC_DEFINE(TARGET_X86, 1, [...])
3692                 CPPFLAGS="$CPPFLAGS"
3693                 # Can't use tls, since it depends on the runtime detection of tls offsets
3694                 # in mono-compiler.h            
3695                 with_tls=pthread
3696                 target_mach=no
3698                 case "$target" in
3699                 *-linux-android*)
3700                         AC_DEFINE(TARGET_ANDROID, 1, [...])
3701                         ;;
3702                 esac
3703                 ;;
3704    x86_64*-linux-*)
3705                 TARGET=AMD64;
3706                 arch_target=amd64;
3707                 AC_DEFINE(TARGET_AMD64, 1, [...])
3708                 CPPFLAGS="$CPPFLAGS"
3709                 # Can't use tls, since it depends on the runtime detection of tls offsets
3710                 # in mono-compiler.h
3711                 with_tls=pthread
3712                 target_mach=no
3714                 case "$target" in
3715                 *-linux-android*)
3716                         AC_DEFINE(TARGET_ANDROID, 1, [...])
3717                         ;;
3718                 esac
3719                 ;;
3720    x86_64-ps4-freebsd)
3721                 TARGET=AMD64;
3722                 arch_target=amd64;
3723                 AC_DEFINE(TARGET_AMD64, 1, [...])
3724                 AC_DEFINE(TARGET_PS4, 1, [...])
3725                 AC_DEFINE(DISABLE_HW_TRAPS, 1, [...])
3726                 CPPFLAGS="$CPPFLAGS"
3727                 # Can't use tls, since it depends on the runtime detection of tls offsets
3728                 # in mono-compiler.h
3729                 with_tls=pthread
3730                 target_mach=no
3731                 target_win32=no
3732                 ;;
3733    aarch64*-linux-*)
3734                 TARGET=ARM64;
3735                 arch_target=arm64;
3736                 AC_DEFINE(TARGET_ARM64, 1, [...])
3737                 CPPFLAGS="$CPPFLAGS"
3738                 # Can't use tls, since it depends on the runtime detection of tls offsets
3739                 # in mono-compiler.h
3740                 with_tls=pthread
3741                 target_mach=no
3742                 case "$target" in
3743                 *-linux-android*)
3744                         AC_DEFINE(TARGET_ANDROID, 1, [...])
3745                         ;;
3746                 esac
3747                 ;;
3748         aarch64-*)
3749                 TARGET=ARM64
3750                 ;;
3751         *)
3752                 AC_MSG_ERROR([Cross compiling is not supported for target $target])
3753         esac
3756 case "$TARGET" in
3757 X86)
3758         AC_DEFINE(TARGET_X86, 1, [...])
3759         ;;
3760 AMD64)
3761         AC_DEFINE(TARGET_AMD64, 1, [...])
3762         ;;
3763 ARM)
3764         AC_DEFINE(TARGET_ARM, 1, [...])
3765         ;;
3766 ARM64)
3767         AC_DEFINE(TARGET_ARM64, 1, [...])
3768         ;;
3769 POWERPC)
3770         AC_DEFINE(TARGET_POWERPC, 1, [...])
3771         ;;
3772 POWERPC64)
3773         AC_DEFINE(TARGET_POWERPC, 1, [...])
3774         AC_DEFINE(TARGET_POWERPC64, 1, [...])
3775         ;;
3776 S390X)
3777         AC_DEFINE(TARGET_S390X, 1, [...])
3778         ;;
3779 MIPS)
3780         AC_DEFINE(TARGET_MIPS, 1, [...])
3781         ;;
3782 SPARC)
3783         AC_DEFINE(TARGET_SPARC, 1, [...])
3784         ;;
3785 SPARC64)
3786         AC_DEFINE(TARGET_SPARC64, 1, [...])
3787         ;;
3788 esac
3790 case "$HOST" in
3791 X86)
3792         AC_DEFINE(HOST_X86, 1, [...])
3793         ;;
3794 AMD64)
3795         AC_DEFINE(HOST_AMD64, 1, [...])
3796         ;;
3797 ARM)
3798         AC_DEFINE(HOST_ARM, 1, [...])
3799         ;;
3800 ARM64)
3801         AC_DEFINE(HOST_ARM64, 1, [...])
3802         ;;
3803 POWERPC)
3804         AC_DEFINE(HOST_POWERPC, 1, [...])
3805         ;;
3806 POWERPC64)
3807         AC_DEFINE(HOST_POWERPC, 1, [...])
3808         AC_DEFINE(HOST_POWERPC64, 1, [...])
3809         ;;
3810 S390X)
3811         AC_DEFINE(HOST_S390X, 1, [...])
3812         ;;
3813 MIPS)
3814         AC_DEFINE(HOST_MIPS, 1, [...])
3815         ;;
3816 SPARC)
3817         AC_DEFINE(HOST_SPARC, 1, [...])
3818         ;;
3819 SPARC64)
3820         AC_DEFINE(HOST_SPARC64, 1, [...])
3821         ;;
3822 esac
3824 #WASM hack
3828 dnl *************
3829 dnl *** VTUNE ***
3830 dnl *************
3832 AC_ARG_ENABLE(vtune,[  --enable-vtune   Enable the VTUNE back-end], enable_vtune=$enableval, enable_vtune=no)
3833 AC_ARG_WITH(vtune, [  --with-vtune=<vtune prefix>       Enable jit vtune profiling], enable_vtune=yes,)
3835 AM_CONDITIONAL(HAVE_VTUNE, test x$enable_vtune = xyes)
3837 if test "x$enable_vtune" = "xyes"; then
3838         if test "x$with_vtune" = "x"; then
3839                 VTUNE_PATH=/opt/intel/vtune_amplifier_xe
3840         else
3841                 VTUNE_PATH=$with_vtune
3842         fi
3843         VTUNE_INCLUDE=$VTUNE_PATH/include
3844         case "$TARGET" in
3845         X86)
3846                 VTUNE_LIB=$VTUNE_PATH/lib32
3847                 ;;
3848         AMD64)
3849                 VTUNE_LIB=$VTUNE_PATH/lib64
3850                 ;;
3851         *)
3852                 AC_MSG_ERROR([Unsupported target $TARGET for VTUNE.])
3853                 ;;
3854         esac
3855         if test ! -f $VTUNE_INCLUDE/jitprofiling.h; then
3856                 AC_MSG_ERROR([VTUNE $VTUNE_INCLUDE/jitprofiling.h not found.])
3857         fi
3858         if test ! -f $VTUNE_LIB/libjitprofiling.a; then
3859                 AC_MSG_ERROR([VTUNE $VTUNE_LIB/libjitprofiling.a not found.])
3860         fi
3862         VTUNE_CFLAGS=-I$VTUNE_INCLUDE
3863         VTUNE_LIBS="-L/$VTUNE_LIB/ -ljitprofiling"
3865         AC_SUBST(VTUNE_LIBS)
3866         AC_SUBST(VTUNE_CFLAGS)
3868 dnl Use GCC atomic ops if they work on the target.
3869 if test x$GCC = "xyes"; then
3870         case $TARGET in
3871         X86 | AMD64 | ARM | ARM64 | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64)
3872                 AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
3873                 ;;
3874         esac
3877 if test "x$target_mach" = "xyes"; then
3879    if test "x$TARGET_SYS" = "xWATCHOS"; then
3880           AC_DEFINE(TARGET_WATCHOS,1,[The JIT/AOT targets WatchOS])
3881           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
3882           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS"
3883           BTLS_SUPPORTED=no
3884    elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64"; then
3885           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
3886           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
3887           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
3888           BTLS_SUPPORTED=no
3889    else
3890        AC_TRY_COMPILE([#include "TargetConditionals.h"],[
3891        #if TARGET_IPHONE_SIMULATOR == 1 || TARGET_OS_IPHONE == 1
3892        #error fail this for ios
3893        #endif
3894        ], [
3895                   AC_DEFINE(TARGET_OSX,1,[The JIT/AOT targets OSX])
3896           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX"
3897           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX"
3898           target_osx=yes
3899        ], [
3900           AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS])
3901           CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS"
3902           CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS"
3903           BTLS_SUPPORTED=no
3904                   target_ios=yes
3905        ])
3906         fi
3907    AC_DEFINE(TARGET_MACH,1,[The JIT/AOT targets Apple platforms])
3910 AM_CONDITIONAL(TARGET_OSX, test x$target_osx = xyes)
3912 if test "x$sizeof_register" = "x4"; then
3913    AC_DEFINE(SIZEOF_REGISTER,4,[size of machine integer registers])
3914 elif test "x$sizeof_register" = "x8"; then
3915    AC_DEFINE(SIZEOF_REGISTER,8,[size of machine integer registers])
3916 else
3917    AC_DEFINE(SIZEOF_REGISTER,SIZEOF_VOID_P,[size of machine integer registers])
3920 AC_SUBST(SIZEOF_VOID_P,[$ac_cv_sizeof_void_p])
3922 if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then
3923    AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target])
3924 elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then
3925    AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target])
3926 else
3927    AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target])
3930 if test "x$have_visibility_hidden" = "xyes"; then
3931    AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute])
3934 if test "x$have_deprecated" = "xyes"; then
3935    AC_DEFINE(HAVE_DEPRECATED, 1, [Support for the deprecated attribute])
3938 dnl 
3939 dnl Simple Generational checks (sgen)
3941 SGEN_DEFINES=
3942 AC_ARG_WITH(sgen,                    [  --with-sgen=yes,no             Extra Generational GC, default=yes],[buildsgen=$with_sgen],[buildsgen=yes])
3943 AC_ARG_WITH(sgen-default-concurrent, [  --with-sgen-default-concurrent=yes,no             Use Concurrent GC, default=no],[],[with_sgen_default_concurrent=no])
3944 if test x$buildsgen = xyes; then
3945    AC_DEFINE(HAVE_MOVING_COLLECTOR, 1, [Moving collector])
3946    SGEN_DEFINES="-DHAVE_SGEN_GC"
3948         conc_gc_msg=""
3949    if test x$with_sgen_default_concurrent != xno; then
3950        AC_DEFINE(HAVE_CONC_GC_AS_DEFAULT, 1, [Defaults to concurrent GC])
3951            conc_gc_msg=" (concurrent by default)"
3952    fi
3954    if test "x$gc_msg" = "x"; then
3955       gc_msg="sgen$conc_gc_msg"
3956    else
3957       gc_msg="sgen$conc_gc_msg and $gc_msg"
3958    fi
3960 AC_SUBST(SGEN_DEFINES)
3961 AM_CONDITIONAL(SUPPORT_SGEN, test x$buildsgen = xyes)
3963 jit_status="Building and using the JIT"
3965 libsuffix=".so"
3967 case "$host" in
3968      *-*-darwin*)
3969         libsuffix=".dylib"
3970         LIBC="libc.dylib"
3971         INTL="libintl.dylib"
3972         SQLITE="libsqlite.0.dylib"
3973         SQLITE3="libsqlite3.0.dylib"
3974         X11="libX11.dylib"
3975         GDKX11="libgdk-x11-2.0.dylib"
3976         GTKX11="libgtk-x11-2.0.dylib"
3977         ;;
3978      *-*-*netbsd*)
3979         LIBC="libc.so"
3980         INTL="libintl.so"
3981         SQLITE="libsqlite.so"
3982         SQLITE3="libsqlite3.so"
3983         ;;
3984      *-*-kfreebsd*-gnu)
3985         LIBC="libc.so.0.1"
3986         INTL="libc.so.0.1"
3987         X11="libX11.so.6"
3988         ;;
3989     *-*-*freebsd*)
3990         LIBC="libc.so.7"
3991         INTL="libintl.so"
3992         SQLITE="libsqlite.so"
3993         SQLITE3="libsqlite3.so"
3994         ;;
3995     *-*-*openbsd*)
3996         LIBC="libc.so"
3997         INTL="libintl.so"
3998         SQLITE="libsqlite.so"
3999         SQLITE3="libsqlite3.so"
4000         ;;
4001     *-*-*linux*)
4002         AC_PATH_X
4003         dlsearch_path=`(libtool --config ; echo eval echo \\$sys_lib_dlsearch_path_spec) | sh`
4004         AC_MSG_CHECKING(for the soname of libX11.so)
4005         for i in $x_libraries $dlsearch_path; do
4006                 for r in 4 5 6; do
4007                         if test -f $i/libX11.so.$r; then
4008                                 X11=libX11.so.$r
4009                                 AC_MSG_RESULT($X11)
4010                         fi
4011                 done
4012         done
4013         
4014         if test "x$X11" = "xlibX11.so"; then
4015                 AC_MSG_WARN([Could not find libX11.so. Do you have X.org or XFree86 installed? Assuming libX11.so.6...]);
4016                 X11=libX11.so.6
4017         fi
4018         ;;
4019 esac
4021 AC_SUBST(libsuffix)
4023 ######################################
4024 # EGLIB CHECKS
4025 ######################################
4027 GNUC_PRETTY=
4028 GNUC_UNUSED=
4029 BREAKPOINT="G_STMT_START { raise (SIGTRAP); } G_STMT_END"
4030 if test x$GCC = xyes; then
4031    GNUC_UNUSED='__attribute__((__unused__))'
4032    GNUC_NORETURN='__attribute__((__noreturn__))'
4033    case $host_cpu in
4034      i*86|x86_64) BREAKPOINT="G_STMT_START { __asm__ (\"int \$03\"); } G_STMT_END" ;;
4035    esac
4037 AC_SUBST(GNUC_PRETTY)
4038 AC_SUBST(GNUC_UNUSED)
4039 AC_SUBST(GNUC_NORETURN)
4040 AC_SUBST(BREAKPOINT)
4042 AC_C_BIGENDIAN([ORDER=G_BIG_ENDIAN],[ORDER=G_LITTLE_ENDIAN])
4044 case $host in
4045 *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
4046     PATHSEP='\\'
4047     SEARCHSEP=';'
4048     OS="WIN32"
4049     PIDTYPE='void *'
4050     ;;
4052     PATHSEP='/'
4053     SEARCHSEP=':'
4054     OS="UNIX"
4055     PIDTYPE='int'
4056     ;;
4057 esac
4059 case $host in
4060         *-*-solaris*)
4061         CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS"
4062         ;;
4063 esac
4065 case $target in
4066 arm*-darwin*|aarch64*-*)
4067     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE"
4068     ;;
4069 i*86-*-darwin*)
4070     ORDER=G_LITTLE_ENDIAN
4071     ;;
4072 *-*-haiku*)
4073     LDFLAGS="$LDFLAGS -ltextencoding"
4074     ;;
4075 *-*-openbsd*)
4076     CFLAGS="$CFLAGS -pthread"
4077     LDFLAGS="$LDFLAGS -pthread"
4078     ;;
4079 esac
4081 AC_SUBST(ORDER)
4082 AC_SUBST(CFLAGS)
4083 AC_SUBST(PATHSEP)
4084 AC_SUBST(SEARCHSEP)
4085 AC_SUBST(OS)
4086 AC_SUBST(PIDTYPE)
4088 # Defined for all targets/platforms using classic Windows API support.
4089 AC_DEFINE(HAVE_CLASSIC_WINAPI_SUPPORT, 1, [Use classic Windows API support])
4090 AC_DEFINE(HAVE_UWP_WINAPI_SUPPORT, 0, [Don't use UWP Windows API support])
4092 AC_CHECK_FUNCS(strlcpy stpcpy strtok_r rewinddir vasprintf strerror_r)
4093 AC_CHECK_FUNCS(getrlimit)
4094 AC_CHECK_FUNCS(fork execv execve)
4096 AC_ARG_WITH([overridable-allocators], [  --with-overridable-allocators  allow g_*alloc/g_free to call custom allocators set via g_mem_set_vtable])
4098 if test x$with_overridable_allocators = xyes; then
4099         AC_DEFINE(ENABLE_OVERRIDABLE_ALLOCATORS,1,[Overridable allocator support enabled])
4100   AC_MSG_NOTICE([Overridable allocator support enabled])
4101 else
4102   AC_MSG_NOTICE([Overridable allocator support disabled])
4106 # Mono currently supports 10.6, but strndup is not available prior to 10.7; avoiding
4107 # the detection of strndup on OS X so Mono built on 10.7+ still runs on 10.6. This can be
4108 # removed once support for 10.6 is dropped.
4110 # iOS detection of strndup and getpwuid_r is faulty for some reason so let's simply avoid it
4112 if test x$target_osx = xyes; then
4113 AC_CHECK_FUNCS(getpwuid_r)
4114 elif test x$target_ios = xno; then
4115 AC_CHECK_FUNCS(strndup getpwuid_r)
4118 AM_CONDITIONAL(NEED_VASPRINTF, test x$ac_cv_func_vasprintf = xno || test x$with_overridable_allocators = xyes)
4120 AC_SEARCH_LIBS(sqrtf, m)
4122 # nanosleep may not be part of libc, also search it in other libraries
4123 AC_SEARCH_LIBS(nanosleep, rt)
4125 AC_SEARCH_LIBS(dlopen, dl)
4126 old_ldflags="${LDFLAGS}"
4127 # GNU specific option, this confuses IBM ld, but do offer alternatives when possible
4128 if test $lt_cv_prog_gnu_ld = yes; then
4129         LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4130 else
4131         case $host in
4132         *-*-aix*|*-*-os400*)
4133                 ;;
4134         *)
4135                 dnl Try to use export-dynamic anyways
4136                 LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
4137                 ;;
4138         esac
4140 AC_TRY_LINK(, [int i;], found_export_dynamic=yes, found_export_dynamic=no)
4141 if test $found_export_dynamic = no; then
4142         LDFLAGS="${old_ldflags}"
4145 AC_MSG_CHECKING(for varargs macros)
4146 AC_TRY_COMPILE([],[
4147 int foo (int i, int j);
4148 #define bar(...) foo (1, __VA_ARGS__)
4149 void main () {
4150          bar (2);
4152 ],have_iso_varargs=yes,have_iso_varargs=no)
4153 AC_MSG_RESULT($have_iso_varargs)
4154 G_HAVE_ISO_VARARGS=0
4155 if test "x$have_iso_varargs" = "xyes"; then
4156    G_HAVE_ISO_VARARGS=1
4158 AC_SUBST(G_HAVE_ISO_VARARGS)
4160 AC_CHECK_HEADERS(getopt.h sys/select.h sys/time.h sys/wait.h pwd.h iconv.h localcharset.h sys/types.h sys/resource.h)
4161 AC_CHECK_LIB([iconv], [locale_charset],[],[AC_CHECK_LIB([charset], [locale_charset],[LIBS+=" -liconv -lcharset"])])
4162 AC_CHECK_HEADER(alloca.h, [HAVE_ALLOCA_H=1], [HAVE_ALLOCA_H=0])
4163 AC_SUBST(HAVE_ALLOCA_H)
4165 if test $ac_cv_sizeof_void_p = $ac_cv_sizeof_int; then
4166    GPOINTER_TO_INT="((gint) (ptr))"
4167    GPOINTER_TO_UINT="((guint) (ptr))"
4168    GINT_TO_POINTER="((gpointer) (v))"
4169    GUINT_TO_POINTER="((gpointer) (v))"
4170    GSIZE="int"
4171    GSIZE_FORMAT='"u"'
4172 elif test $ac_cv_sizeof_void_p = $ac_cv_sizeof_long; then
4173    GPOINTER_TO_INT="((gint)(long) (ptr))"
4174    GPOINTER_TO_UINT="((guint)(long) (ptr))"
4175    GINT_TO_POINTER="((gpointer)(glong) (v))"
4176    GUINT_TO_POINTER="((gpointer)(gulong) (v))"
4177    GSIZE="long"
4178    GSIZE_FORMAT='"lu"'
4179 elif test $ac_cv_sizeof_void_p = $ac_cv_sizeof_long_long; then
4180    GPOINTER_TO_INT="((gint)(long long) (ptr))"
4181    GPOINTER_TO_UINT="((guint)(unsigned long long) (ptr))"
4182    GINT_TO_POINTER="((gpointer)(long long) (v))"
4183    GUINT_TO_POINTER="((gpointer)(unsigned long long) (v))"
4184    GSIZE="long long"
4185    GSIZE_FORMAT='"I64u"'
4186 else
4187    AC_MSG_ERROR([unsupported pointer size])
4190 AC_SUBST(GPOINTER_TO_INT)
4191 AC_SUBST(GPOINTER_TO_UINT)
4192 AC_SUBST(GINT_TO_POINTER)
4193 AC_SUBST(GUINT_TO_POINTER)
4194 AC_SUBST(GSIZE)
4195 AC_SUBST(GSIZE_FORMAT)
4196 AC_SUBST(G_GUINT64_FORMAT)
4197 AC_SUBST(G_GINT64_FORMAT)
4198 AC_SUBST(G_GUINT32_FORMAT)
4199 AC_SUBST(G_GINT32_FORMAT)
4202 # END OF EGLIB CHECKS
4205 AC_ARG_WITH([libgdiplus],
4206         [  --with-libgdiplus=installed|sibling|<path>   Override the libgdiplus used for System.Drawing tests (defaults to installed)],
4207         [], [with_libgdiplus=installed])
4209 # default install location
4210 libgdiplus_install_loc=libgdiplus${libsuffix}
4211 case "$host" in
4212     *-*-*linux*)
4213     libgdiplus_install_loc=libgdiplus${libsuffix}.0
4214     ;;
4215 esac
4217 case $with_libgdiplus in
4218     no)
4219     libgdiplus_loc=
4220     ;;
4222     installed)
4223     libgdiplus_loc=
4224     if test x$cross_compiling = xno; then
4225         if test x$host_darwin = xyes; then
4226             a=/Library/Frameworks/Mono.framework/Versions/Current/lib/$libgdiplus_install_loc
4227             if test -x $a; then
4228               libgdiplus_install_loc=$a
4229               libgdiplus_loc=$a
4230             fi
4231         fi
4232     fi
4233     ;;
4235     yes|sibling)
4236     libgdiplus_loc=`cd ../libgdiplus && pwd`/src/libgdiplus.la
4237     ;;
4239     /*) # absolute path, assume it is an install location
4240     libgdiplus_loc=$with_libgdiplus
4241     libgdiplus_install_loc=$with_libgdiplus
4242     ;;
4244     *)
4245     libgdiplus_loc=`pwd`/$with_libgdiplus
4246     ;;
4247 esac
4248 AC_SUBST(libgdiplus_loc)
4249 AC_SUBST(libgdiplus_install_loc)
4251 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)
4252 if test "x$icall_symbol_map" = "xyes"; then
4253    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
4256 AC_ARG_ENABLE(icall-export,[  --enable-icall-export Export icall functions], icall_export=$enableval, icall_export=no)
4257 if test "x$icall_export" = "xyes"; then
4258    AC_DEFINE(ENABLE_ICALL_EXPORT, 1, [Icall export enabled])
4261 AC_ARG_ENABLE(icall-tables,[  --disable-icall-tables Disable the runtime lookup of icalls], icall_tables=$enableval, icall_tables=yes)
4262 if test "x$icall_tables" = "xno"; then
4263    AC_DEFINE(DISABLE_ICALL_TABLES, 1, [Icall tables disabled])
4266 AM_CONDITIONAL(DISABLE_ICALL_TABLES, test x$icall_tables = xno)
4268 if test "x$with_tls" = "x__thread"; then
4269         AC_DEFINE(HAVE_KW_THREAD, 1, [Have __thread keyword])
4270         # Pass the information to libgc
4271         CPPFLAGS="$CPPFLAGS -DUSE_COMPILER_TLS"
4272         AC_MSG_CHECKING(if the tls_model attribute is supported)
4273         AC_TRY_COMPILE([static __thread int foo __attribute__((tls_model("initial-exec")));], [
4274                 ], [
4275                         AC_MSG_RESULT(yes)
4276                         AC_DEFINE(HAVE_TLS_MODEL_ATTR, 1, [tls_model available])
4277                 ], [
4278                         AC_MSG_RESULT(no)
4279         ])
4282 if test ${TARGET} = ARM; then
4283         dnl ******************************************
4284         dnl *** Check to see what FPU is available ***
4285         dnl ******************************************
4286         AC_MSG_CHECKING(which FPU to use)
4288         #
4289         # This is a bit tricky:
4290         #
4291         # if (__ARM_PCS_VFP) {
4292         #       /* mfloat-abi=hard == VFP with hard ABI */
4293         # } elif (!__SOFTFP__) {
4294         #       /* mfloat-abi=softfp == VFP with soft ABI */
4295         # } else {
4296         #       /* mfloat-abi=soft == no VFP */
4297         # }
4298         #
4299         # The exception is iOS (w/ GCC) where none of the above
4300         # are defined (but iOS always uses the 'softfp' ABI).
4301         #
4302         # No support for FPA.
4303         #
4305         fpu=NONE
4307         # iOS GCC always uses the 'softfp' ABI.
4308         if test x"$GCC" = xyes && test x$host_darwin = xyes; then
4309                 fpu=VFP
4310         fi
4312         # Are we using the 'hard' ABI?
4313         if test x$fpu = xNONE; then
4314                 AC_TRY_COMPILE([], [
4315                         #ifndef __ARM_PCS_VFP
4316                         #error "Float ABI is not 'hard'"
4317                         #endif
4318                 ], [
4319                         fpu=VFP_HARD
4320                 ], [
4321                         fpu=NONE
4322                 ])
4323         fi
4325         # No 'hard' ABI. 'soft' or 'softfp'?
4326         if test x$fpu = xNONE; then
4327                 AC_TRY_COMPILE([], [
4328                         #ifdef __SOFTFP__
4329                         #error "Float ABI is not 'softfp'"
4330                         #endif
4331                 ], [
4332                         fpu=VFP
4333                 ], [
4334                         fpu=NONE
4335                 ])
4336         fi
4338         if test x$arm_fpu != x; then
4339            fpu=$arm_fpu
4340         fi
4342         AC_MSG_RESULT($fpu)
4343         CPPFLAGS="$CPPFLAGS -DARM_FPU_$fpu=1"
4344         unset fpu
4346         dnl *********************************************
4347         dnl *** Check which ARM version(s) we can use ***
4348         dnl *********************************************
4349         AC_MSG_CHECKING(which ARM version to use)
4351         AC_TRY_COMPILE([], [
4352                 #if !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && !defined(__ARM_ARCH_5TEJ__)
4353                 #error Not on ARM v5.
4354                 #endif
4355         ], [
4356                 arm_v5=yes
4358                 arm_ver=ARMv5
4359         ], [])
4361         AC_TRY_COMPILE([], [
4362                 #if !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6ZK__) && !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6M__)
4363                 #error Not on ARM v6.
4364                 #endif
4365         ], [
4366                 arm_v5=yes
4367                 arm_v6=yes
4369                 arm_ver=ARMv6
4370         ], [])
4372         AC_TRY_COMPILE([], [
4373                 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_7R__) && !defined(__ARM_ARCH_7EM__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7S__)
4374                 #error Not on ARM v7.
4375                 #endif
4376         ], [
4377                 arm_v5=yes
4378                 arm_v6=yes
4379                 arm_v7=yes
4381                 arm_ver=ARMv7
4382         ], [])
4384         AC_MSG_RESULT($arm_ver)
4386         if test x$arm_v5 = xyes; then
4387                 AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
4388                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
4389         fi
4391         if test x$arm_v6 = xyes; then
4392                 AC_DEFINE(HAVE_ARMV6, 1, [ARM v6])
4393                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV6=1"
4394         fi
4396         if test x$arm_v7 = xyes; then
4397                 AC_DEFINE(HAVE_ARMV7, 1, [ARM v7])
4398                 CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV7=1"
4399         fi
4402 if test ${TARGET} = unknown; then
4403         CPPFLAGS="$CPPFLAGS -DNO_PORT"
4404         AC_MSG_WARN("mono has not been ported to $host: some things may not work.")
4407 if test "x$platform_android" = "xyes"; then
4408         case "x${TARGET}" in
4409         xARM)
4410                 case "x$arm_ver" in
4411                 xARMv5)
4412                         BTLS_SUPPORTED=yes
4413                         BTLS_PLATFORM=android-armv5
4414                         ;;
4415                 xARMv6)
4416                         BTLS_SUPPORTED=yes
4417                         BTLS_PLATFORM=android-armv6
4418                         ;;
4419                 xARMv7)
4420                         BTLS_SUPPORTED=yes
4421                         BTLS_PLATFORM=android-armv7
4422                         ;;
4423                 *)
4424                         BTLS_SUPPORTED=no
4425                         ;;
4426                 esac
4427                 ;;
4428         xARM64)
4429                 BTLS_SUPPORTED=yes
4430                 BTLS_PLATFORM=android-v8a
4431                 ;;
4432         xX86)
4433                 BTLS_SUPPORTED=yes
4434                 BTLS_PLATFORM=android-x86
4435                 ;;
4436         xAMD64)
4437                 BTLS_SUPPORTED=yes
4438                 BTLS_PLATFORM=android-x64
4439                 ;;
4440         *)
4441                 BTLS_SUPPORTED=no
4442                 ;;
4443         esac
4446 if test ${ACCESS_UNALIGNED} = no; then
4447         CPPFLAGS="$CPPFLAGS -DNO_UNALIGNED_ACCESS"
4450 if test x$host_darwin = xyes; then
4451         AC_MSG_CHECKING([for ranlib that supports -no_warning_for_no_symbols option])
4452         AS_IF(
4453                 [$RANLIB -no_warning_for_no_symbols 2>&1 | grep -q "unknown option"],
4454                 [AC_MSG_RESULT([no])],
4455                 [
4456                         # avoid AR calling ranlib, libtool calls it anyway. suppress no symbols warning.
4457                         AR_FLAGS="Scru"
4458                         RANLIB="$RANLIB -no_warning_for_no_symbols"
4459                         AC_MSG_RESULT([yes])
4460                 ]
4461         )
4464 case "x$libgc" in
4465         xincluded)
4466                 # Pass CPPFLAGS to libgc configure
4467                 # We should use a separate variable for this to avoid passing useless and
4468                 # potentially problematic defines to libgc (like -D_FILE_OFFSET_BITS=64)
4469                 # This should be executed late so we pick up the final version of CPPFLAGS
4470                 # The problem with this approach, is that during a reconfigure, the main
4471                 # configure scripts gets invoked with these arguments, so we use separate
4472                 # variables understood by libgc's configure to pass CPPFLAGS and CFLAGS.
4473                 TMP_CPPFLAGS="$CPPFLAGS $CPPFLAGS_FOR_LIBGC"
4474                 if test x$TARGET = xSPARC -o x$TARGET = xSPARC64; then
4475                         TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-D_FILE_OFFSET_BITS=64//g'`
4476                 fi
4477                 # Don't pass -finstrument-for-thread-suspension in, 
4478                 # if these are instrumented it will be very bad news 
4479                 # (infinite recursion, undefined parking behavior, etc)
4480                 TMP_CPPFLAGS=`echo $TMP_CPPFLAGS | sed -e 's/-finstrument-for-thread-suspension//g'`
4481                 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\""
4482                 if test "x$support_boehm" = "xyes"; then
4483                         AC_CONFIG_SUBDIRS(libgc)
4484                 fi
4485                 ;;
4486 esac
4488 MALLOC_MEMPOOLS=no
4489 AC_ARG_WITH(malloc_mempools,[  --with-malloc-mempools=yes,no  Use malloc for each single mempool allocation (only for runtime debugging, defaults to no)],[
4490         if test x$with_malloc_mempools = xyes; then
4491                 MALLOC_MEMPOOLS=yes
4492                 AC_DEFINE(USE_MALLOC_FOR_MEMPOOLS,1,[Use malloc for each single mempool allocation])
4493         fi
4497 DISABLE_MCS_DOCS=default
4498 AC_ARG_WITH(mcs_docs,[  --with-mcs-docs=yes,no         If you want to build the documentation under mcs (defaults to yes)],[
4499         if test x$with_mcs_docs != xyes; then
4500                 DISABLE_MCS_DOCS=yes
4501         fi
4503 if test -n "$INSTALL_4_x_TRUE"; then :
4504         DISABLE_MCS_DOCS=yes
4506 if test "x$DISABLE_MCS_DOCS" = "xdefault"; then
4507    DISABLE_MCS_DOCS=$DISABLE_MCS_DOCS_default
4510 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)],[
4511         if test x$with_lazy_gc_thread_creation != xno ; then
4512                 AC_DEFINE(LAZY_GC_THREAD_CREATION,1,[Enable lazy gc thread creation by the embedding host.])
4513         fi
4514 ], [with_lazy_gc_thread_creation=no])
4516 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])
4517 AC_ARG_ENABLE(cooperative_suspend, [  --enable-cooperative-suspend      Enable cooperative stop-the-world garbage collection (sgen only) (defaults to no)], [], [enable_cooperative_suspend=default])
4519 if test x$enable_cooperative_suspend = xdefault -a test x$with_cooperative_gc != xdefault; then
4520         enable_cooperative_suspend=$with_cooperative_gc
4523 if test x$enable_cooperative_suspend = xdefault; then
4524         enable_cooperative_suspend=$enable_cooperative_suspend_default
4527 if test x$enable_cooperative_suspend != xno; then
4528         AC_DEFINE(ENABLE_COOP_SUSPEND,1,[Enable cooperative stop-the-world garbage collection.])
4531 AM_CONDITIONAL([ENABLE_COOP_SUSPEND], [test x$enable_cooperative_suspend != xno])
4533 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=no])
4535 if test x$enable_hybrid_suspend != xno -a x$enable_cooperative_suspend != xno ; then
4536         AC_MSG_ERROR([Hybrid suspend and Cooperative suspend cannot be both enabled.])
4539 if test x$enable_hybrid_suspend != xno ; then
4540         AC_DEFINE(ENABLE_HYBRID_SUSPEND,1,[Enable hybrid suspend for GC stop-the-world])
4543 AM_CONDITIONAL([ENABLE_HYBRID_SUSPEND], [test x$enable_hybrid_suspend != xno])
4545 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],[
4547         if test x$enable_checked_build != x ; then
4548                 AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
4549         fi
4550         for feature in `echo "$enable_checked_build" | sed -e "s/,/ /g"`; do
4551                 eval "mono_checked_build_test_enable_$feature='yes'"
4552         done
4554         if test "x$mono_checked_build_test_enable_all" = "xyes"; then
4555                 eval "mono_checked_build_test_enable_gc='yes'"
4556                 eval "mono_checked_build_test_enable_metadata='yes'"
4557                 eval "mono_checked_build_test_enable_thread='yes'"
4558                 eval "mono_checked_build_test_enable_private_types='yes'"
4559         fi
4561         if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
4562                 AC_DEFINE(ENABLE_CHECKED_BUILD_GC, 1, [Enable GC checked build])
4563         fi
4565         if test "x$mono_checked_build_test_enable_metadata" = "xyes"; then
4566                 AC_DEFINE(ENABLE_CHECKED_BUILD_METADATA, 1, [Enable metadata checked build])
4567         fi
4569         if test "x$mono_checked_build_test_enable_thread" = "xyes"; then
4570                 AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
4571         fi
4573         if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
4574                 AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
4575         fi
4576 ], [])
4578 AC_CHECK_HEADER([malloc.h], 
4579                 [AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1], 
4580                         [Define to 1 if you have /usr/include/malloc.h.])],,)
4582 if test x"$GCC" = xyes; then
4583         # Implicit function declarations are not 64 bit safe
4584         # Do this late, since this causes lots of configure tests to fail
4585         CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
4586         # jay has a lot of implicit declarations
4587         JAY_CFLAGS="-Wno-implicit-function-declaration"
4590 # When --disable-shared is used, libtool transforms libmono-2.0.la into libmono-2.0.so
4591 # instead of libmono-static.a
4592 if test "x$enable_shared" = "xno" -a "x$enable_executables" = "xyes"; then
4593    LIBMONO_LA=libmini-static.la
4594 else
4595    if test x$buildsgen = xyes; then
4596       LIBMONO_LA=libmonosgen-$API_VER.la
4597    else
4598       LIBMONO_LA=libmonoboehm-$API_VER.la
4599    fi
4601 AC_SUBST(LIBMONO_LA)
4603 dnl **************
4604 dnl ***  Btls  ***
4605 dnl **************
4607 AC_ARG_ENABLE(btls, [  --disable-btls             Disable the BoringTls provider], enable_btls=$enableval, enable_btls=$BTLS_SUPPORTED)
4608 AC_ARG_ENABLE(btls-lib, [  --disable-btls-lib             Disable building the BTLS native library], enable_btls_lib=$enableval, enable_btls_lib=$BTLS_SUPPORTED)
4609 AC_ARG_WITH(btls_android_ndk, [  --with-btls-android-ndk        Android NDK for BoringTls])
4611 if test "x$enable_btls" = "xno"; then
4612    enable_btls_lib=no
4615 AM_CONDITIONAL(BTLS, test x$enable_btls_lib = xyes)
4617 btls_android=no
4618 if test "x$enable_btls" = "xyes"; then
4619         AC_PATH_PROG(CMAKE, [cmake], [no], [$PATH:/Applications/CMake.app/Contents/bin:/usr/local/bin])
4620         if test "x$CMAKE" = "xno"; then
4621                 AC_MSG_ERROR("cmake not found")
4622         fi
4624         BTLS_ROOT=`cd $srcdir && pwd`/external/boringssl
4625         AC_SUBST(BTLS_ROOT)
4627         btls_arch=
4628         btls_cflags=
4629         BTLS_CMAKE_ARGS=
4631         case "$BTLS_PLATFORM" in
4632         i386)
4633                 btls_arch=i386
4634                 btls_cflags="-m32"
4635                 case $host_os in
4636                         darwin*)
4637                                 btls_cflags="$btls_cflags -arch i386"
4638                 esac
4639                 ;;
4640         x86_64)
4641                 btls_arch=x86_64
4642                 ;;
4643         arm)
4644                 btls_arch=arm
4645                 ;;
4646         armsoft)
4647                 btls_arch=arm
4648                 btls_cflags="-DOPENSSL_NO_ASM=1"
4649                 ;;
4650         aarch64)
4651                 btls_arch=aarch64
4652                 ;;
4653         s390x)
4654                 btls_arch=s390x
4655                 ;;
4656         powerpc)
4657                 btls_arch=powerpc
4658                 case $host_os in
4659                         aix*|os400*)
4660                                 btls_cflags="$btls_cflags -maix64 -mminimal-toc -pthread -D_ALL_SOURCE -D_THREAD_SAFE -D_REENTRANT"
4661                                 BTLS_CMAKE_ARGS="-DCMAKE_AR=/usr/bin/ar -DCMAKE_C_ARCHIVE_CREATE=\"<CMAKE_AR> -X64 cr <TARGET> <LINK_FLAGS> <OBJECTS>\""
4662                 esac
4663                 ;;
4664         android-armv5)
4665                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
4666                 ;;
4667         android-armv6)
4668                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi\" -DANDROID_NATIVE_API_LEVEL=14"
4669                 ;;
4670         android-armv7)
4671                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"armeabi-v7a\" -DANDROID_NATIVE_API_LEVEL=14"
4672                 ;;
4673         android-v8a)
4674                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"arm64-v8a\" -DANDROID_NATIVE_API_LEVEL=21"
4675                 ;;
4676         android-x86)
4677                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86\" -DANDROID_NATIVE_API_LEVEL=14"
4678                 ;;
4679         android-x64)
4680                 BTLS_CMAKE_ARGS="-DANDROID_ABI=\"x86_64\" -DANDROID_NATIVE_API_LEVEL=21"
4681                 ;;
4682         *)
4683                 AC_MSG_ERROR(Invalid BTLS platform)
4684         esac
4686         if test "x$platform_android" = "xyes"; then
4687                 btls_android=yes
4688                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
4689                 if test "x$with_btls_android_ndk" != "x"; then
4690                         BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
4691                 else
4692                         AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
4693                 fi
4694         fi
4696         if test "x$btls_arch" != "x"; then
4697                 BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DBTLS_ARCH=\"$btls_arch\""
4698         fi
4700         BTLS_CFLAGS="$CPPFLAGS_FOR_BTLS $btls_cflags"
4701         AC_SUBST(BTLS_ARCH)
4702         AC_SUBST(BTLS_CFLAGS)
4703         AC_SUBST(BTLS_PLATFORM)
4704         AC_SUBST(BTLS_CMAKE_ARGS)
4706         AC_DEFINE(HAVE_BTLS, 1, [BoringTls is supported])
4707 else
4708         enable_btls=no
4711 AM_CONDITIONAL(BTLS_ANDROID, test x$btls_android = xyes)
4713 if test x$DISABLE_MCS_DOCS = xyes; then
4714    docs_dir=""
4715 else
4716    docs_dir=docs
4718 AC_SUBST(docs_dir)
4720 ## Maybe should also disable if mcsdir is invalid.  Let's punt the issue for now.
4721 AM_CONDITIONAL(BUILD_MCS, [test x$cross_compiling = xno && test x$enable_mcs_build != xno])
4722 AM_CONDITIONAL(BUILD_SUPPORT, [test x$enable_support_build != xno])
4724 libmono_ldflags="$libmono_ldflags $LIBS"
4726 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
4727 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
4728 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
4729 AM_CONDITIONAL(SPARC64, test x$TARGET = xSPARC64)
4730 AM_CONDITIONAL(X86, test x$TARGET = xX86)
4731 AM_CONDITIONAL(AMD64, test x$TARGET = xAMD64)
4732 AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
4733 AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
4734 AM_CONDITIONAL(POWERPC64, test x$TARGET = xPOWERPC64)
4735 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
4736 AM_CONDITIONAL(ARM64, test x$TARGET = xARM64)
4737 AM_CONDITIONAL(S390X, test x$TARGET = xS390X)
4738 AM_CONDITIONAL(WASM, test x$TARGET = xWASM)
4739 AM_CONDITIONAL(HOST_X86, test x$HOST = xX86)
4740 AM_CONDITIONAL(HOST_AMD64, test x$HOST = xAMD64)
4741 AM_CONDITIONAL(HOST_ARM, test x$HOST = xARM)
4742 AM_CONDITIONAL(HOST_ARM64, test x$HOST = xARM64)
4743 AM_CONDITIONAL(HOST_WASM, test x$HOST = xWASM)
4745 AM_CONDITIONAL(CROSS_COMPILE, test "x$host" != "x$target")
4747 AC_SUBST(LIBC)
4748 AC_SUBST(INTL)
4749 AC_SUBST(SQLITE)
4750 AC_SUBST(SQLITE3)
4751 AC_SUBST(X11)
4752 AC_SUBST(GDKX11)
4753 AC_SUBST(GTKX11)
4754 AC_SUBST(XINERAMA)
4755 AC_DEFINE_UNQUOTED(MONO_ARCHITECTURE,"$arch_target",[The architecture this is running on])
4756 AC_SUBST(arch_target)
4757 AC_SUBST(CFLAGS)
4758 AC_SUBST(CPPFLAGS)
4759 AC_SUBST(LDFLAGS)
4761 #This must always be defined when building the runtime
4762 AC_DEFINE(MONO_INSIDE_RUNTIME,1, [Disable banned functions from being used by the runtime])
4764 mono_build_root=`pwd`
4765 AC_SUBST(mono_build_root)
4767 mono_runtime=mono/mini/mono
4768 AC_SUBST(mono_runtime)
4770 CSC_LOCATION=`cd $srcdir && pwd`/external/roslyn-binaries/Microsoft.Net.Compilers/Microsoft.Net.Compilers.2.7.0/tools/csc.exe
4772 if test $csc_compiler = mcs; then
4773   CSC=$mcs_topdir/class/lib/build/mcs.exe
4774 else
4775   CSC=$CSC_LOCATION
4778 AM_CONDITIONAL([CSC_IS_ROSLYN], [test x$csc_compiler != xmcs])
4780 mono_cfg_root=$mono_build_root/runtime
4781 if test x$host_win32 = xyes; then
4782   if test "x$cross_compiling" = "xno"; then
4783     mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
4784     CSC=`cygpath -m -a $CSC`
4785     CSC_LOCATION=`cygpath -m -a $CSC_LOCATION`
4786   else
4787     mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
4788   fi
4789 else
4790   mono_cfg_dir=$mono_cfg_root/etc
4792 AC_SUBST(mono_cfg_dir)
4794 AC_SUBST(CSC)
4796 AC_CONFIG_FILES([po/mcs/Makefile.in])
4798 AC_CONFIG_FILES([runtime/mono-wrapper],[chmod +x runtime/mono-wrapper])
4799 AC_CONFIG_FILES([runtime/monodis-wrapper],[chmod +x runtime/monodis-wrapper])
4801 AC_CONFIG_COMMANDS([runtime/etc/mono/1.0/machine.config],
4802 [   depth=../../../..
4803     case $srcdir in
4804     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4805     .) reldir=$depth ;;
4806     *) reldir=$depth/$srcdir ;;
4807     esac
4808     $ac_aux_dir/install-sh -d runtime/etc/mono/1.0
4809     cd runtime/etc/mono/1.0
4810     rm -f machine.config
4811     $LN_S $reldir/data/net_1_1/machine.config machine.config
4812     cd $depth
4813 ],[LN_S='$LN_S'])
4815 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/machine.config],
4816 [   depth=../../../..
4817     case $srcdir in
4818     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4819     .) reldir=$depth ;;
4820     *) reldir=$depth/$srcdir ;;
4821     esac
4822     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
4823     cd runtime/etc/mono/2.0
4824     rm -f machine.config
4825     $LN_S $reldir/data/net_2_0/machine.config machine.config
4826     cd $depth
4827 ],[LN_S='$LN_S'])
4829 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/web.config],
4830 [   depth=../../../..
4831     case $srcdir in
4832     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4833     .) reldir=$depth ;;
4834     *) reldir=$depth/$srcdir ;;
4835     esac
4836     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0
4837     cd runtime/etc/mono/2.0
4838     rm -f web.config
4839     $LN_S $reldir/data/net_2_0/web.config web.config
4840     cd $depth
4841 ],[LN_S='$LN_S'])
4843 AC_CONFIG_COMMANDS([runtime/etc/mono/browscap.ini],
4844 [   depth=../../..
4845     case $srcdir in
4846     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4847     .) reldir=$depth ;;
4848     *) reldir=$depth/$srcdir ;;
4849     esac
4850     $ac_aux_dir/install-sh -d runtime/etc/mono/
4851     cd runtime/etc/mono/
4852     rm -f browscap.ini
4853     $LN_S $reldir/data/browscap.ini browscap.ini
4854     cd $depth
4855 ],[LN_S='$LN_S'])
4857 AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
4858 [   depth=../../../../..
4859     case $srcdir in
4860     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4861     .) reldir=$depth ;;
4862     *) reldir=$depth/$srcdir ;;
4863     esac
4864     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
4865     cd runtime/etc/mono/2.0/Browsers
4866     rm -f Compat.browser
4867     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
4868     cd $depth
4869 ],[LN_S='$LN_S'])
4871 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
4872 [   depth=../../../../..
4873     case $srcdir in
4874     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4875     .) reldir=$depth ;;
4876     *) reldir=$depth/$srcdir ;;
4877     esac
4878     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
4879     cd runtime/etc/mono/4.0/Browsers
4880     rm -f Compat.browser
4881     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
4882     cd $depth
4883 ],[LN_S='$LN_S'])
4885 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
4886 [   depth=../../../../..
4887     case $srcdir in
4888     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4889     .) reldir=$depth ;;
4890     *) reldir=$depth/$srcdir ;;
4891     esac
4892     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
4893     cd runtime/etc/mono/4.5/Browsers
4894     rm -f Compat.browser
4895     $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
4896     cd $depth
4897 ],[LN_S='$LN_S'])
4899 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/machine.config],
4900 [   depth=../../../..
4901     case $srcdir in
4902     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4903     .) reldir=$depth ;;
4904     *) reldir=$depth/$srcdir ;;
4905     esac
4906     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
4907     cd runtime/etc/mono/4.0
4908     rm -f machine.config
4909     $LN_S $reldir/data/net_4_0/machine.config machine.config
4910     cd $depth
4911 ],[LN_S='$LN_S'])
4913 AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/web.config],
4914 [   depth=../../../..
4915     case $srcdir in
4916     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4917     .) reldir=$depth ;;
4918     *) reldir=$depth/$srcdir ;;
4919     esac
4920     $ac_aux_dir/install-sh -d runtime/etc/mono/4.0
4921     cd runtime/etc/mono/4.0
4922     rm -f web.config
4923     $LN_S $reldir/data/net_4_0/web.config web.config
4924     cd $depth
4925 ],[LN_S='$LN_S'])
4927 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/machine.config],
4928 [   depth=../../../..
4929     case $srcdir in
4930     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4931     .) reldir=$depth ;;
4932     *) reldir=$depth/$srcdir ;;
4933     esac
4934     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
4935     cd runtime/etc/mono/4.5
4936     rm -f machine.config
4937     $LN_S $reldir/data/net_4_5/machine.config machine.config
4938     cd $depth
4939 ],[LN_S='$LN_S'])
4941 AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/web.config],
4942 [   depth=../../../..
4943     case $srcdir in
4944     [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
4945     .) reldir=$depth ;;
4946     *) reldir=$depth/$srcdir ;;
4947     esac
4948     $ac_aux_dir/install-sh -d runtime/etc/mono/4.5
4949     cd runtime/etc/mono/4.5
4950     rm -f web.config
4951     $LN_S $reldir/data/net_4_5/web.config web.config
4952     cd $depth
4953 ],[LN_S='$LN_S'])
4955 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])
4956 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])
4958 AC_OUTPUT([
4959 Makefile
4960 mono-uninstalled.pc
4961 acceptance-tests/Makefile
4962 llvm/Makefile
4963 scripts/mono-find-provides
4964 scripts/mono-find-requires
4965 mono/Makefile
4966 mono/btls/Makefile
4967 mono/utils/Makefile
4968 mono/utils/jemalloc/Makefile
4969 mono/metadata/Makefile
4970 mono/dis/Makefile
4971 mono/cil/Makefile
4972 mono/arch/Makefile
4973 mono/arch/x86/Makefile
4974 mono/arch/amd64/Makefile
4975 mono/arch/ppc/Makefile
4976 mono/arch/sparc/Makefile
4977 mono/arch/s390x/Makefile
4978 mono/arch/arm/Makefile
4979 mono/arch/arm64/Makefile
4980 mono/arch/mips/Makefile
4981 mono/sgen/Makefile
4982 mono/tests/Makefile
4983 mono/tests/tests-config
4984 mono/tests/gc-descriptors/Makefile
4985 mono/tests/testing_gac/Makefile
4986 mono/unit-tests/Makefile
4987 mono/benchmark/Makefile
4988 mono/mini/Makefile
4989 mono/profiler/Makefile
4990 mono/eglib/Makefile
4991 mono/eglib/eglib-config.h
4992 m4/Makefile
4993 ikvm-native/Makefile
4994 scripts/Makefile
4995 man/Makefile
4996 docs/Makefile
4997 data/Makefile
4998 data/net_2_0/Makefile
4999 data/net_4_0/Makefile
5000 data/net_4_5/Makefile
5001 data/net_2_0/Browsers/Makefile
5002 data/net_4_0/Browsers/Makefile
5003 data/net_4_5/Browsers/Makefile
5004 data/mint.pc
5005 data/mono-2.pc
5006 data/monosgen-2.pc
5007 data/mono.pc
5008 data/mono-cairo.pc
5009 data/mono-nunit.pc
5010 data/mono-options.pc
5011 data/mono-lineeditor.pc
5012 data/monodoc.pc
5013 data/dotnet.pc
5014 data/dotnet35.pc
5015 data/wcf.pc
5016 data/cecil.pc
5017 data/system.web.extensions_1.0.pc
5018 data/system.web.extensions.design_1.0.pc
5019 data/system.web.mvc.pc
5020 data/system.web.mvc2.pc
5021 data/system.web.mvc3.pc
5022 data/aspnetwebstack.pc
5023 data/reactive.pc
5024 samples/Makefile
5025 support/Makefile
5026 data/config
5027 tools/Makefile
5028 tools/locale-builder/Makefile
5029 tools/sgen/Makefile
5030 tools/monograph/Makefile
5031 tools/pedump/Makefile
5032 runtime/Makefile
5033 msvc/Makefile
5034 po/Makefile
5037 # Update all submodules recursively to ensure everything is checked out
5038 $srcdir/scripts/update_submodules.sh
5040 if test x$host_win32 = xyes; then
5041    # Get rid of 'cyg' prefixes in library names
5042    sed -e "s/\/cyg\//\/\//" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
5043    # libtool seems to inherit -mno-cygwin from our CFLAGS, and uses it to compile its executable
5044    # wrapper scripts which use exec(). gcc has no problem compiling+linking this, but the resulting
5045    # executable doesn't work...
5046    sed -e "s,-mno-cygwin,,g" libtool > libtool.new; mv libtool.new libtool; chmod 755 libtool
5049 if test x$host_darwin = xyes; then
5050    # This doesn't seem to be required and it slows down parallel builds
5051    sed -e 's,lock_old_archive_extraction=yes,lock_old_archive_extraction=no,g' < libtool > libtool.new && mv libtool.new libtool && chmod +x libtool
5055   case $prefix in
5056   NONE) prefix=$ac_default_prefix ;;
5057   esac
5058   case $exec_prefix in
5059   NONE) exec_prefix='${prefix}' ;;
5060   esac
5062   #
5063   # If we are cross compiling, we don't build in the mcs/ tree.  Let us not clobber
5064   # any existing config.make.  This allows people to share the same source tree
5065   # with different build directories, one native and one cross
5066   #
5067   if test x$cross_compiling = xno && test x$enable_mcs_build != xno; then
5069     test -w $mcs_topdir/build || chmod +w $mcs_topdir/build
5071     echo "prefix=$prefix" > $mcs_topdir/build/config.make
5072     echo "exec_prefix=$exec_prefix" >> $mcs_topdir/build/config.make
5073     echo "sysconfdir=$sysconfdir" >> $mcs_topdir/build/config.make
5074     echo 'mono_libdir=${exec_prefix}/lib' >> $mcs_topdir/build/config.make
5075     echo "mono_build_root=$mono_build_root" >> $mcs_topdir/build/config.make
5076     echo 'IL_FLAGS = /debug' >> $mcs_topdir/build/config.make
5077     echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $mcs_topdir/build/config.make
5078     echo "ILDISASM = $mono_build_root/runtime/monodis-wrapper" >> $mcs_topdir/build/config.make
5079     echo "JAY_CFLAGS = $JAY_CFLAGS" >> $mcs_topdir/build/config.make
5081     case $INSTALL in
5082     [[\\/$]]* | ?:[[\\/]]* ) mcs_INSTALL=$INSTALL ;;
5083     *) mcs_INSTALL=$mono_build_root/$INSTALL ;;
5084     esac
5086     echo "INSTALL = $mcs_INSTALL" >> $mcs_topdir/build/config.make
5088     export VERSION
5089     [myver=$($AWK 'BEGIN {
5090       split (ENVIRON["VERSION"] ".0.0.0", vsplit, ".")
5091       if(length(vsplit [1]) > 4) {
5092         split (substr(ENVIRON["VERSION"], 0, 4) "." substr(ENVIRON["VERSION"], 5) ".0.0", vsplit, ".")
5093       }
5094       print vsplit [1] "." vsplit [2] "." vsplit [3] "." vsplit [4]
5095     }')]
5097     echo "MONO_VERSION = $myver" >> $mcs_topdir/build/config.make
5098     echo "MONO_CORLIB_VERSION = $MONO_CORLIB_VERSION" >> $mcs_topdir/build/config.make
5100     if test x$host_darwin = xyes; then
5101       echo "BUILD_PLATFORM = darwin" >> $mcs_topdir/build/config.make
5102       echo "HOST_PLATFORM ?= darwin" >> $mcs_topdir/build/config.make
5103       echo "XTEST_PLATFORM ?= osx" >> $mcs_topdir/build/config.make
5104     elif test x$host_win32 = xyes; then
5105       echo "BUILD_PLATFORM = win32" >> $mcs_topdir/build/config.make
5106       echo "HOST_PLATFORM ?= win32" >> $mcs_topdir/build/config.make
5107       echo "XTEST_PLATFORM ?= windows" >> $mcs_topdir/build/config.make
5108     else
5109       echo "BUILD_PLATFORM = linux" >> $mcs_topdir/build/config.make
5110       echo "HOST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
5111       echo "XTEST_PLATFORM ?= linux" >> $mcs_topdir/build/config.make
5112     fi
5114     if test "x$PLATFORM_AOT_SUFFIX" != "x"; then
5115       echo "PLATFORM_AOT_SUFFIX = $PLATFORM_AOT_SUFFIX" >> $mcs_topdir/build/config.make
5116     fi
5118         if test x$AOT_SUPPORTED = xyes -a x$enable_system_aot = xdefault; then
5119            enable_system_aot=yes
5120         fi
5122     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
5123       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
5124     fi
5126     if test x$DISABLE_MCS_DOCS = xyes; then
5127       echo "DISABLE_MCS_DOCS = yes" >> $mcs_topdir/build/config.make
5128     fi
5130     if test x$has_extension_module != xno; then
5131         echo "EXTENSION_MODULE = 1" >> $srcdir/$mcsdir/build/config.make
5132     fi
5133     
5134     echo "DEFAULT_PROFILE = $default_profile" >> $srcdir/$mcsdir/build/config.make
5135     
5136     if test "x$test_bcl_opt" = "xyes"; then    
5137       echo "BCL_OPTIMIZE = 1" >> $srcdir/$mcsdir/build/config.make
5138     fi
5140     echo "CSC_LOCATION = $CSC_LOCATION" >> $srcdir/$mcsdir/build/config.make
5142     if test $csc_compiler = mcs; then
5143       echo "MCS_MODE = 1" >> $srcdir/$mcsdir/build/config.make
5144     fi
5146     if test "x$AOT_BUILD_FLAGS" != "x" ; then
5147       echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
5148       echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
5149       echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
5150     fi
5152     if test "x$AOT_MODE" != "x" ; then
5153       echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
5154     fi
5156     if test "x$enable_btls" = "xyes"; then
5157       echo "HAVE_BTLS=1" >> $srcdir/$mcsdir/build/config.make
5158     fi
5160   fi
5164 libgdiplus_msg=${libgdiplus_loc:-assumed to be installed}
5166 btls_platform_string=
5167 if test x$enable_btls = xyes; then
5168         if test x$btls_android = xyes; then
5169                 btls_platform_string=" (android:$BTLS_PLATFORM)"
5170         else
5171                 btls_platform_string=" ($BTLS_PLATFORM)"
5172         fi
5175 echo "
5176         mcs source:    $mcsdir
5177         C# Compiler:   $csc_compiler
5179    Engine:
5180         Host:          $host
5181         Target:        $target
5182         GC:            $gc_msg 
5183         TLS:           $with_tls
5184         SIGALTSTACK:   $with_sigaltstack
5185         Engine:        $jit_status
5186         BigArrays:     $enable_big_arrays
5187         DTrace:        $enable_dtrace
5188         LLVM Back End: $enable_llvm (dynamically loaded: $enable_loadedllvm)
5189         Spectre:       $spectre_mitigation_status
5191    Libraries:
5192         .NET 4.x:        $with_profile4_x
5193         Xamarin.Android: $with_monodroid
5194         Xamarin.iOS:     $with_monotouch
5195         Xamarin.WatchOS: $with_monotouch_watch
5196         Xamarin.TVOS:    $with_monotouch_tv
5197         Xamarin.Mac:     $with_xammac
5198         Windows AOT:     $with_winaot
5199         Orbis:           $with_orbis
5200         Unreal:          $with_unreal
5201         WebAssembly:     $with_wasm
5202         Test profiles:   AOT Full ($with_testing_aot_full), AOT Hybrid ($with_testing_aot_hybrid)
5203         JNI support:     $jdk_headers_found
5204         libgdiplus:      $libgdiplus_msg
5205         zlib:            $zlib_msg
5206         BTLS:            $enable_btls$btls_platform_string
5207         jemalloc:        $with_jemalloc (always use: $with_jemalloc_always)
5208         $disabled
5210 if test x$with_static_mono = xno -a "x$host_win32" != "xyes"; then
5211    AC_MSG_WARN(Turning off static Mono is a risk, you might run into unexpected bugs)